Ignore utility_meter restore state if state is invalid (#57010)

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
This commit is contained in:
Diogo Gomes
2021-10-04 05:59:36 +01:00
committed by GitHub
parent 255ffe801b
commit 79b10c43d8

View File

@@ -1,5 +1,6 @@
"""Utility meter from sensors providing raw data.""" """Utility meter from sensors providing raw data."""
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
import decimal
from decimal import Decimal, DecimalException from decimal import Decimal, DecimalException
import logging import logging
@@ -323,19 +324,29 @@ class UtilityMeterSensor(RestoreEntity, SensorEntity):
state = await self.async_get_last_state() state = await self.async_get_last_state()
if state: if state:
self._state = Decimal(state.state) try:
self._unit_of_measurement = state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) self._state = Decimal(state.state)
self._last_period = ( except decimal.InvalidOperation:
float(state.attributes.get(ATTR_LAST_PERIOD)) _LOGGER.error(
if state.attributes.get(ATTR_LAST_PERIOD) "Could not restore state <%s>. Resetting utility_meter.%s",
else 0 state.state,
) self.name,
self._last_reset = dt_util.as_utc( )
dt_util.parse_datetime(state.attributes.get(ATTR_LAST_RESET)) else:
) self._unit_of_measurement = state.attributes.get(
if state.attributes.get(ATTR_STATUS) == COLLECTING: ATTR_UNIT_OF_MEASUREMENT
# Fake cancellation function to init the meter in similar state )
self._collecting = lambda: None self._last_period = (
float(state.attributes.get(ATTR_LAST_PERIOD))
if state.attributes.get(ATTR_LAST_PERIOD)
else 0
)
self._last_reset = dt_util.as_utc(
dt_util.parse_datetime(state.attributes.get(ATTR_LAST_RESET))
)
if state.attributes.get(ATTR_STATUS) == COLLECTING:
# Fake cancellation function to init the meter in similar state
self._collecting = lambda: None
@callback @callback
def async_source_tracking(event): def async_source_tracking(event):