"""Constants for the Fitbit platform.""" from __future__ import annotations from dataclasses import dataclass from typing import Final from homeassistant.components.sensor import ( SensorDeviceClass, SensorEntityDescription, SensorStateClass, ) from homeassistant.const import ( CONF_CLIENT_ID, CONF_CLIENT_SECRET, PERCENTAGE, UnitOfLength, UnitOfMass, UnitOfTime, UnitOfVolume, ) ATTR_ACCESS_TOKEN: Final = "access_token" ATTR_REFRESH_TOKEN: Final = "refresh_token" ATTR_LAST_SAVED_AT: Final = "last_saved_at" ATTR_DURATION: Final = "duration" ATTR_DISTANCE: Final = "distance" ATTR_ELEVATION: Final = "elevation" ATTR_HEIGHT: Final = "height" ATTR_WEIGHT: Final = "weight" ATTR_BODY: Final = "body" ATTR_LIQUIDS: Final = "liquids" ATTR_BLOOD_GLUCOSE: Final = "blood glucose" ATTR_BATTERY: Final = "battery" CONF_MONITORED_RESOURCES: Final = "monitored_resources" CONF_CLOCK_FORMAT: Final = "clock_format" ATTRIBUTION: Final = "Data provided by Fitbit.com" FITBIT_AUTH_CALLBACK_PATH: Final = "/api/fitbit/callback" FITBIT_AUTH_START: Final = "/api/fitbit" FITBIT_CONFIG_FILE: Final = "fitbit.conf" FITBIT_DEFAULT_RESOURCES: Final[list[str]] = ["activities/steps"] DEFAULT_CONFIG: Final[dict[str, str]] = { CONF_CLIENT_ID: "CLIENT_ID_HERE", CONF_CLIENT_SECRET: "CLIENT_SECRET_HERE", } DEFAULT_CLOCK_FORMAT: Final = "24H" @dataclass class FitbitSensorEntityDescription(SensorEntityDescription): """Describes Fitbit sensor entity.""" unit_type: str | None = None FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( FitbitSensorEntityDescription( key="activities/activityCalories", name="Activity Calories", native_unit_of_measurement="cal", icon="mdi:fire", ), FitbitSensorEntityDescription( key="activities/calories", name="Calories", native_unit_of_measurement="cal", icon="mdi:fire", ), FitbitSensorEntityDescription( key="activities/caloriesBMR", name="Calories BMR", native_unit_of_measurement="cal", icon="mdi:fire", ), FitbitSensorEntityDescription( key="activities/distance", name="Distance", unit_type="distance", icon="mdi:map-marker", device_class=SensorDeviceClass.DISTANCE, ), FitbitSensorEntityDescription( key="activities/elevation", name="Elevation", unit_type="elevation", icon="mdi:walk", device_class=SensorDeviceClass.DISTANCE, ), FitbitSensorEntityDescription( key="activities/floors", name="Floors", native_unit_of_measurement="floors", icon="mdi:walk", ), FitbitSensorEntityDescription( key="activities/heart", name="Resting Heart Rate", native_unit_of_measurement="bpm", icon="mdi:heart-pulse", ), FitbitSensorEntityDescription( key="activities/minutesFairlyActive", name="Minutes Fairly Active", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:walk", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="activities/minutesLightlyActive", name="Minutes Lightly Active", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:walk", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="activities/minutesSedentary", name="Minutes Sedentary", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:seat-recline-normal", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="activities/minutesVeryActive", name="Minutes Very Active", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:run", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="activities/steps", name="Steps", native_unit_of_measurement="steps", icon="mdi:walk", ), FitbitSensorEntityDescription( key="activities/tracker/activityCalories", name="Tracker Activity Calories", native_unit_of_measurement="cal", icon="mdi:fire", ), FitbitSensorEntityDescription( key="activities/tracker/calories", name="Tracker Calories", native_unit_of_measurement="cal", icon="mdi:fire", ), FitbitSensorEntityDescription( key="activities/tracker/distance", name="Tracker Distance", unit_type="distance", icon="mdi:map-marker", device_class=SensorDeviceClass.DISTANCE, ), FitbitSensorEntityDescription( key="activities/tracker/elevation", name="Tracker Elevation", unit_type="elevation", icon="mdi:walk", device_class=SensorDeviceClass.DISTANCE, ), FitbitSensorEntityDescription( key="activities/tracker/floors", name="Tracker Floors", native_unit_of_measurement="floors", icon="mdi:walk", ), FitbitSensorEntityDescription( key="activities/tracker/minutesFairlyActive", name="Tracker Minutes Fairly Active", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:walk", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="activities/tracker/minutesLightlyActive", name="Tracker Minutes Lightly Active", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:walk", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="activities/tracker/minutesSedentary", name="Tracker Minutes Sedentary", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:seat-recline-normal", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="activities/tracker/minutesVeryActive", name="Tracker Minutes Very Active", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:run", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="activities/tracker/steps", name="Tracker Steps", native_unit_of_measurement="steps", icon="mdi:walk", ), FitbitSensorEntityDescription( key="body/bmi", name="BMI", native_unit_of_measurement="BMI", icon="mdi:human", state_class=SensorStateClass.MEASUREMENT, ), FitbitSensorEntityDescription( key="body/fat", name="Body Fat", native_unit_of_measurement=PERCENTAGE, icon="mdi:human", state_class=SensorStateClass.MEASUREMENT, ), FitbitSensorEntityDescription( key="body/weight", name="Weight", unit_type="weight", icon="mdi:human", state_class=SensorStateClass.TOTAL, device_class=SensorDeviceClass.WEIGHT, ), FitbitSensorEntityDescription( key="sleep/awakeningsCount", name="Awakenings Count", native_unit_of_measurement="times awaken", icon="mdi:sleep", ), FitbitSensorEntityDescription( key="sleep/efficiency", name="Sleep Efficiency", native_unit_of_measurement=PERCENTAGE, icon="mdi:sleep", state_class=SensorStateClass.MEASUREMENT, ), FitbitSensorEntityDescription( key="sleep/minutesAfterWakeup", name="Minutes After Wakeup", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:sleep", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="sleep/minutesAsleep", name="Sleep Minutes Asleep", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:sleep", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="sleep/minutesAwake", name="Sleep Minutes Awake", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:sleep", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="sleep/minutesToFallAsleep", name="Sleep Minutes to Fall Asleep", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:sleep", device_class=SensorDeviceClass.DURATION, ), FitbitSensorEntityDescription( key="sleep/startTime", name="Sleep Start Time", icon="mdi:clock", ), FitbitSensorEntityDescription( key="sleep/timeInBed", name="Sleep Time in Bed", native_unit_of_measurement=UnitOfTime.MINUTES, icon="mdi:hotel", device_class=SensorDeviceClass.DURATION, ), ) FITBIT_RESOURCE_BATTERY = FitbitSensorEntityDescription( key="devices/battery", name="Battery", icon="mdi:battery", ) FITBIT_RESOURCES_KEYS: Final[list[str]] = [ desc.key for desc in (*FITBIT_RESOURCES_LIST, FITBIT_RESOURCE_BATTERY) ] FITBIT_MEASUREMENTS: Final[dict[str, dict[str, str]]] = { "en_US": { ATTR_DURATION: UnitOfTime.MILLISECONDS, ATTR_DISTANCE: UnitOfLength.MILES, ATTR_ELEVATION: UnitOfLength.FEET, ATTR_HEIGHT: UnitOfLength.INCHES, ATTR_WEIGHT: UnitOfMass.POUNDS, ATTR_BODY: UnitOfLength.INCHES, ATTR_LIQUIDS: UnitOfVolume.FLUID_OUNCES, ATTR_BLOOD_GLUCOSE: f"{UnitOfMass.MILLIGRAMS}/dL", ATTR_BATTERY: "", }, "en_GB": { ATTR_DURATION: UnitOfTime.MILLISECONDS, ATTR_DISTANCE: UnitOfLength.KILOMETERS, ATTR_ELEVATION: UnitOfLength.METERS, ATTR_HEIGHT: UnitOfLength.CENTIMETERS, ATTR_WEIGHT: UnitOfMass.STONES, ATTR_BODY: UnitOfLength.CENTIMETERS, ATTR_LIQUIDS: UnitOfVolume.MILLILITERS, ATTR_BLOOD_GLUCOSE: "mmol/L", ATTR_BATTERY: "", }, "metric": { ATTR_DURATION: UnitOfTime.MILLISECONDS, ATTR_DISTANCE: UnitOfLength.KILOMETERS, ATTR_ELEVATION: UnitOfLength.METERS, ATTR_HEIGHT: UnitOfLength.CENTIMETERS, ATTR_WEIGHT: UnitOfMass.KILOGRAMS, ATTR_BODY: UnitOfLength.CENTIMETERS, ATTR_LIQUIDS: UnitOfVolume.MILLILITERS, ATTR_BLOOD_GLUCOSE: "mmol/L", ATTR_BATTERY: "", }, } BATTERY_LEVELS: Final[dict[str, int]] = { "High": 100, "Medium": 50, "Low": 20, "Empty": 0, }