From 23af597701476da8bc14c143ef3ed8a823ac924d Mon Sep 17 00:00:00 2001 From: hbrain Date: Thu, 25 Jun 2026 11:28:59 +0000 Subject: [PATCH] Calendar filtered --- ha_observer.py | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/ha_observer.py b/ha_observer.py index 693d291..3140687 100755 --- a/ha_observer.py +++ b/ha_observer.py @@ -529,13 +529,18 @@ def summarize_snapshot(snapshot: dict[str, Any]) -> str: snapshot.get("states", []), key=lambda state: (-entity_importance(state.get("entity_id", ""), state.get("attributes", {})), state.get("entity_id", "")), ) + calendar_events = snapshot.get("calendar_events", []) + calendar_entity_ids_with_events = {calendar.get("entity_id") for calendar in calendar_events if calendar.get("events")} for state in states: + entity_id = state.get("entity_id", "") + if entity_id.startswith("calendar.") and entity_id not in calendar_entity_ids_with_events: + continue attrs = state.get("attributes", {}) - name = attrs.get("friendly_name", state.get("entity_id")) + name = attrs.get("friendly_name", entity_id) unit = attrs.get("unit_of_measurement", "") value = f"{state.get('state')} {unit}".strip() - score = entity_importance(state.get("entity_id", ""), attrs) - lines.append(f"- importance={score} {name} ({state.get('entity_id')}): {value}; last_changed={display_time(state.get('last_changed'))}") + score = entity_importance(entity_id, attrs) + lines.append(f"- importance={score} {name} ({entity_id}): {value}; last_changed={display_time(state.get('last_changed'))}") forecast = snapshot.get("weather_forecast") or {} if forecast: lines.append("Direct weather forecast:") @@ -557,26 +562,30 @@ def summarize_snapshot(snapshot: dict[str, Any]) -> str: f"wind_max={day.get('wind_speed_max_kmh')}km/h; gusts={day.get('wind_gusts_max_kmh')}km/h; " f"sunrise={day.get('sunrise')}; sunset={day.get('sunset')}" ) - lines.append("Upcoming calendar events:") - for calendar in snapshot.get("calendar_events", []): - lines.append(f"- {calendar.get('entity_id')}:") - for event in calendar.get("events", []): - details = [] - if event.get("location"): - details.append(f"location={event.get('location')}") - if event.get("description"): - details.append(f"description={event.get('description')}") - detail_text = f"; {'; '.join(details)}" if details else "" - lines.append(f" - {event.get('start')} to {event.get('end')}: {event.get('summary')}{detail_text}") + if calendar_events: + lines.append("Upcoming calendar appointments:") + for calendar in calendar_events: + lines.append(f"- {calendar.get('entity_id')}:") + for event in calendar.get("events", []): + details = [] + if event.get("location"): + details.append(f"location={event.get('location')}") + if event.get("description"): + details.append(f"description={event.get('description')}") + detail_text = f"; {'; '.join(details)}" if details else "" + lines.append(f" - {event.get('start')} to {event.get('end')}: {event.get('summary')}{detail_text}") lines.append("Recently changed entities:") history = sorted( snapshot.get("history", []), key=lambda item: (-entity_importance(item.get("entity_id", "")), item.get("entity_id", "")), ) for item in history: + entity_id = item.get("entity_id", "") + if entity_id.startswith("calendar.") and entity_id not in calendar_entity_ids_with_events: + continue transitions = ", ".join(f"{x.get('state')} @ {display_time(x.get('last_changed'))}" for x in item.get("recent_states", [])[-8:]) - score = entity_importance(item.get("entity_id", "")) - lines.append(f"- importance={score} {item.get('entity_id')}: {transitions}") + score = entity_importance(entity_id) + lines.append(f"- importance={score} {entity_id}: {transitions}") return "\n".join(lines) @@ -668,6 +677,7 @@ short paragraphs, and readable bullet lists. Remain factual and privacy-aware. I - Suggested Home Assistant automations or fixes Distinguish strong evidence from guesses. Do not invent facts not supported by the data. +Mention calendar/appointment analysis only when the data contains upcoming calendar appointments; do not comment on empty calendars or calendar state noise. {extra_block}{previous_block} TODAY'S DATA: {input_summary}