diff --git a/homeassistant/components/shelly/sensor.py b/homeassistant/components/shelly/sensor.py index 2af6d1d91a9..512c387c561 100644 --- a/homeassistant/components/shelly/sensor.py +++ b/homeassistant/components/shelly/sensor.py @@ -2,15 +2,31 @@ import aioshelly from homeassistant.components import sensor -from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_PERCENTAGE +from homeassistant.const import ( + ELECTRICAL_CURRENT_AMPERE, + ENERGY_KILO_WATT_HOUR, + POWER_WATT, + TEMP_CELSIUS, + TEMP_FAHRENHEIT, + UNIT_PERCENTAGE, + VOLT, +) from homeassistant.helpers.entity import Entity from . import ShellyBlockEntity, ShellyDeviceWrapper from .const import DOMAIN SENSORS = { + "battery": [UNIT_PERCENTAGE, sensor.DEVICE_CLASS_BATTERY], + "current": [ELECTRICAL_CURRENT_AMPERE, sensor.DEVICE_CLASS_CURRENT], + "deviceTemp": [None, sensor.DEVICE_CLASS_TEMPERATURE], + "energy": [ENERGY_KILO_WATT_HOUR, sensor.DEVICE_CLASS_ENERGY], + "energyReturned": [ENERGY_KILO_WATT_HOUR, sensor.DEVICE_CLASS_ENERGY], "extTemp": [None, sensor.DEVICE_CLASS_TEMPERATURE], "humidity": [UNIT_PERCENTAGE, sensor.DEVICE_CLASS_HUMIDITY], + "overpowerValue": [POWER_WATT, sensor.DEVICE_CLASS_POWER], + "power": [POWER_WATT, sensor.DEVICE_CLASS_POWER], + "voltage": [VOLT, sensor.DEVICE_CLASS_VOLTAGE], } @@ -20,9 +36,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities): sensors = [] for block in wrapper.device.blocks: - if block.type != "sensor": - continue - for attr in SENSORS: if not hasattr(block, attr): continue @@ -46,13 +59,18 @@ class ShellySensor(ShellyBlockEntity, Entity): super().__init__(wrapper, block) self.attribute = attribute unit, device_class = SENSORS[attribute] - info = block.info(attribute) + self.info = block.info(attribute) - if info[aioshelly.BLOCK_VALUE_TYPE] == aioshelly.BLOCK_VALUE_TYPE_TEMPERATURE: - if info[aioshelly.BLOCK_VALUE_UNIT] == "C": + if ( + self.info[aioshelly.BLOCK_VALUE_TYPE] + == aioshelly.BLOCK_VALUE_TYPE_TEMPERATURE + ): + if self.info[aioshelly.BLOCK_VALUE_UNIT] == "C": unit = TEMP_CELSIUS else: unit = TEMP_FAHRENHEIT + elif self.info[aioshelly.BLOCK_VALUE_TYPE] == aioshelly.BLOCK_VALUE_TYPE_ENERGY: + unit = ENERGY_KILO_WATT_HOUR self._unit = unit self._device_class = device_class @@ -70,6 +88,19 @@ class ShellySensor(ShellyBlockEntity, Entity): @property def state(self): """Value of sensor.""" + if self.attribute in [ + "deviceTemp", + "extTemp", + "humidity", + "overpowerValue", + "power", + ]: + return round(getattr(self.block, self.attribute), 1) + # Energy unit change from Wmin or Wh to kWh + if self.info[aioshelly.BLOCK_VALUE_UNIT] == "Wmin": + return round(getattr(self.block, self.attribute) / 60 / 1000, 2) + if self.info[aioshelly.BLOCK_VALUE_UNIT] == "Wh": + return round(getattr(self.block, self.attribute) / 1000, 2) return getattr(self.block, self.attribute) @property