Fix mqtt sensor or binary_sensor state not saved after expiry (#101670)

Fix mqtt sensor state not saved after expire
This commit is contained in:
Jan Bouwhuis 2023-10-08 20:57:14 +02:00 committed by GitHub
parent 78535b99df
commit db0c5bbbea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 4 deletions

View file

@ -180,7 +180,7 @@ class MqttBinarySensor(MqttEntity, BinarySensorEntity, RestoreEntity):
@callback
@log_messages(self.hass, self.entity_id)
@write_state_on_attr_change(self, {"_attr_is_on"})
@write_state_on_attr_change(self, {"_attr_is_on", "_expired"})
def state_message_received(msg: ReceiveMessage) -> None:
"""Handle a new received MQTT state message."""
# auto-expire enabled?

View file

@ -277,7 +277,9 @@ class MqttSensor(MqttEntity, RestoreSensor):
)
@callback
@write_state_on_attr_change(self, {"_attr_native_value", "_attr_last_reset"})
@write_state_on_attr_change(
self, {"_attr_native_value", "_attr_last_reset", "_expired"}
)
@log_messages(self.hass, self.entity_id)
def message_received(msg: ReceiveMessage) -> None:
"""Handle new MQTT messages."""

View file

@ -123,7 +123,6 @@ async def test_setting_sensor_value_expires_availability_topic(
"name": "test",
"state_topic": "test-topic",
"expire_after": 4,
"force_update": True,
}
}
}
@ -200,6 +199,18 @@ async def expires_helper(hass: HomeAssistant) -> None:
state = hass.states.get("binary_sensor.test")
assert state.state == STATE_UNAVAILABLE
# Send the last message again
# Time jump 0.5s
now += timedelta(seconds=0.5)
freezer.move_to(now)
async_fire_time_changed(hass, now)
async_fire_mqtt_message(hass, "test-topic", "OFF")
await hass.async_block_till_done()
# Value was updated correctly.
state = hass.states.get("binary_sensor.test")
assert state.state == STATE_OFF
async def test_expiration_on_discovery_and_discovery_update_of_binary_sensor(
hass: HomeAssistant,

View file

@ -339,7 +339,6 @@ async def test_setting_sensor_value_expires_availability_topic(
"state_topic": "test-topic",
"unit_of_measurement": "fav unit",
"expire_after": "4",
"force_update": True,
}
}
}
@ -413,6 +412,18 @@ async def expires_helper(hass: HomeAssistant) -> None:
state = hass.states.get("sensor.test")
assert state.state == STATE_UNAVAILABLE
# Send the last message again
# Time jump 0.5s
now += timedelta(seconds=0.5)
freezer.move_to(now)
async_fire_time_changed(hass, now)
async_fire_mqtt_message(hass, "test-topic", "101")
await hass.async_block_till_done()
# Value was updated correctly.
state = hass.states.get("sensor.test")
assert state.state == "101"
@pytest.mark.parametrize(
"hass_config",