Fix Hikvision thread safety issue when calling async_write_ha_state (#160027)

This commit is contained in:
Paul Tarjan
2025-12-31 04:52:41 -10:00
committed by Franck Nijhof
parent cbfbfbee13
commit 65a259b9df
2 changed files with 11 additions and 4 deletions

View File

@@ -24,7 +24,7 @@ from homeassistant.const import (
CONF_SSL,
CONF_USERNAME,
)
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant, callback
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant
from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers import config_validation as cv, issue_registry as ir
from homeassistant.helpers.device_registry import DeviceInfo
@@ -227,7 +227,10 @@ class HikvisionBinarySensor(BinarySensorEntity):
# Register callback with pyhik
self._camera.add_update_callback(self._update_callback, self._callback_id)
@callback
def _update_callback(self, msg: str) -> None:
"""Update the sensor's state when callback is triggered."""
self.async_write_ha_state()
"""Update the sensor's state when callback is triggered.
This is called from pyhik's event stream thread, so we use
schedule_update_ha_state which is thread-safe.
"""
self.schedule_update_ha_state()

View File

@@ -294,6 +294,10 @@ async def test_binary_sensor_update_callback(
callback_func = add_callback_call[0][0]
callback_func("motion detected")
# Wait for the event loop to process the scheduled state update
# (callback uses call_soon_threadsafe to schedule update in event loop)
await hass.async_block_till_done()
# Verify state was updated
state = hass.states.get("binary_sensor.front_camera_motion")
assert state is not None