Fix utility_meter on DST changes (#129862)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>pull/130164/head
parent
a7be76ba0a
commit
e4aaaf10c3
|
@ -8,5 +8,5 @@
|
|||
"iot_class": "local_push",
|
||||
"loggers": ["croniter"],
|
||||
"quality_scale": "internal",
|
||||
"requirements": ["croniter==2.0.2"]
|
||||
"requirements": ["cronsim==2.6"]
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ from decimal import Decimal, DecimalException, InvalidOperation
|
|||
import logging
|
||||
from typing import Any, Self
|
||||
|
||||
from croniter import croniter
|
||||
from cronsim import CronSim
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.sensor import (
|
||||
|
@ -405,6 +405,16 @@ class UtilityMeterSensor(RestoreSensor):
|
|||
self._tariff = tariff
|
||||
self._tariff_entity = tariff_entity
|
||||
self._next_reset = None
|
||||
self.scheduler = (
|
||||
CronSim(
|
||||
self._cron_pattern,
|
||||
dt_util.now(
|
||||
dt_util.get_default_time_zone()
|
||||
), # we need timezone for DST purposes (see issue #102984)
|
||||
)
|
||||
if self._cron_pattern
|
||||
else None
|
||||
)
|
||||
|
||||
def start(self, attributes: Mapping[str, Any]) -> None:
|
||||
"""Initialize unit and state upon source initial update."""
|
||||
|
@ -543,11 +553,10 @@ class UtilityMeterSensor(RestoreSensor):
|
|||
|
||||
async def _program_reset(self):
|
||||
"""Program the reset of the utility meter."""
|
||||
if self._cron_pattern is not None:
|
||||
tz = dt_util.get_default_time_zone()
|
||||
self._next_reset = croniter(self._cron_pattern, dt_util.now(tz)).get_next(
|
||||
datetime
|
||||
) # we need timezone for DST purposes (see issue #102984)
|
||||
if self.scheduler:
|
||||
self._next_reset = next(self.scheduler)
|
||||
|
||||
_LOGGER.debug("Next reset of %s is %s", self.entity_id, self._next_reset)
|
||||
self.async_on_remove(
|
||||
async_track_point_in_time(
|
||||
self.hass,
|
||||
|
|
|
@ -702,7 +702,7 @@ connect-box==0.3.1
|
|||
construct==2.10.68
|
||||
|
||||
# homeassistant.components.utility_meter
|
||||
croniter==2.0.2
|
||||
cronsim==2.6
|
||||
|
||||
# homeassistant.components.crownstone
|
||||
crownstone-cloud==1.4.11
|
||||
|
|
|
@ -598,7 +598,7 @@ colorthief==0.2.1
|
|||
construct==2.10.68
|
||||
|
||||
# homeassistant.components.utility_meter
|
||||
croniter==2.0.2
|
||||
cronsim==2.6
|
||||
|
||||
# homeassistant.components.crownstone
|
||||
crownstone-cloud==1.4.11
|
||||
|
|
|
@ -1804,6 +1804,26 @@ async def test_self_reset_hourly_dst(hass: HomeAssistant) -> None:
|
|||
)
|
||||
|
||||
|
||||
async def test_self_reset_hourly_dst2(hass: HomeAssistant) -> None:
|
||||
"""Test weekly reset of meter in DST change conditions."""
|
||||
|
||||
hass.config.time_zone = "Europe/Berlin"
|
||||
dt_util.set_default_time_zone(dt_util.get_time_zone(hass.config.time_zone))
|
||||
await _test_self_reset(
|
||||
hass, gen_config("daily"), "2024-10-26T23:59:00.000000+02:00"
|
||||
)
|
||||
|
||||
state = hass.states.get("sensor.energy_bill")
|
||||
last_reset = dt_util.parse_datetime("2024-10-27T00:00:00.000000+02:00")
|
||||
assert (
|
||||
dt_util.as_local(dt_util.parse_datetime(state.attributes.get("last_reset")))
|
||||
== last_reset
|
||||
)
|
||||
|
||||
next_reset = dt_util.parse_datetime("2024-10-28T00:00:00.000000+01:00").isoformat()
|
||||
assert state.attributes.get("next_reset") == next_reset
|
||||
|
||||
|
||||
async def test_self_reset_daily(hass: HomeAssistant) -> None:
|
||||
"""Test daily reset of meter."""
|
||||
await _test_self_reset(
|
||||
|
|
Loading…
Reference in New Issue