From 5964246466a5bcb69372b717fca0428942c935e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Mar 2026 18:52:35 +0000 Subject: [PATCH] Update HA version badge to 2026.3.2 --- .gitignore | 2 + config/packages/README.md | 1 + config/packages/bearclaw.yaml | 19 +++- config/packages/garadget.yaml | 52 +---------- config/packages/llmvision.yaml | 69 ++++++++++++-- config/packages/telegram_bot.yaml | 22 ++++- config/templates/speech/briefing.yaml | 8 ++ config/www/onenote-launch.html | 129 ++++++++++++++++++++++++++ ha-version-badge.svg | 8 +- 9 files changed, 238 insertions(+), 72 deletions(-) create mode 100644 config/www/onenote-launch.html diff --git a/.gitignore b/.gitignore index 9e6eb1db..037d317f 100755 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,7 @@ hacs alexa_media custom_components config/www/community +config/.cache/brands/integrations/ community image tts @@ -80,3 +81,4 @@ panel-notes docker_14 docker_69 .codex_tmp/ + diff --git a/config/packages/README.md b/config/packages/README.md index 178f771c..3dec3029 100755 --- a/config/packages/README.md +++ b/config/packages/README.md @@ -59,6 +59,7 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this | [vacation_mode.yaml](vacation_mode.yaml) | Auto-enable vacation mode after 24 hours away or no bed use, track sitter analytics/secure-house checks, and deliver Chromecast-first vacation briefings with a garage Alexa welcome. | `input_boolean.vacation_mode`, `input_boolean.house_sitter_present`, `sensor.vacation_house_sitter_*`, `group.garage_doors`, `lock.front_door`, `script.notify_engine`, `script.joanna_send_telegram` | | [maintenance_log.yaml](maintenance_log.yaml) | Joanna maintenance webhook ingest for water softener salt with idempotent event handling, Activity feed logging, and recorder-backed helper history for long-term graphing. | `automation.maintenance_log_joanna_webhook_ingest`, `input_number.water_softener_salt_total_added_lb`, `counter.water_softener_salt_event_count`, `sensor.water_softener_salt_days_since_last_add` | | [powerwall.yaml](powerwall.yaml) | Track Tesla Powerwall grid status and shed loads automatically when off-grid (alerts include Activity feed + Repairs). | `binary_sensor.powerwall_grid_status`, `sensor.powerwall_*`, `repairs.create` | +| [tesla_model_y.yaml](tesla_model_y.yaml) | Remind the garage and parents to plug in the Model Y after low-battery arrivals and after 8 PM when it is home but not charging. | `sensor.spaceship_battery_level`, `switch.spaceship_charge`, `notify.alexa_media_garage`, `script.notify_engine` | | [vacuum.yaml](vacuum.yaml) | Dreame vacuum orchestration with room tracking, push alerts, Activity feed, Repairs issues on errors, and Alexa one-off room-clean switches. | `input_select.l10s_vacuum_phase`, `sensor.l10s_vacuum_error`, `repairs.create` | | [hass_agent_homepc.yaml](hass_agent_homepc.yaml) | Mirrors PC lock/unlock state from HASS.Agent to the office lamp for instant desk presence cues. | `sensor.carlo_homepc_carlo_homepc_sessionstate`, `switch.office_lamp_switch` | | [sleepiq.yaml](sleepiq.yaml) | Sleep Number presence/snore automations; Overview Health consumes direct SleepIQ integration entities for scores, vitals, pressure, and bed controls. | `sensor.sleepnumber_carlo_carlo_sleep_score`, `sensor.sleepnumber_carlo_stacey_sleep_score`, `number.sleepnumber_carlo_carlo_firmness`, `select.sleepnumber_carlo_foundation_preset_right` | diff --git a/config/packages/bearclaw.yaml b/config/packages/bearclaw.yaml index 0875d445..c9654070 100644 --- a/config/packages/bearclaw.yaml +++ b/config/packages/bearclaw.yaml @@ -383,6 +383,15 @@ automation: action: - variables: message: "{{ trigger.json.message | default('Joanna: empty reply') }}" + telegram_message: "{{ trigger.json.telegram_message | default(message, true) }}" + telegram_parse_mode: >- + {% set raw = trigger.json.telegram_parse_mode | default('plain_text', true) | string | lower | trim %} + {% if raw in ['html', 'plain_text'] %} + {{ raw }} + {% else %} + plain_text + {% endif %} + telegram_disable_preview: "{{ trigger.json.disable_web_page_preview | default(true, true) }}" level: "{{ trigger.json.level | default('active') | lower }}" inline_keyboard_payload: >- {% set kb = trigger.json.inline_keyboard if trigger.json.inline_keyboard is defined else none %} @@ -408,14 +417,16 @@ automation: - service: telegram_bot.send_message data: chat_id: !secret telegram_allowed_chat_id_carlo - message: "{{ message }}" - parse_mode: plain_text - disable_web_page_preview: true + message: "{{ telegram_message }}" + parse_mode: "{{ telegram_parse_mode }}" + disable_web_page_preview: "{{ telegram_disable_preview }}" inline_keyboard: "{{ inline_keyboard_payload }}" default: - service: script.joanna_send_telegram data: - message: "{{ message }}" + message: "{{ telegram_message }}" + parse_mode: "{{ telegram_parse_mode }}" + disable_web_page_preview: "{{ telegram_disable_preview }}" - service: script.send_to_logbook data: topic: JOANNA diff --git a/config/packages/garadget.yaml b/config/packages/garadget.yaml index ffb19884..950e3f61 100755 --- a/config/packages/garadget.yaml +++ b/config/packages/garadget.yaml @@ -330,13 +330,8 @@ automation: trigger: - platform: time_pattern - minutes: '/45' - - platform: state - entity_id: - - cover.large_garage_door - - cover.small_garage_door - to: 'open' - for: "00:01:00" + minutes: '/30' + - platform: state entity_id: group.family to: not_home @@ -392,46 +387,3 @@ automation: - service: script.speech_engine data: value1: "Check the garage doors. The Small garage is {{ states('cover.small_garage_door')}} and the large garage is {{ states('cover.large_garage_door')}} [Always mention the specific garage door that is currently open and remind us to close it for the night]" - - # - alias: 'Garage Camera on Alexa Shows' - # id: 4373df2a-77f2-4e19-be7c-46c7b27ca583 - # mode: single - # trigger: - # - platform: state - # entity_id: - # - cover.large_garage_door - # - cover.small_garage_door - # from: 'closed' - # to: 'open' - # for: "00:00:15" - - # - platform: state - # entity_id: binary_sensor.mcu1_gpio12 #interior Garage Doors - # from: 'off' - # to: 'on' - # for: "00:00:05" - - # - platform: state - # entity_id: - # - person.carlo - # - person.stacey - # - person.paige - # - person.justin - # to: 'not_home' - # from: 'home' - - # action: - # - service: media_player.play_media - # target: - # entity_id: media_player.kitchen - # data: - # media_content_id: 'show garage camera from home assistant' - # media_content_type: custom - # - delay: '00:20:00' - # - service: media_player.play_media - # target: - # entity_id: media_player.kitchen - # data: - # media_content_id: 'hide garage camera' - # media_content_type: custom - diff --git a/config/packages/llmvision.yaml b/config/packages/llmvision.yaml index 9bcab110..ae1db883 100644 --- a/config/packages/llmvision.yaml +++ b/config/packages/llmvision.yaml @@ -7,7 +7,7 @@ # Trigger with input_button.llmvision_garbage_check, input_button.llmvision_front_door_package_check, or front door person activity to update vision-backed package sensors. # ------------------------------------------------------------------- # Notes: LLMVision analyzes camera.garagecam; expects strict "on"/"off" output. -# Notes: Front-door package detection runs 3 minutes after `sensor.frontdoorbell_person_active_count_2` goes above 0. +# Notes: Front-door package detection waits 3 minutes after person activity or 20 seconds after the front door relocks, then analyzes a short live stream for better package accuracy. # Docs: https://llmvision.gitbook.io/getting-started/usage/image-analyzer ###################################################################### @@ -129,30 +129,79 @@ automation: - platform: numeric_state entity_id: sensor.frontdoorbell_person_active_count_2 above: 0 - for: "00:03:00" id: person_count + - platform: state + entity_id: lock.front_door + from: unlocked + to: locked + id: front_door_locked - platform: state entity_id: input_button.llmvision_front_door_package_check id: manual_check variables: + trigger_source: >- + {% if trigger.id == 'manual_check' %} + manual button + {% elif trigger.id == 'front_door_locked' %} + front door relock + {% else %} + front door person activity + {% endif %} prompt_text: >- - Examine the front door camera image for delivery packages. Focus only on boxes, padded envelopes, - or shopping bags left on the porch or by the front door. If one or more packages are clearly visible, - respond exactly: on. If no packages are clearly visible, respond exactly: off. No other words. + Examine these front door camera frames for delivery packages. Focus on the porch and doorstep area + near the wall and doormat in the lower-right part of the image. Treat cardboard boxes, padded mailers, + poly bags, and shopping bags as packages. Ignore the street, cars, landscaping, and anything not resting + on the porch or doorstep. If any package is clearly visible, respond exactly: on. If no package is + clearly visible, respond exactly: off. No other words. action: - - service: llmvision.data_analyzer + - choose: + - conditions: + - condition: template + value_template: "{{ trigger.id == 'person_count' }}" + sequence: + - delay: "00:03:00" + - conditions: + - condition: template + value_template: "{{ trigger.id == 'front_door_locked' }}" + sequence: + - delay: "00:00:20" + - service: llmvision.stream_analyzer response_variable: llmvision_result data: provider: !secret llmvision_provider_entry - model: gpt-4.1-nano + model: gpt-4.1-mini message: "{{ prompt_text }}" - sensor_entity: input_boolean.front_door_packages_present image_entity: - camera.frontdoorbell + duration: 6 + max_frames: 5 include_filename: false - target_width: 1280 + target_width: 1920 max_tokens: 16 expose_images: true + - variables: + normalized_response: "{{ llmvision_result.response_text | default('') | trim | lower }}" + - choose: + - conditions: + - condition: template + value_template: >- + {{ normalized_response in ['on', 'yes', 'true'] + or normalized_response.startswith('on') + or normalized_response.startswith('yes') }} + sequence: + - service: input_boolean.turn_on + target: + entity_id: input_boolean.front_door_packages_present + - conditions: + - condition: template + value_template: >- + {{ normalized_response in ['off', 'no', 'false'] + or normalized_response.startswith('off') + or normalized_response.startswith('no') }} + sequence: + - service: input_boolean.turn_off + target: + entity_id: input_boolean.front_door_packages_present - service: input_text.set_value target: entity_id: input_text.llmvision_front_door_last_response @@ -181,7 +230,7 @@ automation: data: topic: PACKAGES message: >- - Front door package vision check ran via {{ 'manual button' if trigger.id == 'manual_check' else 'front door person activity' }} + Front door package vision check ran via {{ trigger_source }} and returned {{ llmvision_result.response_text | default(states('input_boolean.front_door_packages_present')) | lower }}. - choose: - conditions: diff --git a/config/packages/telegram_bot.yaml b/config/packages/telegram_bot.yaml index 240497bb..a54172bf 100644 --- a/config/packages/telegram_bot.yaml +++ b/config/packages/telegram_bot.yaml @@ -7,7 +7,7 @@ # Script wrappers for Telegram messaging using UI-configured integration. # ------------------------------------------------------------------- # Notes: Do not add `telegram_bot:` YAML here; integration is UI-only. -# Notes: Joanna transport sends as plain_text to avoid Telegram parse-entity failures. +# Notes: Joanna transport defaults to plain_text, but can opt into HTML when the appliance provides a vetted rich message. # Notes: Keep Skills logic in docker_17/codex_appliance; this package is delivery/transport only. ###################################################################### @@ -20,9 +20,23 @@ script: message: description: Message body to send. example: Joanna is online. + parse_mode: + description: Telegram parse mode (`plain_text` or `html`). + example: html + disable_web_page_preview: + description: Whether Telegram should suppress web page previews. + example: true sequence: - variables: chunk_size: 3400 + requested_parse_mode: >- + {% set raw = parse_mode | default('plain_text', true) | string | lower | trim %} + {% if raw in ['html', 'plain_text'] %} + {{ raw }} + {% else %} + plain_text + {% endif %} + preview_disabled: "{{ disable_web_page_preview | default(true, true) }}" normalized_message: >- {% set raw = message | default('', true) | string %} {{ raw | replace('\r\n', '\n') | replace('\r', '\n') | trim }} @@ -60,8 +74,8 @@ script: data: chat_id: !secret telegram_allowed_chat_id_carlo message: "{{ chunk_message }}" - parse_mode: plain_text - disable_web_page_preview: true + parse_mode: "{{ requested_parse_mode }}" + disable_web_page_preview: "{{ preview_disabled }}" response_variable: telegram_send_response - choose: - conditions: @@ -77,4 +91,4 @@ script: chat_id: !secret telegram_allowed_chat_id_carlo message: "{{ fallback_message if fallback_message | length > 0 else 'Joanna: message delivery fallback (content omitted)' }}" parse_mode: plain_text - disable_web_page_preview: true + disable_web_page_preview: "{{ preview_disabled }}" diff --git a/config/templates/speech/briefing.yaml b/config/templates/speech/briefing.yaml index 9ba751b8..ce241a6c 100755 --- a/config/templates/speech/briefing.yaml +++ b/config/templates/speech/briefing.yaml @@ -131,6 +131,12 @@ {%- endif -%} {%- endmacro -%} + {%- macro front_door_packages() -%} + {% if is_state('binary_sensor.front_door_packages_present', 'on') -%} + There appears to be a package waiting at the front door. + {%- endif -%} + {%- endmacro -%} + {%- macro medicine() -%} {% if is_state('input_boolean.medicine', 'off') -%} It looks like Carlo has not taken his medicine yet. Please make sure Carlo takes his medicine now. @@ -293,6 +299,8 @@ {{ window_check() }} {% endif %} + {{ front_door_packages() }} + {{ NewDevice | default }} {% if call_garbage_day == 1 %} diff --git a/config/www/onenote-launch.html b/config/www/onenote-launch.html new file mode 100644 index 00000000..b422dcc8 --- /dev/null +++ b/config/www/onenote-launch.html @@ -0,0 +1,129 @@ + + + + + + Open OneNote + + + +
+
+

Opening OneNote

+

Joanna is handing this note to the OneNote app now.

+

+ +

If the app does not open automatically in a second or two, tap the OneNote button.

+
+
+ + + diff --git a/ha-version-badge.svg b/ha-version-badge.svg index 7f5314ba..729f0a70 100644 --- a/ha-version-badge.svg +++ b/ha-version-badge.svg @@ -1,13 +1,13 @@ 2026.3.2 - + - - + + - +