From 813bf055ab02390dd3cc1754ef030a5d7241226f Mon Sep 17 00:00:00 2001 From: Brett Adams Date: Tue, 29 Sep 2026 17:18:42 +1000 Subject: [PATCH] Fix Teslemetry streaming binary sensors restoring unknown as off (#183451) --- .../components/teslemetry/binary_sensor.py | 7 ++- .../teslemetry/test_binary_sensor.py | 48 +++++++++++++------ 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/teslemetry/binary_sensor.py b/homeassistant/components/teslemetry/binary_sensor.py index 2761bae6d1b2..ba18040ffa55 100644 --- a/homeassistant/components/teslemetry/binary_sensor.py +++ b/homeassistant/components/teslemetry/binary_sensor.py @@ -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( diff --git a/tests/components/teslemetry/test_binary_sensor.py b/tests/components/teslemetry/test_binary_sensor.py index 1f13871be3a7..0033a4617ec8 100644 --- a/tests/components/teslemetry/test_binary_sensor.py +++ b/tests/components/teslemetry/test_binary_sensor.py @@ -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,