From d7992c1e870495b0b41581e74b49450c77e8b1eb Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Sun, 3 Apr 2022 13:15:22 +0200 Subject: [PATCH] Unsubscribe listeners when entity meter sensor is removed (#69172) --- .../components/utility_meter/sensor.py | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/utility_meter/sensor.py b/homeassistant/components/utility_meter/sensor.py index 8df009a2a04..1631b0431ac 100644 --- a/homeassistant/components/utility_meter/sensor.py +++ b/homeassistant/components/utility_meter/sensor.py @@ -352,10 +352,12 @@ class UtilityMeterSensor(RestoreEntity, SensorEntity): async def _async_reset_meter(self, event): """Determine cycle - Helper function for larger than daily cycles.""" if self._cron_pattern is not None: - async_track_point_in_time( - self.hass, - self._async_reset_meter, - croniter(self._cron_pattern, dt_util.now()).get_next(datetime), + self.async_on_remove( + async_track_point_in_time( + self.hass, + self._async_reset_meter, + croniter(self._cron_pattern, dt_util.now()).get_next(datetime), + ) ) await self.async_reset_meter(self._tariff_entity) @@ -380,13 +382,19 @@ class UtilityMeterSensor(RestoreEntity, SensorEntity): await super().async_added_to_hass() if self._cron_pattern is not None: - async_track_point_in_time( - self.hass, - self._async_reset_meter, - croniter(self._cron_pattern, dt_util.now()).get_next(datetime), + self.async_on_remove( + async_track_point_in_time( + self.hass, + self._async_reset_meter, + croniter(self._cron_pattern, dt_util.now()).get_next(datetime), + ) ) - async_dispatcher_connect(self.hass, SIGNAL_RESET_METER, self.async_reset_meter) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_RESET_METER, self.async_reset_meter + ) + ) if state := await self.async_get_last_state(): try: @@ -421,8 +429,10 @@ class UtilityMeterSensor(RestoreEntity, SensorEntity): _LOGGER.debug( "<%s> tracks utility meter %s", self.name, self._tariff_entity ) - async_track_state_change_event( - self.hass, [self._tariff_entity], self.async_tariff_change + self.async_on_remove( + async_track_state_change_event( + self.hass, [self._tariff_entity], self.async_tariff_change + ) ) tariff_entity_state = self.hass.states.get(self._tariff_entity) @@ -443,7 +453,13 @@ class UtilityMeterSensor(RestoreEntity, SensorEntity): self.hass, [self._sensor_source_id], self.async_reading ) - async_at_start(self.hass, async_source_tracking) + self.async_on_remove(async_at_start(self.hass, async_source_tracking)) + + async def async_will_remove_from_hass(self) -> None: + """Run when entity will be removed from hass.""" + if self._collecting: + self._collecting() + self._collecting = None @property def name(self):