Fix Teslemetry streaming binary sensors restoring unknown as off (#183451)

This commit is contained in:
Brett Adams
2026-09-29 09:18:42 +02:00
committed by GitHub
parent 58ef7cef4e
commit 813bf055ab
2 changed files with 39 additions and 16 deletions
@@ -12,7 +12,7 @@ from homeassistant.components.binary_sensor import (
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.const import STATE_ON, EntityCategory, Platform
from homeassistant.const import STATE_OFF, STATE_ON, EntityCategory, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.restore_state import RestoreEntity
@@ -644,7 +644,10 @@ class TeslemetryVehicleStreamingBinarySensorEntity(
"""Handle entity which will be added."""
await super().async_added_to_hass()
if (state := await self.async_get_last_state()) is not None:
self._attr_is_on = state.state == STATE_ON
if state.state == STATE_ON:
self._attr_is_on = True
elif state.state == STATE_OFF:
self._attr_is_on = False
assert self.entity_description.streaming_listener
self.async_on_remove(
@@ -8,14 +8,14 @@ from syrupy.assertion import SnapshotAssertion
from teslemetry_stream import Signal
from homeassistant.components.teslemetry.coordinator import VEHICLE_INTERVAL
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN, Platform
from homeassistant.core import HomeAssistant, State
from homeassistant.helpers import entity_registry as er
from . import assert_entities, assert_entities_alt, setup_platform
from .const import VEHICLE_DATA_ALT
from tests.common import async_fire_time_changed
from tests.common import async_fire_time_changed, mock_restore_cache
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
@@ -76,14 +76,12 @@ async def test_binary_sensors_streaming(
Signal.RD_WINDOW: "WindowStateClosed",
Signal.RP_WINDOW: "WindowStatePartiallyOpen",
Signal.DOOR_STATE: {
"DoorState": {
"DriverFront": True,
"DriverRear": False,
"PassengerFront": False,
"PassengerRear": False,
"TrunkFront": False,
"TrunkRear": False,
}
"DriverFront": True,
"DriverRear": False,
"PassengerFront": False,
"PassengerRear": False,
"TrunkFront": False,
"TrunkRear": False,
},
Signal.DRIVER_SEAT_BELT: None,
Signal.REAR_DEFROST_ENABLED: True,
@@ -99,15 +97,37 @@ async def test_binary_sensors_streaming(
# Assert the entities restored their values with concrete assertions
assert hass.states.get("binary_sensor.test_front_driver_window").state == "on"
assert hass.states.get("binary_sensor.test_front_passenger_window").state == "off"
assert (
hass.states.get("binary_sensor.test_front_passenger_window").state
== STATE_UNKNOWN
)
assert hass.states.get("binary_sensor.test_rear_driver_window").state == "off"
assert hass.states.get("binary_sensor.test_rear_passenger_window").state == "on"
assert hass.states.get("binary_sensor.test_front_driver_door").state == "off"
assert hass.states.get("binary_sensor.test_front_driver_door").state == "on"
assert hass.states.get("binary_sensor.test_front_passenger_door").state == "off"
assert hass.states.get("binary_sensor.test_driver_seat_belt").state == "off"
assert hass.states.get("binary_sensor.test_driver_seat_belt").state == STATE_UNKNOWN
assert hass.states.get("binary_sensor.test_rear_defroster").state == "on"
@pytest.mark.parametrize("restored_state", [STATE_UNKNOWN, STATE_UNAVAILABLE])
@pytest.mark.parametrize(
"entity_id",
["binary_sensor.test_front_driver_window", "binary_sensor.test_charge_cable"],
)
async def test_binary_sensors_streaming_restore_unknown(
hass: HomeAssistant,
entity_id: str,
restored_state: str,
) -> None:
"""Tests that a restored unknown or unavailable state is not restored as off."""
mock_restore_cache(hass, (State(entity_id, restored_state),))
await setup_platform(hass, [Platform.BINARY_SENSOR])
assert hass.states.get(entity_id).state == STATE_UNKNOWN
async def test_binary_sensors_connectivity(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,