From 5e3bf916667b7407a06be8879d64eb62b4c73850 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:05:22 +0100 Subject: [PATCH 001/118] build(deps-dev): bump sorbet-runtime from 0.5.11801 to 0.5.11805 (#37322) Bumps [sorbet-runtime](https://github.com/sorbet/sorbet) from 0.5.11801 to 0.5.11805. - [Release notes](https://github.com/sorbet/sorbet/releases) - [Commits](https://github.com/sorbet/sorbet/commits) --- updated-dependencies: - dependency-name: sorbet-runtime dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2f024225dd9..95af0e3b14e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -156,7 +156,7 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11801) + sorbet-runtime (0.5.11805) stringex (2.8.6) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) From 6ce7a21094460ded33e333642f79c0cd20934301 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:05:31 +0100 Subject: [PATCH 002/118] build(deps-dev): bump parser from 3.3.7.0 to 3.3.7.1 (#37321) Bumps [parser](https://github.com/whitequark/parser) from 3.3.7.0 to 3.3.7.1. - [Changelog](https://github.com/whitequark/parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/whitequark/parser/compare/v3.3.7.0...v3.3.7.1) --- updated-dependencies: - dependency-name: parser dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 95af0e3b14e..f6607f8ad62 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -90,7 +90,7 @@ GEM nokogiri (1.18.2-x86_64-linux-gnu) racc (~> 1.4) parallel (1.26.3) - parser (3.3.7.0) + parser (3.3.7.1) ast (~> 2.4.1) racc pathutil (0.16.2) From 67f0b28378508646ce1475e5460d1019cd47349a Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:53:09 +0100 Subject: [PATCH 003/118] When downloading from backup page, backup is decrypted (#37324) * When downloading from backup page, backup is decrypted * Update source/_includes/common-tasks/backups.md Co-authored-by: Franck Nijhof --------- Co-authored-by: Franck Nijhof --- source/_includes/common-tasks/backups.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_includes/common-tasks/backups.md b/source/_includes/common-tasks/backups.md index ac100916a28..532bbcd8410 100644 --- a/source/_includes/common-tasks/backups.md +++ b/source/_includes/common-tasks/backups.md @@ -99,6 +99,8 @@ This creates a backup instantly. You can create a manual backup at any time, irr ### Downloading your local backups +When downloading the backup from the Home Assistant backup page, it is decrypted on the fly so that you can view the data using your favorite archive tool. This is done for all backup locations and also when you download from Home Assistant Cloud. + There are multiple ways to download your local backup from your Home Assistant instance and store it on another device: **Option 1**: Download from the backup page: From 69bc2a6bb0ead932545ee347260be2ad39783ede Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Thu, 6 Feb 2025 09:07:20 +0100 Subject: [PATCH 004/118] History graph: update screenshots to reflect current SW (#37323) --- source/images/dashboards/history_graph.png | Bin 2469 -> 17248 bytes .../images/dashboards/history_graph_lines.png | Bin 5441 -> 37505 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/source/images/dashboards/history_graph.png b/source/images/dashboards/history_graph.png index aa97bb9536cf21ab77c0540738d49ce3ad708849..d34ead9f89191283ac2ff4582d1bc8e2d2828dc8 100644 GIT binary patch literal 17248 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 LpuFq8IdSQC_2}b@ diff --git a/source/images/dashboards/history_graph_lines.png b/source/images/dashboards/history_graph_lines.png index 7e0313c462690aa86fdd1513ba3a70a57e8e3fb4..0b80f182357300d1c7612198babba175044bb622 100644 GIT binary patch literal 37505 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 z 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 UE(U=X3jUFKq##)&uJ`7D0O~T8&j0`b literal 5441 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 a_2yOYQ`)yQ9{>DA$y61!6w2gYefSstfd?Z1 From c8faacfcc19649c76202797735f93f975deb063e Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Thu, 6 Feb 2025 09:36:39 +0100 Subject: [PATCH 005/118] Add new Reolink push callback info (#37325) --- source/_integrations/reolink.markdown | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/_integrations/reolink.markdown b/source/_integrations/reolink.markdown index e140d7556a8..2d5521f67c1 100644 --- a/source/_integrations/reolink.markdown +++ b/source/_integrations/reolink.markdown @@ -139,11 +139,11 @@ Depending on the supported features of the camera, number entities are added for - Auto track disappear time - Auto track stop time - Day night switch threshold* -- Image brightness* (default 128) -- Image contrast* (default 128) -- Image saturation* (default 128) -- Image sharpness* (default 128) -- Image hue* (default 128) +- Image brightness*+ (default 128) +- Image contrast*+ (default 128) +- Image saturation*+ (default 128) +- Image sharpness*+ (default 128) +- Image hue*+ (default 128) **Floodlight turn on brightness** controls the brightness of the floodlight when it is turned on internally by the camera (see **Floodlight mode** select entity) or when using the **Floodlight** light entity. @@ -189,7 +189,7 @@ Some Reolink PTZ cameras can move at di Depending on the supported features of the camera, select entities are added for: - Floodlight mode (Off, Auto, Schedule) -- Day night mode (Auto, Color, Black&White) +- Day night mode+ (Auto, Color, Black&White) - PTZ preset - Play quick reply message - Auto quick reply message From 0781bf28f95aea1a15487349d52bcc434c2d094f Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:04:31 +0100 Subject: [PATCH 006/118] Storing emergency kit: clarify steps (#37326) * Storing emergency kit: clarify steps * Apply parallelism --- source/more-info/backup-emergency-kit.markdown | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/source/more-info/backup-emergency-kit.markdown b/source/more-info/backup-emergency-kit.markdown index 241e0d95299..4a78659a55f 100644 --- a/source/more-info/backup-emergency-kit.markdown +++ b/source/more-info/backup-emergency-kit.markdown @@ -23,7 +23,9 @@ Encryption is a method of converting data into a coded format so that it can onl ![Screenshot showing the encryption key in the download dialog for the backup emergency kit](/images/more-info/backup_emergency_kit_01.png) 3. Store the kit somewhere safe, outside the Home Assistant system. - - Without the encryption key, there is no way to [restore an encrypted backup](/common-tasks/general/#restoring-a-backup). + - Home Assistant keeps track of the current encryption key. If you download from Home Assistant, it can decrypt your backup. + - But if you have changed the encryption key in the meantime, you still need the old key that matches old backups. + Without the encryption key, there is no way to [restore an encrypted backup](/common-tasks/general/#restoring-a-backup). ## Changing your encryption key @@ -33,9 +35,12 @@ When you set up your [backups](/common-tasks/general/#backups), an encryption ke 2. Select **Configure automatic backups** and under **Encryption key**, select **Change**. 3. If you haven't downloaded the old emergency kit yet, do it now. - As the new encryption key won't work for the backups you've taken until now, keep it somewhere safe and make a note of which backups it applies to. -4. To generate a new encryption key, select **Change encryption key**. +4. To generate a new encryption key, select **Next**, then select **Change encryption key**. 5. Download the new encryption key and store it in a safe place. ## I lost my backup encryption key - how can I retrieve it? -If you still have access to your Home Assistant instance you can download the encryption key again from the backup settings. If you have lost the encryption key, and have no access to your Home Assistant instance, there is no way to restore the backup. +If you still have access to your Home Assistant instance you can download the encryption key again from the backup settings. + +- **If you have not changed the encryption key**: Home Assistant still has it. If you download the backup from the Home Assistant Backup page, it decrypts the backup on the fly. +- **If you have changed the encryption key**: Home Assistant can not decrypt it on the fly. You need the encryption key that is related to that backup. If you have lost the encryption key, and have no access to your Home Assistant instance, there is no way to restore the backup. From 66f12151450fa131a19f494ca9a2067eedd7ed80 Mon Sep 17 00:00:00 2001 From: Brynley McDonald Date: Thu, 6 Feb 2025 22:59:39 +1300 Subject: [PATCH 007/118] Add Bluesky and Mastodon links, and add redirects (#37329) --- source/_includes/site/footer.html | 9 ++++++++- source/_redirects | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/source/_includes/site/footer.html b/source/_includes/site/footer.html index b2ecef38574..ca12e4e976f 100644 --- a/source/_includes/site/footer.html +++ b/source/_includes/site/footer.html @@ -85,19 +85,26 @@ title="GitHub" target="_blank" > +
-
+ +
Date: Thu, 6 Feb 2025 10:30:54 -0800 Subject: [PATCH 008/118] Explain use of `collection_key` for energy cards (#37335) * Update energy.markdown * Update energy.markdown * Typo --------- Co-authored-by: Franck Nijhof --- source/_dashboards/energy.markdown | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/source/_dashboards/energy.markdown b/source/_dashboards/energy.markdown index d0101d4d697..d0ce5b5fc86 100644 --- a/source/_dashboards/energy.markdown +++ b/source/_dashboards/energy.markdown @@ -234,3 +234,28 @@ The following example limits the number of shown devices to 5: type: energy-devices-detail-graph max_devices: 5 ``` + +## Using Multiple Collections + +By default, all energy cards are linked to any `energy-date-selection` card on the view, and all `energy-date-selection` cards are linked to the same period. To enable multiple different date selections on the same view, it is necessary to link them to different collections. This is done by adding the variable `collection_key` to the card YAML, and giving this a value of any custom string that begins with `energy_`. (strings that do not start with `energy_` will generate an error). + +All energy cards support use of `collection_key` option. + +### Examples +Example view with multiple collections: + +```yaml +type: masonry +path: example +cards: + - type: energy-date-selection + - type: energy-date-selection + collection_key: energy_2 + + # This card is linked to the first (default) date selection + - type: energy-usage-graph + + # This card is linked to the second date selection + - type: energy-usage-graph + collection_key: energy_2 +``` From e256e333e5f88cf691feca78207c231243ef0810 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Thu, 6 Feb 2025 20:37:45 +0200 Subject: [PATCH 009/118] Update Shelly Bluetooth device requirements (#37330) --- source/_integrations/bluetooth.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_integrations/bluetooth.markdown b/source/_integrations/bluetooth.markdown index 5e615a37e10..21fd43fe8da 100644 --- a/source/_integrations/bluetooth.markdown +++ b/source/_integrations/bluetooth.markdown @@ -282,8 +282,8 @@ The following remote adapters are supported: - Single active connection: ESPHome ESP32 device with firmware 2022.9.3 or later - Multiple active connections: ESPHome ESP32 device with firmware 2022.11.0 or later - [Shelly](/integrations/shelly/) - - Bluetooth advertisement listening: Shelly v2 device with firmware 12.0 or later - - Bluetooth advertisement bundling: Shelly v2 device with firmware 12.0 or later + - Bluetooth advertisement listening: Shelly Gen2+ device + - Bluetooth advertisement bundling: Shelly Gen2+ device - Single active connection: not supported - Multiple active connections: not supported From f1253424d07eaf8839c08120fd53cd754aadd24f Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:53:10 -0800 Subject: [PATCH 010/118] Update statistics-graph.markdown (#37337) --- source/_dashboards/statistics-graph.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_dashboards/statistics-graph.markdown b/source/_dashboards/statistics-graph.markdown index b85599a43ce..8a1cec23152 100644 --- a/source/_dashboards/statistics-graph.markdown +++ b/source/_dashboards/statistics-graph.markdown @@ -94,7 +94,7 @@ energy_date_selection: default: false collection_key: required: false - description: If using `energy_date_selection`, you can set a custom key to match the optional key of an `energy-date-selection` card. This is not typically required, but can be useful if multiple date selection cards are used on the same view. + description: If using `energy_date_selection`, you can set a custom key to match the optional key of an `energy-date-selection` card. This is not typically required, but can be useful if multiple date selection cards are used on the same view. See [energy documentation](/dashboards/energy/#using-multiple-collections). type: string {% endconfiguration %} From 6fccf73607b2744c54c4b495269813cf619aa9f2 Mon Sep 17 00:00:00 2001 From: smhc Date: Fri, 7 Feb 2025 07:45:28 +1100 Subject: [PATCH 011/118] Add IRK instructions for android (#37117) * Add IRK instructions for android * Update source/_integrations/private_ble_device.markdown Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Tiny tweaks --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Franck Nijhof --- source/_integrations/private_ble_device.markdown | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/_integrations/private_ble_device.markdown b/source/_integrations/private_ble_device.markdown index 2bd002e0bfc..912de1b35ed 100644 --- a/source/_integrations/private_ble_device.markdown +++ b/source/_integrations/private_ble_device.markdown @@ -40,6 +40,22 @@ If you are trying to get the IRK for your iPhone or Apple Watch, you must be log 7. You will have to enter your password, then enter your username and password. 8. macOS will show some XML. You are looking for the "Remote IRK" field. After there is a data field that contains a base64 encoded version of your Identity Resolving Key. +### On Windows / For Android + +If you have a rooted Android phone, the IRK (and LTKs) can be viewed in the file `/data/misc/bluedroid/bt_config.conf`. The LE_LOCAL_KEY_IRK specifies the Android device's own IRK, and the first 16 bytes of LE_KEY_PID for every bonded device in the file indicate the bonded device's IRK. Be aware that keys stored in this file are a little-endian, so the byte order of keys in this file will need to be reversed. For example, the little-endian IRK 22BC0E3F2EACF08EE36B865553EA0B4E needs to be changed to 4E0BEA5355866BE38EF0AC2E3F0EBC22. + +Alternatively, the IRK of an Android phone and/or secondary device can be obtained using Wireshark: + +1. In developer settings on the Android phone, enable the "USB Debugging" and "Enable Bluetooth HCI snoop log" options. +2. Ensure a second Bluetooth device (e.g., smartwatch or earbuds) is unpaired. +3. Disable and re-enable Bluetooth on the phone ,then re-pair the secondary device. +4. Connect the Android phone to a computer with [adb](https://developer.android.com/tools/adb) installed. +5. Establish an adb connection (`adb connect...`), then run the command: `adb bugreport scanwatch`. +6. In the generated `scanwatch.zip` file, locate and extract `FS\data\misc\bluetooth\logs\btsnoop_hci.log`. +7. Open `btsnoop_hci.log` in [Wireshark](https://www.wireshark.org/download.html) and search for `btsmp.id_resolving_key`. +8. Select one of the frames and expand the "Bluetooth Security Manager Protocol." The hex dump will show either the sending or receiving device IRK. +9. Reverse the value displayed. For example, if it is `763af6c7f7d94ad6c262158e2320544e`, the IRK to use would be: `4e5420238e1562c2d64ad9f7c7f63a76`. + ## ESPresense If you already use Identity Resolving Key tracking with ESPresence then you already have a hex-encoded version of your Identity Resolving Key. Home Assistant can use the key in this format directly. From 03b7496cbe1d9f8958149fd016a636744a6d2bdf Mon Sep 17 00:00:00 2001 From: emufan Date: Thu, 6 Feb 2025 21:46:45 +0100 Subject: [PATCH 012/118] Update openai_conversation.markdown (#37086) --- source/_integrations/openai_conversation.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_integrations/openai_conversation.markdown b/source/_integrations/openai_conversation.markdown index c2bc2ffe991..12491fece57 100644 --- a/source/_integrations/openai_conversation.markdown +++ b/source/_integrations/openai_conversation.markdown @@ -133,7 +133,7 @@ automation: config_entry: abce6b8696a15e107b4bd843de722249 size: "1024x1024" prompt: >- - New York when the weather is {{ states("weather.home") }}" + New York when the weather is {{ states("weather.home") }} - alias: "Send out a manual event to update the image entity" event: new_weather_image @@ -141,13 +141,13 @@ automation: url: '{{ generated_image.url }}' template: - - triggers: + - trigger: - alias: "Update image when a new weather image is generated" trigger: event event_type: new_weather_image image: - name: "AI generated image of New York" - url: "{{ trigger.event.data.url }}" + - name: "AI generated image of New York" + url: "{{ trigger.event.data.url }}" ``` {% endraw %} From aa4420041a1bb6065a64d4dcc83da2cd36b69316 Mon Sep 17 00:00:00 2001 From: Gene Berkowitz <111010697+TheCodeJanitor-dotcom@users.noreply.github.com> Date: Thu, 6 Feb 2025 15:55:02 -0500 Subject: [PATCH 013/118] Update squeezebox.markdown (#37293) * Update squeezebox.markdown Adds specific examples for entering call_method in the Visual Editor with working parameter syntax, as well as showing the properly formed YAML generated. Squeezebox increment / decrement parameters require a preceding plus or minus, which will be dropped by the Visual Editor if not double-quoted. * Update squeezebox.markdown Correct missing closing pipes in tables per Code Rabbit suggestion. --- source/_integrations/squeezebox.markdown | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/source/_integrations/squeezebox.markdown b/source/_integrations/squeezebox.markdown index 7be7a9d6ed8..ec0bd3cc288 100644 --- a/source/_integrations/squeezebox.markdown +++ b/source/_integrations/squeezebox.markdown @@ -96,6 +96,50 @@ For example, to play an album from your collection, create an IFTTT applet like This can work with title search and basically any thing. The same wouldn't have worked by calling directly Squeezebox server as IFTTT cannot escape the text field. +When specifying additional parameters in the Visual Editor, each parameter must be preceded by a hyphen and a space to correctly populate the array: + +For example, to create an automation to mute playback, use the command `mixer` and the parameter `muting`: + +| Row | Parameter | Description | +| --- | -------- | ----------- | +| 1 | - muting | Toggle muting on / off | +| 2 | | | + +resulting in the YAML: + +```yaml +# Toggle the muting state of the specified player +action: squeezebox.call_method +metadata: {} +data: + command: mixer + parameters: + - muting +``` + +Where a parameter is an increment or decrement, it is necessary to place the value in double quotes. + +For example, to increase the playback volume, use the command `mixer` and the parameters `volume` and the amount to increment: + +| Row | Parameter | Description | +| --- | -------- | ----------- | +| 1 | - volume | Parameter to change | +| 2 | - "+5" | Increment volume by 5 percent | + +resulting in the YAML: + +```yaml +# Increment the playback volume of the specified player by five percent +action: squeezebox.call_method +metadata: {} +data: + command: mixer + parameters: + - volume + - "+5" +``` + + ### Action `call_query` Call a custom Squeezebox JSON-RPC API. The result of the query will be stored in the 'query_result' attribute of the player. From bb9b92d7b3228969cb6e1c10f788b2fa0336399f Mon Sep 17 00:00:00 2001 From: Zemoj Date: Thu, 6 Feb 2025 12:56:01 -0800 Subject: [PATCH 014/118] Update troubleshooting.markdown (#37265) * Update troubleshooting.markdown Added media source fix for no TTS in YAML config. * Update troubleshooting.markdown streamlined media source text and added refence for default config. added local network header for more consistent style. --- source/voice_control/troubleshooting.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/voice_control/troubleshooting.markdown b/source/voice_control/troubleshooting.markdown index 7d316d56117..d87dbbf42ea 100644 --- a/source/voice_control/troubleshooting.markdown +++ b/source/voice_control/troubleshooting.markdown @@ -92,6 +92,7 @@ My voice assistant understands me and processes the command, but I don't get a v The voice response is generated in Home Assistant by one of our supported text-to-speech (or {% term TTS %}) engines. The voice assistant device then fetches the audio file from Home Assistant and plays it back. +### Local Network Settings For this fetching process to work, Home Assistant must communicate its own URL to the device. If you have a complex network setup, or if you changed this setting in the past, the URL communicated could be wrong. @@ -103,6 +104,8 @@ To fix the URL, follow these steps: - For most users, the **Automatic** option works and is recommended. ![Create alias for entity name](/images/assist/local_url.png) +### Missing Media Source +If you are using YAML configuration and do not have `default_config:` make sure `media_source:` is present. ## Tweaking the Assist audio configuration for your device From cf70fa265c0379a837236d44b3f3de8a2c539681 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 11:33:07 +0100 Subject: [PATCH 015/118] build(deps-dev): bump ruby-lsp from 0.23.8 to 0.23.9 (#37341) Bumps [ruby-lsp](https://github.com/Shopify/ruby-lsp) from 0.23.8 to 0.23.9. - [Release notes](https://github.com/Shopify/ruby-lsp/releases) - [Commits](https://github.com/Shopify/ruby-lsp/compare/v0.23.8...v0.23.9) --- updated-dependencies: - dependency-name: ruby-lsp dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 1acd0c2a3f6..d9097da97d7 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ group :development do gem 'sassc', '2.1.0' gem 'sass-embedded', '1.83.4' gem 'rubocop', '1.71.2' - gem 'ruby-lsp', '0.23.8' + gem 'ruby-lsp', '0.23.9' gem 'rackup', '2.2.1' end diff --git a/Gemfile.lock b/Gemfile.lock index f6607f8ad62..2f88ff99886 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -130,7 +130,7 @@ GEM unicode-display_width (>= 2.4.0, < 4.0) rubocop-ast (1.38.0) parser (>= 3.3.1.0) - ruby-lsp (0.23.8) + ruby-lsp (0.23.9) language_server-protocol (~> 3.17.0) prism (>= 1.2, < 2.0) rbs (>= 3, < 4) @@ -183,7 +183,7 @@ DEPENDENCIES rackup (= 2.2.1) rake (= 13.2.1) rubocop (= 1.71.2) - ruby-lsp (= 0.23.8) + ruby-lsp (= 0.23.9) sass-embedded (= 1.83.4) sass-globbing (= 1.1.5) sassc (= 2.1.0) From d4a85fe029975b62adfc0707b850b95f1f0cffb3 Mon Sep 17 00:00:00 2001 From: Dave T <17680170+davet2001@users.noreply.github.com> Date: Fri, 7 Feb 2025 10:34:37 +0000 Subject: [PATCH 016/118] Fix weather map example to be one that works (#37339) --- source/_integrations/generic.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_integrations/generic.markdown b/source/_integrations/generic.markdown index f85209c2108..0f3e3ba0d76 100644 --- a/source/_integrations/generic.markdown +++ b/source/_integrations/generic.markdown @@ -59,11 +59,11 @@ Use wallclock as timestamps: In this section, you find some real-life examples of how to use this camera platform. -### Weather graph from yr.no +### Weather graph from USA National Weather Service -- Still Image URL: `https://www.yr.no/en/content/1-72837/meteogram.svg` +You can display a GIF from the web as a still image. -Instructions on how to locate the SVG for your location are available at [developer.yr.no](https://developer.yr.no/doc/guides/available-widgets/) +- Still Image URL: `https://radar.weather.gov/ridge/standard/CONUS_0.gif` ### Local image From dbd40cbcd84109ed4fdbd1c057859c5df96da6a9 Mon Sep 17 00:00:00 2001 From: Jonas Fors Lellky Date: Fri, 7 Feb 2025 15:50:38 +0100 Subject: [PATCH 017/118] Clarify hardware needs for flexit_bacnet (#37348) * Clarify hardware needs for flexit_bacnet * Fix typo * Tiny tweaks --------- Co-authored-by: Franck Nijhof --- source/_integrations/flexit_bacnet.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/flexit_bacnet.markdown b/source/_integrations/flexit_bacnet.markdown index 09fcc2b778f..93b87944f5e 100644 --- a/source/_integrations/flexit_bacnet.markdown +++ b/source/_integrations/flexit_bacnet.markdown @@ -23,6 +23,8 @@ Integrates [Flexit](https://www.flexit.no/en/) Nordic series air handling unit i ## Prerequisites +Your Flexit device should be equipped with an ethernet port, and no additional modules should be required. This integration communicates with the BACnet protocol over Ethernet. + To configure the integration, you need to obtain the IP address and Device ID for the unit. 1. Open the Flexit Go app on your mobile. From 6db0b9a69b4c9c7a4dee449af467a59262931251 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 7 Feb 2025 19:35:57 +0100 Subject: [PATCH 018/118] 2025.2.1 (#37353) --- _config.yml | 4 +- .../_posts/2025-02-05-release-20252.markdown | 93 +++++++++++++++++++ source/changelogs/core-2025.2.markdown | 85 +++++++++++++++++ 3 files changed, 180 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 726af9c9efb..7e29127ea5b 100644 --- a/_config.yml +++ b/_config.yml @@ -108,8 +108,8 @@ social: # Home Assistant release details current_major_version: 2025 current_minor_version: 2 -current_patch_version: 0 -date_released: 2025-02-05 +current_patch_version: 1 +date_released: 2025-02-07 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2025-02-05-release-20252.markdown b/source/_posts/2025-02-05-release-20252.markdown index 13312c4641b..0297ca24271 100644 --- a/source/_posts/2025-02-05-release-20252.markdown +++ b/source/_posts/2025-02-05-release-20252.markdown @@ -71,6 +71,8 @@ _PS: It is almost Valentine's day, did you set up some romantic scenes yet? 🌹 - [Other noteworthy changes](#other-noteworthy-changes) - [Bluetooth config panel](#bluetooth-config-panel) - [Preparing our graphs for the future](#preparing-our-graphs-for-the-future) +- [Patch releases](#patch-releases) + - [2025.2.1 - February 7](#202521---february-7) - [Need help? Join the community!](#need-help-join-the-community) - [Backward-incompatible changes](#backward-incompatible-changes) - [All changes](#all-changes) @@ -473,6 +475,97 @@ However, this change is a preparation for the future. We have many plans and ideas for our graphs, and this change was a necessary step to make those plans possible. +## Patch releases + +We will also release patch releases for Home Assistant 2025.2 in February. +These patch releases only contain bug fixes. Our goal is to release a patch +release every Friday. + +### 2025.2.1 - February 7 + +- Fix hassio test using wrong fixture ([@emontnemery] - [#137516]) +- Change Electric Kiwi authentication ([@mikey0000] - [#135231]) +- Update govee-ble to 0.42.1 ([@cdce8p] - [#137371]) +- Bump holidays to 0.66 ([@gjohansson-ST] - [#137449]) +- Bump aiohttp-asyncmdnsresolver to 0.1.0 ([@bdraco] - [#137492]) +- Bump aiohttp to 3.11.12 ([@bdraco] - [#137494]) +- Bump govee-ble to 0.43.0 to fix compat with new H5179 firmware ([@bdraco] - [#137508]) +- Bump habiticalib to v0.3.5 ([@tr4nt0r] - [#137510]) +- Fix Mill issue, where no sensors were shown ([@Danielhiversen] - [#137521]) +- Don't overwrite setup state in async_set_domains_to_be_loaded ([@emontnemery] - [#137547]) +- Use separate metadata files for onedrive ([@zweckj] - [#137549]) +- Fix sending polls to Telegram threads ([@jwhb] - [#137553]) +- Skip building wheels for electrickiwi-api ([@cdce8p] - [#137556]) +- Add excluded domains to broadcast intent ([@synesthesiam] - [#137566]) +- Revert "Add `PaddleSwitchPico` (Pico Paddle Remote) device trigger to Lutron Caseta" ([@bdraco] - [#137571]) +- Fix Overseerr webhook configuration JSON ([@denniseffing] - [#137572]) +- Do not rely on pyserial for port scanning with the CM5 + ZHA ([@puddly] - [#137585]) +- Bump eheimdigital to 1.0.6 ([@autinerd] - [#137587]) +- Bump pyfireservicerota to 0.0.46 ([@cyberjunky] - [#137589]) +- Bump reolink-aio to 0.11.10 ([@starkillerOG] - [#137591]) +- Allow to omit the payload attribute to MQTT publish action to allow an empty payload to be sent by default ([@jbouwh] - [#137595]) +- Handle previously migrated HEOS device identifier ([@andrewsayre] - [#137596]) +- Bump `aioshelly` to version `12.4.1` ([@bieniu] - [#137598]) +- Bump electrickiwi-api to 0.9.13 ([@mikey0000] - [#137601]) +- Bump ZHA to 0.0.48 ([@TheJulianJES] - [#137610]) +- Bump Electrickiwi-api to 0.9.14 ([@mikey0000] - [#137614]) +- Update google-nest-sdm to 7.1.3 ([@allenporter] - [#137625]) +- Don't use the current temperature from Shelly BLU TRV as a state for External Temperature number entity ([@bieniu] - [#137658]) +- Fix LG webOS TV turn off when device is already off ([@thecode] - [#137675]) + +[#135231]: https://github.com/home-assistant/core/pull/135231 +[#137371]: https://github.com/home-assistant/core/pull/137371 +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137449]: https://github.com/home-assistant/core/pull/137449 +[#137492]: https://github.com/home-assistant/core/pull/137492 +[#137494]: https://github.com/home-assistant/core/pull/137494 +[#137508]: https://github.com/home-assistant/core/pull/137508 +[#137510]: https://github.com/home-assistant/core/pull/137510 +[#137516]: https://github.com/home-assistant/core/pull/137516 +[#137521]: https://github.com/home-assistant/core/pull/137521 +[#137547]: https://github.com/home-assistant/core/pull/137547 +[#137549]: https://github.com/home-assistant/core/pull/137549 +[#137553]: https://github.com/home-assistant/core/pull/137553 +[#137556]: https://github.com/home-assistant/core/pull/137556 +[#137566]: https://github.com/home-assistant/core/pull/137566 +[#137571]: https://github.com/home-assistant/core/pull/137571 +[#137572]: https://github.com/home-assistant/core/pull/137572 +[#137585]: https://github.com/home-assistant/core/pull/137585 +[#137587]: https://github.com/home-assistant/core/pull/137587 +[#137589]: https://github.com/home-assistant/core/pull/137589 +[#137591]: https://github.com/home-assistant/core/pull/137591 +[#137595]: https://github.com/home-assistant/core/pull/137595 +[#137596]: https://github.com/home-assistant/core/pull/137596 +[#137598]: https://github.com/home-assistant/core/pull/137598 +[#137601]: https://github.com/home-assistant/core/pull/137601 +[#137610]: https://github.com/home-assistant/core/pull/137610 +[#137614]: https://github.com/home-assistant/core/pull/137614 +[#137625]: https://github.com/home-assistant/core/pull/137625 +[#137658]: https://github.com/home-assistant/core/pull/137658 +[#137675]: https://github.com/home-assistant/core/pull/137675 +[@Danielhiversen]: https://github.com/Danielhiversen +[@TheJulianJES]: https://github.com/TheJulianJES +[@allenporter]: https://github.com/allenporter +[@andrewsayre]: https://github.com/andrewsayre +[@autinerd]: https://github.com/autinerd +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@cdce8p]: https://github.com/cdce8p +[@cyberjunky]: https://github.com/cyberjunky +[@denniseffing]: https://github.com/denniseffing +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@jbouwh]: https://github.com/jbouwh +[@jwhb]: https://github.com/jwhb +[@mikey0000]: https://github.com/mikey0000 +[@puddly]: https://github.com/puddly +[@starkillerOG]: https://github.com/starkillerOG +[@synesthesiam]: https://github.com/synesthesiam +[@thecode]: https://github.com/thecode +[@tr4nt0r]: https://github.com/tr4nt0r +[@zweckj]: https://github.com/zweckj + ## Need help? Join the community! Home Assistant has a great community of users who are all more than willing diff --git a/source/changelogs/core-2025.2.markdown b/source/changelogs/core-2025.2.markdown index 98215ecdc7a..a86608880ec 100644 --- a/source/changelogs/core-2025.2.markdown +++ b/source/changelogs/core-2025.2.markdown @@ -1358,6 +1358,91 @@ For a summary in a more readable format: - Bump hassil and intents ([@synesthesiam] - [#137440]) - Bump dbus-fast to 2.33.0 ([@bdraco] - [#137446]) +## Release 2025.2.1 - February 7 + +- Fix hassio test using wrong fixture ([@emontnemery] - [#137516]) +- Change Electric Kiwi authentication ([@mikey0000] - [#135231]) +- Update govee-ble to 0.42.1 ([@cdce8p] - [#137371]) +- Bump holidays to 0.66 ([@gjohansson-ST] - [#137449]) +- Bump aiohttp-asyncmdnsresolver to 0.1.0 ([@bdraco] - [#137492]) +- Bump aiohttp to 3.11.12 ([@bdraco] - [#137494]) +- Bump govee-ble to 0.43.0 to fix compat with new H5179 firmware ([@bdraco] - [#137508]) +- Bump habiticalib to v0.3.5 ([@tr4nt0r] - [#137510]) +- Fix Mill issue, where no sensors were shown ([@Danielhiversen] - [#137521]) +- Don't overwrite setup state in async_set_domains_to_be_loaded ([@emontnemery] - [#137547]) +- Use separate metadata files for onedrive ([@zweckj] - [#137549]) +- Fix sending polls to Telegram threads ([@jwhb] - [#137553]) +- Skip building wheels for electrickiwi-api ([@cdce8p] - [#137556]) +- Add excluded domains to broadcast intent ([@synesthesiam] - [#137566]) +- Revert "Add `PaddleSwitchPico` (Pico Paddle Remote) device trigger to Lutron Caseta" ([@bdraco] - [#137571]) +- Fix Overseerr webhook configuration JSON ([@denniseffing] - [#137572]) +- Do not rely on pyserial for port scanning with the CM5 + ZHA ([@puddly] - [#137585]) +- Bump eheimdigital to 1.0.6 ([@autinerd] - [#137587]) +- Bump pyfireservicerota to 0.0.46 ([@cyberjunky] - [#137589]) +- Bump reolink-aio to 0.11.10 ([@starkillerOG] - [#137591]) +- Allow to omit the payload attribute to MQTT publish action to allow an empty payload to be sent by default ([@jbouwh] - [#137595]) +- Handle previously migrated HEOS device identifier ([@andrewsayre] - [#137596]) +- Bump `aioshelly` to version `12.4.1` ([@bieniu] - [#137598]) +- Bump electrickiwi-api to 0.9.13 ([@mikey0000] - [#137601]) +- Bump ZHA to 0.0.48 ([@TheJulianJES] - [#137610]) +- Bump Electrickiwi-api to 0.9.14 ([@mikey0000] - [#137614]) +- Update google-nest-sdm to 7.1.3 ([@allenporter] - [#137625]) +- Don't use the current temperature from Shelly BLU TRV as a state for External Temperature number entity ([@bieniu] - [#137658]) +- Fix LG webOS TV turn off when device is already off ([@thecode] - [#137675]) + +[#135231]: https://github.com/home-assistant/core/pull/135231 +[#137371]: https://github.com/home-assistant/core/pull/137371 +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137449]: https://github.com/home-assistant/core/pull/137449 +[#137492]: https://github.com/home-assistant/core/pull/137492 +[#137494]: https://github.com/home-assistant/core/pull/137494 +[#137508]: https://github.com/home-assistant/core/pull/137508 +[#137510]: https://github.com/home-assistant/core/pull/137510 +[#137516]: https://github.com/home-assistant/core/pull/137516 +[#137521]: https://github.com/home-assistant/core/pull/137521 +[#137547]: https://github.com/home-assistant/core/pull/137547 +[#137549]: https://github.com/home-assistant/core/pull/137549 +[#137553]: https://github.com/home-assistant/core/pull/137553 +[#137556]: https://github.com/home-assistant/core/pull/137556 +[#137566]: https://github.com/home-assistant/core/pull/137566 +[#137571]: https://github.com/home-assistant/core/pull/137571 +[#137572]: https://github.com/home-assistant/core/pull/137572 +[#137585]: https://github.com/home-assistant/core/pull/137585 +[#137587]: https://github.com/home-assistant/core/pull/137587 +[#137589]: https://github.com/home-assistant/core/pull/137589 +[#137591]: https://github.com/home-assistant/core/pull/137591 +[#137595]: https://github.com/home-assistant/core/pull/137595 +[#137596]: https://github.com/home-assistant/core/pull/137596 +[#137598]: https://github.com/home-assistant/core/pull/137598 +[#137601]: https://github.com/home-assistant/core/pull/137601 +[#137610]: https://github.com/home-assistant/core/pull/137610 +[#137614]: https://github.com/home-assistant/core/pull/137614 +[#137625]: https://github.com/home-assistant/core/pull/137625 +[#137658]: https://github.com/home-assistant/core/pull/137658 +[#137675]: https://github.com/home-assistant/core/pull/137675 +[@Danielhiversen]: https://github.com/Danielhiversen +[@TheJulianJES]: https://github.com/TheJulianJES +[@allenporter]: https://github.com/allenporter +[@andrewsayre]: https://github.com/andrewsayre +[@autinerd]: https://github.com/autinerd +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@cdce8p]: https://github.com/cdce8p +[@cyberjunky]: https://github.com/cyberjunky +[@denniseffing]: https://github.com/denniseffing +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@jbouwh]: https://github.com/jbouwh +[@jwhb]: https://github.com/jwhb +[@mikey0000]: https://github.com/mikey0000 +[@puddly]: https://github.com/puddly +[@starkillerOG]: https://github.com/starkillerOG +[@synesthesiam]: https://github.com/synesthesiam +[@thecode]: https://github.com/thecode +[@tr4nt0r]: https://github.com/tr4nt0r +[@zweckj]: https://github.com/zweckj + [#112047]: https://github.com/home-assistant/core/pull/112047 [#121522]: https://github.com/home-assistant/core/pull/121522 [#121548]: https://github.com/home-assistant/core/pull/121548 From c50b8fb542940e13af7e9aa514e6a6fab9d93e63 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sat, 8 Feb 2025 13:28:20 +0100 Subject: [PATCH 019/118] Update onedrive docs (#37360) * Update onedrive.markdown * Improve readability of OneDrive integration documentation --- source/_integrations/onedrive.markdown | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/source/_integrations/onedrive.markdown b/source/_integrations/onedrive.markdown index 955ebd677e9..c78e7a1e76e 100644 --- a/source/_integrations/onedrive.markdown +++ b/source/_integrations/onedrive.markdown @@ -1,5 +1,5 @@ --- -title: OneDrive +title: Microsoft OneDrive description: Instructions on how to setup OneDrive to be used with backups. ha_release: 2025.2 ha_category: @@ -16,14 +16,14 @@ related: ha_quality_scale: bronze --- -This integration allows you to use [OneDrive](https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage) for [Home Assistant Backups](/common-tasks/general/#backups). +This integration allows you to use [Microsoft OneDrive](https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage) for [Home Assistant Backups](/common-tasks/general/#backups). Backups will be created in a folder called `Home Assistant\backups_` in the `App Folder` of your OneDrive. `id` is part of your Home Assistant instance's unique id to allow backups from multiple instances to the same OneDrive account. The integration only has access to an application specific `Home Assistant` folder in the `App Folder` and cannot access any other parts of your OneDrive. {% important %} -Because of an [issue in the Graph API](https://github.com/OneDrive/onedrive-api-docs/issues/1866), the application-specific folder is often called `Graph` instead of `Home Assistant`. +Because of an issue in Microsoft's APIs, the application-specific folder is often called `Graph` instead of `Home Assistant`. More on that [below](#backup-folder-is-called-graph). {% endimportant %} {% include integrations/config_flow.md %} @@ -61,6 +61,14 @@ If you set the integration up with the default credentials and switch to custom You will need an Azure tenant with an active Azure subscription to create your own client credentials. {% endtip %} +## Backup folder is called `Graph` + +This integration uses Microsoft's Graph API to communicate with your OneDrive. Because of an [issue](https://github.com/OneDrive/onedrive-api-docs/issues/1866) in that API, the application folder is often not named with the name of the application (`Home Assistant`), but `Graph` instead. + +There is no risk of different applications mixing in that `Graph` folder, if you already have such a `Graph` folder from a different application, the next folders will just be called `Graph 1`, `Graph 2` and so on. + +You should be able to manually rename the folder to something else, without the integration breaking. + ## Known limitations - Only personal OneDrives are supported at the moment. From dcfd2efbbee38f1c51167a6a4458f8e226da2d03 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sun, 9 Feb 2025 09:35:14 +0100 Subject: [PATCH 020/118] Improve instructions for a custom app registration to onedrive (#37372) --- source/_integrations/onedrive.markdown | 23 +++++++++++++++--- .../onedrive/onedrive-app-registration.png | Bin 0 -> 84468 bytes 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 source/images/integrations/onedrive/onedrive-app-registration.png diff --git a/source/_integrations/onedrive.markdown b/source/_integrations/onedrive.markdown index c78e7a1e76e..2440c9bbfab 100644 --- a/source/_integrations/onedrive.markdown +++ b/source/_integrations/onedrive.markdown @@ -20,6 +20,7 @@ This integration allows you to use [Microsoft OneDrive](https://www.microsoft.co Backups will be created in a folder called `Home Assistant\backups_` in the `App Folder` of your OneDrive. `id` is part of your Home Assistant instance's unique id to allow backups from multiple instances to the same OneDrive account. + The integration only has access to an application specific `Home Assistant` folder in the `App Folder` and cannot access any other parts of your OneDrive. {% important %} @@ -53,14 +54,22 @@ This integration comes with a predefined set of [application credentials](https: Nobody will ever have access to your data except you, as the app does not have permission to do anything on its own. It only works with a signed-in user (it only has `delegated` not `application permissions`). However, if you want to use your own credentials, follow [this guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app?tabs=certificate) to create your own client ID and secret. -{% note %} -If you set the integration up with the default credentials and switch to custom credentials later, your backup folder will change inside your OneDrive, and you will have to manually copy existing backups from the old folder to the new one. -{% endnote %} - {% tip %} You will need an Azure tenant with an active Azure subscription to create your own client credentials. {% endtip %} +Make sure to configure the following settings on the app registration: + +- **Supported account types**: Personal Microsoft accounts only +- **Redirect URI**: Type: `Web`, URL: `https://my.home-assistant.io/redirect/oauth` + +Configuring a custom app. + + +{% note %} +If you set the integration up with the default credentials and switch to custom credentials later, your backup folder will change inside your OneDrive, and you will have to manually copy existing backups from the old folder to the new one. +{% endnote %} + ## Backup folder is called `Graph` This integration uses Microsoft's Graph API to communicate with your OneDrive. Because of an [issue](https://github.com/OneDrive/onedrive-api-docs/issues/1866) in that API, the application folder is often not named with the name of the application (`Home Assistant`), but `Graph` instead. @@ -78,3 +87,9 @@ You should be able to manually rename the folder to something else, without the This integration follows standard integration removal. No extra steps are required. {% include integrations/remove_device_service.md %} + +## Troubleshooting + +{% details "Unknown error while adding the integration" %} + +Make sure that your OneDrive is not frozen. This can happen if you haven't used it for a longer period of time, or went over your data quota. {% enddetails %} diff --git a/source/images/integrations/onedrive/onedrive-app-registration.png b/source/images/integrations/onedrive/onedrive-app-registration.png new file mode 100644 index 0000000000000000000000000000000000000000..2f0427dda07340ed9369b5ded74ae0f852ad1447 GIT binary patch literal 84468 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 Date: Sun, 9 Feb 2025 17:47:44 -0500 Subject: [PATCH 021/118] Add info about multiple targets support for Slack integration (#37371) * Add info about multiple targets * Blank line before the list --------- Co-authored-by: John Suarez --- source/_integrations/slack.markdown | 34 ++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/source/_integrations/slack.markdown b/source/_integrations/slack.markdown index 046de9275af..a2867e109c8 100644 --- a/source/_integrations/slack.markdown +++ b/source/_integrations/slack.markdown @@ -106,7 +106,7 @@ sequence: - action: notify.YOUR_SLACK_TEAM data: message: "Fallback Text" - target: "#test-channel" + target: "#test-channel" # Single channel target title: "Reminder" data: blocks: @@ -122,6 +122,38 @@ Update the blocks array with valid Slack blocks. The easiest way to create this Create a duplicate of this script to use for different messages, and different channels (the door was opened in #security, the light was left on on #lights, etc). +You can also send messages to multiple targets (channels and/or users) at once: + +```yaml +alias: "Notify: Multiple Targets Message" +sequence: + - action: notify.YOUR_SLACK_TEAM + data: + message: "Alert: Motion detected!" + target: + - "#security" # Channel by name + - "C01234ABCD" # Channel by ID + - "U5678EFGH" # Direct message to user by ID + title: "Security Alert" + data: + blocks: + - type: section + text: + type: mrkdwn + text: "Motion detected in the backyard camera" +``` + +### Target Types + +The `target` field accepts either a single value or a list of values. Each target can be: + +- A channel name with a `#` prefix (e.g., `#general`) +- A channel name without the `#` prefix (e.g., `general`) +- A channel ID (e.g., `C01234ABCD`) +- A user ID for direct messages (e.g., `U5678EFGH`) + +When sending files, make sure you have the proper permissions set up as described in the Setup section. + ### Icons Slack uses the standard emoji sets used [here](https://slack.com/intl/en-gb/help/articles/202931348-Use-emoji-and-reactions#add-emoji-to-your-messages). Alternatively a publicly accessible URL may be used. From 542db642453ef3302b7a85aa78c47f97a73c0b0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 07:46:45 +0100 Subject: [PATCH 022/118] build(deps-dev): bump sorbet-runtime from 0.5.11805 to 0.5.11813 (#37389) Bumps [sorbet-runtime](https://github.com/sorbet/sorbet) from 0.5.11805 to 0.5.11813. - [Release notes](https://github.com/sorbet/sorbet/releases) - [Commits](https://github.com/sorbet/sorbet/commits) --- updated-dependencies: - dependency-name: sorbet-runtime dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2f88ff99886..b99c9456921 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -156,7 +156,7 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11805) + sorbet-runtime (0.5.11813) stringex (2.8.6) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) From 2f9c079f41fa15419d2044c7695aa868fff57bdb Mon Sep 17 00:00:00 2001 From: Caleb Mah Date: Mon, 10 Feb 2025 14:52:38 +0800 Subject: [PATCH 023/118] Add documentation for message_thread_id data attribute for telegram notify integration (#37381) * Add documentation and examples for message_thread_id data attribute * Remove trailing colon in headers * tiny tweak --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/telegram.markdown | 6 ++++++ source/_integrations/telegram_bot.markdown | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/source/_integrations/telegram.markdown b/source/_integrations/telegram.markdown index 715d39c560b..63e92cba62e 100644 --- a/source/_integrations/telegram.markdown +++ b/source/_integrations/telegram.markdown @@ -454,6 +454,7 @@ actions: message_tag: "example_tag" disable_notification: True disable_web_page_preview: True + message_thread_id: 123 ``` {% configuration %} @@ -468,10 +469,15 @@ disable_notification: type: boolean disable_web_page_preview: description: True/false to display a webpage preview. + required: false default: false type: boolean message_tag: description: Tag for sent message. required: false type: string +message_thread_id: + description: Send the message to a specific topic or thread. + required: false + type: integer {% endconfiguration %} diff --git a/source/_integrations/telegram_bot.markdown b/source/_integrations/telegram_bot.markdown index 52b127a598b..62c35c8a72f 100644 --- a/source/_integrations/telegram_bot.markdown +++ b/source/_integrations/telegram_bot.markdown @@ -290,7 +290,7 @@ Remove the bot from the chat group where it was added. ## Telegram notification platform -The [`telegram` notification platform](/integrations/telegram) requires the `telegram_bot` integration to work with, and it's designed to generate a customized shortcut (`notify.USERNAME`) to send notifications (messages, photos, documents and locations) to a particular `chat_id` with the old syntax, allowing backward compatibility. The data attributes `parse_mode`, `disable_notification`, `message_tag` and `disable_web_page_preview` are also supported. +The [`telegram` notification platform](/integrations/telegram) requires the `telegram_bot` integration to work with, and it's designed to generate a customized shortcut (`notify.USERNAME`) to send notifications (messages, photos, documents, and locations) to a particular `chat_id` with the old syntax, allowing backward compatibility. The data attributes `parse_mode`, `disable_notification`, `message_tag`, `disable_web_page_preview`, and `message_thread_id` are also supported. The required YAML configuration now reduces to: @@ -598,7 +598,7 @@ actions: message_tag: "example_tag" ``` -## Example: send_message with disabled webpage preview: +## Example: send_message with disabled webpage preview ```yaml actions: @@ -611,6 +611,17 @@ actions: disable_web_page_preview: true ``` +## Example: send_message to a topic within a group + +```yaml +actions: +- action: notify.telegram + data: + message: "Message to a topic" + data: + message_thread_id: 123 +``` + ## Example: automation to send a message and delete after a delay {% raw %} From 6ba51f4e89b6db6e9c6acebf93a289974429c06e Mon Sep 17 00:00:00 2001 From: Manu <4445816+tr4nt0r@users.noreply.github.com> Date: Mon, 10 Feb 2025 08:34:28 +0100 Subject: [PATCH 024/118] Improve Bring! integration documentation (#37340) * Improve Bring! integration documentation * bad gateway, custom polling * add social login howto * tiny style tweak --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/bring.markdown | 123 +++++++++++++++++++++++++++- 1 file changed, 119 insertions(+), 4 deletions(-) diff --git a/source/_integrations/bring.markdown b/source/_integrations/bring.markdown index 5fb91fe3422..22db60b2ec7 100644 --- a/source/_integrations/bring.markdown +++ b/source/_integrations/bring.markdown @@ -26,12 +26,43 @@ related: title: Bring! --- -The **Bring!** integration allows you to interact with your [Bring!](https://www.getbring.com/) shopping lists within Home Assistant. +The **Bring!** integration allows you to sync your [Bring!](https://www.getbring.com/) shopping lists with Home Assistant. -For authentication, the integration requires the `email` and `password` you used for your Bring! account. If you want to automatically receive notifications via the Bring! app when Home Assistant adds or removes an item from the list, you should use a dedicated account (such as `email: your.name+ha@gmail.com`) to connect Home Assistant with [Bring!](https://www.getbring.com/). +## About Bring! + +**Bring!** is a grocery shopping list app that allows users to create shared lists and organize grocery shopping with family, partners, or roommates. + +Available as a mobile app on [Google Play for Android](https://play.google.com/store/apps/details?id=ch.publisheria.bring) and the [App Store for iOS](https://itunes.apple.com/app/apple-store/id580669177). **Bring!** also offers a web version at [web.getbring.com](https://web.getbring.com). + +## How you can use this integration + +- **Automated notifications:** Receive alerts on your phone when essential items are added to your list or when the quantity of items reaches a set value. +- **List updates based on events:** Automatically add items to your shopping list when appliances are low on supplies, like dishwasher salt, or need routine maintenance, such as tub cleaner for the washer. +- **Voice control:** Use voice assistants connected to Home Assistant to add items to your **Bring!** list. +- **Geofencing:** Receive reminders when you are near a specific store and need to pick up items, based on your location. + +## Prerequisites + +For authentication, the integration requires the `email` and `password` of your **Bring!** account. If you don’t have an account, you can sign up via the mobile app or the web version. + +If you signed up using **Apple ID**, **Google Sign-in**, or **Facebook Login**, you will need to create a password to use the integration. + +- On mobile: Open the Bring! app and go to **Profile** > **More settings** > **Change password**. +- On the web: Visit **Settings** > **Reset password** or go directly to [Reset Password](https://web.getbring.com/app/settings/resetpassword). + +You can still log in with your existing authentication method afterward. {% include integrations/config_flow.md %} +### Configuration parameters + +{% configuration_basic %} +Email: + description: "The email address associated with your Bring! account." +Password: + description: "The password to log in to your Bring! account." +{% endconfiguration_basic %} + ## Sensors - **Urgent:** Shows the number of items tagged with the **Urgent** badge on the shopping list. Completed items are excluded. @@ -46,13 +77,17 @@ You can use the actions from the [to-do list](/integrations/todo/) to create, up ### Notifications -The **Bring** integration offers an action to send push notifications to the Bring! mobile apps of other members of a shared shopping list. The Bring! mobile app has 4 predefined notification types. Note: If you want to receive these notifications yourself, you need to use a dedicated account as mentioned above. +The **Bring!** integration offers an action to send push notifications to the Bring! mobile apps of other members of a shared shopping list. The Bring! mobile app has 4 predefined notification types. + +{% note %} +If you want to receive these notifications, you must use a dedicated account, as outlined in the [known limitations](#known-limitations). +{% endnote %} | Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- | | `target` | no | Target Bring! list(s) whose members should be notified. | | `message` | no | Type of push notification to send to list members. See [Notification types](#available-notification-types). | -| `item` | yes | **Required for `urgent_message`.** Article name to include in the message. For example: *Urgent Message - Please buy cilantro urgently*. | +| `item` | yes | Required for `urgent_message`. Article name to include in the message. For example: *Urgent Message - Please buy cilantro urgently*. | ### Available notification types @@ -89,3 +124,83 @@ actions: message: urgent_message item: Cilantro ``` + +## Automations + +Get started with these automation examples for **Bring!**, each featuring ready-to-use blueprints! + +### Grocery shopping reminder 🛒 + +Get notified when it's time to go grocery shopping. A notification is sent when your shopping list reaches a set threshold or when urgent items are added. + +{% my blueprint_import badge blueprint_url="https://community.home-assistant.io/t/bring-grocery-shopping-reminder/843123" %} + +{% details "Example YAML configuration" %} + +{% raw %} + +```yaml +triggers: + - trigger: numeric_state + entity_id: todo.shopping_list + above: 10 + id: shopping list too long + - trigger: numeric_state + entity_id: sensor.shopping_list_urgent + above: 0 + id: shopping is urgent +actions: + - choose: + - conditions: + - condition: trigger + id: shopping list too long + sequence: + - action: + - action: notify.notify + data: + message: >- + The list is getting long, plan a trip to the grocery shop in + the next days + title: Shopping needed soon 🛒 + - conditions: + - condition: trigger + id: shopping is urgent + sequence: + - action: + - action: notify.notify + data: + title: 🚨 Time to go shopping! 🛒 + message: Urgent groceries needed! Grab your shopping bag and go! + - delay: + hours: 1 +mode: single +alias: "Bring!: Grocery shopping reminder 🛒" +description: "Get notified when it's time to go grocery shopping. A notification is sent when your shopping list reaches a set threshold or when urgent items are added." +``` + +{% endraw %} + +{% enddetails %} + +## Data updates + +This integration syncs your lists by {% term polling %} the **Bring!** service every 90 seconds or immediately after an action is performed in Home Assistant, such as adding an item. If you prefer a less frequent update, **custom polling interval** can also be defined — see [Defining a custom polling interval](/common-tasks/general/#defining-a-custom-polling-interval) for details. + +## Known limitations + +- Changes made in Home Assistant are reflected instantly in the **Bring!** app, while changes in the Bring! app may be delayed by up to 90 seconds due to the polling interval. +- To receive push notifications in the **Bring!** app when items are added or removed in Home Assistant, or when triggered by the `bring.send_message` action, it is recommended to use a dedicated account (such as `email:name+ha@example.com`) when setting up the integration. + +## Troubleshooting + +The **Bring!** integration relies on an active internet connection to communicate with Bring!. If you encounter issues, verify that your network connection is stable. Additionally, the Bring! service itself may experience downtime, whether unexpected or due to scheduled maintenance. + +- A **502 - Bad Gateway** error (`aiohttp.client_exceptions.ClientResponseError: 502, message='Bad Gateway'`) is known to occur occasionally (1–2 times per day) but is usually temporary. The integration will retry automatically after 90 seconds, so there’s no need to take action. + +In any case, when reporting an issue, please enable [debug logging](/docs/configuration/troubleshooting/#debug-logs-and-diagnostics), restart the integration, and as soon as the issue reoccurs, stop the debug logging again (*download of debug log file will start automatically_). Further, if still possible, please also download the [diagnostics](/integrations/diagnostics) data. If you have collected the debug log and the diagnostics data, provide them with the issue report. + +## Remove integration + +This integration can be removed by following these steps: + +{% include integrations/remove_device_service.md %} From 4e7b0ae4bce554d90c755ecc2f5653cd1f0b4608 Mon Sep 17 00:00:00 2001 From: Brynley McDonald Date: Mon, 10 Feb 2025 21:52:39 +1300 Subject: [PATCH 025/118] Improve `flick_electric` documentation (#37388) * Improve flick_electric documentation * Fix grammar * Remove scale for now * tiny tweak * remove redundant fields in configuration_basic block * add abbreviation tooltip --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/flick_electric.markdown | 101 ++++++++++++++++++- 1 file changed, 99 insertions(+), 2 deletions(-) diff --git a/source/_integrations/flick_electric.markdown b/source/_integrations/flick_electric.markdown index c1e11e3fe44..91928e6309d 100644 --- a/source/_integrations/flick_electric.markdown +++ b/source/_integrations/flick_electric.markdown @@ -18,10 +18,107 @@ ha_integration_type: service {% include integrations/config_flow.md %} +{% configuration_basic %} +Username: + description: "Username used to log into Flick Electric." +Password: + description: "Password used to log into Flick Electric." +Client ID: + description: "Client ID to authenticate (see below note)." +Client Secret: + description: "Client Secret to authenticate (see below note)." +Account: + description: "Address of the account to add (required when user has multiple active accounts)." +{% endconfiguration_basic %} + {% note %} -The configuration uses the client ID and secret used by the app at the time of release. If this stops working, you can find the new ones by using a MITM proxy with the mobile app. The app will call `https://api.flick.energy/identity/oauth/token` with the `client_id` and `client_secret`. +For most users, Client ID/Secret can be left blank. -You can then use these values during the configuration. +Home Assistant by default uses the client ID and secret from the Flick Electric mobile app at the time of release. + +If this stops working, you can find the new ones by using a MITM proxy with the mobile app. The app will call `https://api.flick.energy/identity/oauth/token` with the `client_id` and `client_secret`. {% endnote %} + +## Supported functionality + +The integration provides a `sensor` entity with the power price for the current time interval. + +The attributes of the entity have a breakdown of the pricing components, such as `generation` and `network` charges. + +{% note %} + +The power price shown is in cents, and is *excluding GST*. You can customize this by creating a template sensor: + +1. Go to +{% my helpers title="**Settings** > **Devices** & **Services** > **Helpers**" %} and click the add button; +2. Choose the **{% my config_flow_start domain="template" title="Template" %}** option +3. Select **Add a template sensor**. + +{% raw %} + +To add GST: + +- **State template**: `{{ states.sensor.flick_power_price * 1.15 }}` +- **Unit of measurement**: `¢/kWh` + +To convert to dollars: + +- **State template**: `{{ states.sensor.flick_power_price / 100 }}` +- **Unit of measurement**: `$/kWh` + +{% endraw %} + +{% endnote %} + +## Use cases + +This integration can be used as part of an automation, for example to turn on/off appliances automatically. + +## Example automations + +{% details "Turn off the heat pump when price is above 40¢/kWH" %} + +{% raw %} + +```yaml +alias: "Turn off expensive heat pump" +description: "Turn off the heat pump when price is above 40¢/kWH" +triggers: + - trigger: numeric_state + entity_id: sensor.flick_power_price + above: 40 +actions: + - action: climate.turn_off + target: + entity_id: climate.heat_pump + data: {} +``` + +{% endraw %} +{% enddetails %} + +## Data updates + +The integration will {% term polling poll %} the Flick Electric API every 5 minutes to check for the current power price. You can also use the `homeassistant.update_entity` action to trigger a refresh on-demand. + +## Remove integration + +This integration follows standard integration removal, no extra steps are required. + +{% include integrations/remove_device_service.md %} + +## Troubleshooting + +{% details "Cannot get pricing for this account. Please check user permissions" %} + +API is unable to find pricing for the selected account. Check with Flick Electric to ensure that your user is configured correctly. + +{% enddetails %} + +{% details "No services are active on this Flick account" %} + +Only active accounts are supported by this integration. If your account is active but is not able to be selected, check with Flick Electric to ensure that it is showing as active in their system. + +{% enddetails %} From c42f5cbb0a70805e069916785b7dd98db917ee57 Mon Sep 17 00:00:00 2001 From: Manu <4445816+tr4nt0r@users.noreply.github.com> Date: Mon, 10 Feb 2025 15:31:28 +0100 Subject: [PATCH 026/118] Update notification texts in Bring (#37395) * Update notification texts in Bring * tiny tweak * revert tweak --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/bring.markdown | 32 +++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/source/_integrations/bring.markdown b/source/_integrations/bring.markdown index 22db60b2ec7..521fd29266e 100644 --- a/source/_integrations/bring.markdown +++ b/source/_integrations/bring.markdown @@ -83,20 +83,30 @@ The **Bring!** integration offers an action to send push notifications to the Br If you want to receive these notifications, you must use a dedicated account, as outlined in the [known limitations](#known-limitations). {% endnote %} -| Data attribute | Optional | Description | -| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- | -| `target` | no | Target Bring! list(s) whose members should be notified. | -| `message` | no | Type of push notification to send to list members. See [Notification types](#available-notification-types). | -| `item` | yes | Required for `urgent_message`. Article name to include in the message. For example: *Urgent Message - Please buy cilantro urgently*. | +| Data attribute | Optional | Description | +| ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | no | Target Bring! list(s) whose members should be notified. | +| `message` | no | Type of push notification to send to list members. See [Notification types](#available-notification-types). | +| `item` | yes | Required for `urgent_message`. Item to include in the message. For example: *Attention! Attention! - We still urgently need: Cilantro*. | + ### Available notification types -| Notification type | Text of notification | -| ----------------- | --------------------------------------------------- | -| going_shopping | I'm going shopping! - Last chance to make changes | -| changed_list | List updated - Take a look at the articles | -| shopping_done | Shopping done - The fridge is well stocked | -| urgent_message | Urgent Message - Please buy `Article name` urgently | +| Notification type | Name of notification | +| ----------------- | -------------------------------------------------------------- | +| going_shopping | I'm going shopping! - Last chance for adjustments | +| changed_list | I changed the list! - Take a look at the items | +| shopping_done | The shopping is done! - The fridge is well stocked | +| urgent_message | Attention! Attention! - We still urgently need: `[Items]` | + +{% note %} +The notification that list members receive differs from the label shown in the Bring! app. This variation depends not only on the recipient’s language settings but also on the sender's profile name. Additionally, notifications may change with new app updates. Here are some example notifications: + +- `name` is going shopping for "`shopping list name`"! Last chance to make changes +- `name` went shopping for "`shopping list name`"! The fridge is well stocked +- `name` updated the list "`shopping list name`"! Take a look at the articles +- Attention, something's missing! Please buy `item` urgently +{% endnote %} ### Sending a going shopping notification From 4a135b0c8703ef43c2af09042a9ae4bafc27784d Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Mon, 10 Feb 2025 15:33:08 +0100 Subject: [PATCH 027/118] badge visibility: add link to available conditions (#37396) --- source/_dashboards/conditional.markdown | 4 ++-- source/dashboards/badges.markdown | 3 ++- source/dashboards/cards.markdown | 9 +++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/source/_dashboards/conditional.markdown b/source/_dashboards/conditional.markdown index 7f6e891ffbb..c3db5117a0f 100644 --- a/source/_dashboards/conditional.markdown +++ b/source/_dashboards/conditional.markdown @@ -6,7 +6,7 @@ description: The Conditional card displays another card based on conditions. related: - docs: /dashboards/cards/ title: Dashboard cards - - docs: /dashboards/cards/#showing-or-hiding-a-card-conditionally + - docs: /dashboards/cards/#showing-or-hiding-a-card-or-badge-conditionally title: Conditional settings on the card's visibility tab --- @@ -17,7 +17,7 @@ The conditional card displays another card based on conditions. {% include dashboard/edit_dashboard.md %} Note that while editing the dashboard, the card will always be shown, so be sure to exit editing mode to test the conditions. -The conditional card can still be used. However, it is now possible to define a setting to show or hide a card conditionally directly on each card type, on its [Visibility](/dashboards/cards/#showing-or-hiding-a-card-conditionally) tab. +The conditional card can still be used. However, it is now possible to define a setting to show or hide a card conditionally directly on each card type, on its [Visibility](/dashboards/cards/#showing-or-hiding-a-card-or-badge-conditionally) tab. Most options for this card can be configured via the user interface. diff --git a/source/dashboards/badges.markdown b/source/dashboards/badges.markdown index 13a2673b1a9..3b775ea76f3 100644 --- a/source/dashboards/badges.markdown +++ b/source/dashboards/badges.markdown @@ -27,7 +27,8 @@ Badges are widgets that sit at the top of a panel, above all the cards. ![Screenshot showing how to configure a badge](/images/dashboards/badge_configure.png) 7. Under **Interactions**, you can define the tap behavior. -8. If you want this badge to be visible only to specific users or under a certain condition, open the **Visibility** tab to [define those conditions](/dashboards/cards/#showing-or-hiding-a-card-conditionally). +8. If you want this badge to be visible only to specific users or under a certain condition, open the **Visibility** tab to [define those conditions](/dashboards/cards/#showing-or-hiding-a-card-or-badge-conditionally). + - The [available conditions](/dashboards/conditional/#conditions-options) are the same as the ones for the conditional card. 9. Select **Save**.

diff --git a/source/dashboards/cards.markdown b/source/dashboards/cards.markdown index 77ff05d27eb..bfb3acccb34 100644 --- a/source/dashboards/cards.markdown +++ b/source/dashboards/cards.markdown @@ -53,7 +53,7 @@ A card can be added to a dashboard directly [from the view](#to-add-a-card-from- - Then, select **Continue**. ![Screenshot add cards by entity](/images/dashboards/dashboard_add-by-entity_02.png) -3. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#showing-or-hiding-a-card-conditionally). +3. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#showing-or-hiding-a-card-or-badge-conditionally). 4. If you are adding this card to a [sections view](/dashboards/sections/), on the **Layout** tab, you can [resize the card](#resizing-a-card). 5. If you like, define [card actions, features, header and footer widgets](#card-actions-features-header-and-footer-widgets). - Not all cards support these elements. Refer to the documentation of the specific card type. @@ -78,7 +78,7 @@ This method is useful if you are on the **Device** page and want to create a car ![Add to Dashboard button on the device page](/images/dashboards/add_card_from_device_page_02.png) 5. To edit the card configuration, open the view to which you added the card. - Select **Edit card**. -6. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#showing-or-hiding-a-card-conditionally). +6. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#showing-or-hiding-a-card-or-badge-conditionally). 7. If you are adding this card to a [sections view](/dashboards/sections/), on the **Layout** tab, you can [resize the card](#resizing-a-card). 8. If you like, define [card actions, features, header and footer widgets](#card-actions-features-header-and-footer-widgets). @@ -88,10 +88,11 @@ This method is useful if you are on the **Device** page and want to create a car You can choose to show or hide certain cards or [badges](/dashboards/badges/) based on different conditions. The [available conditions](/dashboards/conditional/#card-conditions) are the same as the ones for the conditional card. -1. On the **Visibility** tab, select **Add condition**. - - Don't see a **Visibility** tab? +1. On the **Visibility** tab, select **Add condition**./dashboards/conditional/#conditions-options + - **Troubleshooting**: Don't see a **Visibility** tab? - It is not available inside nested cards: vertical stack, horizontal stack, and grid card 2. Select the type of condition, and enter the parameters. + - The [available conditions](/dashboards/conditional/#conditions-options) are the same as the ones for the conditional card. - If you define multiple conditions, the section is only shown when all conditions are met. - If you did not define any conditions, the section is always shown, to all users. 3. Select **Save**. From 8630f9bfaa969929bd5135647bf59970b631eccc Mon Sep 17 00:00:00 2001 From: toppe <58138839+EvertJob@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:27:12 +0100 Subject: [PATCH 028/118] Update season.markdown (#37398) --- source/_integrations/season.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/season.markdown b/source/_integrations/season.markdown index 2e7907697d5..7e276a480fa 100644 --- a/source/_integrations/season.markdown +++ b/source/_integrations/season.markdown @@ -31,4 +31,4 @@ All information about how the seasons work was taken from Wikipedia: - [https://en.wikipedia.org/wiki/Equinox](https://en.wikipedia.org/wiki/Equinox) - [https://en.wikipedia.org/wiki/Solstice](https://en.wikipedia.org/wiki/Solstice) -To cut a long read short, Astronomical gives seasons based on the shortest/longest day and equinoxes. So in the Northern Hemisphere spring starts on 20 March). Meteorological gives seasons based on months (so in the Northern Hemisphere spring starts on 1 March). +To cut a long read short, Astronomical gives seasons based on the shortest/longest day and equinoxes. So in the Northern Hemisphere spring starts on 20 March. Meteorological gives seasons based on months (so in the Northern Hemisphere spring starts on 1 March). From 2e74958101cc098312490794cd3586011b2e287b Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Mon, 10 Feb 2025 18:48:07 +0000 Subject: [PATCH 029/118] Remove unused country code selection (#37397) --- source/_includes/custom/buy-dialog.html | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/source/_includes/custom/buy-dialog.html b/source/_includes/custom/buy-dialog.html index 09dd8245391..b23bd14a2f5 100644 --- a/source/_includes/custom/buy-dialog.html +++ b/source/_includes/custom/buy-dialog.html @@ -116,9 +116,6 @@ let tabContents = dialog.querySelectorAll('.ha-buy-dialog-tab-content'); let timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; let region = timezone.split('/')[0].toLowerCase(); - let locale = Intl.DateTimeFormat().resolvedOptions().locale; - let countryCode = locale.split('-')[1].toLowerCase(); - let defaultTab = dialog.querySelector(`.ha-buy-dialog-sidebar-tab[data-tab="#${region}"]`); if (defaultTab) { @@ -128,11 +125,6 @@ defaultTab.classList.add('active'); let tabContent = document.querySelector(defaultTab.getAttribute('data-tab')); tabContent.classList.add('active'); - - let country = tabContent.querySelector(`.ha-buy-dialog-distributor-country[data-code="${countryCode}"]`); - if (country) { - country.scrollIntoView({ behavior: 'instant', block: 'center' }); - } } } - \ No newline at end of file + From 51f4b65b6ef8ee1dba2a21a933772caf44d18c75 Mon Sep 17 00:00:00 2001 From: toppe <58138839+EvertJob@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:46:57 +0100 Subject: [PATCH 030/118] Update season.markdown (#37403) Removed the round brackets --- source/_integrations/season.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/season.markdown b/source/_integrations/season.markdown index 7e276a480fa..4e62f32fc17 100644 --- a/source/_integrations/season.markdown +++ b/source/_integrations/season.markdown @@ -31,4 +31,4 @@ All information about how the seasons work was taken from Wikipedia: - [https://en.wikipedia.org/wiki/Equinox](https://en.wikipedia.org/wiki/Equinox) - [https://en.wikipedia.org/wiki/Solstice](https://en.wikipedia.org/wiki/Solstice) -To cut a long read short, Astronomical gives seasons based on the shortest/longest day and equinoxes. So in the Northern Hemisphere spring starts on 20 March. Meteorological gives seasons based on months (so in the Northern Hemisphere spring starts on 1 March). +To cut a long read short, Astronomical gives seasons based on the shortest/longest day and equinoxes. So in the Northern Hemisphere spring starts on 20 March. Meteorological gives seasons based on months so in the Northern Hemisphere spring starts on 1 March. From 9c54d5a740cb2621c1bc75a6027e147142b20e55 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 10 Feb 2025 22:10:05 +0100 Subject: [PATCH 031/118] 2025.2.2 (#37404) --- _config.yml | 4 +- .../_posts/2025-02-05-release-20252.markdown | 86 +++++++++++++++++++ source/changelogs/core-2025.2.markdown | 85 ++++++++++++++++++ 3 files changed, 173 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 7e29127ea5b..9e8b8f1cb53 100644 --- a/_config.yml +++ b/_config.yml @@ -108,8 +108,8 @@ social: # Home Assistant release details current_major_version: 2025 current_minor_version: 2 -current_patch_version: 1 -date_released: 2025-02-07 +current_patch_version: 2 +date_released: 2025-02-10 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2025-02-05-release-20252.markdown b/source/_posts/2025-02-05-release-20252.markdown index 0297ca24271..460a5e94e08 100644 --- a/source/_posts/2025-02-05-release-20252.markdown +++ b/source/_posts/2025-02-05-release-20252.markdown @@ -73,6 +73,7 @@ _PS: It is almost Valentine's day, did you set up some romantic scenes yet? 🌹 - [Preparing our graphs for the future](#preparing-our-graphs-for-the-future) - [Patch releases](#patch-releases) - [2025.2.1 - February 7](#202521---february-7) + - [2025.2.2 - February 10](#202522---february-10) - [Need help? Join the community!](#need-help-join-the-community) - [Backward-incompatible changes](#backward-incompatible-changes) - [All changes](#all-changes) @@ -566,6 +567,91 @@ release every Friday. [@tr4nt0r]: https://github.com/tr4nt0r [@zweckj]: https://github.com/zweckj +### 2025.2.2 - February 10 + +- LaCrosse View new endpoint ([@IceBotYT] - [#137284]) +- Convert coinbase account amounts as floats to properly add them together ([@natekspencer] - [#137588]) +- Bump ohmepy to 1.2.9 ([@dan-r] - [#137695]) +- Bump onedrive_personal_sdk to 0.0.9 ([@zweckj] - [#137729]) +- Limit habitica ConfigEntrySelect to integration domain ([@cdce8p] - [#137767]) +- Limit nordpool ConfigEntrySelect to integration domain ([@cdce8p] - [#137768]) +- Limit transmission ConfigEntrySelect to integration domain ([@cdce8p] - [#137769]) +- Fix tplink child updates taking up to 60s ([@bdraco] - [#137782]) +- Call backup listener during setup in Google Drive ([@tronikos] - [#137789]) +- Use the external URL set in Settings > System > Network if my is disabled as redirect URL for Google Drive instructions ([@tronikos] - [#137791]) +- Fix manufacturer_id matching for 0 ([@patman15] - [#137802]) +- Fix DAB radio in Onkyo ([@arturpragacz] - [#137852]) +- Fix LG webOS TV fails to setup when device is off ([@thecode] - [#137870]) +- Fix heos migration ([@balloob] - [#137887]) +- Bump pydrawise to 2025.2.0 ([@dknowles2] - [#137961]) +- Bump aioshelly to version 12.4.2 ([@bieniu] - [#137986]) +- Prevent crash if telegram message failed and did not generate an ID ([@CloCkWeRX] - [#137989]) +- Bump habiticalib to v0.3.7 ([@tr4nt0r] - [#137993]) +- Refresh the nest authentication token on integration start before invoking the pub/sub subsciber ([@allenporter] - [#138003]) +- Use resumable uploads in Google Drive ([@tronikos] - [#138010]) +- Bump py-synologydsm-api to 2.6.2 ([@mib1185] - [#138060]) +- Handle generic agent exceptions when getting and deleting backups ([@abmantis] - [#138145]) +- Bump onedrive-personal-sdk to 0.0.10 ([@zweckj] - [#138186]) +- Keep one backup per backup agent when executing retention policy ([@emontnemery] - [#138189]) +- Improve inexogy logging when failed to update ([@jpbede] - [#138210]) +- Bump pyheos to v1.0.2 ([@andrewsayre] - [#138224]) +- Update frontend to 20250210.0 ([@bramkragten] - [#138227]) +- Bump lacrosse-view to 1.1.1 ([@IceBotYT] - [#137282]) + +[#137282]: https://github.com/home-assistant/core/pull/137282 +[#137284]: https://github.com/home-assistant/core/pull/137284 +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137588]: https://github.com/home-assistant/core/pull/137588 +[#137688]: https://github.com/home-assistant/core/pull/137688 +[#137695]: https://github.com/home-assistant/core/pull/137695 +[#137729]: https://github.com/home-assistant/core/pull/137729 +[#137767]: https://github.com/home-assistant/core/pull/137767 +[#137768]: https://github.com/home-assistant/core/pull/137768 +[#137769]: https://github.com/home-assistant/core/pull/137769 +[#137782]: https://github.com/home-assistant/core/pull/137782 +[#137789]: https://github.com/home-assistant/core/pull/137789 +[#137791]: https://github.com/home-assistant/core/pull/137791 +[#137802]: https://github.com/home-assistant/core/pull/137802 +[#137852]: https://github.com/home-assistant/core/pull/137852 +[#137870]: https://github.com/home-assistant/core/pull/137870 +[#137887]: https://github.com/home-assistant/core/pull/137887 +[#137961]: https://github.com/home-assistant/core/pull/137961 +[#137986]: https://github.com/home-assistant/core/pull/137986 +[#137989]: https://github.com/home-assistant/core/pull/137989 +[#137993]: https://github.com/home-assistant/core/pull/137993 +[#138003]: https://github.com/home-assistant/core/pull/138003 +[#138010]: https://github.com/home-assistant/core/pull/138010 +[#138060]: https://github.com/home-assistant/core/pull/138060 +[#138145]: https://github.com/home-assistant/core/pull/138145 +[#138186]: https://github.com/home-assistant/core/pull/138186 +[#138189]: https://github.com/home-assistant/core/pull/138189 +[#138210]: https://github.com/home-assistant/core/pull/138210 +[#138224]: https://github.com/home-assistant/core/pull/138224 +[#138227]: https://github.com/home-assistant/core/pull/138227 +[@CloCkWeRX]: https://github.com/CloCkWeRX +[@IceBotYT]: https://github.com/IceBotYT +[@abmantis]: https://github.com/abmantis +[@allenporter]: https://github.com/allenporter +[@andrewsayre]: https://github.com/andrewsayre +[@arturpragacz]: https://github.com/arturpragacz +[@balloob]: https://github.com/balloob +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@bramkragten]: https://github.com/bramkragten +[@cdce8p]: https://github.com/cdce8p +[@dan-r]: https://github.com/dan-r +[@dknowles2]: https://github.com/dknowles2 +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@jpbede]: https://github.com/jpbede +[@mib1185]: https://github.com/mib1185 +[@natekspencer]: https://github.com/natekspencer +[@patman15]: https://github.com/patman15 +[@thecode]: https://github.com/thecode +[@tr4nt0r]: https://github.com/tr4nt0r +[@tronikos]: https://github.com/tronikos +[@zweckj]: https://github.com/zweckj + ## Need help? Join the community! Home Assistant has a great community of users who are all more than willing diff --git a/source/changelogs/core-2025.2.markdown b/source/changelogs/core-2025.2.markdown index a86608880ec..2ea7db94c6c 100644 --- a/source/changelogs/core-2025.2.markdown +++ b/source/changelogs/core-2025.2.markdown @@ -1443,6 +1443,91 @@ For a summary in a more readable format: [@tr4nt0r]: https://github.com/tr4nt0r [@zweckj]: https://github.com/zweckj +## Release 2025.2.2 - February 10 + +- LaCrosse View new endpoint ([@IceBotYT] - [#137284]) +- Convert coinbase account amounts as floats to properly add them together ([@natekspencer] - [#137588]) +- Bump ohmepy to 1.2.9 ([@dan-r] - [#137695]) +- Bump onedrive_personal_sdk to 0.0.9 ([@zweckj] - [#137729]) +- Limit habitica ConfigEntrySelect to integration domain ([@cdce8p] - [#137767]) +- Limit nordpool ConfigEntrySelect to integration domain ([@cdce8p] - [#137768]) +- Limit transmission ConfigEntrySelect to integration domain ([@cdce8p] - [#137769]) +- Fix tplink child updates taking up to 60s ([@bdraco] - [#137782]) +- Call backup listener during setup in Google Drive ([@tronikos] - [#137789]) +- Use the external URL set in Settings > System > Network if my is disabled as redirect URL for Google Drive instructions ([@tronikos] - [#137791]) +- Fix manufacturer_id matching for 0 ([@patman15] - [#137802]) +- Fix DAB radio in Onkyo ([@arturpragacz] - [#137852]) +- Fix LG webOS TV fails to setup when device is off ([@thecode] - [#137870]) +- Fix heos migration ([@balloob] - [#137887]) +- Bump pydrawise to 2025.2.0 ([@dknowles2] - [#137961]) +- Bump aioshelly to version 12.4.2 ([@bieniu] - [#137986]) +- Prevent crash if telegram message failed and did not generate an ID ([@CloCkWeRX] - [#137989]) +- Bump habiticalib to v0.3.7 ([@tr4nt0r] - [#137993]) +- Refresh the nest authentication token on integration start before invoking the pub/sub subsciber ([@allenporter] - [#138003]) +- Use resumable uploads in Google Drive ([@tronikos] - [#138010]) +- Bump py-synologydsm-api to 2.6.2 ([@mib1185] - [#138060]) +- Handle generic agent exceptions when getting and deleting backups ([@abmantis] - [#138145]) +- Bump onedrive-personal-sdk to 0.0.10 ([@zweckj] - [#138186]) +- Keep one backup per backup agent when executing retention policy ([@emontnemery] - [#138189]) +- Improve inexogy logging when failed to update ([@jpbede] - [#138210]) +- Bump pyheos to v1.0.2 ([@andrewsayre] - [#138224]) +- Update frontend to 20250210.0 ([@bramkragten] - [#138227]) +- Bump lacrosse-view to 1.1.1 ([@IceBotYT] - [#137282]) + +[#137282]: https://github.com/home-assistant/core/pull/137282 +[#137284]: https://github.com/home-assistant/core/pull/137284 +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137588]: https://github.com/home-assistant/core/pull/137588 +[#137688]: https://github.com/home-assistant/core/pull/137688 +[#137695]: https://github.com/home-assistant/core/pull/137695 +[#137729]: https://github.com/home-assistant/core/pull/137729 +[#137767]: https://github.com/home-assistant/core/pull/137767 +[#137768]: https://github.com/home-assistant/core/pull/137768 +[#137769]: https://github.com/home-assistant/core/pull/137769 +[#137782]: https://github.com/home-assistant/core/pull/137782 +[#137789]: https://github.com/home-assistant/core/pull/137789 +[#137791]: https://github.com/home-assistant/core/pull/137791 +[#137802]: https://github.com/home-assistant/core/pull/137802 +[#137852]: https://github.com/home-assistant/core/pull/137852 +[#137870]: https://github.com/home-assistant/core/pull/137870 +[#137887]: https://github.com/home-assistant/core/pull/137887 +[#137961]: https://github.com/home-assistant/core/pull/137961 +[#137986]: https://github.com/home-assistant/core/pull/137986 +[#137989]: https://github.com/home-assistant/core/pull/137989 +[#137993]: https://github.com/home-assistant/core/pull/137993 +[#138003]: https://github.com/home-assistant/core/pull/138003 +[#138010]: https://github.com/home-assistant/core/pull/138010 +[#138060]: https://github.com/home-assistant/core/pull/138060 +[#138145]: https://github.com/home-assistant/core/pull/138145 +[#138186]: https://github.com/home-assistant/core/pull/138186 +[#138189]: https://github.com/home-assistant/core/pull/138189 +[#138210]: https://github.com/home-assistant/core/pull/138210 +[#138224]: https://github.com/home-assistant/core/pull/138224 +[#138227]: https://github.com/home-assistant/core/pull/138227 +[@CloCkWeRX]: https://github.com/CloCkWeRX +[@IceBotYT]: https://github.com/IceBotYT +[@abmantis]: https://github.com/abmantis +[@allenporter]: https://github.com/allenporter +[@andrewsayre]: https://github.com/andrewsayre +[@arturpragacz]: https://github.com/arturpragacz +[@balloob]: https://github.com/balloob +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@bramkragten]: https://github.com/bramkragten +[@cdce8p]: https://github.com/cdce8p +[@dan-r]: https://github.com/dan-r +[@dknowles2]: https://github.com/dknowles2 +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@jpbede]: https://github.com/jpbede +[@mib1185]: https://github.com/mib1185 +[@natekspencer]: https://github.com/natekspencer +[@patman15]: https://github.com/patman15 +[@thecode]: https://github.com/thecode +[@tr4nt0r]: https://github.com/tr4nt0r +[@tronikos]: https://github.com/tronikos +[@zweckj]: https://github.com/zweckj + [#112047]: https://github.com/home-assistant/core/pull/112047 [#121522]: https://github.com/home-assistant/core/pull/121522 [#121548]: https://github.com/home-assistant/core/pull/121548 From 8b7a697f080145a3c32c81b17f0a3778e5da0cbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 07:35:45 +0100 Subject: [PATCH 032/118] build(deps-dev): bump json from 2.9.1 to 2.10.1 (#37412) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b99c9456921..e9100e44e61 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -70,7 +70,7 @@ GEM nokogiri (~> 1.12) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.9.1) + json (2.10.1) kramdown (2.5.1) rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) From ee310330608d72c6698b5e000ade09970ae8354f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 07:42:54 +0100 Subject: [PATCH 033/118] build(deps-dev): bump ruby-lsp from 0.23.9 to 0.23.10 (#37411) --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index d9097da97d7..8a650302f97 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ group :development do gem 'sassc', '2.1.0' gem 'sass-embedded', '1.83.4' gem 'rubocop', '1.71.2' - gem 'ruby-lsp', '0.23.9' + gem 'ruby-lsp', '0.23.10' gem 'rackup', '2.2.1' end diff --git a/Gemfile.lock b/Gemfile.lock index e9100e44e61..6b70d6e867a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -130,7 +130,7 @@ GEM unicode-display_width (>= 2.4.0, < 4.0) rubocop-ast (1.38.0) parser (>= 3.3.1.0) - ruby-lsp (0.23.9) + ruby-lsp (0.23.10) language_server-protocol (~> 3.17.0) prism (>= 1.2, < 2.0) rbs (>= 3, < 4) @@ -183,7 +183,7 @@ DEPENDENCIES rackup (= 2.2.1) rake (= 13.2.1) rubocop (= 1.71.2) - ruby-lsp (= 0.23.9) + ruby-lsp (= 0.23.10) sass-embedded (= 1.83.4) sass-globbing (= 1.1.5) sassc (= 2.1.0) From 42a45dc6748606faf0ef269be123dafef7d89452 Mon Sep 17 00:00:00 2001 From: Brett Adams Date: Tue, 11 Feb 2025 16:51:27 +1000 Subject: [PATCH 034/118] Update tesla_fleet.markdown (#37410) --- source/_integrations/tesla_fleet.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_integrations/tesla_fleet.markdown b/source/_integrations/tesla_fleet.markdown index d4f908e740e..a8fa085ce8f 100644 --- a/source/_integrations/tesla_fleet.markdown +++ b/source/_integrations/tesla_fleet.markdown @@ -123,7 +123,7 @@ The following steps involve sensitive credentials. Never share your `Client Secr 3. The CURL request should return a response that looks something like: ```json - {"access_token":"JSON_WEB_TOKEN","expires_in":28800,"token_type":"Bearer"} + {"access_token":"ACCESS_TOKEN","expires_in":28800,"token_type":"Bearer"} ``` This is your access token. Copy everything between the double-quotes to be used next. @@ -132,14 +132,14 @@ The following steps involve sensitive credentials. Never share your `Client Secr ```shell curl --location 'https://fleet-api.prd.na.vn.cloud.tesla.com/api/1/partner_accounts' \ --header 'Content-Type: application/json' \ - --header 'Authorization: Bearer JSON_WEB_TOKEN' \ + --header 'Authorization: Bearer ACCESS_TOKEN' \ --data '{ "domain": "my.domain.com" }' ``` - If you had to change the `AUDIENCE` URL for your region in step 2, update the main domain of the `--location` arg. - - Replace `LONG_GIBBERISH_ACCESS_TOKEN_STRING` with the access token that you copied in the previous step. + - Replace `ACCESS_TOKEN` with the access token that you copied in the previous step. - In the `domain:` line, enter your domain without the leading `https://` and the trailing `/`. 5. You should see a response that contains information about your Tesla Fleet developer app, pricing info, and such. This confirms that the Tesla Fleet API has successfully registered your developer application as a partner. The hard part is over. @@ -165,7 +165,7 @@ When connecting your Tesla account to Home Assistant, you **must** select at lea Previously, Tesla restricted this integration to a very modest rate limit. However, from January 2025, accounts in eligible countries will be charged for every API call. Here's what you need to know: -- Tesla provides a $10 credit per developer account per calendar month +- Tesla provides a USD$10 credit per developer account per calendar month - Every vehicle coordinator refresh, vehicle command, and wake up has a cost - This credit only allows for a maximum of 5000 coordinator refreshes - Energy product APIs are free to use at this time From 73148cb2f37904c8ed2f914cb850c5cd23c50236 Mon Sep 17 00:00:00 2001 From: G1z Date: Tue, 11 Feb 2025 08:09:04 +0100 Subject: [PATCH 035/118] Example correction (#37406) --- source/_integrations/foscam.markdown | 56 ++++++++++++++++------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/source/_integrations/foscam.markdown b/source/_integrations/foscam.markdown index 00a7c6911a7..905a7c3a2bf 100644 --- a/source/_integrations/foscam.markdown +++ b/source/_integrations/foscam.markdown @@ -73,10 +73,11 @@ elements: right: 25px bottom: 50px tap_action: - action: call-service - action: foscam.ptz - data: + action: perform-action + perform_action: foscam.ptz + target: entity_id: camera.bedroom + data: movement: up - type: icon icon: "mdi:arrow-down" @@ -85,10 +86,11 @@ elements: right: 25px bottom: 0px tap_action: - action: call-service - action: foscam.ptz - data: + action: perform-action + perform_action: foscam.ptz + target: entity_id: camera.bedroom + data: movement: down - type: icon icon: "mdi:arrow-left" @@ -97,10 +99,11 @@ elements: right: 50px bottom: 25px tap_action: - action: call-service - action: foscam.ptz - data: + action: perform-action + perform_action: foscam.ptz + target: entity_id: camera.bedroom + data: movement: left - type: icon icon: "mdi:arrow-right" @@ -109,10 +112,11 @@ elements: right: 0px bottom: 25px tap_action: - action: call-service - action: foscam.ptz - data: + action: perform-action + perform_action: foscam.ptz + target: entity_id: camera.bedroom + data: movement: right - type: icon icon: "mdi:arrow-top-left" @@ -121,10 +125,11 @@ elements: right: 50px bottom: 50px tap_action: - action: call-service - action: foscam.ptz - data: + action: perform-action + perform_action: foscam.ptz + target: entity_id: camera.bedroom + data: movement: top_left - type: icon icon: "mdi:arrow-top-right" @@ -133,10 +138,11 @@ elements: right: 0px bottom: 50px tap_action: - action: call-service - action: foscam.ptz - data: + action: perform-action + perform_action: foscam.ptz + target: entity_id: camera.bedroom + data: movement: top_right - type: icon icon: "mdi:arrow-bottom-left" @@ -145,10 +151,11 @@ elements: right: 50px bottom: 0px tap_action: - action: call-service - action: foscam.ptz - data: + action: perform-action + perform_action: foscam.ptz + target: entity_id: camera.bedroom + data: movement: bottom_left - type: icon icon: "mdi:arrow-bottom-right" @@ -157,10 +164,11 @@ elements: right: 0px bottom: 0px tap_action: - action: call-service - action: foscam.ptz - data: + action: perform-action + perform_action: foscam.ptz + target: entity_id: camera.bedroom + data: movement: bottom_right ``` From 3f4e9f4a2a1dd855aac6a00958be917ee1fda4ee Mon Sep 17 00:00:00 2001 From: Tom Barrett <43373700+tjb36@users.noreply.github.com> Date: Tue, 11 Feb 2025 07:54:45 +0000 Subject: [PATCH 036/118] Update shopping_list.markdown (#37405) Added documentation of the "remove" action which is present in the shopping_list_updated event that is fired when an item is removed from the list. This was not present before (only add and update were). --- source/_integrations/shopping_list.markdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/_integrations/shopping_list.markdown b/source/_integrations/shopping_list.markdown index c1a29b36a8d..a11622daa5f 100644 --- a/source/_integrations/shopping_list.markdown +++ b/source/_integrations/shopping_list.markdown @@ -80,13 +80,13 @@ Sort all items by name in the shopping list. A `shopping_list_updated` event is triggered when items in the list are modified, with the following data payload attached to it. This can be used to trigger automations such as sending a push notification when someone adds an item to the shopping list, which when clicked, will open the list. -| Data payload attribute | Description | -| ---------------------- | ------------------------------------------------------------------------------------------------------------------ | -| `action` | What action was taken on the item. Either `add` for a new item being added, or `update` for an item being updated. | -| `item` | A dictionary containing details of the item that was updated. | -| `item.id` | A unique ID for this item | -| `item.name` | The text attached to the item, for example `Milk` | -| `item.complete` | A boolean indicated whether the item has been marked as complete. | +| Data payload attribute | Description | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `action` | What action was taken on the item. Either `add` for a new item being added, `update` for an item being updated, or `remove` for an item being removed. | +| `item` | A dictionary containing details of the item that was updated. | +| `item.id` | A unique ID for this item | +| `item.name` | The text attached to the item, for example `Milk` | +| `item.complete` | A boolean indicated whether the item has been marked as complete. | {% raw %} From af75faf226340adade2792ccc9f02509cff4be1b Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:41:45 +0100 Subject: [PATCH 037/118] motionEye: update tap action keywords in example (#37413) - to reflect current software - using keywords as described in https://www.home-assistant.io/dashboards/actions/#action --- source/_integrations/motioneye.markdown | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/_integrations/motioneye.markdown b/source/_integrations/motioneye.markdown index f3d00f908b7..f686d006377 100644 --- a/source/_integrations/motioneye.markdown +++ b/source/_integrations/motioneye.markdown @@ -301,32 +301,32 @@ A dashboard card with icons that will call the `action` action to send action co - entity: camera.living_room icon: "mdi:arrow-left" tap_action: - action: call-service - action: motioneye.action + action: perform-action + perform_action: motioneye.action data: action: left entity_id: camera.living_room - entity: camera.living_room icon: "mdi:arrow-right" tap_action: - action: call-service - action: motioneye.action + action: perform-action + perform_action: motioneye.action data: action: right entity_id: camera.living_room - entity: camera.living_room icon: "mdi:arrow-up" tap_action: - action: call-service - action: motioneye.action + action: perform-action + perform_action: motioneye.action data: action: up entity_id: camera.living_room - entity: camera.living_room icon: "mdi:arrow-down" tap_action: - action: call-service - action: motioneye.action + action: perform-action + perform_action: motioneye.action data: action: down entity_id: camera.living_room From d997840effdd4e1ddcb9f4ea29f2a51172c7e10c Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:45:56 +0100 Subject: [PATCH 038/118] Rpi imager: move link to image download into procedure (#37419) --- source/installation/raspberrypi.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/installation/raspberrypi.markdown b/source/installation/raspberrypi.markdown index 15f64a8990f..51408e31c81 100644 --- a/source/installation/raspberrypi.markdown +++ b/source/installation/raspberrypi.markdown @@ -29,11 +29,10 @@ Remember to ensure you're using an [appropriate power supply](https://www.raspbe This guide shows how to install the {% term "Home Assistant Operating System" %} onto your Raspberry Pi using Raspberry Pi Imager. -If Raspberry Pi Imager is not supported by your platform, you can [download the Home Assistant image](#downloading-the-home-assistant-image) and use another imaging tool. - ### Write the image to your SD card 1. Download and install the Raspberry Pi Imager on your computer as described under [https://www.raspberrypi.com/software/](https://www.raspberrypi.com/software/). + - **Troubleshooting**: If Raspberry Pi Imager is not supported by your platform, you can [download the Home Assistant image](#downloading-the-home-assistant-image) and use another imaging tool, such as Balena Etcher. 2. Open the Raspberry Pi Imager and select your Raspberry Pi device. ![Open Raspberry Pi Imager](/images/installation/rpi_imager_start.png) 3. Choose the operating system: From 1a208530906df970bd283a0a7f74ad6372a2afeb Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 12 Feb 2025 02:05:17 +0100 Subject: [PATCH 039/118] Fix link to release notes from 2025.1 changelogs (#37426) --- source/changelogs/core-2025.1.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/changelogs/core-2025.1.markdown b/source/changelogs/core-2025.1.markdown index 313fa9450e8..365e0b9d505 100644 --- a/source/changelogs/core-2025.1.markdown +++ b/source/changelogs/core-2025.1.markdown @@ -7,7 +7,7 @@ replace_regex: \s\(\[?[a-z0-9\-\s_]+\]?\)$ These are all the changes included in the Home Assistant Core 2025.1 release. For a summary in a more readable format: -[Release notes blog for this release](/blog/2024/01/03/release-20251/). +[Release notes blog for this release](/blog/2025/01/03/release-20251/). - Bump version to 2025.1.0dev0 ([@cdce8p] - [#131751]) - Remove unreachable code in Habitica ([@tr4nt0r] - [#131778]) From 9b325964477ad07c2e8820927a7067c11cfd08a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 08:03:29 +0100 Subject: [PATCH 040/118] build(deps): bump rack from 3.1.9 to 3.1.10 (#37428) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6b70d6e867a..e5cebaba5c7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -98,7 +98,7 @@ GEM prism (1.3.0) public_suffix (6.0.1) racc (1.8.1) - rack (3.1.9) + rack (3.1.10) rack-protection (4.1.1) base64 (>= 0.1.0) logger (>= 1.6.0) From fa7b22d3f71af4b5a45aee0e3af08f5f77168075 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 08:03:47 +0100 Subject: [PATCH 041/118] build(deps-dev): bump sorbet-runtime from 0.5.11813 to 0.5.11820 (#37429) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index e5cebaba5c7..bafe693b99f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -156,7 +156,7 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11813) + sorbet-runtime (0.5.11820) stringex (2.8.6) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) From dcbbc5fb47ac305d477f6eca5dd68f576980563b Mon Sep 17 00:00:00 2001 From: Jonas Fors Lellky Date: Wed, 12 Feb 2025 08:18:26 +0100 Subject: [PATCH 042/118] Update flexit_bacnet docs with removal instructions (#37420) --- source/_integrations/flexit_bacnet.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/_integrations/flexit_bacnet.markdown b/source/_integrations/flexit_bacnet.markdown index 93b87944f5e..731d651064c 100644 --- a/source/_integrations/flexit_bacnet.markdown +++ b/source/_integrations/flexit_bacnet.markdown @@ -91,3 +91,9 @@ If you need to shut down the unit, make sure to take all necessary precautions, Furthermore, Flexit recommends unplugging the unit from the power socket before replacing a filter. To prevent damage, always initiate a controlled shutdown from the control panel (or, in the future, from an action in Home Assistant) before unplugging the device. {% include integrations/config_flow.md %} + +## Removing the integration + +This integration follows standard integration removal. No extra steps are required. + +{% include integrations/remove_device_service.md %} From 419e08b90ca0d6e9caaf51381a1b8667d167e35a Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Wed, 12 Feb 2025 11:36:08 +0100 Subject: [PATCH 043/118] Fix small typo in Shelly docs (#37431) --- source/_integrations/shelly.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown index 4f601660591..68de4530b87 100644 --- a/source/_integrations/shelly.markdown +++ b/source/_integrations/shelly.markdown @@ -85,7 +85,7 @@ Integration is communicating directly with the device; cloud connection is not n ## Bluetooth Support -Shelly generation 2+ devices not battery-powered can act as a Bluetooth proxy for advertisements. Active or passive listening can be enabled in the options flow. +Shelly generation 2+ devices that are not battery-powered can act as a Bluetooth proxy for advertisements. Active or passive listening can be enabled in the options flow. {% include integrations/option_flow.md %} From c2e792e7c3b9e2df68c460f8d6edaf4ee601c4af Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 12 Feb 2025 20:46:52 +0100 Subject: [PATCH 044/118] 2025.2.3 (#37433) --- _config.yml | 4 +- .../_posts/2025-02-05-release-20252.markdown | 52 +++++++++++++++++++ source/changelogs/core-2025.2.markdown | 51 ++++++++++++++++++ 3 files changed, 105 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 9e8b8f1cb53..848dd34a79a 100644 --- a/_config.yml +++ b/_config.yml @@ -108,8 +108,8 @@ social: # Home Assistant release details current_major_version: 2025 current_minor_version: 2 -current_patch_version: 2 -date_released: 2025-02-10 +current_patch_version: 3 +date_released: 2025-02-12 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2025-02-05-release-20252.markdown b/source/_posts/2025-02-05-release-20252.markdown index 460a5e94e08..a450b0b2902 100644 --- a/source/_posts/2025-02-05-release-20252.markdown +++ b/source/_posts/2025-02-05-release-20252.markdown @@ -74,6 +74,7 @@ _PS: It is almost Valentine's day, did you set up some romantic scenes yet? 🌹 - [Patch releases](#patch-releases) - [2025.2.1 - February 7](#202521---february-7) - [2025.2.2 - February 10](#202522---february-10) + - [2025.2.3 - February 12](#202523---february-12) - [Need help? Join the community!](#need-help-join-the-community) - [Backward-incompatible changes](#backward-incompatible-changes) - [All changes](#all-changes) @@ -652,6 +653,57 @@ release every Friday. [@tronikos]: https://github.com/tronikos [@zweckj]: https://github.com/zweckj +### 2025.2.3 - February 12 + +- Bump hass-nabucasa from 0.88.1 to 0.89.0 ([@ludeeus] - [#137321]) +- Move cloud backup upload/download handlers to lib ([@ludeeus] - [#137416]) +- Handle non-retryable errors when uploading cloud backup ([@ludeeus] - [#137517]) +- Add missing thermostat state EMERGENCY_HEAT to econet ([@jdanders] - [#137623]) +- Fix broken issue creation in econet ([@jdanders] - [#137773]) +- Fix version extraction for APsystems ([@alfwro13] - [#138023]) +- Refresh nest access token before before building subscriber Credentials ([@allenporter] - [#138259]) +- Fix BackupManager.async_delete_backup ([@emontnemery] - [#138286]) +- Fix next authentication token error handling ([@allenporter] - [#138299]) +- Bump pyenphase to 1.25.1 ([@catsmanac] - [#138327]) +- Bump sentry-sdk to 1.45.1 ([@edenhaus] - [#138349]) +- Bump zeroconf to 0.144.1 ([@bdraco] - [#138353]) +- Bump cryptography to 44.0.1 ([@edenhaus] - [#138371]) +- Fix tplink iot strip sensor refresh ([@sdb9696] - [#138375]) +- Bump deebot-client to 12.1.0 ([@edenhaus] - [#138382]) +- Bump hass-nabucasa from 0.89.0 to 0.90.0 ([@emontnemery] - [#138387]) +- Update cloud backup agent to use calculate_b64md5 from lib ([@emontnemery] - [#138391]) + +[#137321]: https://github.com/home-assistant/core/pull/137321 +[#137416]: https://github.com/home-assistant/core/pull/137416 +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137517]: https://github.com/home-assistant/core/pull/137517 +[#137623]: https://github.com/home-assistant/core/pull/137623 +[#137688]: https://github.com/home-assistant/core/pull/137688 +[#137773]: https://github.com/home-assistant/core/pull/137773 +[#138023]: https://github.com/home-assistant/core/pull/138023 +[#138231]: https://github.com/home-assistant/core/pull/138231 +[#138259]: https://github.com/home-assistant/core/pull/138259 +[#138286]: https://github.com/home-assistant/core/pull/138286 +[#138299]: https://github.com/home-assistant/core/pull/138299 +[#138327]: https://github.com/home-assistant/core/pull/138327 +[#138349]: https://github.com/home-assistant/core/pull/138349 +[#138353]: https://github.com/home-assistant/core/pull/138353 +[#138371]: https://github.com/home-assistant/core/pull/138371 +[#138375]: https://github.com/home-assistant/core/pull/138375 +[#138382]: https://github.com/home-assistant/core/pull/138382 +[#138387]: https://github.com/home-assistant/core/pull/138387 +[#138391]: https://github.com/home-assistant/core/pull/138391 +[@alfwro13]: https://github.com/alfwro13 +[@allenporter]: https://github.com/allenporter +[@bdraco]: https://github.com/bdraco +[@catsmanac]: https://github.com/catsmanac +[@edenhaus]: https://github.com/edenhaus +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@jdanders]: https://github.com/jdanders +[@ludeeus]: https://github.com/ludeeus +[@sdb9696]: https://github.com/sdb9696 + ## Need help? Join the community! Home Assistant has a great community of users who are all more than willing diff --git a/source/changelogs/core-2025.2.markdown b/source/changelogs/core-2025.2.markdown index 2ea7db94c6c..f708e7635e8 100644 --- a/source/changelogs/core-2025.2.markdown +++ b/source/changelogs/core-2025.2.markdown @@ -1528,6 +1528,57 @@ For a summary in a more readable format: [@tronikos]: https://github.com/tronikos [@zweckj]: https://github.com/zweckj +## Release 2025.2.3 - February 12 + +- Bump hass-nabucasa from 0.88.1 to 0.89.0 ([@ludeeus] - [#137321]) +- Move cloud backup upload/download handlers to lib ([@ludeeus] - [#137416]) +- Handle non-retryable errors when uploading cloud backup ([@ludeeus] - [#137517]) +- Add missing thermostat state EMERGENCY_HEAT to econet ([@jdanders] - [#137623]) +- Fix broken issue creation in econet ([@jdanders] - [#137773]) +- Fix version extraction for APsystems ([@alfwro13] - [#138023]) +- Refresh nest access token before before building subscriber Credentials ([@allenporter] - [#138259]) +- Fix BackupManager.async_delete_backup ([@emontnemery] - [#138286]) +- Fix next authentication token error handling ([@allenporter] - [#138299]) +- Bump pyenphase to 1.25.1 ([@catsmanac] - [#138327]) +- Bump sentry-sdk to 1.45.1 ([@edenhaus] - [#138349]) +- Bump zeroconf to 0.144.1 ([@bdraco] - [#138353]) +- Bump cryptography to 44.0.1 ([@edenhaus] - [#138371]) +- Fix tplink iot strip sensor refresh ([@sdb9696] - [#138375]) +- Bump deebot-client to 12.1.0 ([@edenhaus] - [#138382]) +- Bump hass-nabucasa from 0.89.0 to 0.90.0 ([@emontnemery] - [#138387]) +- Update cloud backup agent to use calculate_b64md5 from lib ([@emontnemery] - [#138391]) + +[#137321]: https://github.com/home-assistant/core/pull/137321 +[#137416]: https://github.com/home-assistant/core/pull/137416 +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137517]: https://github.com/home-assistant/core/pull/137517 +[#137623]: https://github.com/home-assistant/core/pull/137623 +[#137688]: https://github.com/home-assistant/core/pull/137688 +[#137773]: https://github.com/home-assistant/core/pull/137773 +[#138023]: https://github.com/home-assistant/core/pull/138023 +[#138231]: https://github.com/home-assistant/core/pull/138231 +[#138259]: https://github.com/home-assistant/core/pull/138259 +[#138286]: https://github.com/home-assistant/core/pull/138286 +[#138299]: https://github.com/home-assistant/core/pull/138299 +[#138327]: https://github.com/home-assistant/core/pull/138327 +[#138349]: https://github.com/home-assistant/core/pull/138349 +[#138353]: https://github.com/home-assistant/core/pull/138353 +[#138371]: https://github.com/home-assistant/core/pull/138371 +[#138375]: https://github.com/home-assistant/core/pull/138375 +[#138382]: https://github.com/home-assistant/core/pull/138382 +[#138387]: https://github.com/home-assistant/core/pull/138387 +[#138391]: https://github.com/home-assistant/core/pull/138391 +[@alfwro13]: https://github.com/alfwro13 +[@allenporter]: https://github.com/allenporter +[@bdraco]: https://github.com/bdraco +[@catsmanac]: https://github.com/catsmanac +[@edenhaus]: https://github.com/edenhaus +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@jdanders]: https://github.com/jdanders +[@ludeeus]: https://github.com/ludeeus +[@sdb9696]: https://github.com/sdb9696 + [#112047]: https://github.com/home-assistant/core/pull/112047 [#121522]: https://github.com/home-assistant/core/pull/121522 [#121548]: https://github.com/home-assistant/core/pull/121548 From b6dc21bf0ce41355b2766e3d4f2556ac1bbc52af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 07:48:06 +0100 Subject: [PATCH 045/118] build(deps-dev): bump sorbet-runtime from 0.5.11820 to 0.5.11826 (#37440) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index bafe693b99f..adfdbe8a339 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -156,7 +156,7 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11820) + sorbet-runtime (0.5.11826) stringex (2.8.6) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) From 86a9aa298654893c20ba95c355943bb571d6b579 Mon Sep 17 00:00:00 2001 From: Jonas Fors Lellky Date: Thu, 13 Feb 2025 08:12:38 +0100 Subject: [PATCH 046/118] Add configuration_basic, move Add integration button to the top (#37435) * Add configuration_basic, move Add integration button to the top * fix indents in config block --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/flexit_bacnet.markdown | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source/_integrations/flexit_bacnet.markdown b/source/_integrations/flexit_bacnet.markdown index 731d651064c..d061196719e 100644 --- a/source/_integrations/flexit_bacnet.markdown +++ b/source/_integrations/flexit_bacnet.markdown @@ -34,6 +34,15 @@ To configure the integration, you need to obtain the IP address and Device ID fo 5. Go to **More** > **Installer** > **Communication** > **BACnet settings**. 6. Note down the **IP address** and **Device ID**. +{% include integrations/config_flow.md %} + +{% configuration_basic %} +IP address: + description: "The IP address of your Flexit Nordic device." +Device ID: + description: "The Device ID of your Flexit Nordic device. This is usually 2." +{% endconfiguration_basic %} + ## Platforms This integration supports the following platforms. @@ -90,8 +99,6 @@ If you need to shut down the unit, make sure to take all necessary precautions, Furthermore, Flexit recommends unplugging the unit from the power socket before replacing a filter. To prevent damage, always initiate a controlled shutdown from the control panel (or, in the future, from an action in Home Assistant) before unplugging the device. -{% include integrations/config_flow.md %} - ## Removing the integration This integration follows standard integration removal. No extra steps are required. From 2790b2e85ff1d631ebb49768b8d582e67b713c9f Mon Sep 17 00:00:00 2001 From: mnoram Date: Wed, 12 Feb 2025 23:25:08 -0800 Subject: [PATCH 047/118] Update Google Assistant integration to remove references to "Actions on Google Console" (#37436) * Remove references to "Actions on Google Console" and update instructions as applicable Changed any steps that referenced the deprecated "Actions on Google Console" to point to "Google Developer Console". Remove or corrected any steps that are no longer needed or have different locations or behaviors on the applicable pages to reflect Google's current interface of the the "Google Developer Console" site. Shortened and renamed the ENABLE DEVICE SYNC section since this is now enabled automatically by following the manual setup steps. Stopped review and edits right before YAML CONFIGURATION section * Update google_assistant.markdown to fix numbering Fix sequential numbering of steps after removing and adding instructions * Update google_assistant.markdown, change login to log in Per Coderabbitai, change login to log in when used as a verb * Update source/_integrations/google_assistant.markdown fix grammar per coderabbitai Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * terminology tweaks --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- .../_integrations/google_assistant.markdown | 60 +++++++++---------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/source/_integrations/google_assistant.markdown b/source/_integrations/google_assistant.markdown index 87b6e96e88b..876c71e4b48 100644 --- a/source/_integrations/google_assistant.markdown +++ b/source/_integrations/google_assistant.markdown @@ -63,7 +63,7 @@ To use Google Assistant, your Home Assistant configuration has to be [externally - You do not need to test. 2. In the left hand menu of your project, select the **Analytics** link. - - Select the hamburger {% icon "mdi:hamburger-menu" %} menu and select **APIs and Services**. + - Select the hamburger {% icon "mdi:hamburger-menu" %} menu on the top left and select **APIs and Services**. 3. Enable device sync ([see below for more information](#enable-device-sync)). 1. In the left hand menu, select **Credentials**. 2. In the **Credentials** view, select **Create credentials** and next **Service account**. @@ -78,15 +78,14 @@ To use Google Assistant, your Home Assistant configuration has to be [externally 7. This will start a download of a JSON file. 1. Rename the file to `SERVICE_ACCOUNT.JSON`. 2. In Home Assistant, add this file to your config-folder. This will be the same folder as your {% term "`configuration.yaml`" %}. - 8. Go back to [Google Cloud Platform](https://console.cloud.google.com/) and select **Close**. - 9. Then select **Save**. - 10. Go to the **Search products and resources** and search for **Homegraph API** and select it. - 11. Enable the HomeGraph API. + 8. Go to the **Search (/) for resources, documentation, products, and more** at the top middle and search for **Homegraph API** and select it. + 9. Enable the HomeGraph API. 4. Add the `google_assistant` integration configuration to your {% term "`configuration.yaml`" %} file and restart Home Assistant following the [configuration guide](#yaml-configuration) below. 5. Add services in the Google Home App (note that app versions may be slightly different). 1. Open the Google Home app. - 2. Select the `+` button on the top left corner, select **Set up device**. In the **Set up a device** screen, select **Works with Google**. You should have `[test] ` listed under **Add new**. Selecting that should lead you to a browser to login your Home Assistant instance, then redirect back to a screen where you can set rooms and nicknames for your devices if you wish. + 2. Select the Devices tab at the bottom and select the `+ Add` button on the bottom right corner. + 3. In the **Choose a device** screen, select **Works with Google Home**. You should have `[test] ` listed under **Add new**. Selecting that should lead you to a browser to log in to your Home Assistant instance, then redirect back to a screen where you can set rooms and nicknames for your devices if you wish. {% important %} If you've added Home Assistant to your phone's home screen, you have to first remove it from the home screen. Otherwise, this HTML5 app will show up instead of a browser. Using it would prevent Home Assistant redirecting back to the Google Home app. @@ -96,22 +95,19 @@ If you've added Home Assistant to your phone's home screen, you have to first re If you want to allow other household users to control the devices: -1. Open the project you created in the [Actions on Google console](https://console.actions.google.com/). -2. Select **Test** on the top of the page, then select **Simulator** located to the page left, then click the three little dots (more) icon in the upper right corner of the console. -3. Select **Manage user access**. This redirects you to the Google Cloud Platform IAM permissions page. -4. Select **Grant access** at the top of the page. +1. Open the project you created in the [Google Developer Console](https://console.home.google.com/projects). +2. Select **Members** on the top of the page. This redirects you to the Google Cloud Platform IAM permissions page. +3. Select **Grant access** at the middle of the page. 1. Enter the email address of the user you want to add. 2. Select **Select a role** and choose **Project** > **Viewer**. 3. Select **Save**. - 4. Copy and share the Actions project link (`https://console.actions.google.com/project/YOUR_PROJECT_ID/simulator`) with the new user. -5. Have the new user open the link with their own Google account, agree to the **Terms of Service** popup. Then select **Start Testing**, select **Version - Draft** in the dropdown, and select **Done**. -6. Have the new user go to their **Google Assistant** app to add `[test] your app name` to their account. + 4. Copy and share the project link (`https://console.home.google.com/projects/YOUR_PROJECT_ID`) with the new user. +4. Have the new user open the link with their own Google account, agree to the **Terms of Service** popup(s). +5. Have the new user go to their **Google Assistant** app to add `[test] your app name` to their account. -### Enable device sync +### Utilize device sync -If you want to support active reporting of state to Google's server (configuration option `report_state`) and synchronize Home Assistant devices with the Google Home app (`google_assistant.request_sync` service), you will need to create a service account. It is recommended to set up this configuration key as it also allows the usage of the following command, "Ok Google, sync my devices". Once you have set up this component, you will need to call this service (or command) each time you add a new device in Home Assistant that you wish to control via the Google Assistant integration. This allows you to update devices without unlinking and relinking an account (see [below](#troubleshooting)). - -The service account is created by following Step 4 (Enable device sync) in the previous section [Google Cloud Platform configuration](#google-cloud-platform-configuration). +You are now able to support active reporting of state to Google's server (configuration option `report_state`) and synchronize Home Assistant devices with the Google Home app (`google_assistant.request_sync` service). Try it with "OK Google, sync my devices" - the Google Home app should import your exposed Home Assistant devices and prompt you to assign them to rooms. @@ -135,24 +131,24 @@ This is because the Google Assistant device will connect directly to the IP of y For secure remote access, use a reverse proxy such as the {% my supervisor_addon addon="core_nginx_proxy" title="NGINX SSL" %} add-on instead of directing external traffic straight to Home Assistant. {% endimportant %} -1. Open the project you created in the [Actions on Google console](https://console.actions.google.com/). -2. Select **Develop** on the top of the page, then select **Actions** located in the hamburger menu on the top left. -3. Upload Javascript files +1. Open the project you created in the [Google Developer Console](https://console.home.google.com/projects). +2. Expand the **Cloud-to-cloud** menu on the left and select **Develop**, then select **Edit** next to your integration. +3. Scroll down and enable **Local fulfillment** +4. Upload Javascript files 1. Download `app.js` from [here](https://github.com/NabuCasa/home-assistant-google-assistant-local-sdk/releases/latest) - 2. Select the **Upload JavaScript files** button. - 3. Select **Upload your JavaScript targeting Node** and upload the `app.js` from step 3.1. - 4. Select **Upload your JavaScript targeting Chrome (browser)** and upload the `app.js` from step 3.1. -4. Check the box **Support local query** under **Add capabilities**. -5. Add device scan configuration: - 1. Select **+ New scan config** if no configuration exists. - 2. Select **MDNS**. - 3. Set **MDNS service name** to `_home-assistant._tcp.local` + 2. Select **Upload your JavaScript targeting Node** and upload the `app.js` from step 4.1. + 3. Select **Upload your JavaScript targeting Chrome (browser)** and upload the same `app.js` from step 4.1. +5. Check the box **Support local queries**. +6. Add device scan configuration: + 1. Select **+ Add scan configuration** if no configuration exists. + 2. For Discovery protocol select **mDNS**. + 3. Set **Enter mDNS service name** to `_home-assistant._tcp.local` 4. Select **Add field**, then under **Select a field**, choose **Name**. 5. Enter a new **Value** field set to `.*\._home-assistant\._tcp\.local` -6. Save your changes. -7. Either wait for 30 minutes, or restart all your Google Assistant devices. -8. Restart Home Assistant Core. -9. With a Google Assistant device, try saying "OK Google, sync my devices." This can be helpful to avoid issues, especially if you are enabling local fulfillment sometime after adding cloud Google Assistant support. +7. Scroll to bottom of page and **Save** your changes. +8. Either wait for 30 minutes, or restart all your Google Assistant devices. +9. Restart Home Assistant Core. +10. With a Google Assistant device, try saying "OK Google, sync my devices." This can be helpful to avoid issues, especially if you are enabling local fulfillment sometime after adding cloud Google Assistant support. You can debug the setup by following [these instructions](https://developers.home.google.com/local-home/test#debugging_from_chrome). From 10122d7034a3e9a4a125c8af6447db71985011a9 Mon Sep 17 00:00:00 2001 From: Gord <31004434+googanhiem@users.noreply.github.com> Date: Thu, 13 Feb 2025 18:59:17 +0000 Subject: [PATCH 048/118] Voice chapter 9 blog upload (#37449) * Upload Voice Chapter 9 blog * Small additions * Another small change * Rephrase a sentence * Minor edits --- ...-voice-chapter-9-speech-to-phrase.markdown | 136 ++++++++++++++++++ .../blog/2025-02-voice-chapter-9/art.jpg | Bin 0 -> 38176 bytes .../blog/2025-02-voice-chapter-9/green-pe.png | Bin 0 -> 156697 bytes .../shared-history.png | Bin 0 -> 53953 bytes .../blog/2025-02-voice-chapter-9/stp-logo.jpg | Bin 0 -> 16091 bytes 5 files changed, 136 insertions(+) create mode 100644 source/_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown create mode 100644 source/images/blog/2025-02-voice-chapter-9/art.jpg create mode 100644 source/images/blog/2025-02-voice-chapter-9/green-pe.png create mode 100644 source/images/blog/2025-02-voice-chapter-9/shared-history.png create mode 100644 source/images/blog/2025-02-voice-chapter-9/stp-logo.jpg diff --git a/source/_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown b/source/_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown new file mode 100644 index 00000000000..bad8d6c72fd --- /dev/null +++ b/source/_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown @@ -0,0 +1,136 @@ +--- +layout: post +title: "Speech-to-Phrase brings voice home - Voice chapter 9" +description: "This new tool brings fast, local speech processing to low-end hardware, along with some useful new voice and AI features" +date: 2025-02-13 00:00:01 +date_formatted: "February 13, 2025" +author: Mike Hansen +comments: true +categories: Assist +og_image: /images/blog/2025-02-voice-chapter-9/art.png +--- + + + +**Welcome to Voice chapter 9 🎉 part of our [long-running series](https://www.home-assistant.io/blog/categories/assist/) following the development of open voice.** + +We're still pumped from the launch of the [Home Assistant Voice Preview Edition](/voice-pe/) at the end of December. It sold out 23 minutes into our announcement - wow! We've been working hard to keep it in stock at [all our distributors](/voice-pe#buy). + +Today, we have a lot of cool stuff to improve your experience with Voice PE or any other Assist satellite you're using. This includes fully local and offline voice control that can be powered by nearly any Home Assistant system. + +- [Voice for the masses](#voice-for-the-masses) +- [Building an Open Voice Ecosystem](#building-an-open-voice-ecosystem) +- [Large language model improvements](#large-language-model-improvements) +- [Expanding Voice Capabilities](#expanding-voice-capabilities) +- [Home Assistant phones home: analog phones are back!](#home-assistant-phones-home-analog-phones-are-back) +- [Wyoming improvements](#wyoming-improvements) +- [🫵 Help us bring choice to voice!](#-help-us-bring-choice-to-voice) + + +Dragon NaturallySpeaking was a popular speech recognition program introduced in 1997. To run this software you needed at least a 133 MHz Pentium processor, 32 MB of RAM, and Windows 95 or later. Nearly thirty years later, Speech-to-Text is much better, but needs orders of magnitude more resources. + +Incredible technologies are being developed in speech processing, but it's currently unrealistic for a device that costs less than $100 to take real advantage of them. It's possible, of course, but running the previously recommended Speech-to-Text tool, [Whisper](https://github.com/openai/whisper), on a Raspberry Pi 4 takes at least 5 seconds to turn your speech into text, with varying levels of success. This is why we ended up recommending at least an Intel N100 to run your voice assistant fully locally. That stung. Our opt-in analytics shows over [50% of the Home Assistant OS users](https://analytics.home-assistant.io/) are running their homes on affordable, low-powered machines like the [Home Assistant Green](/green) or a Raspberry Pi. + +What's more, advancing the development of Whisper is largely in the hands of OpenAI, as we don't have the resources required to add languages to that tool. We could add every possible language to Home Assistant, but if any single part of our voice pipeline lacks language support, it renders voice unusable for that language. As a result, many widely spoken languages were unsupported for local voice control. + +This left many users unable to use voice to control their smart home without purchasing extra hardware or services. We’re changing this today with the launch of a key new piece of our voice pipeline. + +## Voice for the masses + +Speech-to-Phrase logo + +[Speech-to-Phrase](https://github.com/OHF-voice/speech-to-phrase) is based on old, almost ancient, voice technology by today's standards. Instead of the ability to transcribe virtually any speech into text, it is limited to a set of pre-trained phrases. Speech-to-Phrase will automatically generate the phrases and fine-tune a model based on the devices, areas, and sentence triggers in your Home Assistant server - 100% locally and offline. + +**The result:** speech transcribed in under a second on a Home Assistant Green or Raspberry Pi 4. The Raspberry Pi 5 processes commands seven times faster, clocking in at 150 milliseconds per command! + +With great speed comes *some* limitations. Speech-to-Phrase only supports a subset of Assist's voice commands, and more open-ended things like shopping lists, naming a timer, and broadcasts are not usable out of the box. Really any commands that can accept random words (wildcards) will not work. For the same reasons, Speech-to-Phrase is intended for home control only and not LLMs. + +The most important home control commands are supported, including turning lights on and off, changing brightness and color, getting the weather, setting timers, and controlling media players. [Custom sentences](/docs/automation/trigger/#sentence-trigger) can also be added to trigger things not covered by the current commands, and we expect the community will come up with some clever new ways to use this tech. + +Green and Voice PE join forces +

All you need to get started with voice

+ +Speech-to-Phrase is launching with support for English, French, German, Dutch, Spanish, and Italian - covering nearly 70% of Home Assistant users. Nice. Unlike the local Speech-to-Text tools currently available, adding languages to Speech-to-Phrase is much easier. This means many more languages will be available in future releases, and [we would love your help](/voice_control/contribute-voice) adding them! + +We're working on updating the Voice wizard to include Speech-to-Phrase. Until then, you need to install the add-on manually: + +[!Open your Home Assistant instance and show the dashboard of an add-on.](https://my.home-assistant.io/redirect/supervisor_addon/?addon=core_speech-to-phrase) + +## Building an Open Voice Ecosystem + +When we launched Home Assistant Voice Preview Edition, we didn't just launch a product; we kickstarted an ecosystem. We did this by open-sourcing all parts and ensuring that the voice experience built into Home Assistant is not tied to a single product. Any voice assistant built for the Open Home ecosystem can take advantage of all this work. Even your DIY ones! + +With ESPHome 2025.2, which we're releasing next week, any ESPHome-based voice assistant will support making [broadcasts](/blog/2025/02/05/release-20252/#new-broadcast-intent) (more on that below), and they will also be able to use our new voice wizard to ensure new users have everything they need to get started. + +This will include updates for the [$13 Atom Echo](/voice_control/thirteen-usd-voice-remote/) and ESP32-S3-Box-3 devices that we used for development during the Year of the Voice! + +

New broadcast feature in action with Atom and Box 3

+ +## Large language model improvements + +We aim for Home Assistant to be [the place for experimentation with AI in the smart home](/blog/2024/06/07/ai-agents-for-the-smart-home/). We support a wide range of models, both local and cloud-based, and are constantly improving the different ways people can interact with them. We're always running [benchmarks](https://github.com/allenporter/home-assistant-datasets/tree/main/reports) to track the best models, and make sure our changes lead to an improved experience. + +If you set up [Assist](/voice_control/), Home Assistant's built-in voice assistant, and configure it to use an LLM, you might have noticed some new features landing recently. One major change was the new "[prefer handling commands locally](/blog/2024/12/04/release-202412/#let-your-voice-assistant-fall-back-to-an-llm-based-agent)" setting, which always attempts to run commands with the built-in conversation agent before it sends it off to an LLM. We noticed many easy-to-run commands were being sent to an LLM, which can slow down things and waste tokens. If Home Assistant understands the command (e.g., turn on the lights), it will perform the necessary action, and only passes it on to your chosen LLM if it doesn't understand the command (e.g., what's the air quality like now). + +Adding the above features made us realize that LLMs need to understand the commands handled locally. Now, the [conversation history is shared](/blog/2025/02/05/release-20252/#shared-history-between-the-default-conversation-agent-and-its-llm-based-fallback) with the LLM. The context allows you to ask the LLM for follow-up questions that refer to recent commands, regardless of whether they helped process the request. + +Speech-to-Phrase logo +

Left: without shared conversations. Right: Shared conversations enable GPT to understand context.

+ +### Reducing the time to first word with streaming + +When experimenting with larger models, or on slower hardware, LLM's can feel sluggish. They only respond once the entire reply is generated, which can take frustratingly long for lengthy responses (you'll be waiting a while if you ask it to tell you an epic fairy tale). + +In Home Assistant 2025.3 we're introducing support for LLMs to stream their response to the chat, allowing users to start reading while the response is being generated. A bonus side effect is that commands are now also faster: they will be executed as soon as they come in, without waiting for the rest of the message to be complete. + +Streaming is coming initially for Ollama and OpenAI. + +### Model Context Protocol brings Home Assistant to every AI + +In November 2024, Anthropic announced the [Model Context Protocol](https://modelcontextprotocol.io/introduction) (MCP). It is a new protocol to allow LLMs to control external services. In this release, contributed by [Allen Porter](https://github.com/allenporter), Home Assistant can speak MCP. + +Using the new Model Context Protocol [integration](/integrations/mcp), Home Assistant can integrate external MCP servers and make their tools available to LLMs that Home Assistant talks to (for your voice assistant or in automations). There is [quite a collection of MCP servers](https://github.com/punkpeye/awesome-mcp-servers), including wild ones like scraping websites ([tutorial](https://gist.github.com/allenporter/b0e9946feb2ab60901c4f467ac1ba6f9)), file server access, or even BlueSky. + +With the new Model Context Protocol [server integration](/integrations/mcp_server), Home Assistant's LLM tools can be included in other AI apps, like the Claude desktop app ([tutorial](https://modelcontextprotocol.io/quickstart/user)). If agentic AI takes off, your smart home will be ready to be integrated. + +Thanks Allen! + +## Expanding Voice Capabilities + +We keep enhancing the capabilities of the built-in conversation agent of Home Assistant. With the latest release, we're unlocking two new features: + +#### "Broadcast that it's time for dinner" + +The new [broadcast](/blog/2025/02/05/release-20252/#new-broadcast-intent) feature lets you quickly send messages to the other Assist satellites in your home. This makes it possible to announce it's time for dinner, or announce battles between your children 😅. + +#### "Set the temperature to 19 degrees" + +Previously Assist could only tell you the temperature, but now it can help you change the temperature of your HVAC system. Perfect for changing the temperature while staying cozy under a warm blanket. + +## Home Assistant phones home: analog phones are back! + +Two years ago, we introduced the [world's most private voice assistant](/voice_control/worlds-most-private-voice-assistant/): an analog phone! Users can pick it up to talk to their smart home, and only the user can hear the response. A fun feature we're adding today is that Home Assistant can now **call your analog phone!** + +Analog phones are great when you want to notify a room, instead of an entire home. For instance, when the laundry is done, you can notify someone in the living room, but not the office. Also since the user needs to pick up the horn to receive the call, you will know if your notification was received. + +

Have your Home Assistant give you a call

+ +If you're using an LLM as your voice assistant, you can also start a conversation from a phone call. You can provide the opening sentence and via a new "extra system prompt" option, provide extra context to the LLM to interpret the response from the user. For example, + +- Extra system context: garage door cover.garage_door was left open for 30 minutes. We asked the user if it should be closed +- Assistant: should the garage door be closed? +- User: sure + +Thanks [JaminH](https://github.com/jaminh) for the contribution. + +## Wyoming improvements + +Wyoming is our standard for linking together all the different parts needed to build a voice assistant. Home Assistant 2025.3 will add support for announcements to Wyoming satellites, making them eligible for the new broadcast feature too.   + +We're also adding a new microWakeWord add-on (the same wake word engine running on Voice PE!) that can be used as an alternative to openWakeWord. As we collect more real-world samples from our [Wake Word Collective](https://ohf-voice.github.io/wake-word-collective/), the models included in microWakeWord will be retrained and improved. + +## 🫵 Help us bring choice to voice! + +We've said it before, and we'll say it again---the era of open voice has begun, and the more people who join us, the better it gets. Home Assistant offers many ways to start with voice control, whether by [building your own](/voice_control/#expand-and-experiment) Assist hardware or getting a [Home Assistant Voice Preview Edition](/voice-pe/). With every update, you'll see new features, and you'll get to preview the future of voice today. + +A huge thanks to all the language leaders and contributors helping to shape open voice in the home! There are many ways to get involved, from translating or sharing voice samples to building new features---learn more about how [you can contribute here](/voice_control/contribute-voice). Another great way to support development is by subscribing to [Home Assistant Cloud](/cloud/), which helps fund the Open Home projects that power voice. diff --git a/source/images/blog/2025-02-voice-chapter-9/art.jpg b/source/images/blog/2025-02-voice-chapter-9/art.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02897333d19fa648d5a380839fa03d5ca350b436 GIT binary patch literal 38176 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

#n34>}cwq~emQFqZ9GlFW$aKs+fzsxuqDOE!@ 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 literal 0 HcmV?d00001 diff --git a/source/images/blog/2025-02-voice-chapter-9/shared-history.png b/source/images/blog/2025-02-voice-chapter-9/shared-history.png new file mode 100644 index 0000000000000000000000000000000000000000..097ad046de83025b3c3d07e067a0b75bcc9828a8 GIT binary patch literal 53953 zcmbrkcQoA5^DwMLS-p#1q7yB8+h`HJvxu^4bfR}+^%7BouzFprsL?G#bP*Dw*XTVg zi)X*z-+9mTJm>tV-=n_Lu%ScttOAFod{|y`*9Bj{6(KuLGSkBJQiSa|3AG->3nkw>Z>kEsc z{T<|iuapd51qa8Zr>AFUr3D0qhK3^ieEJe%JA&S~XQ$L9L2Ap=3qK_k=H`7aC@82a z$^HEKb4^B4J2WNG*Ciz>CLt~=?tO4VLPBh8?EC20@CZmqcwG4Vq}0?@G~LLsCUgmT z9~K!IY46?m@#Dwz%&gkPKy+hRSlIih$l&0>z>w&G;P;#XCCt8+4DYIG9Lq7hE0{wn znf(f+qN_quG904P(fCh%Dlp$wkos2|dPjSB|7V8(6Wm;#{-4H}k~mMSYNtE;PPYidSEN88%k z4h{~cr>C2mn)degj*gDHySwM-=eM@D%F4=%ii)66XlZHb$;pYbva+P4Bqb#!4-b#4 ztLyIW?)LV!e@yw=+1cRWV1IwVy1F_G3yYndosEr+o}Qkkr>B*bm8q$zpPyfLc8;*H zu)Mtd+qZ9Fwe_tvp24ZLwu#mCVUGFUu0ORc3guN4-}npZx+DKxMThE^L+yDqobwBy z!C9YRb$Zc}Y7x+^xH)9NG}2=D=F`&c(#6B>^#f1qKdkCYjEYOLx+~58>&7hn|lKJ1^|5N_I%=G_spnw18@BhF73M{XvuA)IkR$bdrgtR`)3Ik)( zOI=0LC=l~7FD`uJ645YtY0?3R)W-}PoV%YOhZ~8%E z6X*DY<@_5T=?lXs!YH_8Bt7PlT>GkH@J^m9={5-~MEWzlVQ6QvMJA4&MDQUO6~Qs*^tZ_ z9HH}J0zdCQIn#uJurmXt8Ccu6+4?Z~gw9)5%0UI6^?@_Kpd?DopwHfhN<8w97V*ep zVd^+;Uhpfoq9d&j{L#)Gdx}hz++4L-q-#9Vy*d@yO;+>?pL=AF`AJ@nlIaqA$izDm z+E54LV%uZna+9fJ!+#YOKnvgYYLl+T&v(9w%W{y^E|F5-5K~V#O8t$;7OO;|h-{lydA_d~?+50%^=d48^uZ>INwrh z!=S0Nf>~Z1EBMt4p@{$vwxT+WdZm&`%rg5~%u<>S^Vj=qBvEpaYhQDhDZCs<_tY8K z?uYi&{oR8H?<#h%J2@?+jyh{cgenDengq0G$20A|Dz0ESKexecC;RbyvMh2mn!J%2 zKAGl;cP^jLT;(1N&(+f9d!|0L6~7=nI@435(!m@=*G7iCPBKt@k7@KiRA#N>1*8jG zZ1uV8lMvjxY_`yj$=M91sy%f!efBty!#_QNUZTE_-ycF#6fR(WLj{|$OnYM0E$ZUor(BtOx#3AR4N+9-y9R45DP6EXzdo~S$$oX2dKeZB_=XKcT93N5<)qdZuf#4Z%f z7YQOna=qnoQLKAH?DVw464J$Ec;Pc;A3Uv?%WO#>-%Z0p$v{K%F4XUvL@KvFwN==`Lu0c`o9W@={XCyqYt2qx?JM~Mv(UP21{xD; zC~mpMM9$os*%5OZjr6h|-Qpxh7QC?|0&4d>*PfccAmYw|@XK-iJSJ%u8UMql74-yv zi!gc!22)>(NkL|n-Eh11UX$>YHI9|oxp(&`Zb;1vJ=OUvCvI0zuR1b@^#zMZUz)74 z<3KA7B&E#tQ3W@Zpu9$ES=EWoX-IRhOL;#_S-)mh`bzO^NqSr}D8TpO{VKu<@Hh%i zvg}Nve0;9l&>pyVzCC7YAD^p~=56D*P$Kg_s*1n{Fe&kH5P`5QrRlOri+aJE6$Fs%$37vJe(471n5=d!us(qUtLb&hP( zXsSJ+Xkz?k{qVnm57v%%k04X5aqdder>Y*ys zt+PqC?M9b(ANvwj@M&LMl)VBs3CE8b4ia3dA!eejA~{g-sm)&hkN53S7ztf3-|@!3 zRsF0sHi$<->=3`cB{SoAMbE31HYzRx(z#KY98-Pby%AP%q#3ysLawv<`g0(EU;E7K z^kOx!%tYp%$Y(66QvH4uL*DUa5}6tEL;}Bbw!Q-`-!dCo7vg ze@)$%_e?`+Z@p$NRY;7^%ge%O|Gi8VEye56a=IWq4I*R;lbw#^}_gNAeIz!Ew8YbHi1yP<*4u5cK5Z?Q_Y574I*^( z-X)Trs~V##2W*dS(RH1kpbS|UkGjviF|ZdNzta79y8cWV(soHHI2|I5pO;2HXr}+9 z^jsY$@e`K{p+EUb8Mn8we(1H%VUyYjLUx~Zh7jNIl2gFz#qk<8_GW5idaOYT6;~*7 z1KW>$&*>{Sj#0-i+7Fyzj!!m9sx>*-GHlC;_$g{V6?J{+oW#9i3hr*T{Xw;^dr1l* z0zDr1Kyt_2$A=o|UF_98e?YF)$x}sey>df<^~rRj&gJc5;}5j8;VJccpY-17zX26l z->X2s0f7nMfW!MLz=+gg=r<0&jquq(x!F$bpm)jZc@58oV}v4k6D4h{o`|P|rfJuV z74Tpl^ar1)#8Wb~C`MNZUkPV$o*@f;VJ)a($Kgaf$;RG9id$p-%ZRPrUk%p1cV??* zdwZcZKlXbM3*vm()xX5i(tRWAC+rj&zu4)LgiWSQt~#g=Red>rxuIh07yTAg+<0)` z8=hsUU2CSz@M^Gca%cF7$L*m>=>6E?sAED!WdkV@5;w=Qya5n#DRiyF)6vG;5wX|v zA|&o-?>SnRXA-%xboj56+Y({w`70}d zeVZ75h=L7q@Bu**7#zfO#bdi%Onega$MudJG41@<9~WB(q~$YBc<{&5AGg3m=yLh` z;#8;YEj|;>suK9Oo?jp~W{%}j9b`sZ8<-L6pSPsjaX%{#84_O8M0oZr0FUlU(japl zLJhmkJnfZ;^WFXjvj|JDhybjgSM{0|CanK7v;~IWdEbBPrVSQZ8VH^h%7-P*d9YAn z&4W9`ge*+4Y34iN@X1((j<~$E#p9t!KW;+MfZ=~zQD5lF#KAH}hEJcl#rcU#F%;fM z$Fy(>z-HHrphs?}8COBRl{7R*&Zl)V>s}+;*H>UL(hw}vsq=}D-_o>rJ3Lsy9$ZIA z=qh#D9lN4#PDyht+5{DZ-3?m`!7kXi1sv-tI%%`5C7j!$I*yUrj&GCG=8YTv02#i( zt*~h3k<}kS!$y?MR@M{FEkFKH&v2nhBc%yl-9eydGSr1>@Wt@N68OZupgUrJw!`*6 zv<^^9zaV>apZ(`uM)FF3`doJ|-6QA=Jj*y#^sMoow$qqY0sh3*&5uf4XIMqNJV=Zg z>Vm*0L*HF9Ff1y7w`U4)0ef1%_ekSPQ#b^Eev^5U3GID>e4{#9bTPV?(>MX;p z3o@H3fcQ-!%vosW-)6SaFCvfFE+BK-G2)9a5lT!$Iv6}SKj^2;yWi;nc=bfu@Ln3H z5gx!c8+IWFQwzG}%#8MbUf~UB6B1&i`8=4?KY7amQ{<+k;e?rFFE>HNf9oNzXbCZR zsYlKRM}C91BfLo+h4KlsstQ`>|K3KBE2RdLCyRARfSEqRzd*81T&3Q&ovdhUB8q`F z(Fi5Z6e_)tPict@`g#lrR|pwWM28w;G2&S?t`9<0NdweIOOpt~8c8BN3ftcD-6-0( z+5DWr^I6S=aYuzmP^75FJNvbk`)ImH!puG{QQpGf%M8d|C9{ctR@%SuvTMX>Yf2$Y ziUhX+l|S=`VO-a#d_$52SxvEA0+=pnK=Jplmz-=dwWmJPDUcWhO@d~Q$m?3g9{Cqr z{EvC~mbEk=r+ql!m#Z(bi<*_nu?cE(np-|{YE3MD`1~E7{$gIcPn(OxV-@1cZQx2serBAgBf$3FiVxyY z?yt|TLRHjfoC=rD;3nez1SZkU7XBdsoE7H+fno=+`;ee^zI@;dD--7jh zn!oI&{)Sg>UCbfApRwP#$nlzDzDNHP08Ql>crp+H&@?J9>GX&L{?!*(kqC6<8hn4~NICueXKEdW$cG9O zEn=Qzb}z$}QEhidLa)YuYUbs>hc87e@aV;trv}8>u3j~bK|*>s+?+Vs3IJmiG*Pui zXl{~JgU3@73@zbr|{lbwWt{kXv)5VN(;mNPVsEr9VxyMRNMmcc5aS5uwxqS^Y98U@cRkX(W?FsGrzK1U^Xs26n z2mnho7?$~CaDLS5ZBmZ2Qy6rK+G#JSe_-MfZsZDL8>z;4L9-SUBY}nUPSDq_59IpS z`hDVpjK3%?h#NLGBfLbx@8&u}W3u84EQk2rRmdg=_I%2?U3N7R z|G=c31%L8skgCHFmyciRy%mKqi4=oF+>iXfv8HswS=s^kh*8S{&Xyo7`t3*UtxKQwwdSJW z>{Q+{9&(wUWN{BslI|roN?{^zOufETn@BMqLz|Ov1}W3$699kqUc7Mv!~Dt-qN3#z zU~+XhH5=Rj#C~wA_Ar5t1yu#JE%LB2S8xo2ZHxI&m$$QTbu1C=z7It)#?dK14M0yh zZ3SMw;fS491g)`)WRpRt>69XqRRvJ}%^siXqD4g#t7uKGIhHuS`pFx!eTH78XOSqX?gt+9#V>i3%{H3vkx$klIU^-ma4JR5@s(F!zGpDaNp zMf3Y${Yo}COFhNE4kvMWSlMeMJ|Z$hmPW@5s(fTkZfp&ONp^0@p?+9JCctk2GF?@p ziQpi#yWELEY(TQ!x@E(I6+t1t0&<+w;d-z5@nOq3ZZSV%&0VWDak@F|5=Nz7$80we zy0|!K2N?ZuHkuj4{A5<cOUa7g+YLsz+_@7!*OfsXIsrnK6;t4seA)(3u~#-=D>CDoSDI1l7Tuv0y&pe?jgtIU z&=NCyT_ps#2m|4b6_iR!q3)z>M!OmaRj61XYI(qVzI!9yg% zy`U_f9o$8u2m&WW3chBssJ>ilf=ZgV zL9VaOtfX*_o_P%J!3U@PfR0ttCP>qa>J0Km0wefQ|&ehqrYDJWJ|-87n%*d_cS zNfS{a++0`ec7uf5-vkk^&1L8=C>_kjP7O*ZnGBs?Fd&64>p5VL=DmB9UWgi&@Q0y) z5S)G9fcp8J0d9*ICKv0wnmV9ydbvkKPTHg{VZV|v^ws} zS^(xK9C)|x^pBdM_LdKPb^0O);@WQt(2Rp#*TzAu>8gI4%6h=|)8V!^K`H}Nk5?!E z86u_$l0k)n);eK>;+1o6@wPiwy_*g82|iqIDOq|YX8(H z555w7iM$P+Np1r=S+T4<{EKE7mH!6QtD z6_0CbxcB-}VP~22I4{&Bq0C3t=qOrN?e08>CK;*bYdc^Ti`}XxY zwfjLm7;&BiwGO#>heADcqtWf4cQ*WQ&-1b=r3T{g1@mW`L)U)1?&rzG!%6}rklHxsEu7Z@b>w{{Be?Fd3PKG zd%~&W(g6P}&YnAjv$*D0Gw?(Tluoz%ys2rIc`aSI*Vu&2n|LtTgwP9N>zrzhLL~$E zdl@{%TWC|+)*VL*h;P!4Yfj0i$%SNzkA`Ng655<%wpoC^;tW7pcOBmLvzn-Q*Dt1o z;~;5M(8Jlq>X#d24gB3ipe%P+plD0}B8RpX-G#`%kkhqJKLL3IW%;xbaNf$H`sJ?a*xkT;}`*SZ}L_jIu2)-qj z&Xkc?piQkn^##Smia!y!LOH*2)?^0@ec4mP8{dv;Yewin>N<0?K$-n5l-dPsW&}Le z^df63{QNn4`MRKx@q*pP?HEJDO?auQRAhg)zvI0_tfYE`e2WN&Z!(g{>_LZYk-rd* zLJQMz(`ncgvtVHK;A4ZwYmp+l12zi^!Kc8G{A2#SK0JPb>TYb>#^nLVSFMAyqIWkk zOl~?=m`|H~r8%xuVfxfRC_8{(jz;^Pp(K*j0wO^&)luN9?@}P}8Nx$$7vS1|lY0c- z#y+DCh>vGrpKFes1P394tx%zY0`4)p*fiNXvBtkl891V94}a(XZdJpu@4$4^)k)k? zS5rCrnfX!J7*t05bAo)D!%yG^&5>kLq4p#n4^aX$9InBy3-!I0SiawIYK@~Fff%Qg zd)twGH4qK~J+^>QhuWa8CWiRtpwU=YftjGc>wNUjv4QZ~NR6p~7+p$MOQsZ)?&zchVLe7=2|miVzzy)b2@Vz9^LBRN%Iglj_Y^)*f@U-2EfH zizp`7(*)@1=WkQ>aD@nG^>zb-P{jLo_1F-v&=&cV=z+;%jy(uoBCpE{Ar6N4AI3q4 zKI&|-k_>Ij!5@URO7oF-WwD80NnvT`eF&E}p9f8ZCfcyx3{G8RE&2+10|f)Yjq5J(@84k3Ked}?_q0Ze@Qc!=ikImlUxnJ_+09VX*tq+??d`clxXg;$ z(5V*9;u&?&!{K?IUk`?+jxCj1Ig)D{97<`IER_OC4^DQ!O+oJuslj#j?`gAL1z4=v z6eWKhuUgyHmJeX>z>ZbY=_#gVOQ}skbIh#FxzXjc^I?1g4qD&(3cFe0@MiQ1`;P;$ z;|lMg)zSoQP^l~>+CFFLvqYfT6((>c_0i)}7Ty<2V64NGYNDQdgAG>|Fa^0z3Q1&A z&2VjR)0ki4S8`(gh+SCt z_QN2Tucoa8!S>3fpKwev{Gm4J?82AyU^2#7ltX1HyAvpXD=PthP6oUq;J>jWmNj+Q zv1}Y0U;+pl=te0w;=l5<7`!Zr+*W1G^TW6*9%`OD;z6@^dv-B=96l@W$+j_H^`G^x zi$eXfLLKtM)<{!(eq=gFF!1Edz~xyP5p5i(!ypvu7G)YvvK7+d>Zh`lcZ9~e9h@r8 zhnw#@>l|P-NYEGjR57&-OBamQ1BIXY6z#$_@Y>lr)d3eDug3yg^x6$<5Vw1z-8Z=+ z48S;T5IJ+6x{kyTSMJPjQE>b*?(lGT4-_h)vsd#|?S`Y6mMvJpp$YJzK%ZDhHocH^ zjqyJm#-fK>gUHX#hdF$|)U&%G%vr<3AFWtJK%wj3+8idxLwTsy*)lk?nWX)ffOOj= z>v4soJ7t}^sIGAYpY20-uztty6k5wu3Rb47FIW&w&|}YA6k}gHoP(#G+~6^AZUwWn z=tCR57g=3kEml!YlVkuy#MI%W^zK$7o6cd5V>x^nsU1z)656*5|IIv~b%W&AhNlh%+5Y%Oz+zNEvISsjB0teIuPowDzJIzZMS*T6 zR9`*+O>=RUcc{C-t8lAlKV~H^f6OG%rcx0Q`a!224>y^``%4^8lLt8HrAdL_$M~I9 zq(SdLmI^M#{#)J)yGR>EkaZNG%<}mbQ^|4`$HfOZyvbMU- zi67yGDXz6z#~&|}qz@J}m7q7sl-wI6^IbToI2WEd(|m2f%^|NQX?#Z&KO@8HFN4AN zoq4{Rz{t?S6!d3DA#xEErI7)0^!)-D{JL2BHqR1?&bGwd)4T$6rhV zmqy-Pw0+du|3i`iX6FyxLb%Ks{?M@G)pQ|PaBHNXot5?4Z1l%@caQO^$x6pKvUEHK zF5z-$$^mm4@HM`j5Mq%FJRMt=vmNa)L7^7AZjdYr4++ETr`a7pqcvgdTB%7gvC@3sr1zS4lW8j#p68I6@BEk7($w1w zl=iD_{)2GNYY-w%*zSJ6KcJ`oW-{7Z#BLeAC^Eu0yU;Nr0CCGIhOqrc4`LGi#+ZoR z@wL@|wU7#9=4sw#8BtM}=d8M+ZwyYgpKadoJ~|G7Juv2ruwVvsKkRv89TB(pOELu@<&Z%o#Ro{hcuOsKQg?gO5wxaiMRPyc+ub@z1YRIuqY zD@c+mJKa2I&bu)WD*$3;u5taTHnLO#p7AaR@`;+pp2b=fL2bzL=Q`y?3;9j5 zfQ{cLADzV|X@geALUDuy90go{Jl!eITTUH-%=i5k;c6v{lXrcYTn)!)oRN@?aiBHH zZC?BGYtJNVv!0?JaIkaM#4S+#m7X#^;d9@`R~3W!hSsJ?=b*?&7vz9D+eqvPzC^t^E+rAx$-R zlFuYLr4({hDu}$e(?8eYLH*Guq1Up4^^L!iuev%RQz_8LzKvZn0HI%oFNw$pj^{}v z@^?h%UW6EGE<-aiKD5hTF~FSO6pP>#16e>(%8=ZlpMlBa_b*d(Gvx$MW!x}Mb%4|M*- zvlkD6{6|cMtBGlVq&k2nIWSHaB>&5FHYA3^%E4%H0hhp6IP6Rlu$~Kd+}LfSO@W3% zwo(2S(2pDef&w0V0u#*_SkUDwh$`N&lV!RvB;DP`P1d#GvxEEMXDjA7B@p@$zgGd; z@O1TE%=TGPbJkaX6skiOoedMrrt2+e4X7?@B?Xqx{8eYNY2tA5=LbvgO+x&dZWh!) zN|VRumLZyf8lcoHjV6SsxUz0q>Y5;HZn?xr<4gg8>oa>qBA37~vlF>)j!WwK9GX<< zNf?T>I2rnEF*7weSe1cn$`q6EU}oU)mYs55d&7wZe3n`z@mD0|Gy0J3EE}?7sZ_5k zK~xH~#AD9T?$-Trc%Gb$V1vB|HAw<`UyQL_SmfgT&*saE$u<6z2UtAVZ*{^ZaCUL> z8zL@*&L?Kj&cxMP^35Btx1GxmvFm1dvfV%D;P>MM{HllPBDNM*ul|&sjpalU@>9@k zE^7t=R)d5OYEOp5dI7GDH@QrV4v1SDB*d8N?EKk5=R~PHM)AD|v1jMm3p?~S0)2!s z`ZVhedSe06dh##|X>m>GuC3gG!2>rTpXqY}bX@bD_N!!*LQ~0J`1};vr+=(N+5oG_ z`SHfs0CVJ<9dvr=DiH2}4Hx8s0R@uaDhFg~#_d(OauwG^oQHEREixpRdDvqCzw!L} zYPwMG2q&25X+4>MA4aG;^6e3}CsN`HR3^cE0vd?heMHusSl#d~*jj*oeSoh1+i;Qq%UfjwG&Sl?yzGmH+eWJ@Q(6az0Oe6*z=v5VuIQUGjgR+S8{bqY=j%3|tkx>vKXZAV zcA~~~WF3dCfg=YUJ-Vq=ntO+FA7&xbpTa8wz86B1Ak{wYL0(W%$NJT>Y`c0TJ*;;wt3yW)#14DjzgA)s=K8c zgBP|seJn5WoDp`xyn8l2Ziq!ruSXcA!7y3nut$;3<-G>klV+i!50moOp~nkatwonR z%bs#4D}IsGSrB7q4vF@EQK$9o-N?t%;z{vJ{;Le}k zP}zuQE%h`@T?B$a+SoFLdHA@SO;)&|PL8Q7GPGIXci*VDO*K-j(cam)!lX`aJRtHa z8~Y%CgTb!)LWn%eHS5J00d=-Tc+XZg6t6ueZ9=Xo-|$ZdD>g_O6$vew=Q2!CQG&vx zud>u;m+N){N2a4Nx_Q?RzNb#S#98QETLz1W~X)P$g2j0 z^9$8Hlol!F6X&!~fjz5MeR#A_+s@8qU zw9fu%>$-aJu93ZAN0MdNVu4Ta^uuGFLN)2{*D5hrx3|TWsPU*6)f$X!ep~J@TA10- zfNCAvPQ#q2<)obvoem+QV0DaOkeXUUZ;y616jK1>Kp-Fbtb1$s^ct>2Wd!+`)l{7Sc4L$JJ z?OhQeB%OAEwPK9we|QSU5a>WHsl?#e;H;uT&m*Cl;kfX>nDBSECw3AnYR$07~w; zkVM819Qb^n!l21JzTetSX#J1C2++N7@ycgF>qwMbkqt=_2e5SS_(c_5Zp*11;zSq> zI#$1KUTmxO_m(jl@213wt9uCQan_VZq416~yHv1YE$? zs_Ij=ICly@9790gh`>KnqM1s+%mgHcq>~qj=r6nb_zbA~yE|5M`MgO;TW zjkEcy)D$fAkjdK5(HTmL_FA`O{si#9`A~1or>vg_-hH1UR}kFP49`v_o^>>qn~2(8 z4$KjoN90!kit%V7hk~*Ub<(w$3+~f$RkUR$I1hU`8L!j+V`~WnNz6+W%p|YF9r@=r zlN~lkMN87T8*EppZ-y@$geaB%M&Z~vbOx2%&vjeV7aVe!JvPRMEJv5p4$EyjbxF~4 zV9e)kJ1JHz^nFQg=KF3nLl4vje3}03DJF4@zm7{2$>~TvXM7(YTzb}(@ycKyPoNDY zcbpDgr@$qR+|GtRQ`~mild?014c8SWw^Rh+kFk91Q;9k^N4nhP;~4h!Z;HOXH4_SybcTku zBWU({U9`PbyDl_M6SC5)(2A}^h4wByf&WDtu30$O5`}s0Mwi1d=!`Y{-#&8ls9+I}0n1&L;; zieI8vDW77bY7P_=7O5CBw7r{9c>dxlh)%-E%v&+9EhvjZjsRA0zr4ImY`Gfmyg2TE zgJ#dT>G;_?(b?<3i)YB($KH2iQ+3Sq^5GmRvjy~*@YL|X*-#;VaXSsk_7^w59flSxfum%Cpy91}pGGe4e59p0voAH)lHKB& z9)n~>CFP9y7I;#gNkPC#IZ8cHr$OR5#jIH?z~WMV-On;qn=oTW&HL>YC5cgg%ac%rZ0< zuM7n4Grtah;NNmu?Pr`n=sCZj?#L?zd|?$<+{jL4Vg#r;x~9IZ?0&CA)PekJF|lU^ zGDUtQ^8tlN6O5r{mOL?qVZvWRTle?ehht-8Y7!kRwt=5~E632zR~}TRkpW#*o+!qp zHo^F>zm9k9!9VxuL@3QJ>k99M=VK?aqC?6S2FM=yHTPA_)i(Bj(f*!aK$(z8oXBl% z3=>kMGoOQ?zKutsq5!cEuQD&w&BK#CEADMi(1-p1HB@ zclTozZ|Xfgu9Rsa#fRq@OHe50K6bpm+v3%oU4As4hRt(Sr&T>vcQl{$d<7Hk(Gj)H z3$*TBRf*Z=4)nfEV+Y1jfC$Uq-7gu`3t@vEwssrPq49SfC94!g@b@WGv;sr>%mdBq zp|07OFw7CO93nA5Pmt1XeddC{rX=%|{_CeYchPYYKl1A8=-BwGE+&UuEu2IMP9u4+ z`}rO33EdI}#kP~&M@HdK1MDMHV61tQui?jgzXH`}yBkoUwaLH_~I4m_X4RWb4CZ471Bged|{%u|F)myt{hu_VEUps?am%>(?ko1d|$JpO8w= zp@BX8T{bzu1a%DS{aG@Dvn}Noa$Q68NxeBdmSL)rMg(#dw6zO=R#U4s$Fb zez&G2-U5=krv}!zu4KHbs2^2e2utg zKYP(qbb}13ErTFjJBe(VrmzTwZNMTP3+ha+b$pOXns3`P9Ltm$+0?WmG?c9^s`v91 zc7L!KNugMpx(oB-0LnK_b;U|y%dMjHxQ$FocwcDKn6MW<|E2+miJDS@l8u8L4;{ak z-5H@!S7v7yyYDx4_39`T@NV%eeS5TQRX3d2O!>9lblbITTH<*qa#cakB*_CT^eUxh zh)rF;y&-NARF*9CwfNK}T97IGWLoLj@GA$#c({4RW_uXE3lHTBB7j>-^QPaR;~1;3 zwsoX=`)}nl3CNSG*EpsWpk$MUfl6H{O%stBEiEw4{)haN(F9GafrP;+rK5+4n|~+J z(;PejLb{(_^@~QG=Vu~uTlcVo2eko<49L40IO%}tQEhLpncSlc5HAO{zgTJY!37#CSv zuU#UQoTII^f6L9=--s11JBq+PzE6J>XTY&l??bfZD;QxS)J!8V znEpMJnzBIxQ4UAU%vT5zs5Tzj+eQIDjzAo)?qVmI8v9Xadm}=|!A#iGZiY7H#2+OB z|4@GySRh_VoA92;lQ46P&;Qii<;w6Z1FLo@lA2Hj6!`Yotyzm$@(GJ9E&sMyjI zM{=6_s%KLI{Q&qHARY6oOdmy|eDD`p&>YO9%D$TF&!gX=<2W=dV?+V;Z#;?tp@NDEl32flR$97+hm z;u9NthD7^If!=h2EX+)L1BUN0*xVQ}X9&(%JU^pbJN>4fnT*je{FfDL z-XQ^M1~E2}PBq-c)@1TKN)1UV?KV~zu75MxTZxT4a}r-MY>K9GrCcEdQBSz3(-Wq@ z+6(;yZr zskI5##AnH51JGrj{N2q9ud?iI99Du!^MdtIsO{<-h^Oou}8&UYRx~Q z9J?YS;q6|mMlWp1Y)W1{JqvV@4|@WOyvYq~0CAeUM0L49u3W!wP1v8W(qhy;t98Ci zr`^aU798e|CE-3jBkGo!Y|$3{sP4_s$}q*{`aS1;nx1LyzW%02!Psp?hYz{$N4u09OcEb0??PIPtEZG^t+~-Q-q4_>-Xb_+xD`eWTR{R-^7C z*q!U&wweo67|vVso1P2G!p5+bC!e~^By&$Jr3QV$f(sY6pWz_(D*HZ^uBKK;KV+;m zKp)9;Wp(e%F2)HRWB+D-utIg+d41!7WBG5YdYfsq8=<;7L+B-J6yu{_Ma7ikRY>wE z&-i0_xsmfRQKw!ECGRb`zb-3YH*?2twU8~$ox$!y*ybt772jtRI#E^Y23o~Mua$Fx zoky(n79={YC^TfMe|O`9YB62W_f7dHlwfUlPjYy&NyQ(Lah;_tA1ujBsh*v0hlQh@ zb*Zi+%~4oM7Zm@hn9i3SE)l~d0_$f)4IaxO{D=;3DO%72Zur>Hl&+4M##45iD;WnD z(RX}hPUpsdX8E2o*w$LO@63Rd3GO`3?AO$bcE7vVmYUu!gT)snqRnjjv#VS2V(}A4 zoJsXN&D8Rb6bw=+>s8dV>dXtPIP{hKKVgti|002*L$9?aq z*cK(h1E=>e|7&Q|i0`V&Y*y$aVx#Ktf)P z4P|^*sJ)_wcz@v}cVWclHJsNw zS}VHruu&v-XQT@JiL2ut(VM)_>IdS<>=YuP0@-$%^H6mjCCcak{JifKLpZ{FydczK zY+eNtxC(I$psZcftv3j@&JW!GbTMr$d&z4XlfCHRJ4sMFI3kCFgsV?U2j^Pu%HD?W zX=^8wK>`yppP;|^dy7Q{SFrz8dBWnbolTGeysMa0P}3uDIb(-}uZ5B-j4so4Sl^TpEeih$QeT^GMv?<~rV9^BI?8yke$t~T-0dF)RyMy0pz&a%jQo2zT zHjSCnLatK$;SUAqoKTCL=IOtuaIwx znj!*0^_jBMWQE}Gzg2xHV$x-xNg0ZwcY0L#%}oJp$fkJMOWfGq?xRrXemrS7sz|e- zgtHSa;D(2^1dn@vo(OgqI=R@l-PoO-D*GW1TpG2+0Ie@uaV7poyS?Y(!=V7BGqW>8 z#~=k-%mce+_OI=xd~+J*0~?6v=@IVeh_@J}s%SpmDPcVh@LaqJy@_g3;(RBz_pljp z^WA)KYTR+MC_a*!Nl66#NMk$l2I;$;ag2=38sBL(Q1TCf@3uMEbq6bS^_jcsD|3XC ztSi=hjCuUj@KQqx{rb&*`F~M#-QjG#Z8)~rd#jo?V((pQ)T*L5rAX{mtxfIPHEPrz z`IXv1P@9UqrMA{8tzDEDrNNi)k6gK~ByY}n-to-)evUtIl>ze|H5ACk{N78p=sIv@ zZQJEH_SN>{M)pOJY7-)olHj~hZIUWtUPS8v+Afz?J>n(>cb&t`qi?2r=9jyqW$c5Y zG{6-Af!9~O!@;9o1tgX2kSzqxC z77IiQEx6`kH~rQ)1^I7tM+jL$dQixu4Nw5Da2E>_4Zk(Txgkf5aouM~SB{k0#ogg1 zmq^)9sQtcJ6xoT%xk=3VPdJ1|J;EXHuOhw$A!2KDr+$)Ny`Bpv*~Wq)lN~1~rKxLL z$OGg`-~?@nD!e!eo?=6YZL*oUDO?cA;zhmS- z<#vp^pG%#u?zGnlh`Q-y2%){ZHj_P|an22ud6E&;bw}z~w*Gj%q|L(-rUJ17;lYE z`;2yFxRj#@&Np}V@xqM>fbUb*uRQ&;OFRW8+Z$Tk!R$2Zt(<`O!~32eCHn-{%JFdj zj1e)#V*T!kH>p}_^s+-&yRO>LQTyMxV_wSkolg>3bpO2)QuY4q`#O{W;Zkq#cQD5e z@(w;-EPm272`t$X6nh5c{Gql?fXnaGj*2!EP#oxBIpQInP3d#%02DUO$;cowh_*bS zTLT@G$Kh&~L*VeF%^jCet7z7TOJ2NBLI%;7uOj`4I$8Nc|8oa=is{wwE-(V&0eVY5 z4s#y0f3Mu>b#XtK<$u8)UiV26t%gjd&~&5FcQDTW2~ngRF*OF@k60KN6mynp8P(Oh z?q+wuK)2jCfk3be23h=P5}oB{wH%rCi<`}ORwhmTta<>Sl(p5g<*Ql%Mw@u+h;U)c zoQCA#Z0OO7R_H*i3k_#6U*1D^V$!&Sv~<#{V21lj#U zOy7t?Ma;7zaXcSA&^JLhPQcP}Ku?>^J1t8<}d%9#rJYq^Q{+|xO^T$Xq=LkVfX}N!JW+fXik~t~oKyNaukDrbVraCZ zURFdJ&7EYt^>L7DNh*vzh2U;Q-#|QVjaFnaZ->w>(udYswe4| zJEd9jBR>uUZ6j_nTQ8kTVv8QX?CFd``S=g@4KQh-DOnBZgd1&%_k+ag2hOWr-#mOh z%e{|KU`l2eBOR_7xTsW-8shDfGo#&C8t1z~N3>cfZ`tc1jI@ z?+m#NZCke?D(S`XkAF$nU;gcM$q$fX3x7Gc3Wc(=g7a3OE6+gO7WmvF&al1z$n?n= z-x%^CdG6C^#@lij@qjC<;~4dyPJiCfGJ$EeKPUaYP&JaF!)o%msk=}Ttk{g#!OxPV zl25>7EA~NmzMUpF{l71~0Mv?=5+l$Nv)UVbSf8##8PT@dt(k+=!9przWxn%scu^}i z3t?}Y@oRR{7L3mfvhff8+qT@=%As!6NpS}3rjp>^<^RY|d~K$~A}&)uuTHJ4!f$6s zza6O>SyLhIZXX1jdG_31AHF9RU%5S&_kth3;zOR&0g)&kW)yy6`O}Ysn&sxGx53b@ zFFB8!Mh6AC6Ag4pq(G{S^<}dQWfRnt+9IrPCgiqnuaxUk zspOtwS5`YkLZTldFz`YHzr)&Hx-aJ&x?EI&YAl{T%{P74F8}I#l$Rbu8=O!Xu6T)H zUQKB27}9ejoqLv|M#AmuxaPN!-4}605J72(je=90If9tUIlvwdD5O)8BQvE&bbNOE zvsu7=G5wz+wEI*ar-$qF!#8(FFE)PHGEWW~P2U{P_L*svQ|(nXBuj_vydse|I-i-^gFN zM!#44t^)n0_MoaA(*N!aEv(L%3y*2wngZy%AfRP(d+sOCqe;(s$~OfL6dVBa=WTpQ zZ!mY%iSmcwx3D6J7ql8v1f-#~`^%cAX-O}<=I{^TujXky{`4^bTyl5_wi683!~i;F z5!v!Y)^SG19~?q!(u!^Syt`lO_jlZ}K|6tu_IU>Rp2q{fA02#!pUeWKp7_XhZ}Sdq zT0v_iYI{~+)y19jFCgzRs^2XbVzI*>NpSPHSjC0sx-VD5+#;NEUjONRu&&xE8a4lo z6#C8adVM|<^%iyMhfYKFjs7>`3;x;NaN2v)HSqo+05&T-(+@)UiiK_Maa0}+C+29% z>Q{z@lcfdg{XSqYMbFZ+Dyoh>+AjYK+8-c$z@qD`ofz%!~tzX^UB5?xAD4tEtys>C7Q3Rel4uRkLm?G#>+yLSCWo#8y1oq?qF2;LgR;m zMmB!Yj}K9TPOwyKSBNi}9%;5SESOM~OPN9S*Iw|*>4=bmj+VIXe<7q@uU`)_{s?D! zmLB!KNN^x!&imOMX?b8r;j6iS5f(Re3vv-h7vDgwisYKkrSt^_{o)} zOF*$eTlqB+s%4wV1Vs0#ahU54N11HOM755kGsH|^9U93)f(q+f{Du;u*tpoJwh8{7mJro z)wGveZl2%Cm`yZlUrTo0yM{d-;uLOs)qmFiqpGRWA9cO_em%6bem(%aUWG<}Ugauu zBLh~aTLYEYFSmE1E#u#3EjLe{Y>d7R@|l6d5WbT(eTuP6_~dQu5+f^x45_7+lI-ybFiwJ?X7UBi&%w<5hi)+Lz0vKcJ30m-Zi$ zqq^R*gG#+(Zu7cy^0p)ivsH<+nP+B=v^RA3`mgWaYzU?#V_36F-^)0o^CxWRxt_ZxCkhJtT zs{M;Y0g;e2WZgehmE>qIc8dhq^?NZ}O33Sb#2@RC3f77<-@W%>CC%hUE6}rFV3uOs z7o1KR;KPtuQlacsAL;F>6qT0aW5~RKw=mNOtFQ`axi-Qh?~J*d&HdXRLT+&U7;$q{ zhW7c|(e`oU){+|Xo8GIXK}EQvFxHq1AvQH@!`uI+q9v}3)4-lG0vUGQ&m8~#&J2rX zmOjCFJD~Q}Gwh0z?=`?&q$8c~BMpTi@5v)?-%pM+L3wY$)!kN1!DD7^b*O!q_@F(5|m zsPl~Ys{>6cNhE#XzyOs;qZ*lJUf`_$*oX0bKI}eEuWLr< z)rJ>k5NxhaU6V&)Kzrb^ew+Wxyfyp-@(FgOEt@84-sF;6%u)Nm``{G=ax*u^(bGp~ zh45L`Kf%~Epo8>Hl@Dx*jTNt8$~?euIRHX1d+2`l-8be)vE}Dp#v?<76lvFLwsz`qMz5z!4+}^Eoq+)#}qhZuwIf_gy zQriV(&)29TUcE;r%=Sam+P1$BUfaJdg+Oy5uC{mBpda1TAMIh*57(6=s?1SJKE6T4 zQS+;}XNSh?*%x~i%KyX{>B)oV6aHQ;mi=wlgSu@2Z*-MeM4S8T)%rD^vH@ZU(_?3e z$B+{iq=I3TZ1xVVMtNz>!%0nIIxRVSOWFY<zr@=P-Hzc94 z$vW*LHtIcuz%Yifh6oCK^o?J|)9W6SGf;zz$3i_)<-T{%Pdlz7XB(NTIu66GhtEC0 z|Ll|xLweS8TfQo8ADT1wpynfx7o+ zTP(y3F%%UGcO*i_Ef&MBu+zc7)7;{Ue=mTOpQz1-<14CY6pAg|__>gZT#*p+@pf>r zoy6ARaIs4&w_~b`sNToqWYoJv726SuB7)NF738B9;eH;Ppf42;aa%e6H`fn%PCps_ z(5sN0kXZO3xWSx~0AIeVzUB=*!=stDGWdSIy%T?V*E(&|w{H;kd4{T<9iUU2ZQpxQ z8=bJDF`{rZeV_W#ilzgM&3muNftRvcC!eTHdDBLU?9tGwO0j1 zi1R@-DWYE|>8R)mOzAQ+wzc5t(=VF@cc}+M4QoLx(eCei5#1`EEaqvQC~{9LnVP98xZI+49mt@y}EfI++9ZG3l=i! zzWlJ(H81p>)koNBg@;>_lri9EafT`h-I51&bIUz4(@G{)hSs|$4+Bz1y+O^8oZAWt<)~nn_5S3G@O%(lZq#LPGtK{>XrC0I51Bc;1=* zL) zm`kYtH0}swP7(UXvr;q_0=Z5=bFF1kZypORf{BybR zOtW(+ZfI@O?;b2iX+_M_zWn(EdXPo!8ixRxJ^_>KY9L=h)F6MIRG6lAr7Ywz*iu5B z9+%x>+1_Dc1vHaB#;w-VTl6*=k`Yw+LBZsw%0$_$#D;1Uy@zzS<+AEYiVz8PvlwlZ z6lpIul-^+x$uVpkDa)Qx-Yode3R5wiQ1T`Xl!PmX-(Oh23_PX2^mlPT67%q0dk4+yc%WfyP4@bk9Ks6Jjcwen=zei` z!-^Tc#S;uhU=E4GhDO`=+e;*t?b8kEnAC66Ac2nABGrCo5rl!OoH{Nef^(4Gyh6MV z^$zgq${)eL82HqQuy>p5xBj7v+IMnh1wJ}Ze&v5QiMFn~3SJJ!VD_|kW0^)UQ>zY{ zg8YTLfDT4_|Hm#WeV?*wj)C6kUokRcK)TghRK^>}SrNM&nH^zr>Oy})^FSF_HxizT%0UhQLul={yFBnvir zv2b#)1YZ3B>Me_~cXuA?HBdmMB0;!oV?=lmkGO5|kt^P=Imyp)Q&wYMdd1otC;QZw zZu>!2z|;G+uM%uD^}+4sF@r23p4R>9#^MEVy8=3&if>-W=gP4J2ftRx4`<$Ad*Md6 zrfj=}igPDO5AR()N?VVe-Fw#G_XKyOVNn(PJ)`;XR`tqVarGTyCYQr2*?D;Q9s?yr z{<7j+6^LG5aLjNOcx*U78*xWd$ zySw|<>|&RfqL1ej4ISTO))*=WVcN%MD_2Zvul|yCSGRvLjOY81KH8t~`TWJx!Sw|e zONa{gbZG0AaT(;12i50%};6I$rSVoO7CJI7)YtwAXw3-wpRzqzBI ze>$S}oeFgwE)BWPv_J3c^C{1FkISmNy8336M4RhkS7+2P#++x^(p0|BsAwU5NY^Ba zyp`2V0+RT=dPNj1mt_pYMS?jacGQ;pS_Ef2_**IZ{;t*lBp8h49^-0_X&fW2C=5Q4 z>|*wyN8avfm(}0s%&SJ6)Q8|BvYwc1q~cu%(0_k}kB|@4XSi27*zvjZYo--mI{p3uR&EI3jKjeF=8L)pdS7wK{>rD!Jpt8G zp{fXeoa3+A)_A9hu^+2EP|1bsy)&;bFEf;Q@Zz5XT+_pW@&GRURWAHzqjw-ldKPwQ zy4khT`Cwi~d9~-cM|io2`YTI6W?TJ_R`T-Vic!JWTUJm}L)(mf|Hhv&Nla#&2W0_8 zuvL?<6M=DJR(Ag>4mU8Hf{+%@^vJ14zz>*tm`bs47X?AWLk>@x3{GNN^Icp&O%_0+ zL$A~mz$}OTR}w}1Ly9l8s0~!Z&k@Ej@KoD}Wp47?K1e?GbIK7Oz&?qV=`Y#ddA0XJ zB88zw_$y(O=QC>~u-(J{rSvafZq*OJeMn0Qta;K$1^1!!D7w0Ga1UQ21}0_;#Cs?r z=v706{?OT3kswSSna_Ky=QpG}P0ke>Q+;FAB##4)XR^$D&rgjsl2J%EAr2@bfG~&A zEZ=)VY>}stFDMxxavmuH_jcddP`<|Bvfx$HkDj3emb?P;9bZxVm#rkADloR*ATTmc zlr_WS5oM|*(o$J^+kkDCqqtCcmKy<{^P1)?|K^>^Iu|Vd zR?uSAcGn9pY@6qk`Km{KV5HUCH!r1lb5wP79Y6bKlR|jzbF(ggKTjwuXsUb5F*mD| zDy?Z*LixTceQTG+Iqmp;Hi|A}ZKPlhxzU-LSl3StGjcpfzANYDGUr~f@%Xg`qksf$ zX)1hHnbkhT2qqAzlIQuqgj$u$$1md@K*PT*#%J076f}RZY~?`rQJV?&h_c51ID_I4 zenAENb}y=Y<84x=-x+uQZMgsrMpmY_%~(~b%J^4o#m=U6Nt^o%1lNDhRY<8SHH9`$ z)0XBp#g;Zk$AiYXcS`LoSv!3wmDgwte#XgZJ+J(yZKOfe(2@{Ilxjjx-NhpjYB!`S zSp8TiM(H6ZT5H<>e%pnAnzmGOlx!Y;KkJ^(QKRo#8%4ClRB#8SKx%@qC?{8BbIR3K zzd6QtAGK+nXINwFhez4PaNlhz&LII&*;(6d7SgEQs9 z&N^Qn9JlLOfsNa9E9kV)#(;^nZL!I!+gj!v2sokx3isPM#rvyp)Qy_cS45Bjzn3cc z{vS8}g^3I-&ho%wY51~Y_}Lrij)2Rh>Te5r%wvyVnGY9%dfx{zq24XlL598@TMMXNXtQf+2O>gzCyC8{U_~H&h%*=wObV%_g^rH! zpg(f_huW8$rrG32-dAYRdKjr)d=PxgtaQtXpZ%YYTRt4zP`&qVr{+9GI7j&3bRyy~ zD2{(#UifdpV{;sa6}Jaknzu<|ar4f(F7@&*fIIR5D*s=(tT`G%162G3o7wviiY++A zDK_b79Q4nfKAC`ibAku+4`DM)H3q(_JB$L=yrrmIwcTGd;hl7DEtZGlkvY^TI;N-TuDhxex4Z z%>D^42PS=FZB)DBv?tMAsuNfa`~#uc_HQ3x;G$%j-^-eb>8ZYNpH4Myn2Q-7E$&X3MfG~rpeQgYtl_y&n_+I6RC!tIh+lGbX}nQbCn#C&8Gd=J?0n;3AK#+ zEJf1px5*(krjK6_ZK1ilkR=v@j(*azpoEoQan^V>ve^xk1+G@F#gf8;C-B(|76}2t zQdYBL@7^~Q-qegC7IO+@PV0&R-NZ6o4?t8ygs-)RM&J%{X}ZeX9Hy$5LGGgxUK~Xo zG#n|++R`8ZHqiY*#pGakXUbuZ?k@Au11y&&FPm_K_q ztc-1b!VlKm-*bYm}!!Me0Izfncv>J~r^na%E96YtYek}X=0`$-*dOAi- z3BOkTp(GOY_4VsWKKDFPji#sEC{r{ZX+0ije927x@vo8Rf6_trbaT|i|0qml=&AjnAKZ_Wc^A<0 z^9K(_w8`VM-i^2dpDk^n$}ZiXy`%%ZG;@E%T>j`tMrrPkIw9ONE0LMN za*(o}>A*_T`aybpG(k#OZ!kIGB~ZXDuEjw>E zqZh`pKS&kpdJ5^@nbpfT=F=z?Hz7k+e|(2-UTNb)X1m##xfgVu(fRKrkq@WkAI?hG z>-?PcrIX>;uv*jbGGMnVE!O3^1Oe_B_NCuNh0fWS_WW=L_5t&1Y>x5W<^{8x-<>F7 z_RD8Ixq3rmld6>ppkp5aK9I=3yn;}_eQ~mqAt@xP;7LYQ^8ywtDXU)5MoMJfUDWN` z{3)f{3lAZk1oGIVgBp1N)Fh>}#KhtLh4Fo6%f zLsJlylT7p~eSP_4XhTU5Ck;Ujlx>MKag|$1F=tr%t9rA$4V6%&R-b7yVXNz6-f<^^mlyypNmuJz1zmyy<%vSKYb1HDY{Ez{8`gOigWP*6ujc zRkutqH!koPD>^bQw_()(mGiV?b$9SICYT1fonMG!>hF89IpOhhkC{xH_XE73$v3@DKQp7L)lo%)-#LHu_ z9qKF4q`DZo^|2OHz6A`!1iDHXr>AWd^xqv}AUQJp9Iwp!>Dp=x?8a;^*u)fllv_`w z(?6`1-#d|jZfSrZETDtI(IBl~b9|qmZIBN3fj&01`9LNpBVb61$ahK~o}dpR0m!Ne ztdk>&UPU?exBSdAZ{tD<^XpYQD~0YC9eGTkxlAz_JmBAqUUnoN5s}j{w;$ zbc%x%loS@9L34(Ic0n%NP(7VjDYiB(Tx}o`PL(7)VCm$%wY~tQ3JmJ zFc0@57Wq`BFaj#by6mvVbWzlQMsFF=WA2n5ep~I$-MjtOjqKa&({Nev$mhSG*W=G~ z@R0Tx4E2Tm*3OrPM}2Hnt;eEBLbrQ0q8~C6wS&(=7>w@01X{=i2(7TuH$DCEbwT;f z+1tCH&Srygd=BjL&)!mpCxEA>p0GKx$h~iRr-h%0oGhAPbalu|PS8-Ht((L&TN(5M zZbU`nrYxEWtixgJeKn5>QLVqf9KOkRNe+*u%CkzIng0_mASk?wAl6 z{ufn@8KQm9We3fD!<%cbf^{SPzfyHk8!+l0+lSve^7rc>zoZP+>A0hZhw-bvJAY?9 zg2J7~eD)5$gK}#le4Jc2{}%@S43^9ElaE zzqgt>aKwQ0to*$5s0)4Ezj>UVxNW(?7}gt7ejDc3p=;Z>gvFY?y;9`ljKo3J@<26( zY{>nSYZAv{{r47w$GEW+pp_l@RJkis!vpQk$5LCLd-y-$LSxGbbiB|89ow;@|h2dpSufqMo-~89FL}o z5tD(Oer3-s?EagZ{S;ZmYC7dVneOj5Y!>*mF@}nh6bA*W66(jbR3hqk;TczXhTvH= z()I0mzg_&bc)oo%9w6RvV`H*KbRK-zA{+k%ygrvWNLOavk1JMSF!8P1JMYz3aqLUb z0SMuT+wsl-%;?7U?YUh~s@Cxz11RSQ{pp)ji+{+a&lNFu=(S*(_LL@E5(JFv6xICl z)zs)u@TIEP+U&bm{xyIqiI}y@pRe;i?fM0LHNQ_^W;Av8t`+J@g81-YEHUR76YOf^ z_H|Gq1WxXx^Kn4kd38+TRm)ty8 zLsn-U^ zEnMuJscIImUH6ayot=ibb3E8Y!9yX(pM3vGNn9R$-Bw1urz1w_qj2Q8NXi9RtW!JW=D^niC zySl8}ZYE%6oGoU)UAVm_#&i{9^FL$o$8*T=1sE}yK#KynN6_H;d+~#o;O)gnCt5o@^D0uyFZqxq z6w$RbpIeE5((?&)#KZ)8m;*57g=~2~@1H*guL^cvSVKoI>BM9R8)Kg3DI)Y|Zc--E z)u*Tb9&|MD`LL;l&p9np|ILcP?uxytG!B>}#vkV=^^BKDXdwhLN9iya<#FTiFBIY* zeVhe?Qp%R=6Tz^$0#W3zV+E@`x_4i&Z@`KOb*vta%6ULJiRMAkS!E2dsr5+zsy}D+ zZ(Tk(qEde&_pD?8&+SfscU_5J0TG1#?Mqtyvq^%agNx}6I_P{ZyeFg3&(hYwepRrq z#xz6}=@%K;&=DC?%Q&WU_*f9G@A+0w>?B>T1ovW(K_9>SeesC1Q0-sNVLd7L9@XGL$a_jd$9V53UQP+{ca1{p-c@AQ*x(4UJH#qceKv- z0J6ZP)!e zUO+{i6BPU9z{17IbzfB*M4f-TF;>4B91e`*TI-D1X}VNv8;?96tlha(+eJ$AAKQL= zNr#jWBrIY96%NV`3{X~a>gqgxA#$-|-{KrXQm4(i=$#^n%GD}nr)3zRVwY^TK^vLi zK}3C2lVoR>&UxN?{|Ks6egsInF}Z2n>!zLcb-0Lh+dYE#Q>&Oz#No~c`-_$f-PS;X z&DyTCtE=C{;dY~h7SHQ~ypsJtRT|-Ew{T`j3rc%LmWj!3Rcafgzj3D`$>zf}y)grM zw0&+2+v%rP`};$0r=uFz(YRhMOzO(qJj|!8^KQDH>H(MPk>6!LDdZVwy!rlxKQV$p znj%#7$<4?lh(7P!CB}**Tm1m-R_^wNt3VL?->H$Reg;5K9(KI~zpVHWM5U)f!ZS{u z==4|ROiGpZtM+f9;Xjgz_Ua>=VNXB+5kj3kP|W7%^nZc59(h++%D8nH9-iTaa5r0y z+EsgTJw?@_qB|-36CGPoJ>LLLxWjkzNnS@mD8&c3)~Qz4inJ~QW>2S_T_0vq040s zD?X^w{DD1A5-dq4jwW=>WBnPK@-Qz?bJB0c-aRrSeB@ds$<(Z$wO0!Y|FN;sqP54<@#!_+a`H2iPg{=gCf z0{C-2(jRiYf4hww#|xs@Jcgnk;V~Do5fZRyljci;IDlPzlqpq@9!{UO+sdm;+v*|u z+056t)5pH|1Y5b6$`Al-D5y1I5sn@a-kAYp`3k*};zfwpY`fISE93eA;GW^A!y{au zqonen#62`ddp|OZ5hb-fyXVK`SRAH?lsGAj$(7_$B4HW;q&ZY$uGZag1^3U+pacAE zmv4HPCyvI7uPg<^8BN*D;$>qa$(iv*VuWl1wQeXWxDRxYBgpb=cZ~0-h<}5_SH%x@ z@y%mctTgjG3s6$aDL)i-UjGe^_-TY~u>sSF;_r=L#5YMD0wk(7XA z!V(ad$RpWFMct|>RLCPaxk~36F~-lk#tbS2HnFPs zh5Q}TzSokGz7EBwo*|wy_ZP^j6@RA zb}zPPa;!0KxyWGgF!3*w%`g^X0p5D<8^lyoTB+YGT>0D0aKqIO@)`P}f|iCy?H@{9 zFYVLP0}U1?vo1(tGoJ(M)J5;MnopVw^D&h0%*8FvI5I0nr8%-Ol+fdsydsk3ap;NE zzorkMQiEQ|ZOSssEeTvv6 zxprb+WxG4GSf+ZSAt_|fyVOVrM<6B;cq5T|IQ?`nlx1l40tDJZSA_`5Ga1Zn7^mV&G)==CS>C7cgaT}@7< zS=VKt$l*T}Pj_DN$}8OK{Z%8B9MNQY8JM~tt!^O3!MK0;eo#iXXN9RYmO4|1z(XHH zjL$<)E!#8#o37G$=t&&Y#?<^G^3?qos-T|(=%5Z}lqQqPFl3!6WO2xy+L%BlXR?tE ziKFhMBqU7rb!n;9VUCBS)Fk@O`c=4BMa(z@{TzNx$2~t726Mcl zh_I|rbt3R6BX)ljrEN(d;>!t7ETo3~x@4`Cc^k%CMpZ#O#e)2uP|>fY$Q>!Y+Czi9 zHMM`^o?_m|zr7QT@3Y`aMEGHmbox8}G-$;y%re!oJ!a|J_OhjM55 z6i9%TAMWgguf>JobW@a?RZgcB2|NFltc+0#%KW5w$&J*aIv|nV-oeFUH40H}L-&?~UkK#uL83_s$JG+HZ5|MBKCduC0i5%GuKopv|cMmV>OU1YHoKrIA zoT~YfjzP`|L-#N4*rp`5ww^$y3*Al+@cCM!9VbFWI>5Bh07}uFE`#`rwV- z@7p^}fM&5ajaCpwa~TgY-4=NC;g4=G>jEyo@MeeARu*ulzHci+C;z_UAbIi@l)ubE zAfgq!HzcEnBK|l42A$T97)p}WQaFU9zIHz0aan^aO{>(ar51irO(G~r(GtY9clH$- z-+K%RpvN=h;M$2Os7*rdPohPU`&)UlF`l*>U120u@67vf8G+Ts3AEjb5~SVATy7zz zbbl2jo}WppMWYEiHSWR_6!u8>l1d5z_t?6Jhqu~?d+{NyUfu&%41j$2y4WQ8{|>TF(NxgjD^vPN{~su4 z0uLG1zyJaK=Z(gb=?>vuQS)Poxl15NMg<}hm}_Kvcjv@;@XoRo|+sq z%d?Q*MNh1DNGpbrr-PhbWJljg)d)|kFamdqZM@zGo$J>oGUJzsqrIiVZ@;@I- z@Lk9>7Hff1aivT^4estO!6BJc)Ch|zA=Lgdi@aQ)=@V+g}QnfWK+yd0!` zc=j>>%KA4;k)1NjPcl1|Z!#Zt4Wg8u%`pya5-61xW0eq$|DRTmN+JtftyTHB%PU+h zTsDmb3YJytqw{(B_P!ST;wh;?yQ_ck2PFhv6*Dc|p2Q4pX~4d$0fWgKuY?yM5Qn-`Y?2 zJ-yXy?8eiNxal!2jws&QS?>vmg*(Z(MCd^osni{)O^qH)tDsYUvA*R|h6sU}VtM(= zJSwA~!8cM$6*pYK5HN(TN&$J=hkiA);bItXK09A4-{HH_)}T{Y(N8HB6-x^F&s^sp zsZG5-zK8TSd1DNT6c!Sd6_>@77$;1H`2EMX((i9@;$nQ+{KVlENnAn3BX7=ZLZ+{Y zE_fcznnHE`V_@|=d8!&~@C`52q#6v%?{FhKVQXk>(8Z10Lr&Ckg}VGI-*Q_*WuUAg zHdP!9NLxLWj{YG7;^6DIMt}1%Q-a)3`xmd`<+Hy2X;~L#22eGOwS7%q?jJVe;W-H? zIu)^M1+O?2N*weNc(L`vW0tbxfRgu1zb2`=Z^i7MjAgvfpaH%`#O`v79r#~9Fw=w3A%#aLMK zc1%h{@kb3xM={cqb1-evkj4Cw&Jz<`<}9m?shIL?>4!a6QOT{Q(?ra91yV!L>t6QQ zH^z6HMwR91l%V%+#XuBSh4AZyBhw#p7Te7T@d&!hpOanUWh z&FK)tv{*bPx-%R-_{CO`UMJyvvjx$6sVve3sQ5r*DpxkOBhRNVL43gA z>LCvz`b=hWb*?Sr@S)%RZ;KK#i5H$zK#VhGAu92Vx`mnd$e;X8DV2!f5y6I%Zs2&f z$7C?z}ep=+)(0g8}=6Yr;Y7n$wG!w-yns$V1-rYru=Zx8t=lBja* zJp+$?YDoidaa zF*?yO&kptoSu<{qPa({ksyc$SHQtZg~=QSUP zOl$Lq9gGg-2^ajmF8Bt<%x5Ij?=H`x&ONn)0@@4JPu;&hp$Cpp)oScCYE!VVJko;* z&r5zRIUH9=DeF0V1HDO!2yC4GLR#ZPN1-(>u53H(-MLmWOa0_t*ONutR=1DR6c$a| z1!=wCkH2uhZU||SAYP#f!$%ujdXk2>4bQTAtWN84yH_j%&Z|3b-Za41seqe{oye?u z4zKXr?arO;owHfC;;puIySk!t?F*Tv$-oFaK>aQh6EcTZ=cGcQ(RTc(Yn-#~B94an z*V`W!`SsMLx3`If97*A4&mNM9Ebaw#p9{Orb(TCsj^Env**>!+UZBjeZw{?{3i;)u zI%o^KHLMi(8-kNF8Jtla%Yjs0pDHA817-cz;pn^c$#J2mQ<6_U(c9xjHq)mX8k7@(ktBN-hx>DKKqAJy~}63 zh-VXMIv{H@I4r^{nhVnLoUZTz>Xf-Cwe=ohw3n(vE!aDs-v0Hu6w>P_NMz^gVh+=- z%r6*Df%x~s40T$#Xiso<-@z?_U{ao7!6xGC_xUX) zyoFG}xF3sMH=F9OJ_3n^ym=!@{j=uunie>}aidh1?UlJYepWs@Jqbf)JbdFuCZfk- z6k*rLiNS2pS~!*7poAmZb}dM2{W&`i>K;Lhc6J8`{T9x<=A&Kxy4`v-R>ut7C`TEX z2o6%+6C|?=*M%wglpo?HM9Gp;NSOGIF%JCFcDAAeK!#w0ytnr|Jo8Vb2nPD-Kjpec z=l)Pr$+S$v2NjAs!-f;2U+%4i-1%@J>z;J=nme`EJri57*+DG-G43$fQ2o$x6MN_+oHhHr ztWhmQ7WwIEfqSxa){74>>j^kM=N$&Z2oNPMaG}CS{Y{HXKfhkAkS}WNckI?Ht^{9{ zkQ544)LF~1__;hsi?K4d*sSOPm)S?gk+JecMH3VNgsiSWBj0#5I%?>&>KifeO?!^W zF8IRmk=5K77jLs;=b-5AY11FJ*DUd90Q~-X<${>vbA0EY|8aEHVNHH*nC>p=Zbo;B z(t>~>F?y5;NOw58LnMZPFaZf+!03jN(vucJkd}ra5)SzG`~KN=?b>vM53p|HA*ak48^63wxtuYpB}~B0lYKm-hTVJkRYe;5t*n zSa$w|dF%_);aFbnA%7H&b_d-}M4pQesG(XO0ew@<%4te#xG8-%&C0FcKN7Z>;k&uz zL(n|EpQaW5?QAYI$3Ch*_$5zhmM<<46^Jx@;iBZNJf|p!qr{;Og&a^6VObL{_Z|y{ zob_`sRQb4<@6-R#1VZGFxffa!J2)kNIVjaD2EhKt+gp$|RP9z?39{4tSbqKsOBg@j z>w7M@9?_$uadypcdOEpao{kbvZ>VpK=~CD9OzT2n$^z$y{s!!tAIxl39fTOb)i1Y9 z>vo|XnVX)f`ku%L{Aqmg{6oa|j-KP^vLdd9lOl=lWO_Sb_Hb0q17jC|(lPFyAjL_=_#R zJ2%6DDKj}7-|6+F{$!Qo&8a@ALw(2@yOK$aqXC}x#wFia9)K?VbN20$7w$Zx0y9c< zl)np1++>Bkkxm>2J^!k7nRjv1JgUX+f5r=M{1E>e!McZMk55B?f-+y!(SOvwFP2S| z8pK0W0>fJ*lgy=~4&F-=X#%a8p9N8nz98aH5WdJa5(r^^{^!%&vgQgnNAY z(cF810arS^IbyLr{k${wA}l3=kp^u2Fn{$&b`@+=HASLygy~k77Dt#1+R91f!(HF! zkBOJOb9Zlw&VVNr!zJplZ6P z4Kr+d(`1B2`l*lq?}uRoGwwJwKI-Xx9p~44yT=}d3PyPjOQAd&@DpCR9)v}8i=_UU zqUpx#XnJZ7pW=x$19mSgZt;& zM$2=~rA>6Bv?=?l(wE)&ctB#v0kU$1wwwgE=MUt_hdyi^nzPp0x3L_jZ<{>xrhsu0 zKo&|uHLP8?6k(JZa@3D?T${ZD?iyN3-@c_c=&YB}QM8hjnjONwIYN7lthS8?}$khATa!KIeZy4nHbB zA`EsDix?qW99TJ+c)6M#CBn`F=WVb`59(X@UT168L}6g)|BNt6EJHK%JOIVxUY+B& zEMM-sqbJWG~FN(>`r*Tn_-yEu-R*=3VV$&+C%D~{l4 zrUy;Fg?$_`yj!th1`Xb5d}w!(8??kV{zaFmT}YZMvOl0NmKPp$*bBJcztk9r11kU4 z1FJrNJA1cN1byenv+%y-a8sJxtXTMCtkR;wij8Aug(lO-5zWNk;=XUHh2>p_tL8Jy zLGDiYa&0E*aLqN*&YH$AHEB~HU*uPNbvpj|z76`5RY$ihbFc<7_P3PpZ6hh{^3^C7 zKoX4ugSy?`pm^{gre?zBMbN%~S-X2(+xE9T9-S6ys{3FMuc#e|G&9L2Zcy}>;dQFI z!!$k}g3f6N{lsgVos_zSub#qE zX-|k-W~Txo|GT$G{Gf{E^G0OpKQ9)DUqN=2qnxk!QMn(b2i0aoo-!5x9ViZ_cefsS zta^heO+_jjGILPFXV-5+Nn!7Tz=nakz;s;L5Oxo(y;gpPIJQVc8$=G1E?H)_(JbT*u7%#YtI#Ns zx}iZuNXD5nhouzxZaYouwLsr zHnyIrI-&0@`RtYP@A{mqLZF2;W-txmEsTIDOw z%WW_JXs`3$X>R-8cZhNPYIVaxxFlo&U`k{f_lOc$W=49&yJ~{JSX|4Lg@-6(pv3E#(K%QI=+X^NX((rLFm074i!$>ejJC2 zx~Ys^xZN+`cAnO`{wn1_Rb)|X=C*oX(j~p4UQTXz$agtM#Zt{CEE=G3W7@|i;Uoos zv@Z1+k}TI#uB5fwmO&?926xinA1qY-AKVRDFa@_55Y%a>Cd=$D*VFxuUu2!YalNNE z^eOYD!nnP;u7gwSQjE6D{ZL%~3hXLRO}Mb}YvdEe%1NAQ~S#3%-GQAad^ zu6nHba@$W&RkjEB(C6af!GIbV>u|SKj_W>a-mJWUy5Zs?!B@dqv?1F;QP>DvB=-g> zdN5x}7c?o&sfU!X3FxQKmuToy;Z8t3SxQDT@fEPmLt0T=5%{_oW4iodcaZ;Wy07Kl zV}iw~y6u>0g1YzY`%lSWWSgw9dLO~xwca@_iV`D1G{C?3yHe$6)WA%vLk9=5is9|| zeVTEYRGr0OeXD%)0>te*j3AvtF&1%PUCj@Ky;)D4vzK-%Y@|XT_{J}BEjl;jF9vG3 z+IQh!oqclmZ~H-Y;f}PpTVY>}FIrZKa(;#X<#{G^+f+X350k#0F~SN%X?Y&~bf@y2 z>%Y4y5_G;nsSBLzt1{~JO0BRpo40rjIvGS^RBhaQWuowQW;!ozo?M;AJs#GziGpt@ zQ$#gsHLZJN9iol}ClPVq8xy*hkE^~E0P;F|e!?0Fq$$5uY0g(tn|n6nGc3Li|2Mji z>)~3qr+N9iHqu_-U-$Za8aczdm~nFx5v!O17Ey3Ghdu2zbK zqKm(l}s#P&Fbf{^lkrI?$Tt!}(}Md_J*mvBQ%np!2#TkR7}Kbq_WK z%}H8_A0sO9`YHhtpB%_n3W@Gz|q-#Ubz!M~q+^C_+t=9uglC-RN+q^EC%#9%%5sA40E=eYveSWK{L zY{|e6=ZGDWwkaq2cw4JS)Gzg0&%)C*kaLVWOzYckev#A@vK|z}Q%SZqoZ3Yh)*H4+ z!-w-5+t>g48nViq(NmQ3Iq6L^*yWvz%O>W2JXI=5%(oI*Xin%u4WZFnn0333F3-WY zeYb4M@<9^%tEMS>-563t`e5S9+N>YRB%0UuHJ1$c97<0R{;`Evkq3{nnObM()$}2{8PS(c&S1z7 zZ}4<$1`{v^&m6bJqq=aQI9|y$i0Nw|jTfYLv+B)7FsQsfZwk4tdvWoKLd5gJzqBjp zp@~^;mT>WD$JeoQPyejtR}&REQ436e)ateM!5k(T@cZ?W-97EQ4^d{VO!6AM{W=Jo zU~noG!M3=>pm7|Zcq@Pbf_Mqy`bz;@pG8M3=~=fRs{=1ru=M3O%SuINjLF}T`Fb&; z4e-KrTqi&NnaoLu3l>M8eiS_B%c8xwXluB+DOBBc%{PcJMRXF8(Y~rHv3p+Ag%}VC zt7V+1%Pq0c6G#&Hxg1+tIOxWriVc~SUCRKT?(T8ClvCrV>$>&ENRE8{p92u@)L z^9Oxl8)X89-;Wz&Rkn!X18rot1yQoM!kEcY!Cdo#`22xiNdbSug1R~9#JrP8NJ^u+b_e9RnNoweuP2^8#TmXE`vzH`LnyGxKuL zUD6~nO3pe95hUBaZNQ+94R>~=%~bhW`_F8Dul`#>(>fac@QxH{48BpvZMFi$QY>=B z*>2ASZI-gubB0U4Q~>Oe-PZY>M%92h`oHIX19dK83yNch6=ygTpjSaFHvX9i$C0#l zS7Nx&Pif2@NEK%yPAJ!+c3Rivveow`+dR$WV_T#4+$0;bLYhPkQxm&VO{ z{v$bw{`wcF(#cmh`dkTx;t#yALg|^IqO5phlB%~cy_h)o5>6qdrr*+ZT!yuH`jY>4 zKOLh14kkW8A5ML-Jw%07m!xaagpuVnt?Og60J+h@?TljXrIX2Y=>1C_!r48Sax5` zm1Yy`>3S0G6qnYH<&N~;5*<2STwH}uB1_zlkM4d3-lf*uQo!zb2IN=cxbJ%ee#CEr zKzH$NtN*d(2+7t81t+i+(JTzqJn>u;vwii);7zS6!yfxyp=Wih^5AGes13O}k({#m zuPjU!%4^H}MoXw6z~i|Gk75%^Q#_t|la5H4F-9d3P{Rqh=<*E-<=beLGREY+t$qY7 z-ozn>F#?`k-b0ul~1Z5>3e|X<4U)?0M??EQ-CW_B1+$hmY|Y0&txyg^~0o-n+>I z9YThMMp1z*p2x~1U5L)lFFE|@i*6|?!QDf4z(-$6&um{#H4h&-XuCF2XaDr|PFGBG z6FAAv;KGJPWS;T9F|gK^JL7oq=a5D&2C#W;`T;FMu(+|ir`yu?*XOJ}HxvULT|rfl z!d_bpbTJABlXpmO)Jv*GX7}DG-aQM}aaO`729)?5QFZKGCcAx4HTR~*B~@zXY5Yzk zMFR{V1lrK!w#_wo3?URtG=D8)oAXOxJWs#dCo4pO`%-xm^fC}E5kM^l#utAkSsg(N z*j1#4*L@R%AL)Q{dExHVa0cliuFp#x7rTVL#)Dc>4- zx_~L3H-(J+o4vc&$HA9z|FFeOBNf}~eQ)MO3d@w8qJGtGl)jt3h0;wqq%QIe_KKEm zqmQT4USt4{Hh7w~^vHf#NF?5>F;MJsSxiZ6D@e#pQR3&6uCRrSj=vkO zUBGL_hOpB7U>&GnPQ?J(jzWlpFl8+U_#9#uDxCh{0i!aofI=AH`*$ZWSh*$q6!9Z> z%sJxn6(Vb^eB!)Hj3-f0KGU{SO-ZX(De9$2}iA&b^(S81iyR}Y;W<1wp5Nn7`yh-d?=rE!Ev zn7mkI`)k7rHewiRE0e1Em&sw4tP=}}I(zVPY>5>1fPRLNPs~O+4 zERyw_T6iA(2bSE9mkOXRR)g=gfULsYaBc06RpTMT%l+o+ znK3XYTFFP$u?llq^d%%SjD&BwRuYCEIc&w_RzSag3XK+AY0N2u)NUn6_=NVq=TFhK zrQvS0(OY!swAJ}WuM}It>FhPs^Qa10a+rXBzUAX$AfDMtF*+%lHsXw9bME)St&|40 zmUc1FbY%NJNh)$+yXr_t{0JQZL)=n!)yQ^(z+h|H$Ao|hbWw6F-(ZbAzIpA!TJ$s7 zCOc*8T7Qc^j34!6F{+d`f$+BH@;!dY`KE7Nc3P*&E<5mU~c4x zN^#2)(qRDh{ZT+*xzD>TN{Jd*sIm;-bj_x=aJch~d&_9?2~qa2Udm_kbR6O)+kJEO zQ}^l*#wL@!)B@cTUm4l(9hq2|-mn4k_fEC+VEX?okQcwv(;Mm}ux?zKeD*lb z^xg=~@NG9Px}3}mm>>5Dc(H%Jvv(y8^Z&QK_mD&Z_v!5px-z{uI4LqSDiv4TqT7lG z6m%9y-(kV&)IfZ*I(bkv(sB&1`SkA@WLSIj`%763~kjhtf6;WUVUK4co!2(vY14GL>kCS01z5H+HdHJz!mYE#mF~gV@Hk{va zMJfSI(_CI**arc;r>ZUT*{~y&UizF41gaJ)pr(u<>qG<043&vHuivu!&~{df(q&Mx!onj8W3UqtZA4EC#WL zl*?i6QYyb*k}ryigWufb19p=zEgWtXc||vFCtVi=s3B0N4TU@^siL3Ejl*HwiWY(l z2V>4XA9PGdvaz=JioA5A@RM2LDyWO)8I(WS6a}VM3`Ijuh;Rd30;)TlqoOno2D0DW z(7r>n#y}*jutA~Qd;XYlO1i&_!bc1YjZcgxY_ZYNg|0)&{$r!U^b7kYR680U;rD(g ztSnT#ZiHa5GI0#4to+|^(b-T}It+q>tfi3WBO1M|dlL$uWqSp5B8<93K3tx9zuk6y zO^glfC4K^4OU8n8&b)^{;6?4wVl86i;v^D`k6@O@g2{IwZin(^BYx#VRoyADNTak4 zwp~9s7|>uX9==6MQ`m`ZpTvG(|Q#i7w0ybKxKB#O{VW}w8N(sM8cDSQ#1T8ewXO2HLq7%!_1=9dc48E&^p zbEUQfJyqvYgIDaD^kXZI^|z?+T05MewR%3=7Up z38TjFRQljdwDrco5($BJH#eo2DOG@f*d9zQw5F6N&6ziZbjGB!p~W&!Y>666BnvT4IfjI?3aV+u%Z6eB2T{`ZJ*ZJ+G1KBS z1vY5Pb?0C=fe?u7>oY1jighgv3~d_uNCApQqupLJGGHC*qNJlslnE9W7pdTzS1s1-s`{Qq!k~V#!&rwKCXBprbE{n? zo?xyBe_0RwxHx4Fw;HIup1l~JGDZEtBDERlMMuaH{l6t@9QjCR0;!B=H6ZGFF?3a>n@l+#J>Wr3OAy6dw7!nU6`{H~m(eNbPSzS1NEwV($|IoBK z4nF%c7b*!S!Ze5)z6^Nm%JlJk%ckC?F>Jyyu*aFHTjMiif##geV;fk!V7c-(Mjn=R z-bnB3NPLLn1`2Hr2;TBK0Fz-dLHbet!Ig!1G5qG-`MPvZz>mvO7nIr<`npK{s*8F+ zYKy&kM{JJ6mh>yn5p8Xe}=d^%Rn}SZpect)p0~H-sARV8JYG2OlhSpW2N$C?KUJSEpI7XMwk(0vl zsHK!V9KOKOJA2iApw<5ndXIy6F5(n?ywb(y|A)T0%t6xsiu* zD_hpnY+}mokSXOyy}Sp2iG39h#_PoHlZZJ*$U@*s#$&ixHX%dSwyH$QF6#^OS>2g? z(Txz4f7?nf7Dhi33&W6-aBd+r|4!POo8OU};U9}L>aR)HfA@SW-)c8Xx~rGOL5z=U zL>{yx+&(soC*IuNW5Zg!#>VVd)(#?d4q(g^Mqrjr&fmCBlfOa@BYDtBR}1hOQ+WA* zs^aoOo^TB5TE?xGH^fAC)ovOlKParatBdPVH89TGjVLgBC#nYJ5K=ouka?71!Mok3 zL5n_OG^i#o-_1#_>&75`T~mwsIG>)sEl(JLDSkGfn+YVQNYfy*8W!vUg~>MA%A7!U zN~R(@8*J?RI$&b!bSC<3&u~3ncPIodlftyZFpppi1}qtee(_Kj!^w;sTYhZt@Y|Y?rGlvwAJJaWJY%-|*H|vTob> z7b1+s;U-irns2qXMnqraVAU!5x-lWWy_w~6RqhDqf)>UlP`q{__q$86s=LhWf=TjQ?r462O#A)1`7IjeGd;a| zh?u=^Q)bpa#_0Z9rx8w0sBrs=5Ah0op8fUPtfwI>07a|19_+1oMH_huJt2%LceA=d zX@3*>Nr<{Q)zSbbkdV3_zuMX@&|Txxycuw`t@vg}%%x`u6QR?n{P}J2e0vXhi;^Z- zv@m(`bUebc<`*k1&>(eBvDj5{t)X23vJ|>DBKE;wAZ7YNIryVkW9voc==lk4=Tr(h zNCf3fLID(Og2+=vGnof$yH>${;yeyyqgCK%bT#k~HmjK~d=S0GR7*{R5DXjff94$f zBr(46*<=k?)IvYPJ@^N~Kc{TzDSq$nM$Mm?Vpn_(u01kG8Ez@BnwGZ@3$Hxh3=wV;lWn+~+UJaUVl!X6*EW0~_EPE>QCmN>M*Ed#_Jd}*K zfxRxw#)OcwbgNpipY%9*=33S!FQQ0wFt&>WVXaR6H=t6Yv9S^0%D260gqb^NI-lAe zZXrn20~@=>t<^80@GCuJxXqfuTM2PsIkl?4SPO?yc;x`5Z=*Tq_Ujb1X@4RnwIeEu4{sc?M_0bSzf&i27foBDA|WS^!@W-JWF5OQZBte zsgrMyCh@R0!Am%Kp99shPJ8l;(=75Pv{EFV47ioJr3HNwPp<;^(Pz}d6e3~TFC2_2 zPc12KhKEZ(xWX(%mc^a5KiWf*1P!Dkh zI%Gka3JwN^4=@f@=+0g$?#;59e*$KqoiQ7Y8OtMvXoLbx-thFcu(y$PjaY}4Q;VfvITeyiNM+fMAf7xeSCK; z99kl8X-7xVGQp(?VZrPPq^+Z<11?{67VKoY0SlP8r!Ctm#!e2b{#d7MfkG%5-{epK z8e6zVG%8U+zY7opgdw^7@1ca!Fcl#XAGEf8DC`j-P$EDLP+lqju9E{|ZY$>TlC9Io z9$Y~^lB)*i{5mloH7v-Y`(LESMFcSLPsS{+nwJLS;(rdNwc1T67Od|KCl#x%loAtH z#BMh7vONX!6T?yxf!}Coe$Ls7RBrQmrihhTfFCR4-{ham#J(qFz)CG~)C$0YW89ZM zUV8^Kl_73Y0G9c&xs{N|_QJ>P_fV#h*qSQLdJRk5gcxTfL|?k%-rS(U7>s4b49(`D z9y@JnfIbnzoo;`AYy#>03P>i}gc{$xZvJ>Qh=Rv!E0!ofu z4%)oR=iCx1_Q?YEjaeE#V^VFGzGCJ|A4XmuP`T5n%?=#eafPBtqGWOZ-}SH^*DRK6 zxAgMz@}1A&+OpZ1E-fn8{`v*trim{rYX?ibjkhx{iKnNV>&akaU;k?n;?eL=)CGO@)to;XC6 zbjdn52T>%XxE`2R@|adsc~HuCLH=s+Fe)glo?@?9NeDhVfrR1-tJyQtTIAKuJ|B6; ziHJ#hiM6O5p`ks9_+h*MSPvW&eOZHvTbnu-Hk$38MmWMK_P&@amXLV7Lq{y~s1Xta z_%A%R=q;pT&9Y_?on`aF6YH?VBqI21(HJM6`6wm!p~Ox8nG#@KhW!|K5qVE6C8c(F zRHIw}kqo|i_g^2jdf3n{`gCG-=%~QsuK$>q3us-Z6^h^9u?kK;+x(PDYOov;b=0;^ z_a4V?TwtfZ+WgthtLmpX&p_J-!g01+j3UMFa$brp_i9zMg!XqgOm^>@F@T#q+=`dM z3t_+2-Uflgz^(9e=#UtC)zk2E*+ zPdd+9lBzv~h@#O&t{Z!ikZ*&V-u(jCBu8)xJ*vgicDVT$=IIOxPmb#YTw;rH|9Gg)$%DR?Uf_@r0F%Qjg% zyafLH1|MRxu1M8>du}$R-;c8`BSx(7oQ>=!^Dqsq2jc=7R9I)*B*c%$vnjNj#-yvTS-kBD_TQP`;hI&6+ zdQuPY;z-trS<*+~WaqXpf8YIOxi&nwh*Shu;-swHf^5@mi#n;^MeNtBA0M&cf~?{- z-{I*ldI~I*)ND8Tbl6e*dId(m{%t8~C?zhJVx>{uy-|wIHbrgo+Y zGH94lNfhw`R$8v_aAPTp^=fPKaB`fALFd4e3cRZdYh2@_ql~9heoX6hy6dz*@WbS~ zvh^>@Trx9;nkrgu2{IS`o4ES5mPmB}2+7XkiN!PL7>Q9sEG|hTvt&9v!9xTai$*Xx|Aeqvdn1s$PY=ruz7-k* zlQH$I!mhsk9jjxbD2Gkv?v-UAnMY;r^pA6UpupAlQ{0CPr#?x+XTYEP0ZkYT-gRlS zjyn6I0eq_oK0o|bD(*7;T(|w_nSa|&Z`Hzd;H91e-(DLPP(Wb18qUzCy~PZ)d1CqG zmz;3^4?fKnhlL3FpVC!X+60o@;3FUvkn6&OLP28~+f*q_^fL`srX^yY?yC?WRChZw zxeRx?|3%Q~s7nhX$Mb_<){*4W%To^G%D0@gI8SQG+nH6^UWaG?6I)?9Gv*h<8fuKc z!K;$u9#2K-s9Lw2HJdaU&eY*$WUJAn^v@ALjMu!d5d+9#W!yrf;`s9TVduWC7iSl0 z`uPrTdmDljF4H4gj?bj`rUsBdr~k#6m3r3IERm328C)F!2J=V`Hwm(>i9QtY5+LGT zSR=k&_F{KgUlD2Fy*YS-XzZwG{Kead?<{69Z31k1Zj?9Rx6Rlo|LSTW#hGXE_6rS_ zBEfsw&L#Jjh?gH_Im^{wVo|(}8dnG2wSGyvgt)4Zh=fu>a`Om3d-nf6%ZU$nA&yQ#liRBneBJujZED`~ zXqz1Nh$Xic#d-#FRON-xlldACCtKjZ;0#}@Sn19@Y6ZuHa)Kv#OYsel1cW|G5gm|~ zY({O3%DvJ<3j!?g8*h3rg?MGLK%X^k+!VT-J2IhnIRA(3n)%HFUepu5-=q#VW>4q`vLZP3 zlbJy;tmz@f2j-WX@6Y~;$3rLf9d_OVI9M8aUei5rd0+5kJ)juD45a8aDYVV6nkx~~ z`o-VZcpmTzkEoAO-Vkm8CE^nQZykd`CEYwEYobJJ z4C@s->}>3W{|8w`%tVT~k0kbi4;o}&6h7Bfol zwV4e|k`w?!e85!@V{u4kf@255d7tAVO7V<|ra8-fV|?(`MSp#_WzP{R+jLZB#UgIn z;R03C#V7<`UlZU#Lip;Ll5lZ%ts>q$<`r;W6vR9F-P^r`#C8V-*zaS(*`iV&!Sh>K z7uooKUGaZmqZqd3d92VEGcK*d=hoU5T^DT6uy{CtwEkWV9(=awkY>?1c;@|R^IiKq z`(o4Cg}m1FO;=$eRQ_TieCt!S0~sX+dPCeY$zb zeLQ#meduLO*yAAMILMeTLb5u`muy7VB5 zgtf^h$rO(}pO6a4v^336IwD?1rfq9EAQauV|GLy=ynNabbBas(J7f@erQ;SVk;J^SfL~_!CvCOEn&-uRi52uzP zFE3KBfXIRG?-ko96@xT}LKSpUNgd4Jap<&q_T_S?j2r0^4Og@vyoh-c zpd8=Mn%b@XwGo%#RU4%#PRN!VtitH4XF$T^Qvx@I^xsJ^I9@zd<85xDAT#XWmV0eL z4X+kmZk`eiwj3GN;{ZxZHT!j|*r67jR+Nv;*UqpbU=hK2-n)fgQH&1B#A>m_@N;_Y znQ!*G8_!2CvQjiZ@nIA&iHPI%jSb0RLHvR*^JkmVfyS_RlGKa;>~S|-g<&h%@z9Nk zq&pbb#%Xx)i5aqxW+-f8wQa}KWOwE0-4{krrxGdkva%b4Q1*Win{UPx+-I>wL zJuJn3?$`U~e4qK!*ujsp2Rh9$uhtl7bmRn_Z|rH=^{O*33umQGte2!@elH2Xt_Tmg z#w0bOrM3J&!wV!C7?#eYKSF(qqI**Ln98{3HE)Fbyv#O$8++oh8?NW!z&cqAFr9zi zGlv-_b53-`1f|-#Ya;aPl^J{K`R%nvQMuSx8oAHwad!5-C&Y$wKNoCN);Klslg1Qur<+32t}4g+rmU! zToHn5EhQT6r#^s8rH? znK;D9K~JUQWnXCk<6f(nUY39Cem9A%58$Q2l1Sl%ot-tEkxY2flNhv#1C}hKi7T(@ z{pM89R^N>10Br`53P_g+;i!8(FZr~QCJr(-V%My*3yUSmLBGOKA`?@fkqnA6o?e@5 zjRr-oCXQNmCHmC=XeM}#FY<25!$513xE@{_57okSYnSu6?G${~oV{$(8wvChxF0BW z?d;oQ0TXaXXuSyB8a8?_W(HAtSn>E=;sH7sM0(K->?9mg{+uH+kBl`aaY{cBaZRyS z&)9Ia`JkZ2SPJ-au%q^XvRRX0A85iLs?JJ3+ve5rlc{-odZ&647b$)?CF|yU(>_6! zO{34O-&{XLn#u-duN}Ar^19OVu)ppk(66_9;EpLGqvhGQw#&7<61O*}N5Ya!ov0O@ni(|b$JV^>vB zLHcAOpzG%;lUh*oJFtEzmp$hs!==zuT8WMV&~J7=G@x<7j{|$2nE~<=o0R-qH?Bxw zToRp@TC;%*bJLy*$UoXNy88>5{-P@tbZzMzpNnJV{{$E(S2czx3DIngTgCjFWL+`+IeG7I(op0;KtA%_*<%At1e3YO+23npm$?W{TlIhyuTw`ES1*MA^txR z6f*=8f4UNZP5UVuh`{{1F%4mvXBR&NH(V#Zh%993D9;RallkI@F{!rJZKty(U6CFc z5)P_(AwSEnHvc?U*ik^jo#W|M(da}Y5|78ugQ^UOH+jP^wMaa&Aeqzf?;Cp;(!OoG znKNeL*A}ykypA@YF_J?I^Xq&YGov!a_wnVmBW+xt;a`E4fcW7A4UD$!JItK< zecTDU`6R^Tox}i`3BYWFxw8v_c>G6B z>r@Fxaz`K`0QH9J#(-auB9_NH)}=wW7RjOg5C8PcfdO+rF}t~RV~=`~Ipy4&h#2UQ zhe`G+=gxgrGj{>oRwr}cZ#Q(eZ;+4^q5<~&l|3A z#;>`?1PUxBj>*)J6rzK~#c|>o-AqwovmGHo&~@nUiO;p=nXG+X_G~|2mFU0z-$R(h zezmawW~qnk^S0r4KFBYUnmv+0EGuAg6Xak^bH54({dyjfJZuSsnZIa;p`|=Vt(u2uAAyT+IMINx+Gsls z2U#d^8pBUZXFh)>tpPk2hnI>w9XlG+LvEv6k__r_b0sI#@ytxG^Qnl`QXet&^T{}7 z(3y)-f$wc~uN6&!7e~)2w0)fgx`#FeVa1&D8-_2sYd_R-?KH~L(Sv&pT!AwG{nb;f zEXGwds~F&tpB_jgtq%i4I^3jxFgm$)$g!*r^TY^E(*=tNAo;owdV0OF7j8U=^syV# z!zIwfR5p^!j9|bTsf>=E;e8U6Tz&8;ROdC=+9o?~$hLma+-~eKsi7w$=XwB3unNj0t6w1=6l|Rs zNh+EdM7DF5BBZQ>a5#N{^<=4(b)QKY9gaV_n67=VI3^Hq87WaD#MdMVRx}5?gTAjt zI?3bwuq$~Xxa6Mee%b8zUsOBYKSrH(Q&^$AuQ2QXkf^isW)D_?H) zvXTEazvNdq={6qO7XR@L?ge*zrhaO{&pBXia{R56wW zr#k#9aHK?)Q0sX^kc7O0F;AMLyTxCW3-V>9h3SKT!`Qat;KgDFN(@Ch_>nov`Z^yb z`@-plo?#D?DIp-QQAxgJDdtxL=Z=H&G{@E8WE}Gh=rJPB;_$~$`oTDel&g*R4hvJU zbP^O-={d`S*gg?yh}rvS>sYv72po!MiYfR416VkuOLxsC*BB;#DGurV@%xqZawQAE zBe2KZS0{OQ@Rtcg{n>@;%!X@+h)=$;e{XGrYQuVL*p%Je+4u^67ogtn>s^B4cKqG&f zIN9Csr^DH~_7>zz76K$D>tA#gJ3vCI=(5wWSreYicz3E2%yC5Tz-)`33A0Cm&(8p} zIW3HslBuoVac^4T+Bn-C#q&Rc96Ky}5I0#?{~-SZC(nC+X!aGxJQCLP2DmHbMu+{l z?vcKmbcb_={_w42E&MtU$fVK$7o$~pt?6(~Z7KOB%w<8$X8X%hK19!gXMo??kchlh&}p0)CgefhEY;=zpY_oV;M?%o|e|R%;e$HVoCyED~4QLl*0px zUx$U(6=glg79njZt)RtoCSKmy18d8|24Ygx>ng6+X%^ew3WmhC36*96^-Pj&DVB&Ol_o;uOe24d_@ST~K0|fYp zW&MWF9AW7`FI*%3y&u8au*^M1MdV0K>3k)}<$^~z|JW^*s$wf_^~CiKbIDJ z!QblP)4$mvno_fFpg6`i;%RE=C?U%X zpQJO-n|k(JLgdJ%&&T1*x(!L{G`#mZ=IH81;|dI0qg{l^4=Slm^kwUEXZ{m+BUW{| zp*(CNob1+E9H$}tX*kTqozQV?q6ZHGT-`y4+U7k!1SjM68hBRKym=2%SY z?v;ns~Cx6IyTcf3^C_!f>gZ<%gf zw|1-DykW*1Z{le68vrf_IAU&^qNDlQj@Xw>3g8W_#zz=dvcDmC;dMV0`ph*kkSUK@_w^N45;T z7#txyY=HH6!qNyUKIvX1tkX(Zc24+*AD%sX_T}%@^yyFkHm#q2O4HM>AHMz0w0>Ln zIQttF^vKHe+n1%^#KnV*%D1mx{qTEH?_7kpYVmFJm}7Yqa-Ypl_6n$TqUfZJohWhSZB_B^wCEwK~Ru2#qy)I zsnr?Je?FrnAQSazqthjtGcu;4J3|`iD<$~zKh09mYS>=KW!@_D!{9Unv3iIXQ#HT?XXoj*Th?R(nJhTL{x)Jb7h~_7)7nu%cO&h5< z-?UjeTBUdIKZ%>=y7F!_J@?JYuAUp^_j!39IVj7E>Z1F*Tik!PA=Z7niuG?>utAq& zArmpmIZAP}gyW@P&RG$wLJXGjl1&(`I!B#?)=QVqU82#D!d720U7(Rwmnxr2hmOoz zn5bYew1xTwJZMsLbgU>;namL#I>y$x!{7+gL`%X^J4`#m(NU`eev|N70<)k%(XsI@ zqUH}BU->88eclOAHFV=CVW|hP^jyR4_$SXj_uTUvpqE~H{w3KBR;yopN7vl9NLZW^ z=6MzqR``x&ZWE5iU;oeEeUq8Jy-1v|ckkbSu=l_U^L)UvXJ*fg!2^Q_7z608Ce1<`XhVQZbi}YuGa#mdf(?!c^gF~J z?M@(8yFe?WW59a5e~TuHnq%ByFckIO$uBnew;0OU7WZh1X769$n2Z^^+W?E9d#|Yd zk7_q0tWzYc$v1xgodxw@X4O1suJoNa2YFbTKC4%>d}fLu!U8H5RIBfpzWLQV;}K6a z48v0mN?7$DCJbZu(ReaBxqooy-owvL|7+E%LBz(xd-v`f>_3`JxHfutB^@VD~ihQ+yn6FOjvC(*GG}k{-6iQg{>i?e^yeqWOJ+D@+?x20;D-E#1C9H0d z6H|J=k0-JE)st9Zh^36x##KUXU>)pN`D(%ytZ+uiPf+kBAaU&8>Gio!IMfhpG*-si zx8NeWoLaRyu%jU3_K>emS-uJhi@=h?caDZ378$FJtAtt|5LO%pm9IDs9u2Tc#g&wm z8oR%;J>0U$;!dFkSp*m1wSQm+Re(XRh0*~=5H;} z8Oz5NMx_Ut2(jlqU?O0a1GEHS(ryZZMmVSg#zVSC=IS2Inz|>kvF{NF;uu%D&cFa` zdteDm--Z>H9sc;U2JaSGA+!`+UaeYLXb@Io9+lyQQ1^0r-Fm{x^N_FxF|NiF;;Id- zl-jUjcvW4%3O_*6>*!Yr>&L>7v4&e3y(?uYxV&1mnxN5$i zuk@WoMSQxCuqrjg(&bU&Duh)VSgjgmff2&W##h7b?N>Cw>V(IUQG6;R>A5NjI-$bTRQ-pRS8V0S~hM+L_~lSRpn#nmu8^JJ zR|E1@m#=fz@0!$<=VYutw+cBe+}a|x$XZ^lS`kuJR1sDj2N_`XyPbj)!kTna7|sg$ zY4PF5%2}rAeYR>vWbB+Wk*?l7VXDpt!!r$aWx0hGV=N7_EVj0`h%VEPWiH!EFsDvC zz(Z?1uw?{F?}p}s(*ZCMFbe=XS{3X7=^jaU4{)6BIsK(|&nZN*B3m)M8W2}KJu2f9 zRxM*$Tq&#+S8=ztcu)lefIOH2FehMVA)w-0pyL2$QE2EMKK>fIXH7lgyGQ!CIto^& zgSz1EE?`M{mX}<{;-1bRPY)txy zh+(De5LUz$19zXV6k3WbE|C&hc4lZv3k{i~JVc(?%{k4d?ahT}t9!t03k{2pSCEaa zs<3pS=Ld8|T-zR6);>u>0CK%2O+YwL={H|krgxCV5V0$(UQviFQ^q*lRJ>mg* zNOnSeMbUEI11{4&D8$u?O8qYBs^msald>Z3ltdPx#V|`*%ZwE!EPATo6@bzMHofWm zdRDqeA|SAXR|bP>&~B=(U*$6ngd7Pw8oetJiL60ab z=7+U)4|e(PVOe$e5L2j6Ty?wp?TKb(8KKoBvJPWwpuA;ffMs@I@_>#56do`pv#SD% zG=w4z>*yYe4eK64;{@u3d{q|3tm9yoDP!qaNMN;Um6ozqm9KI)z;bt?i=r%hk`FH+ zY7t=Z5GzZ93;ibvbvk~Jc<`_6E1L+Yhfqhut64FnBcYyeK>eVlgBiuDAR_W`e9d^B z4V3R5DdLIMYlXXxfz|Es6%FBfJByRnR!76KQ*b-NVAn9cNP&Rmr#t7vGDrN?Kj17t19<{i)BXj`m8#@In>YiSrd%91ydweIPp=2tUa-@S`S|l`c zEEvACH6dk{vdivl=XL0K=mLbPP_B&@88 zzz|3llgw5nPB8+?$`k@tmk!F{9svaiwON1#L`VS3cM32LiX&jR^F#OybwGyz`5y7W zv`qIDb9N6}qI(K~OtEZ_upb3iCVgd2nIqn8M@-sWD0>+N$P*xC%!o|^IRQl-C<`z^ zkb`J54-^4V3ZgAyivWu#Jk+)pdnn*ExE|45Gx{5>i$VO=lA084FI~Vq>Lm00s;Vlc)I|ASvct~Umu08kKrnEfZbF$oQW00sG$_LlmV^&Kc8&duO>RBFK~f-Ha&BjfC?8 zD&*4L=K_wmWT@&8T&$uq-@hf`X_c~%N%k$+%vaub@;-tO+Ok_5%kxQ)iyCvJzORzH zIQ=)FfBsSC3`e~2l96%r8z8Vrt5c0;r&}DyA_aG8r_$LOLn}e4{1fXb*Q=ErP;-JP zKN@4Wke;I4b!-D`m(xLWe#&^d%xk^At1}*LRCQ3 zSDrUq_w_<+D?VcShSL|r5ZZAN!Ja(PPeeN6tmJ&PR=OIm2mmB+PJcyzQ5LtBd8^|5;umg3#0!4Wv9=$D7UkYb70n&f*X6_*tAykDVy*bUzm$RfTZ{ji{XKjrS3> z9|+*EQ0-svH1jPQ`v~PMY=BB5)2v zTctl0d6|*WQ}#8B!Sxj+`*ANf?{hNtO_S=xJw(lRWIrDkHRnk1p>op_hHvN#^Zy3S zPNw^?T0C5X9N-$bvq}X$)g8%%Dw{k8PfyF#=6MsCQ`B1qpN_d<`Z|ycPO45lK;RlF z%B33Fy^RXU&f5F5_KoyF;d6F9m50P;!auTy21ya`Tv#YQ!EJx!1)qNq=ybZ{mHK zoAX1c4Zg{^S&cCx&IIGp_PXp@hbeia3Qx(_WnSo>d#nTPYN9PWSQIQuv#j#YCZPTL zda|urXS>=y21(_ssccWOej6ya`5Gigb)e2rchJZRs(BKtX-B$)^Hkz#{b*sdR%BZE zzDDTTyP$cUTe|-T0Pz~lgEPQ6150wluF*pv%0);bV}GwCFP|`@hkrV+qQb_NOe6~c z!2cs-vf{5eZ)5vr;sCJXMb+ur?l*P`{X5%AokA~w>)!wsQHx()CEH^oqBZ}LufL(4 z)J1<$K>4qgv&seh=C)&`m``RT4jHLTt4r{+H$HHE-cmLP>R)E!A8*$WS8dGppEt0Z z3ai8BU38)TQ^LaXC8|2@d3R(VswT9)J~VyRa!}5cA2+^#_`20b8q>p4u6}eVpcCm% zHVuHlOb*v_s*I48QLUPjU5ax_W?pu2G)nQ%#J)*{W;dfJJ(|_Jc#ij*nRg{GKB+zc zJbslhoYWnmzyfK=tcBkhE&<3pwMyT{*tsLNL~#CSB4;vXTSqHDA$@EX{ms9i9#>L( z3z-0*HA-re9$zp9{1-*Jfr$5YsdNUp<(qmiiweClcWz(WYRtxS6)|F&cC z%BSE@l_J~f!s`KxJLNU`K{MY!DgXBZoI+om;I9uy;`7F3=+T9uym6=%w@csk-Hybc ze(`#5JY0#9y}6J7KL@loz{8IYfPjXCfP{pDg@%EKdSe&rFRFn9pkv^1VPfHuv#P3L zv$4PDz^F;!wmFF^Cmawts^?@NZ}c0vYfdu&^fj zBk5qDxsa;fXu@y6mKLr!1GqG>^pJ+_lT>WAhLAtKsCuledMC+XkU0l}8UgLr&y!zV zkueA-0`3!?M;M-v(JGI4K1u?fG9{^k#;tpdaXfI4L*YIT$j2PGWV)CZ2H$0UW|7~W zZabn6NhM4L&pPOmbY9?TGolyN349HlMpcMRg`16-AYer+!^>tjAX9z^(Oe59K=8_1 zx$E2^m)qg&^>7t3!@cYPW^~YqFO0`~%{BC~BZ`X*iG-r^r2Q2w5rrbDIq9b$ttH-QxI4Cw7v0T_%D9c zjf9il_(7d&r)I%1vya2KwHk$g3<^uXrZdzyM#hAXiz-BLcP?eE5RQX_G033nuVl+e zm>(6_kmT@{fhg!0}=c2-?6Ox21vB{*xR%T z&pZ(1iZdRM*64EjzVNROaY$HDVK=--rW%T(1SUwu(jqq|vmc#Mj)&eF9_x)M^KU&%u=X&#U~ashDufZ98{Yr5zr>&3kBD@%S)(?;y<)d3FdxF z30y=W29Li7rq)p=i97JyZG;QQ1rg1~46suyMM0WM$~+M5*tw9wC<&!-AU{|sI6&|L ztJ6?XqD>qrh8x4Tc`Jx=ORSXJ%9)&Z&qNeNP~uOi$sxApJD!d})LCA`o0?Lw0}`#P zZW7wFa)}m&m**HyUu)>Ony~B(h?u;G?Lg1QhOTL|tOSa^E5{s7>$j^E(Fv`!AsY2$>jwcr>Yw2YA8_aAZf^H$vz?G_5^8IY zGufwMzSa>caJ*VYY|l0cH-T@VBO2^^Kq9yT)BJ1HA0v>__{;wAA&3T}tHVvo4QUTM4xJ`7RL{hyIM@bXU%k4Mhn z*^GRD?!_VDNq{?AhUC5}^bdcq=6;dU$NDMnD^$5IE>tt&n@|$y+%+DhNx4+Cy@b*D8jEW zj_$8X`m+p|#j{VN_q%H%!^>HN^=y!BRig-Yx4y7gZHY7J;3?bhLzzkqA&td0O0CuyCB8A{N4*iJ&}jo1X<8)= z1XVb0Tt8D3k`f)CGFo>B`+dNan(=((rImSf?p-Dvmf%Z6s%}}va(INOu6sYGI#3&F zh=14mZD~dMQ!A!L=?-1~CE>1ws)XtuW2&yv^$HEd!el>);a7Y%XCm!yKtjfQqk5e1 z#n^Viai_;7%m@Y(f8vAiiY2U092~s55?iq}7UVeDFp5n<@Zw>TgcHF_n#E`gMfHFs zaB0lPaCfO{UX4?ZV|dbe!Ben@I38am{CY01>w~yKTp{Vp)vkuvnigp}iS`Z;rBf7* zxLCNjBfrGlQunUYxk;mV?fu>P>F$1OxO)lNVbU(nVjoYXS$Pe6X7@Q==Jo{d6N&TL zG`={}?_unm*kve~%W$M|IF%?#ZRE=`s`W%`G=45EpOcU%{N9wGJ=9p2jk&4y zNvGIfAT$nN-g@*-@1vzTc)Uzwpg*3Af)tXov^-)>DE@HtRksc^eDX+!e@PqqLm{p| z18cH6m&z#(uE`;gX9`E7j@DUK^;I@J0#`LP9*&Z29m{ep;gmJGY3y^d{-lXJ7Q?`i z#L~2^GJXvOX^js(qpqm|xetd)8irNghiGwws;VNbL1mobD0Jj6x!v4x<9V%C7{`FM z%mub_tMt+%q-*uG0;;5`;@&7zm`#uTx=$d7r$u6zd4^QtYX@TMN>SA z>fq9K#iL60TqY^?I*UrqR~!Qz4DbQd-r)RxZ#2D<^tJl6tO>B84;Lf5nq^@yOd?c9 zQQ)(;rLGm^FqU1l$Z-%Uhk3qvfv*v%RnK&sa(Ok&UR zCD}_xWUER1cO&SpJ7qgMIfSVW{>-NqQ8sG&4uA_O4R0KTW21 z8B&?B2BV$HW^1gdX%(zNb~6=U+rMtCI7NMDq3Q=9B~aZ@8kX{Nw;Bs-<_5 zd%m^rH+~B1tyjIxN&70ArC2dO3VQ#FQqHUT$=?7t)z3!{bGKltAJMlw(NPH4)0aI| zWL2E3#$nc1AEY0djA6OJk&?}V-Q^%z_wa*C>veM^yrQBxP={Kp$QT)6#|OR2cN|}B z#82{7ilYMQ{jmc5SyM%p%w0!2GtK9PL$t$>c#%Qf%%OXu{Pp-E7>F7La0%<#uXkV5 z+OHvdhLZK!F*~}WK1L}i`Q=sBz+!YQqDuUc`hxgOjVYOXD>zOxrX%mt9;muh%gk}vDRSDvC|?eln~+|w7Q4P7zF)kYkSmhK+i*f(DeYs zbcL&~x|(ne$|qX1f#ctRf*<=a3%>zUej^#Q%gf`nZkpVN@%nfy1L1Rf@^|50ajg(oc~9id1x8tz(WSnC59|Ep=S`&GtOt7kQo9v|^|FdJd? z7cppB1X07YbpX)0($u!r3vI z;H1+kS#z^42VRQJ6VKp$tHxOhUES_bqS~39iVnf!8XscT()2LE+NxND-IZvu(sQxX zJ25$Td>iR?<~Lw*HaA>}AzLw(=R*ZnzaF8znN#VEpP?s@~3bl2w|4m^n@LLCR`Xoplj zNTZ(aI?S7HF6dQ(gm@r;z{|Vyi67PN#plM2cWmSJm*U zHz@x(HJtVV-#wWz`A+#AYd_dlO?TzH(RE$g*U#m&lzTj27 z!+B7Wr6cH{ymbBs=$`K!WO3j`x=yYvy!0Q|o`~oMn!qsJ9p+MD*xCW_egkMP;mAh5 z970L$sN_kcBFWC-`KBq%9`kI_sNC|7yCEdL$k!+F@=*s^=(62$4v%HQC)Dy?qMh%N zRWa8sUylX|!ms>$*=$HtA(hJge-Q~*mdWj}uq=$VW6^;d7_RBvIcdQOt#D+ZHwAHK z!7BxdQ@}@>@JyBrn1m_^kn{iiu2X(k{LN2$f&JQBX3TVd7&VQns{cw`V@aNAmfPU?{kWk{aLwg)!HE2rA*gK0^f`W>I#Fyw#nIk-ea&f7Pq+DCFF!y3WyT1X zc!&)#E3CXSNH=Q+ePk(%nF&H$i_2l5cKz0Kb@%zEkTWg|kV&_!#BY1P^1l;z!wL2p z%i%}t5j2}fjmA+43)ZxXpg7(8FMx#R>G?SPPTJ>`>Spv?UcA#QS*ObP?M|dNiwU8* z+aczak0KT(WoxD*aqKd?GK`_td}#F}%z}L=pZg;oyvrqNE5FBAyZ9Gbk=}kw4jaSR zr`Kh+WH_VvP7+BW1G5)U$^Nb3t|(?COC(b*PcN2$RW>}lw6wG>gd<78hp==NDSYmf{Y*ukrx+lrN-uYOrKk6d?*QpyTK`!f6n zWN-)XjYQF7{Yt9OfwTuU@?A&2f<8fK$r}*iBj7b2QDc zAZsuoX*nezELaym@!^F0HID>COb!+HS|T1EPTD@m4N%1H5rFGEGZbifs&nI%3_K&5 zk-|t(B0t@+cQKeH*jiu6jBUK^n_B{l{jxK&tx#%Un*bK?r0?JfaD~XF6?J}ivR73^ zO!d7hO{JfqJkc4Z&Mez#elJsbM^da;*TY_Fq@^Un!W3FU$gc$hEN4uci&y$8;F^Vp z-sm|<%|w{Fg4qOxgn2}HwZh%UAi6cu8ZkQYWp!=6&eS@M)p+AMgg)a7Y_Ta)A#~PG@Rf{Wb>a{US;(^k)O?OFBw->aeY|g7E z(E~UkycdJl=YLk4GkU^R$7$}Jz`eTbUAV60sh_lf4r9Sri`Bh)GXAG$F^|;a%*}Gm zO*0Ybz`d=0eWj#i^MPds9wj9uH9Ukh&M*G(T1fN!1=gSNDQ~L>^D12Qrawh8YN$@5 z!g1(vNONMI6~=%C{}-nJKUdkMT#5^RzW~efYq53puBIkGx_UbuUMHI<7c?eYo;gZ?Z*G2LJRahTSFvWfoPLo#9Y}>hn zv0`BVw{mpPr|D2L1ZYXl?O{3-BOmpmFqNz=mkkR_?f&yGXsjFTfcYMHOoP*Ghx%L85r^E-sLemcE6F2S2eXIr|54S+7MnI>^g47DIkf8LxddAi|M7Lc zp3n1*QC6R4C9l6&h6%@drsEGQI``EcuVx#;erGSe{AAQgPz>Y5p>|l$ISFcsO2W|O z<0Cx0O+dnQG6KAi|Hv?;bI2Q@7^~zgaEN0L3TM0X8lj_d>$1I+u{Ft~ zH@aQ;Tx`?TWeS4xZ;dj>kFw;f`rl0^S^yWZ`(%-L?8GN6TSn7}m2~VThWfa1>1jxZ znlDiYBH+V&lZQ3ikMbUeWBO9e-F9pimOQx{P}Se&xbRA#pAEj@_`~~RgnqJuyZGy+ zWoxE4JXij#_QZYzEXayYcaalHE?%Cp?nxeWXXM>qYs!8Q0Qeo*NSXHG!F|l|lx*ig z{U&Kx(0-<~chT|D3zYT5A1K^ofM`*`4ce`#Aj!Q6%NiQ-7%pIHywqU`SJ$b-N4&^U z2TF&1Hp2ODH6TZY2xIiu%Sxt^&hDI33#DzPxX`Bc`HK#fp|8x~TwfKCGA8sv#73x;S0hhze`8s16G z&-#iV{#}w~T*26}G^%6R?kC+^5SQh#y(|5Em7-Ib&*T0; zM?$BgWSN%XW*!MbbHA5=pg)3;92Wiuy4d_NasD^B(uQi}f0Ujztpc^Yi>HXj(Uaz`x!dRU$VHi%)OVV9<@haP#Rr;IS8 z=#1xWM^ow4u+Yy%aUwjnAsPk8Gp*kAf*ji(p3li%%1SU8i4&c+!Q!JyDX z<2yZ3UhR&LbC%_qid7~{>KMPQ1O0cLCa92Ad5&Ym`MBe^{7q!oP6A1)RmRRwiBp5QC{`x?> zH?imXs3;B3~KHY8*r}ME%d-rkuis22Zlru{j;i2T`ti`y9$j*CM@$1%H zbv8y#q*&;Re!`UPHy}>llRoBGxZ~0%pBe{iyd8T$LBb=# zLqo&%rjir&uHO#a%KNDi@BL&teO z04j>oH@k1_JN-4(zga4BOla%^TutazaVB33kmZhoigwt?2$$pc828MSATNXM#mIwg z=r+pGViJIR?c5<{eQ6pA$!WL-pPUYg7_?hs+XB+>mG2q27hMoX%oT4 zkW5SVX*$`?s#@4P>BvS&?|FUG!ZUw#Ni7Xp%wsrTjUZ!hQRA|>+=y4$xrZg@q=#Nn_uL~iQm6C4#`k~4!yyj8ta}paYN0CL0^^(S zxDAq5@cL``u)PZPlQk{bU*BcBJb16MU%U-0S(mk8JN2+MM%d=6CF3dPBy=bZ#ncl- zX;!@SqE?b07+RfFEe=hZm(<>g60GTzCNc}BXl>OO=Ms|=Fz_UG4NDZ92UlqkwU_{s z7gOe@yGv-%AeVS|zdm=?`JzbZf&A5XRdL7AE_9!ShrTV=TBL}m-(O^$fB1!-%;b@V zNnv`b4Q2v0Iy7HWSS;47Dne1)rqGf&I^`x>jxLf%%Cq&&9YG&3uF9>J8EvW?JLyK~ zo1ZRs2cT~wW*BHcEtYbgZJp2PAAzm9$Z|X`6^Xh4?*+QRD)lX#o-OUS6a3mSn|LKR zz_6aYJB;>FCv|R@quh2*6cWlv*vI9tn^9@uN1f>--=tWid1a zpm9iq{V(Olv(57v3sQPFs_S!E9=D#m6}r95hB{VpDBD&&cwdo+BCE_kJnvvIQK7Fh zKCGY_W;+PSY-z=y00e2Ng4%0Dul$TzVL8a2K+sHhVS7&mu*{vEu5_SIjK$?U!}83R)rPp!w{rjrr_N*; z9VpyKARZocKI9LLYWwTYC1IvvClXVAU0^T)Ik!K+)HA@SCBh7!eY7oEld=?@T1aePW{34C{z9{*RbYIrLRW zrL9(q)6!eQQP*whv?|29*TR@n=Q04|gAKBcRa?S9QgAW1k=zguRExO@RYs~Z5(+jV z*_LswAYuA}5eliYOTsy}#GKzuksQxctI*=jPVtcl7&g)F%|dLCe#F_j2ge>D@b9Qv zt4#%^vT~6}i=s%{*3s@r29he81CVQ5L#KAK-`&f#-R8&XpxH!wb41j6)yBou7Wy&b zF*p2@GJqMPMe|mB4L606=7uJL=b@k%q(+Hc4N{E4qNoZ^!~9^5pFo@oVlBaqLj_B7 zN*)pzVIH8ymQ>GCw718PI!0B;Q!xCv!O(PWk1M=j znR!W2sk#=4w;Nq3d~jr2S;+#=pBsJ|a@wS6<|-|@%d!(cHtr7VP-_y0psr4cE}0Zq zH(>)*DaV9aJ(xuBpIU0O^E9b>m*L|Y5Qwlpy7R==mNx*24O9&56h)9 zOScmVvse@}678)AEtib!Z9*`w`bp*@YUF}~*r?N@hG>-)=tuh8^afQ;iWxD3`$ah= z20`VRLes%pXw)oCH(FoSb@A0k9s8<#3z+zW427jJGvd^^^!6ly|qjz3iHT&g%~y5+(XT+ zj1tNb;5PYTpVVj}j>yR^`gm?ox3R9Vkztv2%qgCmZha(L7KDkc2>~7H4jk!^b5V$c z*-Z+Xr|ZHq7It?u@=e|^b=9B}Ll1g2DO(>rKkR)i*u8Q3hW8urF`~$5)i9q*Z3P-U zlo?5b|AdUbICvv~EdgJ!2zvx(-BN_6ek^P%x8$Zfaz;i8<&23uagxJlRurF>-WLu< zpxuBmqJC$!%5YH1i;aZnC!Sh{mmwT6JquG^&NZPGea9hDJ+d2J5p`rS`!P7K$`J#o zRi$YWup(D96`O4aJI7>2$vRmP5pYlVBmlE8pDv7_StPuTXp2c24B6Y^WVo$zK@N!` z`7X3OUZ-EcslvCL1IRq)XEr4vdP1rCwJwfiQ|GDso8hxfGJ$Wp#LZgtOJIfOx682A zn|0YJf@I(tb}yQ6Kr#zKUcyGO{ul^=g}oTMZI2paI>>p~(mwa^H$|NUDGjX)f0vlf zY&)Mr{K(f}WbQoJeAbf>$&yX0N?7W)RQ2B9+Z9_yC(;2+zB4F$9(cekg zCTL&O^Q{4Rz-txXen(u_qwGqaXdrPL?Sb3Bco9 zx@p$41%Q-mz(aJO-K8O*g(`ku|8h$t1lKa5O~fE>+Z3*q5lCIyigZG^f- zzhVmwZ<^%6?gnB4<6HV2?h3#N@QmBJLvKlaHlNqWs)m)~`Bto1UE@Bc6gb!GR)q8_# z!#bbNe!?w{3l)N;17hhCeHpva4tU&{i1p!xa(BIiY}4F)P9uFgY2ClG z<{4&F!i6>KJC?!vk^f@E3QDIsfeLyZ-q63v<_;7~enWRUF*k%qgnYizSwjyHIyGF6 zXlgK4R899uFJE}v>R6_(B9M@+PQ(Ewf>FIK$CS7#DFHp|gP%<8CA!c9ScZs2n=hOU zAfZMms?GD!mT_z9`&Ns|?k-)~FLgTdRp^lmbQmHonJHkjV$Xn)$_g>wFY? z;@QTb7Hdx4u&N92{OrHV*@8bYrZV6XeZOcgZTNKo{3cNxV*%7C=aHTPGsZs_Hu1wc z@hy#T=Tc@W54rre?EolXH&8!(&RQAk$}}{HIx;yy3Zg^y_~UAIL&xx2RLZ6#+x1yH zHX7g0si-Hc6QZ}|W*2*pHd@{O33f{4pHlxsmAtH9BIAS4w4Hx&bV_gWi5Y*4P;;UA z!IUDZAPmQ$Jbq%0BistSLbM7>rqx1U(MFdZ`3r;V?@ELSx1Lq>FnvUZ3RD}EDXS84 z^J+Y@hVRQ(|A{L3lI1bQ=`SH*HG1w2Q$k)B2P0Im_-%#C@B@_Fg%v&xs(uOf+x3My~S#D~Nebm(t8Y|DSO9w>g?u;aKF$RakHLWD(1|}&N zlIxo8qWqxx5Ij5-Q`olYd&a7Fpnsy=O_%idPJE#EkG}yGr*N1&w!GC0(syWLP+#{8 z2_@HgX3r=Kwb5OF!S8SmLP5f>@-xr-^PUAJ7LP6vPbX522&p**oF!23K#X<+smZUh6k;lFAU4_O^`AVV-m zSjm;w>w17Pguq_!l?0W5EH&eD`}19)$!43luoffyHWoTz(+~2}Vdh0^{UVc{sH26p zEvkyoAIR;uew}TVBo)RB$x}{@#yDu2z+AF%#?~KXz?Os+#GwWeqf7M?_6(~(!Ro3F zh~R`Fwxp&^A2=OiON`o)M=dPJ7z^uAN&_7yF>K`wlM;}@tx^omEGo)#p^4;iQZVF) zHohWiBc$OZttF8#!_@GpBY3EAHR_WB6RQl0>Ru|4!Q#8(I99k}!Ok zHuNIRBtRol$fj=d%c;CKXWw1%H{ff)p16b1=5SRqUBv)fEBpq!nCdixWZW>&Xj~X_ z$m@IDw*x6)=dHS53zd>mu0A4|ZDftp2Ip>KH6?drgzC(F!rnBRf^{Q`GUl7t_#e~r zjqu&{hjpfi2Co+2uV6j;eix~CaN$)ca6%@I`1bqd(FAq|yKOrMyE6|2D^ zxa?edj42JWJ%KdTHvVEQ+Ux!E9U%M4tJ;%8YAf1YU}T1WqW{U6Xn8b9ep6Y&nSlvE z2qM!tlqQD=u|#mn!7@&^EzVvoD3lYqkjmpS>tK#Iuuqhe-28aD!8uwAV^E-Uo&zqo z4go0G`!T)y6#0V`-QH7sQrWI%obN^v%u~*fulnX6qPc(va48!WL36>++*F8!q@p}s zyV%Z9Zi17pgoF`Vp$C*D;dlJyQt#xXsF)v5oU8s#=OTwy%kZGNw%~WMd%-=W@0dt# zwy+G~m?g!;{A0CtsKm&5k^lN1Sre^r$j`7*!)qbs?hoN=)7;R4Z}0jjP2vLH+;*MI zJ3&k~*RbfyfKYhMEqn}YvBJr#qS!MFAaCn1bc4wugGX=ym)ojlbat#e{Hmj)X*4I3 z!VlH5Q*??sjjU+pgJpKssf9GZVk@x-VHdKtHDZbSLIwMWm=|g~2vsBi>>KuYga0~A zFJ%+`E#GGs0&^z4MlU%)sLu8xI3R=cc^Ts!!$c5c*`9$deImvQ$GR#AO_m2Xx`Q&} zGqEzHaja|G2j5`C1+-9-;V993y1H^d0{|g_|Nl|}k_bq62y`?9E;y+Yf_p*iSM+-h zv82Ae(ztI68gNIVzGpiKLP>gXeU^*k?f81M;9R|I%e+uK&dFW`5BtoE3>z-?_$L7h z1kf*0%nAnUn1c6XGBE~piIlDjX#tmsgYhYGAgSp4*d?l{kF5d#m7+KZXv2lhUvP7G z0TG4DWN*6-ADtWtDUW`falfWaDfJWwoJ zRWBA>3pX;9ElM9ZGly%~5PzjHSx&A@Us_c7`VDRcSmAjxBwZo9@`r z9oEK4HZrxB3~~tr>=S2L7NuFwQ@+aJoSU6b|Z2?JNpLGq5n)6#odFl$3h)+nMY zO2fd!SZ^k;DZ#*Sl&H{UmGWlk8fALFQ!x#W8SOfZS#t~#;F54H9^b?OJ$6O^5eYtt z2%H1`c?>N!YJ%A=E zdv26YdjvVq&y=#`WbFw+NBqN-UkaK=01>%G!R>`8_H;EXJVC1BI9YKy6FTSUS6_d^E{M6pbzLOxzJ{>dfH27pH$;jrIsf8qq?}CSp>}E4j`EpbNk8Jl* zdW(2%v-uUV`#9>8t#yv{xX=m15&qF%-rLVqy8hKa6u_F67IJkq2(bIADB%y0Vhy!%OwYq3t$4& zA`!aVU_ec~!96OHRt0gMKyERApJpkwpVG$KOa5YmhjGn_7+ej(EdOpc<#B@_2xR=fY|cSNYQ_Fcb8LTC(Z~(h~V-s zEA=oQu5N!63g}+|Yw9{BL0pd9M4q&{E{vU=nZ`V3dOx_zM>CB0?*E_a@`K7rn2t*-*r zM7q-A_Zxsqq_;#LmTh+0kg?ta>Kb3O(TRdH`FZa=^ZmQs7e^+a(e3-5Hm9HDnKk)O z=fzJoS-1KUH~M@B-(4>`s;wBxR<{kPEd)ZuTbQZVb&%4$#r%tl!_x&qR}7yM&ucQ4 zR!7JjC79&CU(<2@^1Foo4e+v2Qvsl43&W9b;ptS~rFpZr?S5$(xlCGM6e!k@tZvmh zW&dUBG-Gpm6TNa<)8RZkVUe;;e8Q5E@gWMP#m~kQN_S$>hENF`)*YT@SN4_6dfGwoiDcI z_GFlRqQ6KR5_oPtn z)bFL(QW`L%rMC9`%WIF01b@okp*2Vh9N}U`CpcT&e}Zzb}kr~MS@Iwz&=lfZ7os^fy(@A!cluUa>Gu**n5 z1f8T{d*$Oe8O;+ji}|qnqI5?E4I@%G9`}>BS93t}wD0cTf8Zi`^3xKK@ql_~Cs31@TC4;hR0PL52Dz%)1XM?)A)XuF z)EB3|SVy28SD7}ctSYn&W zIVYenIb#~W9fDXIo}8VO9%VrD+)Qf4OkUn&`4jr413dOPWh8`jQ#MpK1;74s7CkSN z^win(nMCnYMMc58YwGw(1j=m54Slc%R(mc^d;W$Cks!&`1VaS-J;U(Qk~USG7<=;$ zPV(*7B|G&UHu*h`$A<4`nk2^Nmmh%c^(c$iqr?r-!Iu1DyHol~XK1LTjNP_E0rPci zp~_wxYgHAMLPyicl!UZmoIErHZb<8WQnzfcIlCib&qdrBeCxJjR~M#U4~)6tFuKrc z3)pTHO=?qvi9A?u?bgI{ja%Mt z)Ii23y~vyrw&k{1F;kO#MCu`Thd7;s_EujkeJvK6`PFLf<5Yb8#dB<_Ndm?u!e%9* z*+biQHJWlj2(8i>X7vCFaExCI|H{y77|M1UEeaEm<@sb?VO4Hb!an}o?n?|H?)opT zQ?K>;P8Y*L2!|}hzGMqzA(H}q6NN$J{4&Nej8&<2aVk$u)lG)qB@~X9+m?bKafB)? ukIjg7R9~w~m1p2TQNll^+}%pn9Q;>iIJ}{4r4l%5&m7<>c-#4V>Hh#X6ui9v literal 0 HcmV?d00001 From cfe9888c9b29d8cb4459187c180f5078ae50cc25 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 13 Feb 2025 14:04:31 -0500 Subject: [PATCH 049/118] Fix social URL chapter 9 post --- .../_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown b/source/_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown index bad8d6c72fd..86ad8c2fa46 100644 --- a/source/_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown +++ b/source/_posts/2025-02-13-voice-chapter-9-speech-to-phrase.markdown @@ -7,7 +7,7 @@ date_formatted: "February 13, 2025" author: Mike Hansen comments: true categories: Assist -og_image: /images/blog/2025-02-voice-chapter-9/art.png +og_image: /images/blog/2025-02-voice-chapter-9/art.jpg --- From 6ade99638b8f196199cc015b3799645ce746ab03 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Fri, 14 Feb 2025 05:20:01 +0100 Subject: [PATCH 050/118] Add missing backward-incompatible change remove missed remark on MQTT publish action templates (#37444) * Add missing backward-incompatible change remove missed remark on MQTT publish action templates * tiny tweak --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/mqtt.markdown | 4 ---- source/_posts/2025-02-05-release-20252.markdown | 6 ++++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/_integrations/mqtt.markdown b/source/_integrations/mqtt.markdown index 2282cd1a0a0..661b9af808a 100644 --- a/source/_integrations/mqtt.markdown +++ b/source/_integrations/mqtt.markdown @@ -1475,10 +1475,6 @@ The MQTT integration will register the `mqtt.publish` action, which allows publi When `payload` is rendered from [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) in a YAML script or automation, and the template renders to a `bytes` literal, the outgoing MQTT payload will only be sent as `raw` data, if the `evaluate_payload` option flag is set to `true`. {% endnote %} -{% important %} -You must include either `topic` or `topic_template`, but not both. If providing a payload, you need to include either `payload` or `payload_template`, but not both. -{% endimportant %} - ```yaml topic: homeassistant/light/1/command payload: on diff --git a/source/_posts/2025-02-05-release-20252.markdown b/source/_posts/2025-02-05-release-20252.markdown index a450b0b2902..22e26ac17c3 100644 --- a/source/_posts/2025-02-05-release-20252.markdown +++ b/source/_posts/2025-02-05-release-20252.markdown @@ -815,8 +815,14 @@ entry context menu. ([@jbouwh] - [#133342]) ([documentation](/integrations/mqtt)) + +The MQTT publish action no longer supports the `topic_template` and `payload_template` attributes. Instead, only `topic` and `payload` should be used. In automation and scripts, users can use templates by default. Users were instructed to update their automations and scripts with a repair flow when the use of the deprecated action options was detected. + +([@jbouwh] - [#134056]) ([documentation](/integrations/mqtt)) + [@jbouwh]: https://github.com/jbouwh [#133342]: https://github.com/home-assistant/core/pull/133342 +[#134056]: https://github.com/home-assistant/core/pull/134056 {% enddetails %} From 4949107a79d196ff2f287c4b30a4b2385a176fb1 Mon Sep 17 00:00:00 2001 From: Jonas Fors Lellky Date: Fri, 14 Feb 2025 05:38:17 +0100 Subject: [PATCH 051/118] Add information about data update frequency (#37441) * Add information about data update frequency * add terminology tooltip --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/flexit_bacnet.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/flexit_bacnet.markdown b/source/_integrations/flexit_bacnet.markdown index d061196719e..41cd50955f6 100644 --- a/source/_integrations/flexit_bacnet.markdown +++ b/source/_integrations/flexit_bacnet.markdown @@ -99,6 +99,10 @@ If you need to shut down the unit, make sure to take all necessary precautions, Furthermore, Flexit recommends unplugging the unit from the power socket before replacing a filter. To prevent damage, always initiate a controlled shutdown from the control panel (or, in the future, from an action in Home Assistant) before unplugging the device. +## Data updates + +The integration {% term polling polls %} data from the Flexit device every 60 seconds by default. This interval is not configurable. + ## Removing the integration This integration follows standard integration removal. No extra steps are required. From 5b98aa7785c553addd2d65ddd31e053f6f81dc3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 08:05:05 +0100 Subject: [PATCH 052/118] build(deps-dev): bump sass-embedded from 1.83.4 to 1.85.0 (#37460) Bumps [sass-embedded](https://github.com/sass-contrib/sass-embedded-host-ruby) from 1.83.4 to 1.85.0. - [Commits](https://github.com/sass-contrib/sass-embedded-host-ruby/compare/v1.83.4...v1.85.0) --- updated-dependencies: - dependency-name: sass-embedded dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 8a650302f97..a857263400a 100644 --- a/Gemfile +++ b/Gemfile @@ -10,7 +10,7 @@ group :development do gem 'stringex', '2.8.6' # > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189 gem 'sassc', '2.1.0' - gem 'sass-embedded', '1.83.4' + gem 'sass-embedded', '1.85.0' gem 'rubocop', '1.71.2' gem 'ruby-lsp', '0.23.10' gem 'rackup', '2.2.1' diff --git a/Gemfile.lock b/Gemfile.lock index adfdbe8a339..5861d512588 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -139,9 +139,9 @@ GEM ruby2_keywords (0.0.5) safe_yaml (1.0.5) sass (3.4.25) - sass-embedded (1.83.4-arm64-darwin) + sass-embedded (1.85.0-arm64-darwin) google-protobuf (~> 4.29) - sass-embedded (1.83.4-x86_64-linux-gnu) + sass-embedded (1.85.0-x86_64-linux-gnu) google-protobuf (~> 4.29) sass-globbing (1.1.5) sass (>= 3.1) @@ -184,7 +184,7 @@ DEPENDENCIES rake (= 13.2.1) rubocop (= 1.71.2) ruby-lsp (= 0.23.10) - sass-embedded (= 1.83.4) + sass-embedded (= 1.85.0) sass-globbing (= 1.1.5) sassc (= 2.1.0) sinatra (= 4.1.1) From d419af38a86c26fc3a308c19572f0fa469002457 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 08:33:53 +0100 Subject: [PATCH 053/118] build(deps): bump logger from 1.6.5 to 1.6.6 (#37461) Bumps [logger](https://github.com/ruby/logger) from 1.6.5 to 1.6.6. - [Release notes](https://github.com/ruby/logger/releases) - [Commits](https://github.com/ruby/logger/compare/v1.6.5...v1.6.6) --- updated-dependencies: - dependency-name: logger dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5861d512588..f02485c5c46 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -80,7 +80,7 @@ GEM listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - logger (1.6.5) + logger (1.6.6) mercenary (0.4.0) multi_json (1.15.0) mustermann (3.0.3) From b5aca03fca54e6743f2e1aeaafcde9871a58cfcf Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Fri, 14 Feb 2025 01:34:27 -0600 Subject: [PATCH 054/118] Add Speech-to-Phrase add-on to Wyoming docs (#37456) --- source/_integrations/wyoming.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/wyoming.markdown b/source/_integrations/wyoming.markdown index b33dcc331b2..ea0fb447218 100644 --- a/source/_integrations/wyoming.markdown +++ b/source/_integrations/wyoming.markdown @@ -26,6 +26,7 @@ ha_zeroconf: true The **Wyoming** {% term integration %} connects external voice services to Home Assistant using a [small protocol](https://github.com/rhasspy/rhasspy3/blob/master/docs/wyoming.md). This enables [Assist](/voice_control/) to use a variety of local [speech-to-text](/integrations/stt/), [text-to-speech](/integrations/tts/), and [wake-word-detection](/integrations/wake_word/) systems, such as: +- Speech-to-Phrase {% my supervisor_addon badge addon="core_speech-to-phrase" %} - Whisper {% my supervisor_addon badge addon="core_whisper" %} - Piper {% my supervisor_addon badge addon="core_piper" %} - openWakeWord {% my supervisor_addon badge addon="core_openwakeword" %} From 3bd2bc4e983ee7b37e15fe984c8abb37fbf90a91 Mon Sep 17 00:00:00 2001 From: Ryan Date: Fri, 14 Feb 2025 02:03:51 -0700 Subject: [PATCH 055/118] Update templating.markdown to include trigger.alias (#37457) --- source/_docs/automation/templating.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_docs/automation/templating.markdown b/source/_docs/automation/templating.markdown index ce3529e1342..4132b0f3eab 100644 --- a/source/_docs/automation/templating.markdown +++ b/source/_docs/automation/templating.markdown @@ -25,6 +25,7 @@ Triggers from all platforms will include the following data. | Template variable | Data | | ---- | ---- | +| `trigger.alias` | Alias of the trigger. | `trigger.id` | The [`id` of the trigger](/docs/automation/trigger/#trigger-id). | `trigger.idx` | Index of the trigger. (The first trigger idx is `0`.) From bde4f2f72f85a425aa797d8fadb1a38304794ffc Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 14 Feb 2025 14:57:12 +0100 Subject: [PATCH 056/118] Make clear you need Ubuntu Desktop (#37462) --- source/_includes/installation/operating_system.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_includes/installation/operating_system.md b/source/_includes/installation/operating_system.md index 8bb79230ad2..16fa5cb8575 100644 --- a/source/_includes/installation/operating_system.md +++ b/source/_includes/installation/operating_system.md @@ -108,7 +108,7 @@ To write the HAOS image to the boot medium on your x86-64 hardware, there are 2 - This means you will lose all the data as well as the previously installed operating system. - Back up your data before carrying out this procedure. 2. Create a *live operating system* on a USB flash drive: - - Follow the [Ubuntu instructions](https://ubuntu.com/tutorials/try-ubuntu-before-you-install) on writing an Ubuntu iso file onto a USB device. + - Follow the [Ubuntu Desktop instructions](https://ubuntu.com/tutorials/try-ubuntu-before-you-install) on writing an Ubuntu Desktop iso file onto a USB device. 3. Insert the USB flash drive into the system on which you want to run Home Assistant. - Boot the live operating system. - You might need to adjust boot order or use F10 (might be a different F-key depending on the BIOS) to select the USB flash drive as boot device. From 57235c33ca8d7f90df5e36435a97bab4483da02d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 14 Feb 2025 15:32:11 +0100 Subject: [PATCH 057/118] 2025.2.4 (#37463) --- _config.yml | 4 +-- .../_posts/2025-02-05-release-20252.markdown | 34 +++++++++++++++++++ source/changelogs/core-2025.2.markdown | 33 ++++++++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 848dd34a79a..39d02a66fc6 100644 --- a/_config.yml +++ b/_config.yml @@ -108,8 +108,8 @@ social: # Home Assistant release details current_major_version: 2025 current_minor_version: 2 -current_patch_version: 3 -date_released: 2025-02-12 +current_patch_version: 4 +date_released: 2025-02-14 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2025-02-05-release-20252.markdown b/source/_posts/2025-02-05-release-20252.markdown index 22e26ac17c3..f5bd02d39a0 100644 --- a/source/_posts/2025-02-05-release-20252.markdown +++ b/source/_posts/2025-02-05-release-20252.markdown @@ -75,6 +75,7 @@ _PS: It is almost Valentine's day, did you set up some romantic scenes yet? 🌹 - [2025.2.1 - February 7](#202521---february-7) - [2025.2.2 - February 10](#202522---february-10) - [2025.2.3 - February 12](#202523---february-12) + - [2025.2.4 - February 14](#202524---february-14) - [Need help? Join the community!](#need-help-join-the-community) - [Backward-incompatible changes](#backward-incompatible-changes) - [All changes](#all-changes) @@ -704,6 +705,39 @@ release every Friday. [@ludeeus]: https://github.com/ludeeus [@sdb9696]: https://github.com/sdb9696 +### 2025.2.4 - February 14 + +- Bump python-kasa to 0.10.2 ([@sdb9696] - [#138381]) +- Bump hass-nabucasa from 0.90.0 to 0.91.0 ([@ludeeus] - [#138441]) +- Bump aiowebostv to 0.6.2 ([@thecode] - [#138488]) +- Bump ZHA to 0.0.49 to fix Tuya TRV issues ([@TheJulianJES] - [#138492]) +- Bump pyseventeentrack to 1.0.2 ([@shaiu] - [#138506]) +- Bump hass-nabucasa from 0.91.0 to 0.92.0 ([@emontnemery] - [#138510]) +- Bump py-synologydsm-api to 2.6.3 ([@mib1185] - [#138516]) +- Update frontend to 20250214.0 ([@bramkragten] - [#138521]) + +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137688]: https://github.com/home-assistant/core/pull/137688 +[#138231]: https://github.com/home-assistant/core/pull/138231 +[#138381]: https://github.com/home-assistant/core/pull/138381 +[#138408]: https://github.com/home-assistant/core/pull/138408 +[#138441]: https://github.com/home-assistant/core/pull/138441 +[#138488]: https://github.com/home-assistant/core/pull/138488 +[#138492]: https://github.com/home-assistant/core/pull/138492 +[#138506]: https://github.com/home-assistant/core/pull/138506 +[#138510]: https://github.com/home-assistant/core/pull/138510 +[#138516]: https://github.com/home-assistant/core/pull/138516 +[#138521]: https://github.com/home-assistant/core/pull/138521 +[@TheJulianJES]: https://github.com/TheJulianJES +[@bramkragten]: https://github.com/bramkragten +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@ludeeus]: https://github.com/ludeeus +[@mib1185]: https://github.com/mib1185 +[@sdb9696]: https://github.com/sdb9696 +[@shaiu]: https://github.com/shaiu +[@thecode]: https://github.com/thecode + ## Need help? Join the community! Home Assistant has a great community of users who are all more than willing diff --git a/source/changelogs/core-2025.2.markdown b/source/changelogs/core-2025.2.markdown index f708e7635e8..a9db1e5e1e7 100644 --- a/source/changelogs/core-2025.2.markdown +++ b/source/changelogs/core-2025.2.markdown @@ -1579,6 +1579,39 @@ For a summary in a more readable format: [@ludeeus]: https://github.com/ludeeus [@sdb9696]: https://github.com/sdb9696 +## Release 2025.2.4 - February 14 + +- Bump python-kasa to 0.10.2 ([@sdb9696] - [#138381]) +- Bump hass-nabucasa from 0.90.0 to 0.91.0 ([@ludeeus] - [#138441]) +- Bump aiowebostv to 0.6.2 ([@thecode] - [#138488]) +- Bump ZHA to 0.0.49 to fix Tuya TRV issues ([@TheJulianJES] - [#138492]) +- Bump pyseventeentrack to 1.0.2 ([@shaiu] - [#138506]) +- Bump hass-nabucasa from 0.91.0 to 0.92.0 ([@emontnemery] - [#138510]) +- Bump py-synologydsm-api to 2.6.3 ([@mib1185] - [#138516]) +- Update frontend to 20250214.0 ([@bramkragten] - [#138521]) + +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137688]: https://github.com/home-assistant/core/pull/137688 +[#138231]: https://github.com/home-assistant/core/pull/138231 +[#138381]: https://github.com/home-assistant/core/pull/138381 +[#138408]: https://github.com/home-assistant/core/pull/138408 +[#138441]: https://github.com/home-assistant/core/pull/138441 +[#138488]: https://github.com/home-assistant/core/pull/138488 +[#138492]: https://github.com/home-assistant/core/pull/138492 +[#138506]: https://github.com/home-assistant/core/pull/138506 +[#138510]: https://github.com/home-assistant/core/pull/138510 +[#138516]: https://github.com/home-assistant/core/pull/138516 +[#138521]: https://github.com/home-assistant/core/pull/138521 +[@TheJulianJES]: https://github.com/TheJulianJES +[@bramkragten]: https://github.com/bramkragten +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@ludeeus]: https://github.com/ludeeus +[@mib1185]: https://github.com/mib1185 +[@sdb9696]: https://github.com/sdb9696 +[@shaiu]: https://github.com/shaiu +[@thecode]: https://github.com/thecode + [#112047]: https://github.com/home-assistant/core/pull/112047 [#121522]: https://github.com/home-assistant/core/pull/121522 [#121548]: https://github.com/home-assistant/core/pull/121548 From 19265c1516723e6498c89c70a2605c12d290de63 Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Sat, 15 Feb 2025 20:39:36 +0000 Subject: [PATCH 058/118] Fixes grammar (#37478) --- source/_integrations/integration.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/integration.markdown b/source/_integrations/integration.markdown index d097abdaa4c..edb6c25afe5 100644 --- a/source/_integrations/integration.markdown +++ b/source/_integrations/integration.markdown @@ -18,7 +18,7 @@ ha_platforms: ha_integration_type: helper --- -This integrations provides the [Riemann sum](https://en.wikipedia.org/wiki/Riemann_sum) +This integration provides the [Riemann sum](https://en.wikipedia.org/wiki/Riemann_sum) of the values provided by a source sensor. The Riemann sum is an approximation of an **integral** by a finite sum. From de8362ba2eda6646700f838702ce9b68a678a7ba Mon Sep 17 00:00:00 2001 From: Jeff Axelrod Date: Sat, 15 Feb 2025 14:49:38 -0600 Subject: [PATCH 059/118] Update packages.markdown (#37474) * Update packages.markdown minor grammar corrections * Update packages.markdown Trying to better clarify the language --- source/_docs/configuration/packages.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/configuration/packages.markdown b/source/_docs/configuration/packages.markdown index 466652fec79..f353c194a2f 100644 --- a/source/_docs/configuration/packages.markdown +++ b/source/_docs/configuration/packages.markdown @@ -3,7 +3,7 @@ title: "Packages" description: "Describes all there is to know about configuration packages in Home Assistant." --- -Packages in Home Assistant provide a way to bundle different integration's configuration together. With packages we have a way to include different integrations, or different configuration parts using any of the `!include` directives introduced in [splitting the configuration](/docs/configuration/splitting_configuration). +Packages in Home Assistant provide a way to bundle configurations from multiple integrations. With packages, we have a way to include multiple integrations, or parts of integrations using any of the `!include` directives introduced in [splitting the configuration](/docs/configuration/splitting_configuration). Packages are configured under the core `homeassistant/packages` in the configuration and take the format of a package name (no spaces, all lower case) followed by a dictionary with the package configuration. For example, package `pack_1` would be created as: From 3282e05dfdeb967350359177124bda39c7ef6bca Mon Sep 17 00:00:00 2001 From: Tim Creech Date: Sat, 15 Feb 2025 16:18:58 -0500 Subject: [PATCH 060/118] Note that Denon AVR-E300 works with denonavr (#37480) --- source/_integrations/denonavr.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/denonavr.markdown b/source/_integrations/denonavr.markdown index 19da0c3c34b..8edd3a69e8c 100644 --- a/source/_integrations/denonavr.markdown +++ b/source/_integrations/denonavr.markdown @@ -64,6 +64,7 @@ Known supported devices: - Denon AVR-3312 - Denon AVR-3313CI - Denon AVR-4810 +- Denon AVR-E300 - Denon AVR-S650H - Denon AVC-S660H - Denon AVR-S710W From cc2bb7ed5b1c5ef8d71ee82f21a58367546eab12 Mon Sep 17 00:00:00 2001 From: Thomas D <11554546+thomasddn@users.noreply.github.com> Date: Mon, 17 Feb 2025 05:25:12 +0100 Subject: [PATCH 061/118] Clarify controller versions (#37432) (#37464) --- source/_integrations/qbus.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_integrations/qbus.markdown b/source/_integrations/qbus.markdown index d59928d6b34..01724997ad1 100644 --- a/source/_integrations/qbus.markdown +++ b/source/_integrations/qbus.markdown @@ -34,8 +34,8 @@ Once the Qbus controller is connected to the MQTT server, you need to set up an There is currently support for the following **Qbus** products within Home Assistant: -- **CTD 3.0**: main controller. -- **CTD 3.5**: main controller. +- **CTD01E to CTD03E (CTD 3.0)**: main controllers (yellow). +- **CTD10 to CTDMax (CTD 3.5)**: main controllers (black). - **Toggle**: toggle outputs on controllers. ## Available entities From 972828ceb34033004bfca8423232e5dd5ab76909 Mon Sep 17 00:00:00 2001 From: kylehakala Date: Sun, 16 Feb 2025 22:26:47 -0600 Subject: [PATCH 062/118] Misc minor fixes for integrations (#37489) * fix typos in islamic_prayer_times * Update/format gstreamer OS names * Improve wording in html5 requirements * fix typo in light.mqtt * fix typo in hue docs * fix typo in InfluxDB --- source/_integrations/gstreamer.markdown | 4 ++-- source/_integrations/html5.markdown | 2 +- source/_integrations/hue.markdown | 2 +- source/_integrations/influxdb.markdown | 4 ++-- source/_integrations/islamic_prayer_times.markdown | 4 ++-- source/_integrations/light.mqtt.markdown | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/source/_integrations/gstreamer.markdown b/source/_integrations/gstreamer.markdown index 9f66b31fc5c..2001492bda7 100644 --- a/source/_integrations/gstreamer.markdown +++ b/source/_integrations/gstreamer.markdown @@ -43,7 +43,7 @@ Only the `music` media type is supported. And then install the following system dependencies: -Debian/Ubuntu/Rasbian: +Debian/Ubuntu/Raspberry Pi OS (formerly Raspbian): ```bash sudo apt-get install python3-gst-1.0 \ @@ -52,7 +52,7 @@ sudo apt-get install python3-gst-1.0 \ gstreamer1.0-tools ``` -Red Hat/Centos/Fedora: +Red Hat/CentOS/Fedora: ```bash sudo yum install -y python-gstreamer1 gstreamer1-plugins-good \ diff --git a/source/_integrations/html5.markdown b/source/_integrations/html5.markdown index e02b3899b1f..c5317a29df3 100644 --- a/source/_integrations/html5.markdown +++ b/source/_integrations/html5.markdown @@ -29,7 +29,7 @@ The `html5` platform can only function if all of the following requirements are - You are using Chrome and/or Firefox on any desktop platform, ChromeOS or Android. Or you added your Home Assistant instance to your home screen on iOS 16.4 or higher. - Your Home Assistant instance is accessible from outside your network over HTTPS or can perform an alternative [Domain Name Verification Method](https://support.google.com/webmasters/answer/9008080#domain_name_verification) on the domain used by Home Assistant. -- If using a proxy, HTTP basic authentication must be off for registering or unregistering for push notifications. It can be re-enabled afterwards. +- If using a proxy, HTTP basic authentication must be disabled to register or deregister push notifications. It can be re-enabled afterwards. - If you don't run Hass.io: `pywebpush` must be installed. `libffi-dev`, `libpython-dev` and `libssl-dev` must be installed prior to `pywebpush` (i.e., `pywebpush` probably won't automatically install). - You have configured SSL/TLS for your Home Assistant. It doesn't need to be configured in Home Assistant though, e.g., you can be running NGINX in front of Home Assistant and this will still work. The certificate must be trustworthy (i.e., not self-signed). - You are willing to accept the notification permission in your browser. diff --git a/source/_integrations/hue.markdown b/source/_integrations/hue.markdown index 0c6924f16b4..ed661f822a8 100644 --- a/source/_integrations/hue.markdown +++ b/source/_integrations/hue.markdown @@ -64,7 +64,7 @@ You can use this action for example if you'd like to start/stop Dynamic Mode. ## Hue remotes and switches -Hue remotes such as the Dimmer Switch are stateless devices, meaning that they do not have a on/off state like regular entities in Home Assistant. Instead, such devices emit the event `hue_event` when a button is pressed. You can test what events come in using the event {% my developer_events title="developer tools in Home Assistant" %} and subscribe to the `hue_event`. Once you know what the event data looks like, you can use this to create automations. +Hue remotes such as the Dimmer Switch are stateless devices, meaning that they do not have an on/off state like regular entities in Home Assistant. Instead, such devices emit the event `hue_event` when a button is pressed. You can test what events come in using the event {% my developer_events title="developer tools in Home Assistant" %} and subscribe to the `hue_event`. Once you know what the event data looks like, you can use this to create automations. {% note %} At the time of writing, there's a limitation on the Hue API that each device can only send one event per second. This means that button events are rate-limited to 1 per second. This is brought to the attention of Signify and it will hopefully be fixed soon. diff --git a/source/_integrations/influxdb.markdown b/source/_integrations/influxdb.markdown index e099e09c796..ac8cfcfb8cc 100644 --- a/source/_integrations/influxdb.markdown +++ b/source/_integrations/influxdb.markdown @@ -64,7 +64,7 @@ port: default: 8086 path: type: string - description: Path to use if your InfuxDB is running behind a reverse proxy. + description: Path to use if your InfluxDB is running behind a reverse proxy. required: false username: type: string @@ -369,7 +369,7 @@ port: default: 8086 path: type: string - description: Path to use if your InfuxDB is running behind a reverse proxy. + description: Path to use if your InfluxDB is running behind a reverse proxy. required: false username: type: string diff --git a/source/_integrations/islamic_prayer_times.markdown b/source/_integrations/islamic_prayer_times.markdown index 281b409f590..60d98d36281 100644 --- a/source/_integrations/islamic_prayer_times.markdown +++ b/source/_integrations/islamic_prayer_times.markdown @@ -52,7 +52,7 @@ sensors: ## Configuration -### Prayer calcuation method +### Prayer calculation method Default: Islamic Society of North America @@ -72,4 +72,4 @@ Default: Standard (mid sunset to sunrise) Default: Shafi -Method for adjusting Asr time calcuation, if not specified, it defaults to Shafi. +Method for adjusting Asr time calculation, if not specified, it defaults to Shafi. diff --git a/source/_integrations/light.mqtt.markdown b/source/_integrations/light.mqtt.markdown index c1e2a59eaf0..adc2a7ea6e1 100644 --- a/source/_integrations/light.mqtt.markdown +++ b/source/_integrations/light.mqtt.markdown @@ -1237,7 +1237,7 @@ mqtt: {% endraw %} -### CCT light (brightnes and temperature) +### CCT light (brightness and temperature) This example comes from a configuration of Shelly RGBW Bulb working in White mode. `max_mireds` and `min_mireds` set color temperature boundaries to 3000K - 6500K. Notice the same limits are applied in `command_on_template`, but in kelvin units this time. It's due to conversion from mired to kelvin which causes exceeding boundary values accepted by the device. From c2d15aa3ddd0ab32b119b2c5b51ee64f91ea7709 Mon Sep 17 00:00:00 2001 From: kylehakala Date: Sun, 16 Feb 2025 22:42:01 -0600 Subject: [PATCH 063/118] Zha doc enhancements (#37492) * Break out ZHA OTA vendors to a list * remove redundant header in ZHA hardware section * Remove trailing spaces from ZHA docs * tweak --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/zha.markdown | 38 +++++++++++++++++++------------ 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index dbb48214238..d75b1c6faef 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -226,7 +226,15 @@ Additional devices in the [Known working Zigbee radio modules](#known-working-zi The ZHA integration has the ability to perform OTA (over-the-air) firmware updates of Zigbee devices. This feature is enabled by default. As it uses standard [Update](/integrations/update/) entities in Home Assistant, users will get a UI notification if and when an OTA firmware update is available for a specific device, with an option to initiate the update or ignore that specific update for the device. -To see OTA updates for a device, it's required that it both supports OTA updates and that firmware images for the device are publicly provided by the manufacturer. For this reason, ZHA currently only includes OTA providers for a few manufacturers that provide these updates publicly. This includes IKEA, Inovelli, Ledvacnce/OSRAM, SALUS/Computime, Sonoff/iTead, and Third Reality. +To see OTA updates for a device, it must support OTA updates and firmware images for the device must be publicly provided by the manufacturer. ZHA currently only includes OTA providers for a few manufacturers that provide these updates publicly. + +**Included manufacturers:** +- IKEA +- Inovelli +- Ledvacnce/OSRAM +- SALUS/Computime +- Sonoff/iTead +- Third Reality {% warning %} Before updating a device, you should search for any disadvantages or if you even need to install an available update. Some firmware updates can break features you might use (e.g. group binding for IKEA devices). Some updates might also require changes to ZHA. In rare cases, you can even brick devices by installing a firmware update. @@ -397,7 +405,7 @@ Tip! It is highly recommended that you read through the two segments under the t ### Using router devices to add more devices -Most mains-powered devices, e.g., many always-powered wall plugs or light bulbs in your Zigbee network will automatically act as a Zigbee router device (sometimes also referred to as a Zigbee "signal repeater" or "range extender"). +Most mains-powered devices, e.g., many always-powered wall plugs or light bulbs in your Zigbee network will automatically act as a Zigbee router device (sometimes also referred to as a Zigbee "signal repeater" or "range extender"). Because Zigbee should use a [wireless mesh network](https://en.wikipedia.org/wiki/Wireless_mesh_network) to be effective, you will need to add Zigbee router devices to increase the number of Zigbee devices that can be used in your Zigbee network, both in the total number of devices that can be added as well as the total range and coverage of the network. Some Zigbee router devices do a much better job at routing and repeating Zigbee signals and messages than some other devices. You should not have a setup where Zigbee router devices (e.g. light bulbs) are often powered-off. Zigbee router devices are meant to be always available. @@ -467,7 +475,7 @@ Follow this guide if you have a Zigbee Home Assistant (ZHA) network running and - Select **Submit**. 6. **Unplug your old radio** will inform you that your old Zigbee coordinator radio has been reset and that you can now plug in your new Zigbee coordinator radio adapter. - To avoid interference, use a USB extension cable. - - Use a USB 2.0 port or a powered USB 2.0 hub and keep the Zigbee stick away from USB 3.0 devices. + - Use a USB 2.0 port or a powered USB 2.0 hub and keep the Zigbee stick away from USB 3.0 devices. - You may now also choose to either unplug your old Zigbee coordinator radio adapter or keep your old radio plugged in. - If that radio was a combined Z-Wave and Zigbee radio, like the HUSBZB-1 adapter, then only the Zigbee radio part of it was reset. Confirm that the Zigbee Coordinator radio adapter is properly connected and select **Submit**. 7. You now need to start the backup restore process. @@ -489,7 +497,7 @@ The migration process is complete. However, be aware that you will not be able t To help resolve any kinks or compatibility problems, report bugs as issues with debug logs. Please note the current limitations and follow the instructions in this troubleshooting section. -### Limitations +### Limitations Note that ZHA only supports connecting a single dedicated Zigbee Coordinator radio adapter or module with a single Zigbee network and that the Zigbee Coordinator cannot already be connected or used by any other application. Any devices that are or have previously been connected to another Zigbee implementation will also need to first be reset to their factory default settings before they can be paired/joined to ZHA, please see each device manufacturer's documentation. @@ -514,7 +522,8 @@ Tip to new Zigbee users: Checkout [blakadder's unofficial Zigbee Device Compatib ### How to add support for new and unsupported devices -If your Zigbee device pairs/joins successfully with the ZHA {% term integration %} but does not show all of the expected entities: +If your Zigbee device pairs/joins successfully with the ZHA {% term integration %} but does not show all of the expected entities: + 1. Try to re-pair/re-join the device several times. 2. Checkout the troubleshooting section. 3. Still not working? You may need a custom device handler. This handler will have exception handling code to work around device-specific issues. @@ -523,13 +532,14 @@ For devices that do not follow the standard defined in the CSA's ZCL (Zigbee Clu People familiar with other Zigbee gateway solutions for home automation may know similar concepts of using custom Zigbee device handlers/converters for non-standard devices. For example, [Zigbee2MQTT (and IoBroker) uses zigbee-herdsman converters](https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html) and [SmartThings Classics (Legacy) platform has Hub Connected Device Handlers](https://developer.smartthings.com/docs/devices/hub-connected/legacy). -If you do not want to develop such a "quirk" Python script yourself, you can submit a "device support request" as a new issue to the [ZHA Device Handlers project repository on GitHub](https://github.com/zigpy/zha-device-handlers/issues): -1. Sign in to GitHub. -2. Select **New issue** and follow the instructions. - - New device support requests require the device signature + diagnostic information. - - You may also need to actively help in further testing or provide additional information to the volunteering developers. +If you do not want to develop such a "quirk" Python script yourself, you can submit a "device support request" as a new issue to the [ZHA Device Handlers project repository on GitHub](https://github.com/zigpy/zha-device-handlers/issues): -Note that submitting a new "device support request" does not guarantee that someone else will develop a custom "quirk" for ZHA. The project relies on volunteering developers. However, without "device support requests", the developers may not be aware that your specific Zigbee device is not working correctly in ZHA. +1. Sign in to GitHub. +2. Select **New issue** and follow the instructions. + - New device support requests require the device signature + diagnostic information. + - You may also need to actively help in further testing or provide additional information to the volunteering developers. + +Note that submitting a new "device support request" does not guarantee that someone else will develop a custom "quirk" for ZHA. The project relies on volunteering developers. However, without "device support requests", the developers may not be aware that your specific Zigbee device is not working correctly in ZHA. ### Best practices to avoid pairing/connection difficulties @@ -569,13 +579,13 @@ Common root causes of unreliable performance are often seen with outdated Zigbee - Update to a later version of Zigbee Coordinator firmware on the existing radio adapter. - Most manufacturers usually provide straightforward guides for updating the firmware. - + - Try different physical placement and orientations of the Zigbee Coordinator and its antenna. - Optimal placement of the Zigbee adapter is close to the middle of the house as possible. - Try placing Zigbee Coordinator at some distance away from walls, ceilings, and floors. - Try different orientations of the Zigbee Coordinator adapter or its antenna. -While using an older Zigbee Coordinator radio adapter hardware might work, using obsolete hardware and/or old firmware can prevent reliable operation. It is also generally a good idea to upgrade Zigbee Coordinator firmware before troubleshooting any further if and when run into problems with devices. +While using an older Zigbee Coordinator radio adapter hardware might work, using obsolete hardware and/or old firmware can prevent reliable operation. It is also generally a good idea to upgrade Zigbee Coordinator firmware before troubleshooting any further if and when run into problems with devices. #### Actions to avoid or workaround EMI/EMF/RMI interference @@ -587,7 +597,7 @@ Since all Zigbee Coordinator radio adapters are very sensitive/susceptible to al - Extension cables also makes it easier to try different orientations of the adapter/antenna. - Avoid USB 3.0 ports/computers/peripherals as they are known culprits of RFI/EMI/EMF disruption. (See Ref. [1](https://www.usb.org/sites/default/files/327216.pdf) and [2](https://www.unit3compliance.co.uk/2-4ghz-intra-system-or-self-platform-interference-demonstration/)). - - Make sure to only connect the Zigbee USB adapter to a USB 2.0 port (and not to a USB 3.x port). + - Make sure to only connect the Zigbee USB adapter to a USB 2.0 port (and not to a USB 3.x port). - If a computer only has USB 3.x ports then buy and connect Zigbee Coordinator via a powered USB 2.0 hub. - Shield any unshielded computers/peripherals/devices by adding all-metal enclosures/chassis/casings. From 3be16180b89a7b2850e9c8bf813837f118daf3a4 Mon Sep 17 00:00:00 2001 From: kylehakala Date: Sun, 16 Feb 2025 22:55:25 -0600 Subject: [PATCH 064/118] Revise ZHA troubleshooting and limitations sections (#37496) * Revise ZHA troubleshooting and limitations sections * Close out of ZHA Troubleshooting note properly --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/zha.markdown | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index d75b1c6faef..c04d8c49201 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -495,17 +495,21 @@ The migration process is complete. However, be aware that you will not be able t ## Troubleshooting -To help resolve any kinks or compatibility problems, report bugs as issues with debug logs. Please note the current limitations and follow the instructions in this troubleshooting section. +Please note the current limitations and follow the instructions in this troubleshooting section. + +{% note %} +To help resolve any kinks or compatibility problems, report bugs as issues with debug logs. +{% endnote %} ### Limitations -Note that ZHA only supports connecting a single dedicated Zigbee Coordinator radio adapter or module with a single Zigbee network and that the Zigbee Coordinator cannot already be connected or used by any other application. Any devices that are or have previously been connected to another Zigbee implementation will also need to first be reset to their factory default settings before they can be paired/joined to ZHA, please see each device manufacturer's documentation. +ZHA only supports connecting a single dedicated Zigbee Coordinator radio adapter or module with a single Zigbee network. The Zigbee Coordinator cannot already be connected or used by any other application. Devices currently or previously connected to another Zigbee implementation will need to be reset to their factory default settings before they can be paired/joined to ZHA. Refer to each device manufacturer's documentation for reset steps. -Any Zigbee device can only be connected to a single Zigbee Coordinator (only one Zigbee gateway). This is a limitation in the current (as well as previous) Zigbee protocol specifications, governed by the [CSA (Connectivity Standards Alliance)](https://csa-iot.org/all-solutions/zigbee/). As such, it is a limit that applies to all Zigbee implementations, not just the ZHA implementation. +Any Zigbee device can only be connected to a single Zigbee Coordinator (only one Zigbee gateway). This is a limitation in the Zigbee protocol specifications, governed by the [CSA (Connectivity Standards Alliance)](https://csa-iot.org/all-solutions/zigbee/), applying to all Zigbee implementations and not just the ZHA implementation. Support for commissioning Zigbee 3.0 devices via "Install Code" or "QR Code" via the `zha.permit` action has so far only been implemented for 'ezsp' (Silicon Labs EmberZNet) or 'znp' (Texas Instruments) radio type in ZHA. Other radio types are missing support in their respective [radio libraries for zigpy](https://github.com/zigpy/) or manufacturer's firmware commands/APIs. -ZHA does currently not support devices that can only use the ZGP ("Zigbee Green Power") profile which is used in a few batteryless self-powered or energy harvesting devices, (such as for example; Philips Hue Click, Philips Hue Tap, and some "Friends of Hue" partnership switches). +ZHA currently does not support devices that can only use the ZGP ("Zigbee Green Power") profile which is used in a few batteryless self-powered or energy harvesting devices, (such as for example; Philips Hue Click, Philips Hue Tap, and some "Friends of Hue" partnership switches). ZHA does not currently support devices that can only use the ZSE ("Zigbee Smart Energy") profile, that is however due to the "Zigbee SE" specification not being part of the standard Zigbee 3.0 specification and thus not implemented in most of the Zigbee protocol stacks that are commonly available Zigbee Coordinator radio adapters and modules. From 9a6b44cd289ef070f6c9a92f52158b6b1b06626b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 08:16:35 +0100 Subject: [PATCH 065/118] build(deps-dev): bump rubocop from 1.71.2 to 1.72.1 (#37502) Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.71.2 to 1.72.1. - [Release notes](https://github.com/rubocop/rubocop/releases) - [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop/compare/v1.71.2...v1.72.1) --- updated-dependencies: - dependency-name: rubocop dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index a857263400a..03c340aa969 100644 --- a/Gemfile +++ b/Gemfile @@ -11,7 +11,7 @@ group :development do # > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189 gem 'sassc', '2.1.0' gem 'sass-embedded', '1.85.0' - gem 'rubocop', '1.71.2' + gem 'rubocop', '1.72.1' gem 'ruby-lsp', '0.23.10' gem 'rackup', '2.2.1' end diff --git a/Gemfile.lock b/Gemfile.lock index f02485c5c46..0ced804151c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -76,6 +76,7 @@ GEM kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) language_server-protocol (3.17.0.4) + lint_roller (1.1.0) liquid (4.0.4) listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) @@ -118,9 +119,10 @@ GEM regexp_parser (2.10.0) rexml (3.4.0) rouge (4.5.1) - rubocop (1.71.2) + rubocop (1.72.1) json (~> 2.3) - language_server-protocol (>= 3.17.0) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) @@ -182,7 +184,7 @@ DEPENDENCIES nokogiri (= 1.18.2) rackup (= 2.2.1) rake (= 13.2.1) - rubocop (= 1.71.2) + rubocop (= 1.72.1) ruby-lsp (= 0.23.10) sass-embedded (= 1.85.0) sass-globbing (= 1.1.5) From 64e806890865f9c12b66fb58dfaf7fbc37f941c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 08:17:01 +0100 Subject: [PATCH 066/118] build(deps-dev): bump rexml from 3.4.0 to 3.4.1 (#37503) Bumps [rexml](https://github.com/ruby/rexml) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.4.0...v3.4.1) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0ced804151c..799bc8025c2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -117,7 +117,7 @@ GEM rbs (3.8.1) logger regexp_parser (2.10.0) - rexml (3.4.0) + rexml (3.4.1) rouge (4.5.1) rubocop (1.72.1) json (~> 2.3) From 1c208ecd6e91e7c980a49a9fb6a6d9b2aa409662 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 08:17:23 +0100 Subject: [PATCH 067/118] build(deps-dev): bump sorbet-runtime from 0.5.11826 to 0.5.11834 (#37504) Bumps [sorbet-runtime](https://github.com/sorbet/sorbet) from 0.5.11826 to 0.5.11834. - [Release notes](https://github.com/sorbet/sorbet/releases) - [Commits](https://github.com/sorbet/sorbet/commits) --- updated-dependencies: - dependency-name: sorbet-runtime dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 799bc8025c2..6c137411839 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -158,7 +158,7 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11826) + sorbet-runtime (0.5.11834) stringex (2.8.6) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) From f0125c754b8bb223d0d98cc02fc765ce00c878b6 Mon Sep 17 00:00:00 2001 From: kylehakala Date: Mon, 17 Feb 2025 01:23:21 -0600 Subject: [PATCH 068/118] Unify ZHA configuration section, include standard config_flow steps. (#37497) * Unify configuration section, include standard config_flow steps. * Apply sentence-style capitalization --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/zha.markdown | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index c04d8c49201..62b3f0986af 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -142,13 +142,11 @@ Serial protocols used by the Zigbee Coordinator do not have enough robustness, r A Zigbee Coordinator requires a stable local connection to its serial port interface with no drops in communication between it and the Zigbee gateway application running on the host computer. {% endcaution %} -## Configuration - GUI +## Configuration requirements -Connect your radio module and restart Home Assistant. +Be sure to connect a compatible radio module and restart Home Assistant before proceeding with configuration. -From the Home Assistant front page go to **Configuration** and then select **Integrations** from the list. - -Use the plus button in the bottom right to add a new {% term integration %} called **ZHA**. +{% include integrations/config_flow.md %} In the popup: @@ -255,7 +253,7 @@ Group members assume state of group: description: "When using ZHA groups, turning on a ZHA group light makes the ZHA group members optimistically change their state to \"on\", instead of waiting and polling the lights when off. _(default: on)_" {% endconfiguration_basic %} -## Configuration - YAML +### Configuration - YAML For more advanced configuration, you can modify {% term "`configuration.yaml`" %} and restart Home Assistant @@ -275,13 +273,13 @@ custom_quirks_path: type: string {% endconfiguration %} -### Advanced OTA configuration +#### Advanced OTA configuration OTA for a few manufacturers is enabled by default, currently Ledvance, Sonoff, Inovelli, and ThirdReality. Other manufacturers are supported but disabled by default because their updates may change or remove device functionality, may require you to reconfigure devices, or are contributed by the community and may be minimally tested. Refer to the [zigpy documentation for OTA configuration](https://github.com/zigpy/zigpy/wiki/OTA-Configuration) for more information on additional OTA providers. -### Defining Zigbee channel to use +#### Defining Zigbee channel to use Tip! Before considering to change to an other Zigbee channel on an existing Zigbee network, it is highly recommended that you read through the two segments under the [troubleshooting](#troubleshooting) section below about "*Best practices to avoid pairing/connection difficulties*" and "*Zigbee interference avoidance and network range/coverage optimization*". These sections provide prerequisite information and advice on how to achieve the best possible Zigbee network in your environment. @@ -304,7 +302,7 @@ The Zigbee specification standards divide the 2.4 GHz ISM radio band into 1 The general recommendation is to only use channels 15, 20, or 25 in order to avoid interoperability problems with Zigbee devices. Not only because there is less chance of Wi-Fi networks interfering too much with the Zigbee network on other channels, but also because not all Zigbee devices support all channels. Some devices, for example, are limited to only being compatible with ZLL (Zigbee Light Link) channels. It is therefore especially not recommended to use Zigbee channels 11, 24, 25, or 26 on your Zigbee coordinator. These Zigbee channels are commonly only supported by relatively modern Zigbee hardware devices with newer Zigbee firmware. If using those channels, your coordinator may not be usable with older Zigbee devices. -### Modifying the device type +#### Modifying the device type As not all device manufacturers follow the Zigbee standard, at times a device can be incorrectly classified. For example, a switch could be classified as a light. From 64c5e662b137339888ad4be063ad75a6f49bd534 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 09:06:21 +0100 Subject: [PATCH 069/118] build(deps-dev): bump ruby-lsp from 0.23.10 to 0.23.11 (#37505) Bumps [ruby-lsp](https://github.com/Shopify/ruby-lsp) from 0.23.10 to 0.23.11. - [Release notes](https://github.com/Shopify/ruby-lsp/releases) - [Commits](https://github.com/Shopify/ruby-lsp/compare/v0.23.10...v0.23.11) --- updated-dependencies: - dependency-name: ruby-lsp dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 03c340aa969..566111a25fc 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ group :development do gem 'sassc', '2.1.0' gem 'sass-embedded', '1.85.0' gem 'rubocop', '1.72.1' - gem 'ruby-lsp', '0.23.10' + gem 'ruby-lsp', '0.23.11' gem 'rackup', '2.2.1' end diff --git a/Gemfile.lock b/Gemfile.lock index 6c137411839..71277c3d493 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -132,7 +132,7 @@ GEM unicode-display_width (>= 2.4.0, < 4.0) rubocop-ast (1.38.0) parser (>= 3.3.1.0) - ruby-lsp (0.23.10) + ruby-lsp (0.23.11) language_server-protocol (~> 3.17.0) prism (>= 1.2, < 2.0) rbs (>= 3, < 4) @@ -185,7 +185,7 @@ DEPENDENCIES rackup (= 2.2.1) rake (= 13.2.1) rubocop (= 1.72.1) - ruby-lsp (= 0.23.10) + ruby-lsp (= 0.23.11) sass-embedded (= 1.85.0) sass-globbing (= 1.1.5) sassc (= 2.1.0) From 9b8812182d3726d49877338da4f5bab6cb9e13b2 Mon Sep 17 00:00:00 2001 From: balazs92117 Date: Mon, 17 Feb 2025 09:32:17 +0100 Subject: [PATCH 070/118] Add E1 Pro IPC_NT1NA45MP as supported (#37430) * Update reolink.markdown * Small changes --------- Co-authored-by: starkillerOG --- source/_integrations/reolink.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_integrations/reolink.markdown b/source/_integrations/reolink.markdown index 2d5521f67c1..263abdad0fc 100644 --- a/source/_integrations/reolink.markdown +++ b/source/_integrations/reolink.markdown @@ -310,6 +310,7 @@ The following models have been tested and confirmed to work with a direct link t - C2 Pro* - [CX410](https://reolink.com/product/cx410/) - [CX810](https://reolink.com/product/cx810/) +- [E1 Pro](https://reolink.com/product/e1-pro/) (only hardware version IPC_NT1NA45MP) - [E1 Zoom](https://reolink.com/product/e1-zoom/) - [E1 Outdoor](https://reolink.com/product/e1-outdoor/) - [E1 Outdoor PoE](https://reolink.com/product/e1-outdoor-poe/) @@ -386,7 +387,7 @@ Reolink provides [this larger list of battery camera models](https://support.reo The following models are lacking the HTTP web server API and can, therefore, not work directly with this integration. However, these cameras can work with this integration through an NVR or Home Hub in which the NVR/Home Hub is connected to Home Assistant. -- E1 Pro +- E1 Pro (The IPC_NT1NA45MP hardware version also works with a direct connection) - E1 - Reolink Lumus - B400* From f7d6a4c7861afdb4d52d06c71852d2d57998a7de Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:00:49 +0100 Subject: [PATCH 071/118] Amcrest integration: update tap action keywords (#37417) --- source/_integrations/amcrest.markdown | 40 +++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/source/_integrations/amcrest.markdown b/source/_integrations/amcrest.markdown index 7acef1bc7e0..3f722e85132 100644 --- a/source/_integrations/amcrest.markdown +++ b/source/_integrations/amcrest.markdown @@ -292,8 +292,8 @@ elements: right: 25px bottom: 50px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: up @@ -304,8 +304,8 @@ elements: right: 25px bottom: 0px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: down @@ -316,8 +316,8 @@ elements: right: 50px bottom: 25px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: left @@ -328,8 +328,8 @@ elements: right: 0px bottom: 25px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: right @@ -340,8 +340,8 @@ elements: right: 50px bottom: 50px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: left_up @@ -352,8 +352,8 @@ elements: right: 0px bottom: 50px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: right_up @@ -364,8 +364,8 @@ elements: right: 50px bottom: 0px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: left_down @@ -376,8 +376,8 @@ elements: right: 0px bottom: 0px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: right_down @@ -388,14 +388,14 @@ elements: bottom: 25px right: 25px tap_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control service_data: entity_id: camera.lakehouse movement: zoom_in hold_action: - action: call-service - service: amcrest.ptz_control + action: perform-action + perform_action: amcrest.ptz_control data: entity_id: camera.lakehouse movement: zoom_out From fdac05d34448014ec6f4b5e77be5973f103e40b2 Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:02:15 +0100 Subject: [PATCH 072/118] document actions that trigger a 'shopping_list_updated ' event (#37415) * shopping list: document actions that trigger a 'shopping_list_updated' event - list actions as defined in https://github.com/home-assistant/core/blob/35416189f2944f58b5b91d9cf8ac90a491a10890/homeassistant/components/shopping_list/__init__.py#L301 - inspired by https://github.com/home-assistant/home-assistant.io/pull/37405/ * Revert formatting changes * Update source/_integrations/shopping_list.markdown --------- Co-authored-by: Joost Lekkerkerker --- source/_integrations/shopping_list.markdown | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/_integrations/shopping_list.markdown b/source/_integrations/shopping_list.markdown index a11622daa5f..204c4848387 100644 --- a/source/_integrations/shopping_list.markdown +++ b/source/_integrations/shopping_list.markdown @@ -107,3 +107,12 @@ actions: ``` {% endraw %} + +You can also trigger an automation when a `shopping_list_updated` event was triggered by any of the following actions: + +- `clear`: A completed item was cleared from the list. +- `sorted`: The items in the list were sorted by name. +- `reorder`: An item has been reordered in the list. +- `update_list`: All items have been updated. + +In these cases, the event does not return a list item. \ No newline at end of file From 9e90c68f8de2495e8ea57d62755117bccd3f8e41 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Mon, 17 Feb 2025 14:06:08 +0200 Subject: [PATCH 073/118] Document that you need to set up the device with the app first (#37509) --- source/_integrations/switcher_kis.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/switcher_kis.markdown b/source/_integrations/switcher_kis.markdown index 87898759bd5..62319472814 100644 --- a/source/_integrations/switcher_kis.markdown +++ b/source/_integrations/switcher_kis.markdown @@ -58,6 +58,8 @@ If you completed the integration setup but are still unable to control the devic ## Prerequisites +Before the integration can find a device, you need to connect it to your network using the Switcher app. + To enhance security, certain Switcher devices require a token for operation. In order to integrate your token-based Switcher devices with Home Assistant, you'll need the following information: - **The username of your Switcher Account**: To find the username, open the Switcher app. From 70723aa214b28da57a0aa05d354859c3f78982ce Mon Sep 17 00:00:00 2001 From: Norbert Rittel Date: Mon, 17 Feb 2025 13:53:19 +0100 Subject: [PATCH 074/118] Add "summary" besides "name" to clarify description (#37511) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Abílio Costa --- source/_integrations/todo.markdown | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/_integrations/todo.markdown b/source/_integrations/todo.markdown index 8ae22ec8a29..445dbc8c54e 100644 --- a/source/_integrations/todo.markdown +++ b/source/_integrations/todo.markdown @@ -80,12 +80,12 @@ data: Add a new to-do item. A to-do list `target` is selected with a [Target Selector](/docs/blueprint/selectors/#target-selector) and the `data` payload supports the following fields: -| Data attribute | Optional | Description | Example | -| -------------- | -------- | ---------------------------------------------------------------- | ------------------------------------------------------------ | -| `item` | no | the name of the to-do Item. | Submit income tax return | -| `due_date` | yes | The date the to-do item is expected to be completed. | 2024-04-10 | -| `due_datetime` | yes | The date and time the to-do item is expected to be completed. | 2024-04-10 23:00:00 | -| `description` | yes | A more complete description than the one provided by the summary | Collect all necessary documents and submit the final return. | +| Data attribute | Optional | Description | Example | +| -------------- | -------- | ----------------------------------------------------------------- | ------------------------------------------------------------ | +| `item` | no | The name/summary of the to-do item. | Submit income tax return | +| `due_date` | yes | The date the to-do item is expected to be completed. | 2024-04-10 | +| `due_datetime` | yes | The date and time the to-do item is expected to be completed. | 2024-04-10 23:00:00 | +| `description` | yes | A more complete description than the one provided by the summary. | Collect all necessary documents and submit the final return. | Only one of `due_date` or `due_datetime` may be specified. @@ -107,9 +107,9 @@ Update a to-do item. A to-do list `target` is selected with a [Target Selector]( | Data attribute | Optional | Description | Example | | -------------- | -------- | ----------------------------------------------------------------- | ------------------------------------------------------------ | -| `item` | no | The name of the to-do Item to update. | Submit income tax return | -| `rename` | yes | The new name of the to-do Item. | Something else | -| `status` | yes | The overall status of the To-do Item. | `needs_action` or `completed` | +| `item` | no | The name/summary of the to-do item to update. | Submit income tax return | +| `rename` | yes | The new name of the to-do item. | Something else | +| `status` | yes | The overall status of the to-do item. | `needs_action` or `completed` | | `due_date` | yes | The date the to-do item is expected to be completed. | 2024-04-10 | | `due_datetime` | yes | The date and time the to-do item is expected to be completed. | 2024-04-10 23:00:00 | | `description` | yes | A more complete description than the one provided by the summary. | Collect all necessary documents and submit the final return. | From 361845d910096f6a99bedd75969aa94d639c18bf Mon Sep 17 00:00:00 2001 From: AlCalzone Date: Mon, 17 Feb 2025 15:23:53 +0100 Subject: [PATCH 075/118] Z-Wave: add required documentation on identify command (#37512) * Z-Wave: add required documentation on identify command * set code block language * add empty lines --- source/_integrations/zwave_js.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown index a69b7b3e4e3..054f42e7c3c 100644 --- a/source/_integrations/zwave_js.markdown +++ b/source/_integrations/zwave_js.markdown @@ -1003,6 +1003,19 @@ This association group is used when Home Assistant [resets the Z-Wave controller Under normal circumstances, it is not necessary to add a device to this group. +## Identification via Z-Wave + +Other Z-Wave devices can instruct a Home Assistant instance to identify itself by sending the following `Indicator Set` Z-Wave command (all bytes are hexadecimal): + +```txt +87010003500308500403500506 + ~~ ~~ ~~ +``` + +The bytes underlined with `~` can also have any other value. + +When receiving such a command, Home Assistant will show a notification in its sidebar, mentioning which node sent the command. + ## Z-Wave Command Classes Home Assistant responds to when queried The following table lists the Command Classes together with the implemented version and required security class. These are the Command Classes that Home Assistant will respond to when queried by other devices. From fb82a38963fca1626799973090f8fbc4573bc934 Mon Sep 17 00:00:00 2001 From: Michael Arthur Date: Tue, 18 Feb 2025 20:11:02 +1300 Subject: [PATCH 076/118] update EK docs (#37518) * update EK docs * add extra comma * tiny tweak --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/electric_kiwi.markdown | 50 +++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/source/_integrations/electric_kiwi.markdown b/source/_integrations/electric_kiwi.markdown index b61e4cea626..9a11d784679 100644 --- a/source/_integrations/electric_kiwi.markdown +++ b/source/_integrations/electric_kiwi.markdown @@ -24,3 +24,53 @@ This integration uses the official [Electric Kiwi API](https://developer.electri {% note %} The configuration uses `client_id` and `client_secret` provided to Home Assistant, so all you need to do is install the integration and authenticate using your account credentials. {% endnote %} + + +## Supported functionality + +The integration provides `sensor` entities with account balances, billing, and hour of free power start and end time. It also provides a `select` entity to change the hour of free power. + +## Use cases + +This integration can be used as part of an automation, for example, to turn on/off appliances automatically. + +## Example automations + +{% details "Run the heat pump during the hour of free power" %} + +{% raw %} + +```yaml +alias: "Turn on expensive heat pump" +description: "Turn on the heat pump when the hour of free power starts" +triggers: + - at: sensor.hour_of_free_power_start + trigger: time +actions: + - action: climate.turn_on + target: + entity_id: climate.heat_pump + data: {} +``` + +```yaml +alias: "Turn off expensive heat pump" +description: "Turn off the heat pump when the hour of free power ends" +triggers: + - at: sensor.hour_of_free_power_end + trigger: time +actions: + - action: climate.turn_off + target: + entity_id: climate.heat_pump + data: {} +``` + +{% endraw %} +{% enddetails %} + +## Remove integration + +This integration follows standard integration removal, no extra steps are required. + +{% include integrations/remove_device_service.md %} From eba4eba3ab7a55bbfede7286054554f3b4289704 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2025 08:11:28 +0100 Subject: [PATCH 077/118] build(deps-dev): bump rubocop from 1.72.1 to 1.72.2 (#37524) Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.72.1 to 1.72.2. - [Release notes](https://github.com/rubocop/rubocop/releases) - [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop/compare/v1.72.1...v1.72.2) --- updated-dependencies: - dependency-name: rubocop dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 566111a25fc..c23f3534820 100644 --- a/Gemfile +++ b/Gemfile @@ -11,7 +11,7 @@ group :development do # > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189 gem 'sassc', '2.1.0' gem 'sass-embedded', '1.85.0' - gem 'rubocop', '1.72.1' + gem 'rubocop', '1.72.2' gem 'ruby-lsp', '0.23.11' gem 'rackup', '2.2.1' end diff --git a/Gemfile.lock b/Gemfile.lock index 71277c3d493..edaf54ee7eb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -119,7 +119,7 @@ GEM regexp_parser (2.10.0) rexml (3.4.1) rouge (4.5.1) - rubocop (1.72.1) + rubocop (1.72.2) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -184,7 +184,7 @@ DEPENDENCIES nokogiri (= 1.18.2) rackup (= 2.2.1) rake (= 13.2.1) - rubocop (= 1.72.1) + rubocop (= 1.72.2) ruby-lsp (= 0.23.11) sass-embedded (= 1.85.0) sass-globbing (= 1.1.5) From 7d9207ebd7c7b911f5b0fd1e4383c6c38e172be6 Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:06:15 +0100 Subject: [PATCH 078/118] Matter Troubleshooting: add steps (#37528) * Matter Troubleshooting: add steps * Rephrase --- source/_integrations/matter.markdown | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index 80b2394d3a2..a49de9403e1 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -388,12 +388,22 @@ This button will only be visible within the Home Assistant Companion App (so not - For iOS, minimum version is iOS 16 (minimal 16.3 is preferred) and the most recent version of the HA companion app. - For Android, minimum version is 8.1 and the most recent version of the (full) HA Companion app, downloaded from the Play Store. -### When I'm trying to commission using the Android app, I get an error stating "Matter is currently unavailable" +### When trying to commission using Android, I get an error "Matter is unavailable" -See above, make sure your device meets all requirements to support Matter. Update Android to the latest version and the Home Assistant Companion app. To quickly verify if your device meets all requirements to support Matter, on your Android device, go to **Settings** > **Google** > **Devices & Sharing**. There should be an entry there for **Matter devices**. - -Some users have reported that uninstalling and reinstalling the Google Home app fixed this issue for them. -Also see this [extended troubleshooting guide](https://developers.home.google.com/matter/verify-services) from Google. +1. For Android, minimum version is 8.1. Ideally, update to the latest version. +2. Use a regular, Google-account Android setup. No alternative Android versions. +3. Home Assistant Companion app: + - Make sure to install the (full) version, downloaded from the Play Store. + - Make sure it is the latest version. +4. To verify your device meets all requirements to support Matter, on your Android device, go to **Settings** > **Google** > **Devices & Sharing**. + - There should be an entry there for **Matter devices**. +5. Make sure the play services are all up to date. +6. If you only just installed or updated the Home Assistant Companion app: + - Wait. + - It can take a while before the required components are installed in the background. - Try again after 1 hour to ensure the installation is complete. +7. If the error persists, reinstall the Home Assistant Companion app. +8. Some users have reported that reinstalling the Google Home app fixed this issue for them. +9. For more information, refer to the [extended troubleshooting guide](https://developers.home.google.com/matter/verify-services) from Google. ### Unable to commission devices, it keeps giving errors or stops working randomly From 066d780858cb89eb2905affd0f740fa9500fccc3 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Tue, 18 Feb 2025 16:28:04 +0100 Subject: [PATCH 079/118] Add CVE-2025-25305 (#37529) --- source/security/index.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/security/index.markdown b/source/security/index.markdown index bbf351a07d8..62853786e4a 100644 --- a/source/security/index.markdown +++ b/source/security/index.markdown @@ -62,6 +62,13 @@ As an open source project, Home Assistant cannot offer bounties for security vul The following is a list of past security advisories that have been published by the Home Assistant project. +**2025-02-18: SSL validation for outgoing requests in core and used libs not correct** +Severity: _High (CVSS: 3.1)_ +Detailed information: _[Security advisory](https://github.com/home-assistant/core/security/advisories/GHSA-m3pm-rpgg-5wj6)_ +Assigned CVE: _[CVE-2025-25305](https://nvd.nist.gov/vuln/detail/CVE-2025-25305)_ +Discovered by: _[ReneNulschDE](https://github.com/ReneNulschDE)_ +Fixed in: _Home Assistant Core 2024.1.6_ + **2023-12-14: User accounts disclosed to unauthenticated actors on the LAN** Severity: _Moderate (CVSS: 4.2)_ Detailed information: _[Security advisory](https://github.com/home-assistant/core/security/advisories/GHSA-jqpc-rc7g-vf83)_ From 11e8913dd7adaa4a4110ce547e265fa0dcedd85e Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Tue, 18 Feb 2025 16:58:32 +0100 Subject: [PATCH 080/118] Fix CVE-2025-25305 CVSS score (#37530) --- source/security/index.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/security/index.markdown b/source/security/index.markdown index 62853786e4a..ec00ba65c02 100644 --- a/source/security/index.markdown +++ b/source/security/index.markdown @@ -63,7 +63,7 @@ As an open source project, Home Assistant cannot offer bounties for security vul The following is a list of past security advisories that have been published by the Home Assistant project. **2025-02-18: SSL validation for outgoing requests in core and used libs not correct** -Severity: _High (CVSS: 3.1)_ +Severity: _High (CVSS: 7.0)_ Detailed information: _[Security advisory](https://github.com/home-assistant/core/security/advisories/GHSA-m3pm-rpgg-5wj6)_ Assigned CVE: _[CVE-2025-25305](https://nvd.nist.gov/vuln/detail/CVE-2025-25305)_ Discovered by: _[ReneNulschDE](https://github.com/ReneNulschDE)_ From adcf17d10aeb4c511e66562199593c86d77a490c Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:46:49 -0600 Subject: [PATCH 081/118] Remove explicit platform list from media_player.shuffle_set action docs (#37534) --- source/_integrations/media_player.markdown | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/_integrations/media_player.markdown b/source/_integrations/media_player.markdown index a34b3dafb47..b15f16fe702 100644 --- a/source/_integrations/media_player.markdown +++ b/source/_integrations/media_player.markdown @@ -168,8 +168,6 @@ Currently only supported on [Denon AVR](/integrations/denonavr/) and [Songpal]( #### Action `media_player.shuffle_set` -Currently only supported on [Sonos](/integrations/sonos), [Spotify](/integrations/spotify), [MPD](/integrations/mpd), [Kodi](/integrations/kodi), [Roon](/integrations/roon), [OwnTone](/integrations/forked_daapd), [Squeezebox](/integrations/squeezebox) and [Universal](/integrations/universal). - | Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | Target a specific media player. For example `media_player.spotify`| From c82edd86337766e6bcc33b43277cf0b4066c4881 Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Tue, 18 Feb 2025 21:38:33 +0000 Subject: [PATCH 082/118] Added Smart Guys as Australian Yellow distributor (#37533) --- source/_data/products.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/_data/products.yml b/source/_data/products.yml index c110c712e8b..1b3b03fdcee 100644 --- a/source/_data/products.yml +++ b/source/_data/products.yml @@ -175,6 +175,12 @@ yellow: ship_to: Asia url: https://www.seeedstudio.com/Home-Assistant-Yellow-Kit-with-selectable-CM4.html logo: /images/distributors/seeed-studio.webp + # Australia + - name: Smart Guys + ship_from: Australia + ship_to: Australia + url: https://smartguys.com.au/product/home-assistant-yellow-smart-hub/ + logo: /images/distributors/smart-guys.webp # Europe - name: Botland ship_from: Poland From 98f2a385fb54cdb0b0fc23fb8d0ca78c191a5373 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 18 Feb 2025 23:11:48 -0600 Subject: [PATCH 083/118] Add note that Govee 5074 models require active scans (#37537) * Add note that Govee 5074 models require active scans * Update source/_integrations/govee_ble.markdown --- source/_integrations/govee_ble.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/govee_ble.markdown b/source/_integrations/govee_ble.markdown index db9c6ba8806..4761b081e6c 100644 --- a/source/_integrations/govee_ble.markdown +++ b/source/_integrations/govee_ble.markdown @@ -31,7 +31,7 @@ The Govee BLE integration will automatically discover devices once the [Bluetoot - H5052 Hygrometer Thermometer - H5071 Hygrometer Thermometer - H5072 Hygrometer Thermometer -- H5074 Hygrometer Thermometer +- H5074 Hygrometer Thermometer (Active scans required) - [H5075 Bluetooth Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-bluetooth-hygrometer-thermometer-h5075) - [H5100 Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-h5100-mini-hygrometer-thermometer-sensors) - H5101 Hygrometer Thermometer From 4162fe535fe55e6cbe95cf8f4f9caafa4d95c3a0 Mon Sep 17 00:00:00 2001 From: Didgeridrew <19187320+Didgeridrew@users.noreply.github.com> Date: Wed, 19 Feb 2025 00:16:23 -0500 Subject: [PATCH 084/118] Very Small PR: Edit example intent_script.markdown (#37535) This is a single character edit to fix a non-functional example. --- source/_integrations/intent_script.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/intent_script.markdown b/source/_integrations/intent_script.markdown index d8a70a8f69e..c6d7c3e7b04 100644 --- a/source/_integrations/intent_script.markdown +++ b/source/_integrations/intent_script.markdown @@ -105,7 +105,7 @@ available in the `action_response` variable. conversation: intents: EventCountToday: - - "How many meetings do I have today?" + - "How many meetings do I have today" intent_script: EventCountToday: From 978c12ca453a8abc80384e4ce10e102003c3f8b7 Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Wed, 19 Feb 2025 08:18:14 +0100 Subject: [PATCH 085/118] Matter: merge duplicate troubleshooting sections (#37550) --- source/_integrations/matter.markdown | 38 +++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index a49de9403e1..44765d9986e 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -218,9 +218,26 @@ While trying to add the Matter device, I get an error stating that *Matter is cu This could mean that not all required Matter modules that are needed by the Home Assistant Companion App have been downloaded yet. Try the following steps: 1. Wait up to 24 hours for the Google Play services to download the necessary Matter modules. -2. If this did not work, try reinstalling the Home Assistant Companion app. -3. If this did not work, try installing the Google Home app. Technically this is not required, but it might trigger another installation attempt of the Matter modules. -4. Refer to this [Troubleshooting Guide from Google](https://developers.home.google.com/matter/verify-services). +2. Make sure the requirements listed in the [prerequisites](#prerequisites) are met. This includes meeting the minimum system requirements: + - **Android**: + - Minimum version is 8.1. Ideally, update to the latest version. + - Use a regular, Google-account Android setup. No alternative Android versions. + - Make sure the play services are all up to date. + - **iPhone**: + - Have the iOS version 16 or higher +3. Home Assistant Companion app: + - Make sure you installed the (full) version, downloaded from the Play Store. + - Make sure it is the latest version. + - If you only just installed or updated the Home Assistant Companion app: + - Wait. + - It can take a while before the required components are installed in the background. + - Try again after 1 hour to ensure the installation is complete. +4. Verify your device meets all requirements to support Matter: + - On your Android device, go to **Settings** > **Google** > **Devices & Sharing**. + - There should be an entry there for **Matter devices**. +5. Reinstalling the Home Assistant Companion app. +6. Try (re-)installing the Google Home app. Technically, this is not required, but it might trigger another installation attempt of the Matter modules. +7. Refer to this [Troubleshooting Guide from Google](https://developers.home.google.com/matter/verify-services). ## Sharing a device from another platform with Home Assistant @@ -390,20 +407,7 @@ This button will only be visible within the Home Assistant Companion App (so not ### When trying to commission using Android, I get an error "Matter is unavailable" -1. For Android, minimum version is 8.1. Ideally, update to the latest version. -2. Use a regular, Google-account Android setup. No alternative Android versions. -3. Home Assistant Companion app: - - Make sure to install the (full) version, downloaded from the Play Store. - - Make sure it is the latest version. -4. To verify your device meets all requirements to support Matter, on your Android device, go to **Settings** > **Google** > **Devices & Sharing**. - - There should be an entry there for **Matter devices**. -5. Make sure the play services are all up to date. -6. If you only just installed or updated the Home Assistant Companion app: - - Wait. - - It can take a while before the required components are installed in the background. - Try again after 1 hour to ensure the installation is complete. -7. If the error persists, reinstall the Home Assistant Companion app. -8. Some users have reported that reinstalling the Google Home app fixed this issue for them. -9. For more information, refer to the [extended troubleshooting guide](https://developers.home.google.com/matter/verify-services) from Google. +Refer to the steps under [Troubleshooting the installation](#troubleshooting-the-installation). ### Unable to commission devices, it keeps giving errors or stops working randomly From 5909c8046fe5c66e48475fced77dc157864b2083 Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Wed, 19 Feb 2025 08:51:56 +0100 Subject: [PATCH 086/118] Matter: rephrase to improve readability (#37551) * Matter: rephrase to improve readability * Rephrase for consistency with other troubleshooting/preq section --- source/_integrations/matter.markdown | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index 44765d9986e..3933b97390a 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -211,18 +211,18 @@ Check these steps if you are experiencing issues when trying to add a Matter dev #### Symptom -While trying to add the Matter device, I get an error stating that *Matter is currently unavailable*. +While trying to add the Matter device, I get an error stating that _Matter is currently unavailable_. #### Remedy This could mean that not all required Matter modules that are needed by the Home Assistant Companion App have been downloaded yet. Try the following steps: -1. Wait up to 24 hours for the Google Play services to download the necessary Matter modules. +1. Wait up to 24 hours for the Google Play Services to download the necessary Matter modules. 2. Make sure the requirements listed in the [prerequisites](#prerequisites) are met. This includes meeting the minimum system requirements: - **Android**: - Minimum version is 8.1. Ideally, update to the latest version. - Use a regular, Google-account Android setup. No alternative Android versions. - - Make sure the play services are all up to date. + - Make sure the Google Play Services are all up to date. - **iPhone**: - Have the iOS version 16 or higher 3. Home Assistant Companion app: @@ -398,12 +398,18 @@ NOTE for Android users: You need to follow the instructions at the bottom of the - For more detailed information on network configuration, refer to the [README of the Matter server repository](https://github.com/home-assistant-libs/python-matter-server/blob/main/README.md). -### I do not see the button "Commission using the Companion app" +### I do not see the button _Commission using the Companion app_ -This button will only be visible within the Home Assistant Companion App (so not in the browser) and your device meets all requirements for Matter support. +This button only exists in the Home Assistant Companion App. It is not available in the browser. -- For iOS, minimum version is iOS 16 (minimal 16.3 is preferred) and the most recent version of the HA companion app. -- For Android, minimum version is 8.1 and the most recent version of the (full) HA Companion app, downloaded from the Play Store. +Make sure the requirements listed in the [prerequisites](#prerequisites) are met. This includes meeting the minimum system requirements: + +- **Android**: + - Minimum version is 8.1. Ideally, update to the latest version. + - Use a regular, Google-account Android setup. No alternative Android versions. + - Make sure the Google Play Services are all up to date. +- **iPhone**: + - Have the iOS version 16 or higher ### When trying to commission using Android, I get an error "Matter is unavailable" From 155a43aa41e9193608f5e9380e0aac61c955e16b Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:06:09 +0100 Subject: [PATCH 087/118] Note to try Android 12 or later for commissioning Matter devices (#37552) * If issues persist, try Android 12 or later for commissioning Matter devices * Fix typo * Update requirements to recommend Android v12 * rephrase version statement --- source/_integrations/matter.markdown | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index 3933b97390a..cbf9a76bf8d 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -145,7 +145,7 @@ Make sure you have all these components ready before trying to add a Matter devi - Have either an Android or iPhone ready and Bluetooth enabled. For information why Bluetooth is required, refer to the section on [Bluetooth used during commissioning](#bluetooth-used-during-commissioning): - Android: - - Have the Android version 8.1 or higher. + - At a minimum, have Android version 8.1. Recommended is version 12 or higher. - Have the latest version of the Home Assistant Companion app, installed from the Play Store (full version). - If you are using {% term Thread %}: Make sure there is a Thread border router device (Nest Hub (2nd Gen) or Nest Wi-Fi Pro or Home Assistant with the OpenThread Border Router add-on) present in your home network. - If you are using OpenThread (for Connect ZBT-1/SkyConnect) as border router, make sure you followed the steps in the [Thread documentation](/integrations/thread#turning-home-assistant-into-a-thread-border-router). @@ -220,7 +220,8 @@ This could mean that not all required Matter modules that are needed by the Home 1. Wait up to 24 hours for the Google Play Services to download the necessary Matter modules. 2. Make sure the requirements listed in the [prerequisites](#prerequisites) are met. This includes meeting the minimum system requirements: - **Android**: - - Minimum version is 8.1. Ideally, update to the latest version. + - Minimum version is 8.1. Recommended is version 12 or higher. + - More issues have been reported by people using older Android versions. - Use a regular, Google-account Android setup. No alternative Android versions. - Make sure the Google Play Services are all up to date. - **iPhone**: @@ -405,7 +406,8 @@ This button only exists in the Home Assistant Companion App. It is not available Make sure the requirements listed in the [prerequisites](#prerequisites) are met. This includes meeting the minimum system requirements: - **Android**: - - Minimum version is 8.1. Ideally, update to the latest version. + - Minimum version is 8.1. Recommended is version 12 or higher. + - More issues have been reported by people using older Android versions. - Use a regular, Google-account Android setup. No alternative Android versions. - Make sure the Google Play Services are all up to date. - **iPhone**: From 503cb44bcbc46658f88eb1f429615656dd12680b Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:47:10 +0100 Subject: [PATCH 088/118] Unable to commission: restructure to improve readability (#37553) --- source/_integrations/matter.markdown | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index cbf9a76bf8d..6a9348fa328 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -419,6 +419,20 @@ Refer to the steps under [Troubleshooting the installation](#troubleshooting-the ### Unable to commission devices, it keeps giving errors or stops working randomly -The Matter protocol relies on (local) IPv6 and mDNS (multicast traffic) which should be able to travel freely in your network. Matter devices that use Wi-Fi (including Thread border routers) must be on the same LAN/VLAN as Home Assistant. Matter devices that only use {% term Thread %} must be joined to {% term Thread %} networks for which there is at least one border router connected to the Home Assistant LAN. +#### Symptom + +The initial {% term commissioning %} keeps failing, you experience issues with discovering devices, or devices become unavailable randomly. + +#### Cause + +- The Matter protocol relies on (local) IPv6 and mDNS (multicast traffic) traveling freely in your network. +- Matter is designed for regular residential network setups and may not integrate well with enterprise networking solutions like VLANs, Multicast filtering, and (malfunctioning) IGMP snooping. + +#### Remedy + +1. Make sure that Matter devices that use Wi-Fi (including Thread border routers) are on the same VLANs/VLAN as Home Assistant. +2. Make sure that Matter devices that only use {% term Thread %} are joined to Thread networks for which there is at least one border router connected to the Home Assistant LAN. +3. Investigate your network topology. + - For instance, a setting on your router or Wi-Fi access point to "optimize" multicast traffic can harm the (discovery) traffic from Matter devices. Keep this in mind when you experience issues trying to add or control Matter devices. + - To avoid issues, try to keep your network topology as simple and flat as possible. -If you experience any issues with discovering devices (for example, if the initial {% term commissioning %} keeps failing or if devices become unavailable randomly), investigate your network topology. For instance, a setting on your router or Wi-Fi access point to "optimize" multicast traffic can harm the (discovery) traffic from Matter devices. Keep this in mind when you experience issues trying to add or control Matter devices. Protocols like Matter are designed for regular residential network setups and may not integrate well with enterprise networking solutions like VLANs, Multicast filtering, and (malfunctioning) IGMP snooping. To avoid issues, try to keep your network topology as simple and flat as possible. From 46dd0d18460d1864f3cf3a3e82725f0e2465ab7a Mon Sep 17 00:00:00 2001 From: Markus Jacobsen Date: Wed, 19 Feb 2025 11:47:16 +0100 Subject: [PATCH 089/118] Move Bang & Olufsen Event entity documentation (#37554) * Move event entity documentation * Improve list formatting * Improve wording --- source/_integrations/bang_olufsen.markdown | 52 +++++++++++----------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/source/_integrations/bang_olufsen.markdown b/source/_integrations/bang_olufsen.markdown index 50f59deae51..38aa8efae7d 100644 --- a/source/_integrations/bang_olufsen.markdown +++ b/source/_integrations/bang_olufsen.markdown @@ -53,7 +53,7 @@ The **Bang & Olufsen** integration uses the [Mozart API](https://bang-olufsen.gi ## Supported features -Currently, a single device with a `media_player` entity is created for each added physical device. For advanced automations, [events](#automations) are fired in Home Assistant. +Currently, for each added physical device, a single device is created that includes a `media_player` entity and, if available, `event` entities. ### Media player @@ -71,6 +71,32 @@ A number of features are available through the media player entity: - Connect to, expand to or unexpand devices. - Set all connected Beolink devices to standby. +### Events + +Event entities are created for each of the physical controls on your device. These controls usually have their own behaviors, so using them for automations is not always ideal. +Available event entities: + +- Bluetooth +- Microphone +- Next +- Play / Pause +- Favourite 1 +- Favourite 2 +- Favourite 3 +- Favourite 4 +- Previous +- Volume + +All of these event entities support the following event types: + +- Release of short press +- Long press +- Release of long press +- Very long press +- Release of very long press + +All devices except the [Beoconnect Core](https://www.bang-olufsen.com/en/dk/accessories/beoconnect-core) support device controls. + ## Limitations Currently, some features of the Mozart platform are not available through the [public API](https://github.com/bang-olufsen/mozart-open-api). Some may become available at a later point, but until then the [Bang & Olufsen App](https://www.bang-olufsen.com/en/dk/story/apps) can be used to configure these settings and features: @@ -484,30 +510,6 @@ target: WebSocket notifications received from the device are fired as events in Home Assistant. These can be received by listening to `bang_olufsen_websocket_event` event types, where `device_id` or `serial_number` can be used to differentiate devices. -### Events - -Event entities are created for each of the physical controls on your device. These controls usually have their own behaviors, so using them for automations is not always ideal. -Available event entities: -- Bluetooth -- Microphone -- Next -- Play / Pause -- Favourite 1 -- Favourite 2 -- Favourite 3 -- Favourite 4 -- Previous -- Volume - -All of these event entities support the following event types: -- Release of short press -- Long press -- Release of long press -- Very long press -- Release of very long press - -All devices except the [Beoconnect Core](https://www.bang-olufsen.com/en/dk/accessories/beoconnect-core) support device controls. - ### Getting Deezer URIs To find Deezer playlist, album URIs, and user IDs for Deezer flows, the Deezer website has to be accessed. When navigating to an album, the URL will look something like: , and this needs to be converted to: `album:ALBUM_ID` and the same applies to playlists, which have the format: `playlist:PLAYLIST_ID`. From 89148c91ffe3d583837be1cfa0449d29028a74bf Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Wed, 19 Feb 2025 14:29:50 +0100 Subject: [PATCH 090/118] Matter: troubleshoot 'device requires border router' (#37558) * Matter: troubleshoot device requires border router * Update source/_integrations/matter.markdown Co-authored-by: Marcel van der Veldt --------- Co-authored-by: Marcel van der Veldt --- source/_integrations/matter.markdown | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index 6a9348fa328..3a06f33baa6 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -417,6 +417,23 @@ Make sure the requirements listed in the [prerequisites](#prerequisites) are met Refer to the steps under [Troubleshooting the installation](#troubleshooting-the-installation). +### Error "this device requires a border router" + +#### Symptom + +While trying to add a Matter device with your Home Assistant Companion app, you get the error "this device requires a border router". + +#### Cause + +To add a Matter device which is based on the {% term Thread %} radio protocol, you need a {% term "Thread border router" %} near the device and your phone needs to know the credentials of your (newly created) Thread network. + +#### Remedy + +Set up a {% term "Thread border router" %} and synchronize the credentials from Home Assistant to your Android device: + +1. Follow the steps on [Turning Home Assistant into a Thread border router](https://www.home-assistant.io/integrations/thread#turning-home-assistant-into-a-thread-border-router). +2. Make sure to Sync the Thread credentials as described in step 3. + ### Unable to commission devices, it keeps giving errors or stops working randomly #### Symptom @@ -430,9 +447,8 @@ The initial {% term commissioning %} keeps failing, you experience issues with d #### Remedy -1. Make sure that Matter devices that use Wi-Fi (including Thread border routers) are on the same VLANs/VLAN as Home Assistant. -2. Make sure that Matter devices that only use {% term Thread %} are joined to Thread networks for which there is at least one border router connected to the Home Assistant LAN. +1. Make sure that Matter devices that use Wi-Fi (including {% term "Thread border router" %}) are on the same VLANs/VLAN as Home Assistant. +2. Make sure that Matter devices that only use {% term Thread %} are joined to Thread networks for which there is at least one {% term "Thread border router" %} connected to the Home Assistant LAN. 3. Investigate your network topology. - For instance, a setting on your router or Wi-Fi access point to "optimize" multicast traffic can harm the (discovery) traffic from Matter devices. Keep this in mind when you experience issues trying to add or control Matter devices. - To avoid issues, try to keep your network topology as simple and flat as possible. - From c429842a85d0bd99c1cb931b8423909ad3ba94d9 Mon Sep 17 00:00:00 2001 From: Daniel Anomfueme Date: Wed, 19 Feb 2025 14:42:03 +0100 Subject: [PATCH 091/118] Made changes to the website. (#37556) --- source/_integrations/zha.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index 62b3f0986af..e5439eddab3 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -95,7 +95,7 @@ Some other Zigbee coordinator hardware may not support a firmware that is capabl - Silicon Labs EmberZNet based radios using the EZSP protocol (via the [bellows](https://github.com/zigpy/bellows) library for zigpy) - [Home Assistant Connect ZBT-1](/connectzbt1/) (EFR32MG21-based USB dongle) - - [Home Assistant Yellow](/yellow/) with integrated EFR32MG21 radio + - [Home Assistant Yellow](/yellow/) with integrated MGM210P radio, which is based on the EFR32MG21 - [ITead SONOFF Zigbee 3.0 USB Dongle Plus Model "ZBDongle-E" (EFR32MG21 variant)](https://itead.cc/product/zigbee-3-0-usb-dongle/) - [SMLIGHT SLZB-07](https://smlight.tech/product/slzb-07/) (EFR32MG21-based USB dongle) - Texas Instruments based radios (via the [zigpy-znp](https://github.com/zigpy/zigpy-znp) library for zigpy) From 510d9ab122524365503d3d5eb7951ec648c7d095 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 14:56:48 +0100 Subject: [PATCH 092/118] build(deps): bump nokogiri from 1.18.2 to 1.18.3 (#37563) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.2 to 1.18.3. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/v1.18.3/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.18.2...v1.18.3) --- updated-dependencies: - dependency-name: nokogiri dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index c23f3534820..78b4e119bbc 100644 --- a/Gemfile +++ b/Gemfile @@ -24,7 +24,7 @@ group :jekyll_plugins do end gem 'sinatra', '4.1.1' -gem 'nokogiri', '1.18.2' +gem 'nokogiri', '1.18.3' # Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem # and associated library diff --git a/Gemfile.lock b/Gemfile.lock index edaf54ee7eb..6f343ee12c2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -86,9 +86,9 @@ GEM multi_json (1.15.0) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) - nokogiri (1.18.2-arm64-darwin) + nokogiri (1.18.3-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.2-x86_64-linux-gnu) + nokogiri (1.18.3-x86_64-linux-gnu) racc (~> 1.4) parallel (1.26.3) parser (3.3.7.1) @@ -181,7 +181,7 @@ DEPENDENCIES jekyll-paginate (= 1.1.0) jekyll-sitemap (= 1.4.0) jekyll-toc (= 0.19.0) - nokogiri (= 1.18.2) + nokogiri (= 1.18.3) rackup (= 2.2.1) rake (= 13.2.1) rubocop (= 1.72.2) From 8f7488682afddab17ddc5d3978341a48244556ee Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Wed, 19 Feb 2025 15:08:12 +0100 Subject: [PATCH 093/118] Matter: rephrase commission using app troubleshooter (#37559) --- source/_integrations/matter.markdown | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index 3a06f33baa6..4f344fb90cc 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -401,17 +401,22 @@ NOTE for Android users: You need to follow the instructions at the bottom of the ### I do not see the button _Commission using the Companion app_ -This button only exists in the Home Assistant Companion App. It is not available in the browser. +The **Commission using the Companion app** button only exists in the Home Assistant Companion App. It is not available in the browser. -Make sure the requirements listed in the [prerequisites](#prerequisites) are met. This includes meeting the minimum system requirements: +#### Remedy -- **Android**: - - Minimum version is 8.1. Recommended is version 12 or higher. - - More issues have been reported by people using older Android versions. - - Use a regular, Google-account Android setup. No alternative Android versions. - - Make sure the Google Play Services are all up to date. -- **iPhone**: - - Have the iOS version 16 or higher +If you don't see the button in the Companion app: + +1. Make sure the requirements listed in the [prerequisites](#prerequisites) are met. +2. This includes meeting the minimum system requirements: + + - **Android**: + - Minimum version is 8.1. Recommended is version 12 or higher. + - More issues have been reported by people using older Android versions. + - Use a regular, Google-account Android setup. No alternative Android versions. + - Make sure the Google Play Services are all up to date. + - **iPhone**: + - Have the iOS version 16 or higher ### When trying to commission using Android, I get an error "Matter is unavailable" From a60c732c2b26c03bf53373dcca038ae6dff1138d Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:39:04 +0100 Subject: [PATCH 094/118] Matter via Android: troubleshoot 'checking network connectivity' (#37560) --- source/_integrations/matter.markdown | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index 4f344fb90cc..8b042e75ccf 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -144,12 +144,12 @@ Make sure you have all these components ready before trying to add a Matter devi #### Prepare Android or iPhone - Have either an Android or iPhone ready and Bluetooth enabled. For information why Bluetooth is required, refer to the section on [Bluetooth used during commissioning](#bluetooth-used-during-commissioning): - - Android: + - **Android**: - At a minimum, have Android version 8.1. Recommended is version 12 or higher. - Have the latest version of the Home Assistant Companion app, installed from the Play Store (full version). - If you are using {% term Thread %}: Make sure there is a Thread border router device (Nest Hub (2nd Gen) or Nest Wi-Fi Pro or Home Assistant with the OpenThread Border Router add-on) present in your home network. - If you are using OpenThread (for Connect ZBT-1/SkyConnect) as border router, make sure you followed the steps in the [Thread documentation](/integrations/thread#turning-home-assistant-into-a-thread-border-router). - - iPhone + - **iPhone** - Have the iOS version 16 or higher - Have the latest version of the Home Assistant Companion app installed. - If you are using {% term Thread %}: Make sure there is a Thread border router device (HomePod Mini or V2, Apple TV 4K or Home Assistant with the OpenThread Border Router add-on) present in your home network. @@ -422,6 +422,26 @@ If you don't see the button in the Companion app: Refer to the steps under [Troubleshooting the installation](#troubleshooting-the-installation). +### Android: stuck at "Checking network connectivity" + +#### Symptom + +You are trying to {% term commissioning commission %} a Matter device using an Android phone. During that process, you see the "Checking network connectivity" message and never get past that. + +#### Remedy + +1. Make sure the requirements listed in the [prerequisites](#prerequisites) are met. +2. This includes meeting the minimum system requirements for **Android**: + + - Minimum version is 8.1. Recommended is version 12 or higher. + - More issues have been reported by people using older Android versions. + - Use a regular, Google-account Android setup. No alternative Android versions. + - Make sure the Google Play Services are all up to date. +3. If you are adding a {% term Thread %}-based Matter device, make sure the phone is in close range of the border router and your device. +4. If you are adding a Wi-Fi-based Matter device: + - Matter devices often use the 2.4 GHz frequency for Wi-Fi. + - Make sure your phone is in the same 2.4 GHz network where you want to operate your devices. + ### Error "this device requires a border router" #### Symptom From 181e1cb4261dd3b12a7f9bf11ce4f9c59f7e3c27 Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:39:27 +0100 Subject: [PATCH 095/118] Matter: troubleshoot 'OTA update didnt work' (#37565) * Matter: troubleshoot 'OTA update didnt work' * Fix typo * Update source/_integrations/matter.markdown Co-authored-by: Marcel van der Veldt --------- Co-authored-by: Marcel van der Veldt --- source/_integrations/matter.markdown | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index 8b042e75ccf..58237d17116 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -459,6 +459,26 @@ Set up a {% term "Thread border router" %} and synchronize the credentials from 1. Follow the steps on [Turning Home Assistant into a Thread border router](https://www.home-assistant.io/integrations/thread#turning-home-assistant-into-a-thread-border-router). 2. Make sure to Sync the Thread credentials as described in step 3. +### Error "Target node did not process the update file" + +#### Symptom + +You are trying to update a Matter over Thread device via Home Assistant and see the error "Target node did not process the update file". + +#### Cause + +Over-the-air (OTA) updates of Matter devices from Home Assistant are not supported with an Apple {% term "Thread border router" %}. + +#### Remedy + +- If you only have a {% term "Thread border router" %} from Apple, you cannot update the device from Home Assistant. + - If you want to be able to use OTA updates on these devices, you could add another border router, for example by [turning Home Assistant into a Thread border router](/integrations/thread#turning-home-assistant-into-a-thread-border-router). + +- If you have a mixture of Apple and other {% term "Thread border routers" %} such as the Home Assistant [OpenThread border router](/integrations/thread#openthread-border-routers), follow these steps: + 1. Power down all the Apple {% term "Thread border routers" %}. + 2. Wait at least 30 minutes. + 3. Try again to update the devices from Home Assistant. + ### Unable to commission devices, it keeps giving errors or stops working randomly #### Symptom From cec6d7c4c96835eaa3604de8bb264d2a48d91fd2 Mon Sep 17 00:00:00 2001 From: Richard Kroegel <42204099+rikroe@users.noreply.github.com> Date: Wed, 19 Feb 2025 19:15:09 +0100 Subject: [PATCH 096/118] Improve schedule documentation (#37104) --- source/_integrations/schedule.markdown | 158 ++++++++++++------------- 1 file changed, 78 insertions(+), 80 deletions(-) diff --git a/source/_integrations/schedule.markdown b/source/_integrations/schedule.markdown index 28751234c08..7b876331a58 100644 --- a/source/_integrations/schedule.markdown +++ b/source/_integrations/schedule.markdown @@ -12,64 +12,58 @@ ha_domain: schedule ha_integration_type: helper --- -The schedule integration provides a way to create a weekly schedule in -Home Assistant that can be used to trigger or make decisions in your -automations and scripts. - -The preferred way to configure a schedule is via the user interface at -**{% my helpers title="Settings > Devices & services > Helpers." %}** Click the add button -and then choose the **{% my config_flow_start domain=schedule title="Schedule" %}** option, or click the My button below. +The **Schedule** {% term integration %} provides a way to create a weekly schedule {% term entity %} in Home Assistant, consisting of time blocks with defined start and end times. The schedule is active when a time block starts and becomes inactive when it ends, allowing it to be used for triggering or making decisions in automations and scripts. {% include integrations/config_flow.md %} -To be able to add **{% my helpers title="Helpers" %}** via the user interface you should -have `default_config:` in your {% term "`configuration.yaml`" %}, it should already -be there by default unless you removed it. +{% configuration_basic %} +Name: + description: Friendly name of the schedule. +Icon: + description: Icon to display in the frontend for this schedule. +Schedule blocks: + description: > + Press and drag to select time blocks for each day of the week. + It is not possible to create overlapping time blocks on the same day. +{% endconfiguration_basic %} -If you removed `default_config:` from your configuration, -you must add it back or, alternatively, `schedule:` to your -`configuration.yaml` first, before you can create them via the UI. +After creating schedule blocks, you can press a block to edit the details. -Alternatively, a schedule can also be created and configured via YAML -configuration. For example: +{% configuration_basic %} +Start: + required: true + type: time + description: The start time to mark the schedule as active/on. +End: + required: true + type: time + description: The end time to mark as inactive/off again. +Additional data: + required: false + type: map + description: A mapping of attribute names to values, which will be added to the entity's attributes when the block is active. +{% endconfiguration_basic %} + +### Adding additional data + +Adding the following as `Additional data` will show `brightness` and `color_temp` as {% term entity %} attributes when the block is active: ```yaml -# Example configuration.yaml entry -schedule: - thermostat_schedule: - name: "Thermostat schedule" - monday: - - from: "17:00:00" - to: "21:00:00" - tuesday: - - from: "17:00:00" - to: "21:00:00" - wednesday: - - from: "17:00:00" - to: "21:00:00" - thursday: - - from: "17:00:00" - to: "21:00:00" - friday: - - from: "17:00:00" - to: "23:00:00" - saturday: - - from: "07:00:00" - to: "10:00:00" - - from: "16:00:00" - to: "23:00:00" - sunday: - - from: "07:00:00" - to: "21:00:00" +brightness: 100 +color_temp: 4000 ``` -Defining the schedule in YAML also allows adding extra data to each block, which will -appear as attributes on the schedule helper entity when that block is active. This can -be used to easily build schedule-based automations. +## YAML configuration + +Alternatively, this {% term integration %} can be configured and set up manually via YAML instead. +To enable the Integration sensor in your installation, add the following to your {% term "`configuration.yaml`" %} file. + +{% note %} + +The `data` field follows the same logic as described above in *Adding additional data*. + +{% endnote %} -The `data` key of each block should be a mapping of attribute names to values. In this example, -the schedule helper entity will have "Brightness" and "Color temp" attributes when -the blocks are active: ```yaml schedule: @@ -116,7 +110,6 @@ schedule: type: icon "monday|tuesday|wednesday|thursday|friday|saturday|sunday": description: A schedule for each day of the week. - required: false required: true type: list keys: @@ -129,54 +122,59 @@ schedule: required: true type: time data: - description: Additional data to add to the entity's attributes when this block is active. + description: A mapping of attribute names to values, which will be added to the entity's attributes when the block is active. required: false type: map default: {} {% endconfiguration %} -### Attributes +## Attributes -A schedule entity's state exports attributes that can be useful in -automations and templates. +A schedule entity exports state attributes that can be useful in automations and templates. | Attribute | Description | | ----- | ----- | | `next_event` | A datetime object containing the next time the schedule is going to change state. | +| `key_1`, `key_2`, ... | The mapping values from **Additional data** / `data` settings of a time block when the respective block is active. | -### Automation example +## Automation example -A schedule creates an on/off (schedule) sensor within the times set. Using the thermostat schedule example above, you can turn on your thermostat: - -```yaml -triggers: - - trigger: state - entity_id: - - schedule.thermostat_schedule - to: "on" - actions: - - action: climate.turn_on - target: - entity_id: climate.thermostat -``` - -Using the `light_schedule` example from above in an automation might look like this: +A schedule creates an on/off (schedule) sensor within the times set. +By incorporating the `light_schedule` example from above in an automation, we can turn on a light when the schedule is active. {% raw %} ```yaml triggers: - - trigger: state - entity_id: - - schedule.light_schedule - to: "on" - actions: - - action: light.turn_on - target: - entity_id: light.kitchen - data: - brightness_pct: "{{ state_attr('schedule.light_schedule', 'brightness') }}" - kelvin: "{{ state_attr('schedule.light_schedule, 'temperature') }}" + - trigger: state + entity_id: + - schedule.light_schedule + to: "on" +actions: + - action: light.turn_on + target: + entity_id: light.kitchen + data: + brightness_pct: "{{ state_attr('schedule.light_schedule', 'brightness') }}" + kelvin: "{{ state_attr('schedule.light_schedule', 'color_temp') }}" +``` + +{% endraw %} + +Another automation can be added to turn the lights off once the schedule is inactive: + +{% raw %} + +```yaml +triggers: + - trigger: state + entity_id: + - schedule.light_schedule + to: "off" +actions: + - action: light.turn_off + target: + entity_id: light.kitchen ``` {% endraw %} From 48e19f989466d7ef25903dc2b25dfb973fa4fdc9 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 19 Feb 2025 19:58:01 +0100 Subject: [PATCH 097/118] Add Trigger Selector example in Selectors Documentation (#37571) Co-authored-by: Franck Nijhof --- source/_docs/blueprint/selectors.markdown | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/_docs/blueprint/selectors.markdown b/source/_docs/blueprint/selectors.markdown index ca4ed195ee7..ea5d7f82503 100644 --- a/source/_docs/blueprint/selectors.markdown +++ b/source/_docs/blueprint/selectors.markdown @@ -1539,3 +1539,19 @@ The output of this selector is a list of triggers. For example: entity_id: "sensor.outside_temperature" below: 20 ``` + +### Example - Merging with existing triggers + +If the trigger(s) should exist within a blueprint that already has some default triggers defined, and an additional customizable trigger should be merged, you need to use the `- triggers` syntax in the blueprint. + +```yaml +# Example trigger selector +input: + my_trigger_input: + selector: + trigger: +triggers: + - triggers: !input my_trigger_input + - platform: numeric_state + [...] +``` From 701b39ec8e73e236426afc4f2fe74ce401bc9c5a Mon Sep 17 00:00:00 2001 From: jlestel Date: Wed, 19 Feb 2025 21:24:24 +0100 Subject: [PATCH 098/118] Mention MyTeslamate API Registration (#37527) I want to mention the fleet api registration offered by MyTeslamate. The only one that allows you to do the whole process without any technical knowledge. Like FleetKey.cc, it is a third-party solution. For your information, it is the one that has already been promoted by EVCC. --- source/_integrations/tesla_fleet.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/tesla_fleet.markdown b/source/_integrations/tesla_fleet.markdown index a8fa085ce8f..8a03721ab07 100644 --- a/source/_integrations/tesla_fleet.markdown +++ b/source/_integrations/tesla_fleet.markdown @@ -46,6 +46,7 @@ You must have: - A [Developer Application](https://developer.tesla.com/en_US/dashboard) - A web domain and host that you can serve your public key file from. Some free options include: - [FleetKey.cc](https://fleetkey.cc) + - [MyTeslamate.com](https://app.myteslamate.com/fleet) - [AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html) - [Cloudflare Pages](https://pages.cloudflare.com/) - [Firebase Hosting](https://firebase.google.com/docs/hosting) From 97f354bd298e46f0bf7929bc3568df8c080f3fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20Diego=20Rodr=C3=ADguez=20Royo?= Date: Wed, 19 Feb 2025 21:33:43 +0100 Subject: [PATCH 099/118] Add remove instructions for Home Connect (#37575) --- source/_integrations/home_connect.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/home_connect.markdown b/source/_integrations/home_connect.markdown index 54f380b9e66..a19729f0a59 100644 --- a/source/_integrations/home_connect.markdown +++ b/source/_integrations/home_connect.markdown @@ -97,6 +97,14 @@ Internal examples: `http://192.168.0.2:8123/auth/external/callback`, `http://hom The integration configuration will ask for the *Client ID* and *Client Secret* created above. See [Application Credentials](/integrations/application_credentials) for more details. +## Removing the integration + +This integration follows standard integration removal. No extra steps are required. + +{% include integrations/remove_device_service.md %} + +After deleting the integration, go to [your applications at the Home Connect Developer portal](https://developer.home-connect.com/applications), find the application that you were using for Home Assistant, click on details and click on "Delete Application". + ## Actions The Home Connect integration makes various actions available. From 0ef90544189d0cbd4e85164866bdd5f4330a519f Mon Sep 17 00:00:00 2001 From: JLo Date: Wed, 19 Feb 2025 22:00:38 +0100 Subject: [PATCH 100/118] Add missing voice chapters (#37577) --- source/_posts/2022-12-20-year-of-voice.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_posts/2022-12-20-year-of-voice.markdown b/source/_posts/2022-12-20-year-of-voice.markdown index b109e172fd6..825136c2631 100644 --- a/source/_posts/2022-12-20-year-of-voice.markdown +++ b/source/_posts/2022-12-20-year-of-voice.markdown @@ -23,6 +23,10 @@ _**TL;DR**: It is our goal for 2023 to let users control Home Assistant in their - [Year of the Voice - Chapter 4](/blog/2023/10/12/year-of-the-voice-chapter-4-wakewords/) (October 12, 2023) - [Year of the Voice - Chapter 5](/blog/2023/12/13/year-of-the-voice-chapter-5/) (December 13, 2023) - [Voice - Chapter 6](/blog/2024/02/21/voice-chapter-6/) (February 21, 2024) + - [Voice - Chapter 7](/blog/2024/06/26/voice-chapter-7/) (June 26, 2024) + - [Voice - Chapter 8](/blog/2024/12/19/voice-chapter-8-assist-in-the-home/) (December 19, 2024) + - [Voice - Chapter 9](/blog/2025/02/13/voice-chapter-9-speech-to-phrase/) (February 13, 2024) +


From a4ea7a46ae200aab46364ca84c97992d5074419d Mon Sep 17 00:00:00 2001 From: szymonzdziabek <139346968+szymonzdziabek@users.noreply.github.com> Date: Thu, 20 Feb 2025 06:29:20 +0100 Subject: [PATCH 101/118] Update androidtv_remote.markdown (#37482) * Update androidtv_remote.markdown Added information about nVidia Shield limitations according to https://github.com/home-assistant/core/issues/136111 * Update androidtv_remote.markdown * tiny tweak --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/androidtv_remote.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/androidtv_remote.markdown b/source/_integrations/androidtv_remote.markdown index 73f6de751d6..f5be3626215 100644 --- a/source/_integrations/androidtv_remote.markdown +++ b/source/_integrations/androidtv_remote.markdown @@ -569,3 +569,4 @@ cards: - Some devices experience disconnects every 15 seconds. This is typically resolved by rebooting the Android TV device after the initial setup of the integration. - If you are not able to connect to the Android TV device, or are asked to pair it again and again, try force-stopping the Android TV Remote Service and clearing its storage. On the Android TV device, go to **Settings** > **Apps** > **Show system apps**. Then, select **Android TV Remote Service** > **Storage** > **Clear storage**. You will have to pair again. - Some onscreen keyboards enabled by TV manufacturers do not support concurrent virtual and onscreen keyboard use. This presents whenever a text field is selected, such as "search" where a constant **use the keyboard on your mobile device** will show, preventing you from opening the onscreen keyboard to type. This can be overcome by either disabling your 3rd party keyboard and using the default Gboard keyboard or by deselecting **Enable IME** in the **Configure** page of the integration. +- If you can't turn on your Nvidia Shield device, go to **Settings** > **Remotes & accessories** > **Simplified wake buttons** and disable the following options: **SHIELD 2019 Remote: Wake on power and Netflix buttons only** and **Controllers: Wake on NVIDIA or logo buttons only**. From 57aee5e802c38798b8bdb14732deb16ec2d7559f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Feb 2025 07:41:23 +0100 Subject: [PATCH 102/118] build(deps-dev): bump sorbet-runtime from 0.5.11834 to 0.5.11835 (#37582) Bumps [sorbet-runtime](https://github.com/sorbet/sorbet) from 0.5.11834 to 0.5.11835. - [Release notes](https://github.com/sorbet/sorbet/releases) - [Commits](https://github.com/sorbet/sorbet/commits) --- updated-dependencies: - dependency-name: sorbet-runtime dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6f343ee12c2..8f097b184ba 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -158,7 +158,7 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11834) + sorbet-runtime (0.5.11835) stringex (2.8.6) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) From 7c0ad25c03afcb4ea896640108a888753c01bff3 Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Thu, 20 Feb 2025 13:37:15 +0000 Subject: [PATCH 103/118] Fix section buttons (#37590) --- sass/homeassistant/pages/_landingpage.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sass/homeassistant/pages/_landingpage.scss b/sass/homeassistant/pages/_landingpage.scss index 8c77db0b0e4..bc6e0af75fd 100644 --- a/sass/homeassistant/pages/_landingpage.scss +++ b/sass/homeassistant/pages/_landingpage.scss @@ -188,6 +188,11 @@ $ha__primary_color: #03a9f4; width: 330px; } + .button{ + display: inline-block; + padding: 8px 24px; + } + .title { margin-bottom: 4px; } From f05da5073f04702a6ed6c871d091ca3ca26cf218 Mon Sep 17 00:00:00 2001 From: wsw70 <1345886+wsw70@users.noreply.github.com> Date: Thu, 20 Feb 2025 22:56:46 +0100 Subject: [PATCH 104/118] Added mention about the colour of the data line in graphs for short- and long-term data (#37587) --- source/_integrations/history.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/history.markdown b/source/_integrations/history.markdown index 87603d666a4..b6695317c50 100644 --- a/source/_integrations/history.markdown +++ b/source/_integrations/history.markdown @@ -44,7 +44,7 @@ You can access the **History** panel from the side bar. To export the data, foll By default, the recorder stores the sensor data for 10 days. Older data is purged automatically. The data for the last 10 days is taken from the recorder. -If you select a time frame that exceeds 10 days, the data is taken from the long term statistics table. The long term statistics data is sampled and averaged once per hour, to save storage. Therefore, the values might look different from what you see from the recorder data, which shows the measured values at the sample rate defined for that sensor. +If you select a time frame that exceeds 10 days, the data is taken from the long term statistics table. The long term statistics data is sampled and averaged once per hour, to save storage. Therefore, the values might look different from what you see from the recorder data, which shows the measured values at the sample rate defined for that sensor. The detailed data will be shown with a darker line on graphs. If the chosen time frame exceeds the retention period defined in the recorder, the long term statistics table is used as a data source. From 54a1dd2d5aff7be78fcf34f7c9940248cc08b96f Mon Sep 17 00:00:00 2001 From: JLo Date: Fri, 21 Feb 2025 07:21:15 +0100 Subject: [PATCH 105/118] Add VPE to voice product docs (#37513) * Draft * simplest way to get started * Re working local * Small line break * typo * removing "Questions" section that makes not a lot of sense. * tiny rephrase * markdown * use heading instead of bold * Update source/voice_control/voice_remote_local_assistant.markdown * Update source/voice_control/index.markdown Co-authored-by: Paulus Schoutsen * Remove one sentence * Update source/voice_control/voice_remote_local_assistant.markdown Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> * Update source/voice_control/index.markdown Co-authored-by: Paulus Schoutsen * Remove wizard picture * Update source/voice_control/voice_remote_local_assistant.markdown --------- Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Co-authored-by: Paulus Schoutsen --- .../voice_control/builtin_sentences.markdown | 21 ------- source/voice_control/index.markdown | 15 +++-- .../voice_remote_local_assistant.markdown | 61 +++++++++++++------ 3 files changed, 54 insertions(+), 43 deletions(-) diff --git a/source/voice_control/builtin_sentences.markdown b/source/voice_control/builtin_sentences.markdown index 67e06d91fb4..c73ff8191fd 100644 --- a/source/voice_control/builtin_sentences.markdown +++ b/source/voice_control/builtin_sentences.markdown @@ -147,27 +147,6 @@ Unlike regular voice timers, delayed commands cannot be canceled or modified. - *Pause TV in 10 minutes* - *Open the blinds in 5 minutes* -## Questions - -### Get information about a state - -- *What is the amount of energy from solar production?* -- *what is the heat pump co2 sensor's co2 level?* -- *what is the battery level of my phone?* - -### Ask about the weather - -- *What is the weather* -- Struggling with this one? Check the [troubleshooting section](/voice_control/troubleshooting/). - -### Ask about people - -(that have device tracking activated in Home Assistant) - -- *How many people are in the kitchen* -- *Who is in the garage* -- *Where is Anne* - ## Aborting - *Nevermind*: If you triggered the wake word by mistake and want to stop Home Assistant from listening diff --git a/source/voice_control/index.markdown b/source/voice_control/index.markdown index 69beced6a2b..bbae36654bd 100644 --- a/source/voice_control/index.markdown +++ b/source/voice_control/index.markdown @@ -19,19 +19,26 @@ This section will help you set up Assist, which is Home Assistant voice assistan Assist allows you to control Home Assistant using natural language. It is built on top of an open voice foundation and powered by knowledge provided by our community. -Assist is available to use on most platforms that can interface with Home Assistant. Look for the Assist icon Assist icon: +The simplest way to try out Assist is inside our companion app. Look for the Assist icon Assist icon at the top right of your dashboard. + +The simplest way to get started with Assist is with our recommended voice assistant hardware, the [Home Assistant Voice Preview Edition](/voice-pe/). As for the rest of Home Assistant core functionalities, Assist can be personalized and extended to fit your needs. + - It can work locally or leverage the greatest LLMs of the moment. - It can work on your phone or tablet or other custom voice devices. -Although adding voice to your smart home configuration is exciting, it will require you to check your existing setup of Home Assistant, especially if you made a lot of customization. But we have prepared a guide of steps and best practices to help you out, as well as our [Troubleshooting](/voice_control/troubleshooting/) guides. +## Getting Started -Ready? Now let's get started +When you configure voice assistant hardware made for Home Assistant, it will use a wizard to help you configure your system and get started to use voice. -- [I plan to use a local speech-to-text/text-to-speech setup](/voice_control/voice_remote_local_assistant/) +Our recommended voice assistant hardware is the [Home Assistant Voice Preview Edition](/voice-pe/). + +In case your hardware does not support our wizard, do not worry. Here are two detailed guides based on how you plan to process your voice (Locally, or using Home Assistant Cloud voice services) + +- [I plan to process my voice locally](/voice_control/voice_remote_local_assistant/) - [I plan to use Home Assistant Cloud](/voice_control/voice_remote_cloud_assistant/) (recommended as it is the simplest) ## Expand and Experiment diff --git a/source/voice_control/voice_remote_local_assistant.markdown b/source/voice_control/voice_remote_local_assistant.markdown index 4c01878a9cf..8861e4a7157 100644 --- a/source/voice_control/voice_remote_local_assistant.markdown +++ b/source/voice_control/voice_remote_local_assistant.markdown @@ -30,9 +30,37 @@ In Home Assistant, the Assist pipelines are made up of various components that t ## Some options for speech-to-text and text-to-speech -There is a speech-to-text and text-to-speech option that runs entirely local. No data is sent to external servers for processing. +There are speech-to-text and text-to-speech options that run entirely local. No data is sent to external servers for processing. + +### Speech-to-text engines + +There are currently two options to run speech-to-text locally: **Speech-to-Phrase** and **Whisper**. + +#### Speech-to-Phrase +[Speech-to-Phrase](https://github.com/OHF-voice/speech-to-phrase) is a close-ended speech model. + +- It transcribes what it knows. +- Extremely fast transcription even on a Home Assistant Green or Raspberry Pi 4 (under one second). +- Only supports a subset of Assist’s voice commands. + - More open-ended items such as shopping lists, naming a timer, and broadcasts are *not* usable out of the box. +- Speech-to-Phrase supports [various languages](https://github.com/OHF-voice/speech-to-phrase?tab=readme-ov-file#supported-languages). +- These qualities make it a great option for Home control! + +#### Whisper + +[Whisper](https://github.com/openai/whisper) is an open-ended speech model. + +- It will try to transcribe everything. +- The cost is slower processing speed: + - On a Raspberry Pi 4, it takes around 8 seconds to process incoming voice commands. + - On an Intel NUC, it is done in under a second. +- Supports [various languages](https://github.com/openai/whisper#available-models-and-languages). +- Whisper is only a great option in the following case: + 1. You have powerful hardware at home. + 2. You plan to extend your voice set-up beyond simple home control. For example, by pairing your assistant with an LLM-based agent. + +### Text-to-speech engine -The speech-to-text option is [Whisper](https://github.com/openai/whisper). It’s an open source AI model that supports [various languages](https://github.com/openai/whisper#available-models-and-languages). We use a forked version called [faster-whisper](https://github.com/SYSTRAN/faster-whisper). On a Raspberry Pi 4, it takes around 8 seconds to process incoming voice commands. On an Intel NUC, it is done in under a second. For text-to-speech, we have developed [Piper](https://github.com/rhasspy/piper). Piper is a fast, local neural text-to-speech system that sounds great and is optimized for the Raspberry Pi 4. It supports [many languages](https://rhasspy.github.io/piper-samples/). On a Raspberry Pi, using medium quality models, it can generate 1.6s of voice in a second. Please be sure to check how either option will work in your language, since quality can change quite a bit. @@ -42,20 +70,15 @@ Please be sure to check how either option will work in your language, since qual For the quickest way to get your local Assist pipeline started, follow these steps: 1. Install the add-ons to convert text into speech and vice versa. - - Install the {% my supervisor_addon addon="core_whisper" title="**Whisper**" %} and the {% my supervisor_addon addon="core_piper" title="**Piper**" %} add-ons. - ![Install the Whisper and Piper add-ons](/images/assist/piper-whisper-install-01.png) - - If you want to use a wake word, also install the {% my supervisor_addon addon="core_openwakeword" title="**openWakeWord**" %} add-on. + - Install the speech-to-text add-on of your choice, either {% my supervisor_addon addon="core_speech-to-phrase" title="**Speech-to-Phrase**" %} or {% my supervisor_addon addon="core_whisper" title="**Whisper**" %}. + - Install {% my supervisor_addon addon="core_piper" title="**Piper**" %} for text-to-speech. - Start the add-ons. - Once the add-ons are started, head over to the integrations under {% my integrations title="**Settings** > **Devices & Services**" %}. - - You should now see Piper and Whisper being discovered by the [Wyoming integration](/integrations/wyoming/). + - You should now see both services being discovered by the [Wyoming integration](/integrations/wyoming/). ![Whisper and Piper integrations](/images/assist/piper-whisper-install-new-02.png) - For each integration, select **Add**. - - Once the setup is complete, you should see both Piper and Whisper (and, optionally, also openWakeword) in one integration. - - ![Whisper and Piper integration](/images/assist/piper-whisper-install-new-03.png) - - **Whisper** converts speech into text. - - **Piper** converts text into speech. - - **Wyoming** is the protocol they are both using to communicate. + - You now have integrated a local speech-to-text engine of your choice (either {% my supervisor_addon addon="core_speech-to-phrase" title="**Speech-to-Phrase**" %} or {% my supervisor_addon addon="core_whisper" title="**Whisper**" %}) and a text-to-speech engine ({% my supervisor_addon addon="core_piper" title="**Piper**" %}). + 2. Setup your assistant. - Go to {% my voice_assistants title="**Settings** > **Voice assistants**" %} and select **Add assistant**. @@ -71,13 +94,9 @@ For the quickest way to get your local Assist pipeline started, follow these ste - Enter a name. You can pick any name that is meaningful to you. - Select the language that you want to speak. - Under **Conversation agent**, select **Home Assistant**. - - Under **Speech-to-text**, select **faster-whisper**. Select the language. - - Under **Text-to-speech**, select **piper**. Select the language. + - Under **Speech-to-text**, select the speech-to-text engine you choose in the previous step (either **Whisper** or **Speech-to-Phrase**). Select the language. + - Under **Text-to-speech**, select **Piper**. Select the language. - Depending on your language, you may be able to select different language variants. - - If you like, pick one of the predefined wake words. - ![Select wake word](/images/assist/assist_predefined_wakeword.png) - - You can even [define your own wake word](/voice_control/create_wake_word/). This is not difficult to do, but you will need to set aside a bit of time for this. - - Once you defined your own wake word, it will show in this pick list. 3. That's it. You ensured your voice commands can be processed locally on your device. 4. If you haven't done so yet, [expose your devices to Assist](/voice_control/voice_remote_expose_devices/#exposing-your-devices). @@ -94,6 +113,12 @@ The options are also documented in the add-on itself. Go to the {% my supervisor Also be sure to check the specific tutorial for [using Piper in Automations](voice_control/using_tts_in_automation/) +## Learning more about Speech-to-Phrase + +You can check out [Voice Chapter 9](/blog/2025/02/13/voice-chapter-9-speech-to-phrase/) to learn more about why we introduced Speech-to-Phrase, and why it's a great option for home control. + + + ## Next steps Once Assist is configured, now can now start using it. You can now talk through your device ([Android](/voice_control/android/), [iOS](/voice_control/apple/) or [Voice Preview edition](https://voice-pe.home-assistant.io/getting-started/)). From 3a352f90d5079c87f96ff91181d65e127a6a35b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 14:46:41 +0100 Subject: [PATCH 106/118] build(deps-dev): bump sorbet-runtime from 0.5.11835 to 0.5.11845 (#37599) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8f097b184ba..dc95a17ca0c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -158,7 +158,7 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11835) + sorbet-runtime (0.5.11845) stringex (2.8.6) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) From f56b981fe334869b8f5f91f0faa5f24721c5061f Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Fri, 21 Feb 2025 17:41:02 +0100 Subject: [PATCH 107/118] Add Reolink Argus Eco and Argus PT to supported models (#37602) --- source/_integrations/reolink.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/reolink.markdown b/source/_integrations/reolink.markdown index 263abdad0fc..ad74c12a4d8 100644 --- a/source/_integrations/reolink.markdown +++ b/source/_integrations/reolink.markdown @@ -376,7 +376,9 @@ The following battery-powered models have been tested and confirmed to work thro - [Argus 3 Pro](https://reolink.com/product/argus-3-pro/) - [Argus 4 Pro](https://reolink.com/product/argus-4-pro/) +- [Argus Eco](https://reolink.com/product/argus-eco/) - [Argus Eco Ultra](https://reolink.com/product/argus-eco-ultra/) +- [Argus PT](https://reolink.com/product/argus-pt/) - [Argus Track](https://reolink.com/product/argus-track/) - [Reolink Doorbell Battery](https://reolink.com/roadmap/) From 06605685039f70136c05d67314bfe1e56bd12678 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 21 Feb 2025 22:38:10 +0100 Subject: [PATCH 108/118] 2025.2.5 (#37612) --- _config.yml | 4 +- .../_posts/2025-02-05-release-20252.markdown | 86 +++++++++++++++++++ source/changelogs/core-2025.2.markdown | 85 ++++++++++++++++++ 3 files changed, 173 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 39d02a66fc6..2d5cf608759 100644 --- a/_config.yml +++ b/_config.yml @@ -108,8 +108,8 @@ social: # Home Assistant release details current_major_version: 2025 current_minor_version: 2 -current_patch_version: 4 -date_released: 2025-02-14 +current_patch_version: 5 +date_released: 2025-02-21 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2025-02-05-release-20252.markdown b/source/_posts/2025-02-05-release-20252.markdown index f5bd02d39a0..91e12fbec1e 100644 --- a/source/_posts/2025-02-05-release-20252.markdown +++ b/source/_posts/2025-02-05-release-20252.markdown @@ -76,6 +76,7 @@ _PS: It is almost Valentine's day, did you set up some romantic scenes yet? 🌹 - [2025.2.2 - February 10](#202522---february-10) - [2025.2.3 - February 12](#202523---february-12) - [2025.2.4 - February 14](#202524---february-14) + - [2025.2.5 - February 21](#202525---february-21) - [Need help? Join the community!](#need-help-join-the-community) - [Backward-incompatible changes](#backward-incompatible-changes) - [All changes](#all-changes) @@ -738,6 +739,91 @@ release every Friday. [@shaiu]: https://github.com/shaiu [@thecode]: https://github.com/thecode +### 2025.2.5 - February 21 + +- Adjust Tuya Water Detector to support 1 as an alarm state ([@petacz] - [#135933]) +- Fix bug in set_preset_mode_with_end_datetime (wrong typo of frost_guard) ([@pectum83] - [#138402]) +- Bump pyhive-integration to 1.0.2 ([@KJonline] - [#138569]) +- Bump tesla-fleet-api to v0.9.10 ([@Bre77] - [#138575]) +- Bump pysmarty2 to 0.10.2 ([@lucab-91] - [#138625]) +- Rename "returned" state to "alert" ([@shaiu] - [#138676]) +- Bump pyvesync for vesync ([@cdnninja] - [#138681]) +- Opower: Fix unavailable "start date" and "end date" sensors ([@SaswatPadhi] - [#138694]) +- Correct backup filename on delete or download of cloud backup ([@emontnemery] - [#138704]) +- Correct invalid automatic backup settings when loading from store ([@emontnemery] - [#138716]) +- Bump airgradient to 0.9.2 ([@joostlek] - [#138725]) +- Clean up translations for mocked integrations inbetween tests ([@emontnemery] - [#138732]) +- Bump pyrympro from 0.0.8 to 0.0.9 ([@nivstein] - [#138753]) +- Don't allow setting backup retention to 0 days or copies ([@emontnemery] - [#138771]) +- Fix TV input source option for Sonos Arc Ultra ([@PeteRager] - [#138778]) +- Add assistant filter to expose entities list command ([@synesthesiam] - [#138817]) +- Fix playback for encrypted Reolink files ([@starkillerOG] - [#138852]) +- Correct backup date when reading a backup created by supervisor ([@emontnemery] - [#138860]) +- Bump pyfritzhome to 0.6.15 ([@mib1185] - [#138879]) +- Validate hassio backup settings ([@emontnemery] - [#138880]) +- Catch zeep fault as well on GetSystemDateAndTime call. ([@DmitryKuzmenko] - [#138916]) +- Fix Reolink callback id collision ([@starkillerOG] - [#138918]) +- Fix handling of min/max temperature presets in AVM Fritz!SmartHome ([@mib1185] - [#138954]) +- Bump pyprosegur to 0.0.13 ([@dgomes] - [#138960]) +- Bump reolink-aio to 0.12.0 ([@starkillerOG] - [#138985]) +- Bump deebot-client to 12.2.0 ([@edenhaus] - [#138986]) +- Omit unknown hue effects ([@joostlek] - [#138992]) +- Update frontend to 20250221.0 ([@bramkragten] - [#139006]) + +[#135933]: https://github.com/home-assistant/core/pull/135933 +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137688]: https://github.com/home-assistant/core/pull/137688 +[#138231]: https://github.com/home-assistant/core/pull/138231 +[#138402]: https://github.com/home-assistant/core/pull/138402 +[#138408]: https://github.com/home-assistant/core/pull/138408 +[#138530]: https://github.com/home-assistant/core/pull/138530 +[#138569]: https://github.com/home-assistant/core/pull/138569 +[#138575]: https://github.com/home-assistant/core/pull/138575 +[#138625]: https://github.com/home-assistant/core/pull/138625 +[#138676]: https://github.com/home-assistant/core/pull/138676 +[#138681]: https://github.com/home-assistant/core/pull/138681 +[#138694]: https://github.com/home-assistant/core/pull/138694 +[#138704]: https://github.com/home-assistant/core/pull/138704 +[#138716]: https://github.com/home-assistant/core/pull/138716 +[#138725]: https://github.com/home-assistant/core/pull/138725 +[#138732]: https://github.com/home-assistant/core/pull/138732 +[#138753]: https://github.com/home-assistant/core/pull/138753 +[#138771]: https://github.com/home-assistant/core/pull/138771 +[#138778]: https://github.com/home-assistant/core/pull/138778 +[#138817]: https://github.com/home-assistant/core/pull/138817 +[#138852]: https://github.com/home-assistant/core/pull/138852 +[#138860]: https://github.com/home-assistant/core/pull/138860 +[#138879]: https://github.com/home-assistant/core/pull/138879 +[#138880]: https://github.com/home-assistant/core/pull/138880 +[#138916]: https://github.com/home-assistant/core/pull/138916 +[#138918]: https://github.com/home-assistant/core/pull/138918 +[#138954]: https://github.com/home-assistant/core/pull/138954 +[#138960]: https://github.com/home-assistant/core/pull/138960 +[#138985]: https://github.com/home-assistant/core/pull/138985 +[#138986]: https://github.com/home-assistant/core/pull/138986 +[#138992]: https://github.com/home-assistant/core/pull/138992 +[#139006]: https://github.com/home-assistant/core/pull/139006 +[@Bre77]: https://github.com/Bre77 +[@DmitryKuzmenko]: https://github.com/DmitryKuzmenko +[@KJonline]: https://github.com/KJonline +[@PeteRager]: https://github.com/PeteRager +[@SaswatPadhi]: https://github.com/SaswatPadhi +[@bramkragten]: https://github.com/bramkragten +[@cdnninja]: https://github.com/cdnninja +[@dgomes]: https://github.com/dgomes +[@edenhaus]: https://github.com/edenhaus +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@joostlek]: https://github.com/joostlek +[@lucab-91]: https://github.com/lucab-91 +[@mib1185]: https://github.com/mib1185 +[@nivstein]: https://github.com/nivstein +[@pectum83]: https://github.com/pectum83 +[@petacz]: https://github.com/petacz +[@shaiu]: https://github.com/shaiu +[@starkillerOG]: https://github.com/starkillerOG +[@synesthesiam]: https://github.com/synesthesiam + ## Need help? Join the community! Home Assistant has a great community of users who are all more than willing diff --git a/source/changelogs/core-2025.2.markdown b/source/changelogs/core-2025.2.markdown index a9db1e5e1e7..b3db05fb0ea 100644 --- a/source/changelogs/core-2025.2.markdown +++ b/source/changelogs/core-2025.2.markdown @@ -1612,6 +1612,91 @@ For a summary in a more readable format: [@shaiu]: https://github.com/shaiu [@thecode]: https://github.com/thecode +## Release 2025.2.5 - February 21 + +- Adjust Tuya Water Detector to support 1 as an alarm state ([@petacz] - [#135933]) +- Fix bug in set_preset_mode_with_end_datetime (wrong typo of frost_guard) ([@pectum83] - [#138402]) +- Bump pyhive-integration to 1.0.2 ([@KJonline] - [#138569]) +- Bump tesla-fleet-api to v0.9.10 ([@Bre77] - [#138575]) +- Bump pysmarty2 to 0.10.2 ([@lucab-91] - [#138625]) +- Rename "returned" state to "alert" ([@shaiu] - [#138676]) +- Bump pyvesync for vesync ([@cdnninja] - [#138681]) +- Opower: Fix unavailable "start date" and "end date" sensors ([@SaswatPadhi] - [#138694]) +- Correct backup filename on delete or download of cloud backup ([@emontnemery] - [#138704]) +- Correct invalid automatic backup settings when loading from store ([@emontnemery] - [#138716]) +- Bump airgradient to 0.9.2 ([@joostlek] - [#138725]) +- Clean up translations for mocked integrations inbetween tests ([@emontnemery] - [#138732]) +- Bump pyrympro from 0.0.8 to 0.0.9 ([@nivstein] - [#138753]) +- Don't allow setting backup retention to 0 days or copies ([@emontnemery] - [#138771]) +- Fix TV input source option for Sonos Arc Ultra ([@PeteRager] - [#138778]) +- Add assistant filter to expose entities list command ([@synesthesiam] - [#138817]) +- Fix playback for encrypted Reolink files ([@starkillerOG] - [#138852]) +- Correct backup date when reading a backup created by supervisor ([@emontnemery] - [#138860]) +- Bump pyfritzhome to 0.6.15 ([@mib1185] - [#138879]) +- Validate hassio backup settings ([@emontnemery] - [#138880]) +- Catch zeep fault as well on GetSystemDateAndTime call. ([@DmitryKuzmenko] - [#138916]) +- Fix Reolink callback id collision ([@starkillerOG] - [#138918]) +- Fix handling of min/max temperature presets in AVM Fritz!SmartHome ([@mib1185] - [#138954]) +- Bump pyprosegur to 0.0.13 ([@dgomes] - [#138960]) +- Bump reolink-aio to 0.12.0 ([@starkillerOG] - [#138985]) +- Bump deebot-client to 12.2.0 ([@edenhaus] - [#138986]) +- Omit unknown hue effects ([@joostlek] - [#138992]) +- Update frontend to 20250221.0 ([@bramkragten] - [#139006]) + +[#135933]: https://github.com/home-assistant/core/pull/135933 +[#137448]: https://github.com/home-assistant/core/pull/137448 +[#137688]: https://github.com/home-assistant/core/pull/137688 +[#138231]: https://github.com/home-assistant/core/pull/138231 +[#138402]: https://github.com/home-assistant/core/pull/138402 +[#138408]: https://github.com/home-assistant/core/pull/138408 +[#138530]: https://github.com/home-assistant/core/pull/138530 +[#138569]: https://github.com/home-assistant/core/pull/138569 +[#138575]: https://github.com/home-assistant/core/pull/138575 +[#138625]: https://github.com/home-assistant/core/pull/138625 +[#138676]: https://github.com/home-assistant/core/pull/138676 +[#138681]: https://github.com/home-assistant/core/pull/138681 +[#138694]: https://github.com/home-assistant/core/pull/138694 +[#138704]: https://github.com/home-assistant/core/pull/138704 +[#138716]: https://github.com/home-assistant/core/pull/138716 +[#138725]: https://github.com/home-assistant/core/pull/138725 +[#138732]: https://github.com/home-assistant/core/pull/138732 +[#138753]: https://github.com/home-assistant/core/pull/138753 +[#138771]: https://github.com/home-assistant/core/pull/138771 +[#138778]: https://github.com/home-assistant/core/pull/138778 +[#138817]: https://github.com/home-assistant/core/pull/138817 +[#138852]: https://github.com/home-assistant/core/pull/138852 +[#138860]: https://github.com/home-assistant/core/pull/138860 +[#138879]: https://github.com/home-assistant/core/pull/138879 +[#138880]: https://github.com/home-assistant/core/pull/138880 +[#138916]: https://github.com/home-assistant/core/pull/138916 +[#138918]: https://github.com/home-assistant/core/pull/138918 +[#138954]: https://github.com/home-assistant/core/pull/138954 +[#138960]: https://github.com/home-assistant/core/pull/138960 +[#138985]: https://github.com/home-assistant/core/pull/138985 +[#138986]: https://github.com/home-assistant/core/pull/138986 +[#138992]: https://github.com/home-assistant/core/pull/138992 +[#139006]: https://github.com/home-assistant/core/pull/139006 +[@Bre77]: https://github.com/Bre77 +[@DmitryKuzmenko]: https://github.com/DmitryKuzmenko +[@KJonline]: https://github.com/KJonline +[@PeteRager]: https://github.com/PeteRager +[@SaswatPadhi]: https://github.com/SaswatPadhi +[@bramkragten]: https://github.com/bramkragten +[@cdnninja]: https://github.com/cdnninja +[@dgomes]: https://github.com/dgomes +[@edenhaus]: https://github.com/edenhaus +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@joostlek]: https://github.com/joostlek +[@lucab-91]: https://github.com/lucab-91 +[@mib1185]: https://github.com/mib1185 +[@nivstein]: https://github.com/nivstein +[@pectum83]: https://github.com/pectum83 +[@petacz]: https://github.com/petacz +[@shaiu]: https://github.com/shaiu +[@starkillerOG]: https://github.com/starkillerOG +[@synesthesiam]: https://github.com/synesthesiam + [#112047]: https://github.com/home-assistant/core/pull/112047 [#121522]: https://github.com/home-assistant/core/pull/121522 [#121548]: https://github.com/home-assistant/core/pull/121548 From 38d2571d25601fcb931af47ee6ff57d8736a5a7e Mon Sep 17 00:00:00 2001 From: Tank5050 <130769521+Tank5050@users.noreply.github.com> Date: Sat, 22 Feb 2025 00:47:05 -0700 Subject: [PATCH 109/118] Add AVR-X3800H to supported models (#37617) --- source/_integrations/denonavr.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/denonavr.markdown b/source/_integrations/denonavr.markdown index 8edd3a69e8c..2d494c01b7b 100644 --- a/source/_integrations/denonavr.markdown +++ b/source/_integrations/denonavr.markdown @@ -45,6 +45,7 @@ Known supported devices: - Denon AVR-X3500H - Denon AVR-X3600H - Denon AVR-X3700H +- Denon AVR-X3800H - Denon AVC-X3800H - Denon AVR-X4100W - Denon AVR-X4300H From 3f31adae00dad458e0d400b8a3fe0663ffaa6fd8 Mon Sep 17 00:00:00 2001 From: cdnninja Date: Sun, 23 Feb 2025 07:34:55 -0700 Subject: [PATCH 110/118] Add 6000s to vesync (#37625) * Add 6000s to vesync --- source/_integrations/vesync.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/vesync.markdown b/source/_integrations/vesync.markdown index 9cf8b13d627..e87a3614275 100644 --- a/source/_integrations/vesync.markdown +++ b/source/_integrations/vesync.markdown @@ -79,6 +79,7 @@ This {% term integration %} supports devices controllable by the VeSync App. Th - Classic200S: Classic 200S Smart Ultrasonic Cool Mist Humidifier - Classic300S: Classic 300S Ultrasonic Smart Humidifier +- Superior6000S: Superior 6000S Smart Evaporative Humidifier ## Prerequisite From 7090cdb62e30adf9b6e98a20d4ddbe9d17f65a3e Mon Sep 17 00:00:00 2001 From: Arie Catsman <120491684+catsmanac@users.noreply.github.com> Date: Sun, 23 Feb 2025 15:54:44 +0100 Subject: [PATCH 111/118] Add sensor, number and input_number to groupable list (#37639) * Add sensor, number and input_number to groupable list * add plurals to new list members --- source/_integrations/group.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_integrations/group.markdown b/source/_integrations/group.markdown index ad9fde5655b..3930bb47ed8 100644 --- a/source/_integrations/group.markdown +++ b/source/_integrations/group.markdown @@ -53,6 +53,9 @@ The following entities can be grouped: - [event (events)](/integrations/event/) - [media player (media players)](/integrations/media_player/) - [notify (notifications)](/integrations/notify/) +- [sensor (sensors)](/integrations/sensor/) +- [number (numbers)](/integrations/number/) +- [input_number (input_numbers)](/integrations/input_number/) {% include integrations/config_flow.md %} @@ -136,7 +139,7 @@ In short, when any group member entity is `unlocked`, the group will also be `un - Otherwise, the group state is `on` if at least one group member is not `off`, `unavailable` or `unknown`. - Otherwise, the group state is `off`. -### Sensor groups +### Sensor, number, and input_number groups - The group state is combined / calculated based on `type` selected to determine the minimum, maximum, latest (last), mean, median, range, product, standard deviation, or sum of the collected states. - Members can be any `sensor`, `number` or `input_number` holding numeric states. From 126ec733faa35fbb37ee666cd3466e250ac0e0a7 Mon Sep 17 00:00:00 2001 From: elmurato <1382097+elmurato@users.noreply.github.com> Date: Sun, 23 Feb 2025 15:55:42 +0100 Subject: [PATCH 112/118] Remove wrong information in minecraft_server.markdown (#37642) --- source/_integrations/minecraft_server.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/minecraft_server.markdown b/source/_integrations/minecraft_server.markdown index eab24d9de11..e37e18d7d9d 100644 --- a/source/_integrations/minecraft_server.markdown +++ b/source/_integrations/minecraft_server.markdown @@ -22,7 +22,7 @@ ha_integration_type: integration ## Prerequisites - Minecraft Java Edition servers must be version 1.7 or newer, since older versions don't expose any information. -- The `enable-status` and `enable-query` must be set to `true` in the Minecraft `server.properties`. +- The configuration parameter `enable-status` must be set to `true` in the server configuration file (`server.properties`). {% include integrations/config_flow.md %} From c80ba637795f0148c639ba131f5fdda8af8de8fb Mon Sep 17 00:00:00 2001 From: kylehakala Date: Sun, 23 Feb 2025 09:06:25 -0600 Subject: [PATCH 113/118] ZHA markdown syntax cleanup (#37633) * Clean up misc syntax formatting * Remove empty heading, format note text * fix indention nested in note * Fix broken note syntax * Remove extraneous character from link title --- source/_integrations/zha.markdown | 43 +++++++++++++++++-------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index e5439eddab3..657dab2db0f 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -79,7 +79,7 @@ Before installing the ZHA integration in Home Assistant, you need to connect a Z Once ZHA has been set up with a Zigbee Coordinator it will automatically create a Zigbee network and you will be able to join/pair any Zigbee Router devices and Zigbee End Devices. With only a few [limitations](#limitations), most devices will join/pair directly regardless of brand and manufacturer. Technically almost all devices that are compliant with the official Zigbee specifications should offer interoperability, though a newer Zigbee Coordinator with support for later firmware often offers better compatibility with both new and older devices. Still, be aware that [all functionality might not always be supported or exposed for every device out-of-the-box](#knowing-which-devices-are-supported) as some devices that use manufacturer-specific extensions to add non-standard functions and features could sometimes need [device-specific code to fully work with ZHA](#how-to-add-support-for-new-and-unsupported-devices). -Note that because Zigbee relies on "mesh networking" technology it depends heavily on having [Zigbee Router devices](#using-router-devices-to-add-more-devices) to expand the network coverage and extend its size. These are always mains-powered devices that route messages to other devices that are located close to them within the Zigbee network mesh to improve the range and increase the total amount of devices you can add. You should therefore make sure that you add many Zigbee Router devices and not just Zigbee End Devices or else its network mesh connection routes will be limited due to the short range and poor wall penetration of Zigbee radio signals. It is highly recommended that you read and follow all the general tips below about [Zigbee interference avoidance and network range/coverage optimization)](#zigbee-interference-avoidance-and-network-rangecoverage-optimization). +Note that because Zigbee relies on "mesh networking" technology it depends heavily on having [Zigbee Router devices](#using-router-devices-to-add-more-devices) to expand the network coverage and extend its size. These are always mains-powered devices that route messages to other devices that are located close to them within the Zigbee network mesh to improve the range and increase the total amount of devices you can add. You should therefore make sure that you add many Zigbee Router devices and not just Zigbee End Devices or else its network mesh connection routes will be limited due to the short range and poor wall penetration of Zigbee radio signals. It is highly recommended that you read and follow all the general tips below about [Zigbee interference avoidance and network range/coverage optimization](#zigbee-interference-avoidance-and-network-rangecoverage-optimization). ## Compatible hardware @@ -89,8 +89,6 @@ Note! Zigbee 3.0 support or not in zigpy, depends primarily on your Zigbee coord Some other Zigbee coordinator hardware may not support a firmware that is capable of Zigbee 3.0 at all but can still be fully functional and feature-complete for your needs. This is very common as many, if not most, Zigbee devices do not yet Zigbee 3.0. As a general rule, newer Zigbee coordinator hardware generally supports Zigbee 3.0 firmware and it is up to its manufacturer to make such firmware available for them. -### Known working Zigbee radio modules - ### Recommended Zigbee radio adapters and modules - Silicon Labs EmberZNet based radios using the EZSP protocol (via the [bellows](https://github.com/zigpy/bellows) library for zigpy) @@ -218,7 +216,7 @@ Some devices can be auto-discovered, which can simplify the ZHA setup process. T | [Tube's CC2652P2 PoE-powered Zigbee to Ethernet Serial Coordinator)](https://www.tubeszb.com/) | Zeroconf | tube_zb_gw_cc2652p2_poe.local. | | [Tube's EFR32 Based Zigbee to Ethernet Serial Coordinator)](https://www.tubeszb.com/) | Zeroconf | tube_zb_gw_efr32.local. | -Additional devices in the [Known working Zigbee radio modules](#known-working-zigbee-radio-modules) list may be discoverable, however, only devices that have been confirmed discoverable are listed above. +Additional devices in the [Compatible hardware](#compatible-hardware) section may be discoverable, however, only devices that have been confirmed discoverable are listed above. ### OTA updates of Zigbee device firmware @@ -227,6 +225,7 @@ The ZHA integration has the ability to perform OTA (over-the-air) firmware updat To see OTA updates for a device, it must support OTA updates and firmware images for the device must be publicly provided by the manufacturer. ZHA currently only includes OTA providers for a few manufacturers that provide these updates publicly. **Included manufacturers:** + - IKEA - Inovelli - Ledvacnce/OSRAM @@ -281,7 +280,7 @@ Refer to the [zigpy documentation for OTA configuration](https://github.com/zigp #### Defining Zigbee channel to use -Tip! Before considering to change to an other Zigbee channel on an existing Zigbee network, it is highly recommended that you read through the two segments under the [troubleshooting](#troubleshooting) section below about "*Best practices to avoid pairing/connection difficulties*" and "*Zigbee interference avoidance and network range/coverage optimization*". These sections provide prerequisite information and advice on how to achieve the best possible Zigbee network in your environment. +Tip! Before considering to change to an other Zigbee channel on an existing Zigbee network, it is highly recommended that you read through the two segments under the [troubleshooting](#troubleshooting) section below about _Best practices to avoid pairing/connection difficulties_ and _Zigbee interference avoidance and network range/coverage optimization_. These sections provide prerequisite information and advice on how to achieve the best possible Zigbee network in your environment. ZHA prefers to use Zigbee channel 15 by default. You can change this using YAML configuration, but this only works if there's no existing network. To change the channel for an existing network, radio has to be factory reset and a new network to be formed. This requires re-pairing of all the devices. @@ -294,9 +293,13 @@ zha: channels: [15, 20, 25] # Channel mask ``` -Note! The best practice is to not change the Zigbee channel from the ZHA default. Also, the related troubleshooting segments mentioned in the tip above will, among other things, inform that if you have issues with overlapping frequencies between Wi-Fi and Zigbee, then it is usually better to first only try changing and setting a static Wi-Fi channel on your Wi-Fi router or all your Wi-Fi access points (instead of just changing to another Zigbee channel). +{% note %} +The best practice is to not change the Zigbee channel from the ZHA default. +{% endnote %} -MetaGeek Support has a good reference article about channel selection for [Zigbee and WiFi coexistance](https://support.metageek.com/hc/en-us/articles/203845040-ZigBee-and-WiFi-Coexistence). +The related troubleshooting segments mentioned above will, among other things, inform that if you have issues with overlapping frequencies between Wi-Fi and Zigbee, then it is usually better to first only try changing and setting a static Wi-Fi channel on your Wi-Fi router or all your Wi-Fi access points (instead of just changing to another Zigbee channel). + +MetaGeek Support has a good reference article about channel selection for [Zigbee and WiFi coexistence](https://support.metageek.com/hc/en-us/articles/203845040-ZigBee-and-WiFi-Coexistence). The Zigbee specification standards divide the 2.4 GHz ISM radio band into 16 Zigbee channels (i.e. distinct radio frequencies for Zigbee). For all Zigbee devices to be able to communicate, they must support the same Zigbee channel (i.e. Zigbee radio frequency) that is set on the Zigbee Coordinator as the channel to use for its Zigbee network. Not all Zigbee devices support all Zigbee channels. Channel support usually depends on the age of the hardware and firmware, as well as on the device's power ratings. @@ -341,11 +344,10 @@ from the same group: {% note %} Currently `qr_code` supports QR Install Codes from: - - - Aqara - - Bosch - - Consciot - - Embrighten + - Aqara + - Bosch + - Consciot + - Embrighten {% endnote %} ### Action `zha.remove` @@ -391,7 +393,7 @@ This action disables a lock code on a Zigbee lock. ## Adding devices -Tip! It is highly recommended that you read through the two segments under the troubleshooting section below about "*Best practices to avoid pairing/connection difficulties*" and "*Zigbee interference avoidance and network range/coverage optimization*" for general prerequisite knowledge and advice on how to achieve the best possible Zigbee network in your environment. +Tip! It is highly recommended that you read through the two segments under the troubleshooting section below about _Best practices to avoid pairing/connection difficulties_ and _Zigbee interference avoidance and network range/coverage optimization_ for general prerequisite knowledge and advice on how to achieve the best possible Zigbee network in your environment. **To add a new Zigbee device:** @@ -538,8 +540,8 @@ If you do not want to develop such a "quirk" Python script yourself, you can sub 1. Sign in to GitHub. 2. Select **New issue** and follow the instructions. - - New device support requests require the device signature + diagnostic information. - - You may also need to actively help in further testing or provide additional information to the volunteering developers. + - New device support requests require the device signature + diagnostic information. + - You may also need to actively help in further testing or provide additional information to the volunteering developers. Note that submitting a new "device support request" does not guarantee that someone else will develop a custom "quirk" for ZHA. The project relies on volunteering developers. However, without "device support requests", the developers may not be aware that your specific Zigbee device is not working correctly in ZHA. @@ -550,15 +552,15 @@ If you experience problems pairing a device, verify that you follow best practic - Check that your setup and environment are optimized to avoid interference. - As interference avoidance is an extremely important topic on its own, please read and follow the tips in the separate section below about Zigbee interference avoidance and network range/coverage optimization. - Check that you have enough Zigbee router devices (also known as Zigbee signal repeaters or range extenders) and if you do not have any, invest and add some mains-powered devices that will work as Zigbee routers. - - Aim to start out with mains-powered devices before adding battery-operated devices as a "weak" Zigbee network mesh (e.g., the device is too far from the Zigbee coordinator or a Zigbee router) may prevent some devices from being paired. Zigbee router devices are also needed to increase the maximum of devices that can be connected to your Zigbee mesh network. - - Note that some Zigbee devices are not fully compatible with all brands of Zigbee router devices. Xiaomi/Aqara devices are for example known not to work with Zigbee router devices from Centralite, General Electrics, Iris, Ledvance/OSRAM, LIGHTIFY/Sylvania, Orvibo, PEQ, Securifi, and SmartThings/Samsung. Better results can usually be achieved by using mains-powered devices IKEA and Nue/3A Home or dedicated DIY routing devices based on Texas Instruments CC253x/CC26x2 and XBee Series 2/3 Zigbee radios. + - Aim to start out with mains-powered devices before adding battery-operated devices as a "weak" Zigbee network mesh (e.g., the device is too far from the Zigbee coordinator or a Zigbee router) may prevent some devices from being paired. Zigbee router devices are also needed to increase the maximum of devices that can be connected to your Zigbee mesh network. + - Note that some Zigbee devices are not fully compatible with all brands of Zigbee router devices. Xiaomi/Aqara devices are for example known not to work with Zigbee router devices from Centralite, General Electrics, Iris, Ledvance/OSRAM, LIGHTIFY/Sylvania, Orvibo, PEQ, Securifi, and SmartThings/Samsung. Better results can usually be achieved by using mains-powered devices IKEA and Nue/3A Home or dedicated DIY routing devices based on Texas Instruments CC253x/CC26x2 and XBee Series 2/3 Zigbee radios. - If possible try to pair your Zigbee devices in their intended final location, (and not pair it next to the Zigbee coordinator and then need to move it after). - Pairing a Zigbee device next to the Zigbee coordinator and then moving it later can result in dropped/lost connections or other issues. - If the device you want to add is not brand new and as such never paired before then you always have to make sure to first manually reset the device to its factory default settings before you will be able to add/pair it. - Some battery-operated Zigbee devices are known to have problems with pairing if they have Low battery voltage. - - Some people have reported replacing the battery on their newly received Xiaomi/Aqara devices solved pairing issues. + - Some people have reported replacing the battery on their newly received Xiaomi/Aqara devices solved pairing issues. - Be patient as the pairing of some Zigbee devices may require multiple attempts and you may sometimes need to try again and again. - - Some devices, like example those from Xiaomi/Aqara, are known to not be 100% compliant with the standard Zigbee specifications and may therefore require many paring attempts over 10-20 minutes or longer. + - Some devices, like example those from Xiaomi/Aqara, are known to not be 100% compliant with the standard Zigbee specifications and may therefore require many paring attempts over 10-20 minutes or longer. ### Zigbee interference avoidance and network range/coverage optimization @@ -627,6 +629,7 @@ Missing links between Zigbee end devices (often battery-powered devices) in the Some end devices (for example, Xiaomi door sensors) sleep for an extended period, causing the parent Zigbee Router to remove them from its child table via a feature called router child aging. Since using child aging and removing them from the child table is a Zigbee 3.0 feature, this does not always occur because not all Zigbee router devices use child aging. This is what causes devices to show a missing link. Even though the device is no longer in the child table, the end device can still communicate via the parent Zigbee router. + #### How to interpret RSSI and LQI values Interpreting RSSI and LQI values can be complex, as metrics of network health and communication quality are provided by the devices themselves, and each device could get to its results in different ways. Unless you are a Zigbee specialist yourself or are guided by one, please ignore those values. They can be misleading. If you delve into this, it is important to understand not to judge RSSI or LQI values on their own. When troubleshooting Zigbee messages that are being dropped, you must interpret the combination of both RSSI and LQI. @@ -653,7 +656,7 @@ When reporting potential bugs related to the ZHA integration on the issues track 1. Debug logs for the issue, see [debug logging](#debug-logging). 2. Exact model and firmware of the Zigbee radio (Zigbee Coordinator adapter) being used. 3. If the issue is related to a specific Zigbee device, provide both the **Zigbee Device Signature** and the **Diagnostics** information. - - Both the **Zigbee Device Signature** and the **Diagnostics** information can be found under {% my integrations title="**Settings** > **Devices & services**" %}. Select the **Zigbee Home Automation** integration. Then, select **Configure** > **Devices** (pick your device). Select **Zigbee Device Signature** and **Download Diagnostics**, respectively. + - Both the **Zigbee Device Signature** and the **Diagnostics** information can be found under {% my integrations title="**Settings** > **Devices & services**" %}. Select the **Zigbee Home Automation** integration. Then, select **Configure** > **Devices** (pick your device). Select **Zigbee Device Signature** and **Download Diagnostics**, respectively. Note: Please also make sure you give it your best effort to follow the recommended best practices for avoiding both [pairing/connection difficulties](#best-practices-to-avoid-pairingconnection-difficulties) and [Zigbee interference](#zigbee-interference-avoidance-and-network-rangecoverage-optimization), (which helps free up time for developers). From acc6d5f0c9b6323566161bedc205e30c43def484 Mon Sep 17 00:00:00 2001 From: Manu <4445816+tr4nt0r@users.noreply.github.com> Date: Sun, 23 Feb 2025 16:10:53 +0100 Subject: [PATCH 114/118] Improve pyLoad documentation (#37616) * Improve pyLoad documentation * fix typo * apply suggestions --- source/_integrations/pyload.markdown | 134 ++++++++++++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) diff --git a/source/_integrations/pyload.markdown b/source/_integrations/pyload.markdown index 0d8532ddda5..0e7932c88ae 100644 --- a/source/_integrations/pyload.markdown +++ b/source/_integrations/pyload.markdown @@ -1,6 +1,6 @@ --- title: pyLoad -description: Instructions on how to integrate pyLoad download sensor within Home Assistant. +description: Instructions on how to integrate pyLoad download manager with Home Assistant. ha_category: - Downloading ha_release: 0.58 @@ -19,8 +19,54 @@ ha_config_flow: true The [**pyLoad**](https://pyload.net/) {% term integration %} enables monitoring your downloads directly in Home Assistant. This integration provides various sensors to keep track of your download activities and allows creating automations based on the sensor information, alongside button and switch controls for performing specific tasks such as aborting downloads and managing file restarts. +## About pyLoad + +**pyLoad** is an open-source download manager designed for always-on devices like home servers, NAS systems, and routers. It supports various file hosts, container formats, and web standards, enabling fully automated, unattended downloads. With its web interface, pyLoad allows for easy remote management from any device. + +## How you can use this integration + +The **pyLoad** integration allows you to monitor and control your downloads directly from Home Assistant. Here are some ways you can use it: + +- **Track active downloads** – Send a notification when all downloads are complete or if the queue is empty. +- **Free space alerts** – Set up an automation to alert you when disk space is low, ensuring downloads don’t fail due to storage issues. +- **Pause downloads** – Automatically pause downloads when streaming or gaming to avoid bandwidth congestion, then resume them later. + +## Prerequisites + +To set up the pyLoad integration, you must have a running pyLoad instance on your home server, NAS, or any other device. An always-on device is recommended. Ensure that pyLoad's web interface is accessible for Home Assistant. + +If you haven't set up pyLoad yet, an easy way to get it up and running is by installing the [pyLoad-ng add-on for Home Assistant](https://github.com/tr4nt0r/pyload-ng). + +- During the setup process in Home Assistant, you will need: + - pyLoad account credentials – A valid *username* and *password* to authenticate with pyLoad. + - The {% term host %} of the device running pyLoad. + - The port number that pyLoad is listening on (default is usually `8000`). + +{% note %} + +The account used for integration must either be an admin account or one with at least the following permissions: `DELETE`, `STATUS`, `LIST`, and `MODIFY`. You can set up and manage users and permissions under **Settings -> Users** in the pyLoad web interface. + +{% endnote %} + {% include integrations/config_flow.md %} +### Configuration parameters + +{% configuration_basic %} +Host: + description: "The hostname or IP address of the device running your pyLoad instance." +Port: + description: "The port of the pyLoad instance. pyLoad uses port 8000 by default." +Uses an SSL Certificate: + description: "If enabled, the connection to the pyLoad instance will use HTTPS." +Verify SSL certificate: + description: "If checked, the SSL certificate will be validated to ensure a secure connection." +Username: + description: "The username used to access the pyLoad instance." +Password: + description: "The password associated with the pyLoad account." +{% endconfiguration_basic %} + ## Sensors - **Speed:** Monitors the current download speed. @@ -40,3 +86,89 @@ The [**pyLoad**](https://pyload.net/) {% term integration %} enables monitoring - **Pause/Resume Queue:** Pauses or resumes the download queue. When paused, active downloads will continue, but new downloads in the queue will not start. - **Auto-reconnect:** If configured, enables pyLoad to automatically reconnect the internet connection. + +## Automations + +Get started with these example {% term automations %}. + +### Pause downloads when disk space is low + +This automation will pause new downloads when your available disk space falls below 5 GB. + +{% details "Example YAML configuration" %} + +{% raw %} + +```yaml +alias: "Monitor pyLoad download queue" +description: "Pause new downloads when the disk space is low." +triggers: + - trigger: numeric_state + entity_id: sensor.pyload_free_space + below: 5000000000 # Trigger when free space drops below 5 GB (in bytes) +actions: + - action: switch.turn_off + target: + entity_id: switch.pyload_pause_resume_queue + - service: notify.persistent_notification + data: + message: "Free space is low, pausing pyLoad queue." +mode: single +``` + +{% endraw %} + +{% enddetails %} + +### Halt pyLoad downloads when watching Netflix + +This automation halts all active pyLoad downloads when watching Netflix on your media player. + +{% details "Example YAML configuration" %} + +{% raw %} + +```yaml +alias: "Halt pyLoad downloads when watching Netflix" +description: "Halt all pyLoad downloads when Netflix streaming starts on the media player." +triggers: +- trigger: state + entity_id: media_player.android_tv + to: playing +conditions: +- condition: state + entity_id: media_player.android_tv + attribute: app_id + state: com.netflix.ninja +actions: +- action: button.press + target: + entity_id: button.pyload_abort_all_running_downloads +- action: notify.persistent_notification + data: + message: "pyLoad downloads have been halted because Netflix streaming started." +mode: single +``` + +{% endraw %} + +{% enddetails %} + +## Data updates + +This integration {% term polling polls %} your **pyLoad** instance every 20 seconds. If you prefer a different update frequency, you can define a **custom polling interval** — see [Defining a custom polling interval](/common-tasks/general/#defining-a-custom-polling-interval) for details. + +## Known limitations + +- **Paused downloads**: When the download queue is paused, active downloads will continue, but new downloads in the queue will not start until the queue is resumed. +- **Halt all downloads**: To completely halt downloading, use the `Abort all running downloads` action. The `Restart failed files/packages` action will also resume any aborted downloads. + +## Troubleshooting + +In any case, when reporting an issue, please enable [debug logging](/docs/configuration/troubleshooting/#debug-logs-and-diagnostics), restart the integration, and as soon as the issue reoccurs, stop the debug logging again (*download of debug log file will start automatically*). Further, if still possible, please also download the [diagnostics](/integrations/diagnostics) data. If you have collected the debug log and the diagnostics data, provide them with the issue report. + +## Remove integration + +This integration can be removed by following these steps: + +{% include integrations/remove_device_service.md %} From 9e754832c6ade9b1daa5c245fc7c57862d7fe300 Mon Sep 17 00:00:00 2001 From: tronikos Date: Sun, 23 Feb 2025 07:23:36 -0800 Subject: [PATCH 115/118] Document debug logging in Google Generative AI (#37622) --- .../google_generative_ai_conversation.markdown | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/source/_integrations/google_generative_ai_conversation.markdown b/source/_integrations/google_generative_ai_conversation.markdown index 8429aa2517c..b92db2b9ea6 100644 --- a/source/_integrations/google_generative_ai_conversation.markdown +++ b/source/_integrations/google_generative_ai_conversation.markdown @@ -34,7 +34,7 @@ This integration requires an API key to use, [which you can generate here](https {% include integrations/config_flow.md %} -### Generate an API Key +## Generate an API Key The Google Generative AI API key is used to authenticate requests to the Google Generative AI API. To generate an API key take the following steps: @@ -126,8 +126,19 @@ response_variable: generated_content ``` {% endraw %} -### Video tutorial +## Video tutorial This video tutorial explains how Google Generative AI can be set up, how you can send an AI-generated message to your smart speaker when you arrive home, and how you can analyze an image taken from your doorbell camera as soon as someone rings the doorbell. + +## Troubleshooting + +- To aid in diagnosing issues it may help to turn up verbose logging by adding these to your {% term "`configuration.yaml`" %}: + +```yaml +logger: + logs: + homeassistant.components.conversation: debug + homeassistant.components.google_generative_ai_conversation: debug +``` From 01273770fc8e64374e498b656cfbb66d55de80c3 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Sun, 23 Feb 2025 16:30:17 +0100 Subject: [PATCH 116/118] Add more details to appliance/consumption type for Shelly (#37610) --- source/_integrations/shelly.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown index 68de4530b87..e17bda538e0 100644 --- a/source/_integrations/shelly.markdown +++ b/source/_integrations/shelly.markdown @@ -245,11 +245,11 @@ Not all devices support all input events. You can check on [Shelly API Reference ## Appliance type (generation 1) -Shelly device relays are added to Home Assistant by default as `switch` entities. A relay can be added as a `light` entity if **Settings** >> **APPLIANCE TYPE** value is set to `light`. +Shelly device relays are added to Home Assistant by default as `switch` entities. A relay can be added as a `light` entity if **Settings** >> **APPLIANCE TYPE** value in the WebUI of the device is set to `light`. ## Consumption type (generation 2+) -Shelly device relays are added to Home Assistant by default as `switch` entities. A relay can be added as a `light` entity if **EXTERNAL CONSUMPTION TYPE** value is set to `light`. +Shelly device relays are added to Home Assistant by default as `switch` entities. A relay can be added as a `light` entity if **EXTERNAL CONSUMPTION TYPE** value in the WebUI of the device is set to `light`. ## Light transition From 410f3c9b89275f10b825c13c4a8be7dc1e983984 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 07:28:46 +0100 Subject: [PATCH 117/118] build(deps-dev): bump sorbet-runtime from 0.5.11845 to 0.5.11851 (#37652) Bumps [sorbet-runtime](https://github.com/sorbet/sorbet) from 0.5.11845 to 0.5.11851. - [Release notes](https://github.com/sorbet/sorbet/releases) - [Commits](https://github.com/sorbet/sorbet/commits) --- updated-dependencies: - dependency-name: sorbet-runtime dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index dc95a17ca0c..39cff3dffb0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -158,7 +158,7 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11845) + sorbet-runtime (0.5.11851) stringex (2.8.6) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) From 03ccb08e960b3c30516e5d9e0956f235772356fd Mon Sep 17 00:00:00 2001 From: Philipp S Date: Mon, 24 Feb 2025 12:47:15 +0100 Subject: [PATCH 118/118] Proximity: Update documentation regarding distance calulation (#37574) * Proximity: Update documentation regarding distance calulation * Apply suggestions from code review Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com> --------- Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com> --- source/_integrations/proximity.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/proximity.markdown b/source/_integrations/proximity.markdown index 54a774f4b44..8547dd896ef 100644 --- a/source/_integrations/proximity.markdown +++ b/source/_integrations/proximity.markdown @@ -38,7 +38,7 @@ The following sensor entities will be created. ### Distance -For each tracked [device](/integrations/device_tracker/) or [person](/integrations/person/), a sensor is created showing the distance from the monitored zone in a unit depending on your [Home Assistant Unit System](/docs/configuration/basic) selection. When a tracked person or device enters the monitored zone, the distance is set to 0. +For each tracked [device](/integrations/device_tracker/) or [person](/integrations/person/), a sensor is created showing the distance from the edge of monitored zone in a unit depending on your [Home Assistant Unit System](/docs/configuration/basic) selection. When a tracked person or device enters the monitored zone, the distance is set to 0. ### Direction of travel

09Ca*iMV})<)NE6^yRH?)hquN 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 B01yBG literal 0 HcmV?d00001 diff --git a/source/images/blog/2025-02-voice-chapter-9/green-pe.png b/source/images/blog/2025-02-voice-chapter-9/green-pe.png new file mode 100644 index 0000000000000000000000000000000000000000..440c6ccc5faccda88fd1b25af7cf202b9adfc67e GIT binary patch literal 156697 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