BEHAVIOR-003: learn causal shadow triggers
Some checks failed
quality / test (3.11) (push) Has been cancelled
quality / test (3.13) (push) Has been cancelled

This commit is contained in:
2026-06-14 15:35:07 +02:00
parent 1370d02c15
commit fb76d89204
11 changed files with 278 additions and 4 deletions

View File

@@ -1,5 +1,7 @@
from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel
@@ -15,6 +17,7 @@ class HaEntitySummary(BaseModel):
entity_id: str
domain: str
state: str | None = None
last_changed: datetime | None = None
state_class: str | None = None
device_class: str | None = None
unit_of_measurement: str | None = None

View File

@@ -53,6 +53,7 @@ class HaReader:
entity_id=entity_id,
domain=domain,
state=_optional_str(item.get("state")),
last_changed=_optional_datetime(item.get("last_changed")),
state_class=_optional_str(attributes.get("state_class")),
device_class=_optional_str(attributes.get("device_class")),
unit_of_measurement=_optional_str(attributes.get("unit_of_measurement")),
@@ -116,3 +117,13 @@ def _optional_str(value: object) -> str | None:
if value is None or value == "":
return None
return str(value)
def _optional_datetime(value: object) -> datetime | None:
if not isinstance(value, str) or not value:
return None
try:
parsed = datetime.fromisoformat(value.replace("Z", "+00:00"))
except ValueError:
return None
return parsed if parsed.tzinfo is not None else None