From e53227be7992b7828e445011432a89802093d6d6 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 8 Feb 2022 00:47:23 +0100 Subject: [PATCH] Fix race in MQTT sensor and binary_sensor expire_after (#66040) --- homeassistant/components/mqtt/binary_sensor.py | 5 ++++- homeassistant/components/mqtt/sensor.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/mqtt/binary_sensor.py b/homeassistant/components/mqtt/binary_sensor.py index e26fe0b0259..aad73cd9f1a 100644 --- a/homeassistant/components/mqtt/binary_sensor.py +++ b/homeassistant/components/mqtt/binary_sensor.py @@ -133,6 +133,10 @@ class MqttBinarySensor(MqttEntity, BinarySensorEntity, RestoreEntity): self._expired = False self._state = last_state.state + if self._expiration_trigger: + # We might have set up a trigger already after subscribing from + # super().async_added_to_hass() + self._expiration_trigger() self._expiration_trigger = async_track_point_in_utc_time( self.hass, self._value_is_expired, expiration_at ) @@ -189,7 +193,6 @@ class MqttBinarySensor(MqttEntity, BinarySensorEntity, RestoreEntity): # Reset old trigger if self._expiration_trigger: self._expiration_trigger() - self._expiration_trigger = None # Set new trigger expiration_at = dt_util.utcnow() + timedelta(seconds=expire_after) diff --git a/homeassistant/components/mqtt/sensor.py b/homeassistant/components/mqtt/sensor.py index fa949009a0d..6dddf496e02 100644 --- a/homeassistant/components/mqtt/sensor.py +++ b/homeassistant/components/mqtt/sensor.py @@ -180,6 +180,10 @@ class MqttSensor(MqttEntity, SensorEntity, RestoreEntity): self._expired = False self._state = last_state.state + if self._expiration_trigger: + # We might have set up a trigger already after subscribing from + # super().async_added_to_hass() + self._expiration_trigger() self._expiration_trigger = async_track_point_in_utc_time( self.hass, self._value_is_expired, expiration_at ) @@ -227,7 +231,6 @@ class MqttSensor(MqttEntity, SensorEntity, RestoreEntity): # Reset old trigger if self._expiration_trigger: self._expiration_trigger() - self._expiration_trigger = None # Set new trigger expiration_at = dt_util.utcnow() + timedelta(seconds=expire_after)