Skip to content

Commit

Permalink
Remove last_reset attribute and set state class to total_increasing f…
Browse files Browse the repository at this point in the history
…or Shelly energy sensors (home-assistant#54800)
  • Loading branch information
emontnemery authored Aug 18, 2021
1 parent 1280a38 commit dcb2a21
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 55 deletions.
3 changes: 0 additions & 3 deletions homeassistant/components/shelly/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,3 @@
KELVIN_MIN_VALUE_COLOR: Final = 3000

UPTIME_DEVIATION: Final = 5

LAST_RESET_UPTIME: Final = "uptime"
LAST_RESET_NEVER: Final = "never"
1 change: 0 additions & 1 deletion homeassistant/components/shelly/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,6 @@ class BlockAttributeDescription:
# Callable (settings, block), return true if entity should be removed
removal_condition: Callable[[dict, aioshelly.Block], bool] | None = None
extra_state_attributes: Callable[[aioshelly.Block], dict | None] | None = None
last_reset: str | None = None


@dataclass
Expand Down
58 changes: 7 additions & 51 deletions homeassistant/components/shelly/sensor.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
"""Sensor for Shelly."""
from __future__ import annotations

from datetime import timedelta
import logging
from typing import Final, cast

import aioshelly

from homeassistant.components import sensor
from homeassistant.components.sensor import SensorEntity
from homeassistant.config_entries import ConfigEntry
Expand All @@ -24,10 +20,8 @@
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType
from homeassistant.util import dt

from . import ShellyDeviceWrapper
from .const import LAST_RESET_NEVER, LAST_RESET_UPTIME, SHAIR_MAX_WORK_HOURS
from .const import SHAIR_MAX_WORK_HOURS
from .entity import (
BlockAttributeDescription,
RestAttributeDescription,
Expand All @@ -39,8 +33,6 @@
)
from .utils import get_device_uptime, temperature_unit

_LOGGER: Final = logging.getLogger(__name__)

SENSORS: Final = {
("device", "battery"): BlockAttributeDescription(
name="Battery",
Expand Down Expand Up @@ -119,49 +111,43 @@
unit=ENERGY_KILO_WATT_HOUR,
value=lambda value: round(value / 60 / 1000, 2),
device_class=sensor.DEVICE_CLASS_ENERGY,
state_class=sensor.STATE_CLASS_MEASUREMENT,
last_reset=LAST_RESET_UPTIME,
state_class=sensor.STATE_CLASS_TOTAL_INCREASING,
),
("emeter", "energy"): BlockAttributeDescription(
name="Energy",
unit=ENERGY_KILO_WATT_HOUR,
value=lambda value: round(value / 1000, 2),
device_class=sensor.DEVICE_CLASS_ENERGY,
state_class=sensor.STATE_CLASS_MEASUREMENT,
last_reset=LAST_RESET_NEVER,
state_class=sensor.STATE_CLASS_TOTAL_INCREASING,
),
("emeter", "energyReturned"): BlockAttributeDescription(
name="Energy Returned",
unit=ENERGY_KILO_WATT_HOUR,
value=lambda value: round(value / 1000, 2),
device_class=sensor.DEVICE_CLASS_ENERGY,
state_class=sensor.STATE_CLASS_MEASUREMENT,
last_reset=LAST_RESET_NEVER,
state_class=sensor.STATE_CLASS_TOTAL_INCREASING,
),
("light", "energy"): BlockAttributeDescription(
name="Energy",
unit=ENERGY_KILO_WATT_HOUR,
value=lambda value: round(value / 60 / 1000, 2),
device_class=sensor.DEVICE_CLASS_ENERGY,
state_class=sensor.STATE_CLASS_MEASUREMENT,
state_class=sensor.STATE_CLASS_TOTAL_INCREASING,
default_enabled=False,
last_reset=LAST_RESET_UPTIME,
),
("relay", "energy"): BlockAttributeDescription(
name="Energy",
unit=ENERGY_KILO_WATT_HOUR,
value=lambda value: round(value / 60 / 1000, 2),
device_class=sensor.DEVICE_CLASS_ENERGY,
state_class=sensor.STATE_CLASS_MEASUREMENT,
last_reset=LAST_RESET_UPTIME,
state_class=sensor.STATE_CLASS_TOTAL_INCREASING,
),
("roller", "rollerEnergy"): BlockAttributeDescription(
name="Energy",
unit=ENERGY_KILO_WATT_HOUR,
value=lambda value: round(value / 60 / 1000, 2),
device_class=sensor.DEVICE_CLASS_ENERGY,
state_class=sensor.STATE_CLASS_MEASUREMENT,
last_reset=LAST_RESET_UPTIME,
state_class=sensor.STATE_CLASS_TOTAL_INCREASING,
),
("sensor", "concentration"): BlockAttributeDescription(
name="Gas Concentration",
Expand Down Expand Up @@ -261,39 +247,9 @@ async def async_setup_entry(
class ShellySensor(ShellyBlockAttributeEntity, SensorEntity):
"""Represent a shelly sensor."""

def __init__(
self,
wrapper: ShellyDeviceWrapper,
block: aioshelly.Block,
attribute: str,
description: BlockAttributeDescription,
) -> None:
"""Initialize sensor."""
super().__init__(wrapper, block, attribute, description)
self._last_value: float | None = None

if description.last_reset == LAST_RESET_NEVER:
self._attr_last_reset = dt.utc_from_timestamp(0)
elif description.last_reset == LAST_RESET_UPTIME:
self._attr_last_reset = (
dt.utcnow() - timedelta(seconds=wrapper.device.status["uptime"])
).replace(second=0, microsecond=0)

@property
def native_value(self) -> StateType:
"""Return value of sensor."""
if (
self.description.last_reset == LAST_RESET_UPTIME
and self.attribute_value is not None
):
value = cast(float, self.attribute_value)

if self._last_value and self._last_value > value:
self._attr_last_reset = dt.utcnow().replace(second=0, microsecond=0)
_LOGGER.info("Energy reset detected for entity %s", self.name)

self._last_value = value

return self.attribute_value

@property
Expand Down

0 comments on commit dcb2a21

Please sign in to comment.