Add measurement unit and state_class to sensors in pyLoad (#120551)

This commit is contained in:
Mr. Bubbles 2024-06-26 14:14:48 +02:00 committed by GitHub
parent 69e0227682
commit f5ff19d602
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 82 additions and 24 deletions

View File

@ -10,3 +10,5 @@ ISSUE_PLACEHOLDER = {"url": "/config/integrations/dashboard/add?domain=pyload"}
MANUFACTURER = "pyLoad Team" MANUFACTURER = "pyLoad Team"
SERVICE_NAME = "pyLoad" SERVICE_NAME = "pyLoad"
UNIT_DOWNLOADS = "downloads"

View File

@ -11,6 +11,7 @@ from homeassistant.components.sensor import (
SensorDeviceClass, SensorDeviceClass,
SensorEntity, SensorEntity,
SensorEntityDescription, SensorEntityDescription,
SensorStateClass,
) )
from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.config_entries import SOURCE_IMPORT
from homeassistant.const import ( from homeassistant.const import (
@ -42,6 +43,7 @@ from .const import (
ISSUE_PLACEHOLDER, ISSUE_PLACEHOLDER,
MANUFACTURER, MANUFACTURER,
SERVICE_NAME, SERVICE_NAME,
UNIT_DOWNLOADS,
) )
from .coordinator import PyLoadCoordinator from .coordinator import PyLoadCoordinator
@ -68,14 +70,20 @@ SENSOR_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
SensorEntityDescription( SensorEntityDescription(
key=PyLoadSensorEntity.ACTIVE, key=PyLoadSensorEntity.ACTIVE,
translation_key=PyLoadSensorEntity.ACTIVE, translation_key=PyLoadSensorEntity.ACTIVE,
native_unit_of_measurement=UNIT_DOWNLOADS,
state_class=SensorStateClass.MEASUREMENT,
), ),
SensorEntityDescription( SensorEntityDescription(
key=PyLoadSensorEntity.QUEUE, key=PyLoadSensorEntity.QUEUE,
translation_key=PyLoadSensorEntity.QUEUE, translation_key=PyLoadSensorEntity.QUEUE,
native_unit_of_measurement=UNIT_DOWNLOADS,
state_class=SensorStateClass.MEASUREMENT,
), ),
SensorEntityDescription( SensorEntityDescription(
key=PyLoadSensorEntity.TOTAL, key=PyLoadSensorEntity.TOTAL,
translation_key=PyLoadSensorEntity.TOTAL, translation_key=PyLoadSensorEntity.TOTAL,
native_unit_of_measurement=UNIT_DOWNLOADS,
state_class=SensorStateClass.MEASUREMENT,
), ),
SensorEntityDescription( SensorEntityDescription(
key=PyLoadSensorEntity.FREE_SPACE, key=PyLoadSensorEntity.FREE_SPACE,

View File

@ -4,7 +4,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -29,13 +31,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.ACTIVE: 'active'>, 'translation_key': <PyLoadSensorEntity.ACTIVE: 'active'>,
'unique_id': 'XXXXXXXXXXXXXX_active', 'unique_id': 'XXXXXXXXXXXXXX_active',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[CannotConnect][sensor.pyload_active_downloads-state] # name: test_sensor_update_exceptions[CannotConnect][sensor.pyload_active_downloads-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Active downloads', 'friendly_name': 'pyLoad Active downloads',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_active_downloads', 'entity_id': 'sensor.pyload_active_downloads',
@ -50,7 +54,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -75,13 +81,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.QUEUE: 'queue'>, 'translation_key': <PyLoadSensorEntity.QUEUE: 'queue'>,
'unique_id': 'XXXXXXXXXXXXXX_queue', 'unique_id': 'XXXXXXXXXXXXXX_queue',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[CannotConnect][sensor.pyload_downloads_in_queue-state] # name: test_sensor_update_exceptions[CannotConnect][sensor.pyload_downloads_in_queue-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Downloads in queue', 'friendly_name': 'pyLoad Downloads in queue',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_downloads_in_queue', 'entity_id': 'sensor.pyload_downloads_in_queue',
@ -96,7 +104,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -121,13 +131,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.TOTAL: 'total'>, 'translation_key': <PyLoadSensorEntity.TOTAL: 'total'>,
'unique_id': 'XXXXXXXXXXXXXX_total', 'unique_id': 'XXXXXXXXXXXXXX_total',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[CannotConnect][sensor.pyload_finished_downloads-state] # name: test_sensor_update_exceptions[CannotConnect][sensor.pyload_finished_downloads-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Finished downloads', 'friendly_name': 'pyLoad Finished downloads',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_finished_downloads', 'entity_id': 'sensor.pyload_finished_downloads',
@ -250,7 +262,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -275,13 +289,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.ACTIVE: 'active'>, 'translation_key': <PyLoadSensorEntity.ACTIVE: 'active'>,
'unique_id': 'XXXXXXXXXXXXXX_active', 'unique_id': 'XXXXXXXXXXXXXX_active',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[InvalidAuth][sensor.pyload_active_downloads-state] # name: test_sensor_update_exceptions[InvalidAuth][sensor.pyload_active_downloads-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Active downloads', 'friendly_name': 'pyLoad Active downloads',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_active_downloads', 'entity_id': 'sensor.pyload_active_downloads',
@ -296,7 +312,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -321,13 +339,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.QUEUE: 'queue'>, 'translation_key': <PyLoadSensorEntity.QUEUE: 'queue'>,
'unique_id': 'XXXXXXXXXXXXXX_queue', 'unique_id': 'XXXXXXXXXXXXXX_queue',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[InvalidAuth][sensor.pyload_downloads_in_queue-state] # name: test_sensor_update_exceptions[InvalidAuth][sensor.pyload_downloads_in_queue-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Downloads in queue', 'friendly_name': 'pyLoad Downloads in queue',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_downloads_in_queue', 'entity_id': 'sensor.pyload_downloads_in_queue',
@ -342,7 +362,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -367,13 +389,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.TOTAL: 'total'>, 'translation_key': <PyLoadSensorEntity.TOTAL: 'total'>,
'unique_id': 'XXXXXXXXXXXXXX_total', 'unique_id': 'XXXXXXXXXXXXXX_total',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[InvalidAuth][sensor.pyload_finished_downloads-state] # name: test_sensor_update_exceptions[InvalidAuth][sensor.pyload_finished_downloads-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Finished downloads', 'friendly_name': 'pyLoad Finished downloads',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_finished_downloads', 'entity_id': 'sensor.pyload_finished_downloads',
@ -496,7 +520,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -521,13 +547,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.ACTIVE: 'active'>, 'translation_key': <PyLoadSensorEntity.ACTIVE: 'active'>,
'unique_id': 'XXXXXXXXXXXXXX_active', 'unique_id': 'XXXXXXXXXXXXXX_active',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[ParserError][sensor.pyload_active_downloads-state] # name: test_sensor_update_exceptions[ParserError][sensor.pyload_active_downloads-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Active downloads', 'friendly_name': 'pyLoad Active downloads',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_active_downloads', 'entity_id': 'sensor.pyload_active_downloads',
@ -542,7 +570,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -567,13 +597,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.QUEUE: 'queue'>, 'translation_key': <PyLoadSensorEntity.QUEUE: 'queue'>,
'unique_id': 'XXXXXXXXXXXXXX_queue', 'unique_id': 'XXXXXXXXXXXXXX_queue',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[ParserError][sensor.pyload_downloads_in_queue-state] # name: test_sensor_update_exceptions[ParserError][sensor.pyload_downloads_in_queue-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Downloads in queue', 'friendly_name': 'pyLoad Downloads in queue',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_downloads_in_queue', 'entity_id': 'sensor.pyload_downloads_in_queue',
@ -588,7 +620,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -613,13 +647,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.TOTAL: 'total'>, 'translation_key': <PyLoadSensorEntity.TOTAL: 'total'>,
'unique_id': 'XXXXXXXXXXXXXX_total', 'unique_id': 'XXXXXXXXXXXXXX_total',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_sensor_update_exceptions[ParserError][sensor.pyload_finished_downloads-state] # name: test_sensor_update_exceptions[ParserError][sensor.pyload_finished_downloads-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Finished downloads', 'friendly_name': 'pyLoad Finished downloads',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_finished_downloads', 'entity_id': 'sensor.pyload_finished_downloads',
@ -742,7 +778,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -767,13 +805,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.ACTIVE: 'active'>, 'translation_key': <PyLoadSensorEntity.ACTIVE: 'active'>,
'unique_id': 'XXXXXXXXXXXXXX_active', 'unique_id': 'XXXXXXXXXXXXXX_active',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_setup[sensor.pyload_active_downloads-state] # name: test_setup[sensor.pyload_active_downloads-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Active downloads', 'friendly_name': 'pyLoad Active downloads',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_active_downloads', 'entity_id': 'sensor.pyload_active_downloads',
@ -788,7 +828,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -813,13 +855,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.QUEUE: 'queue'>, 'translation_key': <PyLoadSensorEntity.QUEUE: 'queue'>,
'unique_id': 'XXXXXXXXXXXXXX_queue', 'unique_id': 'XXXXXXXXXXXXXX_queue',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_setup[sensor.pyload_downloads_in_queue-state] # name: test_setup[sensor.pyload_downloads_in_queue-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Downloads in queue', 'friendly_name': 'pyLoad Downloads in queue',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_downloads_in_queue', 'entity_id': 'sensor.pyload_downloads_in_queue',
@ -834,7 +878,9 @@
'aliases': set({ 'aliases': set({
}), }),
'area_id': None, 'area_id': None,
'capabilities': None, 'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
'device_class': None, 'device_class': None,
'device_id': <ANY>, 'device_id': <ANY>,
@ -859,13 +905,15 @@
'supported_features': 0, 'supported_features': 0,
'translation_key': <PyLoadSensorEntity.TOTAL: 'total'>, 'translation_key': <PyLoadSensorEntity.TOTAL: 'total'>,
'unique_id': 'XXXXXXXXXXXXXX_total', 'unique_id': 'XXXXXXXXXXXXXX_total',
'unit_of_measurement': None, 'unit_of_measurement': 'downloads',
}) })
# --- # ---
# name: test_setup[sensor.pyload_finished_downloads-state] # name: test_setup[sensor.pyload_finished_downloads-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'pyLoad Finished downloads', 'friendly_name': 'pyLoad Finished downloads',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'downloads',
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.pyload_finished_downloads', 'entity_id': 'sensor.pyload_finished_downloads',