diff --git a/config/.HA_VERSION b/config/.HA_VERSION index 7675d388..0e459405 100755 --- a/config/.HA_VERSION +++ b/config/.HA_VERSION @@ -1 +1 @@ -2026.3.2 \ No newline at end of file +2026.3.4 \ No newline at end of file diff --git a/config/packages/README.md b/config/packages/README.md index 15d3f1b8..01c956ab 100755 --- a/config/packages/README.md +++ b/config/packages/README.md @@ -51,7 +51,7 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this | [onenote_indexer.yaml](onenote_indexer.yaml) | OneNote indexer health/status monitoring for Joanna, failure-repair automation, and a daily duplicate-delete maintenance request. | `sensor.onenote_indexer_last_job_status`, `binary_sensor.onenote_indexer_last_job_successful` | | [mqtt_status.yaml](mqtt_status.yaml) | Command-line MQTT broker reachability probe with Spook Repairs escalation and Joanna troubleshooting dispatch on outage. | `binary_sensor.mqtt_status_raw`, `binary_sensor.mqtt_broker_problem`, `repairs.create`, `rest_command.bearclaw_command` | | [mariadb.yaml](mariadb.yaml) | MariaDB recorder health and capacity SQL sensors. | `sensor.mariadb_status`, `sensor.database_size` | -| [tugtainer_updates.yaml](tugtainer_updates.yaml) | Tugtainer container update notifications via webhook + persistent alerts, event-based Joanna dispatch for `### Available:` updates (24h cooldown), and Home Assistant core post-update digest dispatch that derives `core-YYYY.M` changelog URLs and requests GitHub Update Digest issue refresh/create. | `persistent_notification.create`, `event: tugtainer_available_detected`, `event: tugtainer_home_assistant_core_updated`, `script.joanna_dispatch`, `input_datetime.tugtainer_last_update` | +| [tugtainer_updates.yaml](tugtainer_updates.yaml) | Tugtainer container update notifications via webhook + persistent alerts, plus event-based Joanna dispatch when reports include `### Available:` (24h cooldown via `mode: single` + delay, no new helpers). | `persistent_notification.create`, `event: tugtainer_available_detected`, `script.joanna_dispatch`, `input_datetime.tugtainer_last_update` | | [bearclaw.yaml](bearclaw.yaml) | Joanna/BearClaw bridge automations that forward Telegram commands to codex_appliance, include LLM-first routing context for freeform text, relay replies back, ingest `/api/bearclaw/status` telemetry, and expose dispatch KPI sensors for Infrastructure dashboards. | `rest_command.bearclaw_*`, `sensor.bearclaw_status_telemetry`, `sensor.joanna_*`, `automation.bearclaw_*`, `script.send_to_logbook` | | [telegram_bot.yaml](telegram_bot.yaml) | Telegram script wrappers used by BearClaw and other ops flows (UI integration remains the source for bot config). | `script.joanna_send_telegram`, `telegram_bot.send_message` | | [phynplus.yaml](phynplus.yaml) | Phyn shutoff automations with push + Activity feed + Repairs issues for leak events. | `valve.phyn_shutoff_valve`, `binary_sensor.phyn_leak_test_running`, `repairs.create` | diff --git a/config/packages/august.yaml b/config/packages/august.yaml index 99763dc1..130c6ed4 100755 --- a/config/packages/august.yaml +++ b/config/packages/august.yaml @@ -38,7 +38,7 @@ automation: trigger: - platform: numeric_state entity_id: sensor.front_door_battery - below: 25 + below: 20 action: - service: script.notify_engine @@ -51,24 +51,3 @@ automation: topic: "BATTERY" message: "August Door lock battery low: {{ states('sensor.front_door_battery') }}%" - # - alias: 'FrontDoor Bell Camera on Front Door Lock' - # id: Doorbell_camera_front_door - # mode: single - # trigger: - # - platform: state - # entity_id: lock.front_door - # to: 'unlocked' - # action: - # - service: media_player.play_media - # target: - # entity_id: media_player.kitchen - # data: - # media_content_id: 'show front doorbell camera' - # media_content_type: custom - # - delay: '00:20:00' - # - service: media_player.play_media - # target: - # entity_id: media_player.kitchen - # data: - # media_content_id: 'hide front doorbell camera' - # media_content_type: custom diff --git a/config/packages/bearclaw.yaml b/config/packages/bearclaw.yaml index c9654070..6f8bd81d 100644 --- a/config/packages/bearclaw.yaml +++ b/config/packages/bearclaw.yaml @@ -14,6 +14,7 @@ # Notes: Inbound Telegram handling enforces user_id + chat_id allowlists from secrets CSV values. # Notes: Reply webhook writes JOANNA activity entries to logbook for traceability. # Notes: Status telemetry polling expects !secret bearclaw_status_url (token header stays !secret bearclaw_token). +# Notes: Telegram freeform input now includes LLM-first routing context to improve intent understanding before entity lookups. # Notes: Blog: https://www.vcloudinfo.com/2026/03/joanna-dispatch-telemetry-home-assistant-infrastructure-dashboard/ ###################################################################### @@ -341,7 +342,7 @@ automation: - id: bearclaw_telegram_text_no_slash_needed alias: BearClaw Telegram Text No Slash Needed - description: Treats plain Telegram text as BearClaw command input. + description: Treats plain Telegram text as BearClaw command input and forwards LLM-first routing context. mode: queued trigger: - platform: event @@ -363,12 +364,36 @@ automation: action: - variables: plain_text: "{{ trigger.event.data.text | default('') | trim }}" + plain_text_lower: "{{ plain_text | lower }}" from_user: "{{ (trigger.event.data.from_first | default('carlo')) | lower }}" + command_like_request: >- + {% set action_verbs = ['disable', 'enable', 'turn off', 'turn on', 'stop', 'start', 'restart', 'review', 'fix', 'change', 'update', 'set', 'open', 'close'] %} + {{ action_verbs | select('in', plain_text_lower) | list | count > 0 }} + status_like_request: >- + {{ (plain_text_lower.startswith('is ') + or plain_text_lower.startswith('are ') + or plain_text_lower.startswith('what is ') + or plain_text_lower.startswith("what's ") + or ' status' in plain_text_lower + or plain_text_lower.startswith('status ')) + and not command_like_request }} + llm_route_hint: >- + {% if command_like_request %} + llm_first_action + {% elif status_like_request %} + llm_first_status + {% else %} + llm_first_general + {% endif %} + llm_context: >- + telegram_freeform route={{ llm_route_hint | trim }}. + Prefer LLM intent interpretation and clarification for action or automation requests before returning entity status. - service: rest_command.bearclaw_command data: text: "{{ plain_text }}" user: "{{ from_user }}" source: telegram_text + context: "{{ llm_context | trim }}" - id: bearclaw_reply_webhook alias: BearClaw Reply Webhook diff --git a/config/packages/docker_infrastructure.yaml b/config/packages/docker_infrastructure.yaml index b3383e94..608939d7 100644 --- a/config/packages/docker_infrastructure.yaml +++ b/config/packages/docker_infrastructure.yaml @@ -72,53 +72,115 @@ switch: name: Docker Monitored Containers unique_id: docker_monitored_containers entities: + - switch.3a446393a8c5_dozzle_container + - switch.5b3503372936_wordpress_db_container + - switch.7a83770eb321_rc_price_checker_container + - switch.91aca40203c0_portainer_agent_container - switch.cloudflared_kch_container + - switch.cloudflared_kch_container_2 - switch.cloudflared_wp_container + - switch.cloudflared_wp_container_2 - switch.codex_appliance_container + - switch.codex_appliance_container_2 - switch.college_budget_app_container + - switch.college_budget_app_container_2 - switch.cruise_tracker_container + - switch.cruise_tracker_container_2 - switch.dashy_container + - switch.dashy_container_2 - switch.docker_socket_proxy_container - - switch.dozzle_container + - switch.docker_socket_proxy_container_2 - switch.dozzle_agent_10_container + - switch.dozzle_agent_10_container_2 - switch.dozzle_agent_14_container + - switch.dozzle_agent_14_container_2 - switch.dozzle_agent_17_container + - switch.dozzle_agent_17_container_2 - switch.dozzle_agent_69_container + - switch.dozzle_agent_69_container_2 + - switch.dozzle_container + - switch.dozzle_container_2 - switch.duplicati_container + - switch.duplicati_container_2 - switch.esphome_container + - switch.esphome_container_2 - switch.fed437a0f191_tugtainer_socket_proxy_container - switch.foodie_tracker_container + - switch.foodie_tracker_container_2 - switch.frigate_container + - switch.frigate_container_2 - switch.games_hub_container + - switch.games_hub_container_2 - switch.home_assistant_container + - switch.home_assistant_container_2 - switch.imposter_container + - switch.imposter_container_2 - switch.infra_info_container + - switch.infra_info_container_2 - switch.kingcrafthomes_container + - switch.kingcrafthomes_container_2 - switch.lmediaservices_container - - switch.mariadb_container + - switch.lmediaservices_container_2 - switch.mariadb_backup_container + - switch.mariadb_backup_container_2 + - switch.mariadb_container + - switch.mariadb_container_2 - switch.matter_server_container + - switch.matter_server_container_2 - switch.mqtt_container + - switch.mqtt_container_2 - switch.nebula_sync_container + - switch.nebula_sync_container_2 + - switch.onenote_indexer_container + - switch.onenote_indexer_container_2 + - switch.optimistic_mclaren_container - switch.panel_notes_container + - switch.panel_notes_container_2 - switch.pihole_container + - switch.pihole_container_2 - switch.pihole_secondary_container + - switch.pihole_secondary_container_2 - switch.poker_tracker_container - - switch.portainer_container + - switch.poker_tracker_container_2 + - switch.portainer_agent_69_container - switch.portainer_agent_container + - switch.portainer_agent_container_2 + - switch.portainer_container + - switch.portainer_container_2 - switch.postgres_webhooks_engine_container + - switch.postgres_webhooks_engine_container_2 - switch.rc_price_checker_container + - switch.rc_price_checker_container_2 - switch.redis_webhooks_engine_container + - switch.redis_webhooks_engine_container_2 - switch.rvtools_ppt_web_container + - switch.rvtools_ppt_web_container_2 + - switch.steelesharing_home_container - switch.tapple_container - - switch.tugtainer_container + - switch.tapple_container_2 + - switch.tugtainer_agent_14_container + - switch.tugtainer_agent_17_container + - switch.tugtainer_agent_69_container - switch.tugtainer_agent_container + - switch.tugtainer_agent_container_2 + - switch.tugtainer_container + - switch.tugtainer_container_2 + - switch.tugtainer_socket_proxy_14_container + - switch.tugtainer_socket_proxy_17_container + - switch.tugtainer_socket_proxy_69_container - switch.tugtainer_socket_proxy_container + - switch.tugtainer_socket_proxy_container_2 - switch.unifi_container + - switch.unifi_container_2 - switch.webhooks_engine_container + - switch.webhooks_engine_container_2 - switch.wordpress_db_container + - switch.wordpress_db_container_2 - switch.wordpress_wp_container + - switch.wordpress_wp_container_2 - switch.wyze_bridge_container + - switch.wyze_bridge_container_2 + template: - sensor: diff --git a/config/packages/garadget.yaml b/config/packages/garadget.yaml index 950e3f61..87b4f49e 100755 --- a/config/packages/garadget.yaml +++ b/config/packages/garadget.yaml @@ -241,43 +241,6 @@ automation: topic: "garadget/GLarge/command" payload: "get-status" - - alias: 'Garage Door State Change' - id: afec0987-edb1-4341-a524-a00ae4df9fb7 - mode: restart - trigger: - - platform: state - entity_id: - - cover.large_garage_door - - cover.small_garage_door - from: 'open' - to: 'closed' - for: '00:02:00' - - - platform: state - entity_id: - - cover.large_garage_door - - cover.small_garage_door - from: 'closed' - to: 'open' - for: '00:10:00' - - action: - - choose: - - conditions: "{{ is_state('cover.large_garage_door','closed') }}" - sequence: - - service: script.speech_engine - data: - DoorClosed: "The {{ trigger.entity_id.split('.')[1]|replace('_', ' ') }} is now {{ (trigger.to_state.state)|replace('_', ' ') }}." - call_garage_check: 1 - - delay: "00:10:00" - - default: - - service: script.speech_engine - data: - DoorClosed: "The {{ trigger.entity_id.split('.')[1]|replace('_', ' ') }} is now {{ (trigger.to_state.state)|replace('_', ' ') }}." - call_garage_check: 1 - - ################################### ## Garadget Wind Door Checks - [Garadget](https://amzn.to/2jQLpVQ) ###################################