Add state class measurement to sensors where suitable for Synology DSM (#53468)

This commit is contained in:
Michael 2021-07-26 11:42:52 +02:00 committed by GitHub
parent 01c8114e93
commit ebfdfd172b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 195 additions and 159 deletions

View file

@ -26,9 +26,14 @@ from synology_dsm.exceptions import (
SynologyDSMRequestException, SynologyDSMRequestException,
) )
from homeassistant.components.sensor import ATTR_STATE_CLASS
from homeassistant.config_entries import SOURCE_REAUTH, ConfigEntry from homeassistant.config_entries import SOURCE_REAUTH, ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
ATTR_ATTRIBUTION, ATTR_ATTRIBUTION,
ATTR_DEVICE_CLASS,
ATTR_ICON,
ATTR_NAME,
ATTR_UNIT_OF_MEASUREMENT,
CONF_HOST, CONF_HOST,
CONF_MAC, CONF_MAC,
CONF_PASSWORD, CONF_PASSWORD,
@ -63,11 +68,7 @@ from .const import (
DEFAULT_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
DEFAULT_VERIFY_SSL, DEFAULT_VERIFY_SSL,
DOMAIN, DOMAIN,
ENTITY_CLASS,
ENTITY_ENABLE, ENTITY_ENABLE,
ENTITY_ICON,
ENTITY_NAME,
ENTITY_UNIT,
EXCEPTION_DETAILS, EXCEPTION_DETAILS,
EXCEPTION_UNKNOWN, EXCEPTION_UNKNOWN,
PLATFORMS, PLATFORMS,
@ -131,7 +132,7 @@ async def async_setup_entry( # noqa: C901
for entity_key, entity_attrs in entries.items(): for entity_key, entity_attrs in entries.items():
if ( if (
device_id device_id
and entity_attrs[ENTITY_NAME] == "Status" and entity_attrs[ATTR_NAME] == "Status"
and "Status" in entity_entry.unique_id and "Status" in entity_entry.unique_id
and "(Smart)" not in entity_entry.unique_id and "(Smart)" not in entity_entry.unique_id
): ):
@ -142,7 +143,7 @@ async def async_setup_entry( # noqa: C901
entity_type = entity_key entity_type = entity_key
continue continue
if entity_attrs[ENTITY_NAME] == label: if entity_attrs[ATTR_NAME] == label:
entity_type = entity_key entity_type = entity_key
if entity_type is None: if entity_type is None:
@ -616,12 +617,13 @@ class SynologyDSMBaseEntity(CoordinatorEntity):
self._api = api self._api = api
self._api_key = entity_type.split(":")[0] self._api_key = entity_type.split(":")[0]
self.entity_type = entity_type.split(":")[-1] self.entity_type = entity_type.split(":")[-1]
self._name = f"{api.network.hostname} {entity_info[ENTITY_NAME]}" self._name = f"{api.network.hostname} {entity_info[ATTR_NAME]}"
self._class = entity_info[ENTITY_CLASS] self._class = entity_info[ATTR_DEVICE_CLASS]
self._enable_default = entity_info[ENTITY_ENABLE] self._enable_default = entity_info[ENTITY_ENABLE]
self._icon = entity_info[ENTITY_ICON] self._icon = entity_info[ATTR_ICON]
self._unit = entity_info[ENTITY_UNIT] self._unit = entity_info[ATTR_UNIT_OF_MEASUREMENT]
self._unique_id = f"{self._api.information.serial}_{entity_type}" self._unique_id = f"{self._api.information.serial}_{entity_type}"
self._attr_state_class = entity_info[ATTR_STATE_CLASS]
@property @property
def unique_id(self) -> str: def unique_id(self) -> str:
@ -710,7 +712,9 @@ class SynologyDSMDeviceEntity(SynologyDSMBaseEntity):
self._device_model = disk["model"].strip() self._device_model = disk["model"].strip()
self._device_firmware = disk["firm"] self._device_firmware = disk["firm"]
self._device_type = disk["diskType"] self._device_type = disk["diskType"]
self._name = f"{self._api.network.hostname} {self._device_name} {entity_info[ENTITY_NAME]}" self._name = (
f"{self._api.network.hostname} {self._device_name} {entity_info[ATTR_NAME]}"
)
self._unique_id += f"_{self._device_id}" self._unique_id += f"_{self._device_id}"
@property @property

View file

@ -10,23 +10,21 @@ from synology_dsm.exceptions import (
) )
from homeassistant.components.camera import SUPPORT_STREAM, Camera from homeassistant.components.camera import SUPPORT_STREAM, Camera
from homeassistant.components.sensor import ATTR_STATE_CLASS
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_ICON,
ATTR_NAME,
ATTR_UNIT_OF_MEASUREMENT,
)
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from . import SynoApi, SynologyDSMBaseEntity from . import SynoApi, SynologyDSMBaseEntity
from .const import ( from .const import COORDINATOR_CAMERAS, DOMAIN, ENTITY_ENABLE, SYNO_API
COORDINATOR_CAMERAS,
DOMAIN,
ENTITY_CLASS,
ENTITY_ENABLE,
ENTITY_ICON,
ENTITY_NAME,
ENTITY_UNIT,
SYNO_API,
)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -70,11 +68,12 @@ class SynoDSMCamera(SynologyDSMBaseEntity, Camera):
api, api,
f"{SynoSurveillanceStation.CAMERA_API_KEY}:{camera_id}", f"{SynoSurveillanceStation.CAMERA_API_KEY}:{camera_id}",
{ {
ENTITY_NAME: coordinator.data["cameras"][camera_id].name, ATTR_NAME: coordinator.data["cameras"][camera_id].name,
ENTITY_ENABLE: coordinator.data["cameras"][camera_id].is_enabled, ENTITY_ENABLE: coordinator.data["cameras"][camera_id].is_enabled,
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ATTR_STATE_CLASS: None,
}, },
coordinator, coordinator,
) )

View file

@ -11,7 +11,12 @@ from synology_dsm.api.storage.storage import SynoStorage
from synology_dsm.api.surveillance_station import SynoSurveillanceStation from synology_dsm.api.surveillance_station import SynoSurveillanceStation
from homeassistant.components.binary_sensor import DEVICE_CLASS_SAFETY from homeassistant.components.binary_sensor import DEVICE_CLASS_SAFETY
from homeassistant.components.sensor import ATTR_STATE_CLASS, STATE_CLASS_MEASUREMENT
from homeassistant.const import ( from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_ICON,
ATTR_NAME,
ATTR_UNIT_OF_MEASUREMENT,
DATA_MEGABYTES, DATA_MEGABYTES,
DATA_RATE_KILOBYTES_PER_SECOND, DATA_RATE_KILOBYTES_PER_SECOND,
DATA_TERABYTES, DATA_TERABYTES,
@ -25,9 +30,10 @@ class EntityInfo(TypedDict):
"""TypedDict for EntityInfo.""" """TypedDict for EntityInfo."""
name: str name: str
unit: str | None unit_of_measurement: str | None
icon: str | None icon: str | None
device_class: str | None device_class: str | None
state_class: str | None
enable: bool enable: bool
@ -58,11 +64,6 @@ DEFAULT_SCAN_INTERVAL = 15 # min
DEFAULT_TIMEOUT = 10 # sec DEFAULT_TIMEOUT = 10 # sec
ENTITY_UNIT_LOAD = "load" ENTITY_UNIT_LOAD = "load"
ENTITY_NAME: Final = "name"
ENTITY_UNIT: Final = "unit"
ENTITY_ICON: Final = "icon"
ENTITY_CLASS: Final = "device_class"
ENTITY_ENABLE: Final = "enable" ENTITY_ENABLE: Final = "enable"
# Services # Services
@ -78,249 +79,281 @@ SERVICES = [
# Binary sensors # Binary sensors
UPGRADE_BINARY_SENSORS: dict[str, EntityInfo] = { UPGRADE_BINARY_SENSORS: dict[str, EntityInfo] = {
f"{SynoCoreUpgrade.API_KEY}:update_available": { f"{SynoCoreUpgrade.API_KEY}:update_available": {
ENTITY_NAME: "Update available", ATTR_NAME: "Update available",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: "mdi:update", ATTR_ICON: "mdi:update",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
} }
SECURITY_BINARY_SENSORS: dict[str, EntityInfo] = { SECURITY_BINARY_SENSORS: dict[str, EntityInfo] = {
f"{SynoCoreSecurity.API_KEY}:status": { f"{SynoCoreSecurity.API_KEY}:status": {
ENTITY_NAME: "Security status", ATTR_NAME: "Security status",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_CLASS: DEVICE_CLASS_SAFETY, ATTR_DEVICE_CLASS: DEVICE_CLASS_SAFETY,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
} }
STORAGE_DISK_BINARY_SENSORS: dict[str, EntityInfo] = { STORAGE_DISK_BINARY_SENSORS: dict[str, EntityInfo] = {
f"{SynoStorage.API_KEY}:disk_exceed_bad_sector_thr": { f"{SynoStorage.API_KEY}:disk_exceed_bad_sector_thr": {
ENTITY_NAME: "Exceeded Max Bad Sectors", ATTR_NAME: "Exceeded Max Bad Sectors",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_CLASS: DEVICE_CLASS_SAFETY, ATTR_DEVICE_CLASS: DEVICE_CLASS_SAFETY,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
f"{SynoStorage.API_KEY}:disk_below_remain_life_thr": { f"{SynoStorage.API_KEY}:disk_below_remain_life_thr": {
ENTITY_NAME: "Below Min Remaining Life", ATTR_NAME: "Below Min Remaining Life",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_CLASS: DEVICE_CLASS_SAFETY, ATTR_DEVICE_CLASS: DEVICE_CLASS_SAFETY,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
} }
# Sensors # Sensors
UTILISATION_SENSORS: dict[str, EntityInfo] = { UTILISATION_SENSORS: dict[str, EntityInfo] = {
f"{SynoCoreUtilization.API_KEY}:cpu_other_load": { f"{SynoCoreUtilization.API_KEY}:cpu_other_load": {
ENTITY_NAME: "CPU Utilization (Other)", ATTR_NAME: "CPU Utilization (Other)",
ENTITY_UNIT: PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
ENTITY_ICON: "mdi:chip", ATTR_ICON: "mdi:chip",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:cpu_user_load": { f"{SynoCoreUtilization.API_KEY}:cpu_user_load": {
ENTITY_NAME: "CPU Utilization (User)", ATTR_NAME: "CPU Utilization (User)",
ENTITY_UNIT: PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
ENTITY_ICON: "mdi:chip", ATTR_ICON: "mdi:chip",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:cpu_system_load": { f"{SynoCoreUtilization.API_KEY}:cpu_system_load": {
ENTITY_NAME: "CPU Utilization (System)", ATTR_NAME: "CPU Utilization (System)",
ENTITY_UNIT: PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
ENTITY_ICON: "mdi:chip", ATTR_ICON: "mdi:chip",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:cpu_total_load": { f"{SynoCoreUtilization.API_KEY}:cpu_total_load": {
ENTITY_NAME: "CPU Utilization (Total)", ATTR_NAME: "CPU Utilization (Total)",
ENTITY_UNIT: PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
ENTITY_ICON: "mdi:chip", ATTR_ICON: "mdi:chip",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:cpu_1min_load": { f"{SynoCoreUtilization.API_KEY}:cpu_1min_load": {
ENTITY_NAME: "CPU Load Average (1 min)", ATTR_NAME: "CPU Load Average (1 min)",
ENTITY_UNIT: ENTITY_UNIT_LOAD, ATTR_UNIT_OF_MEASUREMENT: ENTITY_UNIT_LOAD,
ENTITY_ICON: "mdi:chip", ATTR_ICON: "mdi:chip",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: None,
}, },
f"{SynoCoreUtilization.API_KEY}:cpu_5min_load": { f"{SynoCoreUtilization.API_KEY}:cpu_5min_load": {
ENTITY_NAME: "CPU Load Average (5 min)", ATTR_NAME: "CPU Load Average (5 min)",
ENTITY_UNIT: ENTITY_UNIT_LOAD, ATTR_UNIT_OF_MEASUREMENT: ENTITY_UNIT_LOAD,
ENTITY_ICON: "mdi:chip", ATTR_ICON: "mdi:chip",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
f"{SynoCoreUtilization.API_KEY}:cpu_15min_load": { f"{SynoCoreUtilization.API_KEY}:cpu_15min_load": {
ENTITY_NAME: "CPU Load Average (15 min)", ATTR_NAME: "CPU Load Average (15 min)",
ENTITY_UNIT: ENTITY_UNIT_LOAD, ATTR_UNIT_OF_MEASUREMENT: ENTITY_UNIT_LOAD,
ENTITY_ICON: "mdi:chip", ATTR_ICON: "mdi:chip",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
f"{SynoCoreUtilization.API_KEY}:memory_real_usage": { f"{SynoCoreUtilization.API_KEY}:memory_real_usage": {
ENTITY_NAME: "Memory Usage (Real)", ATTR_NAME: "Memory Usage (Real)",
ENTITY_UNIT: PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
ENTITY_ICON: "mdi:memory", ATTR_ICON: "mdi:memory",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:memory_size": { f"{SynoCoreUtilization.API_KEY}:memory_size": {
ENTITY_NAME: "Memory Size", ATTR_NAME: "Memory Size",
ENTITY_UNIT: DATA_MEGABYTES, ATTR_UNIT_OF_MEASUREMENT: DATA_MEGABYTES,
ENTITY_ICON: "mdi:memory", ATTR_ICON: "mdi:memory",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:memory_cached": { f"{SynoCoreUtilization.API_KEY}:memory_cached": {
ENTITY_NAME: "Memory Cached", ATTR_NAME: "Memory Cached",
ENTITY_UNIT: DATA_MEGABYTES, ATTR_UNIT_OF_MEASUREMENT: DATA_MEGABYTES,
ENTITY_ICON: "mdi:memory", ATTR_ICON: "mdi:memory",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:memory_available_swap": { f"{SynoCoreUtilization.API_KEY}:memory_available_swap": {
ENTITY_NAME: "Memory Available (Swap)", ATTR_NAME: "Memory Available (Swap)",
ENTITY_UNIT: DATA_MEGABYTES, ATTR_UNIT_OF_MEASUREMENT: DATA_MEGABYTES,
ENTITY_ICON: "mdi:memory", ATTR_ICON: "mdi:memory",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:memory_available_real": { f"{SynoCoreUtilization.API_KEY}:memory_available_real": {
ENTITY_NAME: "Memory Available (Real)", ATTR_NAME: "Memory Available (Real)",
ENTITY_UNIT: DATA_MEGABYTES, ATTR_UNIT_OF_MEASUREMENT: DATA_MEGABYTES,
ENTITY_ICON: "mdi:memory", ATTR_ICON: "mdi:memory",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:memory_total_swap": { f"{SynoCoreUtilization.API_KEY}:memory_total_swap": {
ENTITY_NAME: "Memory Total (Swap)", ATTR_NAME: "Memory Total (Swap)",
ENTITY_UNIT: DATA_MEGABYTES, ATTR_UNIT_OF_MEASUREMENT: DATA_MEGABYTES,
ENTITY_ICON: "mdi:memory", ATTR_ICON: "mdi:memory",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:memory_total_real": { f"{SynoCoreUtilization.API_KEY}:memory_total_real": {
ENTITY_NAME: "Memory Total (Real)", ATTR_NAME: "Memory Total (Real)",
ENTITY_UNIT: DATA_MEGABYTES, ATTR_UNIT_OF_MEASUREMENT: DATA_MEGABYTES,
ENTITY_ICON: "mdi:memory", ATTR_ICON: "mdi:memory",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:network_up": { f"{SynoCoreUtilization.API_KEY}:network_up": {
ENTITY_NAME: "Network Up", ATTR_NAME: "Network Up",
ENTITY_UNIT: DATA_RATE_KILOBYTES_PER_SECOND, ATTR_UNIT_OF_MEASUREMENT: DATA_RATE_KILOBYTES_PER_SECOND,
ENTITY_ICON: "mdi:upload", ATTR_ICON: "mdi:upload",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoCoreUtilization.API_KEY}:network_down": { f"{SynoCoreUtilization.API_KEY}:network_down": {
ENTITY_NAME: "Network Down", ATTR_NAME: "Network Down",
ENTITY_UNIT: DATA_RATE_KILOBYTES_PER_SECOND, ATTR_UNIT_OF_MEASUREMENT: DATA_RATE_KILOBYTES_PER_SECOND,
ENTITY_ICON: "mdi:download", ATTR_ICON: "mdi:download",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
} }
STORAGE_VOL_SENSORS: dict[str, EntityInfo] = { STORAGE_VOL_SENSORS: dict[str, EntityInfo] = {
f"{SynoStorage.API_KEY}:volume_status": { f"{SynoStorage.API_KEY}:volume_status": {
ENTITY_NAME: "Status", ATTR_NAME: "Status",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: "mdi:checkbox-marked-circle-outline", ATTR_ICON: "mdi:checkbox-marked-circle-outline",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
f"{SynoStorage.API_KEY}:volume_size_total": { f"{SynoStorage.API_KEY}:volume_size_total": {
ENTITY_NAME: "Total Size", ATTR_NAME: "Total Size",
ENTITY_UNIT: DATA_TERABYTES, ATTR_UNIT_OF_MEASUREMENT: DATA_TERABYTES,
ENTITY_ICON: "mdi:chart-pie", ATTR_ICON: "mdi:chart-pie",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoStorage.API_KEY}:volume_size_used": { f"{SynoStorage.API_KEY}:volume_size_used": {
ENTITY_NAME: "Used Space", ATTR_NAME: "Used Space",
ENTITY_UNIT: DATA_TERABYTES, ATTR_UNIT_OF_MEASUREMENT: DATA_TERABYTES,
ENTITY_ICON: "mdi:chart-pie", ATTR_ICON: "mdi:chart-pie",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoStorage.API_KEY}:volume_percentage_used": { f"{SynoStorage.API_KEY}:volume_percentage_used": {
ENTITY_NAME: "Volume Used", ATTR_NAME: "Volume Used",
ENTITY_UNIT: PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
ENTITY_ICON: "mdi:chart-pie", ATTR_ICON: "mdi:chart-pie",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
f"{SynoStorage.API_KEY}:volume_disk_temp_avg": { f"{SynoStorage.API_KEY}:volume_disk_temp_avg": {
ENTITY_NAME: "Average Disk Temp", ATTR_NAME: "Average Disk Temp",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
f"{SynoStorage.API_KEY}:volume_disk_temp_max": { f"{SynoStorage.API_KEY}:volume_disk_temp_max": {
ENTITY_NAME: "Maximum Disk Temp", ATTR_NAME: "Maximum Disk Temp",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: None,
}, },
} }
STORAGE_DISK_SENSORS: dict[str, EntityInfo] = { STORAGE_DISK_SENSORS: dict[str, EntityInfo] = {
f"{SynoStorage.API_KEY}:disk_smart_status": { f"{SynoStorage.API_KEY}:disk_smart_status": {
ENTITY_NAME: "Status (Smart)", ATTR_NAME: "Status (Smart)",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: "mdi:checkbox-marked-circle-outline", ATTR_ICON: "mdi:checkbox-marked-circle-outline",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: None,
}, },
f"{SynoStorage.API_KEY}:disk_status": { f"{SynoStorage.API_KEY}:disk_status": {
ENTITY_NAME: "Status", ATTR_NAME: "Status",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: "mdi:checkbox-marked-circle-outline", ATTR_ICON: "mdi:checkbox-marked-circle-outline",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
f"{SynoStorage.API_KEY}:disk_temp": { f"{SynoStorage.API_KEY}:disk_temp": {
ENTITY_NAME: "Temperature", ATTR_NAME: "Temperature",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
} }
INFORMATION_SENSORS: dict[str, EntityInfo] = { INFORMATION_SENSORS: dict[str, EntityInfo] = {
f"{SynoDSMInformation.API_KEY}:temperature": { f"{SynoDSMInformation.API_KEY}:temperature": {
ENTITY_NAME: "temperature", ATTR_NAME: "temperature",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
f"{SynoDSMInformation.API_KEY}:uptime": { f"{SynoDSMInformation.API_KEY}:uptime": {
ENTITY_NAME: "last boot", ATTR_NAME: "last boot",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: None, ATTR_ICON: None,
ENTITY_CLASS: DEVICE_CLASS_TIMESTAMP, ATTR_DEVICE_CLASS: DEVICE_CLASS_TIMESTAMP,
ENTITY_ENABLE: False, ENTITY_ENABLE: False,
ATTR_STATE_CLASS: None,
}, },
} }
# Switch # Switch
SURVEILLANCE_SWITCH: dict[str, EntityInfo] = { SURVEILLANCE_SWITCH: dict[str, EntityInfo] = {
f"{SynoSurveillanceStation.HOME_MODE_API_KEY}:home_mode": { f"{SynoSurveillanceStation.HOME_MODE_API_KEY}:home_mode": {
ENTITY_NAME: "home mode", ATTR_NAME: "home mode",
ENTITY_UNIT: None, ATTR_UNIT_OF_MEASUREMENT: None,
ENTITY_ICON: "mdi:home-account", ATTR_ICON: "mdi:home-account",
ENTITY_CLASS: None, ATTR_DEVICE_CLASS: None,
ENTITY_ENABLE: True, ENTITY_ENABLE: True,
ATTR_STATE_CLASS: None,
}, },
} }