From faa05cff51e50329af6889974e64b2fbc461a672 Mon Sep 17 00:00:00 2001 From: Oliver Lillie Date: Mon, 24 Aug 2026 22:26:11 +0300 Subject: [PATCH 1/3] fix(entities): run timer callbacks on the event loop to avoid thread-unsafe writes _on_time_interval (binary_sensor), _handle_scan_tick and _start (sensor) were registered with async_track_time_interval / async_call_later as plain functions, so HA ran them in a worker thread. Calling async_write_ha_state() and async_create_task() from a non-loop thread raises a non-thread-safe RuntimeError on recent HA cores (previously only a warning), crashing the update. Marking them @callback makes HA run them on the event loop. Companion to #11, which fixed the same class of bug in _handle_time_interval. Also bumps manifest version 0.5.1 -> 0.6.1. Co-Authored-By: Claude Opus 4.8 --- custom_components/hass_datapoints/binary_sensor.py | 3 ++- custom_components/hass_datapoints/manifest.json | 2 +- custom_components/hass_datapoints/sensor.py | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/custom_components/hass_datapoints/binary_sensor.py b/custom_components/hass_datapoints/binary_sensor.py index fae1451..f787e00 100644 --- a/custom_components/hass_datapoints/binary_sensor.py +++ b/custom_components/hass_datapoints/binary_sensor.py @@ -7,7 +7,7 @@ from homeassistant.components.binary_sensor import BinarySensorEntity from homeassistant.config_entries import ConfigEntry -from homeassistant.core import HomeAssistant +from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.event import async_track_time_interval @@ -123,6 +123,7 @@ def _cleanup(self) -> None: def _on_store_update(self) -> None: self.async_write_ha_state() + @callback def _on_time_interval(self, now: datetime) -> None: self.async_write_ha_state() diff --git a/custom_components/hass_datapoints/manifest.json b/custom_components/hass_datapoints/manifest.json index 8b2dc47..d1be9d2 100644 --- a/custom_components/hass_datapoints/manifest.json +++ b/custom_components/hass_datapoints/manifest.json @@ -8,5 +8,5 @@ "iot_class": "local_push", "issue_tracker": "https://github.com/buggedcom/hass-datapoints/issues", "requirements": [], - "version": "0.5.1" + "version": "0.6.1" } diff --git a/custom_components/hass_datapoints/sensor.py b/custom_components/hass_datapoints/sensor.py index 636a132..c3b33c0 100644 --- a/custom_components/hass_datapoints/sensor.py +++ b/custom_components/hass_datapoints/sensor.py @@ -651,6 +651,7 @@ def _schedule_timer(self) -> None: except ValueError: stagger_secs = 0 + @callback def _start(_now: Any = None) -> None: self._unsub_stagger = None # stagger has fired; clear reference self._unsub_timer = async_track_time_interval( @@ -665,6 +666,7 @@ def _start(_now: Any = None) -> None: lambda: self._unsub_stagger and self._unsub_stagger() # type: ignore[func-returns-value] ) + @callback def _handle_scan_tick(self, now: datetime) -> None: """Trigger a scan on the next event loop iteration.""" coroutine = self._run_scan() From f2899681950dc13fa5002b4cc94d424d2ee9f5c2 Mon Sep 17 00:00:00 2001 From: Oliver Lillie Date: Mon, 24 Aug 2026 22:28:35 +0300 Subject: [PATCH 2/3] style(sensor): strip trailing whitespace on blank line Blank line at sensor.py:147 carried trailing whitespace introduced in #11, which failed `ruff format --check` / `ruff check` in CI. Removing it makes Lint / Python green. Co-Authored-By: Claude Opus 4.8 --- custom_components/hass_datapoints/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/hass_datapoints/sensor.py b/custom_components/hass_datapoints/sensor.py index c3b33c0..94b340c 100644 --- a/custom_components/hass_datapoints/sensor.py +++ b/custom_components/hass_datapoints/sensor.py @@ -144,7 +144,7 @@ async def async_added_to_hass(self) -> None: self._hass, self._handle_time_interval, _UPDATE_INTERVAL ) ) - + @callback def _handle_time_interval(self, now: datetime) -> None: """Refresh state on every timer tick.""" From 8ebad4eef4611209d9a727ed04e124c03d902d4e Mon Sep 17 00:00:00 2001 From: Oliver Lillie Date: Mon, 24 Aug 2026 22:34:16 +0300 Subject: [PATCH 3/3] chore(release): sync built bundle and package.json to 0.6.1 scripts/build.sh injects manifest.json's version into the bundle banner, so bumping the manifest to 0.6.1 left the committed hass-datapoints-cards.js stale (v0.5.1), failing the "Check built JS is up-to-date" CI job. Regenerate the version token to v0.6.1 and align package.json to match the release. Co-Authored-By: Claude Opus 4.8 --- custom_components/hass_datapoints/hass-datapoints-cards.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/custom_components/hass_datapoints/hass-datapoints-cards.js b/custom_components/hass_datapoints/hass-datapoints-cards.js index 40b7404..0a64093 100644 --- a/custom_components/hass_datapoints/hass-datapoints-cards.js +++ b/custom_components/hass_datapoints/hass-datapoints-cards.js @@ -42238,7 +42238,7 @@ ].forEach((card) => { if (!registeredTypes.has(card.type)) window.customCards?.push(card); }); - console.groupCollapsed(`%c hass-datapoints %c v0.5.1 loaded `, "color:#fff;background:#03a9f4;font-weight:bold;padding:2px 6px;border-radius:3px 0 0 3px", "color:#03a9f4;background:#fff;font-weight:bold;padding:2px 6px;border:1px solid #03a9f4;border-radius:0 3px 3px 0", ...[]); + console.groupCollapsed(`%c hass-datapoints %c v0.6.1 loaded `, "color:#fff;background:#03a9f4;font-weight:bold;padding:2px 6px;border-radius:3px 0 0 3px", "color:#03a9f4;background:#fff;font-weight:bold;padding:2px 6px;border:1px solid #03a9f4;border-radius:0 3px 3px 0", ...[]); console.log("Enable debug logging by setting %cwindow.__HASS_DATAPOINTS_DEV__ = true", "color:#333;background:#eee;border:1px solid #777;padding:2px 6px;border-radius:5px; font-family: Courier"); console.groupEnd(); //#endregion diff --git a/package.json b/package.json index 8309daa..b2cbf4f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hass-datapoints", - "version": "0.5.1", + "version": "0.6.1", "private": true, "description": "Build and development entrypoints for the hass-datapoints Home Assistant integration.", "packageManager": "pnpm@10.33.0",