From 74b3c5c6900d301e6d5837c329d9ecb9d7d287a6 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Mon, 2 Oct 2023 07:56:46 -0700 Subject: [PATCH] Modernize fitbit sensors (#101179) * Improve fitbit sensors with state class and entiy category * Revert sensor format changes --- homeassistant/components/fitbit/sensor.py | 59 +++++++++++++++++++ .../fitbit/snapshots/test_sensor.ambr | 17 ++++++ 2 files changed, 76 insertions(+) diff --git a/homeassistant/components/fitbit/sensor.py b/homeassistant/components/fitbit/sensor.py index 8fbd9a25474..313106a0d0f 100644 --- a/homeassistant/components/fitbit/sensor.py +++ b/homeassistant/components/fitbit/sensor.py @@ -29,6 +29,7 @@ from homeassistant.const import ( CONF_TOKEN, CONF_UNIT_SYSTEM, PERCENTAGE, + EntityCategory, UnitOfLength, UnitOfMass, UnitOfTime, @@ -137,6 +138,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( native_unit_of_measurement="cal", icon="mdi:fire", scope="activity", + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/calories", @@ -144,6 +147,7 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( native_unit_of_measurement="cal", icon="mdi:fire", scope="activity", + state_class=SensorStateClass.TOTAL_INCREASING, ), FitbitSensorEntityDescription( key="activities/caloriesBMR", @@ -152,6 +156,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:fire", scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/distance", @@ -161,6 +167,7 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( value_fn=_distance_value_fn, unit_fn=_distance_unit, scope="activity", + state_class=SensorStateClass.TOTAL_INCREASING, ), FitbitSensorEntityDescription( key="activities/elevation", @@ -169,6 +176,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( device_class=SensorDeviceClass.DISTANCE, unit_fn=_elevation_unit, scope="activity", + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/floors", @@ -176,6 +185,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( native_unit_of_measurement="floors", icon="mdi:walk", scope="activity", + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/heart", @@ -184,6 +195,7 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:heart-pulse", value_fn=lambda result: int(result["value"]["restingHeartRate"]), scope="heartrate", + state_class=SensorStateClass.MEASUREMENT, ), FitbitSensorEntityDescription( key="activities/minutesFairlyActive", @@ -192,6 +204,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:walk", device_class=SensorDeviceClass.DURATION, scope="activity", + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/minutesLightlyActive", @@ -200,6 +214,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:walk", device_class=SensorDeviceClass.DURATION, scope="activity", + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/minutesSedentary", @@ -208,6 +224,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:seat-recline-normal", device_class=SensorDeviceClass.DURATION, scope="activity", + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/minutesVeryActive", @@ -216,6 +234,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:run", device_class=SensorDeviceClass.DURATION, scope="activity", + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/steps", @@ -223,6 +243,7 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( native_unit_of_measurement="steps", icon="mdi:walk", scope="activity", + state_class=SensorStateClass.TOTAL_INCREASING, ), FitbitSensorEntityDescription( key="activities/tracker/activityCalories", @@ -231,6 +252,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:fire", scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/calories", @@ -239,6 +262,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:fire", scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/distance", @@ -249,6 +274,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( unit_fn=_distance_unit, scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/elevation", @@ -258,6 +285,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( unit_fn=_elevation_unit, scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/floors", @@ -266,6 +295,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:walk", scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/minutesFairlyActive", @@ -275,6 +306,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( device_class=SensorDeviceClass.DURATION, scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/minutesLightlyActive", @@ -284,6 +317,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( device_class=SensorDeviceClass.DURATION, scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/minutesSedentary", @@ -293,6 +328,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( device_class=SensorDeviceClass.DURATION, scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/minutesVeryActive", @@ -302,6 +339,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( device_class=SensorDeviceClass.DURATION, scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="activities/tracker/steps", @@ -310,6 +349,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:walk", scope="activity", entity_registry_enabled_default=False, + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="body/bmi", @@ -320,6 +361,7 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( value_fn=_body_value_fn, scope="weight", entity_registry_enabled_default=False, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="body/fat", @@ -330,6 +372,7 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( value_fn=_body_value_fn, scope="weight", entity_registry_enabled_default=False, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="body/weight", @@ -347,6 +390,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( native_unit_of_measurement="times awaken", icon="mdi:sleep", scope="sleep", + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="sleep/efficiency", @@ -355,6 +400,7 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:sleep", state_class=SensorStateClass.MEASUREMENT, scope="sleep", + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="sleep/minutesAfterWakeup", @@ -363,6 +409,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:sleep", device_class=SensorDeviceClass.DURATION, scope="sleep", + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="sleep/minutesAsleep", @@ -371,6 +419,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:sleep", device_class=SensorDeviceClass.DURATION, scope="sleep", + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="sleep/minutesAwake", @@ -379,6 +429,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:sleep", device_class=SensorDeviceClass.DURATION, scope="sleep", + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="sleep/minutesToFallAsleep", @@ -387,6 +439,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:sleep", device_class=SensorDeviceClass.DURATION, scope="sleep", + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), FitbitSensorEntityDescription( key="sleep/timeInBed", @@ -395,6 +449,8 @@ FITBIT_RESOURCES_LIST: Final[tuple[FitbitSensorEntityDescription, ...]] = ( icon="mdi:hotel", device_class=SensorDeviceClass.DURATION, scope="sleep", + state_class=SensorStateClass.TOTAL_INCREASING, + entity_category=EntityCategory.DIAGNOSTIC, ), ) @@ -404,6 +460,7 @@ SLEEP_START_TIME = FitbitSensorEntityDescription( name="Sleep Start Time", icon="mdi:clock", scope="sleep", + entity_category=EntityCategory.DIAGNOSTIC, ) SLEEP_START_TIME_12HR = FitbitSensorEntityDescription( key="sleep/startTime", @@ -411,6 +468,7 @@ SLEEP_START_TIME_12HR = FitbitSensorEntityDescription( icon="mdi:clock", value_fn=_clock_format_12h, scope="sleep", + entity_category=EntityCategory.DIAGNOSTIC, ) FITBIT_RESOURCE_BATTERY = FitbitSensorEntityDescription( @@ -418,6 +476,7 @@ FITBIT_RESOURCE_BATTERY = FitbitSensorEntityDescription( name="Battery", icon="mdi:battery", scope="settings", + entity_category=EntityCategory.DIAGNOSTIC, ) FITBIT_RESOURCES_KEYS: Final[list[str]] = [ diff --git a/tests/components/fitbit/snapshots/test_sensor.ambr b/tests/components/fitbit/snapshots/test_sensor.ambr index 719a2f8a6b8..4af82c6815a 100644 --- a/tests/components/fitbit/snapshots/test_sensor.ambr +++ b/tests/components/fitbit/snapshots/test_sensor.ambr @@ -6,6 +6,7 @@ 'attribution': 'Data provided by Fitbit.com', 'friendly_name': 'Activity Calories', 'icon': 'mdi:fire', + 'state_class': , 'unit_of_measurement': 'cal', }), 'fitbit-api-user-id-1_activities/activityCalories', @@ -18,6 +19,7 @@ 'attribution': 'Data provided by Fitbit.com', 'friendly_name': 'Calories', 'icon': 'mdi:fire', + 'state_class': , 'unit_of_measurement': 'cal', }), 'fitbit-api-user-id-1_activities/calories', @@ -30,6 +32,7 @@ 'attribution': 'Data provided by Fitbit.com', 'friendly_name': 'Steps', 'icon': 'mdi:walk', + 'state_class': , 'unit_of_measurement': 'steps', }), 'fitbit-api-user-id-1_activities/steps', @@ -82,6 +85,7 @@ 'attribution': 'Data provided by Fitbit.com', 'friendly_name': 'Awakenings Count', 'icon': 'mdi:sleep', + 'state_class': , 'unit_of_measurement': 'times awaken', }), 'fitbit-api-user-id-1_sleep/awakeningsCount', @@ -108,6 +112,7 @@ 'device_class': 'duration', 'friendly_name': 'Minutes After Wakeup', 'icon': 'mdi:sleep', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_sleep/minutesAfterWakeup', @@ -121,6 +126,7 @@ 'device_class': 'duration', 'friendly_name': 'Sleep Minutes Asleep', 'icon': 'mdi:sleep', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_sleep/minutesAsleep', @@ -134,6 +140,7 @@ 'device_class': 'duration', 'friendly_name': 'Sleep Minutes Awake', 'icon': 'mdi:sleep', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_sleep/minutesAwake', @@ -147,6 +154,7 @@ 'device_class': 'duration', 'friendly_name': 'Sleep Minutes to Fall Asleep', 'icon': 'mdi:sleep', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_sleep/minutesToFallAsleep', @@ -160,6 +168,7 @@ 'device_class': 'distance', 'friendly_name': 'Distance', 'icon': 'mdi:map-marker', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_activities/distance', @@ -184,6 +193,7 @@ 'device_class': 'duration', 'friendly_name': 'Sleep Time in Bed', 'icon': 'mdi:hotel', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_sleep/timeInBed', @@ -197,6 +207,7 @@ 'device_class': 'distance', 'friendly_name': 'Elevation', 'icon': 'mdi:walk', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_activities/elevation', @@ -209,6 +220,7 @@ 'attribution': 'Data provided by Fitbit.com', 'friendly_name': 'Floors', 'icon': 'mdi:walk', + 'state_class': , 'unit_of_measurement': 'floors', }), 'fitbit-api-user-id-1_activities/floors', @@ -221,6 +233,7 @@ 'attribution': 'Data provided by Fitbit.com', 'friendly_name': 'Resting Heart Rate', 'icon': 'mdi:heart-pulse', + 'state_class': , 'unit_of_measurement': 'bpm', }), 'fitbit-api-user-id-1_activities/heart', @@ -234,6 +247,7 @@ 'device_class': 'duration', 'friendly_name': 'Minutes Fairly Active', 'icon': 'mdi:walk', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_activities/minutesFairlyActive', @@ -247,6 +261,7 @@ 'device_class': 'duration', 'friendly_name': 'Minutes Lightly Active', 'icon': 'mdi:walk', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_activities/minutesLightlyActive', @@ -260,6 +275,7 @@ 'device_class': 'duration', 'friendly_name': 'Minutes Sedentary', 'icon': 'mdi:seat-recline-normal', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_activities/minutesSedentary', @@ -273,6 +289,7 @@ 'device_class': 'duration', 'friendly_name': 'Minutes Very Active', 'icon': 'mdi:run', + 'state_class': , 'unit_of_measurement': , }), 'fitbit-api-user-id-1_activities/minutesVeryActive',