From f788f8805201f1482553fb388b98f03d72b9b37e Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Thu, 16 May 2024 21:41:19 +0200 Subject: [PATCH] Add Reolink battery entities (#117506) * add battery sensors * Disable Battery Temperature and State by default * fix mypy * Use device class for icon --- homeassistant/components/reolink/icons.json | 6 +++ homeassistant/components/reolink/sensor.py | 42 +++++++++++++++++-- homeassistant/components/reolink/strings.json | 14 +++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/reolink/icons.json b/homeassistant/components/reolink/icons.json index 56f1f9563f4..6346881e8f7 100644 --- a/homeassistant/components/reolink/icons.json +++ b/homeassistant/components/reolink/icons.json @@ -203,6 +203,12 @@ "ptz_pan_position": { "default": "mdi:pan" }, + "battery_temperature": { + "default": "mdi:thermometer" + }, + "battery_state": { + "default": "mdi:battery-charging" + }, "wifi_signal": { "default": "mdi:wifi" }, diff --git a/homeassistant/components/reolink/sensor.py b/homeassistant/components/reolink/sensor.py index 36363beaf80..1d11234f6b3 100644 --- a/homeassistant/components/reolink/sensor.py +++ b/homeassistant/components/reolink/sensor.py @@ -8,14 +8,16 @@ from datetime import date, datetime from decimal import Decimal from reolink_aio.api import Host +from reolink_aio.enums import BatteryEnum from homeassistant.components.sensor import ( + SensorDeviceClass, SensorEntity, SensorEntityDescription, SensorStateClass, ) from homeassistant.config_entries import ConfigEntry -from homeassistant.const import PERCENTAGE, EntityCategory +from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import StateType @@ -37,7 +39,7 @@ class ReolinkSensorEntityDescription( ): """A class that describes sensor entities for a camera channel.""" - value: Callable[[Host, int], int | float] + value: Callable[[Host, int], StateType] @dataclass(frozen=True, kw_only=True) @@ -47,7 +49,7 @@ class ReolinkHostSensorEntityDescription( ): """A class that describes host sensor entities.""" - value: Callable[[Host], int | None] + value: Callable[[Host], StateType] SENSORS = ( @@ -60,6 +62,40 @@ SENSORS = ( value=lambda api, ch: api.ptz_pan_position(ch), supported=lambda api, ch: api.supported(ch, "ptz_position"), ), + ReolinkSensorEntityDescription( + key="battery_percent", + cmd_key="GetBatteryInfo", + translation_key="battery_percent", + native_unit_of_measurement=PERCENTAGE, + device_class=SensorDeviceClass.BATTERY, + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + value=lambda api, ch: api.battery_percentage(ch), + supported=lambda api, ch: api.supported(ch, "battery"), + ), + ReolinkSensorEntityDescription( + key="battery_temperature", + cmd_key="GetBatteryInfo", + translation_key="battery_temperature", + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, + value=lambda api, ch: api.battery_temperature(ch), + supported=lambda api, ch: api.supported(ch, "battery"), + ), + ReolinkSensorEntityDescription( + key="battery_state", + cmd_key="GetBatteryInfo", + translation_key="battery_state", + device_class=SensorDeviceClass.ENUM, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, + options=[state.name for state in BatteryEnum], + value=lambda api, ch: BatteryEnum(api.battery_status(ch)).name, + supported=lambda api, ch: api.supported(ch, "battery"), + ), ) HOST_SENSORS = ( diff --git a/homeassistant/components/reolink/strings.json b/homeassistant/components/reolink/strings.json index 43ac19394ef..b226003da1e 100644 --- a/homeassistant/components/reolink/strings.json +++ b/homeassistant/components/reolink/strings.json @@ -400,6 +400,20 @@ "ptz_pan_position": { "name": "PTZ pan position" }, + "battery_percent": { + "name": "Battery percentage" + }, + "battery_temperature": { + "name": "Battery temperature" + }, + "battery_state": { + "name": "Battery state", + "state": { + "discharging": "Discharging", + "charging": "Charging", + "chargecomplete": "Charge complete" + } + }, "hdd_storage": { "name": "HDD {hdd_index} storage" },