diff --git a/CHANGELOG.md b/CHANGELOG.md index f8b9f12..d53b212 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.7.7 - 2026-06-15 +- WebSocket-State-Changes lesen jetzt das echte Home-Assistant-Eventformat + (`event.data.entity_id`), damit Kontextwechsel wie Türsensoren sofort + Vorhersagen und Schaltungen auslösen statt erst beim nächsten Statusabruf + ## 0.7.6 - 2026-06-14 - Kontextvorschläge blenden zusätzlich Batterie-, Status-, Node-, Last-Seen- und Basic-Entities aus, sofern sie nicht bewusst manuell ausgewählt wurden diff --git a/addon/config.yaml b/addon/config.yaml index d477852..f8b6d49 100644 --- a/addon/config.yaml +++ b/addon/config.yaml @@ -1,5 +1,5 @@ name: SillyHome Next -version: "0.7.6" +version: "0.7.7" slug: sillyhome_next description: Lernt automatisch aus deinem Verhalten und steuert freigegebene Aktoren url: http://192.168.6.31:3000/pino/sillyhome-next diff --git a/app/main.py b/app/main.py index 864c0e9..6fd94a3 100644 --- a/app/main.py +++ b/app/main.py @@ -100,7 +100,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: app = FastAPI( title="SillyHome Next API", description="Lokales Smart-Home-Intelligenzsystem für Home Assistant.", - version="0.7.6", + version="0.7.7", lifespan=lifespan, ) app.state.settings = load_settings() @@ -213,12 +213,20 @@ async def _ha_event_listener(app: FastAPI, client: HaClient) -> None: event = data.get("event", {}) if event.get("event_type") != "state_changed": continue - entity_id = event.get("entity_id") + event_data = event.get("data", {}) + if not isinstance(event_data, dict): + logger.warning("State-Changed-Event ohne gültige Daten empfangen") + continue + entity_id = event_data.get("entity_id") if not entity_id: continue # Prüfe, ob Entity ein Aktor oder relevanter Kontext ist # Sofortige Vorhersage für betroffene Aktoren auslösen - await asyncio.to_thread(engine.handle_state_change, entity_id, event.get("new_state")) + await asyncio.to_thread( + engine.handle_state_change, + entity_id, + event_data.get("new_state"), + ) except json.JSONDecodeError: logger.warning("Ungültige JSON-Nachricht von HA-WebSocket") except Exception as exc: diff --git a/pyproject.toml b/pyproject.toml index 119c831..d5c8fbe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "sillyhome-next" -version = "0.7.6" +version = "0.7.7" description = "Lokales Smart-Home-Intelligenzsystem für Home Assistant" requires-python = ">=3.11" dependencies = [ diff --git a/tests/actuators/test_lifecycle.py b/tests/actuators/test_lifecycle.py index 0e03eb3..14743c9 100644 --- a/tests/actuators/test_lifecycle.py +++ b/tests/actuators/test_lifecycle.py @@ -78,7 +78,7 @@ def _service( model_store=str(tmp_path / "models"), automation_store=str(tmp_path / "automations"), actuator_store=str(tmp_path / "actuators"), - history_days=14, + history_days=31, min_training_points=5, retrain_stale_hours=24, reconcile_interval_seconds=900, diff --git a/tests/test_main.py b/tests/test_main.py index 8341ffb..e5ac343 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -55,7 +55,7 @@ def test_ha_event_listener_processes_state_change(tmp_path: Path) -> None: '{"type":"auth_ok"}', ( '{"type":"event","event":{"event_type":"state_changed",' - '"entity_id":"light.test","new_state":{"state":"on"}}}' + '"data":{"entity_id":"light.test","new_state":{"state":"on"}}}}' ), asyncio.CancelledError(), ]