mirror of
https://github.com/cyberjunky/home-assistant-garmin_connect.git
synced 2026-01-06 19:43:52 -05:00
663 lines
15 KiB
Python
663 lines
15 KiB
Python
"""Constants for the Garmin Connect integration."""
|
|
|
|
from datetime import timedelta
|
|
from typing import NamedTuple
|
|
|
|
from homeassistant.components.sensor import SensorDeviceClass, SensorStateClass
|
|
from homeassistant.const import PERCENTAGE, UnitOfLength, UnitOfMass, UnitOfTime
|
|
|
|
DOMAIN = "garmin_connect"
|
|
DATA_COORDINATOR = "coordinator"
|
|
DEFAULT_UPDATE_INTERVAL = timedelta(minutes=5)
|
|
|
|
DAY_TO_NUMBER = {
|
|
"Mo": 1,
|
|
"M": 1,
|
|
"Tu": 2,
|
|
"We": 3,
|
|
"W": 3,
|
|
"Th": 4,
|
|
"Fr": 5,
|
|
"F": 5,
|
|
"Sa": 6,
|
|
"Su": 7,
|
|
}
|
|
|
|
GARMIN_ENTITY_LIST = {
|
|
"totalSteps": ["Total Steps", "steps", "mdi:walk", None, SensorStateClass.TOTAL, True],
|
|
"dailyStepGoal": ["Daily Step Goal", "steps", "mdi:walk", None, SensorStateClass.TOTAL, True],
|
|
"totalKilocalories": [
|
|
"Total KiloCalories",
|
|
"kcal",
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"activeKilocalories": [
|
|
"Active KiloCalories",
|
|
"kcal",
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"bmrKilocalories": ["BMR KiloCalories", "kcal", "mdi:food", None, SensorStateClass.TOTAL, True],
|
|
"consumedKilocalories": [
|
|
"Consumed KiloCalories",
|
|
"kcal",
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"burnedKilocalories": [
|
|
"Burned KiloCalories",
|
|
"kcal",
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"remainingKilocalories": [
|
|
"Remaining KiloCalories",
|
|
"kcal",
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"netRemainingKilocalories": [
|
|
"Net Remaining KiloCalories",
|
|
"kcal",
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"netCalorieGoal": ["Net Calorie Goal", "kcal", "mdi:food", None, SensorStateClass.TOTAL, False],
|
|
"totalDistanceMeters": [
|
|
"Total Distance Mtr",
|
|
UnitOfLength.METERS,
|
|
"mdi:walk",
|
|
SensorDeviceClass.DISTANCE,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"wellnessStartTimeLocal": [
|
|
"Wellness Start Time",
|
|
None,
|
|
"mdi:clock",
|
|
SensorDeviceClass.TIMESTAMP,
|
|
None,
|
|
False,
|
|
],
|
|
"wellnessEndTimeLocal": [
|
|
"Wellness End Time",
|
|
None,
|
|
"mdi:clock",
|
|
SensorDeviceClass.TIMESTAMP,
|
|
None,
|
|
False,
|
|
],
|
|
"wellnessDescription": [
|
|
"Wellness Description",
|
|
"",
|
|
"mdi:clock",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"wellnessDistanceMeters": [
|
|
"Wellness Distance Mtr",
|
|
UnitOfLength.METERS,
|
|
"mdi:walk",
|
|
SensorDeviceClass.DISTANCE,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"wellnessActiveKilocalories": [
|
|
"Wellness Active KiloCalories",
|
|
"kcal",
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"wellnessKilocalories": [
|
|
"Wellness KiloCalories",
|
|
"kcal",
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"highlyActiveSeconds": [
|
|
"Highly Active Time",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:fire",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"activeSeconds": [
|
|
"Active Time",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:fire",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"sedentarySeconds": [
|
|
"Sedentary Time",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:seat",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"sleepingSeconds": [
|
|
"Sleeping Time",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:sleep",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"measurableAwakeDuration": [
|
|
"Awake Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:sleep",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"measurableAsleepDuration": [
|
|
"Sleep Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:sleep",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"floorsAscendedInMeters": [
|
|
"Floors Ascended Mtr",
|
|
UnitOfLength.METERS,
|
|
"mdi:stairs",
|
|
SensorDeviceClass.DISTANCE,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"floorsDescendedInMeters": [
|
|
"Floors Descended Mtr",
|
|
UnitOfLength.METERS,
|
|
"mdi:stairs",
|
|
SensorDeviceClass.DISTANCE,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"floorsAscended": [
|
|
"Floors Ascended",
|
|
"floors",
|
|
"mdi:stairs",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"floorsDescended": [
|
|
"Floors Descended",
|
|
"floors",
|
|
"mdi:stairs",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"userFloorsAscendedGoal": [
|
|
"Floors Ascended Goal",
|
|
"floors",
|
|
"mdi:stairs",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"minHeartRate": [
|
|
"Min Heart Rate",
|
|
"bpm",
|
|
"mdi:heart-pulse",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"maxHeartRate": [
|
|
"Max Heart Rate",
|
|
"bpm",
|
|
"mdi:heart-pulse",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"restingHeartRate": [
|
|
"Resting Heart Rate",
|
|
"bpm",
|
|
"mdi:heart-pulse",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"minAvgHeartRate": [
|
|
"Min Avg Heart Rate",
|
|
"bpm",
|
|
"mdi:heart-pulse",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"maxAvgHeartRate": [
|
|
"Max Avg Heart Rate",
|
|
"bpm",
|
|
"mdi:heart-pulse",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"abnormalHeartRateAlertsCount": [
|
|
"Abnormal HR Counts",
|
|
None,
|
|
"mdi:heart-pulse",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"lastSevenDaysAvgRestingHeartRate": [
|
|
"Last 7 Days Avg Heart Rate",
|
|
"bpm",
|
|
"mdi:heart-pulse",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"averageStressLevel": [
|
|
"Avg Stress Level",
|
|
"lvl",
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"maxStressLevel": [
|
|
"Max Stress Level",
|
|
"lvl",
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"stressQualifier": ["Stress Qualifier", None, "mdi:flash-alert", None, None, False],
|
|
"stressDuration": [
|
|
"Stress Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"restStressDuration": [
|
|
"Rest Stress Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"activityStressDuration": [
|
|
"Activity Stress Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"uncategorizedStressDuration": [
|
|
"Uncat. Stress Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"totalStressDuration": [
|
|
"Total Stress Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"lowStressDuration": [
|
|
"Low Stress Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"mediumStressDuration": [
|
|
"Medium Stress Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"highStressDuration": [
|
|
"High Stress Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"stressPercentage": [
|
|
"Stress Percentage",
|
|
PERCENTAGE,
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"restStressPercentage": [
|
|
"Rest Stress Percentage",
|
|
PERCENTAGE,
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"activityStressPercentage": [
|
|
"Activity Stress Percentage",
|
|
PERCENTAGE,
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"uncategorizedStressPercentage": [
|
|
"Uncat. Stress Percentage",
|
|
PERCENTAGE,
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"lowStressPercentage": [
|
|
"Low Stress Percentage",
|
|
PERCENTAGE,
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"mediumStressPercentage": [
|
|
"Medium Stress Percentage",
|
|
PERCENTAGE,
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"highStressPercentage": [
|
|
"High Stress Percentage",
|
|
PERCENTAGE,
|
|
"mdi:flash-alert",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"moderateIntensityMinutes": [
|
|
"Moderate Intensity",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:flash-alert",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"vigorousIntensityMinutes": [
|
|
"Vigorous Intensity",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:run-fast",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"intensityMinutesGoal": [
|
|
"Intensity Goal",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:run-fast",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"bodyBatteryChargedValue": [
|
|
"Body Battery Charged",
|
|
PERCENTAGE,
|
|
"mdi:battery-charging-100",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"bodyBatteryDrainedValue": [
|
|
"Body Battery Drained",
|
|
PERCENTAGE,
|
|
"mdi:battery-alert-variant-outline",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"bodyBatteryHighestValue": [
|
|
"Body Battery Highest",
|
|
PERCENTAGE,
|
|
"mdi:battery-heart",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"bodyBatteryLowestValue": [
|
|
"Body Battery Lowest",
|
|
PERCENTAGE,
|
|
"mdi:battery-heart-outline",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"bodyBatteryMostRecentValue": [
|
|
"Body Battery Most Recent",
|
|
PERCENTAGE,
|
|
"mdi:battery-positive",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"averageSpo2": [
|
|
"Average SPO2",
|
|
PERCENTAGE,
|
|
"mdi:diabetes",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"lowestSpo2": [
|
|
"Lowest SPO2",
|
|
PERCENTAGE,
|
|
"mdi:diabetes",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"latestSpo2": [
|
|
"Latest SPO2",
|
|
PERCENTAGE,
|
|
"mdi:diabetes",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"latestSpo2ReadingTimeLocal": [
|
|
"Latest SPO2 Time",
|
|
None,
|
|
"mdi:diabetes",
|
|
SensorDeviceClass.TIMESTAMP,
|
|
None,
|
|
False,
|
|
],
|
|
"averageMonitoringEnvironmentAltitude": [
|
|
"Average Altitude",
|
|
PERCENTAGE,
|
|
"mdi:image-filter-hdr",
|
|
None,
|
|
SensorStateClass.TOTAL,
|
|
False,
|
|
],
|
|
"highestRespirationValue": [
|
|
"Highest Respiration",
|
|
"brpm",
|
|
"mdi:progress-clock",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"lowestRespirationValue": [
|
|
"Lowest Respiration",
|
|
"brpm",
|
|
"mdi:progress-clock",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"latestRespirationValue": [
|
|
"Latest Respiration",
|
|
"brpm",
|
|
"mdi:progress-clock",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"latestRespirationTimeGMT": [
|
|
"Latest Respiration Update",
|
|
None,
|
|
"mdi:progress-clock",
|
|
SensorDeviceClass.TIMESTAMP,
|
|
None,
|
|
False,
|
|
],
|
|
"weight": [
|
|
"Weight",
|
|
UnitOfMass.KILOGRAMS,
|
|
"mdi:weight-kilogram",
|
|
SensorDeviceClass.WEIGHT,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"bmi": ["BMI", "bmi", "mdi:food", None, SensorStateClass.MEASUREMENT, False],
|
|
"bodyFat": ["Body Fat", PERCENTAGE, "mdi:food", None, SensorStateClass.MEASUREMENT, False],
|
|
"bodyWater": [
|
|
"Body Water",
|
|
PERCENTAGE,
|
|
"mdi:water-percent",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"boneMass": [
|
|
"Bone Mass",
|
|
UnitOfMass.KILOGRAMS,
|
|
"mdi:bone",
|
|
SensorDeviceClass.WEIGHT,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"muscleMass": [
|
|
"Muscle Mass",
|
|
UnitOfMass.KILOGRAMS,
|
|
"mdi:dumbbell",
|
|
SensorDeviceClass.WEIGHT,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"physiqueRating": [
|
|
"Physique Rating",
|
|
None,
|
|
"mdi:numeric",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"visceralFat": [
|
|
"Visceral Fat",
|
|
PERCENTAGE,
|
|
"mdi:food",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"metabolicAge": [
|
|
"Metabolic Age",
|
|
UnitOfTime.YEARS,
|
|
"mdi:calendar-heart",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
False,
|
|
],
|
|
"nextAlarm": ["Next Alarm Time", None, "mdi:alarm", SensorDeviceClass.TIMESTAMP, None, True],
|
|
"lastActivities": ["Last Activities", None, "mdi:numeric", None, SensorStateClass.TOTAL, False],
|
|
"badges": ["Badges", None, "mdi:medal", None, SensorStateClass.TOTAL, False],
|
|
"sleepScore": [
|
|
"Sleep Score",
|
|
None,
|
|
"mdi:sleep",
|
|
None,
|
|
SensorStateClass.MEASUREMENT,
|
|
True,
|
|
],
|
|
"sleepTimeSeconds": [
|
|
"Total Sleep Duration",
|
|
UnitOfTime.MINUTES,
|
|
"mdi:sleep",
|
|
SensorDeviceClass.DURATION,
|
|
SensorStateClass.TOTAL,
|
|
True,
|
|
],
|
|
"hrvStatus": [
|
|
"HRV Status",
|
|
None,
|
|
"mdi:heart-pulse",
|
|
None,
|
|
None,
|
|
True,
|
|
],
|
|
}
|
|
|
|
GEAR_ICONS = {
|
|
"Shoes": "mdi:shoe-sneaker",
|
|
"Bike": "mdi:bike",
|
|
"Other": "mdi:basketball",
|
|
"Golf Clubs": "mdi:golf",
|
|
}
|
|
|
|
|
|
class ServiceSetting(NamedTuple):
|
|
"""Options for the service settings, see services.yaml"""
|
|
|
|
ONLY_THIS_AS_DEFAULT = "set this as default, unset others"
|
|
DEFAULT = "set as default"
|
|
UNSET_DEFAULT = "unset default"
|
|
|
|
|
|
class Gear(NamedTuple):
|
|
"""Options for the gear settings, see services.yaml"""
|
|
|
|
UUID = "uuid"
|
|
TYPE_KEY = "typeKey"
|
|
TYPE_ID = "typeId"
|
|
USERPROFILE_ID = "userProfileId"
|
|
ACTIVITY_TYPE_PK = "activityTypePk"
|