From 8b900357060441e60f1a29078b1322754890f6d4 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 24 Jun 2026 22:12:36 +0200 Subject: [PATCH 001/123] Jewish Calendar: migrate count the Omer action to a dedicated page (#46186) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../jewish_calendar.count_omer.markdown | 138 ++++++++++++++++++ source/_integrations/jewish_calendar.markdown | 57 +------- 2 files changed, 139 insertions(+), 56 deletions(-) create mode 100644 source/_actions/jewish_calendar.count_omer.markdown diff --git a/source/_actions/jewish_calendar.count_omer.markdown b/source/_actions/jewish_calendar.count_omer.markdown new file mode 100644 index 000000000000..65847bb5eeee --- /dev/null +++ b/source/_actions/jewish_calendar.count_omer.markdown @@ -0,0 +1,138 @@ +--- +title: "Count the Omer" +action: jewish_calendar.count_omer +domain: jewish_calendar +description: "Returns the phrase for counting the Omer on a given date." +--- + +The **Count the Omer** action returns the phrase for counting the Omer on a given date. + +This is useful when you want an automation or script to announce or display the daily Omer count, for example as part of an evening routine during the Omer period. + +This action does not support targets. In the UI, you are not prompted to choose an area, device, entity, or label. Instead, you provide the date and tradition to count for. + +{% include actions/ui_header.md %} + +To count the Omer from an automation or a script: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation or script, or select **Create automation** > **Create new automation**. +3. If you're setting up a new automation, add a trigger in the **When** section. Scripts don't need a trigger. They run when something else calls them. +4. In the **Then do** section, select **Add action**. +5. From the search box, search for and select **Jewish Calendar: Count the Omer**. +6. Select the **Nusach**, and optionally set the **Date**, **After sunset**, and **Language**. +7. Select **Save**. + +### Options in the UI + +{% options_ui %} +Date: + description: The date to count the Omer for. Defaults to today. + required: false +After sunset: + description: Uses the next Hebrew day, which starts at sunset, for the given date. This option is ignored if the date is empty. Defaults to on. + required: false +Nusach: + description: The nusach (tradition) to count the Omer in. One of Sfarad, Ashkenaz, Adot Mizrah, or Italian. + required: true +Language: + description: The language to count the Omer in. Defaults to Hebrew. + required: false +{% endoptions_ui %} + +{% include actions/yaml_header.md %} + +In YAML, refer to this action as `jewish_calendar.count_omer`. Because this action returns data, use `response_variable` to capture the result. A basic example looks like this: + +{% example %} +action: | + action: jewish_calendar.count_omer + data: + nusach: sfarad + date: "2025-05-20" + language: en + response_variable: omer +{% endexample %} + +This counts the Omer for the given date and stores the result in the `omer` variable. + +### Options in YAML + +{% options_yaml %} +date: + description: > + The date to count the Omer for. Defaults to today. + required: false + type: date +after_sunset: + description: > + Uses the next Hebrew day, which starts at sunset, for the given date. + This option is ignored if the date is empty. + required: false + type: boolean + default: true +nusach: + description: > + The nusach (tradition) to count the Omer in. One of `sfarad`, + `ashkenaz`, `adot_mizrah`, or `italian`. + required: true + type: string + default: sfarad +language: + description: > + The language to count the Omer in. Defaults to Hebrew. + required: false + type: string + default: he +{% endoptions_yaml %} + +## Response data + +The action returns the following data: + +- `message`: The phrase for counting the Omer. Empty when there is no Omer count on the given day. +- `weeks`: The number of complete weeks counted. +- `days`: The number of days counted beyond the complete weeks. +- `total_days`: The total number of days counted. + +For the example above, the response looks similar to this: + +{% example %} +output: | + message: >- + Today is the thirty-seventh day, which are five weeks and two days of the + Omer + weeks: 5 + days: 2 + total_days: 37 +{% endexample %} + +{% include actions/more_examples.md %} + +### Count today's Omer in Hebrew + +For a minimal call, provide only the required nusach. With no date, the action counts the current Hebrew day, taking the current time relative to sunset into account, and returns the text in Hebrew by default. + +{% example %} +action: | + action: jewish_calendar.count_omer + data: + nusach: sfarad + response_variable: omer +{% endexample %} + +This returns a response similar to: + +{% example %} +output: | + message: היום ארבעה עשר יום שהם שני שבועות לעומר + weeks: 2 + days: 0 + total_days: 14 +{% endexample %} + +{% include actions/try_it.md %} + +{% include actions/stuck.md %} + +{% include actions/related.md %} diff --git a/source/_integrations/jewish_calendar.markdown b/source/_integrations/jewish_calendar.markdown index 588f7ae34bcb..d61755946b51 100644 --- a/source/_integrations/jewish_calendar.markdown +++ b/source/_integrations/jewish_calendar.markdown @@ -191,59 +191,4 @@ The following is the list of holidays the sensor knows about with their selected | tu_bav | Tu B'Av | ט"ו באב | MINOR_HOLIDAY | | rosh_chodesh | Rosh Chodesh | ראש חודש | ROSH_CHODESH | -## Actions - -Available {% term actions %}: - -- `jewish_calendar.count_omer` - -### Action Count the Omer - -The `jewish_calendar.count_omer` action returns the phrase for counting the Omer for a given date. - -| Data attribute | Optional | Description | -| -------------- | -------- | ---------------------------------------- | -| `date` | yes | Date for which to get the Omer blessing. Defaults to today. | -| `after_sunset` | yes | If true and a date is provided, calculates the Omer count based on the Hebrew date, which starts after sunset. Ignored if no date is specified. Defaults to true. | -| `nusach` | no | Nusach (tradition) of the Omer blessing. | -| `language` | yes | Language to return. Defaults to Hebrew. | - -If there's no Omer count on the given day, the message will be empty. -Supported nusachim are: Ashkenaz, Sfarad, Adot Mizrah and Italian. - -#### Example - -```yaml -action: jewish_calendar.count_omer -data: - nusach: sfarad - date: "2025-05-20" # optional; defaults to today - language: en # optional; defaults to Hebrew - after_sunset: true # optional; defaults to true -``` - -Will return the following: - -```yaml -message: Today is the thirty-seventh day, which are five weeks and two days of the Omer -weeks: 5 -days: 2 -total_days: 37 -``` - -#### Minimal call - -```yaml -action: jewish_calendar.count_omer -data: - nusach: sfarad -``` - -Will return the current text in Hebrew based on the Hebrew date, considering the current time relative to sunset. - -```yaml -message: היום ארבעה עשר יום שהם שני שבועות לעומר -weeks: 2 -days: 0 -total_days: 14 -``` +{% include integrations/actions.md %} From a8fbdfc320679016b16612dc2ad38a0765dc3703 Mon Sep 17 00:00:00 2001 From: Brandon Rothweiler <2292715+bdr99@users.noreply.github.com> Date: Thu, 25 Jun 2026 02:40:59 -0400 Subject: [PATCH 002/123] Bump dropbox to silver quality (#46470) --- source/_integrations/dropbox.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/dropbox.markdown b/source/_integrations/dropbox.markdown index c5299de524bd..621bdddd6623 100644 --- a/source/_integrations/dropbox.markdown +++ b/source/_integrations/dropbox.markdown @@ -10,7 +10,7 @@ ha_codeowners: - '@bdr99' ha_domain: dropbox ha_integration_type: service -ha_quality_scale: bronze +ha_quality_scale: silver --- This {% term integration %} allows you to connect your [Dropbox](https://dropbox.com) account with Home Assistant Backups. From 02833291d8c92c967b895f5252c7138dbdc4ec2c Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 25 Jun 2026 10:39:14 +0200 Subject: [PATCH 003/123] Volvo: migrate actions to dedicated action pages (#46172) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_actions/volvo.get_image_url.markdown | 91 ++++++++++++++++++++ source/_integrations/volvo.markdown | 14 +-- 2 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 source/_actions/volvo.get_image_url.markdown diff --git a/source/_actions/volvo.get_image_url.markdown b/source/_actions/volvo.get_image_url.markdown new file mode 100644 index 000000000000..c7964fd6aa42 --- /dev/null +++ b/source/_actions/volvo.get_image_url.markdown @@ -0,0 +1,91 @@ +--- +title: "Get image URL" +action: volvo.get_image_url +domain: volvo +description: "Retrieves the URL for one or more vehicle-specific images." +--- + +The **Get image URL** action retrieves the URLs of images of your vehicle from a specific angle. You can request all available images at once, or pick one or more specific angles. + +This action returns [response data](#response-data) and does not change anything on your vehicle. + +{% include actions/ui_header.md %} + +To get image URLs from an automation or a script: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation or script, or select **Create** to start a new one. +3. If you're setting up a new automation, add a trigger in the **When** section. Scripts don't need a trigger. +4. In the **Then do** section, select **Add action**. +5. From the search box, search for and select **Volvo: Get image URL**. +6. Select the **Entry** for the vehicle you want the images for. +7. Optionally, select one or more image angles in **Images**. Leave this empty to get all images. +8. Select **Save**. + +### Options in the UI + +{% options_ui %} +Entry: + description: The vehicle to retrieve the images for. + required: true +Images: + description: The image angles to retrieve. Leave empty to get all images. + required: false +{% endoptions_ui %} + +{% include actions/yaml_header.md %} + +In YAML, refer to this action as `volvo.get_image_url`: + +{% example %} +action: | + action: volvo.get_image_url + data: + entry: 01JVJ0RA387MWA938VE8HGXBMJ + images: + - exterior_front + - interior + response_variable: vehicle_images +{% endexample %} + +This retrieves the front exterior and interior image URLs and stores the response in the `vehicle_images` variable. + +### Options in YAML + +{% options_yaml %} +entry: + description: The vehicle to retrieve the images for. + required: true + type: string +images: + description: > + The image angles to retrieve. Leave empty to get all images. One or more of + `exterior_back`, `exterior_back_left`, `exterior_back_right`, + `exterior_front`, `exterior_front_left`, `exterior_front_right`, + `exterior_side_left`, `exterior_side_right`, or `interior`. + required: false + type: list +{% endoptions_yaml %} + +## Response data + +The action returns a response containing an `images` list. Each item describes one image that is available for your vehicle: + +- `type`: The angle of the image, for example `exterior_front`. +- `url`: The URL where the image can be retrieved. + +Only images that actually exist for your vehicle are returned, so the list may be shorter than the angles you requested. + +```yaml +images: + - type: "exterior_front" + url: "https://www.example.com/vehicle/exterior_front.png" + - type: "interior" + url: "https://www.example.com/vehicle/interior.png" +``` + +{% include actions/try_it.md %} + +{% include actions/stuck.md %} + +{% include actions/related.md %} diff --git a/source/_integrations/volvo.markdown b/source/_integrations/volvo.markdown index 7b068806d7ac..7f3796aa450e 100644 --- a/source/_integrations/volvo.markdown +++ b/source/_integrations/volvo.markdown @@ -228,19 +228,7 @@ Go to Volvo's developer portal to view [the list of supported models](https://de - **Trip automatic average fuel consumption**: Average fuel consumption on the automatic trip meter. - **Trip manual average fuel consumption**: Average fuel consumption on the manual trip meter. -## Actions - -### Get image URL - -The action `get_image_url` retrieves the URL of your vehicle-specific images. -Get all URLs at once, or select one or more angles. - -{% configuration_basic %} -Entry: - description: "The entry ID to retrieve the vehicle images for." -Images: - description: "The image angles to retrieve. Leave empty to get all images." -{% endconfiguration_basic %} +{% include integrations/actions.md %} ## Examples From a2b585ebd0003720cf5aaf73ab4af042c9cac50b Mon Sep 17 00:00:00 2001 From: Manu Date: Fri, 26 Jun 2026 10:43:13 +0200 Subject: [PATCH 004/123] Remove Mycroft (#46484) --- source/_integrations/mycroft.markdown | 67 --------------------------- source/_redirects | 1 + 2 files changed, 1 insertion(+), 67 deletions(-) delete mode 100644 source/_integrations/mycroft.markdown diff --git a/source/_integrations/mycroft.markdown b/source/_integrations/mycroft.markdown deleted file mode 100644 index f1e1f61f9079..000000000000 --- a/source/_integrations/mycroft.markdown +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Mycroft -description: Instructions on how to set up Mycroft AI within Home Assistant. -ha_category: - - Notifications - - Voice -ha_iot_class: Local Push -ha_release: 0.53 -ha_domain: mycroft -ha_platforms: - - notify -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -[Mycroft](https://mycroft.ai) is an open source voice assistant that allows you to send notifications and more to Mycroft from Home Assistant. - -There is currently support for the following device types within Home Assistant: - -- **Notifications** - Allows you to deliver notifications from Home Assistant to [Mycroft AI](https://mycroft.ai/). - -## Configuration - -To use Mycroft in your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -mycroft: - host: 0.0.0.0 -``` - -{% configuration %} -host: - description: The IP address of your Mycroft instance. - required: true - type: string -{% endconfiguration %} - -## Using notifications - -To use Mycroft for sending notifications, add the following to your {% term "`configuration.yaml`" %} file: - -```yaml -# Example configuration.yaml entry -notify: - - platform: mycroft - name: mycroft -``` - -{% configuration %} -name: - description: Frendly name of your Mycroft instance. - required: true - type: string -{% endconfiguration %} - -## Examples - -Send a message to Mycroft by calling `notify.mycroft` action: - -```yaml -message: "Hey Mycroft. Turn on the office light. " -``` diff --git a/source/_redirects b/source/_redirects index b4aaee3143b2..ba298dfe0adf 100644 --- a/source/_redirects +++ b/source/_redirects @@ -625,6 +625,7 @@ layout: null /integrations/mcp23017 /more-info/removed-integration 301 /integrations/mercury_nz /more-info/removed-integration 301 /integrations/mhz19 /more-info/removed-integration 301 +/integrations/mycroft /more-info/removed-integration 301 /integrations/myq /blog/2023/11/06/removal-of-myq-integration/ 301 /integrations/miflora /integrations/xiaomi_ble /integrations/mini_connected /more-info/removed-integration 301 From c5bb21be8de29f1fc69cd35caa5c80678e8ce7a8 Mon Sep 17 00:00:00 2001 From: Manu Date: Fri, 26 Jun 2026 11:40:25 +0200 Subject: [PATCH 005/123] Remove ThermoWorks Smoke (#46483) --- .../_integrations/thermoworks_smoke.markdown | 126 ------------------ source/_redirects | 1 + 2 files changed, 1 insertion(+), 126 deletions(-) delete mode 100644 source/_integrations/thermoworks_smoke.markdown diff --git a/source/_integrations/thermoworks_smoke.markdown b/source/_integrations/thermoworks_smoke.markdown deleted file mode 100644 index 8b0ba6b5d02b..000000000000 --- a/source/_integrations/thermoworks_smoke.markdown +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: ThermoWorks Smoke -description: Pulls temperature data for a ThermoWorks Smoke Thermometer connected with Smoke Gateway. -ha_category: - - Sensor -ha_release: 0.81 -ha_iot_class: Cloud Polling -ha_domain: thermoworks_smoke -ha_platforms: - - sensor -ha_integration_type: integration -ha_quality_scale: legacy ---- - -The **ThermoWorks Smoke** {% term integration %} pulls data for your [ThermoWorks Smoke Thermometer](https://www.thermoworks.com/Smoke). -This requires a [Smoke WiFi Gateway](https://www.thermoworks.com/Smoke-Gateway) with an internet connection. - -You will need to have previously registered your smoke to your account via the mobile app and provide -the email and password you used to in the configuration for this sensor to connect and pull your data. - -## Configuration - -To add the sensors to your installation, add the following to your {% term "`configuration.yaml`" %} file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: thermoworks_smoke - email: "your email here" - password: !secret thermoworks_pass -``` - -{% configuration %} -email: - description: The email address with the device registered in the thermoworks smoke mobile app. - required: true - type: string -password: - description: The password registered in the thermoworks smoke mobile app. - required: true - type: string -monitored_conditions: - description: The sensors to add. Default is `probe1` and `probe2`. The full list is `probe1`, `probe2`, `probe1_min`, `probe1_max`, `probe2_min`, `probe2_max`. - required: false - type: list -exclude: - description: Device serial numbers to ignore. - required: false - type: list -{% endconfiguration %} - -## Examples - -This section includes some examples of how to use this sensor. - -### Only Probe 1 - -This will show only Probe 1 with min and max data. - -```yaml -# Example configuration.yaml entry -sensor: - - platform: thermoworks_smoke - email: "your email here" - password: !secret thermoworks_pass - monitored_conditions: - - probe1 - - probe1_min - - probe1_max -``` - -### Ignore a Device - -This will exclude a device from creating sensors. You would replace `"00:00:00:00:00:00"` with your device's serial number. - -```yaml -# Example configuration.yaml entry -sensor: - - platform: thermoworks_smoke - email: "your email here" - password: !secret thermoworks_pass - exclude: - - "00:00:00:00:00:00" -``` - -### Notify when Probe 1 goes above a certain temperature - -This will use an automation to trigger a notification when Probe 1 goes above a temperature stored in an input_number variable. -By default, your smoke is named "My Smoke" in the app. If you have changed it you will need to change the sensor name from `my_smoke_probe_1` to `your_name_probe_1`. - -```yaml -# Example configuration.yaml entry -sensor: - - platform: thermoworks_smoke - email: "your email here" - password: !secret thermoworks_pass - -input_number: - smoke_probe_1_threshold: - name: Smoke Probe 1 Threshold - min: -40 - max: 500 - step: 0.5 - unit_of_measurement: "°F" - icon: mdi:thermometer - -automation: - - alias: "Alert when My Smoke Probe 1 is above threshold" - triggers: - - trigger: template - value_template: >- - {% if (states("sensor.my_smoke_probe_1") | float) > (states("input_number.smoke_probe_1_threshold") | float) %} - True - {% else %} - False - {% endif %} - actions: - - action: notify.all - data: - message: > - {{- state_attr('sensor.my_smoke_probe_1','friendly_name') }} is above - {{- ' '+states("input_number.smoke_probe_1_threshold") -}} - {{- state_attr('sensor.my_smoke_probe_1','unit_of_measurement') }} at - {{- ' '+states("sensor.my_smoke_probe_1") -}} - {{- state_attr('sensor.my_smoke_probe_1','unit_of_measurement') }} -``` diff --git a/source/_redirects b/source/_redirects index ba298dfe0adf..c07c1d0823e5 100644 --- a/source/_redirects +++ b/source/_redirects @@ -686,6 +686,7 @@ layout: null /integrations/teksavvy /more-info/removed-integration 301 /integrations/tesla /more-info/removed-integration 301 /integrations/tfiac /more-info/removed-integration 301 +/integrations/thermoworks_smoke /more-info/removed-integration 301 /integrations/tikteck /more-info/removed-integration 301 /integrations/tof /more-info/removed-integration 301 /integrations/tplink_lte /more-info/removed-integration 301 From be2be74f3572d0341c901a9d2558ece23c5a2fe3 Mon Sep 17 00:00:00 2001 From: TheOtherAdam Date: Fri, 26 Jun 2026 23:49:00 +0800 Subject: [PATCH 006/123] Document disabling the container log file (#46489) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/logger.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/logger.markdown b/source/_integrations/logger.markdown index afe63424a174..f6d88193fc8e 100644 --- a/source/_integrations/logger.markdown +++ b/source/_integrations/logger.markdown @@ -166,3 +166,5 @@ Or read the file directly: ```bash tail -f /config/home-assistant.log ``` + +To rely only on the container runtime logs and prevent Home Assistant from writing `home-assistant.log`, set the `HA_DISABLE_LOG_FILE` environment variable to `1` (or `true`). When the log file is disabled, `/config/home-assistant.log` is not available, and you cannot enable **Show raw logs** or download the log file in the Home Assistant UI. From dd81d04fb3ec6cef28402c4828062643c1318fdb Mon Sep 17 00:00:00 2001 From: Manu Date: Fri, 26 Jun 2026 22:29:21 +0200 Subject: [PATCH 007/123] Remove Greenwave Reality (#46496) --- source/_integrations/greenwave.markdown | 40 ------------------------- source/_redirects | 1 + 2 files changed, 1 insertion(+), 40 deletions(-) delete mode 100644 source/_integrations/greenwave.markdown diff --git a/source/_integrations/greenwave.markdown b/source/_integrations/greenwave.markdown deleted file mode 100644 index 728690f70e6f..000000000000 --- a/source/_integrations/greenwave.markdown +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Greenwave Reality -description: Instructions on how to set up Greenwave Reality lights within Home Assistant. -ha_category: - - Light -ha_release: 0.61 -ha_iot_class: Local Polling -ha_domain: greenwave -ha_platforms: - - light -ha_integration_type: integration -ha_quality_scale: legacy ---- - -This {% term integration %} communicates with the Greenwave Reality (TCP Connected) Gateway to allow control of all lights and fixtures registered to the gateway. Bulbs and Fixtures can be created and modified inside the TCP Lighting App for Android and iOS. - -This integration has been tested on firmware revisions: - -- 2.0.105 - -To configure the connection to the gateway, add the following to your {% term "`configuration.yaml`" %} file: - -```yaml -light: - - platform: greenwave - host: XXX.XXX.XXX.XXX - version: 3 -``` -The version option is the major revision of your firmware, which should be 2 or 3. If you are running Version 2, there are no extra steps. If you are running Version 3, you must press the Sync button on the gateway before the first launch of Home Assistant, so a token can be grabbed. Once Home Assistant has started, you can either press the Sync button again or wait for it to time out manually. - -{% configuration %} -host: - description: The IP Address of your Gateway - required: true - type: string -version: - description: Major version of the gateway firmware - required: true - type: integer -{% endconfiguration %} diff --git a/source/_redirects b/source/_redirects index c07c1d0823e5..6ecf00233096 100644 --- a/source/_redirects +++ b/source/_redirects @@ -594,6 +594,7 @@ layout: null /integrations/goalfeed /more-info/removed-integration 301 /integrations/google_domains /more-info/removed-integration 301 /integrations/gpmdp /more-info/removed-integration 301 +/integrations/greenwave /more-info/removed-integration 301 /integrations/griddy /more-info/removed-integration 301 /integrations/gstreamer /more-info/removed-integration 301 /integrations/hangouts /more-info/removed-integration 301 From 9f99b6ec62c9393ee9f7b4e0db87cf8f1c114b29 Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Sat, 27 Jun 2026 09:40:59 +0200 Subject: [PATCH 008/123] Add Low-Power mode option for Synology DSM fan speed (#46494) --- source/_integrations/synology_dsm.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/synology_dsm.markdown b/source/_integrations/synology_dsm.markdown index 172c5a4cf16c..f673126e854c 100644 --- a/source/_integrations/synology_dsm.markdown +++ b/source/_integrations/synology_dsm.markdown @@ -166,7 +166,7 @@ Shutdown the NAS. - **Fan speed mode** - **Description**: The mode of the system fan speed, if your NAS supports it. - - **Options**: Quiet mode, Cool mode, Full-speed mode. + - **Options**: Low-Power mode (_only supported on some devices_), Quiet mode, Cool mode, Full-speed mode. ## Media source From d6c4dadc47d4713e6b08a82803ec2c6fc57a8f6f Mon Sep 17 00:00:00 2001 From: Manu Date: Sat, 27 Jun 2026 09:41:15 +0200 Subject: [PATCH 009/123] Remove Logentries (#46499) --- source/_integrations/logentries.markdown | 34 ------------------------ source/_redirects | 1 + 2 files changed, 1 insertion(+), 34 deletions(-) delete mode 100644 source/_integrations/logentries.markdown diff --git a/source/_integrations/logentries.markdown b/source/_integrations/logentries.markdown deleted file mode 100644 index ffd92d6240d2..000000000000 --- a/source/_integrations/logentries.markdown +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Logentries -description: Send events to Logentries. -ha_category: - - History -ha_iot_class: Cloud Push -ha_release: 0.13 -ha_domain: logentries -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -The **Logentries** {% term integration %} makes it possible to log all state changes to [Logentries](https://logentries.com) using Logentries Webhook endpoint. - -Open the **Add a Log** page and choose **Manual**. Enter a name for your log in **Log Name**, add a group in **Select Log Set**, set **Token TCP - logs are identified by a token.** and press **Create Log Token**. The generated token is required for the Home Assistant configuration. - -To use the **Logentries** {% term integration %} in your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -logentries: - token: TOKEN -``` - -{% configuration %} -token: - description: The token for the log to use. - required: true - type: string -{% endconfiguration %} diff --git a/source/_redirects b/source/_redirects index 6ecf00233096..9465b63dd593 100644 --- a/source/_redirects +++ b/source/_redirects @@ -616,6 +616,7 @@ layout: null /integrations/linky /more-info/removed-integration 301 /integrations/liveboxplaytv /more-info/removed-integration 301 /integrations/lockitron /more-info/removed-integration 301 +/integrations/logentries /more-info/removed-integration 301 /integrations/logi_circle /more-info/removed-integration 301 /integrations/loop_energy /more-info/removed-integration 301 /integrations/loopenergy /more-info/removed-integration 301 From 24f1528426c12275385910f32085d1b0c2f3984e Mon Sep 17 00:00:00 2001 From: Manu Date: Sat, 27 Jun 2026 09:41:23 +0200 Subject: [PATCH 010/123] Remove ATEN Rack PDU (#46500) --- CODEOWNERS | 1 - source/_integrations/aten_pe.markdown | 65 --------------------------- source/_redirects | 1 + 3 files changed, 1 insertion(+), 66 deletions(-) delete mode 100644 source/_integrations/aten_pe.markdown diff --git a/CODEOWNERS b/CODEOWNERS index 8e4beaae2a67..78027ea38a0e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -87,7 +87,6 @@ source/_integrations/assist_pipeline.markdown @synesthesiam @arturpragacz source/_integrations/assist_satellite.markdown @home-assistant/core @synesthesiam @arturpragacz source/_integrations/asuswrt.markdown @kennedyshead @ollo69 @Vaskivskyi source/_integrations/atag.markdown @MatsNL -source/_integrations/aten_pe.markdown @mtdcr source/_integrations/atlanticcityelectric.markdown @tronikos source/_integrations/atome.markdown @baqs source/_integrations/august.markdown @bdraco diff --git a/source/_integrations/aten_pe.markdown b/source/_integrations/aten_pe.markdown deleted file mode 100644 index a3bb5d820507..000000000000 --- a/source/_integrations/aten_pe.markdown +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: ATEN Rack PDU -description: Instructions on how to integrate ATEN Rack PDUs into Home Assistant. -ha_category: - - Switch -ha_iot_class: Local Polling -ha_release: 0.103 -ha_codeowners: - - '@mtdcr' -ha_domain: aten_pe -ha_platforms: - - switch -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -The **ATEN Rack PDU** {% term integration %} lets you control [ATEN Rack PDUs](https://www.aten.com/eu/en/products/energy-intelligence-pduupsracks/rack-pdu/) from Home Assistant. - -To use it, SNMP must be enabled on your PDU. It is recommended to use SNMPv3 to protect your credentials from eavesdropping. - -Tested devices: - -- [PE8324G](https://www.aten.com/eu/en/products/energy-intelligence-pduupsracks/rack-pdu/pe8324/) - -To set it up, add the following information to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} file: - -```yaml -switch: - - platform: aten_pe - host: 192.168.0.60 -``` - -{% configuration %} -host: - description: The IP/host which to control. - required: true - type: string -port: - description: The port on which to communicate. - required: false - type: string - default: 161 -community: - description: community string to use for authentication (SNMP v1 and v2c). - required: false - type: string - default: private -username: - description: Username to use for authentication. - required: false - type: string - default: administrator -auth_key: - description: Authentication key to use for SNMP v3. - required: false - type: string -priv_key: - description: Privacy key to use for SNMP v3. - required: false - type: string -{% endconfiguration %} diff --git a/source/_redirects b/source/_redirects index 9465b63dd593..832631e71046 100644 --- a/source/_redirects +++ b/source/_redirects @@ -538,6 +538,7 @@ layout: null /integrations/arduino /more-info/removed-integration 301 /integrations/asterisk_cdr /more-info/removed-integration 301 /integrations/asterisk_mbox /more-info/removed-integration 301 +/integrations/aten_pe /more-info/removed-integration 301 /_docs/asterisk_mbox.markdown /more-info/removed-integration 301 /integrations/avion /more-info/removed-integration 301 /integrations/bbb_gpio /more-info/removed-integration 301 From 5a1425a97f69ac22b27f875d7aa06c7de6e8ca5c Mon Sep 17 00:00:00 2001 From: Hai-Nam Nguyen Date: Sat, 27 Jun 2026 09:41:30 +0200 Subject: [PATCH 011/123] Update hypontech.markdown (#45928) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/hypontech.markdown | 30 ++++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/source/_integrations/hypontech.markdown b/source/_integrations/hypontech.markdown index 66f40bc3f705..4cc637b35313 100644 --- a/source/_integrations/hypontech.markdown +++ b/source/_integrations/hypontech.markdown @@ -20,7 +20,7 @@ The **Hypontech Cloud** {% term integration %} allows you to monitor your Hypont ## Supported devices -This integration supports all Hypontech inverters and micro inverters that are connected to the Hypontech Cloud platform. +This integration supports all inverters and microinverters connected to the Hypontech Cloud platform, including devices from Hypontech as well as third-party manufacturers like Nexen. ## Prerequisites @@ -38,19 +38,37 @@ Username: description: "Your Hypontech Cloud account username." Password: description: "Your Hypontech Cloud account password." +Manufacturer (dropdown): + description: "The manufacturer (OEM), Hypontech by default." {% endconfiguration_basic %} ## Supported functionality ### Sensors -The integration provides one **Plant** device for each location (for example: Balcony, Garden, Home, Office) and one **Overview** (aggregation) device. Each has the following sensors: +The integration provides one **Plant** device for each location (for example, Balcony, Garden, Home, Office) and one **Overview** (aggregation) device. It is recommended to disable the Overview device, as plants can be shared between accounts or temporarily added to your profile, which may lead to inaccurate data aggregation. -- **Power** (W): Current power production from your solar system +Plant and Overview have the following sensors: + +- **Total power** (W): Current power from your solar systems and batteries - **Today energy** (kWh): Total energy produced today - **Lifetime energy** (kWh): Total energy produced since installation -All sensors are updated every minute. +Plant also has other sensors: + +- **PV power** (W): Current power production from solar system +- **Load power** (W): Current power used by your home, if there is a current clamp in your installation +- **Grid power** (W): Current power load from grid (can be negative), if there is a current clamp in your installation + +If a plant has batteries, it also has other sensors: + +- **Battery power** (W): Current discharging power, if negative, the batteries are charging +- **Battery state of charge** (percentage): Current state of charge of the batteries + +All sensors are updated every minute. If there is no current clamp and no battery in your application, then Total power = PV power = Load power, and Grid power = 0. If there are batteries, then: + +- Total power = PV power + Battery power +- Load power = Total power + Grid power ## Data updates @@ -60,10 +78,6 @@ The integration polls data from the Hypontech Cloud every 60 seconds. This integration provides no additional actions. -## Known limitations - -- There is no support for batteries yet. - ## Removing the integration This integration can be removed by following these steps: From 3d90dc041aa548bad60398264d004b416d218c47 Mon Sep 17 00:00:00 2001 From: "A. Gideonse" Date: Sat, 27 Jun 2026 09:45:07 +0200 Subject: [PATCH 012/123] Add remaining charging/discharging time to Indevolt (#46440) --- source/_integrations/indevolt.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/indevolt.markdown b/source/_integrations/indevolt.markdown index f745b8a7f700..9c90555d12d2 100644 --- a/source/_integrations/indevolt.markdown +++ b/source/_integrations/indevolt.markdown @@ -121,6 +121,7 @@ The following button entity allows triggering device actions directly from Home - Grid frequency (Hz) - Equivalent full cycles - Transformer temperature (°C) +- Remaining charging / discharging time (min) - Main battery serial number - Main battery cycle count - Main battery SOC (%) From 7094cd4da0611fa18b271d92b5986aa1a1a0448d Mon Sep 17 00:00:00 2001 From: Manu Date: Sat, 27 Jun 2026 12:44:41 +0200 Subject: [PATCH 013/123] Remove Dovado integration (#46498) --- source/_integrations/dovado.markdown | 120 --------------------------- source/_redirects | 1 + 2 files changed, 1 insertion(+), 120 deletions(-) delete mode 100644 source/_integrations/dovado.markdown diff --git a/source/_integrations/dovado.markdown b/source/_integrations/dovado.markdown deleted file mode 100644 index a2b5c7c0e89f..000000000000 --- a/source/_integrations/dovado.markdown +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: Dovado -description: How to integrate Dovado within Home Assistant. -ha_category: - - Notifications - - Sensor - - System monitor -ha_release: 0.87 -ha_iot_class: Local Polling -ha_domain: dovado -ha_platforms: - - notify - - sensor -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -The **Dovado** {% term integration %} manages communication with the [Dovado](https://www.dovado.com/) router. - -There is currently support for the following device types within Home Assistant: - -- [Notifications](/integrations/dovado/#notifications) -- [Sensor](/integrations/dovado/#sensor) - -To add a Dovado {% term integration %} to your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -dovado: - username: YOUR_USERNAME - password: YOUR_PASSWORD -``` - -{% configuration %} -username: - description: Your Dovado username. - required: true - type: string -password: - description: Your Dovado password. - required: true - type: string -host: - description: The IP address of your router. - required: false - type: string - default: Home Assistant's default gateway -port: - description: The port number of your router. - required: false - type: integer - default: 6435 -{% endconfiguration %} - -## Notifications - -The `dovado` notify platform allows you to send SMS from your [Dovado](https://www.dovado.com/) router, if it supports it. - -To add the Dovado {% term integration %} to your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -notify: - - platform: dovado -``` - -### Usage - -This is a notify platform and thus can be controlled by calling the notify action [as described here](/integrations/notify/). It will send an SMS notification to a single phone number in the notification **target**. - -```yaml -# Example automation notification entry -automation: - - alias: "The sun has set" - triggers: - - trigger: sun - event: sunset - actions: - - action: notify.dovado - data: - message: "The sun has set" - target: "+14151234567" -``` - -## Sensor - -The `dovado` sensor platform let you monitor your [Dovado](https://www.dovado.com/) router. - -To add a Dovado sensor to your installation, add the following to your {% term "`configuration.yaml`" %} file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: dovado - sensors: - - network -``` - -{% configuration %} -sensors: - description: Conditions to display in the frontend. Only accepts the values listed here. - required: true - type: list - keys: - network: - description: Creates a sensor for Network State, such as 3G or 4G. - signal: - description: Creates a sensor for the signal strength. - download: - description: Creates a sensor for download speed. - upload: - description: Creates a sensor for download speed. - sms: - description: Creates a sensor for number of unread text messages. -{% endconfiguration %} diff --git a/source/_redirects b/source/_redirects index 832631e71046..6df8b6c7f4c4 100644 --- a/source/_redirects +++ b/source/_redirects @@ -569,6 +569,7 @@ layout: null /integrations/dlib_face_detect /more-info/removed-integration 301 /integrations/dlib_face_identify /more-info/removed-integration 301 /integrations/dominos /more-info/removed-integration 301 +/integrations/dovado /more-info/removed-integration 301 /integrations/dte_energy_bridge /more-info/removed-integration 301 /integrations/duke_energy /more-info/removed-integration 301 /integrations/dweet /more-info/removed-integration 301 From 6bb248ebb3b9c3f1161f0b43cfc89788a1d292c9 Mon Sep 17 00:00:00 2001 From: Manu Date: Sat, 27 Jun 2026 14:29:52 +0200 Subject: [PATCH 014/123] Remove BlinkStick (#46507) --- source/_integrations/blinksticklight.markdown | 51 ------------------- source/_redirects | 1 + 2 files changed, 1 insertion(+), 51 deletions(-) delete mode 100644 source/_integrations/blinksticklight.markdown diff --git a/source/_integrations/blinksticklight.markdown b/source/_integrations/blinksticklight.markdown deleted file mode 100644 index a5d4619e5273..000000000000 --- a/source/_integrations/blinksticklight.markdown +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: BlinkStick -description: Instructions on how to set up Blinkstick lights within Home Assistant. -ha_category: - - DIY -ha_release: 0.7.5 -ha_iot_class: Local Polling -ha_domain: blinksticklight -ha_platforms: - - light -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -The **BlinkStick** {% term integration %} lets you control your [Blinkstick](https://www.blinkstick.com/) lights from within Home Assistant. - -## Setup - -To use your Blinkstick, you need to allow the access to the device for [non-root users](https://github.com/arvydas/blinkstick-python#permission-problems-in-linux-and-mac-os-x). - -```bash -sudo blinkstick --add-udev-rule -``` - -## Configuration - -To add a Blinkstick to your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -light: - - platform: blinksticklight - serial: BS000795-1.1 -``` - -{% configuration %} -serial: - description: The serial number of your stick. - required: true - default: 640 - type: string -name: - description: Name of the stick. - required: false - type: string - default: Blinkstick -{% endconfiguration %} diff --git a/source/_redirects b/source/_redirects index 6df8b6c7f4c4..72ec44963967 100644 --- a/source/_redirects +++ b/source/_redirects @@ -545,6 +545,7 @@ layout: null /integrations/beewi_smartclim /more-info/removed-integration 301 /integrations/bh1750 /more-info/removed-integration 301 /integrations/binary_sensor.mychevy /more-info/removed-integration 301 +/integrations/blinksticklight /more-info/removed-integration 301 /integrations/blinkt /more-info/removed-integration 301 /integrations/bloomsky /more-info/removed-integration 301 /integrations/bluetooth_tracker /more-info/removed-integration 301 From fcde4606ab3f53337596b7916d8b4dc55473149e Mon Sep 17 00:00:00 2001 From: Manu Date: Sat, 27 Jun 2026 15:19:20 +0200 Subject: [PATCH 015/123] Remove Watson TTS (#46509) --- source/_integrations/watson_tts.markdown | 124 ----------------------- source/_redirects | 1 + 2 files changed, 1 insertion(+), 124 deletions(-) delete mode 100644 source/_integrations/watson_tts.markdown diff --git a/source/_integrations/watson_tts.markdown b/source/_integrations/watson_tts.markdown deleted file mode 100644 index b0c84415fbf2..000000000000 --- a/source/_integrations/watson_tts.markdown +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: IBM Watson TTS -description: Instructions on how to set up IBM Watson TTS with Home Assistant. -ha_category: - - Text-to-speech -ha_release: 0.94 -ha_iot_class: Cloud Push -ha_codeowners: - - '@rutkai' -ha_domain: watson_tts -ha_platforms: - - tts -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -The **IBM Watson TTS** text-to-speech {% term integration %} that works with [IBM Watson Cloud](https://www.ibm.com/watson/services/text-to-speech/) to create the spoken output. -Watson is a paid service via IBM Cloud but there is a decent [free tier](https://www.ibm.com/cloud/watson-text-to-speech/pricing) which offers 10000 free characters every month. - -## Setup - -For supported formats and voices please go to [IBM Cloud About section](https://cloud.ibm.com/docs/text-to-speech?topic=text-to-speech-voices#languageVoices). - -To get started please read the [Getting started tutorial](https://cloud.ibm.com/docs/services/text-to-speech?topic=text-to-speech-gettingStarted#gettingStarted). - -## Configuration - -To configure Watson TTS, add the following lines to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -tts: - - platform: watson_tts - watson_apikey: YOUR_GENERATED_APIKEY -``` - -You can get these tokens after you generated the credentials on the IBM Cloud console: - -

- -

- -{% configuration %} -watson_url: - description: "The endpoint to which the service will connect." - required: false - type: string - default: "`https://api.us-south.text-to-speech.watson.cloud.ibm.com`" -watson_apikey: - description: "Your secret apikey generated on the IBM Cloud admin console." - required: true - type: string -voice: - description: Voice name to be used. - required: false - type: string - default: en-US_AllisonV3Voice -output_format: - description: "Override the default output format. Supported formats: `audio/flac`, `audio/mp3`, `audio/mpeg`, `audio/ogg`, `audio/ogg;codecs=opus`, `audio/ogg;codecs=vorbis`, `audio/wav`" - required: false - type: string - default: audio/mp3 -{% endconfiguration %} - -## Usage - -Say to all `media_player` device entities: - -```yaml -- action: tts.watson_tts_say - data: - message: "Hello from Watson" -``` - -or - -```yaml -- action: tts.watson_tts_say - data: - message: > - - Hello from Watson - -``` - -Say to the `media_player.living_room` device entity: - -```yaml -- action: tts.watson_tts_say - target: - entity_id: media_player.living_room - data: - message: > - - Hello from Watson - -``` - -Say with break: - -```yaml -- action: tts.watson_tts_say - data: - message: > - - Hello from - - Watson - -``` - -Optionally, specify a voice for the message: - -```yaml -- action: tts.watson_tts_say - data: - message: "Hello from Watson" - options: - voice: en-US_EmilyV3Voice -``` diff --git a/source/_redirects b/source/_redirects index 72ec44963967..6b4612a2e0fe 100644 --- a/source/_redirects +++ b/source/_redirects @@ -711,6 +711,7 @@ layout: null /integrations/weather.darksky /more-info/removed-integration 301 /integrations/weblink /more-info/removed-integration 301 /integrations/wink /more-info/removed-integration 301 +/integrations/watson_tts /more-info/removed-integration 301 /integrations/wunderground /more-info/removed-integration 301 /integrations/xbee /more-info/removed-integration 301 /integrations/xbox_live /more-info/removed-integration 301 From dd540f2fdf7828dbb6dfac3527b79e3025f4faff Mon Sep 17 00:00:00 2001 From: Manu Date: Sat, 27 Jun 2026 17:37:59 +0200 Subject: [PATCH 016/123] Remove Microsoft Face (#46513) --- source/_integrations/microsoft_face.markdown | 117 ------------------ .../microsoft_face_detect.markdown | 68 ---------- .../microsoft_face_identify.markdown | 68 ---------- source/_redirects | 3 + 4 files changed, 3 insertions(+), 253 deletions(-) delete mode 100644 source/_integrations/microsoft_face.markdown delete mode 100644 source/_integrations/microsoft_face_detect.markdown delete mode 100644 source/_integrations/microsoft_face_identify.markdown diff --git a/source/_integrations/microsoft_face.markdown b/source/_integrations/microsoft_face.markdown deleted file mode 100644 index 52b5facf06d2..000000000000 --- a/source/_integrations/microsoft_face.markdown +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Microsoft Face -description: Instructions on how to integrate Microsoft Face integration into Home Assistant. -ha_category: - - Image processing -ha_iot_class: Cloud Push -ha_release: 0.37 -ha_domain: microsoft_face -ha_integration_type: integration -ha_quality_scale: legacy ---- - -The **Microsoft Face** {% term integration %} is the main integration for Microsoft -Azure Cognitive service -[Face](https://azure.microsoft.com/products/cognitive-services/vision-services). -All data are stored in your own private instance in the Azure cloud. - -## Setup - -You need an API key, which is free, but requires an -[Azure registration](https://azure.microsoft.com/free/) using your -Microsoft ID. The free resource (*F0*) is limited to 20 requests per minute and -30k requests in a month. If you don't want to use the Azure cloud, you can also -get an API key by registering with -[cognitive-services](https://azure.microsoft.com/try/cognitive-services/). -All keys on cognitive services must be recreated every 90 days. - -## Configuration - -To enable the Microsoft Face {% term integration %}, -add the following to your {% term "`configuration.yaml`" %} file: - -```yaml -# Example configuration.yaml entry -microsoft_face: - api_key: YOUR_API_KEY - azure_region: eastus2 -``` - -{% configuration %} -api_key: - description: The API key for your Cognitive resource. - required: true - type: string -azure_region: - description: The region where you instantiated your Microsoft Cognitive services endpoint. - required: false - type: string -timeout: - description: Set timeout for the API connection. - required: false - type: time - default: 10s -{% endconfiguration %} - -### Person and Groups - -For most services, you need to set up a group or a person. -This limits the processing and detection to elements provided by the group. -Home Assistant creates an entity for all groups and allows you to show the -state, person, and IDs directly on the frontend. - -The following actions are available for managing this feature and can be called -via the Frontend, a script, or the REST API. - -- *microsoft_face.create_group* -- *microsoft_face.delete_group* - -```yaml -action: microsoft_face.create_group -data: - name: "Family" -``` - -- *microsoft_face.create_person* -- *microsoft_face.delete_person* - -```yaml -action: microsoft_face.create_person -data: - group: family - name: "Hans Maier" -``` - -You need to add an image of a person. You can add multiple images for every -person to make the detection better. You can take a picture from a camera or -send a local image to your Azure resource. - -- *microsoft_face.face_person* - -```yaml -action: microsoft_face.face_person -data: - group: family - name: "Hans Maier" - camera_entity: camera.door -``` - -For the local image we need `curl`. -The `{personId}` is present in group entity as attribute. - -```bash -$ curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{GroupName}/persons/{personId}/persistedFaces" \ - -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \ - -H "Content-Type: application/octet-stream" --data-binary "@/tmp/image.jpg" -``` - -After we're done with changes on a group, -we need train this group to teach the AI how to handle the new data. - -- *microsoft_face.train_group* - -```yaml -action: microsoft_face.train_group -data: - group: family -``` diff --git a/source/_integrations/microsoft_face_detect.markdown b/source/_integrations/microsoft_face_detect.markdown deleted file mode 100644 index 001f225d15a5..000000000000 --- a/source/_integrations/microsoft_face_detect.markdown +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Microsoft Face Detect -description: Instructions on how to integrate Microsoft Face Detect into Home Assistant. -ha_category: - - Image processing -ha_iot_class: Cloud Push -ha_release: 0.38 -ha_domain: microsoft_face_detect -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -The **Microsoft Face Detect** {% term integration %} allows you to use the -[Microsoft Face Identify](https://azure.microsoft.com/products/cognitive-services/) -API through Home Assistant. This platform enables you to detect face on camera -and fire an event with attributes. - -Please refer to the [Microsoft Face integration](/integrations/microsoft_face/) configuration on -how to set up the API key. - -For using the result inside an automation rule, -take a look at the [Image Processing integration](/integrations/image_processing/) page. - -{% important %} -The free version of the Microsoft Face identify API limits the number of requests possible per month. Therefore, it is strongly recommended that you limit the `scan_interval` when setting up an instance of this entity as detailed on the main [Image Processing integration](/integrations/image_processing/) page. -{% endimportant %} - -### Configuration - -To enable the integration, add it to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -image_processing: - - platform: microsoft_face_detect - source: - - entity_id: camera.door -``` - -{% configuration %} -confidence: - description: The minimum of confidence in percent to process with Home Assistant. - required: false - type: integer - default: 80 -source: - description: List of image sources. - required: true - type: list - keys: - entity_id: - description: A camera entity id to get picture from. - required: true - type: string - name: - description: This parameter allows you to override the name of your `image_processing` entity. - required: false - type: string -attributes: - description: "The image search attributes. Supported: `age`, `gender`, `glasses`." - required: false - type: list - default: "[age, gender]" -{% endconfiguration %} diff --git a/source/_integrations/microsoft_face_identify.markdown b/source/_integrations/microsoft_face_identify.markdown deleted file mode 100644 index 697b9ed21c6c..000000000000 --- a/source/_integrations/microsoft_face_identify.markdown +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Microsoft Face Identify -description: Instructions on how to integrate Microsoft Face Identify into Home Assistant. -ha_category: - - Image processing -ha_iot_class: Cloud Push -ha_release: 0.37 -ha_domain: microsoft_face_identify -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -The **Microsoft Face Identify** {% term integration %} lets you use -[Microsoft Face identify](https://azure.microsoft.com/products/cognitive-services/) -API through Home Assistant. This platform allow you do identify persons on -camera and fire an event with attributes. - -Please refer to the [Microsoft Face integration](/integrations/microsoft_face/) configuration on -how to set up the API key. - -For using the result inside an automation rule, -take a look at the [Image Processing integration](/integrations/image_processing/) page. - -{% important %} -The free version of the Microsoft Face identify API limits the number of requests possible per month. Therefore, it is strongly recommended that you limit the `scan_interval` when setting up an instance of this entity as detailed on the main [Image Processing integration](/integrations/image_processing/) page. -{% endimportant %} - -### Configuration - -To enable this integration, add it to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -image_processing: - - platform: microsoft_face_identify - group: family - source: - - entity_id: camera.door -``` - -{% configuration %} -group: - description: Microsoft face group to detect person from it. - required: true - type: string -confidence: - description: The minimum of confidence in percent to process with Home Assistant. - required: false - type: integer - default: 80 -source: - description: List of image sources. - required: true - type: list - keys: - entity_id: - description: A camera entity id to get picture from. - required: true - type: string - name: - description: This parameter allows you to override the name of your `image_processing` entity. - required: false - type: string -{% endconfiguration %} diff --git a/source/_redirects b/source/_redirects index 6b4612a2e0fe..d5c70c6f1d25 100644 --- a/source/_redirects +++ b/source/_redirects @@ -630,6 +630,9 @@ layout: null /integrations/mcp23017 /more-info/removed-integration 301 /integrations/mercury_nz /more-info/removed-integration 301 /integrations/mhz19 /more-info/removed-integration 301 +/integrations/microsoft_face /more-info/removed-integration 301 +/integrations/microsoft_face_detect /more-info/removed-integration 301 +/integrations/microsoft_face_identify /more-info/removed-integration 301 /integrations/mycroft /more-info/removed-integration 301 /integrations/myq /blog/2023/11/06/removal-of-myq-integration/ 301 /integrations/miflora /integrations/xiaomi_ble From 5699aa062903fc947919862886b6bd26d2c299ba Mon Sep 17 00:00:00 2001 From: Manu Date: Sat, 27 Jun 2026 17:40:25 +0200 Subject: [PATCH 017/123] Remove Clementine Music Player (#46510) --- source/_integrations/clementine.markdown | 55 ------------------------ source/_redirects | 1 + 2 files changed, 1 insertion(+), 55 deletions(-) delete mode 100644 source/_integrations/clementine.markdown diff --git a/source/_integrations/clementine.markdown b/source/_integrations/clementine.markdown deleted file mode 100644 index 73e075747497..000000000000 --- a/source/_integrations/clementine.markdown +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Clementine Music Player -description: Instructions on how to integrate Clementine Music Player within Home Assistant. -ha_category: - - Media player -ha_release: 0.39 -ha_iot_class: Local Polling -ha_domain: clementine -ha_platforms: - - media_player -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -The **Clementine Music Player** {% term integration %} allows you to control a [Clementine Music Player](https://www.clementine-player.org). - -To add a Clementine Player to your Home Assistant installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -media_player: - - platform: clementine - host: 192.168.0.20 -``` - -{% configuration %} -host: - description: The IP address of the Clementine Player, for example, `192.168.0.20`. - required: true - type: string -port: - description: The remote control port. - required: false - default: 5500 - type: integer -access_token: - description: The authorization code needed to connect. - required: false - type: integer -name: - description: The name you would like to give to the Clementine player. - required: false - default: Clementine Remote - type: string -{% endconfiguration %} - -Remember that Clementine must be configured to accept connections through its network remote control protocol. - -You can configure this through Clementine `Tools > Preferences > Network remote control` configuration menu. Enable `Use network remote control` and configure the other options for your use case. - -This integration does not implement the `play_media` action so you cannot add tracks to the playlist. diff --git a/source/_redirects b/source/_redirects index d5c70c6f1d25..a9a6b74c4f0b 100644 --- a/source/_redirects +++ b/source/_redirects @@ -556,6 +556,7 @@ layout: null /integrations/bom /more-info/removed-integration 301 /integrations/circuit /more-info/removed-integration 301 /integrations/ciscospark /more-info/removed-integration 301 +/integrations/clementine /more-info/removed-integration 301 /integrations/coinmarketcap /more-info/removed-integration 301 /integrations/coronavirus /more-info/removed-integration 301 /integrations/crimereports /more-info/removed-integration 301 From a789ddb341e785970ee371fd3067e481405f12e2 Mon Sep 17 00:00:00 2001 From: Manu Date: Sat, 27 Jun 2026 20:23:16 +0200 Subject: [PATCH 018/123] Remove Microsoft Teams integration (#45927) --- CODEOWNERS | 1 - source/_integrations/msteams.markdown | 69 --------------------------- source/_redirects | 1 + 3 files changed, 1 insertion(+), 70 deletions(-) delete mode 100644 source/_integrations/msteams.markdown diff --git a/CODEOWNERS b/CODEOWNERS index 78027ea38a0e..bcc939324d04 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -642,7 +642,6 @@ source/_integrations/motionblinds_matter.markdown @home-assistant/matter source/_integrations/motioneye.markdown @dermotduffy source/_integrations/motionmount.markdown @laiho-vogels source/_integrations/mqtt.markdown @emontnemery @jbouwh @bdraco -source/_integrations/msteams.markdown @peroyvind source/_integrations/mta.markdown @OnFreund source/_integrations/mullvad.markdown @meichthys source/_integrations/music_assistant.markdown @music-assistant @arturpragacz diff --git a/source/_integrations/msteams.markdown b/source/_integrations/msteams.markdown deleted file mode 100644 index e04e023bba64..000000000000 --- a/source/_integrations/msteams.markdown +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: Microsoft Teams -description: Instructions on how to send a notification to a Microsoft Teams channel. -ha_category: - - Notifications -ha_iot_class: Cloud Push -ha_release: 0.101 -ha_codeowners: - - '@peroyvind' -ha_domain: msteams -ha_platforms: - - notify -ha_integration_type: integration -ha_quality_scale: legacy ---- - -The **Microsoft Teams** {% term integration %} allows you to send notifications from Home Assistant to a team channel in [Microsoft Teams](https://www.microsoft.com/microsoft-teams/group-chat-software). - -{% note %} - -Microsoft announced the retirement of the Office 365 connectors within Microsoft Teams. Existing connectors will [continue to work until April 30, 2026](https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/). - -{% endnote %} - -## Setup - -To send a notification to teams, you need to add the Incoming Webhook app to your team channel. When the app is added, you will receive a webhook URL that needs to be added to your {% term "`configuration.yaml`" %}. - - -## Configuration - -To add the Microsoft Teams platform to your installation, add the following to your {% term "`configuration.yaml`" %} file: - -```yaml -notify: - - platform: msteams - url: https://outlook.office.com/webhook/ -``` - -{% configuration %} -name: - description: Setting this parameter allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. - required: false - type: string - default: "notify" -url: - description: The webhook URL created in the setup step. - required: true - type: string -{% endconfiguration %} - -### Microsoft Teams service data - -The following attributes can be placed inside `data` for extended functionality. - -| Data attribute | Optional | Description | -| ---------------------- | -------- | ------------------------------- | -| `image_url` | yes | Attach an image to the message. | - -The image must be an HTTPS URL, and as outlined by Microsoft in the [Documentation](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference#common-properties-for-all-cards), the picture must be on a publicly available location. - -Example for posting file from URL: - -```yaml -title: Title of the message. -message: Message that will be added. -data: - image_url: URL_OF_IMAGE -``` diff --git a/source/_redirects b/source/_redirects index a9a6b74c4f0b..c73fe05b3b7a 100644 --- a/source/_redirects +++ b/source/_redirects @@ -641,6 +641,7 @@ layout: null /integrations/mitemp_bt /integrations/xiaomi_ble /integrations/mopar /more-info/removed-integration 301 /integrations/mpchc /more-info/removed-integration 301 +/integrations/msteams /more-info/removed-integration 301 /integrations/mychevy /more-info/removed-integration 301 /integrations/n26 /more-info/removed-integration 301 /integrations/national_grid_us /more-info/removed-integration 301 From c53dba6c35a9e16f309d72678b13f9c8089c5d86 Mon Sep 17 00:00:00 2001 From: Raphael Hehl <7577984+RaHehl@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:40:25 +0200 Subject: [PATCH 019/123] Remove UniFi LED integration documentation (#44776) --- CODEOWNERS | 1 - source/_integrations/unifiled.markdown | 65 -------------------------- source/_redirects | 1 + 3 files changed, 1 insertion(+), 66 deletions(-) delete mode 100644 source/_integrations/unifiled.markdown diff --git a/CODEOWNERS b/CODEOWNERS index bcc939324d04..f1d673c6edae 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1063,7 +1063,6 @@ source/_integrations/unifi.markdown @Kane610 source/_integrations/unifi_access.markdown @imhotep @RaHehl source/_integrations/unifi_direct.markdown @tofuSCHNITZEL source/_integrations/unifi_discovery.markdown @RaHehl -source/_integrations/unifiled.markdown @florisvdk source/_integrations/unifiprotect.markdown @RaHehl source/_integrations/upb.markdown @gwww source/_integrations/upc_connect.markdown @pvizeli @fabaff diff --git a/source/_integrations/unifiled.markdown b/source/_integrations/unifiled.markdown deleted file mode 100644 index 402a7646ba0e..000000000000 --- a/source/_integrations/unifiled.markdown +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: UniFi LED -description: Instructions on how to configure the UniFi LED integration with UniFi LED Controller by Ubiquiti. -ha_category: - - Light -ha_release: 0.102 -ha_iot_class: Local Polling -ha_codeowners: - - '@florisvdk' -ha_domain: unifiled -ha_platforms: - - light -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -[UniFi LED](https://unifi-led.ui.com/) by [Ubiquiti Networks, inc.](https://www.ui.com/) is a system of controller managed LED light panels and dimmers. - -There is currently support for the following device type within Home Assistant: - -- [Light](#light) - -## Configuration - -To use the {% term integration %} in your installation, add it to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -light: - - platform: unifiled - host: IP_ADDRESS - username: USERNAME - password: PASSWORD -``` - -{% configuration %} -host: - description: IP address or hostname used to connect to the UniFi LED controller. - type: string - required: true - default: None -port: - description: Port used to connect to the UniFi LED controller. - type: string - required: false - default: 20443 -username: - description: Username used to log into the UniFi LED controller. - type: string - required: true - default: None -password: - description: Password used to log into the UniFi LED controller. - type: string - required: true - default: None -{% endconfiguration %} - -## Light - -The light panels output state and brightness are synchronized with Home Assistant. diff --git a/source/_redirects b/source/_redirects index c73fe05b3b7a..f7b26d952ac4 100644 --- a/source/_redirects +++ b/source/_redirects @@ -704,6 +704,7 @@ layout: null /integrations/ubee /more-info/removed-integration 301 /integrations/uber /more-info/removed-integration 301 /integrations/ue_smart_radio /more-info/removed-integration 301 +/integrations/unifiled /more-info/removed-integration 301 /integrations/updater /more-info/removed-integration 301 /integrations/ups /more-info/removed-integration 301 /integrations/uscis /more-info/removed-integration 301 From 52217ec9b6e6c475b9fcb64ce0776d71ddc2286d Mon Sep 17 00:00:00 2001 From: Manuel Stahl Date: Sun, 28 Jun 2026 01:29:55 +0200 Subject: [PATCH 020/123] Revise STIEBEL ELTRON integration modes and instructions (#46518) --- source/_integrations/stiebel_eltron.markdown | 45 +++++++++----------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/source/_integrations/stiebel_eltron.markdown b/source/_integrations/stiebel_eltron.markdown index e08070fb2f33..e1609c763493 100644 --- a/source/_integrations/stiebel_eltron.markdown +++ b/source/_integrations/stiebel_eltron.markdown @@ -47,37 +47,32 @@ The following HVAC modes are supported. The STIEBEL ELTRON modes are mapped and The following preset modes are supported. The STIEBEL ELTRON modes are mapped and configurable as follows: -- Eco mode (PRESET_ECO) -- Day mode (PRESET_DAY) -- Setback mode (PRESET_SETBACK) +- Standby mode (PRESET_READY) +- Setback mode (PRESET_ECO) +- Day mode (PRESET_COMFORT) +- Water heating mode (PRESET_WATER_HEATING) +- Automatic mode (PRESET_AUTO) +- Manual mode (PRESET_MANUAL) - Emergency mode (PRESET_EMERGENCY) -## Configuration +## Installation -To enable this integration, add the following lines to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} +{% include integrations/config_flow.md %} -```yaml -# Example configuration.yaml entry -stiebel_eltron: - name: LWZ504e - host: IP_ADDRESS - port: 502 -``` - -{% configuration %} -name: - description: Displayed name of the unit. - required: false - default: Unnamed Device - type: string -host: - description: The hostname or IP of the stiebel eltron ISG. +{% configuration_basic %} +Host: + description: "The IP address of the ISG. You can find it in your router." required: true type: string -port: - description: The port of the stiebel eltron ISG. +Port: + description: The TCP port for Modbus. required: false default: 502 type: integer -{% endconfiguration %} +{% endconfiguration_basic %} + +## Removing the integration + +This integration follows standard integration removal. No extra steps are required. + +{% include integrations/remove_device_service.md %} From 628cfb620249c0b3da11878bd4d3d77edca02ffe Mon Sep 17 00:00:00 2001 From: Tom Date: Sun, 28 Jun 2026 15:45:43 +0200 Subject: [PATCH 021/123] Limit amount of ProxmoxVE entities enabled by default (#46516) --- source/_integrations/proxmoxve.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/proxmoxve.markdown b/source/_integrations/proxmoxve.markdown index a5ad65dd84e5..15a112a92d5b 100644 --- a/source/_integrations/proxmoxve.markdown +++ b/source/_integrations/proxmoxve.markdown @@ -166,6 +166,8 @@ To create a token: ## Entities +Some entities are not enabled by default, you can enable them via the device page. + ### Sensor - **CPU**: Percentage of CPU usage. From cbf5e1f734370acf8c601dc803c9fc7526aa4e79 Mon Sep 17 00:00:00 2001 From: Greg Haines Date: Tue, 30 Jun 2026 00:49:58 -0600 Subject: [PATCH 022/123] Add diagnostics for CentriConnect (#46522) --- source/_integrations/centriconnect.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/centriconnect.markdown b/source/_integrations/centriconnect.markdown index f8b9818c26ca..f2f402826f86 100644 --- a/source/_integrations/centriconnect.markdown +++ b/source/_integrations/centriconnect.markdown @@ -11,6 +11,7 @@ ha_codeowners: - '@gresrun' ha_domain: centriconnect ha_platforms: + - diagnostics - sensor ha_integration_type: device ha_quality_scale: bronze From 531f020104608a0e43a16c661888ec8abbf7625b Mon Sep 17 00:00:00 2001 From: TimL Date: Wed, 1 Jul 2026 00:53:10 +1000 Subject: [PATCH 023/123] Document bluetooth proxy support (#46472) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/bluetooth.markdown | 5 +++++ source/_integrations/smlight.markdown | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/source/_integrations/bluetooth.markdown b/source/_integrations/bluetooth.markdown index fc383ef273d8..ff0f8802dd10 100644 --- a/source/_integrations/bluetooth.markdown +++ b/source/_integrations/bluetooth.markdown @@ -330,6 +330,11 @@ The following remote adapters are supported: - Bluetooth advertisement bundling: Shelly Gen2+ device - Single active connection: not supported - Multiple active connections: not supported +- [SMLIGHT](/integrations/smlight/) + - Bluetooth advertisement listening: SMLIGHT SLZB-U device + - Bluetooth advertisement bundling: SMLIGHT SLZB-U device + - Single active connection: not supported + - Multiple active connections: not supported Bluetooth advertisement bundling reduces traffic between Home Assistant and the proxy, significantly improving performance and reducing the time that Bluetooth and WiFi compete for air time for devices that share a radio. diff --git a/source/_integrations/smlight.markdown b/source/_integrations/smlight.markdown index 044cdd2fa992..17b158b66f58 100644 --- a/source/_integrations/smlight.markdown +++ b/source/_integrations/smlight.markdown @@ -134,6 +134,19 @@ SLZB-Ultima devices support additional peripherals not found on other SLZB adapt #### Infrared - **IR Emitter**: This entity can be used by other integrations as an [Infrared](/integrations/infrared/) proxy to send IR commands through the SLZB-Ultima device. For example, you can use the [LG Infrared](/integrations/lg_infrared/) integration with this entity type to control your TV. + +## Bluetooth remote adapter (proxy) + +SMLIGHT SLZB U-series devices running SLZB-OS can act as a Bluetooth remote adapter (proxy). They scan for and forward Bluetooth advertisement data to Home Assistant. + +To use the Bluetooth remote adapter, you must enable the Bluetooth Low Energy (BLE) remote adapter in the SMLIGHT device's web UI. Once enabled, Home Assistant automatically receives the forwarded Bluetooth advertisement data. No additional configuration is required in Home Assistant. + +{% tip %} +SMLIGHT devices do _not_ support proxying active (GATT) connections. +{% endtip %} + +For more details, see [Remote adapters (Bluetooth proxies)](/integrations/bluetooth/#remote-adapters-bluetooth-proxies) in the [Bluetooth integration](/integrations/bluetooth). + ## Actions {% include integrations/actions.md %} @@ -153,6 +166,7 @@ Certain advanced features are not supported directly within this integration and - Configuring security settings. - Adjusting network settings. - Setting up the WireGuard VPN client. +- Enable BLE proxy mode on SLZB-U devices. ## Troubleshooting From 22b428c27245c9070f12d28280ac4c868eb9a320 Mon Sep 17 00:00:00 2001 From: Manu Date: Tue, 30 Jun 2026 18:58:31 +0200 Subject: [PATCH 024/123] Add reply and quote posts support to Mastodon (#46541) --- source/_actions/mastodon.post.markdown | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/_actions/mastodon.post.markdown b/source/_actions/mastodon.post.markdown index 95defd04bef4..6ea05fcf8d0e 100644 --- a/source/_actions/mastodon.post.markdown +++ b/source/_actions/mastodon.post.markdown @@ -61,6 +61,12 @@ Media description: Media warning: description: Mark the attached media as sensitive. required: false +In reply to: + description: The ID of the status to reply to. Setting this makes the new post a reply, allowing you to create or continue a thread. + required: false +Quote: + description: The ID of the status to quote in this post. + required: false {% endoptions_ui %} {% include actions/yaml_header.md %} @@ -136,6 +142,16 @@ media_warning: required: false type: boolean default: false +in_reply_to: + description: > + The ID of the status to reply to. Setting this makes the new post a reply, allowing you to create or continue a thread. + required: false + type: string +quoted_status: + description: > + The ID of the status to quote in this post. + required: false + type: string {% endoptions_yaml %} {% note %} From 300c470aef49c51cc9508a4e3ec3c01015d6ebf5 Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Tue, 30 Jun 2026 20:36:14 +0200 Subject: [PATCH 025/123] Add IoTorero virtual integration (#46552) --- source/_integrations/iotorero.markdown | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 source/_integrations/iotorero.markdown diff --git a/source/_integrations/iotorero.markdown b/source/_integrations/iotorero.markdown new file mode 100644 index 000000000000..daab1a9665ea --- /dev/null +++ b/source/_integrations/iotorero.markdown @@ -0,0 +1,53 @@ +--- +title: IoTorero +description: Connect and control your IoTorero devices using the ESPHome integration +ha_release: 2026.7 +ha_category: + - Alarm + - DIY + - Update +ha_domain: iotorero +ha_integration_type: virtual +ha_supporting_domain: esphome +ha_supporting_integration: ESPHome +works_with: + - local +ha_codeowners: + - '@jesserockz' + - '@kbx81' + - '@bdraco' +ha_config_flow: true +ha_platforms: + - alarm_control_panel + - assist_satellite + - binary_sensor + - button + - camera + - climate + - cover + - date + - datetime + - diagnostics + - event + - fan + - light + - lock + - media_player + - number + - select + - sensor + - switch + - text + - time + - update + - valve + - water_heater +ha_iot_class: Local Push +ha_dhcp: true +ha_zeroconf: true +--- + +[IoTorero](https://www.athom.tech/) devices work locally and integrate seamlessly with the [ESPHome](/integrations/esphome/) {% term integration %} in Home Assistant. As all connectivity is done locally, status updates and device control from Home Assistant happen instantly. + +{% include integrations/supported_brand.md %} + From 11e1b8988e564fd7965da4039151769aa3785c66 Mon Sep 17 00:00:00 2001 From: Manu Date: Tue, 30 Jun 2026 21:32:55 +0200 Subject: [PATCH 026/123] Remove Gitter integration (#46519) --- source/_integrations/gitter.markdown | 44 ---------------------------- 1 file changed, 44 deletions(-) delete mode 100644 source/_integrations/gitter.markdown diff --git a/source/_integrations/gitter.markdown b/source/_integrations/gitter.markdown deleted file mode 100644 index 1dd5d391422d..000000000000 --- a/source/_integrations/gitter.markdown +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Gitter -description: Instructions on how to integrate a Gitter room sensor with Home Assistant -ha_category: - - Sensor -ha_iot_class: Cloud Polling -ha_release: 0.47 -ha_domain: gitter -ha_platforms: - - sensor -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file -ha_quality_scale: legacy ---- - -This **Gitter** {% term integration %} allows one to monitor a [Gitter.im](https://gitter.im) chatroom for unread messages. - -## Configuration - -Visit [Gitter Developer Apps](https://developer.gitter.im/apps) to retrieve your "Personal Access Token". - -To use a Gitter {% term integration %} in your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -sensor: - - platform: gitter - api_key: YOUR_API_TOKEN -``` - -{% configuration %} -api_key: - description: Your Gitter.im API token. - required: true - type: string -room: - description: Gitter room to monitor. - required: false - type: string - default: "`home-assistant/home-assistant`" -{% endconfiguration %} From a769025b75072b203442da61697a8a22dd69042d Mon Sep 17 00:00:00 2001 From: seanpasino Date: Wed, 1 Jul 2026 02:27:40 -0400 Subject: [PATCH 027/123] Document Sonarr calendar entity (#46407) --- source/_integrations/sonarr.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_integrations/sonarr.markdown b/source/_integrations/sonarr.markdown index e06dafea9e54..0fa781dae0b3 100644 --- a/source/_integrations/sonarr.markdown +++ b/source/_integrations/sonarr.markdown @@ -10,6 +10,7 @@ ha_config_flow: true ha_codeowners: - '@ctalkington' ha_platforms: + - calendar - sensor ha_integration_type: service --- @@ -25,6 +26,10 @@ API Key: description: Your Sonarr API key. To find it, open your Sonarr web interface and navigate to **Settings** > **General**. The API key is listed under the **Security** section. {% endconfiguration_basic %} +## Calendar + +A {% term calendar %} entity is created that shows your upcoming episodes. Each event is titled with the series name, the season and episode number, and the episode title, such as `Bob's Burgers - S04E11 - Easy Com-mercial, Easy Go-mercial`. Events are timed using the episode's air time and the series runtime. + ## Sensors The Sonarr integration will add the following sensors: From d29c78760f849f5206bf1824fe7d5adab42e257e Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Wed, 1 Jul 2026 08:34:08 +0200 Subject: [PATCH 028/123] Rework MQTT config flow (#46087) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/mqtt.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_integrations/mqtt.markdown b/source/_integrations/mqtt.markdown index 0f03c96aae27..14d64db2f5ec 100644 --- a/source/_integrations/mqtt.markdown +++ b/source/_integrations/mqtt.markdown @@ -198,12 +198,12 @@ Add the MQTT integration, then provide your broker's hostname (or IP address) an MQTT subentries can also be reconfigured. Additional entities can be added, or an entity can be removed from the sub entry. Each MQTT subentry holds one MQTT device. The MQTT device must have at least one entity. {% important %} -If you experience an error message like `Failed to connect due to exception: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed`, then turn on `Advanced options` and set [Broker certificate validation](/integrations/mqtt/#broker-certificate-validation) to `Auto`. +If you experience an error message like `Failed to connect due to exception: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed`, then check the collapse section `Other settings` and set [Broker certificate validation](/integrations/mqtt/#broker-certificate-validation) to `Auto`. {% endimportant %} -### Advanced broker configuration +### Other broker configuration settings -Advanced broker configuration options include setting a custom client ID, configuring a client certificate and key for authentication, and enabling TLS validation of the broker's certificate to ensure a secure connection. To access the advanced options, open the MQTT broker settings, select **Advanced options**, and select **Next**. Advanced broker options are shown by default when the default advanced broker settings are changed. +Additional broker configuration options include setting a custom client ID, configuring a client certificate and key for authentication, and enabling TLS validation of the broker's certificate to ensure a secure connection. To access these settings, open the MQTT broker settings, and expand **Other settings**. #### Alternative client ID From fee27e65c8451e7293a2f247be9865021cc4eba3 Mon Sep 17 00:00:00 2001 From: Onero-testdev Date: Wed, 1 Jul 2026 15:55:51 +0800 Subject: [PATCH 029/123] Add SwitchBot Candle Warmer Lamp documentation (#45904) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/switchbot.markdown | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/_integrations/switchbot.markdown b/source/_integrations/switchbot.markdown index 051c32686e86..f3dcf599316b 100644 --- a/source/_integrations/switchbot.markdown +++ b/source/_integrations/switchbot.markdown @@ -155,6 +155,7 @@ For instructions on how to obtain the encryption key, see README in [PySwitchbot - [RGBICWW Strip Light](https://www.switch-bot.com/products/switchbot-rgbicww-strip-light) - [RGBICWW Floor Lamp](https://www.switch-bot.com/products/switchbot-rgbicww-floor-lamp) - [Permanent Outdoor Light](https://www.switch-bot.com/products/switchbot-permanent-outdoor-light) +- [Candle Warmer Lamp](https://www.switch-bot.com/products/switchbot-candle-warmer-lamp) ### Locks @@ -661,6 +662,15 @@ Features: - change color - set effect +#### Candle Warmer Lamp + +This is an encrypted device. + +Features: + +- turn on or off +- change brightness + ### Locks Note: The integration currently only uses the primary lock state; in dual lock mode, not all things might work properly. From 845cc572e66575d2061a7b23083bf6c144f98f7f Mon Sep 17 00:00:00 2001 From: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Date: Thu, 2 Jul 2026 12:48:30 +0200 Subject: [PATCH 030/123] Infrared: add remote adapter, add terminology (#46548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Abílio Costa Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/infrared.markdown | 88 +++++++++++++++--- .../infrared/infrared-overview.mmd | 30 ++++++ .../infrared/infrared-overview.png | Bin 0 -> 78487 bytes .../integrations/infrared/mermaid-config.json | 11 +++ 4 files changed, 118 insertions(+), 11 deletions(-) create mode 100644 source/images/integrations/infrared/infrared-overview.mmd create mode 100644 source/images/integrations/infrared/infrared-overview.png create mode 100644 source/images/integrations/infrared/mermaid-config.json diff --git a/source/_integrations/infrared.markdown b/source/_integrations/infrared.markdown index c36d2b90324f..d06f1f0ba0a0 100644 --- a/source/_integrations/infrared.markdown +++ b/source/_integrations/infrared.markdown @@ -9,17 +9,89 @@ ha_domain: infrared ha_codeowners: - '@home-assistant/core' ha_integration_type: entity +related: + - docs: /integrations/#infrared + title: Integrations supporting infrared + - url: https://esphome.io/projects/?type=irrf + title: ESPHome infrared and radio frequency proxy projects + - url: https://esphome.io/components/ir_rf_proxy/ + title: ESPHome infrared and radio frequency proxy component --- -An infrared {% term entity %} represents either an infrared emitter or an infrared receiver. Emitters allow other integrations to send IR commands to control devices such as TVs, air conditioners, and other IR-controlled appliances. Receivers allow other integrations to react to IR signals captured by the hardware. +The **Infrared** {% term integration %} allows you to use Home Assistant to send commands to infrared-controlled devices, or to receive signals from infrared remotes. The integration acts as an abstraction layer between the following components: -The **Infrared** {% term integration %} acts as an abstraction layer between IR hardware (such as ESPHome) and device-specific integrations that send commands to infrared-controlled devices, or receive signals from infrared remotes. +- An infrared remote adapter (proxy) hardware +- An integration that provides infrared entities by integrating an infrared remote adapter (such as [ESPHome](/integrations/esphome/) or [SMLIGHT SLZB](/integrations/smlight/)) +- Device-specific integrations (such as [LG Infrared](/integrations/lg_infrared/) or [Samsung Infrared](/integrations/samsung_infrared/)) + +You can control infrared-controlled devices from Home Assistant without touching the handheld remote control. You can also send signals from the handheld remote control to Home Assistant. The chart illustrates how this is possible via the integrations. + +

Diagram showing how the Infrared integration connects device integrations to an infrared remote adapter through a remote adapter integration. +How the Infrared integration connects device integrations to an infrared remote adapter through a remote adapter integration. +

+ +An infrared {% term entity %} represents either an [infrared emitter](#infrared-emitter) or an [infrared receiver](#infrared-receiver). {% include integrations/building_block_integration.md %} -## The state of an infrared entity +## Controlling infrared-controlled devices from Home Assistant + +You can use an infrared remote adapter (proxy) to control devices directly from Home Assistant. + +### Prerequisites + +The **Infrared** {% term integration %} is a building block that other integrations build on. It cannot control devices directly. To control devices from Home Assistant, a few other components are needed. + +- Administrator rights in Home Assistant. +- An infrared-controlled device, such as a TV, air conditioner, amplifier, or soundbar. +- An infrared remote adapter. If you're unsure what to get: + - Find integrations that support infrared: In the documentation, search for the [infrared category](/integrations/#infrared). + - You could also follow an example from the [ESPHome infrared and radio frequency proxy projects](https://esphome.io/projects/?type=irrf). + +### To control infrared-controlled devices from Home Assistant + +1. Place the infrared remote adapter within line-of-sight of the infrared-controlled device. Infrared signals do not pass through walls or other objects. +2. In Home Assistant, add the integration for your infrared remote adapter. Home Assistant creates a separate infrared {% term entity %} for each emitter and receiver it provides. + - To add the integration, follow the steps in the integration documentation. +3. Add the integration for your infrared-controlled device, such as [LG Infrared](/integrations/lg_infrared/). + - To add the integration, follow the steps in the integration documentation. + - During integration setup, when you are asked which infrared emitter to use, select the emitter from your infrared remote adapter. +4. If you have infrared-controlled devices in different rooms, place multiple infrared remote adapters around your home. + - During setup of the infrared-controlled device, select the remote adapter closest to that device. + +## About infrared terminology + +This section explains some of the key terms on this page and how they are used in the Home Assistant documentation. + +### Infrared remote adapter (proxy) + +A device that relays IR commands on behalf of Home Assistant. It can connect to Home Assistant over Wi-Fi, Ethernet, or other technology. An infrared remote adapter is also known as an infrared proxy. + +It has the following characteristics: -The infrared entity is stateless in the traditional sense, as in, it cannot have a state like `on` or `off`. Instead, the state is a timestamp showing when the entity was last active: +- The infrared remote adapter is the hardware device. +- The infrared remote adapter contains one or more emitters, and sometimes a receiver. +- Each emitter and receiver is shown as a separate {% term entity %} in Home Assistant. + +#### Infrared emitter + +The component of your remote adapter that sends out IR signals. This is the same kind of signal a physical remote sends. An emitter is what actually controls a device. In Home Assistant, each emitter appears as an infrared {% term entity %} that other integrations can use. + +#### Infrared receiver + +The component of your remote adapter that catches IR signals sent by a device like a handheld remote. Home Assistant can use those signals, for example to update the entity's {% term state %} or trigger {% term automations %}. Each receiver appears as an infrared {% term entity %}. + +### Infrared-controlled device + +The appliance you want to control, such as a TV, air conditioner, amplifier, or soundbar. It listens for IR signals but does not connect to your network. + +### Infrared entity + +The Home Assistant representation of a single emitter or receiver. This is what you select when configuring an integration for an infrared-controlled device. + +## About the state of an infrared entity + +The infrared entity is stateless in the traditional sense, as in, it cannot have a state like `on` or `off`. Instead, the state is a timestamp showing when the {% term entity %} was last active: - For an emitter, the state is the date and time the last IR command was sent. - For a receiver, the state is the date and time the last IR signal was received. @@ -29,10 +101,4 @@ In addition, the entity can have the following states: - **Unavailable**: The entity is currently unavailable. - **Unknown**: The state is not yet known. -Because the {% term state %} of an infrared entity is a timestamp, it changes every time the entity is used. This means we can use it to track when the emitter last sent a command, or when the receiver last picked up a signal. The logbook can also show context about which integration or action triggered the IR event. - -## Setting up devices that use infrared - -When setting up an integration for an IR-controlled device (such as an LG TV via infrared), you will typically be asked to select which IR emitter and/or receiver to use during the configuration process. This allows you to choose the specific infrared entity that is physically positioned near your device. - -The selected infrared entity must be provided by a hardware integration (such as ESPHome) that has already been set up with an IR emitter or receiver. +Because the {% term state %} of an infrared entity is a timestamp, it changes every time the entity is used. This means you can use it to track when the emitter last sent a command, or when the receiver last picked up a signal. The logbook can also show context about which {% term integration %} or {% term action %} triggered the IR event. \ No newline at end of file diff --git a/source/images/integrations/infrared/infrared-overview.mmd b/source/images/integrations/infrared/infrared-overview.mmd new file mode 100644 index 000000000000..2217831a0deb --- /dev/null +++ b/source/images/integrations/infrared/infrared-overview.mmd @@ -0,0 +1,30 @@ +flowchart LR + REMOTE["Handheld IR remote"] + HA["Home Assistant"] + + subgraph DEV["Integration of the IR-controlled device"] + LG["LG Infrared"] + SAM["Samsung Infrared"] + OTHER["Other IR integrations ..."] + end + + IRINT["Infrared integration"] + + PROXYINT["Remote adapter (Proxy) integration
(ESPHome, SMLIGHT SLZB, ...)"] + + subgraph ADAPTER["Infrared remote adapter (proxy)"] + EM["Infrared emitter
(infrared entity)"] + RC["Infrared receiver
(infrared entity)"] + end + + TV["Infrared-controlled device
(TV, air conditioner)"] + + HA --- DEV + DEV --> IRINT + IRINT --> PROXYINT + PROXYINT --> EM + EM -->|"IR"| TV + REMOTE -->|"IR"| RC + RC --> PROXYINT + PROXYINT --> IRINT + IRINT --> DEV diff --git a/source/images/integrations/infrared/infrared-overview.png b/source/images/integrations/infrared/infrared-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..696c47204c8fc9ced326934f98f0306896bc2107 GIT binary patch literal 78487 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:kCe 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 literal 0 HcmV?d00001 diff --git a/source/images/integrations/infrared/mermaid-config.json b/source/images/integrations/infrared/mermaid-config.json new file mode 100644 index 000000000000..986912e81437 --- /dev/null +++ b/source/images/integrations/infrared/mermaid-config.json @@ -0,0 +1,11 @@ +{ + "theme": "default", + "themeVariables": { + "fontSize": "18px" + }, + "flowchart": { + "nodeSpacing": 20, + "rankSpacing": 45, + "padding": 4 + } +} From a196f3f633b13b3bb92b47ff2e9e27fad36c3ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ab=C3=ADlio=20Costa?= Date: Thu, 2 Jul 2026 18:10:21 +0100 Subject: [PATCH 031/123] Add RADON device class for sensor and number (#46628) --- source/_integrations/number.markdown | 1 + source/_integrations/sensor.markdown | 1 + 2 files changed, 2 insertions(+) diff --git a/source/_integrations/number.markdown b/source/_integrations/number.markdown index bc9aef1c95bf..60ab647a39b8 100644 --- a/source/_integrations/number.markdown +++ b/source/_integrations/number.markdown @@ -77,6 +77,7 @@ The following device classes are supported for numbers: - **precipitation**: Accumulated precipitation in cm, in or mm - **precipitation_intensity**: Precipitation intensity in in/d, in/h, mm/d or mm/h - **pressure**: Pressure in mPa, Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, inH₂O or psi +- **radon**: Concentration of radon in Bq/m³ or pCi/L - **reactive_energy**: Reactive energy in varh or kvarh - **reactive_power**: Reactive power in mvar, var, or kvar - **signal_strength**: Signal strength in dB or dBm diff --git a/source/_integrations/sensor.markdown b/source/_integrations/sensor.markdown index 2cbeff902fb3..5b78237d5fd1 100644 --- a/source/_integrations/sensor.markdown +++ b/source/_integrations/sensor.markdown @@ -89,6 +89,7 @@ The following device classes are supported for sensors: - **precipitation**: Accumulated precipitation in cm, in or mm - **precipitation_intensity**: Precipitation intensity in in/d, in/h, mm/d or mm/h - **pressure**: Pressure in mPa, Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, inH₂O or psi +- **radon**: Concentration of radon in Bq/m³ or pCi/L - **reactive_energy**: Reactive energy in varh or kvarh - **reactive_power**: Reactive power in mvar, var, or kvar - **signal_strength**: Signal strength in dB or dBm From d74d874a3fbf5951cc88ad27c42e63f58f498d62 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 2 Jul 2026 21:23:05 +0200 Subject: [PATCH 032/123] Rename Modbus integration to Manual Modbus (#46629) Co-authored-by: Claude --- source/_integrations/modbus.markdown | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index c5a969bbae2e..26b3e6ef2f37 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -1,6 +1,6 @@ --- -title: Modbus -description: Instructions on how to integrate modbus and platforms. +title: Manual Modbus +description: Instructions on how to manually register Modbus entities and platforms. ha_category: - Hub ha_release: pre 0.7 @@ -22,9 +22,13 @@ related: [modbus](http://www.modbus.org/) is a communication protocol to control PLCs (Programmable Logic Controller) and RTUs (Remote Terminal Unit). +The Manual Modbus {% term integration %} lets you manually register Modbus entities by describing each register in your `configuration.yaml` file. It is meant for people who are comfortable working with Modbus, as it requires knowledge of the protocol and of the specific registers your device exposes. + +Before setting this up, we recommend looking for a vendor-specific integration that already supports your Modbus device. A dedicated integration handles the register details for you and is easier to set up and maintain. + The integration adheres strictly to the [protocol specification](https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf) using [pymodbus](https://github.com/pymodbus-dev/pymodbus) for the protocol implementation. -The modbus {% term integration %} supports all devices adhering to the modbus standard. The communication to the device/devices can be serial (rs-485), TCP, or UDP connections. The modbus integration allows multiple communication channels e.g. a serial port connection combined with one or more TCP connections. +The Manual Modbus integration supports all devices adhering to the Modbus standard. The communication to the device or devices can be serial (rs-485), TCP, or UDP connections. The integration allows multiple communication channels, for example a serial port connection combined with one or more TCP connections. # Configuring modbus communication From 9b042afb5bcd4fb81ffaf1de6bf7a5ea7636b9a3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Jul 2026 12:29:39 +0200 Subject: [PATCH 033/123] Add LLM integration documentation (#46325) Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/llm.markdown | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 source/_integrations/llm.markdown diff --git a/source/_integrations/llm.markdown b/source/_integrations/llm.markdown new file mode 100644 index 000000000000..42db4926c4cf --- /dev/null +++ b/source/_integrations/llm.markdown @@ -0,0 +1,19 @@ +--- +title: LLM +description: Organizes the LLM APIs that large language models can use in Home Assistant. +ha_category: + - Voice +ha_release: 2026.7 +ha_iot_class: Calculated +ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' +ha_domain: llm +ha_integration_type: system +--- + +The **LLM** {% term integration %} organizes the [LLM APIs](https://developers.home-assistant.io/docs/core/llm/) that large language models can use to interact with Home Assistant. An LLM API is a set of tools that a model can call. For example, to control your devices or answer questions about your home. + +This integration provides the framework that lets other integrations contribute tools to an LLM API. It is set up automatically when needed and has no configuration options. + +To let a conversation agent use an LLM API, configure it on the conversation agent integration, such as [Ollama](/integrations/ollama/), [Google Generative AI](/integrations/google_generative_ai_conversation/), or [OpenAI](/integrations/openai_conversation/). From 26c8b643463729eae573c6e61fc955c9e5d426c4 Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Fri, 3 Jul 2026 12:53:39 +0200 Subject: [PATCH 034/123] Update netatmo.markdown (#46637) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/netatmo.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/netatmo.markdown b/source/_integrations/netatmo.markdown index 6cfd8c0d7d49..afb46e6e31f6 100644 --- a/source/_integrations/netatmo.markdown +++ b/source/_integrations/netatmo.markdown @@ -233,4 +233,4 @@ To confirm your Home Assistant instance is receiving events via webhooks, you ca ### Light -If the lights show as unavailable the issue usually is that webhook is banned by Netatmo. To solve that [unregister](#un-register-webhooks) the webhook, go to the [Netatmo Developer Page](https://dev.netatmo.com/) to unban your webhook and then [register](#un-register-webhooks) the webhook. +If the lights show as unavailable, the webhook has likely been banned by Netatmo. To resolve this, go to the [Netatmo Developer Page](https://dev.netatmo.com/) to unban your webhook, and then reload the integration. From 9ac55e5a54de089de7b33df94ca9ef1513b9e4e1 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 3 Jul 2026 14:16:16 +0200 Subject: [PATCH 035/123] Update template light temperature docs to reflect Kelvin values (#46645) --- source/_integrations/template.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_integrations/template.markdown b/source/_integrations/template.markdown index 38d1a7714210..5f1374ba45fd 100644 --- a/source/_integrations/template.markdown +++ b/source/_integrations/template.markdown @@ -1130,7 +1130,7 @@ template: set_temperature: action: input_number.set_value data: - value: "{{ color_temp }}" + value: "{{ color_temp_kelvin }}" entity_id: input_number.temperature_input set_hs: - action: input_number.set_value @@ -1187,7 +1187,7 @@ template: set_temperature: action: input_number.set_value data: - value: "{{ color_temp }}" + value: "{{ color_temp_kelvin }}" entity_id: input_number.temperature_input set_hs: - action: input_number.set_value @@ -1360,7 +1360,7 @@ light: type: template default: false temperature: - description: Defines a template to get the color temperature of the light. The template must return the color temperature in mireds. If you are using a `color_temp_kelvin` attribute from another source, convert the value to mireds by dividing 1000000 by the `color_temp_kelvin` result. + description: Defines a template to get the color temperature of the light in Kelvin. The template must return a value between 2000 and 6535. required: false type: template default: optimistic From 96888719d9eee63f98acd024bed193c85c2e5eee Mon Sep 17 00:00:00 2001 From: Imou-OpenPlatform Date: Fri, 3 Jul 2026 20:46:42 +0800 Subject: [PATCH 036/123] Update Imou docs for switch platform (#46487) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marcin Sędłak-Jakubowski --- source/_integrations/imou.markdown | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/source/_integrations/imou.markdown b/source/_integrations/imou.markdown index 6d6fc4c636e7..8a5eebbd7041 100644 --- a/source/_integrations/imou.markdown +++ b/source/_integrations/imou.markdown @@ -4,6 +4,7 @@ description: Integrate Imou smart devices into Home Assistant. ha_category: - Button - Camera + - Switch ha_iot_class: Cloud Polling ha_release: 2026.6 ha_config_flow: true @@ -13,15 +14,16 @@ ha_codeowners: ha_platforms: - button - camera + - switch ha_integration_type: hub ha_quality_scale: bronze --- -The **Imou** {% term integration %} connects to the [Imou Open Platform](https://open.imoulife.com/) using your App ID and App secret. Devices linked to your platform account are discovered automatically. Channel devices expose **Live view SD** and **Live view HD** camera entities, and supported actions are exposed as button entities in Home Assistant. +The **Imou** {% term integration %} connects to the [Imou Open Platform](https://open.imoulife.com/) using your App ID and App secret. Devices linked to your platform account are discovered automatically. Channel devices expose **Live view SD** and **Live view HD** camera entities, supported actions are exposed as button entities, and supported toggles are exposed as switch entities in Home Assistant. ## Supported devices -The integration supports Imou devices that are already added to your Imou Open Platform account and reported by the cloud API. Supported button entities depend on each device type (for example, PTZ controls are only created when the device supports PTZ). +The integration supports Imou devices that are already added to your Imou Open Platform account and reported by the cloud API. Supported button and switch entities depend on each device type (for example, PTZ controls are only created when the device supports PTZ). Add or remove devices in the Imou Open Platform or Imou app; new devices are picked up on the next data refresh. @@ -84,6 +86,19 @@ The integration exposes button entities when the cloud API reports that the acti - **Mute**: Silence alarm audio on supported gateway devices. - **Restart**: Remotely restart the device (shown with the restart device class when supported). +### Switches + +When the cloud API reports that the toggle is supported for a device, the integration exposes the following switch entities: + +- **Abnormal sound alarm**: Toggle abnormal sound detection alarms. +- **Audio recording**: Toggle audio recording on supported cameras. +- **Human detection**: Toggle human detection on supported cameras. +- **Indicator light**: Toggle the device status indicator LED on supported models. +- **Motion detection**: Toggle motion detection on supported cameras. +- **Plug switch**: Control the main power relay on supported IoT socket devices. +- **Privacy mode**: Enable privacy mode that closes or disables the camera lens on supported models. +- **White light**: Manually toggle the camera white LED illuminator on supported models. + ## Data updates The integration {% term polling polls %} Imou cloud APIs every 2 minutes to refresh the device list and online status. New devices on your account are added automatically; devices removed from your account are removed from Home Assistant. @@ -106,6 +121,10 @@ The integration polls the platform regularly to discover devices and refresh onl Buttons are unavailable when a device is offline or no longer on your account. Ensure the device has power and network connectivity and appears online in the Imou app. +### A switch is unavailable + +Switches are unavailable when a device is offline or no longer on your account. Ensure the device has power and network connectivity and appears online in the Imou app. + ## Removing the integration This integration follows standard integration removal. From 222c3967453687a8eaa50ffebdb4160e0fbdfbac Mon Sep 17 00:00:00 2001 From: Brett Adams Date: Sat, 4 Jul 2026 03:31:35 +1000 Subject: [PATCH 037/123] Document seat cooler select entities for Teslemetry (#46635) --- source/_integrations/teslemetry.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/teslemetry.markdown b/source/_integrations/teslemetry.markdown index f60bd1c12254..9081fb39e4f6 100644 --- a/source/_integrations/teslemetry.markdown +++ b/source/_integrations/teslemetry.markdown @@ -143,6 +143,8 @@ Entities in the device tracker platform specifically require the `Vehicle locati |Media player|Media player|Yes| |Number|Charge current|Yes| |Number|Charge limit|Yes| +|Select|Seat cooler front left|Yes| +|Select|Seat cooler front right|Yes| |Select|Seat heater front left|Yes| |Select|Seat heater front right|Yes| |Select|Seat heater rear center|No| From 3918dcbe73e64d5ed5e259c47d5b4eaa2a1862d4 Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Fri, 3 Jul 2026 18:31:55 +0100 Subject: [PATCH 038/123] Add select charger mode to V2C (#45199) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/v2c.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/_integrations/v2c.markdown b/source/_integrations/v2c.markdown index d01cea35311f..b05d24520f2d 100644 --- a/source/_integrations/v2c.markdown +++ b/source/_integrations/v2c.markdown @@ -14,6 +14,7 @@ ha_platforms: - diagnostics - light - number + - select - sensor - switch ha_integration_type: device @@ -26,6 +27,7 @@ There is currently support for the following platforms within Home Assistant: - [Binary sensor](#binary-sensor) - [Sensor](#sensor) - [Number](#number) +- [Select](#select) - [Light](#light) - [Switch](#switch) @@ -61,6 +63,11 @@ The V2C integration currently exposes the following number entity: - intensity: current used to charge your vehicle +## Select + +The V2C integration currently exposes the following select entity: + +- charge_mode: Sets the charger mode to either single-phase or three-phase. ## Light The V2C integration currently exposes the following lights: From 1ebe29e002d4c8b2e3ad7bd05f9f1e46af91428c Mon Sep 17 00:00:00 2001 From: Brian Tajuddin Date: Fri, 3 Jul 2026 10:32:31 -0700 Subject: [PATCH 039/123] Add sensor platform documentation for Cielo Home integration (#45753) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/cielo_home.markdown | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/_integrations/cielo_home.markdown b/source/_integrations/cielo_home.markdown index 76f52eb3f03f..673453634cb2 100644 --- a/source/_integrations/cielo_home.markdown +++ b/source/_integrations/cielo_home.markdown @@ -3,6 +3,7 @@ title: Cielo Home description: Instructions on how to integrate Cielo smart thermostats in Home Assistant. ha_category: - Climate + - Sensor ha_iot_class: Cloud Polling ha_release: 2026.6 ha_config_flow: true @@ -12,6 +13,7 @@ ha_codeowners: ha_domain: cielo_home ha_platforms: - climate + - sensor ha_integration_type: hub ha_quality_scale: bronze --- @@ -61,7 +63,7 @@ If the message **This key is already used** appears, you must first revoke the o {% include integrations/config_flow.md %} -If authentication succeeds, Home Assistant will automatically create the climate entities for all supported Cielo devices in your account. +If authentication succeeds, Home Assistant will automatically create the climate and sensor entities for all supported Cielo devices in your account. {% note %} @@ -107,6 +109,13 @@ Some fan modes or swing positions depend on the device’s remote configuration. - **Temperature control**: Set the temperature setpoint. - **Presets**: Home, Away, Sleep & pets (where supported and defined) +### Sensors + +Each supported device also exposes sensor entities that appear under the same device as the climate entity: + +- **Temperature**: Reports the current indoor temperature from the device. The unit (°C or °F) follows the device setting. +- **Humidity**: Reports the current humidity from the device, in percent. + ## Data updates This integration relies on cloud {% term polling %}, with data refreshed approximately every 120 seconds (2 minutes). If the Cielo API or your device becomes unavailable, Home Assistant will automatically retry. From d41f5a6a8767671da6450ca9a564760856d1ff93 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Fri, 3 Jul 2026 23:24:04 -0700 Subject: [PATCH 040/123] Add llama.cpp documentation (#46664) --- source/_integrations/llama_cpp.markdown | 117 ++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 source/_integrations/llama_cpp.markdown diff --git a/source/_integrations/llama_cpp.markdown b/source/_integrations/llama_cpp.markdown new file mode 100644 index 000000000000..98b6cca5662b --- /dev/null +++ b/source/_integrations/llama_cpp.markdown @@ -0,0 +1,117 @@ +--- +title: llama.cpp +description: Instructions on how to integrate llama.cpp (and other OpenAI-compatible servers) as a conversation agent. +ha_category: + - AI + - Voice +ha_release: 2026.7 +ha_iot_class: Local Polling +ha_config_flow: true +ha_domain: llama_cpp +ha_integration_type: service +ha_platforms: + - conversation +related: + - docs: /voice_control/voice_remote_expose_devices/ + title: Exposing entities to Assist + - docs: /voice_control/assist_create_open_ai_personality/ + title: Create an AI personality +ha_quality_scale: bronze +ha_codeowners: + - '@allenporter' +--- + +The **llama.cpp** {% term integration %} allows you to use a local or remote server that implements the OpenAI-compatible chat completions API as a conversation agent in Home Assistant. + +This integration lets you connect with self-hosted models running on servers such as llama.cpp, llama-cpp-python, vLLM, DeepSeek, or other compatible API backends. + +{% note %} +If you are using Ollama, you should prefer the official [Ollama](/integrations/ollama/) integration. +{% endnote %} + +{% note %} +If you are using OpenRouter, you should prefer the official [OpenRouter](/integrations/open_router/) integration. +{% endnote %} + +Controlling Home Assistant is done by providing the AI access to the Assist API of Home Assistant. You can control what devices and entities it can access from the {% my voice_assistants title="exposed entities page" %}. The AI can provide you information about your devices and control them. + +This integration does not integrate with [sentence triggers](/docs/automation/trigger/#sentence-trigger). + +## Prerequisites + +This integration requires an external server running an OpenAI-compatible API. Standard examples of compatible servers and their typical URLs include: + +- **llama.cpp**: Running on `http://localhost:8080/v1` or another port of your choosing. See the [llama.cpp quick start guide](https://github.com/ggml-org/llama.cpp/tree/master#quick-start) for more details. +- **llama-cpp-python**: Running on `http://localhost:8000/v1` or another port of your choosing. See the [llama-cpp-python installation guide](https://llama-cpp-python.readthedocs.io/en/latest/#installation) for more details. +- **vLLM**: Running on `http://localhost:8000/v1` or another port of your choosing. See the [vLLM installation guide](https://docs.vllm.ai/en/latest/getting_started/installation/) for more details. +- **DeepSeek**: Using the cloud API URL `https://api.deepseek.com`. + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +URL: + description: "The base URL of your running OpenAI-compatible server. For example, `http://localhost:8080/v1`." +API key: + description: "The API key to use when connecting to the server. This is optional if your server does not require authentication." +{% endconfiguration_basic %} + +Once the connection is established, you will be prompted to select the chat model to use. + +{% include integrations/option_flow.md %} + +The conversation agent has the following configuration options: + +{% configuration_basic %} +Instructions: + description: "Instructions for the AI on how it should respond to your requests. It is written using [Home Assistant Templating](/docs/templating/)." +Control Home Assistant: + description: "Select the level of control over Home Assistant. The model can only control or provide information about entities that are [exposed](/voice_control/voice_remote_expose_devices/) to it." +Recommended model settings: + description: "Select whether to use recommended model settings. If enabled, default values are used for max tokens, temperature, and top P." +{% endconfiguration_basic %} + +If you choose not to use the recommended settings, you can configure the following options: + +{% configuration_basic %} +Model: + description: "The language model used for text generation." +Maximum tokens to return in response: + description: "The maximum number of tokens that the AI model should generate in its completion of the prompt." +Temperature: + description: "A value that determines the level of creativity and risk-taking the model should use when generating text. A higher temperature means the model is more likely to generate unexpected results, while a lower temperature results in more deterministic results." +Top P: + description: "An alternative to temperature, top P determines the proportion of the most likely word choices the model should consider when generating text." +{% endconfiguration_basic %} + +## Supported functionality + +The **llama.cpp** integration provides the following entities: + +- **Conversation agent**: A conversation agent that can handle text-based queries, respond to requests, and control Home Assistant devices when configured to do so + +## Known limitations + +This integration requires an external server that implements the OpenAI-compatible chat completions API. Features that depend on specific proprietary API properties (such as billing or usage tracking) are not supported. + +## Troubleshooting + +### Cannot connect to the server + +#### Symptom: Connection failed or timed out during setup + +When configuring the integration, you receive a connection error. + +#### Resolution + +To resolve this issue, try the following steps: + +1. Confirm the server is running and reachable from the Home Assistant host. +2. Verify that the URL contains the correct protocol (HTTP or HTTPS), hostname, port, and path (such as `/v1`). +3. Ensure any firewall or network settings do not block connections between Home Assistant and the server. +4. If authentication is required, verify that the API key is correct. + +## Removing the integration + +This integration follows standard integration removal. No extra steps are required. + +{% include integrations/remove_device_service.md %} From 7069e56a62d33dd00b0a6a44287684473a9751f3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 4 Jul 2026 21:14:15 +0200 Subject: [PATCH 041/123] Document per-API MCP server endpoint (#46665) Co-authored-by: Claude --- source/_integrations/mcp_server.markdown | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/source/_integrations/mcp_server.markdown b/source/_integrations/mcp_server.markdown index 548071d27d0b..c40aabacece6 100644 --- a/source/_integrations/mcp_server.markdown +++ b/source/_integrations/mcp_server.markdown @@ -67,6 +67,23 @@ will likely continue to evolve. The Home Assistant MCP server is exposed as `/api/mcp` and requires the client to provide an authentication token. +### Exposing a specific LLM API + +The `/api/mcp` endpoint serves the LLM API you select when you set up the +integration. If you have more than one LLM API available, you can also connect a +client to a specific one by adding its ID to the URL: + +`/api/mcp/` + +For example, the built-in Assist API is always available at `/api/mcp/assist`. +Point your MCP client at this URL in the same way you would use the base +`/api/mcp` endpoint. If you request an API ID that does not exist, Home Assistant +responds with a 404 Not Found error. + +Connecting to any API other than Assist requires the authenticated user to be an +administrator. The Assist API stays available to non-administrator users, just +like the base `/api/mcp` endpoint. + ### Access control #### OAuth From 37cb48c73793b6b69e5dde8946750d56187ae7cd Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 6 Jul 2026 07:55:11 +0200 Subject: [PATCH 042/123] Add Modbus Connection integration documentation (#46632) Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- .../_integrations/modbus_connection.markdown | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 source/_integrations/modbus_connection.markdown diff --git a/source/_integrations/modbus_connection.markdown b/source/_integrations/modbus_connection.markdown new file mode 100644 index 000000000000..d053a6285948 --- /dev/null +++ b/source/_integrations/modbus_connection.markdown @@ -0,0 +1,74 @@ +--- +title: Modbus Connection +description: Instructions on how to set up a shared Modbus connection in Home Assistant. +ha_category: + - Hub +ha_release: 2026.7 +ha_iot_class: Local Polling +ha_config_flow: true +ha_codeowners: + - '@home-assistant/core' +ha_domain: modbus_connection +ha_integration_type: hub +ha_quality_scale: bronze +--- + +The **Modbus Connection** {% term integration %} owns a single [Modbus](https://en.wikipedia.org/wiki/Modbus) connection to one physical link — a TCP endpoint or a serial device — and shares it with other integrations. + +Modbus is a serial communications protocol widely used in industrial and building automation to talk to devices such as power meters, PLCs, HVAC controllers, and inverters. A physical Modbus link usually accepts only one client at a time, so it cannot be opened independently by several integrations at once. + +This integration solves that by owning the connection in one place. You set up each connection once, and then point Modbus device integrations at it. This is the UI-based way to use Modbus in Home Assistant. If you prefer to register Modbus entities manually in YAML, use the [Manual Modbus](/integrations/modbus/) {% term integration %} instead. + +This {% term integration %} does not create any entities of its own. It only provides the shared connection that device integrations consume. + +## Prerequisites + +You need one of the following ways to reach your Modbus network: + +- For a *network* connection: a Modbus TCP gateway or a device that speaks Modbus TCP (or RTU-over-TCP), reachable by hostname or IP address on your network. +- For a *serial* connection: a serial (RTU) device connected to the machine running Home Assistant, for example a USB-to-RS485 adapter appearing as `/dev/ttyUSB0`. A network serial proxy is also supported and appears in the serial device list. + +{% include integrations/config_flow.md %} + +When you add the integration, you first choose how the Modbus network is connected: + +- **Modbus TCP**: for Modbus TCP and RTU-over-TCP connections. +- **Serial (including serial proxies and networked connections)**: for Modbus RTU connections over a serial port. + +### Modbus TCP + +{% configuration_basic %} +Host: + description: "The hostname or IP address of the Modbus gateway or device." +Port: + description: "The TCP port the Modbus gateway listens on (default 502)." +{% endconfiguration_basic %} + +### Serial + +{% configuration_basic %} +Device: + description: "The serial port the Modbus device is connected to, for example `/dev/ttyUSB0`. Local serial ports and network serial proxies are listed." +Baud rate: + description: "The serial baud rate the device communicates at (default 9600)." +Parity: + description: "The serial parity: None, Even, or Odd (default None)." +Stop bits: + description: "The number of stop bits: 1 or 2 (default 1)." +Byte size: + description: "The number of data bits: 7 or 8 (default 8)." +{% endconfiguration_basic %} + +You can add the integration more than once to set up several connections, for example one per gateway or serial port. Home Assistant blocks duplicate connections, so you cannot set up the same endpoint twice. + +## Using the connection + +After you set up a connection, add a Modbus device integration and point it at this connection. Each device integration borrows the shared connection instead of opening its own, which lets multiple devices on the same link coexist without conflicting over it. + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} + +Before removing a Modbus connection, remove any device integrations that depend on it. Otherwise, those integrations lose their connection and stop working. From 65d2d91c91e36d97e1f6f3b07c97220bdd46fbbc Mon Sep 17 00:00:00 2001 From: Hai-Nam Nguyen Date: Mon, 6 Jul 2026 10:58:42 +0200 Subject: [PATCH 043/123] Document Hypontech plant status binary sensor (#46363) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: c0ffeeca7 --- source/_integrations/hypontech.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/hypontech.markdown b/source/_integrations/hypontech.markdown index 4cc637b35313..1ee1a0d4fe60 100644 --- a/source/_integrations/hypontech.markdown +++ b/source/_integrations/hypontech.markdown @@ -2,6 +2,7 @@ title: Hypontech Cloud description: Instructions on how to integrate Hypontech Cloud solar inverters within Home Assistant. ha_category: + - Binary sensor - Energy - Sensor ha_release: 2026.3 @@ -11,6 +12,7 @@ ha_codeowners: - '@jcisio' ha_domain: hypontech ha_platforms: + - binary_sensor - sensor ha_integration_type: hub ha_quality_scale: bronze @@ -70,6 +72,12 @@ All sensors are updated every minute. If there is no current clamp and no batter - Total power = PV power + Battery power - Load power = Total power + Grid power +### Binary sensors + +Each Plant device has the following diagnostic binary sensor: + +- **Status**: On when Hypontech Cloud reports the plant as online, and off otherwise. + ## Data updates The integration polls data from the Hypontech Cloud every 60 seconds. From 4dee5e0cf26b9a852191fd9ab35c7d13a7e61bef Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Mon, 6 Jul 2026 11:37:58 +0200 Subject: [PATCH 044/123] Add more documentation details to Alexa Devices (#46681) --- source/_integrations/alexa_devices.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_integrations/alexa_devices.markdown b/source/_integrations/alexa_devices.markdown index 54ed035fa52e..ead078134457 100644 --- a/source/_integrations/alexa_devices.markdown +++ b/source/_integrations/alexa_devices.markdown @@ -151,7 +151,7 @@ All Alexa-enabled devices have timestamp sensors that show the next scheduled al In addition to sensors, you can use the following entities: -- **Button** - Execute Alexa routines +- **Button** - Execute Alexa routines, restart the device - **Media Player** - Play audio/video from several sources - **Notify** - Speak and Announce notifications - **Select** - Select Drop In status @@ -293,6 +293,7 @@ You see something similar to - `Error retrieving devices state: Too many requests for path ['listEndpoints']` - `Error retrieving data: CannotRetrieveData('Request failed: Bad Request')` - `Failed to obtain notification data. Timers and alarms have not been updated` +- `Failed to refresh communications settings for device XXXXXX, used cached values.` In logs. From 209fe1ab9d5b74d84955ddaf4ab2ec8adca85a09 Mon Sep 17 00:00:00 2001 From: TimL Date: Tue, 7 Jul 2026 02:25:37 +1000 Subject: [PATCH 045/123] Update SMLIGHT Infrared section with IR receiver (#46559) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/smlight.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_integrations/smlight.markdown b/source/_integrations/smlight.markdown index 17b158b66f58..74879856de28 100644 --- a/source/_integrations/smlight.markdown +++ b/source/_integrations/smlight.markdown @@ -133,7 +133,10 @@ SLZB-Ultima devices support additional peripherals not found on other SLZB adapt #### Infrared -- **IR Emitter**: This entity can be used by other integrations as an [Infrared](/integrations/infrared/) proxy to send IR commands through the SLZB-Ultima device. For example, you can use the [LG Infrared](/integrations/lg_infrared/) integration with this entity type to control your TV. +- **Infrared emitter** - Allows other integrations to send infrared commands. +- **Infrared receiver** - Allows other integrations to receive infrared signals. + +For more details, see the [Infrared integration](/integrations/infrared/). ## Bluetooth remote adapter (proxy) From df6b21c05bd81fedb49d1e0b4718c0877be24f2c Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Tue, 7 Jul 2026 12:27:52 -0400 Subject: [PATCH 046/123] Document vizio remote key aliases (#44642) --- source/_integrations/vizio.markdown | 72 +++++++++++++++-------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/source/_integrations/vizio.markdown b/source/_integrations/vizio.markdown index 56898c199d8f..147f755cfdf7 100644 --- a/source/_integrations/vizio.markdown +++ b/source/_integrations/vizio.markdown @@ -217,45 +217,45 @@ pyvizio --ip=0 get-apps-list ## Remote -The VIZIO SmartCast integration automatically creates a remote entity for each configured device (TVs and speakers). You can use it to send remote control commands via the `remote.send_command` action. Commands are case-insensitive. +The VIZIO SmartCast integration automatically creates a remote entity for each configured device (TVs and speakers). You can use it to send remote control commands via the `remote.send_command` action. Commands are case-insensitive. You can use either the native key name (for example, `vol_up`) or a human-friendly alias (for example, `volume_up`). ### Available commands #### TV commands -| Command | -| :------ | -| `back` | -| `cc_toggle` | -| `ch_down` | -| `ch_prev` | -| `ch_up` | -| `down` | -| `exit` | -| `home` | -| `info` | -| `input_next` | -| `left` | -| `left2` | -| `menu` | -| `mute_off` | -| `mute_on` | -| `mute_toggle` | -| `ok` | -| `pause` | -| `pic_mode` | -| `pic_size` | -| `play` | -| `pow_off` | -| `pow_on` | -| `pow_toggle` | -| `right` | -| `seek_back` | -| `seek_fwd` | -| `smartcast` | -| `up` | -| `vol_down` | -| `vol_up` | +| Command | Additional aliases | +| :------ | :------ | +| `back` | | +| `cc_toggle` | `closed_captions`, `cc` | +| `ch_down` | `channel_down` | +| `ch_prev` | `previous_channel` | +| `ch_up` | `channel_up` | +| `down` | | +| `exit` | | +| `home` | | +| `info` | | +| `input_next` | `next_input` | +| `left` | | +| `left2` | | +| `menu` | | +| `mute_off` | | +| `mute_on` | | +| `mute_toggle` | `mute`, `toggle_mute` | +| `ok` | `enter`, `select` | +| `pause` | | +| `pic_mode` | `picture_mode` | +| `pic_size` | `picture_size` | +| `play` | | +| `pow_off` | `off`, `power_off` | +| `pow_on` | `on`, `power_on` | +| `pow_toggle` | `power_toggle`, `toggle_power`, `power` | +| `right` | | +| `seek_back` | `reverse`, `rewind` | +| `seek_fwd` | `forward`, `fast_forward`, `ff` | +| `smartcast` | | +| `up` | | +| `vol_down` | `volume_down` | +| `vol_up` | `volume_up` | #### Speaker commands @@ -263,6 +263,8 @@ Speakers support a subset of the commands above: `mute_off`, `mute_on`, `mute_toggle`, `pause`, `play`, `pow_off`, `pow_on`, `pow_toggle`, `vol_down`, `vol_up` +Aliases that map to these commands (for example, `mute`, `volume_up`, `on`, `off`) also work on speakers. + ### Examples Send a single command: @@ -297,7 +299,7 @@ target: entity_id: remote.vizio_smartcast data: command: - - vol_up + - volume_up num_repeats: 5 delay_secs: 0.4 ``` From 7cc4a09e4ee8b59c58652f2126c666f9e8c1f978 Mon Sep 17 00:00:00 2001 From: Crocmagnon Date: Tue, 7 Jul 2026 18:28:17 +0200 Subject: [PATCH 047/123] data_grand_lyon: add tcl park and rides (#46403) --- source/_integrations/data_grand_lyon.markdown | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/source/_integrations/data_grand_lyon.markdown b/source/_integrations/data_grand_lyon.markdown index 6f87f39c5414..612be40861fc 100644 --- a/source/_integrations/data_grand_lyon.markdown +++ b/source/_integrations/data_grand_lyon.markdown @@ -24,6 +24,7 @@ With this integration, you can: - Track upcoming departure times at transit stops. - Monitor real-time bike and dock availability at [Vélo'v](https://velov.grandlyon.com/) bike-sharing stations. +- Monitor real-time parking space availability at TCL park & ride (P+R) facilities. ## Prerequisites @@ -46,7 +47,7 @@ Password: description: "Your password on data.grandlyon.com." {% endconfiguration_basic %} -After setting up the integration, you can add transit stops and Vélo'v bike-sharing stations as sub-entries from the integration's configuration page. +After setting up the integration, you can add transit stops, Vélo'v bike-sharing stations, and park & ride facilities as sub-entries from the integration's configuration page. ### Adding a transit stop @@ -73,6 +74,17 @@ Station: description: "The Vélo'v station identifier. You can find station IDs on the [Grand Lyon open data platform](https://data.grandlyon.com/portail/fr/jeux-de-donnees/stations-velo-v-metropole-lyon/donnees). Zoom in on the map and select a station. The ID will be displayed at the top of the panel displayed on the right of the screen. The field is called **idstation**." {% endconfiguration_basic %} +### Adding a park & ride + +1. Go to {% my integrations title="**Settings** > **Devices & services**" %} and select the **Data Grand Lyon** integration. +2. Select **Add park & ride**. +3. Select the park & ride you want to monitor. You can search the list by name, or enter a park & ride ID directly. + +{% configuration_basic %} +Park & ride: + description: "The park & ride identifier. You can find park & ride IDs on the [Grand Lyon open data platform](https://data.grandlyon.com/portail/fr/jeux-de-donnees/parcs-relais-reseau-transports-commun-lyonnais-disponibilites-temps-reel/donnees). Zoom in on the map and select a park & ride. The ID will be displayed in the panel on the right of the screen." +{% endconfiguration_basic %} + ## Supported functionality ### Entities @@ -142,6 +154,25 @@ For each Vélo'v station you add, the following sensor entities are created: - **Electrical removable battery bikes** - **Description**: The number of electrical bikes with a removable battery available at the station. Disabled by default. +#### Park & ride sensors + +For each park & ride you add, the following sensor entities are created: + +- **Available parking spaces** + - **Description**: The number of parking spaces currently available at the facility. + +- **Capacity** + - **Description**: The total number of parking spaces at the facility. + +- **Accessible parking spaces** + - **Description**: The number of parking spaces reserved for people with reduced mobility. Disabled by default. + +- **Opening hours** + - **Description**: The opening hours of the facility. Disabled by default. + +- **Name** + - **Description**: The name of the park & ride facility. Disabled by default. + ## Examples ### Refresh data more frequently during a time window @@ -205,6 +236,10 @@ Make sure the line identifier and stop ID are correct. You can verify these on t Make sure the station ID is correct. You can verify it on the [Grand Lyon open data platform](https://data.grandlyon.com/portail/fr/jeux-de-donnees/stations-velo-v-metropole-lyon/donnees). +### Park & ride shows no data + +Make sure the park & ride ID is correct. You can verify it on the [Grand Lyon open data platform](https://data.grandlyon.com/portail/fr/jeux-de-donnees/parcs-relais-reseau-transports-commun-lyonnais-disponibilites-temps-reel/donnees). + ## Removing the integration This integration follows standard integration removal. From b2e7614f353bb7ca54cef432035328cf227b5b71 Mon Sep 17 00:00:00 2001 From: TimL Date: Wed, 8 Jul 2026 02:28:51 +1000 Subject: [PATCH 048/123] Document options flow for SMLIGHT ble scanner mode (#46705) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/smlight.markdown | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/_integrations/smlight.markdown b/source/_integrations/smlight.markdown index 74879856de28..38a45b69f256 100644 --- a/source/_integrations/smlight.markdown +++ b/source/_integrations/smlight.markdown @@ -142,7 +142,13 @@ For more details, see the [Infrared integration](/integrations/infrared/). SMLIGHT SLZB U-series devices running SLZB-OS can act as a Bluetooth remote adapter (proxy). They scan for and forward Bluetooth advertisement data to Home Assistant. -To use the Bluetooth remote adapter, you must enable the Bluetooth Low Energy (BLE) remote adapter in the SMLIGHT device's web UI. Once enabled, Home Assistant automatically receives the forwarded Bluetooth advertisement data. No additional configuration is required in Home Assistant. +To use the Bluetooth remote adapter, select a [scanning mode](/integrations/bluetooth/#scanning-modes) in the integration options: + +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}. +2. Select **Configure** on the **SMLIGHT SLZB** card. +3. Select a **Bluetooth scanning mode**. + +Setting a mode other than **Disabled** automatically enables the Bluetooth remote adapter on the SMLIGHT device. {% tip %} SMLIGHT devices do _not_ support proxying active (GATT) connections. @@ -169,7 +175,6 @@ Certain advanced features are not supported directly within this integration and - Configuring security settings. - Adjusting network settings. - Setting up the WireGuard VPN client. -- Enable BLE proxy mode on SLZB-U devices. ## Troubleshooting From 2751e8aed360805a35aba8bdb591f9d049839b15 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Tue, 7 Jul 2026 11:17:15 -0700 Subject: [PATCH 049/123] Add Google Health integration documentation (#46634) --- source/_integrations/google_health.markdown | 181 ++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 source/_integrations/google_health.markdown diff --git a/source/_integrations/google_health.markdown b/source/_integrations/google_health.markdown new file mode 100644 index 000000000000..f4a38038d1c3 --- /dev/null +++ b/source/_integrations/google_health.markdown @@ -0,0 +1,181 @@ +--- +title: Google Health +description: Instructions on how to integrate Google Health within Home Assistant. +ha_release: 2026.7 +ha_category: + - Health +ha_iot_class: Cloud Polling +ha_domain: google_health +ha_codeowners: + - '@allenporter' +ha_config_flow: true +ha_platforms: + - sensor +ha_integration_type: service +related: + - url: https://developers.google.com/health-api + title: Google Health API + - url: https://console.cloud.google.com/apis/library/health.googleapis.com + title: Google Developers Console +--- + +The **Google Health** {% term integration %} allows you to expose health and fitness data from Google Health (including Fitbit, Pixel Watch, and other devices connected to your Google Account) to Home Assistant. + +## Prerequisites + +You need to configure developer credentials to allow Home Assistant to access your Google Account. These credentials are the same as the ones for [Google Photos](/integrations/google_photos), [Nest](/integrations/nest), [Google Tasks](/integrations/google_tasks), and [Google Mail](/integrations/google_mail). + +If you have already set up the correct credentials, you can enable the API and then skip the consent screen and credential creation steps. + +{% details "Generate client ID and client secret" %} + +This section explains how to enable the API, configure the consent screen, and generate a client ID and client secret on the Google Developers Console. + +1. First, go to the Google Developers Console to enable the [Google Health API](https://console.cloud.google.com/apis/library/health.googleapis.com). +2. Select a project and select **Continue**. Verify that the API is enabled. +3. Go to the [Branding page](https://console.cloud.google.com/auth/branding) in the Google Auth Platform Console. +4. If prompted to configure OAuth, select **Get started** and follow the setup wizard. When the wizard asks for the user type, select **External**, and continue once the OAuth consent configuration is created. +5. Select **Branding** in the left sidebar. Fill in the required fields: + - **App name**: Enter a name (like *Home Assistant*). This is shown during the OAuth login flow. + - **User support email**: Select your Google Account email. + - **Developer contact email**: Enter your email address. + Leave all other fields empty to avoid triggering Google's verification process. Select **Save**. +6. Select **Audience** in the left sidebar. + - Under **User type**, confirm it shows **External**. + - Under **Test users**, select **+ Add users** and add your Google Account email address. Select **Save**. +7. Under **Publishing status**, select **Publish app** to set the status to **In production**. Make sure the status is not **Testing**, or your authentication token will expire every 7 days. +8. Select **Credentials** in the left sidebar. +9. Select **Create Credentials** at the top of the page, then select **OAuth client ID**. +10. Set the Application type to **Web application** and give these credentials a name (like *Home Assistant Credentials*). +11. Under **Authorized redirect URIs**, enter `https://my.home-assistant.io/redirect/oauth` and select **Create**. This is not a placeholder and is the URI that must be used. +12. Copy the **Client ID** and **Client Secret** from the pop-up, or select the pencil icon next to your client ID to view them later. + +{% enddetails %} + +{% include integrations/config_flow.md %} + +The integration setup will next give you instructions to enter the [Application Credentials](/integrations/application_credentials/) (OAuth Client ID and Client Secret) and authorize Home Assistant to access your Google Health data. + +{% details "OAuth and authorization steps" %} + +1. Continue through the steps of selecting the Google Account you want to authorize. +2. You will be asked to grant access to specific data in your Google Health account. The integration will dynamically adjust based on the permissions you grant: + - **Profile** (required): Allows Home Assistant to verify your account identity. + - **Activity and fitness** (optional): Granting this scope creates daily steps and distance sensors. + - **Health metrics and measurements** (optional): Granting this scope creates weight and resting heart rate sensors. +3. You may get a message telling you that the app has not been verified. Acknowledge this to proceed. +4. You can now see the details of what you are authorizing Home Assistant to access with options at the bottom. Select **Continue**. +5. The page will now display **Link account to Home Assistant?**, noting **Your instance URL**. If this is not correct, refer to [My Home Assistant](/integrations/my). If everything looks good, select **Link Account**. +6. You may close the window and return to Home Assistant, where you should see a **Success!** message. + +{% enddetails %} + +## Supported functionality + +The **Google Health** integration provides the following entities: + +### Sensors + +- **Distance** + - **Description**: Daily distance in meters. + - **Available for**: All authorized accounts that grant the activity and fitness scope. +- **Resting heart rate** + - **Description**: Daily resting heart rate in beats per minute (bpm). + - **Available for**: All authorized accounts that grant the health metrics and measurements scope. +- **Steps** + - **Description**: Daily steps count. + - **Available for**: All authorized accounts that grant the activity and fitness scope. +- **Weight** + - **Description**: Body weight in kilograms (kg). + - **Available for**: All authorized accounts that grant the health metrics and measurements scope. + +## Google Health automation examples + +The real power of this integration is automating your home environment or notifications based on your health metrics. Here are a few ideas to get you started. + +{% include docs/paste_yaml_tip.md %} + +### Automation: Step goal reminder + +Send a notification in the evening if you have not met your daily step goal. + +- **Trigger**: Time: 20:00 (8:00 PM) +- **Condition**: Numeric state: steps sensor is below your goal (for example, 10,000 steps) +- **Action**: Send a notification to your mobile phone + +{% details "YAML example for step goal reminder" %} + +{% example %} +automation: | + alias: "Reminder to meet daily step goal" + triggers: + - trigger: time + at: "20:00:00" + conditions: + - condition: numeric_state + entity_id: sensor.google_health_steps + below: 10000 + actions: + - action: notify.mobile_app_your_phone + data: + message: > + You have only completed + {{ states('sensor.google_health_steps') }} steps today. + Time for a short walk! +{% endexample %} + +{% enddetails %} + +### Automation: Resting heart rate alert + +Notify you if your daily resting heart rate goes above a certain threshold (for example, 80 bpm), which could indicate fatigue or stress. + +- **Trigger**: State: resting heart rate sensor state changes +- **Condition**: Numeric state: resting heart rate is above 80 bpm +- **Action**: Send a notification + +{% details "YAML example for resting heart rate alert" %} + +{% example %} +automation: | + alias: "Alert on high resting heart rate" + triggers: + - trigger: state + entity_id: sensor.google_health_resting_heart_rate + conditions: + - condition: numeric_state + entity_id: sensor.google_health_resting_heart_rate + above: 80 + actions: + - action: notify.mobile_app_your_phone + data: + message: > + Your resting heart rate is higher than usual at + {{ states('sensor.google_health_resting_heart_rate') }} + bpm. Make sure to rest! +{% endexample %} + +{% enddetails %} + +## Data updates + +The integration updates sensors on different intervals based on the data type: + +- Activity sensors (Steps and Distance) are updated every 15 minutes. +- Body sensors (Weight and Resting heart rate) are updated every hour. + +## Troubleshooting + +### Resetting a broken or incorrect configuration + +If the Google Health integration was initially configured incorrectly, you can delete the credentials in the [Application Credentials](/integrations/application_credentials/) user interface and start the setup again. + +### Connection failed after authorization + +If authorization appears to succeed but Home Assistant returns a connection error, verify that you granted the required **Profile** permission. Home Assistant requires the profile scope to verify your account identity and setup the integration. + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} From ab71f71cc1aae66f760b4630c5377d786addc930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ab=C3=ADlio=20Costa?= Date: Wed, 8 Jul 2026 12:43:58 +0100 Subject: [PATCH 050/123] Add get_prices_for_date service action to OMIE (#46702) Co-authored-by: Claude Opus 4.8 (1M context) --- .../omie.get_prices_for_date.markdown | 106 ++++++++++++++++++ source/_integrations/omie.markdown | 2 + 2 files changed, 108 insertions(+) create mode 100644 source/_actions/omie.get_prices_for_date.markdown diff --git a/source/_actions/omie.get_prices_for_date.markdown b/source/_actions/omie.get_prices_for_date.markdown new file mode 100644 index 000000000000..9c6d21efa05a --- /dev/null +++ b/source/_actions/omie.get_prices_for_date.markdown @@ -0,0 +1,106 @@ +--- +title: "Get prices for date" +action: omie.get_prices_for_date +domain: omie +description: "Retrieves OMIE electricity spot prices for a specific date, for Spain, Portugal, or both." +--- + +Use this action to retrieve the day-ahead electricity spot prices for a specific date, for Spain, Portugal, or both countries. + +The OMIE sensors always reflect the current price. This action lets you fetch the prices for any published date instead, which is useful when you want to look ahead. For example, you can compare tomorrow's prices or schedule an appliance to run during the cheapest hours. + +This action returns its result in a response variable, which you can use in later steps of the same automation or script. + +Prices for the next day are published daily at around 13:30 CET/CEST. If you request a date that has not been published yet, the action reports that the prices are not available. Similarly if you request a date that is previous to the date when quarter-hourly prices became available, the action reports that no prices exist for that date and tells you the earliest date you can request. + +{% include actions/ui_header.md %} + +To get prices from an automation or a script: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation or script, or select **Create automation** > **Create new automation**. +3. If you're setting up a new automation, add a trigger in the **When** section. Scripts don't need a trigger. They run when something else calls them. +4. In the **Then do** section, select **Add action**. +5. From the search box, search for and select **OMIE - Spain and Portugal electricity prices: Get prices for date**. +6. Select the **Date** you want, and choose the **Countries** to get prices for. +7. In the **Response variable** field, enter a name to store the data in, such as `prices`. +8. Select **Save**. + +### Options in the UI + +{% options_ui %} +Date: + description: The date to get the prices for. + required: true +Countries: + description: The countries to get the prices for. Choose Spain, Portugal, or both. Both are selected by default. + required: true +{% endoptions_ui %} + +{% include actions/yaml_header.md %} + +In YAML, refer to this action as `omie.get_prices_for_date`. Store the result in a response variable so you can use it in later steps: + +{% example %} +action: | + action: omie.get_prices_for_date + data: + date: "2026-07-08" + countries: + - es + - pt + response_variable: prices +{% endexample %} + +This fetches the prices for both Spain and Portugal on the given date. + +### Options in YAML + +{% options_yaml %} +date: + description: > + The date to get the prices for, in YYYY-MM-DD format. + required: true + type: date +countries: + description: > + The countries to get the prices for. A list containing es, pt, or both. + Defaults to both. + required: true + type: list +{% endoptions_yaml %} + +## Response data + +The response contains a key for each requested country: `es` for Spain and `pt` for Portugal. If you request both countries, both keys are present. + +Each key holds a list of quarter-hourly intervals. Each interval includes the following fields: + +- `start`: The start time of the interval, in CET/CEST. +- `end`: The end time of the interval, in CET/CEST. +- `price`: The electricity spot price for the interval, in €/kWh. + +A shortened example of the response looks like this: + +```yaml +es: + - start: "2026-07-08T00:00:00+02:00" + end: "2026-07-08T00:15:00+02:00" + price: 0.03415 + - start: "2026-07-08T00:15:00+02:00" + end: "2026-07-08T00:30:00+02:00" + price: 0.03521 +pt: + - start: "2026-07-08T00:00:00+02:00" + end: "2026-07-08T00:15:00+02:00" + price: 0.0361 + - start: "2026-07-08T00:15:00+02:00" + end: "2026-07-08T00:30:00+02:00" + price: 0.0372 +``` + +{% include actions/try_it.md %} + +{% include actions/stuck.md %} + +{% include actions/related.md %} diff --git a/source/_integrations/omie.markdown b/source/_integrations/omie.markdown index e5ffbb710afe..beeca502c3b1 100644 --- a/source/_integrations/omie.markdown +++ b/source/_integrations/omie.markdown @@ -32,6 +32,8 @@ The **OMIE** integration retrieves the results of the [day-ahead market](https:/ - **Portugal spot price**: Current quarter-hour electricity spot price in Portugal, in €/kWh. - **Spain spot price**: Current quarter-hour electricity spot price in Spain, in €/kWh. +{% include integrations/actions.md %} + ## Data updates The OMIE integration {% term polling polls %} OMIE for new data at the start of each quarter-hour (in Central European Time). From b28cae493e7609e965b6b6638a461c6cd72f9c8d Mon Sep 17 00:00:00 2001 From: Manu Date: Thu, 9 Jul 2026 06:20:06 +0200 Subject: [PATCH 051/123] Remove deprecated event bus documentation in HTML5 Push Notifications (#46411) --- source/_integrations/html5.markdown | 65 ----------------------------- 1 file changed, 65 deletions(-) diff --git a/source/_integrations/html5.markdown b/source/_integrations/html5.markdown index bf749be7f19b..c276f6d58ce4 100644 --- a/source/_integrations/html5.markdown +++ b/source/_integrations/html5.markdown @@ -97,71 +97,6 @@ Each event includes **state attributes** that provide additional context: {% include integrations/actions.md %} -## Automating notification events - -During the lifespan of a single push notification, Home Assistant will emit a few different events to the event bus which you can use to write automations against. - -Common event payload parameters are: - -| Parameter | Description | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `action` | The `action` key that you set when sending the notification of the action clicked. Only appears in the `clicked` event. | -| `data` | The data dictionary you originally passed in the notify payload, minus any parameters that were added to the HTML5 notification (`actions`, `badge`, `body`, `dir`, `icon`, `image`, `lang`, `renotify`, `requireInteraction`, `tag`, `timestamp`, `vibrate`, `silent`). | -| `tag` | The unique identifier of the notification. Can be overridden when sending a notification to allow for replacing existing notifications. | -| `target` | The target that this notification callback describes. | -| `type` | The type of event callback received. Can be `received`, `clicked` or `closed`. | - -You can use the `target` parameter to write automations against a single `target`. For more granularity, use `action` and `target` together to write automations which will do specific things based on what target clicked an action. - -### Received event - -You will receive an event named `html5_notification.received` when the -notification is received on the device. - -{% example %} -automation: | - alias: "HTML5 push notification received and displayed on device" - triggers: - - trigger: event - event_type: html5_notification.received -{% endexample %} - -### Clicked event - -You will receive an event named `html5_notification.clicked` when the notification or a notification action button is clicked. The action button clicked is available as `action` in the `event_data`. - -{% example %} -automation: | - alias: "HTML5 push notification clicked" - triggers: - - trigger: event - event_type: html5_notification.clicked -{% endexample %} - -or - -{% example %} -automation: | - alias: "HTML5 push notification action button clicked" - triggers: - - trigger: event - event_type: html5_notification.clicked - event_data: - action: open_door -{% endexample %} - -### Closed event - -You will receive an event named `html5_notification.closed` when the notification is closed. - -{% example %} -automation: | - alias: "HTML5 push notification clicked" - triggers: - - trigger: event - event_type: html5_notification.closed -{% endexample %} - ## Enabling HTML5 Push Notifications behind an NGINX reverse proxy with authentication If your Home Assistant instance is behind an NGINX reverse proxy with authentication enabled, device events may fail to reach Home Assistant. This happens because the authentication token used by the HTML5 Push Notifications integration may not pass through the proxy correctly. From 020e7e94042a3b34f10f979895418aadc4b1d3a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Sva=C5=A1ek?= Date: Thu, 9 Jul 2026 06:43:30 +0200 Subject: [PATCH 052/123] Add neopool integration documentation (#45990) --- source/_integrations/neopool.markdown | 179 ++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 source/_integrations/neopool.markdown diff --git a/source/_integrations/neopool.markdown b/source/_integrations/neopool.markdown new file mode 100644 index 000000000000..7cf8506a0e7b --- /dev/null +++ b/source/_integrations/neopool.markdown @@ -0,0 +1,179 @@ +--- +title: NeoPool +description: Instructions on how to integrate NeoPool / Sugar Valley pool controllers with Home Assistant. +ha_release: 2026.8 +ha_iot_class: Local Polling +ha_config_flow: true +ha_codeowners: + - "@svasek" +ha_domain: neopool +ha_platforms: + - sensor +ha_integration_type: hub +ha_quality_scale: silver +ha_category: + - Hub +--- + +The **NeoPool** {% term integration %} integrates pool controllers built around the **NeoPool control system** (originally developed by **Sugar Valley**, acquired by **Hayward** in 2016) with Home Assistant. It communicates entirely locally over Modbus TCP, providing real-time monitoring of water chemistry, filtration, and hydrolysis without any cloud dependency. + +The same control system is sold under many brand names worldwide, including **Hidrolife**, **Aquascenic**, **Oxilife**, **Bionet**, **Hidroniser**, **UVScenic**, **Station**, and **Aquarite**, distributed by **Hayward**, **Brilix** (Albixon), **Bayrol**, **Certikin**, **Poolstar**, **GrupAquadirect**, **Pentair**, **ProducPool**, **Pool Technologie**, **Kripsol**, and others. + +{% note %} +_VistaPool_ is the name of Hayward's mobile/web app for cloud-based pool management. The **NeoPool** integration works entirely locally via Modbus and does not require or use the VistaPool app or any cloud service. If you prefer to use the cloud API instead, see the [Vistapool integration](/integrations/vistapool/). +{% endnote %} + +## Use cases + +The NeoPool integration brings your pool controller into Home Assistant, providing comprehensive data and control capabilities. Which entities appear depends on which modules and options the controller reports; unavailable ones are hidden automatically. + +- **Monitor water chemistry**: track pH, Redox/ORP, free chlorine, conductivity, and water temperature. +- **Monitor hydrolysis/electrolysis**: read current production intensity, cell voltage, polarity state, and cell wear counters. +- **Monitor ionization**: read the current ionization level and polarity. +- **Monitor filtration**: read the current mode, variable-speed percentage, and Intelligent-mode scheduling data. +- **Track backwash cycles**: read the remaining time when a Besgo automatic filter valve is running a cycle. +- **Surface pool-controller problems**: expose alarm states as sensor readings, and raise a repair issue if the controller's GPIO configuration register becomes corrupted. + +## Supported devices + +The integration supports any pool controller built on the NeoPool / Sugar Valley platform that exposes the standard Modbus register set, including: + +- **Hayward**: Aquarite (with NeoPool option), Hidroniser, UVScenic, Station +- **Sugar Valley**: Hidrolife, Aquascenic, Oxilife, Bionet +- **Brilix** (Albixon), **Bayrol**, **Certikin**, **Poolstar**, **GrupAquadirect**, **Pentair**, **ProducPool**, **Pool Technologie**, **Kripsol**, and other regional rebrands of the same control system + +The Modbus protocol implemented here follows the official _NeoPool Control System MODBUS Register description_ documentation by Sugar Valley. + +## Prerequisites + +Before setting up the NeoPool integration, make sure: + +- Your NeoPool controller is connected to a Modbus TCP gateway (any RS-485 to TCP converter, such as the USR-DR164) on your home network. +- The gateway is configured for 19200 baud, 1 stop bit, no parity, Modbus RTU. +- You know the hostname or IP address and TCP port of the gateway. +- The RS-485 wiring is connected to the controller's `WIFI` or `EXTERNAL` port (do **not** use `DISPLAY` unless the internal LCD is disconnected). The pinout (top to bottom) is: + + ```text + . ___ + 1 |* |– +12V (from internal power supply) + 2 |* |– NC (not connected) + 3 |* |– Modbus A+ + 4 |* |– Modbus B- + 5 |*__|– GND + ``` + + The connector is a standard 2.54 mm 5-pin PCB female header. + +{% note %} +The NeoPool device acts as a Modbus _server_. This integration is a Modbus _client_. Only one Modbus client can be connected to a given Modbus connector at a time. +{% endnote %} + +{% include integrations/config_flow.md %} + +### Configuration parameters + +{% configuration_basic %} +Host: + description: The hostname or IP address of your Modbus TCP gateway, for example `192.168.1.50` or `pool-gateway.local`. +Port: + description: The TCP port of your Modbus gateway. Defaults to `502`. +Unit ID: + description: The Modbus unit (server) ID of the NeoPool controller. Defaults to `1`. +Modbus framer: + description: Protocol framer to use. `tcp` works for most gateways. Pick `rtu` only if your gateway forwards raw RTU frames over TCP. +{% endconfiguration_basic %} + +## Supported functionality + +The integration exposes the controller's runtime state as sensor entities. **Only entities backed by a detected hardware module or an enabled controller option are registered**; the rest stay hidden until the module or option becomes available. Each bullet below lists the specific requirement for that sensor. + +### Sensors + +- **Water temperature**: current pool water temperature (when the temperature sensor is present). +- **pH**: measured pH level (when the pH module is present). +- **Redox / ORP**: measured oxidation-reduction potential in mV (when the Redox module is present). +- **Free chlorine**: measured chlorine concentration (when the chlorine module is present). +- **Conductivity**: measured water conductivity (when the conductivity module is present). +- **pH pump status**: current state of the pH dosing pump (off, idle, acid pump, base pump, both pumps) (when the pH module is present). +- **pH alarm**: latched pH-regulation alarm state (when the pH module is present). +- **Hydrolysis intensity**: current production level in % (when the hydrolysis module is present). +- **Hydrolysis voltage**: current cell voltage (when the hydrolysis module is present; diagnostic, disabled by default). +- **Hydrolysis polarity**: current polarity of the electrolytic cell (when the hydrolysis module is present). +- **Ionization intensity**: current ionization level (when the ionization module is present). +- **Ionization polarity**: current polarity of the ionization electrodes (when the ionization module is present). +- **Filtration mode**: current mode reported by the controller (Manual, Auto, Heating, Smart, Intelligent, Backwash). +- **Filtration speed**: current variable-speed filtration percentage (when the controller reports a variable-speed pump). +- **Intelligent-mode intervals** and **time to next interval**: scheduling data for Intelligent mode (when a heating relay and temperature sensor are configured). +- **Backwash remaining**: time remaining in the active backwash cycle (when a Besgo automatic filter valve is configured). +- **Cell runtime counters**: five diagnostic counters tracking wear on the electrolytic cell (when the hydrolysis module is present), total runtime, runtime since last reset, runtime in polarity 1 and 2, and polarity-change count. All five are diagnostic and disabled by default; enable them in the entity registry if you want to track cell wear over time. + +## Data updates + +The integration {% term polling polls %} the controller over Modbus TCP at a fixed interval. To stay responsive, the integration reads data from the controller in as few requests as possible per update cycle. + +If a poll cycle fails (for example, because the Modbus gateway becomes unreachable), all entities transition to `unavailable` until the next successful poll. + +## Known limitations + +- **Discovery is not supported.** Modbus TCP gateways do not expose a standard discovery protocol that uniquely identifies a NeoPool controller behind the gateway, so the integration must be configured manually. +- **One controller per config entry.** Multiple physical controllers are supported, but each one needs its own config entry. +- **Authentication is not used.** Modbus TCP itself has no authentication mechanism; the integration relies on network isolation between Home Assistant and the gateway. The gateway should not be exposed to untrusted networks. +- **The DISPLAY connector is reserved.** The NeoPool controller exposes the same protocol on its `DISPLAY` connector as on `WIFI` / `EXTERNAL`, but the built-in LCD usually occupies it. Connecting to `DISPLAY` while the LCD is attached will result in collisions. +- **Variable-speed pump support depends on the controller firmware.** The Filtration speed entity is registered only when the controller reports a variable-speed pump. + +## Troubleshooting + +### Cannot connect during setup + +#### Symptom: "Cannot connect" during the initial config flow + +When trying to set up the integration, the form shows the message **Cannot connect** or **Cannot read Modbus**. + +#### Description + +The integration could reach the network address but did not receive a valid Modbus reply within the timeout, or the gateway refused the TCP connection altogether. + +#### Resolution + +1. Verify the Modbus TCP gateway is reachable from Home Assistant by pinging the gateway IP. +2. Confirm the gateway is configured for 19200 baud, 1 stop bit, no parity (Modbus RTU). +3. Check the RS-485 wiring (A+ / B− / GND) and that the connector is plugged into `WIFI` or `EXTERNAL`, not `DISPLAY` (when the LCD is connected). +4. Make sure the unit ID matches the controller's configured Modbus address (default `1`). + +### All entities went unavailable suddenly + +#### Symptom: every NeoPool entity is `unavailable` at the same time + +All entities provided by the integration become `unavailable` simultaneously, often after a network change or gateway restart. + +#### Description + +The integration has lost contact with the Modbus gateway. Entities recover automatically on the next successful poll after connectivity is restored. + +#### Resolution + +If entities stay unavailable for more than a few minutes: + +1. Check the Home Assistant logs for `neopool` errors. +2. Power-cycle the Modbus gateway. +3. Verify nothing else on the network has taken over the same TCP connection (only one Modbus client per gateway port at a time). + +### Repair issue: "Corrupted GPIO register" + +#### Symptom: a repair issue is created with the message "Corrupted GPIO register" + +The integration raises a [repair issue](/integrations/repairs/) shortly after setup or after a controller restart. + +#### Description + +The integration detected a known-bad value in the controller's GPIO configuration register. This usually points at a relay configuration that was partially written or lost across firmware updates. + +#### Resolution + +Follow the steps in the repair flow to acknowledge or fix the condition. The issue clears automatically once the register reads a valid value again. + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} From f55ae0f4e47a9deafab1a11e4a430aa1e0ce1731 Mon Sep 17 00:00:00 2001 From: mettolen <1007649+mettolen@users.noreply.github.com> Date: Thu, 9 Jul 2026 07:44:18 +0300 Subject: [PATCH 053/123] Add cover platform to Liebherr (#46740) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/liebherr.markdown | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/source/_integrations/liebherr.markdown b/source/_integrations/liebherr.markdown index f39217b5e199..37e4fa61f085 100644 --- a/source/_integrations/liebherr.markdown +++ b/source/_integrations/liebherr.markdown @@ -20,12 +20,14 @@ related: - docs: /common-tasks/general/#defining-a-custom-polling-interval title: Defining a custom polling interval ha_category: + - Cover - Light - Number - Select - Sensor - Switch ha_platforms: + - cover - diagnostics - light - number @@ -87,7 +89,19 @@ The Liebherr appliances operate based on the temperature unit selected on the de ## Supported functionality -The **Liebherr** integration provides temperature monitoring, climate control, presentation lighting, and special feature management for refrigerator and freezer zones in your SmartDevice appliances. +The **Liebherr** integration provides temperature monitoring, setpoint control, door control (AutoDoor), presentation lighting, and special feature management for refrigerator and freezer zones in your SmartDevice appliances. + +### Covers + +The integration creates cover entities for appliances equipped with an AutoDoor feature. The AutoDoor allows you to open and close the appliance door remotely. + +- **AutoDoor**: Controls the automatic door. Supports opening and closing the door. + +For appliances with multiple cooling zones, a separate cover entity is created for each zone that has an AutoDoor: + +- **Top zone AutoDoor**: Controls the automatic door for the uppermost compartment. +- **Middle zone AutoDoor**: Controls the automatic door for the middle compartment (if present). +- **Bottom zone AutoDoor**: Controls the automatic door for the lowermost compartment (if present). ### Lights From 4ad1e388bfda897da5cd894b962c30e09ca49fa9 Mon Sep 17 00:00:00 2001 From: Artur Pragacz <49985303+arturpragacz@users.noreply.github.com> Date: Thu, 9 Jul 2026 06:45:13 +0200 Subject: [PATCH 054/123] Default play media username to the calling user in Music Assistant (#46742) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_actions/music_assistant.play_media.markdown | 4 ++-- source/_integrations/music_assistant.markdown | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/_actions/music_assistant.play_media.markdown b/source/_actions/music_assistant.play_media.markdown index 1ececb6ec674..2ee88c6e0f54 100644 --- a/source/_actions/music_assistant.play_media.markdown +++ b/source/_actions/music_assistant.play_media.markdown @@ -39,7 +39,7 @@ Enqueue: Enable radio mode: description: Turns on radio mode to auto-generate a playlist based on the selection. Username: - description: Use this Music Assistant user to adjust the playlog entry. If the specified user has provider filtering configured, the media item selection will be made accordingly. For example, this has an effect on the resume point retrieval of an audiobook. + description: Use this Music Assistant user to adjust the playlog entry. If the specified user has provider filtering configured, the media item selection will be made accordingly. For example, this has an effect on the resume point retrieval of an audiobook. When left empty, it defaults to the Home Assistant user that made the request, if their username matches a Music Assistant user. When you call this action from an automation or script, set the username explicitly so the request is attributed to the right user. {% endoptions_ui %} {% include actions/yaml_header.md %} @@ -84,7 +84,7 @@ radio_mode: type: boolean default: false username: - description: Use this Music Assistant user to adjust the playlog entry. If provider filtering is used, the media item will be selected accordingly. + description: Use this Music Assistant user to adjust the playlog entry. If the specified user has provider filtering configured, the media item selection will be made accordingly. For example, this has an effect on the resume point retrieval of an audiobook. When left empty, it defaults to the Home Assistant user that made the request, if their username matches a Music Assistant user. When you call this action from an automation or script, set the username explicitly so the request is attributed to the right user. required: false type: string {% endoptions_yaml %} diff --git a/source/_integrations/music_assistant.markdown b/source/_integrations/music_assistant.markdown index b667050127c7..42575f6e8b5f 100644 --- a/source/_integrations/music_assistant.markdown +++ b/source/_integrations/music_assistant.markdown @@ -53,6 +53,8 @@ If using `media_player.play_media`, then note the `media_content_id` payload can - A streaming provider URI. For example, `spotify://artist/12345`. - A streaming provider URL. For example, `https://open.spotify.com/track/31cWPvM99ZHxMl3mdgiw4I`. +The `media_player.play_media` action runs as the Home Assistant user who made the request if their username matches a Music Assistant user. This affects the playlog entry and any provider filtering configured for that user. The `media_player.play_media` action doesn't let you choose the user, so if you call it from a script or automation and want the request attributed to a specific user, use the Music Assistant [Play media](/actions/music_assistant.play_media/) action instead and set its **Username** field. + If using `media_player.browse_media`, then the `media_content_id` payload must be a URI of the form `library://artist/1`, `library://album/20`, or `spotify://album/5zj4Ej0FrlJQaSo0d6cttH`. The type of item that the URI refers to must be an album or artist. These URIs can, for example, be obtained from the output of the [Get library items](/actions/music_assistant.get_library/) or [Search Music Assistant](/actions/music_assistant.search/) actions, or the `media_player.browse_media` action from Home Assistant. From 9151211b2f3874c1c2bcc59b5b7c1b6acf291d40 Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Thu, 9 Jul 2026 11:04:20 +0200 Subject: [PATCH 055/123] Document Fronius backup mode and battery standby binary sensors (#46745) Co-authored-by: Claude Opus 4.8 --- source/_integrations/fronius.markdown | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/_integrations/fronius.markdown b/source/_integrations/fronius.markdown index ab83fcff314d..15ea773ebb7d 100644 --- a/source/_integrations/fronius.markdown +++ b/source/_integrations/fronius.markdown @@ -3,6 +3,7 @@ title: Fronius description: Instructions on how to connect your Fronius SolarAPI devices to Home Assistant. ha_release: 0.96 ha_category: + - Binary sensor - Energy - Sensor ha_codeowners: @@ -11,6 +12,7 @@ ha_config_flow: true ha_domain: fronius ha_iot_class: Local Polling ha_platforms: + - binary_sensor - diagnostics - sensor ha_dhcp: true @@ -82,7 +84,9 @@ Each device adds a set of sensors to Home Assistant. - Energy produced on the current day, year and total produced energy - Power fed to the grid (if positive) or consumed from the grid (if negative) - Power load as a generator (if positive) or consumer (if negative) - - Battery charging power (if positive) or discharging power (if negative) and information about backup or standby mode + - Battery charging power (if positive) or discharging power (if negative) + - Whether the battery is in standby, on Gen24 devices with a battery + - Whether the system is currently supplying backup power during a grid outage, on Gen24, Tauro, and Verto devices with backup power configured - Photovoltaic production - Current relative self-consumption of produced energy - Current relative autonomy From 7b06063c37422ecd77d80ad7099419ed0840de44 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Thu, 9 Jul 2026 11:08:54 +0200 Subject: [PATCH 056/123] Add wildcard upload to onedrive (#46671) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/onedrive.markdown | 31 ++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/source/_integrations/onedrive.markdown b/source/_integrations/onedrive.markdown index d98626403367..46516cba947a 100644 --- a/source/_integrations/onedrive.markdown +++ b/source/_integrations/onedrive.markdown @@ -100,7 +100,7 @@ You can use the `onedrive.upload` action to upload one or more files from Home A | Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| -| `filename` | no | One or more local file paths to upload. Accepts a single string or a list of strings. | /media/image.jpg | +| `filename` | no | One or more local file paths to upload. Accepts a single string or a list of strings. Supports wildcards. | /media/image.jpg | | `destination_folder` | no | Folder inside your `Apps/Home Assistant` app folder that is the destination for the uploaded files. Will be created if it does not exist. Supports subfolders. | Snapshots/2025 | | `config_entry_id` | no | The ID of the OneDrive config entry (the OneDrive you want to upload to). | a1bee602deade2b09bc522749bbce48e | @@ -120,13 +120,40 @@ data: - /media/image_2.jpg destination_folder: Snapshots/2025 config_entry_id: a1bee602deade2b09bc522749bbce48e + +# Upload all JPG files in a folder using a wildcard +action: onedrive.upload +data: + filename: /media/snapshots/*.jpg + destination_folder: Snapshots/2025 + config_entry_id: a1bee602deade2b09bc522749bbce48e + +# Upload all JPG files in a folder and its subfolders +action: onedrive.upload +data: + filename: /media/snapshots/**/*.jpg + destination_folder: Snapshots/2025 + config_entry_id: a1bee602deade2b09bc522749bbce48e ``` {% enddetails %} -The path part of `filename` must be in the `allowlist_external_dirs` in your [`homeassistant:`](/docs/configuration/basic/) section of your `configuration.yaml` file. +The path part of `filename` must be in the `allowlist_external_dirs` in your [`homeassistant:`](/docs/configuration/basic/) section of your `configuration.yaml` file. When you use a wildcard, the folder part before the first wildcard must be allow-listed. For example, for `/media/snapshots/**/*.jpg`, the `/media/snapshots` folder must be in `allowlist_external_dirs`. + +### Wildcards + +The `filename` attribute supports wildcards (glob patterns), so you can upload several files without listing each one: + +- `*` matches any number of characters within a single folder level. For example, `/media/snapshots/*.jpg` uploads every JPG file in the `snapshots` folder. +- `**` matches folders recursively. For example, `/media/snapshots/**/*.jpg` uploads every JPG file in the `snapshots` folder and all of its subfolders. +- `?` matches a single character. +- `[` starts a character range, such as `[0-9]`. + +When a wildcard matches files in subfolders, those subfolders are recreated inside the `destination_folder` on OneDrive, preserving the original structure. +If a wildcard pattern does not match any files, the action fails with an error listing the patterns that had no matches. +The characters `*`, `?`, and `[` are always treated as wildcards. To upload a file whose name contains one of these characters literally, make sure the file exists under that exact name. The `destination_folder` must comply with [OneDrive naming restrictions](https://support.microsoft.com/en-us/office/restrictions-and-limitations-in-onedrive-and-sharepoint-64883a5d-228e-48f5-b3d2-eb39e07630fa). Folder names cannot contain the following characters: `" * : < > ? / \ |`. ### Action `onedrive.delete` From b055165c95fb6dc645d083bc454d4bd6f8eb546a Mon Sep 17 00:00:00 2001 From: Erwin Douna Date: Thu, 9 Jul 2026 15:13:49 +0200 Subject: [PATCH 057/123] Portainer add update platform (#43706) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/portainer.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/portainer.markdown b/source/_integrations/portainer.markdown index 247fd3cff023..1e3bdf2cc1e2 100644 --- a/source/_integrations/portainer.markdown +++ b/source/_integrations/portainer.markdown @@ -6,6 +6,7 @@ ha_category: - Button - Sensor - Switch + - Update ha_release: '2025.10' ha_iot_class: Local Polling ha_codeowners: From 863383c5bb1da58410f26f3dd28c6b1d57cc4a8c Mon Sep 17 00:00:00 2001 From: John Pettitt Date: Thu, 9 Jul 2026 06:16:32 -0700 Subject: [PATCH 058/123] Document new Subaru sensors (vehicle state, recommended tire pressure, EV charger) (#46265) --- source/_integrations/subaru.markdown | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/source/_integrations/subaru.markdown b/source/_integrations/subaru.markdown index 9318716c1e1a..e48844c9c70f 100644 --- a/source/_integrations/subaru.markdown +++ b/source/_integrations/subaru.markdown @@ -54,17 +54,22 @@ If your account includes multiple vehicles, the same PIN will be used for all ve Available sensors will vary by model, year, and subscription type. The integration will add all supported sensors for your vehicle. Sensor data is usually only updated when the vehicle is turned off unless the [polling option](#options) is enabled. -| Sensor | Gen 1 | Gen 2 | Gen 3 | -|--------------------------|---------|---------|---------| -| Average fuel consumption | | ✓ | ✓ | -| Distance to empty | | ✓ | ✓ | -| EV battery level | | ✓ | ✓ | -| EV range | | ✓ | ✓ | -| EV time to full charge | | ✓ | ✓ | -| Odometer | ✓*| ✓ | ✓ | -| Tire pressures | | ✓ | ✓ | - -\* Gen 1 odometer only updates every 500 miles
+| Sensor | Gen 1 | Gen 2 | Gen 3 | +|-----------------------------------|----------|---------|---------| +| Average fuel consumption | | ✓ | ✓ | +| Distance to empty | | ✓ | ✓ | +| EV battery level | | ✓ | ✓ | +| EV range | | ✓ | ✓ | +| EV time to full charge | | ✓ | ✓ | +| Odometer | ✓* | ✓ | ✓ | +| Recommended tire pressure front | | ✓ | ✓ | +| Recommended tire pressure rear | | ✓ | ✓ | +| Tire pressures | | ✓ | ✓ | +| Vehicle state | | ✓ | ✓ | + +\* Gen 1 odometer only updates every 500 miles.
+ +EV sensors (EV battery level, EV range, EV time to full charge) are only present on PHEV vehicles. The recommended tire pressure sensors are disabled by default and may report `unknown` on older Gen 2 vehicles that do not advertise the underlying tire-pressure recommendation in `vehicle_health`. The vehicle state sensor reports one of `ignition_off`, `ignition_acc` (accessory power), `ignition_on`, or `engine_on_remote_start`; if your vehicle reports a value not in that list, please file a bug and attach the integration's diagnostics download. ## Lock From 3974107b99a88d23964fe678854ee7c6eba44e44 Mon Sep 17 00:00:00 2001 From: wollew Date: Thu, 9 Jul 2026 15:17:09 +0200 Subject: [PATCH 059/123] Documentation for rain sensor limitation in the Velux integration (#46360) --- source/_integrations/velux.markdown | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/_integrations/velux.markdown b/source/_integrations/velux.markdown index 5cd2204eceb1..51b27d33d408 100644 --- a/source/_integrations/velux.markdown +++ b/source/_integrations/velux.markdown @@ -36,7 +36,7 @@ There is currently support for the following device types within Home Assistant: - Button (Reboot button on the gateway device to reboot the KLF 200 gateway) - Cover - Light -- Number (controls the power level of exterior heating devices connected to the gateway, from 0% to 100%) +- Number - Scene - Switch @@ -65,6 +65,10 @@ Password: Remember: You must complete the configuration within 5 minutes of rebooting the KLF 200 gateway. If you can't complete in time and setup fails, power cycle the device and try again. +## Known limitations + +The number entities for the window opening limitation and the rain sensor binary sensor use the same data from the gateway. If you set the opening limitation to 11% or less, the rain sensor can show as wet even when no rain is detected. + ## Removing the integration This integration follows standard integration removal. No extra steps are required. From 6dcbc7505f15a2ea025778a63342fec8a8187da8 Mon Sep 17 00:00:00 2001 From: Erwin Douna Date: Thu, 9 Jul 2026 15:21:24 +0200 Subject: [PATCH 060/123] MELCloud Home add number platform (#46426) --- source/_integrations/melcloud_home.markdown | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/source/_integrations/melcloud_home.markdown b/source/_integrations/melcloud_home.markdown index 95db3a9057c4..fbc614d36302 100644 --- a/source/_integrations/melcloud_home.markdown +++ b/source/_integrations/melcloud_home.markdown @@ -3,7 +3,8 @@ title: MELCloud Home description: Instructions on how to integrate MELCloud Home with Home Assistant. ha_category: - Climate - - Sensor + - Sensor + - Number ha_release: 2026.7 ha_iot_class: Cloud Polling ha_codeowners: @@ -12,7 +13,8 @@ ha_domain: melcloud_home ha_config_flow: true ha_platforms: - climate - - sensor + - sensor + - number ha_integration_type: hub ha_quality_scale: bronze --- @@ -82,6 +84,13 @@ The following extra sensors are only applicable for the Air-to-Water units: - **Room zone temperature 1 & 2**: Either one or the two room temperatures are returned, if applicable for the setup. - **Tank water temperature**: The current measured tank water temperature. +### Number + +Thw following controls are available: + +- **Frost protection**: minimum and maximum temperatures for the frost protection, if the enabled. +- **Overheat protection**: minimum and maximum temperatures for the overheaet protection, if the enabled. + ## Data updates The integration {% term polling polls %} the MELCloud Home API every 60 seconds. From 9ecb32395ac12d77dd415884082368ad8b77d6bb Mon Sep 17 00:00:00 2001 From: Andrew Smiley <76449307+Pinball3D@users.noreply.github.com> Date: Thu, 9 Jul 2026 09:21:54 -0400 Subject: [PATCH 061/123] Remove options section from ScreenLogic documentation (#46663) --- source/_integrations/screenlogic.markdown | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/_integrations/screenlogic.markdown b/source/_integrations/screenlogic.markdown index bc05134c94e9..e46bc965377f 100644 --- a/source/_integrations/screenlogic.markdown +++ b/source/_integrations/screenlogic.markdown @@ -30,10 +30,4 @@ The **Pentair ScreenLogic** {% term integration %} allows you to integrate your {% include integrations/config_flow.md %} -## Options - -ScreenLogic options are set via **Settings** > **Devices & services** > **Pentair ScreenLogic** > **Options**. - --= Seconds between scans - How many seconds between each polling of the ScreenLogic gateway. - {% include integrations/actions.md %} From 2384581dc03dff224586aff31f4815265691811f Mon Sep 17 00:00:00 2001 From: Raphael Hehl <7577984+RaHehl@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:30:56 +0200 Subject: [PATCH 062/123] Document capability-based UniFi Protect sense entities and the leak sensor (#46666) Co-authored-by: Raphael Hehl Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/unifiprotect.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index e45c261e46fb..a44101aa5b72 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -165,6 +165,8 @@ Each UniFi Protect floodlight will get a device in Home Assistant with the follo UniFi Protect smart sensors are a bit different than normal sensors. They are a multi-sensor that can act as a contact sensor (door/window), a motion detector, a light level detector, a humidity sensor, a temperature level sensor, an alarm sound sensor, and/or a leak detector. Each sensor function can be enabled or disabled dynamically. Disabled sensors will be marked as "unavailable". +On UniFi Protect versions newer than 7.1, UniFi Protect reports each sensor's capabilities, and entities are only created for the functions the device actually supports. This enables proper support for newer sensor models: for example, an entry sensor (USL Entry) gets contact and tamper entities, an environmental sensor (USL Environmental) gets temperature, humidity, light level, and leak entities, and a glass break sensor (USL GlassBreak) gets motion and tamper entities. On older versions, an entity is created for every function, matching the behavior of the original UniFi Protect Smart Sensor (UP Sense). + - **Sensors** - A sensor is provided for each major function of the smart sensor device: - **Contact** - A contact sensor will be available if the mount type is set as "Door", "Window" or "Garage". - **Motion Detection** - A motion detection sensor will be available if the mount type is not set to "Leak" and motion detection is enabled. @@ -172,6 +174,7 @@ UniFi Protect smart sensors are a bit different than normal sensors. They are a - **Humidity** - A humidity sensor will be available if the mount type is not set to "Leak" and the humidity sensor is enabled. - **Temperature** - A temperature sensor will be available if the mount type is not set to "Leak" and the temperature sensor is enabled. - **Alarm Sound** - An alarm sensor will be available if the mount type is not set to "Leak" and the alarm sound sensor is enabled. The Alarm Sound sensor can have the values "none", "smoke" and "co". More values may be added over time automatically as UniFi Protect adds support for detecting more alarms. + - **Leak** - A moisture sensor will be available if the mount type is set to "Leak", or (on UniFi Protect versions newer than 7.1) if the sensor supports water leak detection and leak detection is enabled. - **Tamper** - A binary sensor to detect tampering. - **Device Configuration** - Smart sensors will get configuration controls for the Status Light, enabling/disabling all of the main sensors, selecting the Paired Camera, and changing the Mount Type of the sensor. - **Button** - A button to clear the tampered state as well as a disabled by default button to restart the device. From c8922ea02a5149baca14b0b1e688452ef5405384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20H=C3=B6rsken?= Date: Thu, 9 Jul 2026 15:36:38 +0200 Subject: [PATCH 063/123] Add documentation for wmspro.set_cover_position_and_tilt action (#46485) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- ...mspro.set_cover_position_and_tilt.markdown | 105 ++++++++++++++++++ source/_integrations/wmspro.markdown | 26 +++-- 2 files changed, 123 insertions(+), 8 deletions(-) create mode 100644 source/_actions/wmspro.set_cover_position_and_tilt.markdown diff --git a/source/_actions/wmspro.set_cover_position_and_tilt.markdown b/source/_actions/wmspro.set_cover_position_and_tilt.markdown new file mode 100644 index 000000000000..a6a48139a6b5 --- /dev/null +++ b/source/_actions/wmspro.set_cover_position_and_tilt.markdown @@ -0,0 +1,105 @@ +--- +title: "Set cover position and tilt" +action: wmspro.set_cover_position_and_tilt +domain: wmspro +description: "Moves the cover and tilt to the target position simultaneously, preventing cancellation of individual movements." +since: "2026.8" +--- + +The **Set cover position and tilt** action moves a cover to a target position and tilt in a single command. Because both values are sent together, the individual actions will not cancel each other out on the WMS radio channel. + +This action is available only for covers that support setting both position and tilt, and that accept the combined command. If your cover does not support it, the action returns an error. + +{% include actions/ui_header.md %} + +To use this action in an automation or script: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation or script, or select **Create automation** > **Create new automation**. +3. If you're creating an automation, add a trigger in the **When** section. +4. In the **Then do** section, select **Add action**. +5. Select what you want to control. Under **By target** (see [Targets](#targets)), pick the cover you want to control. You can also select an area, a floor, a device, or a label. +6. From the actions shown for that target, select **Set cover position and tilt**. +7. Under **Position** and **Tilt position**, set the values you want. +8. Select **Save**. + +### Options in the UI + +{% options_ui %} +Position: + description: Target vertical position, from 0 to 100 percent. 0 means closed, 100 means fully open. + required: true +Tilt position: + description: Target tilt position, from 0 to 100 percent. + required: true +{% endoptions_ui %} + +{% include actions/yaml_header.md %} + +In YAML, refer to this action as `wmspro.set_cover_position_and_tilt`. A basic example looks like this: + +{% example %} +action: | + action: wmspro.set_cover_position_and_tilt + target: + entity_id: cover.living_room_blind + data: + position: 50 + tilt_position: 20 +{% endexample %} + +This moves `cover.living_room_blind` to 50% open with the slats tilted to 20% in one continuous movement. + +### Options in YAML + +{% options_yaml %} +position: + description: Target vertical position, from 0 to 100 percent. 0 means closed, 100 means fully open. + required: true + type: integer +tilt_position: + description: Target tilt position, from 0 to 100 percent. + required: true + type: integer +{% endoptions_yaml %} + +{% include actions/targets.md domain="cover" %} + +{% include actions/try_it.md %} + +{% include actions/more_examples.md %} + +### Automation: tilt the blinds against the afternoon sun + +When the afternoon sun starts shining in, you can lower the blinds part way and tilt the slats to block the glare while keeping some light, all in one smooth move. + +- **Trigger**: Sun: above the horizon at a low elevation +- **Action**: Set cover position and tilt + - **Target**: Living room blind + - **Position**: 60 + - **Tilt position**: 30 + +{% details "YAML example for tilting the blinds against the sun" %} + +{% example %} +automation: | + - alias: "Tilt the living room blinds in the afternoon" + triggers: + - trigger: numeric_state + entity_id: sun.sun + attribute: elevation + below: 25 + actions: + - action: wmspro.set_cover_position_and_tilt + target: + entity_id: cover.living_room_blind + data: + position: 60 + tilt_position: 30 +{% endexample %} + +{% enddetails %} + +{% include actions/stuck.md %} + +{% include actions/related.md %} diff --git a/source/_integrations/wmspro.markdown b/source/_integrations/wmspro.markdown index c8c34f3cc480..583c061c874c 100644 --- a/source/_integrations/wmspro.markdown +++ b/source/_integrations/wmspro.markdown @@ -43,24 +43,28 @@ See device section for support information: [buttons](#buttons), [covers](#cover The WMS WebControl pro *may* also be discovered on your local network via DHCP. -## Buttons +{% include integrations/actions.md %} +### Supported functionality + +The **WMS WebControl pro** integration provides the following entities. +### Buttons - All devices that support an identification activity (for example, winking an awning or blinking a light) can be triggered to perform such activity. -## Covers +### Covers - *Awnings*, *volant awnings* (vertical drop sun shades), and *roller shutters/blinds* can be opened, closed, set to a certain position, and stopped. - *Slat-based blinds* can additionally have their slats rotated open, closed, or to a specific rotation angle. -### Rotation support +#### Rotation support Home Assistant treats the slat rotation as a linear scale from fully open to fully closed. The integration uses the maximum rotation angle as the fully closed position, but the minimum (opposite) angle is not treated as fully open. Instead when you set the slats to the open position in Home Assistant, they move to the position where the slats are parallel to the ground as expected. You can change the minimum and maximum rotation angles via configuration [number](#numbers) entities or [automatic learning](#automatic-learning). -## Lights +### Lights - Dimmers (with brightness control) and switches are fully supported. -## Numbers +### Numbers - *Slat-based blinds* have configuration entities to overwrite the minimum and maximum rotation angle. This is required as the WMS WebControl pro currently reports invalid minimum and maximum rotation values. @@ -69,15 +73,21 @@ Home Assistant treats the slat rotation as a linear scale from fully open to ful - *Slat-based covers* like roofs that only have rotation, but not position control, only have this entity. For covers with rotation only, this entity appears as the main control. -### Automatic learning +#### Automatic learning The number entities persist across Home Assistant restarts. They are updated automatically on slat rotation to allow automatic learning of the valid rotation range based on the current rotation angle. For learning, it is sufficient to rotate *slat-based blinds* to both end positions while Home Assistant is connected and wait until the position has updated. -## Scenes +### Scenes - Scenes can be activated, but not changed or monitored. - Scenes are accessible via a virtual device per room. -## Switches +### Switches - Load switches (for example, a connected heater) can be turned on and off. + +## Removing the integration + +This integration follows standard integration removal. No extra steps are required. + +{% include integrations/remove_device_service.md %} From 79c0b17e7e464ad250fba336d02b6a6729efbe3a Mon Sep 17 00:00:00 2001 From: Ajinkya Gokhale <121028346+AjinkyaGokhale@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:49:43 +0200 Subject: [PATCH 064/123] docs(energieleser): upgrade to gold quality scale (#46756) Co-authored-by: Amit Krishna <218109745+amitkio@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/energieleser.markdown | 130 ++++++++++++++++----- 1 file changed, 101 insertions(+), 29 deletions(-) diff --git a/source/_integrations/energieleser.markdown b/source/_integrations/energieleser.markdown index e626cb359a56..5a94ed9eb247 100644 --- a/source/_integrations/energieleser.markdown +++ b/source/_integrations/energieleser.markdown @@ -16,12 +16,30 @@ ha_config_flow: true ha_zeroconf: true ha_platforms: - sensor +related: + - docs: /docs/configuration/troubleshooting/#debug-logs-and-diagnostics + title: Debug logs and diagnostics --- -The energieleser {% term integration %} fetches real-time consumption data reported by energieleser devices, such as stromleser.one, gasleser, wasserleser, and wärmeleser, using a local HTTP API. +The energieleser {% term integration %} fetches real-time consumption data reported by energieleser devices, such as stromleser.one, gasleser, wasserleser, and wärmeleser, using local HTTP API. [energieleser](https://energieleser.de/) is a brand by nineti GmbH, a German company offering smart readers for utility meters. +## Supported devices + +The integration supports the following energieleser devices: + +- **stromleser.one** (electricity meter reader) +- **gasleser** (gas meter reader) +- **wasserleser** (water meter reader) +- **wärmeleser** (heat meter reader) + +## Prerequisites + +Ensure your energieleser device is connected to the same local network as your Home Assistant instance and its IP address is accessible. + +For detailed hardware setup instructions, refer to the [energieleser documentation](https://docs.energieleser.de/). + {% include integrations/config_flow.md %} ## Configuration parameters @@ -31,36 +49,90 @@ IP address: description: "The IP address of your energieleser device. For example, `192.168.178.100`." {% endconfiguration_basic %} +## Supported functionality + +The energieleser integration primarily provides the following features based on the connected device type. + +### stromleser.one + +- **Imported energy**: Cumulative energy consumed (kWh) +- **Exported energy**: Cumulative energy exported to the grid (kWh) +- **Active power**: Current active power (W) +- **Phase power**: Current active power for Phase 1, Phase 2, and Phase 3 (W) + +### gasleser + +- **Total gas**: Total gas volume measured by the meter (m³) +- **Gas flow rate**: Current gas flow rate (m³/h) + +### wasserleser + +- **Total water**: Total water volume measured by the meter (m³) +- **Water flow rate**: Current water flow rate in liters per hour (L/h) +- **Volume flow rate**: Current water flow rate in cubic meters per hour (m³/h) + +### wärmeleser + +- **Energy tariffs**: Cumulative heat energy for tariff 1, tariff 2, and tariff 3 (MWh) +- **Power**: Current thermal power (kW) +- **Total volume**: Total volume of heating medium measured by the meter (m³) +- **Volume flow**: Current flow rate of heating medium (L/h) +- **Temperatures**: Flow temperature and return temperature (°C) +- **Temperature difference**: Difference between flow and return temperature (K) + +### Common sensors + +- **Signal strength**: Wi-Fi signal strength of the device (dBm) + ## Data updates -The integration fetches data by polling the device locally over your network. - -## Available sensors - -The following sensors are supported depending on the device type and meter capabilities: - -- **stromleser.one**: - - Imported energy (kWh): Cumulative energy consumed - - Exported energy (kWh): Cumulative energy exported to the grid - - Active power (W): Current active power - - Phase 1, Phase 2, and Phase 3 power (W): Current active power for each of the three phases -- **gasleser**: - - Total gas (m³): Total gas volume measured by the meter - - Gas flow rate (m³/h): Current gas flow rate -- **wasserleser**: - - Total water (m³): Total water volume measured by the meter - - Water flow rate (L/h): Current water flow rate in liters per hour - - Volume flow rate (m³/h): Current water flow rate in cubic meters per hour -- **wärmeleser**: - - Energy tariff 1, tariff 2, and tariff 3 (MWh): Cumulative heat energy for each of the three tariffs - - Power (kW): Current thermal power - - Total volume (m³): Total volume of heating medium measured by the meter - - Volume flow (L/h): Current flow rate of heating medium - - Flow temperature (°C): Temperature of the incoming heating medium - - Return temperature (°C): Temperature of the outgoing heating medium - - Temperature difference (K): Difference between flow and return temperature -- **Common sensors**: - - Signal strength (dBm): Wi-Fi signal strength of the device +The integration {% term polling polls %} data from the device every 10 seconds over your local network. + +## Use cases + +You can use the energieleser integration for a variety of smart home scenarios, such as: + +- Monitoring your energy consumption: Add the sensors to the Home Assistant Energy dashboard to track your daily, monthly, and yearly consumption of electricity, gas, water, or heat. +- Automation based on usage: Trigger automations when electricity consumption goes above or below certain thresholds (for example, turn on appliances when excess solar power is being exported). +- Detection of leaks and anomalies: Create alerts for continuous water flow or unusual gas usage patterns to detect potential leaks. + +## Automation examples + +Below is an example automation to notify you when high power consumption is detected. + +### Automation: Alert on high power consumption + +```yaml +automation: + - alias: "High power consumption alert" + triggers: + - trigger: numeric_state + entity_id: sensor.stromleser_one_active_power + above: 5000 + for: + minutes: 5 + actions: + - action: notify.notify + data: + title: "High Power Usage" + message: "Your active power consumption has been above 5kW for 5 minutes." +``` + +## Known limitations + +Rate limits: The energieleser devices can be overwhelmed by excessive HTTP requests. If you configure multiple apps or integrations to poll the same device simultaneously, the device may reach a rate limit or become temporarily unresponsive. + +## Troubleshooting + +### Cannot connect during setup + +If you see a "Failed to connect" error during setup, verify that: + +- The energieleser device is powered on and connected to your network. +- The IP address you entered is correct. +- Home Assistant can reach the device on the local network. + +Most energieleser devices are discovered automatically via zeroconf, so manual setup is rarely needed. If the device is not discovered, check that zeroconf/mDNS traffic is not blocked on your network. ## Removing the integration From 286eaa474be4cb808376b4cb016f1149e1c36abf Mon Sep 17 00:00:00 2001 From: inventor7777 <142270525+inventor7777@users.noreply.github.com> Date: Thu, 9 Jul 2026 10:54:18 -0500 Subject: [PATCH 065/123] Add proposed sensors to WeatherFlow doc (#45168) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/weatherflow.markdown | 140 ++++++++++++++++------ 1 file changed, 105 insertions(+), 35 deletions(-) diff --git a/source/_integrations/weatherflow.markdown b/source/_integrations/weatherflow.markdown index 56ad6a8299ad..e080279dfde6 100644 --- a/source/_integrations/weatherflow.markdown +++ b/source/_integrations/weatherflow.markdown @@ -37,44 +37,114 @@ There are two integrations for WeatherFlow devices, and you are not limited to s This {% term integration %} will expose the following sensors: -- Air density -- Air pressure -- Dew point -- Feels like -- Humidity -- Illuminance -- Irradiance -- Lightning average distance -- Lightning count -- Precipitation (accumulated over the previous minute) -- Precipitation intensity ([extrapolated](https://weatherflow.github.io/Tempest/api/derived-metric-formulas.html#rain-rate) from the accumulation over the previous minute) -- Precipitation type -- Temperature -- UV index -- Vapor pressure -- Wet bulb temperature -- Wind direction -- Wind direction average -- Wind gust -- Wind lull -- Wind speed - -## Event entity - -The WeatherFlow Tempest station also sends out event triggers when it starts raining and when there is a lightning strike near by. -This {% term integration %} will expose these {% term event %} {% term entities %} and can be used for automations. The following entities will be exposed: - -- Lightning strike -- Precipitation start - -## Diagnostic sensors +### Atmospheric sensors + +- **Air density** + - **Description**: The mass per unit volume of Earth’s atmosphere. + +- **Air pressure** + - **Description**: The atmospheric pressure at the station level. + +- **Dew point** + - **Description**: The temperature to which air must be cooled to become saturated with water vapor. + +- **Feels like** + - **Description**: An index that combines temperature and humidity to determine the apparent temperature. + +- **Humidity** + - **Description**: Percentage of moisture in the air relative to the maximum it can hold at the current temperature. + +- **Temperature** + - **Description**: The degree or intensity of heat present in the area. + +- **Vapor pressure** + - **Description**: Pressure exerted by water vapor in the air (absolute moisture content). + +- **Wet bulb temperature** + - **Description**: The lowest temperature that can be reached under current ambient conditions by the evaporation of water only. + +### Wind sensors + +- **Wind direction** + - **Description**: Wind direction relative to the station direction. + +- **Wind direction average** + - **Description**: Wind direction average. + +- **Wind gust** + - **Description**: Wind gusts over a maximum 3 second sample. + +- **Wind lull** + - **Description**: Wind lull over a minimum 3 second sample. + +- **Wind speed** + - **Description**: Wind speed at the station. + +### Precipitation sensors + +- **Precipitation** + - **Description**: Precipitation (accumulated over the previous minute). + +- **Precipitation intensity** + - **Description**: Precipitation intensity ([extrapolated](https://weatherflow.github.io/Tempest/api/derived-metric-formulas.html#rain-rate) from the accumulation over the previous minute). + +- **Precipitation type** + - **Description**: Precipitation type (`none`, `rain`, `hail`, `rain_hail`). + +### Lightning sensors + +- **Lightning average distance** + - **Description**: Average distance of recently detected lightning strikes. + +- **Lightning count** + - **Description**: Count of lightning strikes in the past minute. + +- **Lightning last distance** + - **Description**: Distance to the most recent detected lightning strike. + +- **Lightning last energy** + - **Description**: Energy estimate for the most recent detected lightning strike, as reported by the station. + +- **Lightning last strike** + - **Description**: Timestamp of the most recent detected lightning strike; unlike the `Lightning strike` event entity below, this sensor stores the last recorded strike time. + +### Solar and light sensors + +- **Illuminance** + - **Description**: Amount of visible light received, measured in lux. + +- **Irradiance** + - **Description**: Total solar radiation received, measured in W/m². + +- **UV index** + - **Description**: Intensity of ultraviolet radiation received. + +### Diagnostic sensors Additionally the following diagnostic sensors are available: -- Battery (percentage) -- Battery voltage -- Signal strength -- Uptime +- **Battery (percentage)** + - **Description**: Station battery (percentage). + +- **Battery voltage** + - **Description**: Battery voltage of station. + +- **Signal strength** + - **Description**: Signal strength between station and hub. + +- **Uptime** + - **Description**: Uptime of station. + +## Event entities + +The WeatherFlow Tempest station also sends event triggers when it starts raining and when there is a lightning strike nearby. +This {% term integration %} will expose these {% term event %} {% term entities %} and can be used for automations. The following entities will be exposed: + +- **Lightning strike** + - **Description**: Fires when lightning strikes within range of station. + +- **Precipitation start** + - **Description**: Fires when precipitation starts at the station. ## Networking notes From a482a0aad110f34d3ff7e4e3660d860558e7b91f Mon Sep 17 00:00:00 2001 From: greengreenblue <47041862+greengreenblue@users.noreply.github.com> Date: Fri, 10 Jul 2026 00:00:55 -0500 Subject: [PATCH 066/123] gree docs: add swing modes (#45045) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/gree.markdown | 34 ++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/source/_integrations/gree.markdown b/source/_integrations/gree.markdown index 9bb0e9be96c2..d0d60261cc92 100644 --- a/source/_integrations/gree.markdown +++ b/source/_integrations/gree.markdown @@ -52,12 +52,46 @@ The `gree` climate platform integrates Gree HVAC systems into Home Assistant, en - [`turn on/off`](/integrations/climate/#action-turn-on) - [`fan mode`](/integrations/climate/#action-set-fan-mode) - [`swing mode`](/integrations/climate/#action-set-swing-mode) +- [`swing horizontal mode`](/integrations/climate/#action-set-swing-horizontal-mode) - [`set_preset_mode`](/integrations/climate/#action-set-preset-mode) {% note %} Preset mode **Away** represents Gree's "8°C heating mode." {% endnote %} +### Swing modes + +Both the vertical and horizontal airflow directions can be controlled independently, with granular position control. + +{% important %} +The vertical swing mode values changed in Home Assistant 2026.x. If you have automations or scripts that use the old values (`off`, `vertical`, `horizontal`, or `both`), you will need to update them to use the new values listed below. +{% endimportant %} + +The vertical swing mode controls the up/down airflow direction and supports the following positions: + +- `default`: device default position +- `full_swing`: full vertical sweep +- `fixed_upper`: fixed at the upper position +- `fixed_upper_middle`: fixed at the upper-middle position +- `fixed_middle`: fixed at the middle position +- `fixed_lower_middle`: fixed at the lower-middle position +- `fixed_lower`: fixed at the lower position +- `swing_upper`: oscillates in the upper range +- `swing_upper_middle`: oscillates in the upper-middle range +- `swing_middle`: oscillates in the middle range +- `swing_lower_middle`: oscillates in the lower-middle range +- `swing_lower`: oscillates in the lower range + +The horizontal swing mode controls the left/right airflow direction and supports the following positions: + +- `default`: device default position +- `full_swing`: full horizontal sweep +- `left`: fixed at the left position +- `left_center`: fixed at the left-center position +- `center`: fixed at the center position +- `right_center`: fixed at the right-center position +- `right`: fixed at the right position + ## Switch Gree devices expose multiple switches to control various features: From eacf6e0dc859cdd235d52f8f6c7143cde578eb97 Mon Sep 17 00:00:00 2001 From: Mattheinrichs Date: Fri, 10 Jul 2026 00:09:07 -0500 Subject: [PATCH 067/123] Add navigation destination text entity to Tessie docs (#45007) --- source/_integrations/tessie.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/_integrations/tessie.markdown b/source/_integrations/tessie.markdown index f35961afc8e4..7dc131714417 100644 --- a/source/_integrations/tessie.markdown +++ b/source/_integrations/tessie.markdown @@ -11,7 +11,10 @@ ha_category: - Lock - Media Player - Number + - Select - Sensor + - Switch + - Text - Update ha_release: 2024.1 ha_iot_class: Cloud Polling @@ -32,6 +35,7 @@ ha_platforms: - select - sensor - switch + - text - update ha_integration_type: hub ha_quality_scale: silver @@ -52,6 +56,7 @@ This integration provides comprehensive control and monitoring of your Tesla veh - Enable Sentry mode, valet mode, and defrost mode - Flash lights, honk horn, and trigger HomeLink - Track vehicle location and navigation destination +- Send a navigation destination to the vehicle - Install software updates ### Energy product monitoring and control @@ -275,6 +280,12 @@ The integration will create switch entities to control various aspects of your v - Steering wheel heater - Valet mode +### Text + +The integration will create a text entity to send a navigation destination to the vehicle: + +- Navigation destination + ### Update The integration will show vehicle software updates and their installation progress. Updates can only be installed from Home Assistant after they have finished downloading. From d65cd217f43b29384de6c7afc5f7a1997a5e4dc1 Mon Sep 17 00:00:00 2001 From: Maximilian <43999966+DeerMaximum@users.noreply.github.com> Date: Fri, 10 Jul 2026 18:19:21 +0200 Subject: [PATCH 068/123] Add docs for NINA actions (#44227) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/nina.markdown | 59 +++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/source/_integrations/nina.markdown b/source/_integrations/nina.markdown index 6128da094caa..506f0d7b4040 100644 --- a/source/_integrations/nina.markdown +++ b/source/_integrations/nina.markdown @@ -120,9 +120,66 @@ The following attributes are available for the warnings. - **Attributes**: - `id`: Individual ID for each warning. +## Actions + +The integration provides the following actions. + +### Action: Get warning details + +The `nina.get_details` action is used to fetch all details of a warning. + +- **Target**: NINA binary sensor entity + - **Description**: The NINA warning binary sensor to get the recommended actions for. + - **Optional**: No + #### Response data -The response data is a string with the description as provided by NINA. +The response data is an object containing all the warning data. Returns `null` when no warning is active. + +```json +{ + { + "binary_sensor.bad_ditzenbach_goppingen_baden_wurttemberg_warning_1": { + "headline": "Amtliche WARNUNG vor extremer HITZE", + "description": "Am Freitag wird eine extreme Wärmebelastung bis zu einer Höhe von 400m erwartet.

Am Samstag wird eine extreme Wärmebelastung bis zu einer Höhe von 600m erwartet.

Heute ist der 9. Tag der Warnsituation in Folge.", + "sender": "Zentrum für Medizin-Meteorologische Forschung", + "severity": "Severe", + "recommended_actions": "Hitzebelastung kann für den menschlichen Körper gefährlich werden und zu einer Vielzahl von gesundheitlichen Problemen führen. Vermeiden Sie nach Möglichkeit die Hitze, trinken Sie ausreichend Wasser und halten Sie die Innenräume kühl.", + "affected_areas": "Gemeinde Oberreichenbach, Gemeinde Neuweiler, Gemeinde Simmersfeld, Gemeinde Simmozheim, Gemeinde Rohrdorf, Gemeinde Ostelsheim, Gemeinde Egenhausen, Gemeinde Dobel, Gemeinde Schopfloch, Stadt Haiterbach, Gemeinde Gechingen, Gemeinde Wörnersberg, Gemeinde Enzklösterle, Gemeinde Seewald, Gemeinde Waldachtal, Stadt Bonndorf im Schwarzwald, Stadt Engen, Gemeinde Eigeltingen, Mitgliedsgemeinde in Verwaltungsgemeinschaft Pfofeld, Stadt Pappenheim und 229 weitere.", + "web": "https://dwd.de/warnungen", + "id": "dwd.2.49.0.0.276.0.DWD.PVW.1782460800000.559ba8f2-38a1-484f-b6e7-1424f85d1441.MUL", + "sent": "2026-06-26T09:59:50+02:00", + "start": "2026-06-26T10:00:00+02:00", + "expires": "2026-06-27T19:00:00+02:00" + } +} +``` + +## Examples + +{% details "Example usage" %} +{% raw %} + +```yaml +alias: "Notify on NINA warning with full affected areas" +description: "When a NINA warning becomes active, fetch the full list of affected areas and send a notification." +triggers: + - trigger: state + entity_id: binary_sensor.nina_warning_1 + to: "on" +actions: + - action: nina.get_details + target: + entity_id: binary_sensor.nina_warning_1 + response_variable: warning_data + - action: notify.mobile_app + data: + title: "NINA warning active" + message: "Affected areas: {{ warning_data['binary_sensor.nina_warning_1']['affected_areas'] }}" +``` + +{% endraw %} +{% enddetails %} ## Data updates From 7abd51cdd9715419a93a7e4d711563f536d8192a Mon Sep 17 00:00:00 2001 From: Yardian Support Date: Sat, 11 Jul 2026 00:23:04 +0800 Subject: [PATCH 069/123] Add button documentation for Yardian (#45829) --- source/_integrations/yardian.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/_integrations/yardian.markdown b/source/_integrations/yardian.markdown index 5cc4adc8a51e..391065d09236 100644 --- a/source/_integrations/yardian.markdown +++ b/source/_integrations/yardian.markdown @@ -13,6 +13,7 @@ ha_codeowners: ha_domain: yardian ha_platforms: - binary_sensor + - button - sensor - switch ha_integration_type: device @@ -42,5 +43,10 @@ The **Yardian** integration provides the following entities. - **Freeze prevent**: Turns on when the controller enables freeze prevention. - **Zone enabled**: `On` if a zone is enabled. These entities are disabled by default and created per zone. +### Button + +- **Stop all irrigation**: Enabled by default. Pressing this button entity will immediately stop any currently active zone. + +## Actions {% include integrations/actions.md %} From b291ab51a8000d460a733eba180277c402d207e6 Mon Sep 17 00:00:00 2001 From: Herbertmt978 Date: Fri, 10 Jul 2026 19:39:09 +0100 Subject: [PATCH 070/123] Add ScorpionTrack integration page (#46343) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/scorpiontrack.markdown | 78 +++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 source/_integrations/scorpiontrack.markdown diff --git a/source/_integrations/scorpiontrack.markdown b/source/_integrations/scorpiontrack.markdown new file mode 100644 index 000000000000..ca63121ee199 --- /dev/null +++ b/source/_integrations/scorpiontrack.markdown @@ -0,0 +1,78 @@ +--- +title: ScorpionTrack +description: Instructions on how to integrate ScorpionTrack shared vehicle locations into Home Assistant. +ha_category: + - Device tracker +ha_release: 2026.8 +ha_iot_class: Cloud Polling +ha_domain: scorpiontrack +ha_platforms: + - device_tracker +ha_config_flow: true +ha_integration_type: hub +ha_codeowners: + - '@Herbertmt978' +ha_quality_scale: bronze +--- + +The **ScorpionTrack** {% term integration %} lets Home Assistant follow vehicles that have been shared through a public ScorpionTrack location-share link. + +This integration is intentionally focused on the share-link workflow. It does not use your private ScorpionTrack account credentials. Instead, it reads the shared vehicle feed exposed by ScorpionTrack and creates `device_tracker` entities from that data, which appear on the Home Assistant map. + +## Prerequisites + +Before setting up the integration, you need: + +- A valid ScorpionTrack shared-location link +- At least one vehicle included in that share + +## Create a share link + +Create the share in the ScorpionTrack customer portal: + +1. Open the ScorpionTrack location share page at [app.scorpiontrack.com/customer/locationshare](https://app.scorpiontrack.com/customer/locationshare). +2. Create a new shared-location entry. +3. Add every vehicle you want Home Assistant to track. +4. Choose a suitable expiry time for the share. +5. Copy the generated share URL. + +You can paste either the full shared-location URL or just the token from that URL. + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +Share URL or token: + description: "Paste the full ScorpionTrack shared-location URL or only the token from that URL." +{% endconfiguration_basic %} + +## Supported functionality + +The **ScorpionTrack** integration creates one {% term "device tracker" %} for each vehicle included in the share. + +Each tracker represents the vehicle directly on the Home Assistant map and in zone logic, using the latest GPS location reported through the ScorpionTrack share. The tracker name uses the vehicle registration when available, and otherwise falls back to the vehicle name from the ScorpionTrack share. + +## Data updates + +The **ScorpionTrack** integration {% term polling polls %} ScorpionTrack every 2 minutes for the latest shared vehicle position. + +## Known limitations + +- This integration only supports ScorpionTrack shared-location links. +- If the share expires or is revoked, the entities will become unavailable until a valid share is configured again. +- The update speed is limited by the polling interval and by how often ScorpionTrack updates the shared feed itself. + +## Troubleshooting + +### The integration says the share is invalid + +Make sure the shared-location link is still active in ScorpionTrack and that the token was copied correctly. If you pasted the full URL, verify that it is the actual share URL and not the customer portal page address. + +### No vehicles appear after setup + +Confirm that the ScorpionTrack share still includes vehicles and that the share has not expired. Home Assistant creates tracker entities for vehicles present in the share when the integration is set up or reloaded. If you add vehicles to the share later, reload or reconfigure the integration. + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} From 5f5d6987da736291498e220b4de17f9653bdad60 Mon Sep 17 00:00:00 2001 From: Malene Trab Date: Fri, 10 Jul 2026 21:08:19 +0200 Subject: [PATCH 071/123] Add Fuelprices.dk documentation (#43710) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Co-authored-by: Petar Petrov Co-authored-by: Joost Lekkerkerker --- source/_integrations/fuelprices_dk.markdown | 78 +++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 source/_integrations/fuelprices_dk.markdown diff --git a/source/_integrations/fuelprices_dk.markdown b/source/_integrations/fuelprices_dk.markdown new file mode 100644 index 000000000000..8f2994e9100a --- /dev/null +++ b/source/_integrations/fuelprices_dk.markdown @@ -0,0 +1,78 @@ +--- +title: Fuelprices.dk +description: Use current fuel prices from Danish fuel stations in Home Assistant using the Fuelprices.dk API. +ha_category: + - Sensor +ha_release: 2026.8 +ha_iot_class: Cloud Polling +ha_codeowners: + - "@MTrab" +ha_domain: fuelprices_dk +ha_config_flow: true +ha_integration_type: hub +ha_platforms: + - sensor +ha_quality_scale: bronze +related: + - url: https://fuelprices.dk + title: Fuelprices.dk +--- + +The **Fuelprices.dk** {% term integration %} uses the [Fuelprices.dk API](https://fuelprices.dk) as a source for fuel price data from Danish fuel companies. + +All station data and prices are provided by [Fuelprices.dk](https://fuelprices.dk) and the fuel companies. + +## Companies currently supported + +To view a list of currently supported companies, refer to [Fuelprices.dk Companies](https://fuelprices.dk/selskaber). + +## Prerequisites + +To set up the integration, you need a valid [Fuelprices.dk](https://fuelprices.dk) API key + +1. Go to [Fuelprices.dk](https://fuelprices.dk). +2. Select **Registrering**. +3. Enter your `name` and `email address`. +4. Select **Opret bruger**. +5. Check your email and copy your API key. + +After setup, you can reconfigure selected products for each station from the integration settings. + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +api_key: + description: Your API key as specified in the email received after registration on [Fuelprices.dk](https://fuelprices.dk) +{% endconfiguration_basic %} + +## Supported functionality + +## Sensors +The integration creates sensor entities for the selected station: + +- One price sensor per selected product (for example **Blyfri 92**, **Oktan 95**, and **Diesel**) + +## Data updates + +The integration {% term polling polls %} [Fuelprices.dk](https://fuelprices.dk) every hour. + +The integration does not modify values. Home Assistant shows the values exactly as returned by [Fuelprices.dk](https://fuelprices.dk). + +## Known limitations + +- Data availability and freshness depend on [Fuelprices.dk](https://fuelprices.dk) and the fuel companies. +- Some stations may not provide all products. +- API rate limits can temporarily delay updates. + +## Troubleshooting + +- **Invalid API key**: Verify that your API key is correct and still active. +- **Cannot connect**: Check your internet connection and try again later. +- **Rate limit exceeded**: Wait and try again later. +- **Missing prices for a product**: Verify that the selected station provides that product on [Fuelprices.dk](https://fuelprices.dk). + +## Removing the integration + +This integration follows standard integration removal. No extra steps are required. + +{% include integrations/remove_device_service.md %} From f9070d1ce40be46baf4425784c64c76b6272efdb Mon Sep 17 00:00:00 2001 From: Arie Catsman <120491684+catsmanac@users.noreply.github.com> Date: Fri, 10 Jul 2026 22:38:09 +0200 Subject: [PATCH 072/123] Add Enphase_envoy manual token entry description (#44209) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/enphase_envoy.markdown | 82 ++++++++++++++---- .../enphase_envoy_automatic_token.png | Bin 0 -> 42205 bytes .../enphase_envoy_manual_token_entry.png | Bin 0 -> 40920 bytes ...enphase_envoy_token_lifetime_action_ui.png | Bin 0 -> 57671 bytes 4 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 source/images/integrations/enphase_envoy/enphase_envoy_automatic_token.png create mode 100644 source/images/integrations/enphase_envoy/enphase_envoy_manual_token_entry.png create mode 100644 source/images/integrations/enphase_envoy/enphase_envoy_token_lifetime_action_ui.png diff --git a/source/_integrations/enphase_envoy.markdown b/source/_integrations/enphase_envoy.markdown index 5066ee208cf9..ea813498a916 100644 --- a/source/_integrations/enphase_envoy.markdown +++ b/source/_integrations/enphase_envoy.markdown @@ -47,11 +47,11 @@ This integration does not work with: - The Envoy must be on your local network with IPV4 connectivity from Home Assistant. (Also See troubleshooting, [periodic network connection issues](#periodic-network-connection-issues)) - Envoy firmware version 3.9 or newer. - With Envoy firmware 7 and greater: - - an Enlighten cloud username and password. + - An Enphase cloud username and password. - Home Assistant 2023.9 or newer. {% note %} -Currently, Multi Factor Authentication for the Enlighten account is not supported by this integration. It should be disabled during Envoy configuration and token refresh. +If you have multi-factor authentication enabled on your Enphase account, make sure to read the [required manual input](#required-manual-input) and [credentials and/or token configuration](#credentials-andor-token-configuration) for manual token entry. {% endnote %} {% include integrations/config_flow.md %} @@ -65,10 +65,13 @@ The configuration of an individual Envoy requires you to enter the following inf Host: description: "The name or IP address of the Envoy to configure.
Will be pre-filled if the Envoy was auto-discovered" Username: - description: "For firmware version 7.0 and later, enter your Enlighten cloud username. The Enlighten cloud username (and password) will be used to obtain a 1-year-valid token from the enphase web-site when first configured or upon expiry. -
For firmware before 7.0, enter username *installer* without a password." + description: "For firmware version 7.0 and later, enter your Enphase cloud username. The Enphase cloud username and password are used to obtain a one-year token from the Enphase website when first configured or when the token expires.
If your Enphase account uses multi-factor authentication, you must enter the access token manually instead of entering your username and password.
For firmware before 7.0, enter username *installer* without a password." Password: - description: "For firmware version 7.0 and later, enter your Enlighten cloud password
For firmware before 7.0, with username *installer*, leave blank." + description: "For firmware version 7.0 and later, enter your Enphase cloud password.
For firmware before 7.0, with username *installer*, leave blank." +Enter the Envoy access token manually: + description: "If you want to enable or disable entering a token manually, select or clear this option and select **Submit**. The form will switch between username/password entry and token entry modes. Use manual token entry mode if your Enphase cloud account has multi-factor authentication enabled. See [credentials and/or token configuration](#credentials-andor-token-configuration)." +Envoy access token: + description: "Enter the access token retrieved from the [Enphase token portal](https://entrez.enphaseenergy.com). The description text below the field includes the link to the portal and the current token lifetime. This field is only available when **Enter the Envoy access token manually** is enabled." {% endconfiguration_basic %} {% include integrations/option_flow.md %} @@ -82,11 +85,53 @@ Always use a new connection when requesting data from the Envoy: description: "No/Yes
Some older Envoy firmware may exhibit connection issues when using the default keep-alive connection and report failures. When set, this option disables the use of keep-alive and builds a new connection at each data request. This makes the communication more reliable for these firmware versions. Reported for the Envoy-R, but may apply to other older firmware versions as well." {% endconfiguration_basic %} +## Credentials and/or token configuration + +When configuring an Envoy, a form appears that prompts you for the [required manual input](#required-manual-input). In all cases the Envoy IP address needs to be specified. In most cases the IP address will be pre-filled by the detection mechanism. If this is not the case, enter it as it is a required field. + +{% details "Configuration form in automatic token retrieval mode" %} +
+ Example screenshot of Envoy configuration form in automatic token retrieval mode. +
Envoy configuration form in automatic token retrieval mode.
+
+{% enddetails %} + +For firmware before 7.0, the username *installer* without a password can be used to configure the Envoy. Enter these in the form and select **Submit**. + +For firmware version 7.0 and later, you need to enter your Enphase cloud username and password. Home Assistant stores these credentials in the configuration and uses them to retrieve an access token from the Enphase token portal. Token retrieval happens initially during the configuration process and again 30 days before the one-year token expires. The Enphase token portal must be reachable during configuration. If it is not, the configuration fails, and you need to retry it later. If the Enphase token portal is unreachable during a token refresh attempt 30 days before expiry, Home Assistant retries the refresh on subsequent days until it succeeds. + +If you have multi-factor authentication enabled on your Enphase cloud account, automatic token retrieval will not work. You will have to obtain a token manually and enter it in the form. If this is the case, you have to switch the configuration method to manual token entry. Do this by selecting the option `Enter the Envoy access token manually` and select **Submit**. This will change the form to only prompt for host and token. Enter the access token retrieved from the [Enphase token portal](https://entrez.enphaseenergy.com). The description below the form field includes the link to the portal for easy access and shows the number of days until the token expires. + +{% details "Configuration form in manual token entry mode" %} +
+ Example screenshot of Envoy configuration form in manual token entry mode. +
Envoy configuration form in manual token entry mode.
+
+{% enddetails %} + +If you prefer not to have your Enphase cloud username and password stored by Home Assistant for this integration, you can use the manual token entry mode as well. In this mode, only the token is stored by Home Assistant for the integration. + +To switch back from manual token entry to automatic token retrieval use the reverse process. Deselect the option `Enter the Envoy access token manually` and select **Submit** to switch to the username/password entry mode. + +### Token expiry repair + +When in manual token entry mode, you will have to take care of timely token update. To alert you in time, the integration will display a repair note in **Settings**. The repair will show when the token expiry is within the next 30 days. Use the [reconfigure](#reconfigure) menu option for the Envoy integration to update the token. If you opt to ignore the repair, it will show again the next day. The repair will disappear when the token is updated and valid again. + ## Reconfigure -This integration supports updating the Envoy configuration through a `reconfigure` menu option. The reconfiguration allows for changing the Envoy IP address, username, and/or password. Use this menu option if your Enlighten credentials or the device's IP address has changed and needs to be manually updated. The latter is typically automatically detected and updated. +This integration supports updating the Envoy configuration through a `reconfigure` menu option for the Enphase Envoy integration in {% my integrations title="**Settings** > **Devices & services** > **Integrations** " %}. The reconfiguration allows for changing the Envoy IP address, username, password, manual token entry mode and/or token. The `reconfigure` menu will show the form as described in [Credentials and/or token configuration](#credentials-andor-token-configuration) and [Required manual input](#required-manual-input) with current configured information. + +Use this menu when: + +- You changed your Enphase cloud credentials. +- You need to change the IP address of the Envoy, even though a changed device IP address is typically automatically detected and updated. +- You enable multi-factor authentication on your Enphase account and need to switch the configuration to manual token entry. +- In manual token entry mode you need to update the manual token before expiry. +- In case of an Envoy firmware upgrade requiring to switch from local Envoy username/password to token-based authentication with Enphase username/password. -Use this menu option also when an Envoy firmware upgrade requires a switch from local Envoy username/password to token-based authentication with Enlighten username/password (refer to [required manual input](#required-manual-input)). +## Re-authenticating the Envoy + +The Envoy requires re-authentication if the automatic token refresh fails to update the token, or the manually entered token is not updated before it expires. Home Assistant shows this state, and when you resolve it, the process is the same as described in [Credentials and/or token configuration](#credentials-andor-token-configuration). There is one difference: the IP address is not shown in the re-authentication form. ## Removing the integration @@ -453,7 +498,7 @@ The Enphase C6 combiner controller (C6CC) provides some status information to th ## Data polling interval -All data is collected in one coordinated collection cycle and sourced from a limited set of endpoints on the Envoy. For example, three different values sourced from the same endpoint are not pulled in three different requests but provided from the same single request. This method minimizes the number of requests to the Envoy. The local REST API of the Envoy is used. Only when the 1-year valid token is to expire, 1 month before due data, a new token is requested from the Enphase Enlighten website. +All data is collected in a single coordinated collection cycle and sourced from a limited set of endpoints on Envoy. For example, three different values sourced from the same endpoint are not pulled in three separate requests but are provided in a single request. This method minimizes the number of requests to the Envoy. The local REST API of the Envoy is used. The Enphase cloud is only used when configuring an Envoy and when the one-year-valid token is about to expire. 30 days before the expiry date, a new token is requested from the Enphase website. The integration collects data for all entities by default every 60 seconds. To customize the collection interval, refer to [defining a custom polling interval](/common-tasks/general/#defining-a-custom-polling-interval). Specify one single entity from the envoy device as target of the action using the `+ choose entity` button. Updating one entity will update all entities of the Envoy and the related devices like the inverters; there is no need to specify multiple or all entities or add (all) inverter entities. When using multiple Envoys, add one entity for each envoy as targets or create separate custom polling intervals with a single entity as needed. @@ -461,12 +506,6 @@ Envoy installations without installed CTCT, data granularity increases and shortening the collection interval can provide more details. The Envoy, however, has no unlimited resources and shortening the collection interval may result in dropped connections, Envoy freeze or restarts. It will require some step-wise tuning for each individual situation. -## Credentials or device IP address update - -This integration supports updating the Envoy configuration through a `reconfigure` menu option. The reconfiguration allows for changing the Envoy IP address, username, and/or password. Use this menu option if your Enlighten credentials or the device's IP address has changed and needs to be manually updated. The latter is typically automatically detected and updated. - -Use this menu option also when an Envoy firmware upgrade requires a switch from local Envoy username/password to token-based authentication with Enlighten username/password (refer to [required manual input](#required-manual-input)). - ## Firmware updates The firmware version is read from the envoy when the configuration entry is loaded. The firmware version is then used in the process of determining capabilities and required authorization methods. The firmware version is available as the `sw_version` attribute of the configuration entry and shown on the device view of the envoy. @@ -551,7 +590,7 @@ Although not a replacement for individual energy or power measurement devices, w ## Actions -Available actions are: `switch.turn_on`, `switch.turn_off`, `switch.toggle`, [`number.set_value`](#action-numberset_value), [`select.select`](#action-selectselect) +Available actions are: `switch.turn_on`, `switch.turn_off`, `switch.toggle`, [`number.set_value`](#action-numberset_value) and [`select.select_option`](#action-selectselect_option). ### Action `switch.turn_on`/`switch.turn_off`/`switch.toggle` @@ -788,16 +827,17 @@ The example below shows data gaps starting at 11 PM on multiple, but not all, da ## Troubleshooting -### Enlighten authentication issues +### Enphase authentication issues -If you experience authentication errors during the configuration of the Envoy, ensure if Multi Factor Authentication (MFA) is disabled for your Enlighten account. Currently, this integration does not support MFA for token retrieval. If any of the below errors show, verify if MFA is disabled. +If you experience authentication errors during the (re-)configuration of the Envoy, verify if multi-factor authentication (MFA) is enabled for your Enphase account. When using MFA, automatic token retrieval will fail, and you need to use manual token entry as described in [Credentials and/or token configuration](#credentials-andor-token-configuration). Disabling MFA is not required if manual token entry mode is used. Any of the errors below indicate that MFA is enabled on your Enphase cloud account. - Before HA version 2026.1.2: KeyError: 'is_consumer' - As of Home Assistant version 2026.1.2 - KeyError: 'session_id' - - EnvoyAuthenticationError: No session id in Enlighten login reply, disable Multi Factor Authentication + - EnvoyAuthenticationError: No session id in Enphase login reply, disable multi-factor authentication + - Although the error mentions to disable multi-factor authentication, in the current HA version the resolution is to switch to manual token entry. -These error may also appear in the log upon token refresh, 11 months after initial token collection. +These errors may also appear in the log upon token refresh, 11 months after initial token collection. ### Periodic network connection issues @@ -907,4 +947,8 @@ ___ ### IQ Combiner reference [TEB-00269-2.0-EN, March 2025](https://enphase.com/it-it/media/26097) + +### Enphase token portal + +Obtain a token from the [Enphase token portal](https://entrez.enphaseenergy.com) ___ diff --git a/source/images/integrations/enphase_envoy/enphase_envoy_automatic_token.png b/source/images/integrations/enphase_envoy/enphase_envoy_automatic_token.png new file mode 100644 index 0000000000000000000000000000000000000000..47f542c3e03d4c432fc9c27d73996bd8483d80ac GIT binary patch literal 42205 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 S_cA8|@KIIPR4P(5^ZOSk9e=$5 literal 0 HcmV?d00001 diff --git a/source/images/integrations/enphase_envoy/enphase_envoy_manual_token_entry.png b/source/images/integrations/enphase_envoy/enphase_envoy_manual_token_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c47f37cbe6b4bc56457f21160ad556b170502b GIT binary patch literal 40920 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 literal 0 HcmV?d00001 diff --git a/source/images/integrations/enphase_envoy/enphase_envoy_token_lifetime_action_ui.png b/source/images/integrations/enphase_envoy/enphase_envoy_token_lifetime_action_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..523223b5cd5ae5708c6f06ffc43812ae49469387 GIT binary patch literal 57671 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 pw(Jco(CQ?SAjKbZ{q=t4p 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¾kbr3H^=GufwM=+&_U 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 Date: Sat, 11 Jul 2026 04:39:08 +0800 Subject: [PATCH 073/123] docs: Update iZone integration documentation for multi-controller config flow support (#45034) --- source/_integrations/izone.markdown | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/source/_integrations/izone.markdown b/source/_integrations/izone.markdown index 8f292d9bc0f6..dab1896a94b6 100644 --- a/source/_integrations/izone.markdown +++ b/source/_integrations/izone.markdown @@ -18,7 +18,7 @@ related: title: Configuration file --- -The **iZone** {% term integration %} allows access of control of a local [iZone](https://izone.com.au/) ducted reverse-cycle climate control devices. These are largely available in Australia. +The **iZone** {% term integration %} lets you monitor and control local [iZone](https://izone.com.au/) ducted reverse-cycle climate control systems. These systems are largely available in Australia. ## Supported hardware @@ -26,15 +26,22 @@ Any current iZone unit with ducted reverse cycle air-conditioning, and the CB wi {% include integrations/config_flow.md %} -## Manual configuration +## Multiple iZone systems + +If you have more than one iZone system on your local network, the iZone integration discovers all available controllers and shows them during setup. You can then choose the controller you want to configure. + +Any other controllers found during the search will become available as discovered controllers. + +## Legacy YAML configuration + +YAML configuration is now deprecated, it will be removed in a future update. + +For legacy setups, or if you need to exclude specific controllers from Home Assistant, you can configure the iZone integration via the {% term "`configuration.yaml`" %} file with the `exclude` option. -Alternatively, the iZone integration can be configured manually via the -{% term "`configuration.yaml`" %} file if there is more than one iZone system on the local -network and one or more must be excluded use manual configuration. {% include integrations/restart_ha_after_config_inclusion.md %} ```yaml -# Full manual example configuration.yaml entry +# Example configuration.yaml entry with excluded controllers izone: exclude: - "000013170" @@ -42,7 +49,7 @@ izone: {% configuration %} exclude: - description: Exclude particular units from integration with Home Assistant. + description: Exclude specific units from Home Assistant. This option applies only to YAML-based configuration. required: false type: list {% endconfiguration %} From 2d026b83d22721360389b98e92dace0604f181bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20S=C4=99d=C5=82ak-Jakubowski?= Date: Fri, 10 Jul 2026 22:48:52 +0200 Subject: [PATCH 074/123] Refer to Network settings for HTTP options (#46765) Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com> Co-authored-by: Rita C. <215712047+Laufmaschine@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_docs/configuration/basic.markdown | 2 +- source/_docs/configuration/remote.markdown | 2 +- .../alexa.flash_briefings.markdown | 7 +++--- source/_integrations/fail2ban.markdown | 9 ++----- source/_integrations/telegram_bot.markdown | 25 +++++-------------- 5 files changed, 13 insertions(+), 32 deletions(-) diff --git a/source/_docs/configuration/basic.markdown b/source/_docs/configuration/basic.markdown index b73e0d951038..42a341c1406e 100644 --- a/source/_docs/configuration/basic.markdown +++ b/source/_docs/configuration/basic.markdown @@ -30,7 +30,7 @@ To change the home information (formerly called general settings) that were defi - **Country** - **Language** - To apply your changes, select **Save**. -4. To change network-related configuration, such as the network name, go to {% my network title="**Settings** > **System** > **Network**" %}. +4. To change network-related configuration, such as the network name, Home Assistant URL, or HTTP server settings, go to {% my network title="**Settings** > **System** > **Network**" %}. 5. Troubleshooting: If any of the settings are grayed out and can't be edited, this is because they are defined in the {% term "`configuration.yaml`" %} file. - If you prefer editing the settings in the UI, you have to delete these entries from the {% term "`configuration.yaml`" %} file. - For more information about the general settings in YAML, refer to the [Home Assistant Core integration documentation](/integrations/homeassistant/). diff --git a/source/_docs/configuration/remote.markdown b/source/_docs/configuration/remote.markdown index ea40863b06e2..62b821434272 100644 --- a/source/_docs/configuration/remote.markdown +++ b/source/_docs/configuration/remote.markdown @@ -30,7 +30,7 @@ A VPN connection needs to be established before you can connect to your Home Ass ## Port forwarding -Set up port forwarding (for any port) from your router to port 8123 on the computer that is hosting Home Assistant. General instructions on how to do this can be found by searching ` port forwarding instructions`. You can use any free port on your router and forward that to port 8123. +Set up port forwarding from your router to the port Home Assistant listens on. By default, this is port 8123 on the computer that is hosting Home Assistant. If you changed the Home Assistant HTTP server port, use the port shown under {% my network title="**Settings** > **System** > **Network**" %}. General instructions on how to do this can be found by searching ` port forwarding instructions`. You can use any free port on your router and forward that to the Home Assistant HTTP server port. A problem with making a port accessible is that some Internet Service Providers only offer dynamic IPs. This can cause you to lose access to Home Assistant while away. You can solve this by using a free Dynamic DNS service like [DuckDNS](https://www.duckdns.org/). diff --git a/source/_integrations/alexa.flash_briefings.markdown b/source/_integrations/alexa.flash_briefings.markdown index d9d57fa9b0aa..7b6e3f4f75d2 100644 --- a/source/_integrations/alexa.flash_briefings.markdown +++ b/source/_integrations/alexa.flash_briefings.markdown @@ -15,11 +15,10 @@ As of version [0.31][zero-three-one] Home Assistant supports the new [Alexa Flas Amazon requires the endpoint of a skill to be hosted via SSL. Self-signed certificates are OK because our skills will only run in development mode. Read more on [our blog][blog-lets-encrypt] about how to set up encryption for Home Assistant. Using the [Let's Encrypt](/addons/lets_encrypt/) and [Duck DNS](/addons/duckdns/) apps is the easiest method. If you are unable to get HTTPS up and running, consider using [this AWS Lambda proxy for Alexa skills](https://community.home-assistant.io/t/5230). -Additionally, note that at the time of this writing, your Alexa skill endpoint *must* accept requests over port 443 (Home Assistant default to 8123). There are two ways you can handle this: +Additionally, note that at the time of this writing, your Alexa skill endpoint _must_ accept requests over port 443. The default Home Assistant HTTP server port is 8123. There are two ways you can handle this: - 1. In your router, forward external 443 to your Home Assistant serving port (defaults to 8123) - OR - 2. Change your Home Assistant serving port to 443 this is done in the [`http`](/integrations/http/) section with the `server_port` entry in your {% term "`configuration.yaml`" %} file +1. In your router, forward external port 443 to the Home Assistant HTTP server port. +2. Change the Home Assistant HTTP server port to 443 under {% my network title="**Settings** > **System** > **Network**" %}, in the **HTTP server** section. [blog-lets-encrypt]: /blog/2015/12/13/setup-encryption-using-lets-encrypt/ diff --git a/source/_integrations/fail2ban.markdown b/source/_integrations/fail2ban.markdown index 6cf6db19c9d3..5b1432b044db 100644 --- a/source/_integrations/fail2ban.markdown +++ b/source/_integrations/fail2ban.markdown @@ -166,14 +166,9 @@ server { } ``` -Once that's added to the NGINX configuration, we need to modify the Home Assistant {% term "`configuration.yaml`" %} such that the `X-Forwarded-For` header can be parsed. This is done by adding the following to the `http` integration: +Once that's added to the NGINX configuration, allow Home Assistant to parse the `X-Forwarded-For` header. Go to {% my network title="**Settings** > **System** > **Network**" %}. In the **HTTP server** section, turn on **Trust X-Forwarded-For** and add the IP address or CIDR network of the NGINX reverse proxy to **Trusted proxies**. -```yaml -http: - use_x_forwarded_for: true -``` - -At this point, once the Let's Encrypt and Home Assistant dockers are restarted, Home Assistant should be correctly logging the originating IP of any failed login attempt. Once that's done and verified, we can move onto the final step. +At this point, once the Let's Encrypt and Home Assistant containers are restarted, Home Assistant should be correctly logging the originating IP of any failed login attempt. Once that's done and verified, we can move on to the final step. #### Add the fail2ban sensor diff --git a/source/_integrations/telegram_bot.markdown b/source/_integrations/telegram_bot.markdown index 6e7aa1ee2d54..34d34eb97728 100644 --- a/source/_integrations/telegram_bot.markdown +++ b/source/_integrations/telegram_bot.markdown @@ -89,30 +89,17 @@ If you have a Home Assistant Cloud subscription, you can [enable remote access]( If your Home Assistant is behind a publicly accessible reverse proxy (for example NGINX, Caddy, Traefik) with HTTPS enabled, do the following: -1. Go to {% my network title="**Settings** > **System** > **Network**" %} and configure *Home Assistant URL*. -2. Configure the [HTTP integration](/integrations/http) to allow Home Assistant to accept connections from your reverse proxy: - - Set `use_x_forwarded_for` to `true`. - - Add the IP address of the reverse proxy to `trusted_proxies`. - -Example `configuration.yaml`: - -```yaml -http: - use_x_forwarded_for: true - trusted_proxies: - - 192.168.0.0/16 -``` +1. Go to {% my network title="**Settings** > **System** > **Network**" %} and configure **Home Assistant URL**. +2. In the **HTTP server** section, allow Home Assistant to accept connections from your reverse proxy: + - Turn on **Trust X-Forwarded-For**. + - Add the IP address or CIDR network of the reverse proxy to **Trusted proxies**. #### Direct If your Home Assistant is publicly accessible, do the following: -1. Go to {% my network title="**Settings** > **System** > **Network**" %} and configure *Home Assistant URL*. -2. Configure the [HTTP integration](/integrations/http) to enable HTTPS on your Home Assistant by configuring the following variables: - - `server_host` - - `server_port` - - `ssl_certificate` - - `ssl_key` +1. Go to {% my network title="**Settings** > **System** > **Network**" %} and configure **Home Assistant URL**. +2. In the **HTTP server** section, configure the settings needed for HTTPS, such as **Server port**, **Listen addresses**, **SSL certificate path**, and **SSL key path**. {% include integrations/config_flow.md %} From 167d0ee43a86fc3c3b209b0c26e9d1e92a402da8 Mon Sep 17 00:00:00 2001 From: Steven Looman Date: Fri, 10 Jul 2026 23:09:53 +0200 Subject: [PATCH 075/123] Add section about rollover sensors to the UPnP integration documentation (#44850) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/upnp.markdown | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/source/_integrations/upnp.markdown b/source/_integrations/upnp.markdown index d91749f9b35d..683f3e58eb15 100644 --- a/source/_integrations/upnp.markdown +++ b/source/_integrations/upnp.markdown @@ -33,7 +33,22 @@ UPnP or NAT-PMP needs to be enabled on your router for this {% term integration Some UPnP/IGD devices have a broken UPnP implementation and will provide invalid data or no data at all. A configuration option is provided to fall back to polling of all data for the sensors. Please try this when you feel not all sensors which should be working are working. -## Debugging integration +## Troubleshooting + +### Traffic counters not handling rollover properly + +Routers keep a running total of the data passing through them. This total is stored in a counter that has a maximum value. Once the total reaches that maximum, the counter resets to zero and starts counting again. This reset is called a _rollover_. The **Download speed**, **Upload speed**, **Packet download speed**, and **Packet upload speed** sensors correct for it so the speed stays accurate when a counter wraps. + +Some routers don't report these counters correctly, and the correction can misfire, causing a sudden, large spike. If you see these spikes, switch to the matching sensors that skip the correction and instead report `unavailable` when a rollover is detected: + +- **Download speed (no rollover handling)** +- **Upload speed (no rollover handling)** +- **Packet download speed (no rollover handling)** +- **Packet upload speed (no rollover handling)** + +These sensors are disabled by default. Enable them from the integration's device page, and optionally disable the original speed sensors. + +### Debugging the integration If you have problems with this {% term integration %} you can add debug prints to the log. From b9b87b50089f18ef4651157f1f8513d95ba3b2bb Mon Sep 17 00:00:00 2001 From: Alex Fishlock Date: Fri, 10 Jul 2026 22:13:06 +0100 Subject: [PATCH 076/123] Add Lyngdorf integration documentation (#43439) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com> Co-authored-by: Joost Lekkerkerker --- source/_integrations/lyngdorf.markdown | 99 ++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 source/_integrations/lyngdorf.markdown diff --git a/source/_integrations/lyngdorf.markdown b/source/_integrations/lyngdorf.markdown new file mode 100644 index 000000000000..57eac9bb03ae --- /dev/null +++ b/source/_integrations/lyngdorf.markdown @@ -0,0 +1,99 @@ +--- +title: Lyngdorf +description: Instructions on how to integrate Lyngdorf audio processors into Home Assistant. +ha_category: + - Media player +ha_release: 2026.8 +ha_iot_class: Local Push +ha_config_flow: true +ha_codeowners: + - '@fishloa' +ha_domain: lyngdorf +ha_ssdp: true +ha_platforms: + - media_player +ha_integration_type: device +ha_quality_scale: silver +--- + +The **Lyngdorf** {% term integration %} allows you to control [Lyngdorf] audio processors and amplifiers from Home Assistant. Lyngdorf Audio is known for their RoomPerfect room correction technology. This integration lets you control power, volume, source selection, sound modes, and audio processing parameters. + +[Lyngdorf]: https://lyngdorf.steinwaylyngdorf.com/electronics/ + +## Supported devices + +- [MP-40](https://lyngdorf.steinwaylyngdorf.com/lyngdorf-mp-40/) +- MP-50 +- [MP-60](https://lyngdorf.steinwaylyngdorf.com/lyngdorf-mp-60/) +- [TDAI-1120](https://lyngdorf.steinwaylyngdorf.com/lyngdorf-tdai-1120/) +- TDAI-2170 +- [TDAI-3400](https://lyngdorf.steinwaylyngdorf.com/lyngdorf-tdai-3400/) + +{% note %} +The MP-60 is the only model that has been tested in the wild so far. Other models should work but may not support all features. If you have a different model, please report any issues on [GitHub](https://github.com/home-assistant/core/issues). +{% endnote %} + +## Prerequisites + +- Your Lyngdorf device must be connected to the same network as Home Assistant. + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +Host: + description: "The hostname or IP address of your Lyngdorf device." +{% endconfiguration_basic %} + +## Supported functionality + +### Media players + +The integration creates two media player {% term entities %}: + +- **Main zone**: Controls your Lyngdorf device, including power, volume, mute, source selection, and sound mode. +- **Zone B**: Controls the Zone B output, including power, volume, mute, and source selection. + +## Data updates + +The **Lyngdorf** integration uses local push to receive real-time updates from the device over a TCP connection. State changes on the device are pushed to Home Assistant immediately. + +## Known limitations + +- Only the MP-60 has been tested. Other models may not support all features. +- Only local network control is supported. + +## Troubleshooting + +### Device not discovered + +#### Symptom: Device is not automatically discovered + +The Lyngdorf device does not show up as a discovered device in Home Assistant. + +#### Resolution + +To resolve this issue, try the following steps: + +1. Make sure your Lyngdorf device is powered on and connected to the same network as Home Assistant. +2. Check that UPnP/SSDP is not blocked on your network. +3. Add the device manually using its IP address. + +### Connection issues + +#### Symptom: Device shows as unavailable + +The integration shows as unavailable or disconnects frequently. + +#### Resolution + +To resolve this issue, try the following steps: + +1. Ensure your Lyngdorf device has a static IP address or DHCP reservation. +2. Check your network for stability issues. +3. Verify that no firewall rules are blocking TCP communication between Home Assistant and your device. + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} From c70fcd849b2946d51c98743e1014b8a2290e2a28 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Sun, 12 Jul 2026 10:06:11 +0200 Subject: [PATCH 077/123] Add Reolink Pre-siren and Pre-siren on event (#46776) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/reolink.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/reolink.markdown b/source/_integrations/reolink.markdown index ca79ed748c4d..bd0626cd2a9d 100644 --- a/source/_integrations/reolink.markdown +++ b/source/_integrations/reolink.markdown @@ -227,6 +227,7 @@ Depending on the supported features of the camera ([see specifications of the ca - PTZ continuous rotation* - Guard go to - Guard set current position +- Pre-siren - Restart* **PTZ left**, **right**, **up**, **down**, **left up**, **left down**, **right up**, **right down**, **zoom in** and **zoom out** will continually move the camera in the respective position until the **PTZ stop** is called or the hardware limit is reached. @@ -291,6 +292,7 @@ Depending on the supported features of the camera ([see specifications of the ca - Infrared lights in night mode - Record audio - Siren on event +- Pre-siren on event - Auto tracking - Auto focus - Guard return @@ -332,6 +334,8 @@ The **Manual record** switch will turn off automatically after 10 minutes. There Polling the status of the **Hardwired chime enabled** switch can make the hardwired chime rattle a bit depending on the model of the chime. Therefore the status of this switch is only polled one time (about 1 minute after the integration starts). The rattle at startup can only happen if you chose to enable this switch. +The **Pre-siren on event** switch only takes effect when the **Siren on event** switch is ON. + ### Light entities Depending on the supported features of the camera ([see specifications of the camera model on Reolink.com](#tested-models)), light entities are added for: From 359954994873bde6d8d2d418b2e9c213922c8210 Mon Sep 17 00:00:00 2001 From: Martin Claesson <43297668+Claeysson@users.noreply.github.com> Date: Sun, 12 Jul 2026 10:06:21 +0200 Subject: [PATCH 078/123] Add Kiosker Reauthentication Documentation (#46468) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/kiosker.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/kiosker.markdown b/source/_integrations/kiosker.markdown index 1cd18443a6be..51a8a1d0791c 100644 --- a/source/_integrations/kiosker.markdown +++ b/source/_integrations/kiosker.markdown @@ -176,6 +176,10 @@ This means that Home Assistant can't connect to the Kiosker App. 6. If you have enabled TLS, make sure that you have installed a valid certificate in the Kiosker App, typically a self-signed certificate. 7. If you have enabled `Verify certificate`, make sure that the certificate is valid and that the root certificate is marked as trusted on the host. +### Home Assistant asks you to reauthenticate + +If the API token in the Kiosker App is regenerated or changed, Home Assistant detects the failed authentication and starts a reauthentication flow. Select **Reconfigure** on the integration's notification and enter the new token. The integration reconnects without losing your existing entities or automations. + ## Removing the integration This integration follows standard integration removal. No extra steps are required. From 348d0bac26e2735d96e2501ca1a1418526ef355d Mon Sep 17 00:00:00 2001 From: Isak Nyberg <36712644+IsakNyberg@users.noreply.github.com> Date: Sun, 12 Jul 2026 15:53:03 +0200 Subject: [PATCH 079/123] remove permobil (#45215) --- CODEOWNERS | 1 - source/_integrations/permobil.markdown | 51 -------------------------- source/_redirects | 1 + 3 files changed, 1 insertion(+), 52 deletions(-) delete mode 100644 source/_integrations/permobil.markdown diff --git a/CODEOWNERS b/CODEOWNERS index f1d673c6edae..262accecc9f8 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -755,7 +755,6 @@ source/_integrations/peco.markdown @IceBotYT source/_integrations/peco_opower.markdown @tronikos source/_integrations/pegel_online.markdown @mib1185 source/_integrations/pepco.markdown @tronikos -source/_integrations/permobil.markdown @IsakNyberg source/_integrations/persistent_notification.markdown @home-assistant/core source/_integrations/pge.markdown @tronikos source/_integrations/pglab.markdown @pglab-electronics diff --git a/source/_integrations/permobil.markdown b/source/_integrations/permobil.markdown deleted file mode 100644 index 31c65465ed1b..000000000000 --- a/source/_integrations/permobil.markdown +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: MyPermobil -description: Instructions on how to integrate Permobil wheelchair into Home Assistant. -ha_category: - - Sensor -ha_iot_class: Cloud Polling -ha_release: 2023.12 -ha_domain: permobil -ha_codeowners: - - '@IsakNyberg' -ha_config_flow: true -ha_platforms: - - binary_sensor - - sensor -ha_integration_type: device ---- - -The **MyPermobil** {% term integration %} allows you to view various sensors with information about your Permobil wheelchair. For example: battery status, distance traveled, and number of seating adjustments. The values of the sensors may be delayed by several minutes and should not be relied on for any crucial applications. For the integration to work, you must ensure that _voice assistant linking_ is activated in the MyPermobil app. To do this, open the app and navigate to **Settings** > **My Account** > **Connection Settings**. - -{% include integrations/config_flow.md %} - -## Sensors - -A total of 13 sensors are available: - -- **Battery charge** - The current battery state of the wheelchair as a percentage. -- **Battery health** - The maximum amount of charge the battery can hold. Measured as a percentage of the battery's original capacity. -- **Charge time left** - A number indicating how many hours the battery needs until it is fully charged. The battery needs to be charging for this sensor to work. -- **Distance left** - The distance the wheelchair can travel on its current charge. This figure is an estimate and should not be relied upon. -- **Indoor drive time** - The estimated number of hours of indoor drive time that is left on the current battery charge. -- **Battery max watt hours** - The number of watt hours of energy stored in the battery when it is at maximum capacity. -- **Watt hours left** - The number of watt hours of energy stored in the battery on its current charge. -- **Full charge distance** - The distance the wheelchair can travel on a full charge. This figure is an estimate and should not be relied upon. -- **Distance traveled** - The distance the wheelchair has traveled today. -- **Number of adjustments** - The number of adjustments sessions today. Multiple different adjustment within a short time period are counted as a single sessions. -- **Highest number of adjustments** - The highest number of adjustments ever recorded in a single day. -- **Longest distance traveled** - The largest distance traveled ever recorded in a single day. -- **Is charging** - Binary sensor that is true when the Permobil wheelchair is charging. diff --git a/source/_redirects b/source/_redirects index f7b26d952ac4..83d40e743f58 100644 --- a/source/_redirects +++ b/source/_redirects @@ -661,6 +661,7 @@ layout: null /integrations/plum_lightpad /more-info/removed-integration 301 /integrations/postnl /more-info/removed-integration 301 /integrations/prezzibenzina /more-info/removed-integration 301 +/integrations/permobil /more-info/removed-integration 301 /integrations/ptvsd /more-info/removed-integration 301 /integrations/pushetta /more-info/removed-integration 301 /integrations/raspihats /more-info/removed-integration 301 From 915cd5abfed22d0327efb2bd0dc137d2c9c6c2e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20H=C3=B6rsken?= Date: Mon, 13 Jul 2026 05:35:19 +0200 Subject: [PATCH 080/123] Fix indentation of Supported functionality section (#46801) --- source/_integrations/wmspro.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_integrations/wmspro.markdown b/source/_integrations/wmspro.markdown index 583c061c874c..12e0a63ca584 100644 --- a/source/_integrations/wmspro.markdown +++ b/source/_integrations/wmspro.markdown @@ -44,9 +44,11 @@ See device section for support information: [buttons](#buttons), [covers](#cover The WMS WebControl pro *may* also be discovered on your local network via DHCP. {% include integrations/actions.md %} -### Supported functionality + +## Supported functionality The **WMS WebControl pro** integration provides the following entities. + ### Buttons - All devices that support an identification activity (for example, winking an awning or blinking a light) can be triggered to perform such activity. From cb5f75b1861ec5fb3c86d2ff8d339167d8a0db1f Mon Sep 17 00:00:00 2001 From: kristbaum Date: Mon, 13 Jul 2026 06:44:02 +0200 Subject: [PATCH 081/123] Update luci integration documentation (#46782) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/luci.markdown | 110 ++++++++++++++--------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/source/_integrations/luci.markdown b/source/_integrations/luci.markdown index 3872d34622a2..082442a779ac 100644 --- a/source/_integrations/luci.markdown +++ b/source/_integrations/luci.markdown @@ -5,66 +5,66 @@ ha_category: - Presence detection ha_iot_class: Local Polling ha_release: pre 0.7 +ha_config_flow: true ha_codeowners: - '@mzdrale' ha_domain: luci ha_platforms: - device_tracker -ha_integration_type: integration +ha_integration_type: hub ha_quality_scale: legacy --- -This is a presence detection scanner for OpenWrt using [luci](https://openwrt.org/docs/techref/luci). - -Before this scanner can be used you have to install the luci RPC package on OpenWrt: - -```bash -apk update -apk add luci-mod-rpc -``` - -To use this device tracker in your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -device_tracker: - - platform: luci - host: ROUTER_IP_ADDRESS - username: YOUR_ADMIN_USERNAME - password: YOUR_ADMIN_PASSWORD -``` - -{% configuration %} -host: - description: The hostname or IP address of your router, e.g., `192.168.1.1`. - required: true - type: string -username: - description: The username of a user with administrative privileges, usually `admin`. - required: true - type: string -password: - description: The password for your given admin account. - required: true - type: string -ssl: - description: If your router enforces SSL connections, set to `true`. - required: false - default: false - type: boolean -verify_ssl: - description: If SSL/TLS verification for HTTPS resources needs to be turned off (for self-signed certs) - required: false - type: boolean - default: true -{% endconfiguration %} - -See the [device tracker integration page](/integrations/device_tracker/) for instructions how to configure the people to be tracked. - -This device tracker provides several additional attributes for each tracked device (if it is at home): `flags`, `ip`, `device`, and `host`. The first three attributes are taken from the ARP table returned by the luci RPC. The `host` attribute is taken from the platform configuration and can be used to distinguish in which router a device is logged in, if you are using multiple OpenWrt routers. - -{% note %} -Some installations have [a small bug](https://github.com/openwrt/luci/issues/576). The timeout for luci RPC calls is not set and this makes the call fail. -If you want to locally fix your OpenWrt installation, you can apply the change manually to `/usr/lib/lua/luci/controller/rpc.lua`, or simply set a fixed timeout. The default is 3600. -{% endnote %} +The **OpenWrt (luci)** {% term integration %} tracks the devices connected to a router that runs [OpenWrt](https://openwrt.org/) with the [LuCI](https://openwrt.org/docs/techref/luci) web interface. Home Assistant polls the router locally, so you can use the presence of a phone or another device to tell who is home and trigger automations based on that. + +## Supported devices + +This integration works with routers running OpenWrt that have the LuCI web interface and its RPC package installed. It has been used with a wide range of OpenWrt-supported hardware. + +## Prerequisites + +Before you add the integration, prepare your router: + +- Install the LuCI RPC package on your OpenWrt router. Connect to the router over SSH and run: + + ```bash + apk update + apk add luci-mod-rpc + ``` + + On OpenWrt versions that use the older package manager, use `opkg update` and `opkg install luci-mod-rpc` instead. + +- Have the credentials of a user with administrative privileges ready. This is usually the `admin` account. + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +Host: + description: "The hostname or IP address of your router, for example `192.168.1.1`." +Username: + description: "The username of a user with administrative privileges on the router, usually `admin`." +Password: + description: "The password for that account." +SSL: + description: "Connect to the router over HTTPS. Enabled by default. Turn this off if your router only serves the LuCI interface over HTTP." +Verify SSL certificate: + description: "Verify the router's SSL certificate. Disabled by default, because most routers use a self-signed certificate. Only enable this if your router presents a certificate that Home Assistant can validate." +{% endconfiguration_basic %} + +If the credentials for your router change later, Home Assistant asks you to enter the new username and password so it can reconnect. You don't need to remove and add the integration again. + +## Supported functionality + +For each device it finds on the router, the integration creates a {% term "device tracker" %} entity that shows whether the device is home or away. Each entity also exposes the device's IP address, hostname, and MAC address. + +To choose which devices to track and how they are shown, see the [device tracker integration page](/integrations/device_tracker/). + +## Known limitations + +Some OpenWrt installations are affected by [a small bug](https://github.com/openwrt/luci/issues/576) where the timeout for LuCI RPC calls is not set, which makes the calls fail. To fix this on your router, you can apply the change manually to the `/usr/lib/lua/luci/controller/rpc.lua` file, or set a fixed timeout. The default is 3600. + +## Removing the integration + +This integration follows standard integration removal. No extra steps are required. + +{% include integrations/remove_device_service.md %} From b1f3edf51198f784a7578d11a86814a6e7e29831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20S=C4=99d=C5=82ak-Jakubowski?= Date: Mon, 13 Jul 2026 13:33:13 +0200 Subject: [PATCH 082/123] Document HTTP server UI configuration (#46764) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/http.markdown | 139 ++++++++++------------------- 1 file changed, 46 insertions(+), 93 deletions(-) diff --git a/source/_integrations/http.markdown b/source/_integrations/http.markdown index 4ad7813a6911..adb71191e6e1 100644 --- a/source/_integrations/http.markdown +++ b/source/_integrations/http.markdown @@ -1,6 +1,6 @@ --- title: HTTP -description: Offers a web framework to serve files. +description: Configure the HTTP server that serves the Home Assistant frontend and APIs. ha_category: - Other ha_release: pre 0.7 @@ -12,112 +12,65 @@ ha_domain: http ha_integration_type: system --- -The **HTTP** {% term integration %} serves all files and data required for the Home Assistant frontend. You only need to add this to your configuration file if you want to change any of the default settings. +The **HTTP** {% term integration %} serves the Home Assistant frontend and APIs. You can manage the HTTP server settings from the UI under {% my network title="**Settings** > **System** > **Network**" %}. -There is currently support for the following device types within Home Assistant: +The integration supports these entity types: - [Binary sensor](#binary-sensor) - [Sensor](#sensor) -{% warning %} -The option `server_host` should only be used on a Home Assistant Container installation! -{% endwarning %} +## HTTP server settings -```yaml -# Example configuration.yaml entry -http: -``` +To change how Home Assistant serves its web interface, go to {% my network title="**Settings** > **System** > **Network**" %}, then find the **HTTP server** section. -{% configuration %} -server_host: - description: "Only listen to incoming requests on specific IP/host. By default the `http` integration auto-detects IPv4/IPv6 and listens on all connections. Use `server_host: 0.0.0.0` if you want to only listen to IPv4 addresses. The default listed assumes support for IPv4 and IPv6." - required: false - type: [list, string] - default: "0.0.0.0, ::" -server_port: - description: Allows you to specify which port Home Assistant should listen on. - required: false - type: integer - default: 8123 -ssl_certificate: - description: Path to your TLS/SSL certificate to serve Home Assistant over a secure connection. If you are using the [Let's Encrypt app for Home Assistant](https://github.com/home-assistant/addons/tree/master/letsencrypt) (formerly known as Let's Encrypt add-on), this will be at `/ssl/fullchain.pem`. We recommend to use the [NGINX app for Home Assistant](https://github.com/home-assistant/addons/tree/master/nginx_proxy) (formerly known as NGINX add-on) instead of using this option. +### Options in the UI + +{% options_ui %} +Server port: + description: The port Home Assistant listens on. The default is `8123`. + required: true +Listen addresses: + description: The IP addresses Home Assistant binds to. Leave this empty to listen on all interfaces. required: false - type: string -ssl_peer_certificate: - description: Path to the client/peer TLS/SSL certificate to accept secure connections from. +SSL certificate path: + description: The absolute path to the TLS certificate, for example `/ssl/fullchain.pem`. required: false - type: string -ssl_key: - description: Path to your TLS/SSL key to serve Home Assistant over a secure connection. If you are using the [Let's Encrypt app](https://github.com/home-assistant/addons/tree/master/letsencrypt), this will be at `/ssl/privkey.pem`. +SSL key path: + description: The absolute path to the TLS private key, for example `/ssl/privkey.pem`. required: false - type: string -cors_allowed_origins: - description: "A list of origin domain names to allow [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) requests from. Enabling this will set the `Access-Control-Allow-Origin` header to the Origin header if it is found in the list, and the `Access-Control-Allow-Headers` header to `Origin, Accept, X-Requested-With, Content-type, Authorization`. You must provide the exact Origin. That is, `https://www.home-assistant.io` will allow requests from `https://www.home-assistant.io` but __not__ `http://www.home-assistant.io`." +SSL peer certificate path: + description: The absolute path to a client certificate Home Assistant should require for secure connections. required: false - type: [string, list] -use_x_forwarded_for: - description: "Enable parsing of the `X-Forwarded-For` header, passing on the client's correct IP address in proxied setups. You **must** also whitelist trusted proxies using the `trusted_proxies` setting for this to work. Non-whitelisted requests with this header will be considered IP spoofing attacks, and the header will, therefore, be ignored." +SSL profile: + description: The Mozilla SSL profile to use. Use **Intermediate** only if integrations have SSL handshake issues. required: false - type: boolean - default: false -use_x_frame_options: - description: "Controls the `X-Frame-Options` header to help prevent [clickjacking](https://en.wikipedia.org/wiki/Clickjacking)." +Trust X-Forwarded-For: + description: Trust the `X-Forwarded-For` header when Home Assistant is behind a reverse proxy. required: false - type: boolean - default: true -trusted_proxies: - description: "List of trusted proxies, consisting of IP addresses or networks, that are allowed to set the `X-Forwarded-For` header. This is required when using `use_x_forwarded_for` because all requests to Home Assistant, regardless of source, will arrive from the reverse proxy IP address. Therefore in a reverse proxy scenario, this option should be set with extreme care. If the immediate upstream proxy is not in the list, the request will be rejected. If any other intermediate proxy is not in the list, the first untrusted proxy will be considered the client." +Trusted proxies: + description: Reverse proxy IP addresses or CIDR networks that are allowed to set `X-Forwarded-For`. required: false - type: [string, list] -ip_ban_enabled: - description: Flag indicating whether additional IP filtering is enabled. +Enable IP banning: + description: Automatically ban IP addresses after repeated failed logins. required: false - type: boolean - default: true -login_attempts_threshold: - description: "Number of failed login attempts from a single IP after which it will be automatically banned if `ip_ban_enabled` is `true`. When set to -1 no new automatic bans will be added." +Login attempts before ban: + description: Failed login attempts before an IP address is banned. Set this to `-1` to disable automatic bans. + required: true +CORS allowed origins: + description: Origins that may make cross-origin requests. Include the scheme, for example `https://example.com`. required: false - type: integer - default: -1 -ssl_profile: - description: The [Mozilla SSL profile](https://wiki.mozilla.org/Security/Server_Side_TLS) to use. Only lower if you are experiencing integrations causing SSL handshake errors. +Send X-Frame-Options: + description: Send the `X-Frame-Options` header to help prevent clickjacking. required: false - type: string - default: modern -{% endconfiguration %} - -The sample below shows a configuration entry in the {% term "`configuration.yaml`" %} file with possible values: +{% endoptions_ui %} -```yaml -# Example configuration.yaml entry -http: - server_port: 12345 - ssl_certificate: /etc/letsencrypt/live/hass.example.com/fullchain.pem - ssl_key: /etc/letsencrypt/live/hass.example.com/privkey.pem - cors_allowed_origins: - - https://google.com - - https://www.home-assistant.io - use_x_forwarded_for: true - trusted_proxies: - - 10.0.0.200 - - 172.30.33.0/24 - ip_ban_enabled: true - login_attempts_threshold: 5 -``` - -The [Set up encryption using Let's Encrypt](/blog/2015/12/13/setup-encryption-using-lets-encrypt/) blog post gives you details about the encryption of your traffic using free certificates from [Let's Encrypt](https://letsencrypt.org/). +Saving HTTP server settings restarts Home Assistant. After Home Assistant restarts, an administrator is asked to confirm the new settings. If the settings are not confirmed within 5 minutes, Home Assistant automatically returns to the previous settings. ## Reverse proxies -When using a reverse proxy, you will need to enable the `use_x_forwarded_for` and `trusted_proxies` options. Requests from reverse proxies will be blocked if these options are not set. - -```yaml -http: - use_x_forwarded_for: true - trusted_proxies: - - 10.0.0.200 # Add the IP address of the proxy server - - 172.30.33.0/24 # You may also provide the subnet mask -``` + + +When using a reverse proxy, turn on **Trust X-Forwarded-For** and add the proxy to **Trusted proxies**. Requests from reverse proxies are blocked if these options are not set. {% important %} When a network mask is provided, you must use the network address (for example, `192.168.1.0/24`), not a host address (for example, `192.168.1.50/24`). @@ -125,7 +78,7 @@ When a network mask is provided, you must use the network address (for example, {% note %} -The `use_x_forwarded_for` and `trusted_proxies` settings only apply when Home Assistant is behind a traditional reverse proxy, such as NGINX, Caddy, Traefik, or HAProxy. If you use [Home Assistant Cloud](/integrations/cloud/) for remote access, requests arrive through a secure tunnel without `X-Forwarded-*` headers containing the original client IP address. For cloud connections, these settings have no effect, and all requests appear as coming from `127.0.0.1`. +The **Trust X-Forwarded-For** and **Trusted proxies** settings only apply when Home Assistant is behind a traditional reverse proxy, such as NGINX, Caddy, Traefik, or HAProxy. If you use [Home Assistant Cloud](/integrations/cloud/) for remote access, requests arrive through a secure tunnel without `X-Forwarded-*` headers containing the original client IP address. For cloud connections, these settings have no effect, and all requests appear as coming from `127.0.0.1`. {% endnote %} @@ -137,15 +90,15 @@ The `http` platforms are not real platforms within the meaning of the terminolog ## HTTP sensors -To use those kind of [sensors](#sensor) or [binary sensors](#binary-sensor) in your installation no configuration in Home Assistant is needed. All configuration is done on the devices themselves. This means that you must be able to edit the target URL or endpoint and the payload. The entity will be created after the first message has arrived. +To use an HTTP [sensor](#sensor) or [binary sensor](#binary-sensor), you do not need to configure anything in Home Assistant. All configuration is done on the devices themselves. This means that you must be able to edit the target URL or endpoint and the payload. The entity is created after the first message arrives. If you want to use an HTTP sensor, create a [Long-Lived Access Token](https://developers.home-assistant.io/docs/auth_api/#long-lived-access-token) in the Home Assistant UI in the **Security** section of your {% my profile title="**User profile**" %} page. -All [requests](https://developers.home-assistant.io/docs/api/rest#post-apistatesentity_id) need to be sent to the endpoint of the device and must be **POST**. +All [requests](https://developers.home-assistant.io/docs/api/rest#post-apistatesentity_id) need to be sent to the endpoint of the device and use **POST**. ## IP filtering and banning -If you want to apply additional IP filtering, and automatically ban brute force attempts, set `ip_ban_enabled` to `true` and `login_attempts_threshold` to the maximum number of attempts before a ban is activated. After the first ban, an `ip_bans.yaml` file will be created in the root configuration folder. It will have the banned IP address and time in UTC when it was added: +If you want to apply additional IP filtering and automatically ban brute force attempts, turn on **Enable IP banning** and set **Login attempts before ban** to the maximum number of attempts before a ban is activated. After the first ban, an `ip_bans.yaml` file is created in the root configuration folder. It contains the banned IP address and the time in UTC when it was added: {% note %} @@ -158,11 +111,11 @@ If you use [Home Assistant Cloud](/integrations/cloud/) for remote access, all c banned_at: "2016-11-16T19:20:03" ``` -After a ban is added a Persistent Notification will appear in the Home Assistant frontend. +After a ban is added, a persistent notification appears in the Home Assistant frontend. To clear an IP ban, you can either: -- Remove the specific IP entry from `ip_bans.yaml`, or +- Remove the specific IP entry from `ip_bans.yaml`. - Delete the entire `ip_bans.yaml` file. It will be recreated automatically the next time a ban occurs. After making changes, restart Home Assistant to apply them. @@ -280,7 +233,7 @@ http://IP_ADDRESS:8123/api/states/sensor.DEVICE_NAME You should choose a unique device name (DEVICE_NAME) to avoid clashes with other devices. {% endimportant %} - The JSON payload must contain the new state and should include the unit of measurement and a friendly name. The friendly name is used in the frontend to name the sensor. +The JSON payload must contain the new state and should include the unit of measurement and a friendly name. The friendly name is used in the frontend to name the sensor. ```json {"state": "20", "attributes": {"unit_of_measurement": "°C", "friendly_name": "Bathroom Temperature"}} From 0d543de3f898dab25f3b725556d2ad3eaf59f2f2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 13 Jul 2026 03:11:06 -1000 Subject: [PATCH 083/123] Document HomeKit climate accessory type option (#46577) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/homekit.markdown | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/source/_integrations/homekit.markdown b/source/_integrations/homekit.markdown index e4edfb3f7c28..547c15f3355a 100644 --- a/source/_integrations/homekit.markdown +++ b/source/_integrations/homekit.markdown @@ -222,10 +222,10 @@ homekit: required: true type: string type: - description: Only for `switch` and `fan` entities. Type of accessory to be created within HomeKit. Valid types for `switch` entities are `faucet`, `outlet`, `shower`, `sprinkler`, `switch` and `valve`. Valid types for `fan` entities are `fan` and `air_purifier`. + description: Only for `switch`, `fan`, and `climate` entities. Type of accessory to be created within HomeKit. Valid types for `switch` entities are `faucet`, `outlet`, `shower`, `sprinkler`, `switch` and `valve`. Valid types for `fan` entities are `fan` and `air_purifier`. Valid types for `climate` entities are `heater_cooler` and `thermostat`. For `climate` entities, the type is chosen automatically when you leave this unset. required: false type: string - default: '`switch`' + default: "`switch` for `switch` entities, `fan` for `fan` entities, and chosen automatically for `climate` entities" stream_count: description: Only for `camera` entities. The number of simultaneous streams the camera can support. required: false @@ -361,6 +361,24 @@ If you create a HomeKit integration via the UI (for example, **Settings** > **De It is recommended to only edit a HomeKit instance in the UI that was created in the UI, and likewise, only edit a HomeKit instance in YAML that was created in YAML. +### Climate accessory type + +Climate entities are exposed to HomeKit as one of two accessory types. Air conditioners and heat pumps that offer two or more fan speeds or a swing mode that can be turned off are listed as Heater Cooler accessory type. This puts the mode, target temperature, heating and cooling thresholds, fan speed, and swing on one tile, matching how the device works. Everything else, such as a central thermostat, is exposed as a Thermostat accessory. A climate entity that controls a target humidity always stays a Thermostat, since the Heater Cooler accessory cannot control humidity. + +This choice is made automatically the first time an entity is added to HomeKit. Entities that were already exposed before this feature was introduced keep their Thermostat accessory, and you can switch them to the Heater Cooler accessory at any time. + +You can also pick the accessory type yourself at any time. For a bridge created in the UI, go to {% my integrations title="**Settings** > **Devices & services**" %}, select **Configure** on the HomeKit bridge, and choose **Thermostat** or **Heater Cooler** for each climate entity in the climate step. For a bridge set up in YAML, set the entity's `type` to `heater_cooler` or `thermostat` in `entity_config`: + +```yaml +# Example configuration.yaml entry +homekit: + entity_config: + climate.living_room: + type: heater_cooler +``` + +The accessory keeps its identifier, which is derived from the entity ID, so its room assignment and name are preserved when the accessory type changes. Any Home app scenes or automations that referenced the old controls may need to be recreated against the new tile. + ### Accessory mode When exposing a Camera, Activity based remote (a `remote` that supports activities), Lock, or Television media player (a `media_player` with device class `tv` or `receiver`) to HomeKit, `mode` must be set to `accessory`, and the relevant `include` filter should be set up to only include a single entity. From f3da1cd23e075e1684d485052dceaacf21de5218 Mon Sep 17 00:00:00 2001 From: Steven Beshensky Date: Mon, 13 Jul 2026 10:11:08 -0500 Subject: [PATCH 084/123] Add Harman Luxury Audio integration (#46677) Co-authored-by: Claude Opus 4.8 --- source/_integrations/harman_luxury.markdown | 59 +++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 source/_integrations/harman_luxury.markdown diff --git a/source/_integrations/harman_luxury.markdown b/source/_integrations/harman_luxury.markdown new file mode 100644 index 000000000000..38b9cc7f1278 --- /dev/null +++ b/source/_integrations/harman_luxury.markdown @@ -0,0 +1,59 @@ +--- +title: Harman Luxury Audio +description: Instructions on how to integrate Harman Luxury Audio streamers into Home Assistant. +ha_category: + - Media player +ha_release: 2026.8 +ha_iot_class: Local Polling +ha_config_flow: true +ha_codeowners: + - '@sbesh91' +ha_domain: harman_luxury +ha_platforms: + - media_player +ha_integration_type: device +ha_quality_scale: bronze +ha_ssdp: true +--- + +The **Harman Luxury Audio** {% term integration %} lets you control network streamers built on the Harman Luxury Audio (StreamUnlimited StreamSDK) platform, such as the Arcam Radia **ST5** and **ST60**, and equivalent JBL and Mark Levinson streamers. + +It talks to the device directly on your local network; no cloud account is required. + +{% include integrations/config_flow.md %} + +Devices are discovered automatically over SSDP. You can also add one manually by entering its hostname or IP address. + +{% configuration_basic %} +Host: + description: The hostname or IP address of the streamer on your network. +{% endconfiguration_basic %} + +## Supported devices + +The following devices are known to work: + +- Arcam Radia ST5 +- Arcam Radia ST60 + +Other streamers on the same Harman Luxury Audio / StreamUnlimited platform (including JBL and Mark Levinson models) are expected to work but have not all been verified. + +## Supported functionality + +A media player entity is created for the device, exposing: + +- Playback state (playing, paused, idle) and standby status +- Now playing information: title, artist, album, artwork, duration, and position +- Volume level and mute +- Transport controls (play, pause, stop, next, previous) + +## Known limitations + +- Power cannot be controlled from Home Assistant. The device only reports its power state; it is switched on and off by its own remote, front panel, or automatic standby. The media player reports `off` when the device is in standby but does not offer power on/off. +- Transport control depends on the active source. Spotify Connect and AirPlay are controlled by the sending app: the device can pause them, but only the source app can resume. Because of this, transport buttons are shown only when the current source reports them as available. For those sources, use the originating app to start or resume playback. + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} From b1543b077cd3e6f558f6ca721e6528dbf0727655 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Mon, 13 Jul 2026 17:45:15 +0200 Subject: [PATCH 085/123] Add sensors information for Mikrotik (#46597) --- source/_integrations/mikrotik.markdown | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/source/_integrations/mikrotik.markdown b/source/_integrations/mikrotik.markdown index 87e87989f9c1..e2173e3ce56e 100644 --- a/source/_integrations/mikrotik.markdown +++ b/source/_integrations/mikrotik.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate MikroTik/RouterOS based devices in ha_category: - Hub - Presence detection + - Sensor ha_release: 0.44 ha_codeowners: - '@engrbm87' @@ -12,6 +13,7 @@ ha_domain: mikrotik ha_iot_class: Local Polling ha_platforms: - device_tracker + - sensor ha_integration_type: device --- @@ -40,7 +42,6 @@ Go to **IP** > **Services** > **API** and enable it. Make sure that port 8728 or the port you choose is accessible from your network. - {% include integrations/config_flow.md %} {% configuration_basic %} @@ -101,3 +102,18 @@ You will be prompted to set a password for the newly created user. Depending on ```bash /user set [find username=homeassistant] password=PASSWORD ``` + +## Supported functionality + +The **MikroTik** {% term integration %} provides the following entities. + +### Sensors + +The integration creates sensor entities when the connected device exposes that information. Not every device supports every sensor. + +- Uptime +- Memory usage +- Disk usage +- CPU usage +- Device temperature +- Device power voltage From d5160e52ef8ce11e98fc6c701f8d83b431ec026a Mon Sep 17 00:00:00 2001 From: Manu Date: Mon, 13 Jul 2026 17:48:26 +0200 Subject: [PATCH 086/123] Add sensors to Steam integration (#46767) --- source/_integrations/steam_online.markdown | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/source/_integrations/steam_online.markdown b/source/_integrations/steam_online.markdown index 6b5cf9c95ea2..2d4c3ce028a5 100644 --- a/source/_integrations/steam_online.markdown +++ b/source/_integrations/steam_online.markdown @@ -39,6 +39,46 @@ To find an account's 64-bit SteamID: 3. Select **Account details**. - Your **Steam ID** is displayed just below the label **Your-Account-Name Account**. + +## Supported functionality + +The **Steam** integration provides the following entities. + +### Sensors + +- **Primary sensor** + - **Name**: The Steam profile name of the account. + - **Description**: Represents the account's current presence status. + - **Available states**: + - Online + - Offline + - Away + - Busy + - Snooze + - Looking to play + - Looking to trade + - **Attributes**: + - **Account created**: The date and time when the Steam account was created. + - **Real name**: The user's real name, if provided on their Steam profile. + - **Level**: The current Steam level of the user. + - **Last online**: The date and time the Steam user was last seen online. + - **Game**: The title of the game the user is currently playing. + - **Game ID**: The Steam App ID of the currently played game. + - **Game image**: The URL of the logo image for the game the user is currently playing. + - **Game header image**: The URL of the header image for the game the user is currently playing. + - **Game icon**: The URL of the icon for the game the user is currently playing. + +- **Last online** + - **Description**: The date and time the Steam user was last seen online. + +- **Level** + - **Description**: The current Steam level of the user. + +- **Now playing** + - **Description**: The title of the game the user is currently playing. + - **Attributes**: + - **Steam App ID**: The Steam App ID of the currently played game. + ## Examples If you want to add the accounts to a group for example you will have to use: From 5e1a184572d0d7d76c8f9211d8ac53266649b2d5 Mon Sep 17 00:00:00 2001 From: Sarabveer Singh <4297171+sarabveer@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:56:33 -0400 Subject: [PATCH 087/123] Update Tesla Wall Connector docs (#46718) --- .../tesla_wall_connector.markdown | 75 +++++++++++++------ 1 file changed, 52 insertions(+), 23 deletions(-) diff --git a/source/_integrations/tesla_wall_connector.markdown b/source/_integrations/tesla_wall_connector.markdown index bd3e0f5f0e1d..a262340a3ee9 100644 --- a/source/_integrations/tesla_wall_connector.markdown +++ b/source/_integrations/tesla_wall_connector.markdown @@ -10,6 +10,7 @@ ha_iot_class: Local Polling ha_config_flow: true ha_codeowners: - '@einarhauks' + - '@sarabveer' ha_domain: tesla_wall_connector ha_dhcp: true ha_platforms: @@ -18,39 +19,67 @@ ha_platforms: ha_integration_type: device --- -The **Tesla Wall Connector** {% term integration %} allows you to integrate your Gen 3 [Tesla Wall Connector](https://www.tesla.com/support/home-charging-installation/wall-connector) with Wi-Fi into Home Assistant. +The **Tesla Wall Connector** {% term integration %} allows you to integrate your Gen 3 [Tesla Wall Connector](https://www.tesla.com/support/charging/wall-connector) with Wi-Fi into Home Assistant. {% include integrations/config_flow.md %} +{% configuration_basic %} +Host: + description: The hostname or IP address of your Tesla Wall Connector. +Single-phase / Split-phase electrical service: + description: Enable this option if your Wall Connector is powered by single-phase or split-phase electrical service. This affects the calculation of the **Total power** sensor. Leave it disabled for three-phase supply. Defaults to disabled. +{% endconfiguration_basic %} + +## Configuration options + +After setup, you can change the electrical service type. Go to {% my integrations title="**Settings** > **Devices & services**" %}, select the **Tesla Wall Connector** integration, and then select **Configure**. + +{% configuration_basic %} +Single-phase / Split-phase electrical service: + description: Enable this option if your Wall Connector is powered by single-phase or split-phase electrical service. This affects the calculation of the **Total power** sensor. Leave it disabled for three-phase supply. Defaults to disabled. +{% endconfiguration_basic %} + ## Supported functionality -### Entities - -The Tesla Wall Connector integration provides the following entities. - -#### Sensors -- **Energy** - Running total of energy used by the Wall Connector. -- **Session energy** - Energy used during the current charging session. -- **Status** - Present status of the Wall Connector. - - **Possible states** - booting, not_connected, connected, ready, negotiating, error, charging_finished, waiting_car, charging_reduced, charging -- **Contactor closed** - Binary sensor indicating if the Wall Connector is currently charging. -- **Grid frequency** - Sensor for grid frequency of the incoming AC power. -- **Grid voltage** - Sensor for grid voltage of the incoming AC power. -- **Handle temperature** - Sensor for temperature of the Wall Connector handle. -- **MCU temperature** - Sensor for temperature of the Wall Connector Main Computing Unit (MCU). -- **PCB temperature** - Sensor for temperature of the Wall Connector Power Control Board (PCB). -- **Phase current** - Sensor for the power current of each incoming AC electricity phase. -- **Phase voltage** - Sensor for the voltage of each incoming AC electricity phase. -- **Vehicle connected** - Binary sensor indicating if a vehicle is connected. -- **Status code** - Sensor for error codes generated by the Wall Connector. +The Tesla Wall Connector integration provides sensors and binary sensors that you can show on dashboards, use in automations, and add to the [Energy dashboard](/docs/energy/). + +### Sensors + +- **Lifetime energy**: Running total of energy used by the Wall Connector. +- **Session energy**: Energy used during the current charging session. +- **Status**: Present status of the Wall Connector. Possible states are **Booting**, **Vehicle not connected**, **Vehicle connected**, **Ready to charge**, **Negotiating connection**, **Error**, **Charging finished**, **Waiting for car**, **Charging (reduced)**, and **Charging**. +- **Grid frequency**: Grid frequency of the incoming AC power. +- **Grid voltage**: Grid voltage of the incoming AC power. +- **Handle temperature**: Temperature of the Wall Connector handle. +- **MCU temperature**: Temperature of the Wall Connector main computing unit. +- **PCB temperature**: Temperature of the Wall Connector power control board. +- **Phase A current**, **Phase B current**, and **Phase C current**: Current for each incoming AC electricity phase. +- **Phase A voltage**, **Phase B voltage**, and **Phase C voltage**: Voltage for each incoming AC electricity phase. +- **Total power**: Total power reported by the Wall Connector. If the Wall Connector uses single-phase or split-phase electrical service, enable **Single-phase / Split-phase electrical service** so Home Assistant calculates this sensor correctly. +- **Vehicle current**: Current being delivered to the connected vehicle. +- **Wi-Fi RSSI**: Wi-Fi signal strength reported by the Wall Connector. +- **Status code**: Error code generated by the Wall Connector. This diagnostic sensor is disabled by default. + +### Binary sensors + +- **Contactor closed**: Whether the Wall Connector is currently charging. +- **Vehicle connected**: Whether a vehicle is connected. + +### Device information + +The device page shows the Wall Connector model, model ID, serial number, and firmware version. + +## Data updates + +The Tesla Wall Connector integration {% term polling polls %} the device every 30 seconds. ## Energy dashboard -Energy usage can be easily added to the built-in [Energy dashboard](/docs/energy/) using the energy sensor. +Energy usage can be added to the built-in [Energy dashboard](/docs/energy/) using the **Lifetime energy** sensor. To add the Tesla Wall Connector to your Energy dashboard: -1. Navigate to **Settings** > **Dashboards** > **Energy**. +1. Go to {% my energy title="**Settings** > **Dashboards** > **Energy**" %}. 2. In the **Electricity grid** section, select **Add consumption**. -3. Select the Tesla Wall Connector's "Energy" sensor. +3. Select the Tesla Wall Connector **Lifetime energy** sensor. 4. Select **Save**. From 0cc9793c14c1d8d9f4c2d676b5274b8a55132e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Matheson=20Wergeland?= Date: Mon, 13 Jul 2026 17:57:14 +0200 Subject: [PATCH 088/123] Nobo hub reconfiguration flow (#45090) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- source/_integrations/nobo_hub.markdown | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/source/_integrations/nobo_hub.markdown b/source/_integrations/nobo_hub.markdown index aa7c87391067..9005b08445e5 100644 --- a/source/_integrations/nobo_hub.markdown +++ b/source/_integrations/nobo_hub.markdown @@ -28,6 +28,20 @@ on the back of the hub. If the hub is on a different network than Home Assistant {% include integrations/config_flow.md %} +## Reconfiguration + +You can update the IP address without removing and re-adding the integration. + +This is useful when: + +- The hub has moved to a new network and the stored IP address no longer reaches it. +- You want to switch between internal and external addresses (for example, when the hub is reachable on multiple subnets). + +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}. +2. On the **Nobø Ecohub** integration, select the three dots menu {% icon "mdi:dots-vertical" %} and choose **Reconfigure**. +3. Enter the new IP address. +4. Select **Submit** to save. + # Heaters Each zone containing floor or wall mounted heaters is represented as an HVAC entity. Adding and removing zones From b88e42dc21fcb72762241917bb9cc4291f0e860f Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Mon, 13 Jul 2026 18:06:08 +0200 Subject: [PATCH 089/123] KNX switch state restoration (#46822) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/knx.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown index 9b41091e4e7a..81f4fb42fb79 100644 --- a/source/_integrations/knx.markdown +++ b/source/_integrations/knx.markdown @@ -2040,8 +2040,7 @@ The KNX switch platform is used as an interface to switching actuators. Switch entities can be created from the frontend in the KNX panel or via YAML. -Switch entities without a `state_address` will restore their last known state after Home Assistant was restarted. -Switches that have a `state_address` configured request their current state from the KNX bus. +Switches restore their last known state after Home Assistant is restarted. Switches that have a `state_address` configured request their current state from the KNX bus according to their state updater configuration. Until the bus responds or the state is restored, the state is unknown if no previous state exists. {% details "Configuration of KNX switch entities via YAML" %} From 2f931f8c6d3f6ed9a617cda401ce69ebc99a30ad Mon Sep 17 00:00:00 2001 From: Matthew Dias Date: Mon, 13 Jul 2026 12:35:40 -0500 Subject: [PATCH 090/123] Document Whirlpool oven light (#46805) Co-authored-by: Claude Opus 4.8 Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/whirlpool.markdown | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/source/_integrations/whirlpool.markdown b/source/_integrations/whirlpool.markdown index af930eeade64..7520e2b64bf7 100644 --- a/source/_integrations/whirlpool.markdown +++ b/source/_integrations/whirlpool.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate Whirlpool appliances with Home Ass ha_category: - Climate - Hub + - Light - Select ha_release: '2022.10' ha_iot_class: Cloud Push @@ -16,6 +17,7 @@ ha_platforms: - binary_sensor - climate - diagnostics + - light - select - sensor ha_integration_type: hub @@ -68,10 +70,11 @@ This {% term integration %} maps appliances to entities in Home Assistant. A sin - [Binary Sensor](#binary_sensor) - [Climate](#climate) +- [Light](#light) - [Select](#select) - [Sensor](#sensor) -### Binary Sensor +### Binary sensor The binary sensor platform provides the following functionality: @@ -89,6 +92,14 @@ The following actions are also available: - [**fan mode**](/integrations/climate/#action-set-fan-mode) (`low`, `medium`, `high`) - [**swing mode**](/integrations/climate/#action-set-swing-mode) (`off`, `horizontal`) +### Light + +The light platform provides the following functionality: + +- turn an oven cavity light on or off + +Ovens with two cavities have separate light entities for the upper and lower cavity. + ### Select The select platform provides the following entity for refrigerators: From 0dfcf8069992caf71cc6ad51e1328c1e2bc981c5 Mon Sep 17 00:00:00 2001 From: Manu Date: Tue, 14 Jul 2026 00:05:38 +0200 Subject: [PATCH 091/123] Add documentation for LED Infrared integration (#46600) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/led_infrared.markdown | 102 ++++++++++++++++++ .../integrations/led_infrared/13-key.png | Bin 0 -> 63308 bytes .../integrations/led_infrared/24-key.png | Bin 0 -> 204997 bytes 3 files changed, 102 insertions(+) create mode 100644 source/_integrations/led_infrared.markdown create mode 100644 source/images/integrations/led_infrared/13-key.png create mode 100644 source/images/integrations/led_infrared/24-key.png diff --git a/source/_integrations/led_infrared.markdown b/source/_integrations/led_infrared.markdown new file mode 100644 index 000000000000..ab72f2c4fbc4 --- /dev/null +++ b/source/_integrations/led_infrared.markdown @@ -0,0 +1,102 @@ +--- +title: LED Infrared +description: Integration to control LED infrared lights with Home Assistant. +ha_category: + - Light +ha_release: 2026.8 +ha_iot_class: Assumed State +ha_codeowners: + - '@tr4nt0r' +ha_domain: led_infrared +ha_config_flow: true +ha_platforms: + - light +ha_integration_type: device +--- + +The **LED Infrared** {% term integration %} lets you control lights with any infrared emitter that has been previously configured in Home Assistant. + +Because the integration communicates over infrared, it operates in a one-way, fire-and-forget fashion: commands are sent to the light, but there is no feedback channel to confirm the current state of the light. The integration therefore uses assumed states. + +## Supported devices + +This integration supports many branded and unbranded LED bulbs, lamps, and LED strip controllers that use generic infrared remotes. If your device uses one of the remote controls listed below, it may be compatible with this integration. + +{% details "24-key remote" %} + +![24-key remote](/images/integrations/led_infrared/24-key.png) + +{% enddetails %} + +{% details "13-key remote" %} + +![13-key remote](/images/integrations/led_infrared/13-key.png) + +{% enddetails %} + +## Prerequisites + +Before setting up the LED Infrared integration, you need a working infrared transmitter set up in Home Assistant that exposes an [Infrared](/integrations/infrared/) entity. For example, you can use an ESPHome device with an IR LED pointed at your lights. + +{% include integrations/config_flow.md %} + +Select the device type that matches your remote control, then select an infrared emitter. + +{% configuration_basic %} +Device type: + description: The type of remote control used for the LED light bulb, lamp, or controller. +Infrared emitter: + description: The infrared emitter entity to use for sending commands to your device. This must be an entity provided by a hardware integration (such as ESPHome) that has already been set up with an IR emitter. +{% endconfiguration_basic %} + +## Supported functionality + +The **LED Infrared** integration provides the following entities. + +### Lights + +A light entity is created when an infrared emitter is configured. + +- **Light** + - **Description**: Represents the LED device and allows it to be controlled using infrared (IR) commands. + - **Supported features**: Turn on, turn off, and select effects. + - **Available effects**: Depend on the capabilities of the configured IR remote. + +## LED Infrared automation examples + +The following example demonstrates how to automate an LED Infrared device. For additional automation examples, refer to the light platform [actions reference](/integrations/light/#list-of-actions). + +{% include docs/paste_yaml_tip.md %} + +### Automation: Turning on the LED strip at night + +- **Trigger**: Sun: after sunset + - **Target**: Optional trigger target if needed +- **Condition**: Optional condition if needed +- **Action**: Turn on light + +{% details "YAML example for turning on LED strip at night" %} + +{% example %} +automation: | + alias: "Turn on the LEDs during the night" + triggers: + - trigger: sun + event: sunset + actions: + - action: light.turn_on + target: + entity_id: light.led_strip +{% endexample %} + +{% enddetails %} + +## Known limitations + +The integration uses assumed state, meaning Home Assistant cannot read the actual state of the light (for example, whether it is on or off, or what the current brightness is). + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} diff --git a/source/images/integrations/led_infrared/13-key.png b/source/images/integrations/led_infrared/13-key.png new file mode 100644 index 0000000000000000000000000000000000000000..6c167c7e49a0284dcdf35a5d898c12046ca1ab1f GIT binary patch literal 63308 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 BqjLZN literal 0 HcmV?d00001 diff --git a/source/images/integrations/led_infrared/24-key.png b/source/images/integrations/led_infrared/24-key.png new file mode 100644 index 0000000000000000000000000000000000000000..f2cf14b272c4c49e2216b78cf70344b796a98f82 GIT binary patch literal 204997 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

6c9YYa_f;-7|gBC0zkIN+MJ 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 literal 0 HcmV?d00001 From 6516ec8f0f5df338073a6a161e835724aac6fa1b Mon Sep 17 00:00:00 2001 From: Filipe Date: Tue, 14 Jul 2026 10:15:23 +1200 Subject: [PATCH 092/123] Add S3000 Pro support to Edifier Infrared (#46773) --- source/_integrations/edifier_infrared.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_integrations/edifier_infrared.markdown b/source/_integrations/edifier_infrared.markdown index 242f0452139f..70c98ab00dd2 100644 --- a/source/_integrations/edifier_infrared.markdown +++ b/source/_integrations/edifier_infrared.markdown @@ -50,6 +50,7 @@ The integration supports the following Edifier speaker models and remote profile - RC20G - RC31A - RC80B +- S3000 Pro - S360DB Several of these models share the same IR command set, so other Edifier speakers that ship with the same remote may also work — try the closest model in the list. If your model is not listed and you want it supported, please [open an issue on the infrared-protocols repository](https://github.com/home-assistant-libs/infrared-protocols/issues) with captured IR signals from your remote. @@ -69,11 +70,15 @@ The **Edifier Infrared** integration provides the following entities. Some models also provide button entities for functionality that is not exposed by the media player entity, such as selecting a specific input or toggling sound effects. The available buttons depend on the selected model, because not every Edifier remote exposes the same buttons. Possible buttons include: - **Bluetooth**: Switches the speaker to its Bluetooth input. +- **USB**: Switches the speaker to its USB input. - **Line 1** and **Line 2**: Switch the speaker to the corresponding line input. +- **Line / Balanced**: Toggles between the line and balanced inputs. - **AUX**: Switches the speaker to its auxiliary input. - **PC**: Switches the speaker to its PC input. - **Optical**: Switches the speaker to its optical input. - **Coaxial**: Switches the speaker to its coaxial input. +- **Optical / Coaxial**: Toggles between the optical and coaxial inputs. +- **Classic EQ**, **Dynamic EQ**, **Monitor EQ**, and **Vocal EQ**: Select the corresponding equalizer preset. - **FX on** and **FX off**: Turn the speaker's sound effects on or off. From 3c3dd7bda0de11dc0efc2c83d05c9e9b7f2fda98 Mon Sep 17 00:00:00 2001 From: Dan Raper Date: Tue, 14 Jul 2026 06:22:04 +0100 Subject: [PATCH 093/123] Remove Energy section from ohme.markdown (#46464) --- source/_integrations/ohme.markdown | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/_integrations/ohme.markdown b/source/_integrations/ohme.markdown index 9138b92d3966..a03e897122a8 100644 --- a/source/_integrations/ohme.markdown +++ b/source/_integrations/ohme.markdown @@ -93,9 +93,6 @@ The Ohme integration provides the following entities. - **Current** - **Description**: Current draw from the charger in amperes. - **Available for devices**: all -- **Energy** - - **Description**: Energy consumption of the charger in kWh. - - **Available for devices**: all - **Voltage** - **Description**: Voltage supplied to the charger. This is only available when a vehicle is connected. - **Available for devices**: all From cba9416a0e360c3f15f4b465c8d5a23cb5388644 Mon Sep 17 00:00:00 2001 From: Pieter Smit Date: Tue, 14 Jul 2026 07:27:12 +0200 Subject: [PATCH 094/123] Add estimated arrival sensor to Picnic (#46788) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/picnic.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/picnic.markdown b/source/_integrations/picnic.markdown index b76837bbaa33..a6d7af1af452 100644 --- a/source/_integrations/picnic.markdown +++ b/source/_integrations/picnic.markdown @@ -40,6 +40,7 @@ This integration provides the following sensors. Some sensors are disabled by de | Last order total price | The total price of the last order. | | Next delivery ETA start | Start of the ETA window of the next delivery, will get more precise if the driver is underway. | | Next delivery ETA end | End of the ETA window of the next delivery. | +| Estimated arrival of next delivery | Precise estimated arrival time of the next delivery, based on the live position of the delivery vehicle. Only available shortly before the delivery, `unknown` otherwise. | | Next delivery slot start | Start of the next delivery's delivery slot. | | Next delivery slot end | End of the next delivery's delivery slot. | From 371055dd751ce9d3bcc4a0d7be1fdc12d6ba16d1 Mon Sep 17 00:00:00 2001 From: Denis Shulyaka Date: Tue, 14 Jul 2026 09:38:08 +0300 Subject: [PATCH 095/123] Add GPT-5.6 pro mode (#46840) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/openai_conversation.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/openai_conversation.markdown b/source/_integrations/openai_conversation.markdown index e3a8c3924ac9..d84b4e130fde 100644 --- a/source/_integrations/openai_conversation.markdown +++ b/source/_integrations/openai_conversation.markdown @@ -90,6 +90,8 @@ Store requests and responses in OpenAI: description: If enabled, OpenAI stores requests and responses and you can view them in your OpenAI dashboard logs. Disabled by default. Service tier: description: The available service tiers are Auto, Standard, Flex, and Priority. Flex tier offers lower costs in exchange for slower response times, which can be useful for background automations. [Priority processing](https://openai.com/api-priority-processing/) delivers significantly lower and more consistent latency than the Standard tier at a higher price. Auto is the default value, which uses the [project settings](https://platform.openai.com/settings/organization/projects). See the [Pricing](https://developers.openai.com/api/docs/pricing) for details on the supported models. When the selected tier is unavailable due to capacity or ramp rate limits, the request is processed at the Standard tier, and you are charged the Standard tier price. +Pro mode: + description: Perform more model work to improve reliability on difficult tasks and return a single final answer. Enable it when quality matters more than latency and token usage. Pro mode aggregates the model work performed to produce the final answer and bills those tokens at the selected model’s standard token rates. Pro mode performs more model work than standard mode, increasing token usage and cost. This parameter is only applicable to GPT-5.6 and above; existing Pro model IDs keep their current behavior and pricing. Enable web search: description: Enable OpenAI-provided [Web search tool](https://openai.com/index/new-tools-for-building-agents/#web-search). Note that it is only available for gpt-4o and newer models. Search context size: From ec892f3ff9172512186c8af8c29315a476880c22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Matheson=20Wergeland?= Date: Tue, 14 Jul 2026 09:46:22 +0200 Subject: [PATCH 096/123] =?UTF-8?q?Expand=20Nob=C3=B8=20Ecohub=20documenta?= =?UTF-8?q?tion=20toward=20gold=20quality=20scale=20(#46838)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/nobo_hub.markdown | 189 +++++++++++++++++++------ 1 file changed, 145 insertions(+), 44 deletions(-) diff --git a/source/_integrations/nobo_hub.markdown b/source/_integrations/nobo_hub.markdown index 9005b08445e5..c8dfb950bf6b 100644 --- a/source/_integrations/nobo_hub.markdown +++ b/source/_integrations/nobo_hub.markdown @@ -17,17 +17,66 @@ ha_platforms: ha_integration_type: hub ha_quality_scale: bronze ha_dhcp: true +related: + - docs: /docs/organizing/areas/#creating-an-area + title: Areas in Home Assistant + - docs: /docs/automation/ + title: Automations --- -Integrates [Nobø Ecohub](https://www.glendimplex.no/produkter/varmestyring/11123610/noboe-hub/c-77/p-330) -into Home Assistant. This integration is not officially supported or endorsed by Glen Dimplex Nordic AS, -and the authors/maintainers are not official partners of Glen Dimplex Nordic AS. +The **Nobø Ecohub** {% term integration %} connects Home Assistant to your [Nobø Ecohub](https://www.glendimplex.no/produkter/varmestyring/11123610/noboe-hub/c-77/p-330), a Norwegian heating controller from Glen Dimplex Nordic AS. The hub manages electric panel heaters, floor heating, and on/off receivers grouped into zones, and lets you follow weekly heating schedules with eco, comfort, and away setpoints. -To configure the integration, you need the 3 last digits of the serial number of your hub. The serial number is located -on the back of the hub. If the hub is on a different network than Home Assistant (such as IoT VLAN or another routable network from Home Assistant), you also need to provide the IP address of the hub. +With this integration, you can control your heating zones, switch between week profiles, and read temperatures from any connected Nobø Switch—all locally over your network, without depending on a cloud service. + +This integration is not officially supported or endorsed by Glen Dimplex Nordic AS, and the authors and maintainers are not official partners of Glen Dimplex Nordic AS. + +## How you can use this integration + +The Nobø Ecohub is mainly used in homes and cabins with electric heating in the Nordic region. Typical things you can do with this integration are: + +- Control heating zones directly from your dashboard, with the same eco, comfort, and away presets you have in the Nobø Energy mobile app. +- Switch the active week profile for a zone from an automation. For example, switch a cabin to its weekend profile when you leave for a trip on Friday. +- Trigger a global override (such as away or eco) when everyone leaves home, and clear it again when someone returns. +- Use the temperature reading from a Nobø Switch as a trigger in your automations, or display it on a dashboard alongside other room sensors. +- Coordinate the Nobø heaters with other heat sources, such as a heat pump, by switching presets or week profiles based on outdoor temperature, electricity price, or solar production. +- Turn heaters fully off in a zone, for example to switch off cabin heating outside of the heating season. See [Turning a zone fully off](#turning-a-zone-fully-off) for the recommended approach. + +## Supported devices + +The integration is built around the Nobø Ecohub and supports the devices that the hub itself manages: + +- **Nobø Ecohub**: The bridge between your Nobø system and Home Assistant. Each zone you have configured in the hub is exposed in Home Assistant. +- **Heaters and on/off receivers**: Floor and wall-mounted heaters, and any on/off receivers in a zone, are controlled through their zone's climate entity. Heaters with a built-in thermostat that supports remote control let you change the zone's eco and comfort temperatures from Home Assistant. +- **Nobø Switch (SW4)**: Exposed as a temperature {% term sensor %}. If the switch is linked to a zone in the Nobø Energy app, its temperature is also shown as the current temperature of that zone. + +Individual heaters, switches, and zones must be added and configured using the Nobø Energy mobile app. Home Assistant reads whatever the hub already knows about. + +Each zone is added as a device in Home Assistant, and its zone name is offered as a suggested [area](/docs/organizing/areas/#creating-an-area). You can accept the suggestion to group the zone's entities with the rest of that room, or pick a different area. + +## Prerequisites + +Before adding the integration, make sure the following is in place: + +- Your Nobø Ecohub is powered up and connected to your network. +- Your zones, heaters, and any Nobø Switches are set up in the Nobø Energy mobile app, and you can control them from the app. +- You know the last 3 digits of your hub's serial number. The full 12-digit serial number is printed on a label on the back of the hub. +- If your hub is on a different network than Home Assistant, for example on an IoT VLAN, make sure that network is routable from Home Assistant and that you know the hub's IP address. {% include integrations/config_flow.md %} +In most cases, the hub is discovered automatically on your network, and you only need to enter the 3-digit serial number suffix. If the hub is not discovered, choose **Manual** in the device list and enter the full 12-digit serial number together with the hub's IP address. + +{% configuration_basic %} +Discovered hubs: + description: "Select the Nobø Ecohub discovered on your local network, or choose **Manual** to enter the details by hand." +Serial number suffix (3 digits): + description: "The last 3 digits of the serial number printed on the back of your Nobø Ecohub. Used to confirm that you own the discovered hub." +Serial number (12 digits): + description: "The full 12-digit serial number printed on the back of your Nobø Ecohub. Only required when adding the hub manually." +IP address: + description: "The IP address of your Nobø Ecohub. Only required when adding the hub manually, for example when the hub is on a different network than Home Assistant." +{% endconfiguration_basic %} + ## Reconfiguration You can update the IP address without removing and re-adding the integration. @@ -42,61 +91,113 @@ This is useful when: 3. Enter the new IP address. 4. Select **Submit** to save. -# Heaters +## Configuration options + +The integration provides one configuration option that you can change later under {% my integrations title="**Settings** > **Devices & services**" %} by selecting **Configure** on the Nobø Ecohub entry: + +{% configuration_basic %} +Override type: + description: "Controls how long overrides stay active when you change the preset of a zone or trigger a global override. Select **Constant** to keep the override until you clear it manually, or **Now** to end the override at the next week profile change (the same as duration **Now** in the Nobø Energy app). The default is **Constant**." +{% endconfiguration_basic %} + +## Supported functionality + +The integration creates entities for every zone in the hub, a global override selector for the hub itself, and a temperature sensor for every Nobø Switch and thermostat that reports a temperature. + +### Climate entities + +Each zone in your hub is exposed as a climate entity. You can use it to set the HVAC mode, change the preset, and adjust the eco and comfort target temperatures. + +- **HVAC modes**: + - **Auto**: The zone follows the active week profile. The preset reflects the state the zone is currently in. + - **Heat**: The zone is overridden and stays in the selected preset (away, eco, or comfort) until the override ends. + - **Off**: Shown only when the current week profile sets the zone to off. You cannot select this mode manually. See [Turning a zone fully off](#turning-a-zone-fully-off). +- **Presets**: **None**, **Comfort**, **Eco**, and **Away**. In **Away**, the setpoint is fixed at 7°C for frost protection and cannot be changed, and any on/off receivers in the zone are switched off. +- **Target temperatures**: Eco (low) and comfort (high) setpoints, between 7°C and 30°C, in steps of 1°C. You can change these setpoints on any zone, but a new value only takes effect if the zone contains a thermostat that supports remote control of its eco or comfort temperature. + +The HVAC mode and preset are linked, so a change to one updates the other: + +- Selecting a preset of **Away**, **Eco**, or **Comfort** switches the HVAC mode to **Heat**. +- Selecting preset **None** switches the HVAC mode to **Auto** and updates the preset to match the active week profile. +- Selecting HVAC mode **Auto** clears the override and updates the preset to match the active week profile. +- Selecting HVAC mode **Heat** sets the preset to **Comfort**. + +### Select entities + +- **Week profile**: Per zone. Lets you change which week profile is active. Week profiles must be created and edited in the Nobø Energy mobile app. The selector lists the profiles the hub currently knows about. +- **Global override**: One per hub. Overrides every zone (except zones that are configured in the Nobø Energy app to ignore the global override) to the selected preset. The available options are **None**, **Away**, **Eco**, and **Comfort**. The global override uses the same override type as preset changes. + +### Sensor entities + +- **Temperature**: One per device that reports a temperature, such as a Nobø Switch (SW4) or a thermostat with a temperature sensor. The reading is in degrees Celsius. If the device is linked to a zone, the same temperature is also shown as the current temperature on that zone's climate entity. + +## Examples + +A few practical ways to use the integration in automations: + +- Activate away mode when nobody is home: use a state change on your home and away group or a person {% term entity %} as the trigger, and have the automation select **Away** on the global override selector. When someone returns, change the global override back to **None** to follow the normal week profiles again. +- Use a cabin profile on weekends: select a different week profile for a zone based on a time trigger, for example switching the living room zone to a weekend profile every Friday afternoon and back to a weekday profile on Sunday evening. +- Preheat before arrival: when you start the drive to a cabin, set the relevant zones to preset **Comfort**. On arrival, switch them back to preset **None** to let the week profile take over again. +- Pause heating when the heat pump can carry the load: when your heat pump is producing enough heat, switch the Nobø zones to preset **Eco** to avoid double-heating. Switch back to **None** when the heat pump stops. +- Show room temperatures on a dashboard: add the temperature sensors from your Nobø Switches to a dashboard alongside your other room sensors to keep an eye on every zone at a glance. + +### Turning a zone fully off + +The Nobø system does not expose an off preset, because the away preset doubles as frost protection and is fixed at 7°C. To turn a zone fully off, for example outside of the heating season or while a cabin is empty for a longer time, use a dedicated week profile: + +1. In the Nobø Energy mobile app, create a new week profile and set every day to state off. +2. To turn a zone off, switch that zone to the new week profile. You can do this from Home Assistant by changing the **Week profile** select entity for the zone. +3. To turn the zone on again, switch back to your normal week profile. + +The climate entity for the zone shows HVAC mode **Off** while the active week profile keeps the zone off. On/off receivers in the zone are switched off, and heaters with their own thermostat are no longer driven by the hub. + +For more background on week profiles, see the [Nobø Ecohub manual](https://help.nobo.no/en/user-manual/before-you-start/what-is-a-weekly-program/). + +## Data updates + +The integration uses a local push connection to your Nobø Ecohub. When you set up the integration, Home Assistant opens a persistent TCP connection to the hub and registers for live updates. Any change made on the hub—for example, when a week profile changes state, when the temperature reported by a Nobø Switch changes, or when someone presses a Nobø Switch—is pushed to Home Assistant within seconds. + +The current preset of a zone can also change on its own, when the active week profile moves from one scheduled state to the next. The hub does not send an event for this. To keep the zone's preset accurate, the integration re-checks the active week profile against the clock every 60 seconds. This check is local and does not add any traffic to the hub. -Each zone containing floor or wall mounted heaters is represented as an HVAC entity. Adding and removing zones -and heaters must be done using the Nobø Energy mobile app. +If the connection to the hub is lost, for example because the hub's IP address has changed, the integration tries to rediscover the hub on your local network using a UDP broadcast and reconnects automatically when it finds the hub again. This rediscovery only works if Home Assistant and the hub are on the same network segment. -## Operation modes +## Known limitations -Currently, you can see and change operation and preset for zones and set eco/comfort temperatures if you have -a thermostat that supports remote control of the temperature settings. +The integration cannot manage the configuration of your Nobø system. The following must be done in the Nobø Energy mobile app: -The possible operation modes are as follows: +- Registering or deregistering Nobø devices: Heaters, on/off receivers, and Nobø Switches have to be paired with and removed from the hub in the Nobø Energy app. +- Creating or deleting zones: Zones, including their name and which devices belong to them, are defined in the Nobø Energy app. +- Creating, updating, or deleting week profiles: Week profile schedules can only be edited in the Nobø Energy app. In Home Assistant, you can only select which existing profile is active for a zone. -- "Auto" - In this mode, the zone is in the default setting and preset shows which state the zone is in right now - (according to calendar setup). -- "Heat" - In this mode the zone is overridden and in the state selected by the preset ("Away", "Eco" - or "Comfort"). +## Troubleshooting -This can be utilized the following ways: +### Setup fails with "Failed to connect - check serial number" -- Changing preset to "Away", "Eco", or "Comfort" will automatically change operation mode to "Heat". -- Changing preset to none will automatically change operation to "Auto" and update preset. -- Changing operation to "Auto" will automatically update preset. -- Changing operation to "Heat" will set preset to "Comfort". +The hub was reachable on the network, but it rejected the serial number you entered. Re-check the last 3 digits of the serial number on the label on the back of the hub and try again. If you set up the hub manually, also check that the full 12-digit serial number matches. -### Preset override duration +### Setup fails with "Failed to connect - check IP address" -By default, all overrides (when operation is not in "Auto" mode) are constant. It is possible to change this -to let overrides end when the week profile changes next (same as duration "Now" in the Nobø Energy mobile app) -in the integration configuration. +Home Assistant could not open a connection to the IP address you entered. Make sure that: -### Week profiles +- The hub is powered up and connected to your network. +- The IP address is correct. To confirm the hub is reachable, check {% my logs title="**Settings** > **System** > **Logs**" %} for connection errors, or ping the hub's IP address from another device on your network. +- No firewall rule blocks the traffic between Home Assistant and the hub, especially if the hub is on a different VLAN. -The week profiles are retrieved from the hub. It is possible to change the current week profile for a zone -using a selector. Week profiles must be created and edited using the Nobø Energy mobile app. +### The hub becomes unavailable after its IP address changes -### No preset "Off" +The integration tries to rediscover the hub automatically when it cannot reach the stored IP address. This uses a UDP broadcast that only works on the same network segment. -Nobø heaters do not support preset "Off". This is not a limitation of the integration, but a safety mechanism in the -Nobø system (perhaps related to frozen pipes due to frost in Nordic regions). -"Away" temperature is fixed to 7°C and cannot be altered. On/off receivers will be off when the zone is in "Away" status. +- If Home Assistant and the hub are on the same network, the integration usually picks up the new IP address on its own. +- If the hub is on a different network, the rediscovery does not reach it. In that case, update the stored address using [Reconfiguration](#reconfiguration). -To turn heaters completely off, follow these steps (this is a workaround solution): -1. In the Nobø Energy mobile app, create a week profile. - - In this profile, set all days to state off. -2. To turn a zone off, select this week profile for the zone. -3. To turn a zone on again, switch to the normal week profile for the zone. +To avoid this issue, give the hub a static IP address or a DHCP reservation on your router. -For more information, see the [Nobø Ecohub manual](https://help.nobo.no/en/user-manual/before-you-start/what-is-a-weekly-program/). +### Setting a target temperature does not seem to do anything -## Global override +The eco and comfort setpoints always update, but they only take effect on zones that include a thermostat that supports remote control of the temperature setpoints. Zones that contain only on/off receivers or heaters without this support keep following their own temperature settings and ignore the new setpoint. -To override all zones to a given preset (except the zones configured to not respect global override), use the global -override selector. Global override duration respects the same configuration as preset override duration. +## Removing the integration -# Nobø Switch +This integration follows standard integration removal. -Each Nobø Switch (SW4) is represented as a temperature sensor. If a switch is linked to a zone, the temperature is -also available as the current temperature of the HVAC entity. +{% include integrations/remove_device_service.md %} From 355eb5055c1de5d4be585aa64e52c194dca56dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Matheson=20Wergeland?= Date: Tue, 14 Jul 2026 13:00:55 +0200 Subject: [PATCH 097/123] =?UTF-8?q?Nob=C3=B8=20Ecohub:=20add=20automation?= =?UTF-8?q?=20examples=20(#46849)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_integrations/nobo_hub.markdown | 44 ++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/source/_integrations/nobo_hub.markdown b/source/_integrations/nobo_hub.markdown index c8dfb950bf6b..043885e8c8bb 100644 --- a/source/_integrations/nobo_hub.markdown +++ b/source/_integrations/nobo_hub.markdown @@ -133,14 +133,43 @@ The HVAC mode and preset are linked, so a change to one updates the other: ## Examples -A few practical ways to use the integration in automations: +A few practical ways to use the integration: - Activate away mode when nobody is home: use a state change on your home and away group or a person {% term entity %} as the trigger, and have the automation select **Away** on the global override selector. When someone returns, change the global override back to **None** to follow the normal week profiles again. -- Use a cabin profile on weekends: select a different week profile for a zone based on a time trigger, for example switching the living room zone to a weekend profile every Friday afternoon and back to a weekday profile on Sunday evening. - Preheat before arrival: when you start the drive to a cabin, set the relevant zones to preset **Comfort**. On arrival, switch them back to preset **None** to let the week profile take over again. - Pause heating when the heat pump can carry the load: when your heat pump is producing enough heat, switch the Nobø zones to preset **Eco** to avoid double-heating. Switch back to **None** when the heat pump stops. - Show room temperatures on a dashboard: add the temperature sensors from your Nobø Switches to a dashboard alongside your other room sensors to keep an eye on every zone at a glance. +### Following presence with the global override + +This pair of automations sets the global override to **Away** when everyone leaves home, and clears it again when the first person returns so every zone goes back to its normal week profile. Replace `group.family` with your own presence group or person {% term entity %}, and `select.my_eco_hub_global_override` with the name of your hub's global override selector. + +{% example %} +automation: | + - alias: "Nobø: set away when everyone leaves" + triggers: + - trigger: state + entity_id: group.family + from: "home" + actions: + - action: select.select_option + target: + entity_id: select.my_eco_hub_global_override + data: + option: "away" + - alias: "Nobø: clear away when someone comes home" + triggers: + - trigger: state + entity_id: group.family + to: "home" + actions: + - action: select.select_option + target: + entity_id: select.my_eco_hub_global_override + data: + option: "none" +{% endexample %} + ### Turning a zone fully off The Nobø system does not expose an off preset, because the away preset doubles as frost protection and is fixed at 7°C. To turn a zone fully off, for example outside of the heating season or while a cabin is empty for a longer time, use a dedicated week profile: @@ -149,6 +178,17 @@ The Nobø system does not expose an off preset, because the away preset doubles 2. To turn a zone off, switch that zone to the new week profile. You can do this from Home Assistant by changing the **Week profile** select entity for the zone. 3. To turn the zone on again, switch back to your normal week profile. +To automate this, use a `select.select_option` action on the zone's week profile selector. Replace `select.cabin_week_profile` with the week profile selector for your zone, and `Off` with the exact name of the profile you created in the Nobø Energy app. + +{% example %} +action: | + - action: select.select_option + target: + entity_id: select.cabin_week_profile + data: + option: "Off" +{% endexample %} + The climate entity for the zone shows HVAC mode **Off** while the active week profile keeps the zone off. On/off receivers in the zone are switched off, and heaters with their own thermostat are no longer driven by the hub. For more background on week profiles, see the [Nobø Ecohub manual](https://help.nobo.no/en/user-manual/before-you-start/what-is-a-weekly-program/). From 28cce8e2b15592edddfb2132f5559c5f04e3f16e Mon Sep 17 00:00:00 2001 From: Flo <57716204+sli-cka@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:45:29 +0200 Subject: [PATCH 098/123] Add Karakeep documentation (#46337) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Marcin Sędłak-Jakubowski --- source/_integrations/karakeep.markdown | 102 +++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 source/_integrations/karakeep.markdown diff --git a/source/_integrations/karakeep.markdown b/source/_integrations/karakeep.markdown new file mode 100644 index 000000000000..c8aa550b231f --- /dev/null +++ b/source/_integrations/karakeep.markdown @@ -0,0 +1,102 @@ +--- +title: Karakeep +description: Instructions on how to integrate Karakeep into Home Assistant. +ha_release: 2026.8 +ha_category: + - Sensor +ha_iot_class: Local Polling +ha_config_flow: true +ha_domain: karakeep +ha_codeowners: + - '@sli-cka' +ha_integration_type: service +ha_quality_scale: bronze +related: + - url: https://karakeep.app/ + title: Karakeep + - url: https://docs.karakeep.app/ + title: Karakeep documentation +ha_platforms: + - sensor +--- + +The **Karakeep** {% term integration %} allows you to connect your [Karakeep](https://karakeep.app/) instance to Home Assistant and monitor bookmark statistics. + +Karakeep is a self-hostable bookmarking and read-it-later service for saving, organizing, and tagging links, notes, images, and other content. + +## Prerequisites + +To use this integration, you need: + +- A running Karakeep instance that Home Assistant can reach. +- A Karakeep API key. + +{% details "Create an API key" %} + +1. Log in to your Karakeep instance. +2. Go to **Settings** > **API Keys**. +3. Create a new API key. +4. If your Karakeep instance is version `0.32.0` or later and uses granular scopes, grant the API key the **User account** > **read** scope. +5. Copy the API key and use it during setup in Home Assistant. + +{% enddetails %} + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +URL: + description: "The URL of your Karakeep instance, for example `https://karakeep.example.com`." +API key: + description: "The Karakeep API key used to connect to your instance." +Verify SSL certificate: + description: "Whether to verify the SSL certificate of your Karakeep instance. Disable this if your instance uses a self-signed certificate." +{% endconfiguration_basic %} + +## Supported functionality + +The Karakeep integration provides sensors for account statistics. The Karakeep server version is shown on the integration's device page when your instance is running version `0.29.0` or later. + +### Sensors + +For each config entry, the integration creates the following {% term sensors %}: + +- **Bookmarks**: Number of bookmarks in Karakeep. +- **Favorites**: Number of favorite bookmarks. +- **Archived**: Number of archived items. +- **Highlights**: Number of highlights. +- **Lists**: Number of lists. +- **Tags**: Number of tags. + +## Data updates + +The Karakeep integration {% term polling polls %} the statistics from your Karakeep instance every 5 minutes. + +## Troubleshooting + +### Cannot connect to Karakeep + +#### Symptom: "Failed to connect" + +During setup, Home Assistant cannot reach the Karakeep instance. + +#### Resolution + +1. Make sure the URL includes `http://` or `https://`. +2. Make sure Home Assistant can reach the Karakeep instance over the network. +3. Check whether a reverse proxy, firewall, or TLS certificate issue is blocking access from Home Assistant. + +### Authentication fails during setup + +#### Symptom: "Invalid authentication" + +During setup, Home Assistant reports that the provided API key is not valid. + +#### Resolution + +Verify that the API key is copied correctly and is still valid in Karakeep. + +## Removing the integration + +{% include integrations/remove_device_service.md %} + +If you no longer use the API key, you can remove it from your Karakeep instance. From cf2b0a5b16ded043ebdb2781a7e3ff3dce710a06 Mon Sep 17 00:00:00 2001 From: Hamish Date: Wed, 15 Jul 2026 02:44:46 +0930 Subject: [PATCH 099/123] Add documention for new integration Gatus (#46533) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Marcin Sędłak-Jakubowski --- CODEOWNERS | 1 + source/_integrations/gatus.markdown | 159 ++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 source/_integrations/gatus.markdown diff --git a/CODEOWNERS b/CODEOWNERS index 262accecc9f8..30f4cf3579fc 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -345,6 +345,7 @@ source/_integrations/garage_door.markdown @home-assistant/core source/_integrations/garages_amsterdam.markdown @klaasnicolaas source/_integrations/gardena_bluetooth.markdown @elupus source/_integrations/gate.markdown @home-assistant/core +source/_integrations/gatus.markdown @TN-1 source/_integrations/gaviota.markdown @starkillerOG source/_integrations/gdacs.markdown @exxamalte source/_integrations/generic.markdown @davet2001 diff --git a/source/_integrations/gatus.markdown b/source/_integrations/gatus.markdown new file mode 100644 index 000000000000..9d8ab48a7f2f --- /dev/null +++ b/source/_integrations/gatus.markdown @@ -0,0 +1,159 @@ +--- +title: Gatus +description: Instructions on how to integrate Gatus with Home Assistant. +ha_category: + - Binary sensor +ha_release: 2026.8 +ha_iot_class: Local Polling +ha_config_flow: true +ha_codeowners: + - '@TN-1' +ha_domain: gatus +ha_integration_type: service +ha_platforms: + - binary_sensor +ha_quality_scale: silver +--- + +The **Gatus** {% term integration %} connects Home Assistant with your [Gatus](https://gatus.io) monitoring instance. Gatus is a developer-oriented health dashboard that lets you monitor your services using HTTP, ICMP, TCP, and DNS queries, and evaluate results based on conditions like status codes, response times, certificate expiration, and response bodies. + +## Use cases + +- Display the live status of your self-hosted services on a Home Assistant dashboard. +- Trigger automations or send notifications when a monitored service goes down or comes back up. +- Combine endpoint status with other Home Assistant entities to coordinate responses to outages, such as switching to a backup service or alerting specific people. + +## Prerequisites + +You need the base URL of your Gatus instance, for example `http://gatus.local:8080` or `https://status.example.com`. + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +URL: + description: "The full base URL of your Gatus status page instance, including the protocol and port. For example: `http://gatus.local:8080` or `https://status.example.com`." +{% endconfiguration_basic %} + +### Supported versions + +This integration supports **Gatus version 5.x.x or higher** + +## Supported functionality + +The **Gatus** {% term integration %} provides the following entities. + +### Binary sensors + +For each endpoint configured in Gatus, the integration creates one binary sensor. + +- **Connectivity**: Reports `on` (connected) when the most recent check for that endpoint succeeded, and `off` (disconnected) when it failed. + +## Gatus automation examples + +Here are a few ideas to get you started. + +{% include docs/paste_yaml_tip.md %} + +### Send a notification when a service goes down + +Get notified the moment one of your monitored endpoints fails its health check. + +To create this automation in the UI: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %} and create a new automation. +2. Add a **State** trigger. +3. In **Entity**, select the Gatus binary sensor for the endpoint you want to monitor. +4. In **To**, enter `off`. +5. Add the **Send a notification message** action. +6. In **Target**, select the notification entity for your device, for example **My Phone** (`notify.my_phone`). +7. In **Message**, enter `Service {{ trigger.to_state.name }} is down!`. + +{% details "Example YAML configuration" %} + +{% example %} +automation: | + alias: "Notify when a Gatus endpoint goes down" + triggers: + - trigger: state + entity_id: binary_sensor.my_gatus_endpoint + to: "off" + actions: + - action: notify.send_message + target: + entity_id: notify.my_phone + data: + message: "Service {{ trigger.to_state.name }} is down!" +{% endexample %} + +{% enddetails %} + +### Send a notification when a service recovers + +Get notified when a previously failing endpoint comes back online. + +To create this automation in the UI: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %} and create a new automation. +2. Add a **State** trigger. +3. In **Entity**, select the Gatus binary sensor for the endpoint you want to monitor. +4. In **From**, enter `off`. +5. In **To**, enter `on`. +6. Add the **Send a notification message** action. +7. In **Target**, select the notification entity for your device, for example **My Phone** (`notify.my_phone`). +8. In **Message**, enter `Service {{ trigger.to_state.name }} is back online.`. + + +{% details "Example YAML configuration" %} + +{% example %} +automation: | + alias: "Notify when a Gatus endpoint recovers" + triggers: + - trigger: state + entity_id: binary_sensor.my_gatus_endpoint + from: "off" + to: "on" + actions: + - action: notify.send_message + target: + entity_id: notify.my_phone + data: + message: "Service {{ trigger.to_state.name }} is back online." +{% endexample %} + +{% enddetails %} + +## Data updates + +The integration {% term polling polls %} your Gatus instance every 30 seconds. + +## Known limitations + +- The integration shows the result of the most recent health check. Historical results stored by Gatus are not available as entities. +- The integration requires manual reconfiguation when a new endpoint is added or removed. +- The integration currently does not support authenticated instances + +## Troubleshooting + +### Can't set up the integration + +#### Symptom: "Unable to connect" + +The setup form shows an error saying it cannot connect to your Gatus instance. + +#### Resolution + +1. Confirm your Gatus instance is running and reachable from your Home Assistant host. +2. Check that the URL you entered is correct and includes the protocol and port, for example `http://gatus.local:8080`. +3. If Gatus is behind a reverse proxy or uses HTTPS, make sure the certificate is valid and the URL matches exactly. +4. Check your firewall rules to confirm Home Assistant is allowed to reach the Gatus host on the configured port. + +### Entities are unavailable + +If entities become unavailable after setup, Home Assistant could not reach your Gatus instance during the last data refresh. Check your network connection and confirm the Gatus instance is still running. Entities will recover automatically once the connection is restored. + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} From c7fc5671d9740f6ed3d426ef1d01af8383351c31 Mon Sep 17 00:00:00 2001 From: bdlcalvin <149634165+bdlcalvin@users.noreply.github.com> Date: Wed, 15 Jul 2026 17:27:31 -0400 Subject: [PATCH 100/123] Whirlpool: document oven cook mode select (#46717) --- source/_integrations/whirlpool.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/whirlpool.markdown b/source/_integrations/whirlpool.markdown index 7520e2b64bf7..15314934241c 100644 --- a/source/_integrations/whirlpool.markdown +++ b/source/_integrations/whirlpool.markdown @@ -106,6 +106,10 @@ The select platform provides the following entity for refrigerators: - **Temperature level**: Sets the temperature level of the refrigerator. The available options are `-4 °C`, `-2 °C`, `0 °C`, `3 °C`, and `5 °C`. +The select platform provides the following entity for ovens: + +- **Cook mode**: Sets the cook mode of an oven cavity, keeping the current target temperature. Selecting `Standby` turns the oven off by stopping the current cook. + ### Sensor The `whirlpool` sensor platform integrates Whirlpool Washer and Dryer systems into Home Assistant, allowing views of the machine state, time remaining, and the "wash & go" tank fill status as sensors for each device. From 3621d58348075638c407af8ece0a1ca549bf9ece Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Thu, 16 Jul 2026 09:58:35 +0200 Subject: [PATCH 101/123] KNX date, datetime, time, number, text, select state restoration (#46836) --- source/_integrations/knx.markdown | 36 ++++++------------------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown index 81f4fb42fb79..cf7bea93c167 100644 --- a/source/_integrations/knx.markdown +++ b/source/_integrations/knx.markdown @@ -1273,11 +1273,7 @@ device_class: The KNX date platform allows you to send date values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -{% note %} -Date entities without a `state_address` will restore their last known state after Home Assistant was restarted. - -Dates that have a `state_address` configured request their current state from the KNX bus. -{% endnote %} +Date entities restore their last known state after Home Assistant is restarted. Dates that have a `state_address` configured request their current state from the KNX bus according to their state updater configuration. {% note %} DPT 11.001 covers the range 1990 to 2089. Year values outside of this range are not allowed. @@ -1338,11 +1334,7 @@ sync_state: The KNX datetime platform allows you to send datetime values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -{% note %} -Date entities without a `state_address` will restore their last known state after Home Assistant was restarted. - -DateTimes that have a `state_address` configured request their current state from the KNX bus. -{% endnote %} +DateTime entities restore their last known state after Home Assistant is restarted. DateTimes that have a `state_address` configured request their current state from the KNX bus according to their state updater configuration. {% note %} System timezone is used as DPT 19.001 doesn't provide timezone information. @@ -1726,11 +1718,7 @@ data: The KNX number platform allows you to send generic numeric values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -{% note %} -Number entities without a `state_address` will restore their last known state after Home Assistant was restarted. - -Numbers that have a `state_address` configured request their current state from the KNX bus. -{% endnote %} +Number entities restore their last known state after Home Assistant is restarted. Numbers that have a `state_address` configured request their current state from the KNX bus. Number entities can be created from the frontend in the KNX panel or via YAML. @@ -1842,11 +1830,7 @@ scene_number: The KNX select platform allows the user to define a list of values that can be selected via the frontend and can be used within conditions of automation. When a user selects a new item, the assigned generic raw payload is sent to the KNX bus. A received telegram updates the state of the select entity. It can optionally respond to read requests from the KNX bus. -{% note %} -Select entities without a `state_address` will restore their last known state after Home Assistant was restarted. - -Selects that have a `state_address` configured request their current state from the KNX bus. -{% endnote %} +Select entities restore their last known state after Home Assistant is restarted. Selects that have a `state_address` configured request their current state from the KNX bus according to their state updater configuration. ```yaml # Example configuration.yaml entry @@ -2086,11 +2070,7 @@ The optional `state_address` can be used to inform Home Assistant about state ch The KNX text platform allows you to send text values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -{% note %} -Text entities without a `state_address` will restore their last known state after Home Assistant was restarted. - -Texts that have a `state_address` configured request their current state from the KNX bus. -{% endnote %} +Text entities restore their last known state after Home Assistant is restarted. Texts that have a `state_address` configured request their current state from the KNX bus. Text entities can be created from the frontend in the KNX panel or via YAML. @@ -2145,11 +2125,7 @@ mode: The KNX time platform allows you to send time values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -{% note %} -Time entities without a `state_address` will restore their last known state after Home Assistant was restarted. - -Times that have a `state_address` configured request their current state from the KNX bus. -{% endnote %} +Time entities restore their last known state after Home Assistant is restarted. Times that have a `state_address` configured request their current state from the KNX bus according to their state updater configuration. {% note %} The `day` field of the time telegram will always be set to 0 (`no day`). From d1b21b70fd57a3ce591750b9328d606f16a36f3e Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 16 Jul 2026 10:12:29 +0200 Subject: [PATCH 102/123] Add vibration triggers documentation (#46827) --- source/_integrations/vibration.markdown | 16 +++ source/_triggers/vibration.cleared.markdown | 130 +++++++++++++++++++ source/_triggers/vibration.detected.markdown | 129 ++++++++++++++++++ 3 files changed, 275 insertions(+) create mode 100644 source/_integrations/vibration.markdown create mode 100644 source/_triggers/vibration.cleared.markdown create mode 100644 source/_triggers/vibration.detected.markdown diff --git a/source/_integrations/vibration.markdown b/source/_integrations/vibration.markdown new file mode 100644 index 000000000000..d86404113dbc --- /dev/null +++ b/source/_integrations/vibration.markdown @@ -0,0 +1,16 @@ +--- +title: Vibration +description: This integration provides vibration automation triggers. +ha_category: + - Automation +ha_release: 2026.8 +ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' +ha_domain: vibration +ha_integration_type: system +--- + +This {% term integration %} provides automation triggers for binary sensors with device class vibration. There are no configuration options for this integration. + +{% include integrations/triggers.md %} diff --git a/source/_triggers/vibration.cleared.markdown b/source/_triggers/vibration.cleared.markdown new file mode 100644 index 000000000000..c01da4e35d9b --- /dev/null +++ b/source/_triggers/vibration.cleared.markdown @@ -0,0 +1,130 @@ +--- +title: "Vibration cleared" +trigger: vibration.cleared +domain: vibration +description: "Triggers when one or more vibration sensors stop detecting vibration." +related_triggers: + - vibration.detected +--- + +The **Vibration cleared** trigger fires when one or more vibration sensors stop detecting vibration. + +Use it to automate actions when something stops shaking or moving, such as sending a notification when a washing machine finishes its cycle, or when a running appliance goes quiet. Use a single sensor for one object and a group of sensors to cover several at once. + +{% include triggers/ui_header.md %} + +To use this trigger in an automation: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation, or select **Create automation** > **Create new automation**. +3. In the **When** section, select **Add trigger**. +4. From the search box, search for and select **Vibration cleared**. +5. Select **Add target** (see [Targets](#targets)) and pick the vibration sensor that you want to watch. You can also select an area, a floor, a device, or a label. +6. Under **Trigger when** (see [Behavior](#behavior-with-multiple-targets)), pick **Each**, **First**, or **All** to control how the trigger behaves when multiple sensors are targeted. +7. Under **For at least**, you can set how long the sensor must stay without detecting vibration before the trigger fires. Leave it at zero to fire immediately. +8. Select **Save**. + +### Options in the UI + +{% options_ui %} +Trigger when: + description: | + When multiple vibration sensors are targeted, controls when the trigger fires: + + - **Each** (default): fires every time any targeted sensor stops detecting vibration. + - **First**: fires only when the first sensor stops detecting vibration. + - **All**: fires only after every targeted sensor stops detecting vibration. + required: false +For at least: + description: How long the sensor or sensors must stay without detecting vibration before the trigger fires. The default is `0` hours, `00` minutes and `00` seconds (fires immediately). + required: false +{% endoptions_ui %} + +{% include triggers/yaml_header.md %} + +In YAML, refer to this trigger as `vibration.cleared`. A basic example looks like this: + +{% example %} +trigger: | + trigger: vibration.cleared + target: + entity_id: binary_sensor.washing_machine_vibration + options: + for: + minutes: 5 +{% endexample %} + +This fires 5 minutes after the sensor entity `binary_sensor.washing_machine_vibration` stops detecting vibration. + +### Options in YAML + +YAML sometimes provides additional options for more complex use cases that are not available through the UI. + +{% options_yaml %} +behavior: + description: | + When multiple vibration sensors are targeted, controls when the trigger fires: + + - `each`: fires every time any targeted sensor stops detecting vibration. + - `first`: fires only when the first sensor stops detecting vibration. + - `all`: fires only after every targeted sensor stops detecting vibration. + required: false + type: string + default: each +for: + description: | + How long the sensor or sensors must stay without detecting vibration before the trigger fires. Accepts a duration string in `HH:MM:SS` format or a time period mapping in hours, minutes and seconds. + required: false + type: string + default: "00:00:00" +{% endoptions_yaml %} + +{% include triggers/targets.md %} + +{% include triggers/behavior.md %} + +## Good to know + +- A washing machine or dryer often pauses between stages of its cycle. Set **For at least** to a few minutes to avoid a false "finished" notification during those pauses. +- Pair this trigger with [Vibration detected](/triggers/vibration.detected/) to track both when a machine starts and when it stops. + +{% include triggers/try_it.md %} + +{% include triggers/more_examples.md %} + +### Automation: notify when the washing machine finishes + +When the washing machine's vibration sensor stops detecting vibration for 5 minutes, this automation sends a notification that the laundry is done. + +- **Trigger**: Vibration cleared + - **Target**: Washing machine vibration sensor + - **For at least**: 00:05:00 +- **Action**: Send a notification message + - **Target**: My device (`notify.my_device`) + +{% details "YAML example for a laundry-done notification" %} + +{% example %} +automation: | + alias: "Notify when the washing machine finishes" + triggers: + - trigger: vibration.cleared + target: + entity_id: binary_sensor.washing_machine_vibration + options: + for: + minutes: 5 + actions: + - action: notify.send_message + target: + entity_id: notify.my_device + data: + message: > + The washing machine has finished. Time to hang the laundry. +{% endexample %} + +{% enddetails %} + +{% include triggers/stuck.md %} + +{% include triggers/related.md %} diff --git a/source/_triggers/vibration.detected.markdown b/source/_triggers/vibration.detected.markdown new file mode 100644 index 000000000000..137b48a92069 --- /dev/null +++ b/source/_triggers/vibration.detected.markdown @@ -0,0 +1,129 @@ +--- +title: "Vibration detected" +trigger: vibration.detected +domain: vibration +description: "Triggers when one or more vibration sensors start detecting vibration." +related_triggers: + - vibration.cleared +--- + +The **Vibration detected** trigger fires when one or more vibration sensors start detecting vibration. + +Use it to automate actions, such as turning devices on or off, or sending notifications, when something starts to shake or move. For example, react to a knock on a door, an appliance that starts running, or a package being moved. Use a single sensor for one object and a group of sensors to cover several at once. + +{% include triggers/ui_header.md %} + +To use this trigger in an automation: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation, or select **Create automation** > **Create new automation**. +3. In the **When** section, select **Add trigger**. +4. From the search box, search for and select **Vibration detected**. +5. Select **Add target** (see [Targets](#targets)) and pick the vibration sensor that you want to watch. You can also select an area, a floor, a device, or a label. +6. Under **Trigger when** (see [Behavior](#behavior-with-multiple-targets)), pick **Each**, **First**, or **All** to control how the trigger behaves when multiple sensors are targeted. +7. Under **For at least**, you can set how long the sensor must keep detecting vibration before the trigger fires. Leave it at zero to fire immediately. +8. Select **Save**. + +### Options in the UI + +{% options_ui %} +Trigger when: + description: | + When multiple vibration sensors are targeted, controls when the trigger fires: + + - **Each** (default): fires every time any targeted sensor starts detecting vibration. + - **First**: fires only when the first sensor starts detecting vibration. + - **All**: fires only after every targeted sensor starts detecting vibration. + required: false +For at least: + description: How long the sensor or sensors must keep detecting vibration before the trigger fires. The default is `0` hours, `00` minutes and `00` seconds (fires immediately). + required: false +{% endoptions_ui %} + +{% include triggers/yaml_header.md %} + +In YAML, refer to this trigger as `vibration.detected`. A basic example looks like this: + +{% example %} +trigger: | + trigger: vibration.detected + target: + entity_id: binary_sensor.washing_machine_vibration + options: + for: + minutes: 1 +{% endexample %} + +This fires 1 minute after the sensor entity `binary_sensor.washing_machine_vibration` starts detecting vibration. + +### Options in YAML + +YAML sometimes provides additional options for more complex use cases that are not available through the UI. + +{% options_yaml %} +behavior: + description: | + When multiple vibration sensors are targeted, controls when the trigger fires: + + - `each`: fires every time any targeted sensor starts detecting vibration. + - `first`: fires only when the first sensor starts detecting vibration. + - `all`: fires only after every targeted sensor starts detecting vibration. + required: false + type: string + default: each +for: + description: | + How long the sensor or sensors must keep detecting vibration before the trigger fires. Accepts a duration string in `HH:MM:SS` format or a time period mapping in hours, minutes and seconds. + required: false + type: string + default: "00:00:00" +{% endoptions_yaml %} + +{% include triggers/targets.md %} + +{% include triggers/behavior.md %} + +## Good to know + +- Vibration sensors are well suited to detecting when an appliance starts running, a knock on a door, or an object being moved or tampered with. +- Add the **For at least** option to avoid firing on brief, one-off vibrations, such as a passing truck or a nearby door closing. +- To cover several machines or a large object at once, target multiple vibration sensors and use the **Trigger when** option to decide whether the trigger fires for each sensor or only once they all detect vibration. + +{% include triggers/try_it.md %} + +{% include triggers/more_examples.md %} + +### Automation: turn on the porch light when someone knocks at night + +When the vibration sensor on the front door detects a knock late in the evening, this automation turns on the porch light. + +- **Trigger**: Vibration detected + - **Target**: Front door vibration sensor +- **Condition**: Time (after 22:00:00 and before 06:00:00) +- **Action**: Turn on light + - **Target**: Porch light + +{% details "YAML example for turning on the porch light on a knock at night" %} + +{% example %} +automation: | + alias: "Porch light on a knock at night" + triggers: + - trigger: vibration.detected + target: + entity_id: binary_sensor.front_door_vibration + conditions: + - condition: time + after: "22:00:00" + before: "06:00:00" + actions: + - action: light.turn_on + target: + entity_id: light.porch +{% endexample %} + +{% enddetails %} + +{% include triggers/stuck.md %} + +{% include triggers/related.md %} From 86395b2a50e29a9e5579afa83c198532455d4301 Mon Sep 17 00:00:00 2001 From: Matthew Gibson <64029882+frogman85978@users.noreply.github.com> Date: Thu, 16 Jul 2026 04:16:52 -0400 Subject: [PATCH 103/123] Added documentation for PTDevices battery binary sensor (#45194) --- source/_integrations/ptdevices.markdown | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/source/_integrations/ptdevices.markdown b/source/_integrations/ptdevices.markdown index fcc34b310c51..90a93f0f9715 100644 --- a/source/_integrations/ptdevices.markdown +++ b/source/_integrations/ptdevices.markdown @@ -2,9 +2,11 @@ title: PTDevices description: Instructions on how to integrate your PTLevel into Home Assistant. ha_release: 2026.6 -ha_category: +ha_category: + - Binary sensor - Sensor ha_platforms: + - binary_sensor - sensor ha_iot_class: Cloud Polling ha_quality_scale: bronze @@ -77,6 +79,16 @@ Some sensors are disabled by default because they provide information that is on {% endnote %} +### Binary sensors + +- **Battery status**: + - **Description**: Indicates whether the onboard battery is low. + - **Available for models**: All battery-powered models + +- **External power**: + - **Description**: Indicates whether external power is present. + - **Available for models**: All externally-powered models + ### Sensors - **Level depth**: From 2fa9c3290210431be1eccd5d6dcd5a1165e09bfb Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 16 Jul 2026 11:01:48 +0200 Subject: [PATCH 104/123] Add moon triggers documentation (#46828) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Rita C. <215712047+Laufmaschine@users.noreply.github.com> --- source/_integrations/moon.markdown | 3 + source/_triggers/moon.phase_changed.markdown | 103 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 source/_triggers/moon.phase_changed.markdown diff --git a/source/_integrations/moon.markdown b/source/_integrations/moon.markdown index a50276e90dc3..102a6d2c655a 100644 --- a/source/_integrations/moon.markdown +++ b/source/_integrations/moon.markdown @@ -48,6 +48,8 @@ The sensor shows a matching moon icon for each phase, so you can recognize the c The more info dialog showing the current moon phase.

+{% include integrations/triggers.md %} + ## Data updates The phase is calculated on your own system from the current date, so no data is fetched from the internet. Home Assistant recalculates it as the date advances, so the sensor changes at most once per day. @@ -55,6 +57,7 @@ The phase is calculated on your own system from the current date, so no data is ## Known limitations - The phase is based on the date only. The sensor does not report the exact percentage of illumination, moonrise and moonset times, or how the moon looks from your specific location or hemisphere. +- The triggers are also based only on the phase. They do not react to moonrise, moonset, the moon's elevation, or the exact percentage of illumination. ## Removing the integration diff --git a/source/_triggers/moon.phase_changed.markdown b/source/_triggers/moon.phase_changed.markdown new file mode 100644 index 000000000000..c07c9cd31a3f --- /dev/null +++ b/source/_triggers/moon.phase_changed.markdown @@ -0,0 +1,103 @@ +--- +title: "Moon phase changed" +trigger: moon.phase_changed +domain: moon +description: "Triggers when the moon enters a new phase." +--- + +The **Moon phase changed** trigger fires when the moon moves into a new phase, such as from waxing gibbous to full moon. Home Assistant works the phase out from the date, so the trigger needs no account, no internet connection, and no location. + +Use it to follow the rhythm of the lunar month in your home, for example to send a notification on the night of a full moon, play a scene at every new moon, or start a garden routine when the moon reaches its first quarter. + +{% include triggers/ui_header.md %} + +To use this trigger in an automation: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation, or select **Create automation** > **Create new automation**. +3. In the **When** section, select **Add trigger**. +4. From the search box, search for and select **Moon phase changed**. +5. Under **Phase**, keep **Any** to trigger on every phase change, or select a single phase to trigger only when the moon enters that phase. +6. Select **Save**. + +### Options in the UI + +{% options_ui %} +Phase: + description: | + Which phase change fires the trigger: + + - **Any**: every time the moon enters a new phase. This is the default. + - A specific phase, such as **Full moon** or **New moon**: only when the moon enters that phase. +{% endoptions_ui %} + +{% include triggers/yaml_header.md %} + +In YAML, refer to this trigger as `moon.phase_changed`. A basic example looks like this: + +{% example %} +trigger: | + trigger: moon.phase_changed +{% endexample %} + +This fires whenever the phase changes. To trigger on a single phase, add the `phase` option: + +{% example %} +trigger: | + trigger: moon.phase_changed + options: + phase: full_moon +{% endexample %} + +### Options in YAML + +{% options_yaml %} +phase: + description: > + Limits the trigger to a single moon phase. Accepts `any` (every phase change) or one of `new_moon`, `waxing_crescent`, `first_quarter`, `waxing_gibbous`, `full_moon`, `waning_gibbous`, `last_quarter`, or `waning_crescent`. + required: false + type: string + default: any +{% endoptions_yaml %} + +## Good to know + +- This trigger does not use a target. It follows the moon phase, which is the same everywhere on Earth, so it does not depend on your [home location](/docs/configuration/basic/). +- The phase is based on the date, so the trigger fires at most once a day, when the phase changes. +- With a specific phase selected, the trigger fires the moment the moon enters that phase, not for the whole time the moon stays in it. To check whether the moon is currently in a phase, use a [state condition](/docs/scripts/conditions/#state-condition) for `sensor.moon` instead. + +{% include triggers/try_it.md %} + +For this trigger, there is no target entity to change. To test it, wait for the next phase change, or temporarily switch to a trigger you can control while you build the rest of the automation. + +{% include triggers/more_examples.md %} + +### Automation: run a scene on the full moon + +When the moon turns full, activate a moonlit scene in the living room. + +- **Trigger**: Moon phase changed + - **Phase**: Full moon +- **Action**: Activate scene + - **Target**: Full moon scene + +{% details "YAML example for a full moon scene" %} + +{% example %} +automation: | + alias: "Full moon scene" + triggers: + - trigger: moon.phase_changed + options: + phase: full_moon + actions: + - action: scene.turn_on + target: + entity_id: scene.full_moon +{% endexample %} + +{% enddetails %} + +{% include triggers/stuck.md %} + +{% include triggers/related.md %} From c0b72c003b0f3fbc2cabf5ced279a399d551faf4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Jul 2026 16:49:12 +0200 Subject: [PATCH 105/123] Remove Modbus Connection integration documentation (#46884) Co-authored-by: Claude Fable 5 --- .../_integrations/modbus_connection.markdown | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 source/_integrations/modbus_connection.markdown diff --git a/source/_integrations/modbus_connection.markdown b/source/_integrations/modbus_connection.markdown deleted file mode 100644 index d053a6285948..000000000000 --- a/source/_integrations/modbus_connection.markdown +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Modbus Connection -description: Instructions on how to set up a shared Modbus connection in Home Assistant. -ha_category: - - Hub -ha_release: 2026.7 -ha_iot_class: Local Polling -ha_config_flow: true -ha_codeowners: - - '@home-assistant/core' -ha_domain: modbus_connection -ha_integration_type: hub -ha_quality_scale: bronze ---- - -The **Modbus Connection** {% term integration %} owns a single [Modbus](https://en.wikipedia.org/wiki/Modbus) connection to one physical link — a TCP endpoint or a serial device — and shares it with other integrations. - -Modbus is a serial communications protocol widely used in industrial and building automation to talk to devices such as power meters, PLCs, HVAC controllers, and inverters. A physical Modbus link usually accepts only one client at a time, so it cannot be opened independently by several integrations at once. - -This integration solves that by owning the connection in one place. You set up each connection once, and then point Modbus device integrations at it. This is the UI-based way to use Modbus in Home Assistant. If you prefer to register Modbus entities manually in YAML, use the [Manual Modbus](/integrations/modbus/) {% term integration %} instead. - -This {% term integration %} does not create any entities of its own. It only provides the shared connection that device integrations consume. - -## Prerequisites - -You need one of the following ways to reach your Modbus network: - -- For a *network* connection: a Modbus TCP gateway or a device that speaks Modbus TCP (or RTU-over-TCP), reachable by hostname or IP address on your network. -- For a *serial* connection: a serial (RTU) device connected to the machine running Home Assistant, for example a USB-to-RS485 adapter appearing as `/dev/ttyUSB0`. A network serial proxy is also supported and appears in the serial device list. - -{% include integrations/config_flow.md %} - -When you add the integration, you first choose how the Modbus network is connected: - -- **Modbus TCP**: for Modbus TCP and RTU-over-TCP connections. -- **Serial (including serial proxies and networked connections)**: for Modbus RTU connections over a serial port. - -### Modbus TCP - -{% configuration_basic %} -Host: - description: "The hostname or IP address of the Modbus gateway or device." -Port: - description: "The TCP port the Modbus gateway listens on (default 502)." -{% endconfiguration_basic %} - -### Serial - -{% configuration_basic %} -Device: - description: "The serial port the Modbus device is connected to, for example `/dev/ttyUSB0`. Local serial ports and network serial proxies are listed." -Baud rate: - description: "The serial baud rate the device communicates at (default 9600)." -Parity: - description: "The serial parity: None, Even, or Odd (default None)." -Stop bits: - description: "The number of stop bits: 1 or 2 (default 1)." -Byte size: - description: "The number of data bits: 7 or 8 (default 8)." -{% endconfiguration_basic %} - -You can add the integration more than once to set up several connections, for example one per gateway or serial port. Home Assistant blocks duplicate connections, so you cannot set up the same endpoint twice. - -## Using the connection - -After you set up a connection, add a Modbus device integration and point it at this connection. Each device integration borrows the shared connection instead of opening its own, which lets multiple devices on the same link coexist without conflicting over it. - -## Removing the integration - -This integration follows standard integration removal. - -{% include integrations/remove_device_service.md %} - -Before removing a Modbus connection, remove any device integrations that depend on it. Otherwise, those integrations lose their connection and stop working. From 6dd916a0e748bbca64521d2ff35109d41842b1bb Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Jul 2026 16:49:24 +0200 Subject: [PATCH 106/123] Rename Modbus integration documentation back to Modbus (#46885) Co-authored-by: Claude Fable 5 Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/modbus.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index 26b3e6ef2f37..9907c0d5a945 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -1,5 +1,5 @@ --- -title: Manual Modbus +title: Modbus description: Instructions on how to manually register Modbus entities and platforms. ha_category: - Hub @@ -22,13 +22,13 @@ related: [modbus](http://www.modbus.org/) is a communication protocol to control PLCs (Programmable Logic Controller) and RTUs (Remote Terminal Unit). -The Manual Modbus {% term integration %} lets you manually register Modbus entities by describing each register in your `configuration.yaml` file. It is meant for people who are comfortable working with Modbus, as it requires knowledge of the protocol and of the specific registers your device exposes. +The Modbus {% term integration %} lets you manually register Modbus entities by describing each register in your `configuration.yaml` file. It is meant for people who are comfortable working with Modbus, as it requires knowledge of the protocol and of the specific registers your device exposes. Before setting this up, we recommend looking for a vendor-specific integration that already supports your Modbus device. A dedicated integration handles the register details for you and is easier to set up and maintain. The integration adheres strictly to the [protocol specification](https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf) using [pymodbus](https://github.com/pymodbus-dev/pymodbus) for the protocol implementation. -The Manual Modbus integration supports all devices adhering to the Modbus standard. The communication to the device or devices can be serial (rs-485), TCP, or UDP connections. The integration allows multiple communication channels, for example a serial port connection combined with one or more TCP connections. +The Modbus integration supports all devices adhering to the Modbus standard. The communication to the device or devices can be serial (RS-485), TCP, or UDP connections. The integration allows multiple communication channels, for example a serial port connection combined with one or more TCP connections. # Configuring modbus communication From 9f3a7f55c6ac4f30af3763653b4f5fe46b88468a Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 17 Jul 2026 12:18:10 +0200 Subject: [PATCH 107/123] Add vibration conditions documentation (#46880) --- .../vibration.is_detected.markdown | 116 ++++++++++++++++++ .../vibration.is_not_detected.markdown | 116 ++++++++++++++++++ source/_integrations/vibration.markdown | 6 +- 3 files changed, 236 insertions(+), 2 deletions(-) create mode 100644 source/_conditions/vibration.is_detected.markdown create mode 100644 source/_conditions/vibration.is_not_detected.markdown diff --git a/source/_conditions/vibration.is_detected.markdown b/source/_conditions/vibration.is_detected.markdown new file mode 100644 index 000000000000..c7e8ae890948 --- /dev/null +++ b/source/_conditions/vibration.is_detected.markdown @@ -0,0 +1,116 @@ +--- +title: "Vibration is detected" +condition: vibration.is_detected +domain: vibration +description: "Tests if one or more vibration sensors are detecting vibration." +related_conditions: + - vibration.is_not_detected +--- + +The **Vibration is detected** condition passes when one or more vibration sensors are detecting vibration. Use it in an automation to act only while something is shaking or running, such as holding off a quiet-hours routine while an appliance is still working, or sending an alert if a machine is running when it should not be. + +{% include conditions/ui_header.md %} + +To use this condition in an automation: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation, or select **Create automation** > **Create new automation**. +3. In the **And if** section, select **Add condition**. +4. From the search box, search for and select **Vibration is detected**. +5. Under **Targets** (see [Targets](#targets)), select one or more vibration entities, devices, an area, a floor, or a label. +6. If you selected more than one target, under **Condition passes if**, pick **Any** or **All**. +7. Under **For at least**, you can set for how long one or more sensors must be detecting vibration before the condition passes. Leave it at zero for the condition to pass as soon as the sensors start detecting vibration. +8. Select **Save**. + +### Options in the UI + +{% options_ui %} +Condition passes if: + description: When multiple vibration sensors are targeted, controls how results combine. Pick **Any** to pass if at least one targeted sensor is detecting vibration, or **All** to pass only when every sensor is detecting vibration. +For at least: + description: How long one or more sensors must be continuously detecting vibration before the condition passes. The default is `0` hours, `00` minutes and `00` seconds. +{% endoptions_ui %} + +{% include conditions/yaml_header.md %} + +In YAML, refer to this condition as `vibration.is_detected`. A basic example looks like this: + +{% example %} +condition: | + condition: vibration.is_detected + target: + entity_id: binary_sensor.dishwasher_vibration + options: + for: "00:05:00" +{% endexample %} + +This passes when the entity `binary_sensor.dishwasher_vibration` has been continuously detecting vibration for 5 minutes. + +### Options in YAML + +YAML sometimes provides additional options for more complex use cases that are not available through the UI. + +{% options_yaml %} +behavior: + description: > + When multiple vibration sensors are targeted, controls how results combine. Accepts `all` or `any`. + required: false + type: string + default: any +for: + description: > + How long one or more vibration sensors must be continuously detecting vibration before the condition passes. Accepts a duration string in `HH:MM:SS` format. + required: false + type: string + default: "00:00:00" +{% endoptions_yaml %} + +{% include conditions/targets.md %} + +{% include conditions/behavior.md %} + +## Good to know + +- With the **For at least** option, the timer resets if the sensor stops detecting vibration during that period. This helps confirm a machine is really running before acting. +- A vibration sensor reports movement, not what caused it. In a busy spot, brief vibrations from nearby activity can make the condition pass, so choose the sensor placement and **For at least** value to match. + +{% include conditions/try_it.md %} + +{% include conditions/more_examples.md %} + +### Automation: remind you if the dishwasher is still running at bedtime + +At bedtime, if the dishwasher's vibration sensor shows it is still running, this automation sends a reminder so you can decide whether to wait up or leave it. + +- **Trigger**: Time (at 22:30:00) +- **Condition**: Vibration is detected + - **Target**: Dishwasher vibration sensor +- **Action**: Send a notification message + - **Target**: My device (`notify.my_device`) + +{% details "YAML example for a dishwasher-still-running reminder" %} + +{% example %} +automation: | + alias: "Remind if the dishwasher is still running at bedtime" + triggers: + - trigger: time + at: "22:30:00" + conditions: + - condition: vibration.is_detected + target: + entity_id: binary_sensor.dishwasher_vibration + actions: + - action: notify.send_message + target: + entity_id: notify.my_device + data: + message: > + The dishwasher is still running. +{% endexample %} + +{% enddetails %} + +{% include conditions/stuck.md %} + +{% include conditions/related.md %} diff --git a/source/_conditions/vibration.is_not_detected.markdown b/source/_conditions/vibration.is_not_detected.markdown new file mode 100644 index 000000000000..93851147d73c --- /dev/null +++ b/source/_conditions/vibration.is_not_detected.markdown @@ -0,0 +1,116 @@ +--- +title: "Vibration is not detected" +condition: vibration.is_not_detected +domain: vibration +description: "Tests if one or more vibration sensors are not detecting vibration." +related_conditions: + - vibration.is_detected +--- + +The **Vibration is not detected** condition passes when one or more vibration sensors are not detecting vibration. Use it in an automation to act only while something is still, such as running a routine once an appliance has finished, or confirming a machine is idle before turning off its power. + +{% include conditions/ui_header.md %} + +To use this condition in an automation: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation, or select **Create automation** > **Create new automation**. +3. In the **And if** section, select **Add condition**. +4. From the search box, search for and select **Vibration is not detected**. +5. Under **Targets** (see [Targets](#targets)), select one or more vibration entities, devices, an area, a floor, or a label. +6. If you selected more than one target, under **Condition passes if**, pick **Any** or **All**. +7. Under **For at least**, you can set for how long one or more sensors must stay without detecting vibration before the condition passes. Leave it at zero for the condition to pass as soon as the sensors stop detecting vibration. +8. Select **Save**. + +### Options in the UI + +{% options_ui %} +Condition passes if: + description: When multiple vibration sensors are targeted, controls how results combine. Pick **Any** to pass if at least one targeted sensor is not detecting vibration, or **All** to pass only when every sensor is not detecting vibration. +For at least: + description: How long one or more sensors must stay without detecting vibration before the condition passes. The default is `0` hours, `00` minutes and `00` seconds. +{% endoptions_ui %} + +{% include conditions/yaml_header.md %} + +In YAML, refer to this condition as `vibration.is_not_detected`. A basic example looks like this: + +{% example %} +condition: | + condition: vibration.is_not_detected + target: + entity_id: binary_sensor.washing_machine_vibration + options: + for: "00:15:00" +{% endexample %} + +This passes when the sensor `binary_sensor.washing_machine_vibration` has not detected vibration for 15 minutes. + +### Options in YAML + +YAML sometimes provides additional options for more complex use cases that are not available through the UI. + +{% options_yaml %} +behavior: + description: > + When multiple vibration sensors are targeted, controls how results combine. Accepts `all` or `any`. + required: false + type: string + default: any +for: + description: > + How long one or more vibration sensors must stay without detecting vibration before the condition passes. Accepts a duration string in `HH:MM:SS` format. + required: false + type: string + default: "00:00:00" +{% endoptions_yaml %} + +{% include conditions/targets.md %} + +{% include conditions/behavior.md %} + +## Good to know + +- With the **For at least** option, the timer resets if any targeted sensor detects vibration during that period. This helps confirm a machine has truly finished rather than briefly paused. +- A vibration sensor only reports movement. If a machine sits completely still during part of its cycle, the condition can pass before the cycle is actually done. Choose the **For at least** value with that in mind. + +{% include conditions/try_it.md %} + +{% include conditions/more_examples.md %} + +### Automation: turn off the washing machine's plug once it is done + +At a set time in the evening, if the washing machine's vibration sensor has been still for 15 minutes, this automation turns off its smart plug to save standby power. + +- **Trigger**: Time (at 23:00:00) +- **Condition**: Vibration is not detected + - **Target**: Washing machine vibration sensor + - **For at least**: 00:15:00 +- **Action**: Turn off switch + - **Target**: Washing machine plug + +{% details "YAML example for turning off the washing machine plug when idle" %} + +{% example %} +automation: | + alias: "Turn off the washing machine plug when idle" + triggers: + - trigger: time + at: "23:00:00" + conditions: + - condition: vibration.is_not_detected + target: + entity_id: binary_sensor.washing_machine_vibration + options: + for: "00:15:00" + actions: + - action: switch.turn_off + target: + entity_id: switch.washing_machine_plug +{% endexample %} + +{% enddetails %} + +{% include conditions/stuck.md %} + +{% include conditions/related.md %} diff --git a/source/_integrations/vibration.markdown b/source/_integrations/vibration.markdown index d86404113dbc..e1758d443b59 100644 --- a/source/_integrations/vibration.markdown +++ b/source/_integrations/vibration.markdown @@ -1,6 +1,6 @@ --- title: Vibration -description: This integration provides vibration automation triggers. +description: This integration provides vibration automation triggers and conditions. ha_category: - Automation ha_release: 2026.8 @@ -11,6 +11,8 @@ ha_domain: vibration ha_integration_type: system --- -This {% term integration %} provides automation triggers for binary sensors with device class vibration. There are no configuration options for this integration. +This {% term integration %} provides automation triggers and conditions for binary sensors with device class vibration. There are no configuration options for this integration. {% include integrations/triggers.md %} + +{% include integrations/conditions.md %} From c11c76579a9403a4d626b5c0dde383bb1c44a301 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 17 Jul 2026 15:20:32 +0200 Subject: [PATCH 108/123] Add moon conditions documentation (#46882) Co-authored-by: Rita C. <215712047+Laufmaschine@users.noreply.github.com> --- source/_conditions/moon.is_phase.markdown | 103 +++++++++++++++++++++ source/_conditions/moon.is_waning.markdown | 79 ++++++++++++++++ source/_conditions/moon.is_waxing.markdown | 79 ++++++++++++++++ source/_integrations/moon.markdown | 4 +- 4 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 source/_conditions/moon.is_phase.markdown create mode 100644 source/_conditions/moon.is_waning.markdown create mode 100644 source/_conditions/moon.is_waxing.markdown diff --git a/source/_conditions/moon.is_phase.markdown b/source/_conditions/moon.is_phase.markdown new file mode 100644 index 000000000000..11a730696c36 --- /dev/null +++ b/source/_conditions/moon.is_phase.markdown @@ -0,0 +1,103 @@ +--- +title: "Moon phase" +condition: moon.is_phase +domain: moon +description: "Tests if the moon is in a specific phase." +related_conditions: + - moon.is_waxing + - moon.is_waning +--- + +The **Moon phase** condition passes when the moon is currently in the phase you choose, such as full moon or new moon. Home Assistant works the phase out from the date, so it needs no account, no internet connection, and no location. + +Use it to gate an automation on the lunar month, for example to only run a scene on the night of a full moon, or to skip a routine unless it is a new moon. + +{% include conditions/ui_header.md %} + +To use this condition in an automation: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation, or select **Create automation** > **Create new automation**. +3. In the **And if** section, select **Add condition**. +4. From the search box, search for and select **Moon phase**. +5. Under **Phase**, select the phase to test for. +6. Select **Save**. + +### Options in the UI + +{% options_ui %} +Phase: + description: | + The moon phase the condition tests for. Select one of the eight phases, from **New moon** through **Full moon** to **Waning crescent**. +{% endoptions_ui %} + +{% include conditions/yaml_header.md %} + +In YAML, refer to this condition as `moon.is_phase`. Set the phase to test for with the `phase` option: + +{% example %} +condition: | + condition: moon.is_phase + options: + phase: full_moon +{% endexample %} + +This passes while the moon is a full moon. + +### Options in YAML + +{% options_yaml %} +phase: + description: > + The moon phase to test for. Accepts one of `new_moon`, `waxing_crescent`, `first_quarter`, `waxing_gibbous`, `full_moon`, `waning_gibbous`, `last_quarter`, or `waning_crescent`. + required: true + type: string +{% endoptions_yaml %} + +## Good to know + +- This condition does not use a target. It checks the moon phase, which is the same everywhere on Earth, so it does not depend on your [home location](/docs/configuration/basic/). +- This is a point-in-time check. It reflects the phase at the moment the automation runs. +- The phase is based on the date, so it changes at most once a day. +- To test the direction the moon is heading rather than a single phase, use [Moon is waxing](/conditions/moon.is_waxing/) or [Moon is waning](/conditions/moon.is_waning/). + +{% include conditions/try_it.md %} + +{% include conditions/more_examples.md %} + +### Automation: full moon garden lights + +When motion is detected in the garden after dark, turn on the garden lights, but only on the night of a full moon. + +- **Trigger**: State + - **Entity**: Garden motion binary sensor + - **To**: On +- **Condition**: Moon phase + - **Phase**: Full moon +- **Action**: Turn on light + - **Target**: Garden lights + +{% details "YAML example for full moon garden lights" %} + +{% example %} +automation: | + alias: "Full moon garden lights" + triggers: + - trigger: state + entity_id: binary_sensor.garden_motion + to: "on" + conditions: + - condition: moon.is_phase + options: + phase: full_moon + actions: + - action: light.turn_on + target: + entity_id: light.garden +{% endexample %} + +{% enddetails %} + +{% include conditions/stuck.md %} + +{% include conditions/related.md %} diff --git a/source/_conditions/moon.is_waning.markdown b/source/_conditions/moon.is_waning.markdown new file mode 100644 index 000000000000..5ae39d40518a --- /dev/null +++ b/source/_conditions/moon.is_waning.markdown @@ -0,0 +1,79 @@ +--- +title: "Moon is waning" +condition: moon.is_waning +domain: moon +description: "Tests if the moon is waning." +related_conditions: + - moon.is_waxing + - moon.is_phase +--- + +The **Moon is waning** condition passes while the moon is waning, the half of the lunar month when the lit part shrinks from the full moon back toward the new moon. Home Assistant works this out from the date, so it needs no account, no internet connection, and no location. + +Use it to gate an automation on the falling half of the moon's cycle, for example to run a routine only while the moon is heading back toward dark. + +{% include conditions/ui_header.md %} + +To use this condition in an automation: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation, or select **Create automation** > **Create new automation**. +3. In the **And if** section, select **Add condition**. +4. From the search box, search for and select **Moon is waning**. +5. Select **Save**. + +{% include conditions/yaml_header.md %} + +In YAML, refer to this condition as `moon.is_waning`. It has no options: + +{% example %} +condition: | + condition: moon.is_waning +{% endexample %} + +This passes while the moon is waning. + +## Good to know + +- This condition does not use a target. It checks the moon phase, which is the same everywhere on Earth, so it does not depend on your [home location](/docs/configuration/basic/). +- The moon wanes from the full moon back to the new moon, then waxes from the new moon up to the full moon. For the opposite check, use [Moon is waxing](/conditions/moon.is_waxing/). +- The phase is based on the date, so it changes at most once a day. +- To test for a single phase instead of the direction, use [Moon phase](/conditions/moon.is_phase/). + +{% include conditions/try_it.md %} + +{% include conditions/more_examples.md %} + +### Automation: wind-down reminder while the moon wanes + +Each evening, send a gentle wind-down reminder, but only while the moon is waning. + +- **Trigger**: Time + - **At time**: 9:00:00 PM +- **Condition**: Moon is waning +- **Action**: Send a notification message + - **Target**: My Device (`notify.my_device`) + +{% details "YAML example for a waning moon reminder" %} + +{% example %} +automation: | + alias: "Waning moon wind-down reminder" + triggers: + - trigger: time + at: "21:00:00" + conditions: + - condition: moon.is_waning + actions: + - action: notify.send_message + target: + entity_id: notify.my_device + data: + message: "The moon is waning." +{% endexample %} + +{% enddetails %} + +{% include conditions/stuck.md %} + +{% include conditions/related.md %} diff --git a/source/_conditions/moon.is_waxing.markdown b/source/_conditions/moon.is_waxing.markdown new file mode 100644 index 000000000000..20bb5fcf3155 --- /dev/null +++ b/source/_conditions/moon.is_waxing.markdown @@ -0,0 +1,79 @@ +--- +title: "Moon is waxing" +condition: moon.is_waxing +domain: moon +description: "Tests if the moon is waxing." +related_conditions: + - moon.is_waning + - moon.is_phase +--- + +The **Moon is waxing** condition passes while the moon is waxing, the half of the lunar month when the lit part grows from the new moon toward the full moon. Home Assistant works this out from the date, so it needs no account, no internet connection, and no location. + +Use it to gate an automation on the rising half of the moon's cycle, for example to run a routine only while the moon is on its way to full. + +{% include conditions/ui_header.md %} + +To use this condition in an automation: + +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %}. +2. Open an existing automation, or select **Create automation** > **Create new automation**. +3. In the **And if** section, select **Add condition**. +4. From the search box, search for and select **Moon is waxing**. +5. Select **Save**. + +{% include conditions/yaml_header.md %} + +In YAML, refer to this condition as `moon.is_waxing`. It has no options: + +{% example %} +condition: | + condition: moon.is_waxing +{% endexample %} + +This passes while the moon is waxing. + +## Good to know + +- This condition does not use a target. It checks the moon phase, which is the same everywhere on Earth, so it does not depend on your [home location](/docs/configuration/basic/). +- The moon waxes from the new moon up to the full moon, then wanes from the full moon back to the new moon. For the opposite check, use [Moon is waning](/conditions/moon.is_waning/). +- The phase is based on the date, so it changes at most once a day. +- To test for a single phase instead of the direction, use [Moon phase](/conditions/moon.is_phase/). + +{% include conditions/try_it.md %} + +{% include conditions/more_examples.md %} + +### Automation: planting reminder while the moon is waxing + +Some gardeners sow by the moon. Each morning, send a reminder, but only while the moon is waxing. + +- **Trigger**: Time + - **At time**: 9:00:00 AM +- **Condition**: Moon is waxing +- **Action**: Send a notification message + - **Target**: My Device (`notify.my_device`) + +{% details "YAML example for a waxing moon reminder" %} + +{% example %} +automation: | + alias: "Waxing moon planting reminder" + triggers: + - trigger: time + at: "09:00:00" + conditions: + - condition: moon.is_waxing + actions: + - action: notify.send_message + target: + entity_id: notify.my_device + data: + message: "The moon is waxing, a good time to sow." +{% endexample %} + +{% enddetails %} + +{% include conditions/stuck.md %} + +{% include conditions/related.md %} diff --git a/source/_integrations/moon.markdown b/source/_integrations/moon.markdown index 102a6d2c655a..7f2ca112bb46 100644 --- a/source/_integrations/moon.markdown +++ b/source/_integrations/moon.markdown @@ -50,6 +50,8 @@ The more info dialog showing the current moon phase. {% include integrations/triggers.md %} +{% include integrations/conditions.md %} + ## Data updates The phase is calculated on your own system from the current date, so no data is fetched from the internet. Home Assistant recalculates it as the date advances, so the sensor changes at most once per day. @@ -57,7 +59,7 @@ The phase is calculated on your own system from the current date, so no data is ## Known limitations - The phase is based on the date only. The sensor does not report the exact percentage of illumination, moonrise and moonset times, or how the moon looks from your specific location or hemisphere. -- The triggers are also based only on the phase. They do not react to moonrise, moonset, the moon's elevation, or the exact percentage of illumination. +- The triggers and conditions are also based only on the phase. They do not react to moonrise, moonset, the moon's elevation, or the exact percentage of illumination. ## Removing the integration From b640e8fdb876b9b1b424bd5af8828c15533f30f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20S=C4=99d=C5=82ak-Jakubowski?= Date: Fri, 17 Jul 2026 15:22:26 +0200 Subject: [PATCH 109/123] Add port change warning for mobile apps (#46902) --- source/_integrations/http.markdown | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/_integrations/http.markdown b/source/_integrations/http.markdown index adb71191e6e1..4efcfcf053d2 100644 --- a/source/_integrations/http.markdown +++ b/source/_integrations/http.markdown @@ -27,7 +27,12 @@ To change how Home Assistant serves its web interface, go to {% my network title {% options_ui %} Server port: - description: The port Home Assistant listens on. The default is `8123`. + description: | + The port Home Assistant listens on. The default is `8123`. + + _Caution_: If you use the + [Home Assistant Companion app](https://companion.home-assistant.io/), update the Home Assistant URL + in the app after changing this port. required: true Listen addresses: description: The IP addresses Home Assistant binds to. Leave this empty to listen on all interfaces. From b648d7564bb823b00be64d91d07b254ecad7c27d Mon Sep 17 00:00:00 2001 From: bdlcalvin <149634165+bdlcalvin@users.noreply.github.com> Date: Fri, 17 Jul 2026 10:33:59 -0400 Subject: [PATCH 110/123] Whirlpool: document oven target temperature number (#46716) --- source/_integrations/whirlpool.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/source/_integrations/whirlpool.markdown b/source/_integrations/whirlpool.markdown index 15314934241c..140cf47900bf 100644 --- a/source/_integrations/whirlpool.markdown +++ b/source/_integrations/whirlpool.markdown @@ -5,6 +5,7 @@ ha_category: - Climate - Hub - Light + - Number - Select ha_release: '2022.10' ha_iot_class: Cloud Push @@ -18,6 +19,7 @@ ha_platforms: - climate - diagnostics - light + - number - select - sensor ha_integration_type: hub @@ -71,6 +73,7 @@ This {% term integration %} maps appliances to entities in Home Assistant. A sin - [Binary Sensor](#binary_sensor) - [Climate](#climate) - [Light](#light) +- [Number](#number) - [Select](#select) - [Sensor](#sensor) @@ -100,6 +103,16 @@ The light platform provides the following functionality: Ovens with two cavities have separate light entities for the upper and lower cavity. +### Number + +The number platform provides the following entity for ovens: + +- **Target temperature**: Sets the target temperature for an oven cavity, keeping the current cooking mode. + +{% important %} +If the oven is idle, setting the target temperature starts a bake cycle at the set temperature. +{% endimportant %} + ### Select The select platform provides the following entity for refrigerators: From 615bf2894aff4fc65cf50897f97b4e9a7586f867 Mon Sep 17 00:00:00 2001 From: aronk Date: Sat, 18 Jul 2026 00:46:09 +0200 Subject: [PATCH 111/123] Update denon_rs232.markdown with tuner controls (#46893) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/denon_rs232.markdown | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/source/_integrations/denon_rs232.markdown b/source/_integrations/denon_rs232.markdown index 4d687b2987c1..508b4fbb8780 100644 --- a/source/_integrations/denon_rs232.markdown +++ b/source/_integrations/denon_rs232.markdown @@ -36,6 +36,7 @@ For supported receivers, you can use Home Assistant to: - Change the volume - Mute and unmute the main zone - Select the input source +- Select a tuner preset or FM frequency ### Zones @@ -50,3 +51,27 @@ The available zones depend on your receiver model. ### Source selection The available input sources depend on the receiver model you select during setup. + +### Selecting tuner presets and frequencies + +On the main zone, you can tune the receiver to a stored tuner preset or directly to an FM frequency. This works from the media browser, which lists the tuner presets, or by calling the `media_player.play_media` action with a `media_content_type` of `channel`. + +The `media_content_id` can be a preset name from `A1` through `G8`: +```yaml +action: media_player.play_media +target: + entity_id: media_player.denon_avr +data: + media_content_type: channel + media_content_id: "A1" +``` + +It can also be tuned to an FM frequency between `8750` (87.50 MHz) and `10800` (108.00 MHz): +```yaml +action: media_player.play_media +target: + entity_id: media_player.denon_avr +data: + media_content_type: channel + media_content_id: "9870" +``` From 2f38f4b74501898ef9d3495b66017434857fde15 Mon Sep 17 00:00:00 2001 From: Niklas Wagner Date: Sat, 18 Jul 2026 09:51:25 +0200 Subject: [PATCH 112/123] Add manufacturer, model, and model_id filtering to entity filter selector (#43538) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marcin Sędłak-Jakubowski --- source/_docs/blueprint/selectors.markdown | 66 ++++++++++++++++++++--- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/source/_docs/blueprint/selectors.markdown b/source/_docs/blueprint/selectors.markdown index 0653be2694b5..4b6a9d1a9f40 100644 --- a/source/_docs/blueprint/selectors.markdown +++ b/source/_docs/blueprint/selectors.markdown @@ -731,8 +731,8 @@ will contain the entity ID, or list of entity IDs, based on if `multiple` is set to `true`. An entity selector can filter the list of entities, based on things like the -class of the device, the domain of the entity or the domain that provided the -entity. +manufacturer, model, or model ID of the device the entity belongs to, the +device class, the domain of the entity, or the domain that provided the entity. ![Screenshot of an entity selector](/images/blueprints/selector-entity.png) @@ -763,9 +763,45 @@ filter: description: > Can be set to an integration domain. Limits the list of entities to entities provided by the set integration domain, for example, - [`zha`](/integrations/zha). + [`matter`](/integrations/matter). An entity and the device it belongs to can be + provided by different integrations, so this option only filters by the + entity's integration. To filter by the device's integration, use the + `integration` option under `device` instead. type: string required: false + device: + description: > + Filters the entities by properties of the device they belong to. + type: map + required: false + keys: + integration: + description: > + Can be set to an integration domain. Limits the list of entities to + entities that belong to devices provided by the set integration + domain, for example, [`hue`](/integrations/hue). This filters by the + integration that provides the device, which can differ from the + integration that provides the entity itself. + type: string + required: false + manufacturer: + description: > + When set, it limits the list of entities to entities that belong to + devices provided by the set manufacturer name. + type: string + required: false + model: + description: > + When set, it limits the list of entities to entities that belong to + devices that have the set model. + type: string + required: false + model_id: + description: > + When set, the list of entities is limited to entities that belong to + devices that have the set model ID. + type: string + required: false domain: description: > Limits the list of entities to entities of a certain [domain(s)](/docs/configuration/entities_domains/#domains), for example, @@ -817,9 +853,9 @@ light.living_room ### Example entity selector -An example entity selector that, will only show entities that are: +An example entity selector that shows only entities that are: -- Provided by the [ZHA](/integrations/zha) integration. +- Provided by the [Hue](/integrations/hue) integration. - From the [Binary sensor](/integrations/binary_sensor) domain. - Have presented themselves as devices of a motion device class. - Allows selecting one or more entities. @@ -830,11 +866,29 @@ And this is what it looks like in YAML: entity: multiple: true filter: - - integration: zha + - integration: hue domain: binary_sensor device_class: motion ``` +{% tip %} +Integration filters aren't reliable for devices that can connect through +multiple integrations, such as Matter or Zigbee. +To reliably target specific hardware, combine the filter with +`device.manufacturer`, `device.model`, or `device.model_id`. +{% endtip %} + +Filter for a specific device using the device filter: + +```yaml +entity: + multiple: true + filter: + - device: + manufacturer: IKEA of Sweden + model: BILRESA dual button +``` + ## Floor selector The floor selector shows a floor finder that can pick From 7805df99bba39386653677c3c1a8e880cd77279d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Alves?= <32654466+luismalves@users.noreply.github.com> Date: Sat, 18 Jul 2026 08:53:05 +0100 Subject: [PATCH 113/123] Add LiteLLM integration documentation (#45740) Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- source/_integrations/litellm.markdown | 68 +++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 source/_integrations/litellm.markdown diff --git a/source/_integrations/litellm.markdown b/source/_integrations/litellm.markdown new file mode 100644 index 000000000000..fb2ae3ed393f --- /dev/null +++ b/source/_integrations/litellm.markdown @@ -0,0 +1,68 @@ +--- +title: LiteLLM +description: Instructions on how to integrate a LiteLLM proxy as a conversation agent in Home Assistant +ha_category: + - AI +ha_release: 2026.8 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: + - '@luismalves' +ha_domain: litellm +ha_integration_type: service +ha_platforms: + - conversation +ha_quality_scale: bronze +--- + +The [LiteLLM](https://www.litellm.ai/) {% term integration %} allows you to use a LiteLLM proxy as a conversation agent in Home Assistant. + +LiteLLM exposes a single OpenAI-compatible API in front of a wide range of model providers, so you can use almost any model through one endpoint. This is similar to a service like OpenRouter, with the added benefit that you can run LiteLLM yourself if you prefer to keep everything under your own control. This integration lets you point Home Assistant at any LiteLLM proxy, whether it is a hosted instance or one you self-host. + +## Prerequisites + +Before you add this integration, you need the following: + +- **A LiteLLM proxy that Home Assistant can reach.** This is the endpoint the integration connects to. You can use a hosted LiteLLM proxy or [run one yourself](https://docs.litellm.ai/docs/simple_proxy). +- **At least one model configured on the proxy.** The integration discovers the available models from the proxy during setup and creates a conversation agent for each one. +- **An API key, if your proxy requires authentication.** This is used to authorize Home Assistant's requests to the proxy. You can leave it empty if your proxy does not require one. + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +URL: + description: The base URL of your LiteLLM proxy, including the host and port. The integration automatically appends the OpenAI `/v1` path if it is missing. +API key: + description: An optional LiteLLM API key or virtual key. Leave it empty if your proxy does not require authentication. +{% endconfiguration_basic %} + +### Adding a conversation agent + +After the integration is set up, add a conversation agent for the model you want to use: + +1. Go to {% my integrations title="**Settings** > **Devices & services**" %} and select your LiteLLM entry. +2. Select **Add conversation agent**. +3. Fill in the fields: + +{% configuration_basic %} +Model: + description: "The model to use for the conversation agent. The list is discovered from your LiteLLM proxy." +Instructions: + description: "Instruct how the LLM should respond. This field supports [templates](/docs/configuration/templating/)." +Control Home Assistant: + description: "Select which tools the agent can use to interact with your devices and entities. Leave empty if you do not want the agent to control Home Assistant." +{% endconfiguration_basic %} + +To change the model, instructions, or tools later, select the conversation agent and choose **Reconfigure conversation agent**. + +## Supported functionality + +This integration provides a conversation agent for each model you add. You can use it in [Assist](/voice_control/) like any other conversation agent. + +When you grant the agent control of Home Assistant, it can call the configured tools to interact with your devices and entities. To choose which devices and entities the agent can access, see [exposing entities to Assist](/voice_control/voice_remote_expose_devices/). + +## Removing the integration + +This integration follows standard integration removal, no extra steps are required. + +{% include integrations/remove_device_service.md %} From aa18f1466a7ab54eff893efd71e32158edfb7600 Mon Sep 17 00:00:00 2001 From: Ronald van der Meer Date: Sat, 18 Jul 2026 09:53:32 +0200 Subject: [PATCH 114/123] Document Duco ventilation temperature sensors (#46890) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/duco.markdown | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/_integrations/duco.markdown b/source/_integrations/duco.markdown index 349959a437cc..e08b6f3b60bc 100644 --- a/source/_integrations/duco.markdown +++ b/source/_integrations/duco.markdown @@ -47,7 +47,7 @@ Other Duco systems that expose public API version 2.1 or newer can be set up, bu The following node types are supported: -- **BOX**: The main ventilation box; provides fan control, ventilation state, target flow level, state end time, and Wi-Fi signal strength. Models that expose a filter timer also provide a filter remaining sensor. +- **BOX**: The main ventilation box; provides fan control, ventilation state, target flow level, state end time, air temperatures, and Wi-Fi signal strength. Models that expose a filter timer also provide a filter remaining sensor. - **UCCO2**: Wall-mounted CO₂ sensor unit; provides CO₂ concentration and CO₂ air quality index. - **BSRH**: Humidity sensor module installed in the duct inlet of the DucoBox, wired directly to the PCB via cable; provides relative humidity and humidity air quality index. - **UCRH**: Wireless humidity sensor module; provides relative humidity and humidity air quality index. @@ -112,6 +112,15 @@ Home Assistant only shows the options advertised by your Duco system, so the ava The following sensor entities are created per node, depending on the node type: +#### Air temperatures + +Available for the main ventilation box (BOX) when the Duco system exposes the values. These sensors show the following temperatures in degrees Celsius: + +- **Outdoor air temperature**: Air entering the ventilation box from outdoors. +- **Supply air temperature**: Air supplied from the ventilation box to your home. +- **Extract air temperature**: Air extracted from your home into the ventilation box. +- **Exhaust air temperature**: Air leaving the ventilation box to outdoors. + #### Target flow level Available for the main ventilation box (BOX). Shows the actual airflow target as reported by the Duco box, as a percentage (0–100%). This value reflects the real airflow configured in the Duco firmware and differs from the abstract speed levels (33%, 66%, or 100%) shown in the fan entity. For example, if your Duco system is configured with manual speed levels of 15%, 30%, and 100%, this sensor shows those values. From 70fa100ceee635417a75ba8079cd002a5dfeaca0 Mon Sep 17 00:00:00 2001 From: Hamish Date: Sat, 18 Jul 2026 17:24:02 +0930 Subject: [PATCH 115/123] Update Gatus Docs to add Reconfiguration flow (#46896) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Marcin Sędłak-Jakubowski --- source/_integrations/gatus.markdown | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/source/_integrations/gatus.markdown b/source/_integrations/gatus.markdown index 9d8ab48a7f2f..c697d1b34003 100644 --- a/source/_integrations/gatus.markdown +++ b/source/_integrations/gatus.markdown @@ -127,11 +127,23 @@ automation: | The integration {% term polling polls %} your Gatus instance every 30 seconds. +## Reconfiguration + +If you need to update the connection details (URL) of your Gatus instance, you can reconfigure the integration: + +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}. +2. Select the **Gatus** integration card. +3. Select the three dots menu {% icon "mdi:dots-vertical" %}, and then select **Reconfigure**. +4. Update the URL of your Gatus instance. +5. Select **Submit**. + +Reconfiguring or reloading the integration will automatically discover and add any newly configured endpoints as new binary sensor entities. + ## Known limitations - The integration shows the result of the most recent health check. Historical results stored by Gatus are not available as entities. -- The integration requires manual reconfiguation when a new endpoint is added or removed. -- The integration currently does not support authenticated instances +- The integration requires a manual reload or reconfiguration to discover when a new endpoint is added or removed. +- The integration currently does not support authenticated instances. ## Troubleshooting From b3e74afa131802a9601ea90c8083410baac4f551 Mon Sep 17 00:00:00 2001 From: Hamish Date: Sat, 18 Jul 2026 20:03:39 +0930 Subject: [PATCH 116/123] Add diagnostics section to Gatus docs (#46912) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/gatus.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/_integrations/gatus.markdown b/source/_integrations/gatus.markdown index c697d1b34003..779536f06027 100644 --- a/source/_integrations/gatus.markdown +++ b/source/_integrations/gatus.markdown @@ -164,8 +164,15 @@ The setup form shows an error saying it cannot connect to your Gatus instance. If entities become unavailable after setup, Home Assistant could not reach your Gatus instance during the last data refresh. Check your network connection and confirm the Gatus instance is still running. Entities will recover automatically once the connection is restored. +## Diagnostics + +The Gatus integration supports [diagnostic data collection](/docs/configuration/troubleshooting/#download-diagnostics) to help troubleshoot issues. If you're experiencing problems with the integration, you can download diagnostic information to include when reporting issues. + +The diagnostic data contains the status of all Gatus endpoints monitored by the integration. It does not include the URL you entered to connect to Gatus. + ## Removing the integration This integration follows standard integration removal. {% include integrations/remove_device_service.md %} + From 217ebd26a8a50549ba44431cdb8a8a74633fd470 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Sun, 19 Jul 2026 13:05:05 +0200 Subject: [PATCH 117/123] Add information about Shelly Enhanced Security (#46883) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Shay Levy --- source/_integrations/shelly.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown index 5b9e2ffcb790..8e572a278254 100644 --- a/source/_integrations/shelly.markdown +++ b/source/_integrations/shelly.markdown @@ -56,6 +56,8 @@ Host: description: "The Hostname or IP address of your Shelly device. You can find it in your router." Port: description: "Custom TCP port of the device. Change this only if the device is connected via Shelly Range Extender." +Verify SSL: + description: "Verify SSL/TLS certificate when connecting on HTTPS (port 443, Gen2+). Enable this only if the device uses a certificate signed by a certificate authority your Home Assistant instance trusts." {% endconfiguration_basic %} {% include integrations/option_flow.md %} @@ -71,6 +73,12 @@ There are four generations of devices and all generations are supported by this Shelly BLU series devices (e.g. Shelly BLU H&T) are not supported; please use BTHome integration to configure such devices with Home Assistant. The exception to this is Shelly BLU TRV, which is supported by this integration via Shelly BLU Gateway Gen3. +## Shelly Enhanced Security + +Enhanced Security is a firmware 2.0.0 feature for Gen2+ devices that enables additional security measures required for compliance with the Radio Equipment Directive (RED). When enabled, the device uses HTTPS and enforces secure communication. Devices shipped from factory with firmware 2.0.0+ come with HTTPS already enabled using certificates issued by Shelly's internal PKI. Devices that were updated to firmware 2.0.0+ (but not originally shipped with it) do not have factory-provisioned certificates and serve only plain HTTP by default, so you must upload your own certificate before using this feature. See [the official guide](https://shelly-api-docs.shelly.cloud/gen2/General/CustomHTTPSCertificates/) for instructions on creating and installing a certificate. + +The Shelly integration automatically detects whether Enhanced Security is enabled on the device and always communicates with that device over HTTPS using port 443. If you uploaded a certificate signed by a certificate authority your Home Assistant instance trusts, enable **Verify SSL**; otherwise, leave it disabled. + ## Data updates Shelly devices push updates to Home Assistant upon changes for all main functions of the device. For push updates to work correctly, some devices need additional configuration: From 52534ce6f4b34182a6d4437dc8d2dd122f20d060 Mon Sep 17 00:00:00 2001 From: Icereed Date: Sun, 19 Jul 2026 13:05:19 +0200 Subject: [PATCH 118/123] Add pressure tank units to Gardena Bluetooth documentation (#46921) Co-authored-by: Joakim Plate Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/_integrations/gardena_bluetooth.markdown | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/_integrations/gardena_bluetooth.markdown b/source/_integrations/gardena_bluetooth.markdown index 72cd79a49a2a..bee2e339c8bd 100644 --- a/source/_integrations/gardena_bluetooth.markdown +++ b/source/_integrations/gardena_bluetooth.markdown @@ -30,7 +30,7 @@ ha_integration_type: device The **Gardena Bluetooth** {% term integration %} allows users to integrate their Gardena Bluetooth devices into Home Assistant. -See device section for support information: [water control](#water-control), [irrigation valves](#irrigation-valves), [lawn mowers](#lawn-mowers), [garden pumps](#gard-pumps), [aqua contours](#aqua-contours). +See the device sections for support information: [water control](#water-control), [irrigation valves](#irrigation-valves), [lawn mowers](#lawn-mowers), [garden pumps](#gard-pumps), [pressure tank units](#pressure-tank-units), [aqua contours](#aqua-contours). {% include integrations/config_flow.md %} @@ -78,6 +78,13 @@ Gardena Bluetooth lawn mowers are currently not supported due to custom protocol - Garden Pump ([9058-61](https://www.gardena.com/int/products/pumps/watering-pumps/garden-pump-6300-silentcomfort/970645301.html)) - Garden Pump ([9059-61](https://www.gardena.com/int/products/pumps/watering-pumps/garden-pump-6500-silentcomfort/970645501.html)) +## Pressure tank units + +- Pressure Tank Unit 5600 SilentComfort ([9067-20](https://www.gardena.com/int/products/pumps/domestic-water-supply-pumps/pressure-tank-unit-5600-silentcomfort/970646301.html)) +- Pressure Tank Unit 6300 SilentComfort ([9068-20](https://www.gardena.com/int/products/pumps/domestic-water-supply-pumps/pressure-tank-unit-6300-silentcomfort/970646501.html)) + +In addition to the pump controls, pressure tank units provide sensors for the current tank pressure and water temperature. + ## Aqua Contours - Aqua Precise Overground ([16000-20](https://www.gardena.com/int/products/watering/sprinklersystem/aquaprecise-solar-powered-lawn-irrigation-system/970746801.html)) From 24ed181895f2e6a08e177859fe65966d1d02d9a1 Mon Sep 17 00:00:00 2001 From: Imou-OpenPlatform Date: Mon, 20 Jul 2026 22:14:59 +0800 Subject: [PATCH 119/123] Document Imou sensor platform (#46747) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marcin Sędłak-Jakubowski --- source/_integrations/imou.markdown | 32 ++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/source/_integrations/imou.markdown b/source/_integrations/imou.markdown index 8a5eebbd7041..d558e1ae098d 100644 --- a/source/_integrations/imou.markdown +++ b/source/_integrations/imou.markdown @@ -4,9 +4,10 @@ description: Integrate Imou smart devices into Home Assistant. ha_category: - Button - Camera + - Sensor - Switch ha_iot_class: Cloud Polling -ha_release: 2026.6 +ha_release: 2026.7 ha_config_flow: true ha_domain: imou ha_codeowners: @@ -14,16 +15,17 @@ ha_codeowners: ha_platforms: - button - camera + - sensor - switch ha_integration_type: hub ha_quality_scale: bronze --- -The **Imou** {% term integration %} connects to the [Imou Open Platform](https://open.imoulife.com/) using your App ID and App secret. Devices linked to your platform account are discovered automatically. Channel devices expose **Live view SD** and **Live view HD** camera entities, supported actions are exposed as button entities, and supported toggles are exposed as switch entities in Home Assistant. +The **Imou** {% term integration %} connects to the [Imou Open Platform](https://open.imoulife.com) using your App ID and App secret. Devices linked to your platform account are discovered automatically. Channel devices expose **Live view SD** and **Live view HD** camera entities, supported actions are exposed as button entities, supported toggles are exposed as switch entities, and supported measurements are exposed as sensor entities in Home Assistant. ## Supported devices -The integration supports Imou devices that are already added to your Imou Open Platform account and reported by the cloud API. Supported button and switch entities depend on each device type (for example, PTZ controls are only created when the device supports PTZ). +The integration supports Imou devices that are already added to your Imou Open Platform account and reported by the cloud API. Supported button, switch, and sensor entities depend on each device type (for example, PTZ controls are only created when the device supports PTZ, and battery sensors only appear on devices that report battery level). Add or remove devices in the Imou Open Platform or Imou app; new devices are picked up on the next data refresh. @@ -31,7 +33,7 @@ Add or remove devices in the Imou Open Platform or Imou app; new devices are pic Before using the Imou integration, create an Imou Open Platform application: -1. Visit [Imou Open Platform](https://open.imoulife.com/). +1. Visit [Imou Open Platform](https://open.imoulife.com). 2. Register or log in to your Imou account, then open the **Control board**. 3. Go to **App Information** to obtain an **App ID** and **App secret**. 4. Add your Imou devices in the Imou Open Platform or Imou mobile app so they appear on your account. @@ -99,6 +101,22 @@ When the cloud API reports that the toggle is supported for a device, the integr - **Privacy mode**: Enable privacy mode that closes or disables the camera lens on supported models. - **White light**: Manually toggle the camera white LED illuminator on supported models. +### Sensors + +When the cloud API reports that a measurement is supported for a device, the integration exposes sensor entities. Only supported sensor types are created for each device. + +- **Battery**: Battery level as a percentage on supported battery-powered devices. +- **Temperature**: Current ambient temperature in degrees Celsius on supported models. +- **Humidity**: Current relative humidity as a percentage on supported models. +- **Power**, **Voltage**, **Current**: Real-time electrical measurements on supported IoT socket and power-monitoring devices. +- **Energy consumption**: Total energy used in kilowatt-hours on supported socket devices. +- **Usage duration**: Total operating time in minutes on supported socket devices. +- **Cycles today**: Number of switch cycles for the current day on supported socket devices. +- **Storage used**: Storage usage as a percentage. When the storage medium is unavailable or reports an abnormal condition, the entity state is `unknown`. +- **Status**: Device connectivity state (`online`, `offline`, `sleep`, or `upgrading`). This sensor remains available when the device is offline so you can still see its last reported state. + +Battery, storage used, and status sensors are shown under **Diagnostic** on the device page. Other sensors appear under **Sensors**. + ## Data updates The integration {% term polling polls %} Imou cloud APIs every 2 minutes to refresh the device list and online status. New devices on your account are added automatically; devices removed from your account are removed from Home Assistant. @@ -125,6 +143,12 @@ Buttons are unavailable when a device is offline or no longer on your account. E Switches are unavailable when a device is offline or no longer on your account. Ensure the device has power and network connectivity and appears online in the Imou app. +### A sensor is unavailable + +Most sensors are unavailable when a device is offline or no longer on your account. Ensure the device has power and network connectivity and appears online in the Imou app. + +The **Status** sensor is an exception: it stays available when the device is offline and reports `offline` instead of becoming unavailable. + ## Removing the integration This integration follows standard integration removal. From f8b343bebef919b243086a92a8122a1b1f99a707 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Tue, 21 Jul 2026 09:52:21 +0200 Subject: [PATCH 120/123] Add documentation for new integration Midea LAN (#40785) Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com> --- source/_integrations/midea_lan.markdown | 117 ++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 source/_integrations/midea_lan.markdown diff --git a/source/_integrations/midea_lan.markdown b/source/_integrations/midea_lan.markdown new file mode 100644 index 000000000000..e59fe396b4c5 --- /dev/null +++ b/source/_integrations/midea_lan.markdown @@ -0,0 +1,117 @@ +--- +title: Midea LAN +description: Instructions on how to integrate devices with Midea protocol into Home Assistant. +ha_category: + - Climate +ha_release: 2026.8 +ha_domain: midea_lan +ha_config_flow: true +ha_codeowners: + - '@chemelli74' + - '@rokam' + - '@wuwentao' +ha_iot_class: Local Push +ha_platforms: + - climate +ha_integration_type: device +ha_quality_scale: bronze +--- + +The **Midea LAN** {% term integration %} lets you control devices with Midea protocol connected to various clouds. + +The integration provides information on connected devices and enables control of the main features. + +## Supported devices + +There is support for the following device types within Home Assistant: + +- **Air Box** +- **Air Conditioner** +- **Air Purifier** +- **Bathroom Master** +- **Clothes Dryer** +- **Dehumidifier** +- **Dish Sterilizer** +- **Dishwasher** +- **Electric Heater** +- **Electric Oven** +- **Electric Pressure Cooker** +- **Electric Rice Cooker** +- **Electric Slow Cooker** +- **Electric Water Heater** +- **Fan** +- **Fresh Air Appliance** +- **Front Load Washer** +- **Gas Stove** +- **Gas Water Heater** +- **Heat Pump Water Heater** +- **Heat Pump Wi-Fi Controller** +- **Heat Pump** +- **Humidifier** +- **Integrated Ceiling Fan** +- **Light** +- **MDV Wi-Fi Controller** +- **Microwave Oven** +- **Microwave Steam Oven** +- **Range Hood** +- **Refrigerator** +- **Sink Dishwasher** +- **Toaster** +- **Toilet** +- **Top Load Washer** +- **Water Drinking Appliance** + +{% warning %} + +This integration requires devices with protocol V1, V2, and V3. +It is based on **API v1** while some new devices are based on **API v2**. + +{% endwarning %} + +{% include integrations/config_flow.md %} + +The integration offers automatic discovery and manual configuration. + +{% configuration_basic %} + name: + description: The name of the device. + appliance code: + description: The code of the device. Needs to be retrieved from mobile app. + type: + description: The type of the device. See list above + ip_address: + description: The IP address of the device. + port: + description: The TCP/IP port of the device. + protocol: + description: The protocol version of the device. Can be V1, V2 or V3. + model: + description: The model of the device. Needs to be retrieved from mobile app. + subtype: + description: The subtype of the device. Needs to be retrieved from mobile app. + token: + description: The token of the device. Needs to be retrieved from mobile app. + key: + description: The key of the device. Needs to be retrieved from mobile app. +{% endconfiguration_basic %} + +## Data updates + +The integration pushes updates to Home Assistant upon changes for all main functions of the device. + +## Supported functionality + +The **Midea LAN** {% term integration %} provides the following entities: + +- Climate + +## Known limitations + +This integration requires devices with protocol V1, V2, and V3. +It is based on **API v1** while some new devices are based on **API v2**. + +## Removing the integration + +This integration follows standard integration removal. No extra steps are required. + +{% include integrations/remove_device_service.md %} From 0b8012fac5868eafaaea1c1570c238e598147a41 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Tue, 21 Jul 2026 19:11:56 +0200 Subject: [PATCH 121/123] Add button information to Mikrotik (#46835) --- source/_integrations/mikrotik.markdown | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/_integrations/mikrotik.markdown b/source/_integrations/mikrotik.markdown index e2173e3ce56e..b170092019e3 100644 --- a/source/_integrations/mikrotik.markdown +++ b/source/_integrations/mikrotik.markdown @@ -2,6 +2,7 @@ title: Mikrotik description: Instructions on how to integrate MikroTik/RouterOS based devices into Home Assistant. ha_category: + - Button - Hub - Presence detection - Sensor @@ -12,6 +13,7 @@ ha_config_flow: true ha_domain: mikrotik ha_iot_class: Local Polling ha_platforms: + - button - device_tracker - sensor ha_integration_type: device @@ -117,3 +119,10 @@ The integration creates sensor entities when the connected device exposes that i - CPU usage - Device temperature - Device power voltage + +### Buttons + +The integration creates the following button entities: + +- **Restart**: Reboots the MikroTik device. +- **Shutdown**: Powers off the MikroTik device. After a shutdown, the device is no longer reachable over the network and cannot be powered back on remotely from Home Assistant. From e17ab8c63ad8ed184c8ea30e960a8e4a82d766a6 Mon Sep 17 00:00:00 2001 From: Maarten Lakerveld Date: Tue, 21 Jul 2026 21:54:56 +0200 Subject: [PATCH 122/123] Add onboarding survey redirect (#46969) --- source/_redirects | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_redirects b/source/_redirects index 83d40e743f58..765af3da0af1 100644 --- a/source/_redirects +++ b/source/_redirects @@ -37,6 +37,7 @@ layout: null # Design & User research /join-chat-design https://discord.com/channels/330944238910963714/1475553148847526123 +/surveys/onboarding https://usabi.li/do/i39njudc3tl7/ksqzg8 # Older development pages /developers https://developers.home-assistant.io From 33dab6545e8025177d4c28bbed56bab60ac2dea7 Mon Sep 17 00:00:00 2001 From: trip-g Date: Wed, 22 Jul 2026 06:17:14 -0400 Subject: [PATCH 123/123] Document new Lyric binary sensors and sensors Adds documentation for entities added across five pending home-assistant/core PRs for the lyric integration: - New binary_sensor platform: Vacation Hold, Device Pairing Enabled (device-level), and Room Motion (per paired room sensor accessory) - New sensors: Schedule Status, Priority Status (device-level), and Room Average Temperature, Accessory Status (per paired room sensor accessory) --- source/_integrations/lyric.markdown | 45 +++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/source/_integrations/lyric.markdown b/source/_integrations/lyric.markdown index 8a516386518d..61eab07e1163 100644 --- a/source/_integrations/lyric.markdown +++ b/source/_integrations/lyric.markdown @@ -2,6 +2,7 @@ title: Honeywell Lyric description: How to integrate the Honeywell Lyric integration into Home Assistant. ha_category: + - Binary sensor - Climate - Select - Sensor @@ -12,6 +13,7 @@ ha_codeowners: - '@timmo001' ha_domain: lyric ha_platforms: + - binary_sensor - climate - select - sensor @@ -54,6 +56,21 @@ The integration setup will ask for the **Client ID** and **Client Secret**. Thes During setup, you will be redirected to Honeywell to sign in. Use your regular Resideo/Honeywell Home account here, not the developer account you created on the developer site. These are two separate accounts, even if they share the same email address. {% endimportant %} +## Binary sensors + +This integration provides the following binary sensors: + +| Name | Description | +| ------------------------ | ----------------------------------------------------------- | +| Vacation Hold | Indicates whether the thermostat is currently in vacation hold. | +| Device Pairing Enabled | Indicates whether pairing mode is enabled on the thermostat. | + +Additional binary sensors will be created for each room sensor accessory assigned to a thermostat device, if applicable: + +| Name | Description | +| ----------- | --------------------------------------------------------------------- | +| Room Motion | Indicates whether motion has been detected by a room sensor accessory. | + ## Selects - **Room priority** @@ -65,18 +82,22 @@ During setup, you will be redirected to Honeywell to sign in. Use your regular R This integration provides the following sensors: -| Name | Description | -| ------------------- | ------------------------------------------- | -| Indoor Temperature | The reported temperature from the device | -| Indoor Humidity | The reported humidity from the device | -| Outdoor Temperature | Lyric's outdoor temperature report | -| Outdoor Humidity | Lyric's outdoor humidity | -| Next Period Time | The next time the thermostat will change | -| Setpoint Status | A description of the setpoint of the device | +| Name | Description | +| ------------------- | ------------------------------------------------------------------------------------------------------------------- | +| Indoor Temperature | The reported temperature from the device | +| Indoor Humidity | The reported humidity from the device | +| Outdoor Temperature | Lyric's outdoor temperature report | +| Outdoor Humidity | Lyric's outdoor humidity | +| Next Period Time | The next time the thermostat will change | +| Setpoint Status | A description of the setpoint of the device | +| Schedule Status | The thermostat's current schedule status (for example, "Resume") | +| Priority Status | The current room priority hold status (for example, "No Hold"). Available for T9 and T10 thermostats with at least one paired room sensor. | Additional sensors will be created for each room sensor accessory assigned to a thermostat device, if applicable: -| Name | Description | -| -------------------- | ----------------------------------------------------------------- | -| Room Temperature | The temperature reported from a room sensor accessory | -| Room Humidity | The humidity reported from a room accessory | +| Name | Description | +| ------------------------- | ------------------------------------------------------------------ | +| Room Temperature | The temperature reported from a room sensor accessory | +| Room Humidity | The humidity reported from a room accessory | +| Room Average Temperature | The average temperature reported for the room | +| Accessory Status | The reported status of the room sensor accessory (for example, "Ok") |