Merge branch 'current' into next

This commit is contained in:
Franck Nijhof 2025-03-24 12:12:24 +00:00
commit b5b6ac8b51
No known key found for this signature in database
GPG Key ID: D62583BA8AB11CA3
95 changed files with 3081 additions and 1018 deletions

View File

@ -10,7 +10,7 @@ jobs:
- name: Check out files from GitHub
uses: actions/checkout@v4.2.2
- name: Setting up Node.js
uses: actions/setup-node@v4.2.0
uses: actions/setup-node@v4.3.0
with:
node-version: 20
cache: "npm"
@ -27,7 +27,7 @@ jobs:
- name: Check out files from GitHub
uses: actions/checkout@v4.2.2
- name: Setting up Node.js
uses: actions/setup-node@v4.2.0
uses: actions/setup-node@v4.3.0
with:
node-version: 20
cache: "npm"

View File

@ -10,9 +10,9 @@ group :development do
gem 'stringex', '2.8.6'
# > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189
gem 'sassc', '2.1.0'
gem 'sass-embedded', '1.85.1'
gem 'rubocop', '1.73.2'
gem 'ruby-lsp', '0.23.11'
gem 'sass-embedded', '1.86.0'
gem 'rubocop', '1.74.0'
gem 'ruby-lsp', '0.23.12'
gem 'rackup', '2.2.1'
end
@ -24,7 +24,7 @@ group :jekyll_plugins do
end
gem 'sinatra', '4.1.1'
gem 'nokogiri', '1.18.3'
gem 'nokogiri', '1.18.5'
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library

View File

@ -3,7 +3,7 @@ GEM
specs:
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
ast (2.4.2)
ast (2.4.3)
base64 (0.2.0)
bigdecimal (3.1.9)
chunky_png (1.4.0)
@ -22,7 +22,7 @@ GEM
compass-import-once (1.0.5)
sass (>= 3.2, < 3.5)
concurrent-ruby (1.3.5)
csv (3.3.2)
csv (3.3.3)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
@ -30,10 +30,10 @@ GEM
ffi (1.17.1-arm64-darwin)
ffi (1.17.1-x86_64-linux-gnu)
forwardable-extended (2.6.0)
google-protobuf (4.30.0-arm64-darwin)
google-protobuf (4.30.1-arm64-darwin)
bigdecimal
rake (>= 13)
google-protobuf (4.30.0-x86_64-linux)
google-protobuf (4.30.1-x86_64-linux)
bigdecimal
rake (>= 13)
http_parser.rb (0.8.0)
@ -70,7 +70,7 @@ GEM
nokogiri (~> 1.12)
jekyll-watch (2.2.1)
listen (~> 3.0)
json (2.10.1)
json (2.10.2)
kramdown (2.5.1)
rexml (>= 3.3.9)
kramdown-parser-gfm (1.1.0)
@ -86,20 +86,20 @@ GEM
multi_json (1.15.0)
mustermann (3.0.3)
ruby2_keywords (~> 0.0.1)
nokogiri (1.18.3-arm64-darwin)
nokogiri (1.18.5-arm64-darwin)
racc (~> 1.4)
nokogiri (1.18.3-x86_64-linux-gnu)
nokogiri (1.18.5-x86_64-linux-gnu)
racc (~> 1.4)
parallel (1.26.3)
parser (3.3.7.1)
parser (3.3.7.2)
ast (~> 2.4.1)
racc
pathutil (0.16.2)
forwardable-extended (~> 2.6)
prism (1.3.0)
prism (1.4.0)
public_suffix (6.0.1)
racc (1.8.1)
rack (3.1.11)
rack (3.1.12)
rack-protection (4.1.1)
base64 (>= 0.1.0)
logger (>= 1.6.0)
@ -114,12 +114,12 @@ GEM
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
rbs (3.8.1)
rbs (3.9.1)
logger
regexp_parser (2.10.0)
rexml (3.4.1)
rouge (4.5.1)
rubocop (1.73.2)
rubocop (1.74.0)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
@ -130,9 +130,9 @@ GEM
rubocop-ast (>= 1.38.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.38.1)
parser (>= 3.3.1.0)
ruby-lsp (0.23.11)
rubocop-ast (1.41.0)
parser (>= 3.3.7.2)
ruby-lsp (0.23.12)
language_server-protocol (~> 3.17.0)
prism (>= 1.2, < 2.0)
rbs (>= 3, < 4)
@ -141,9 +141,10 @@ GEM
ruby2_keywords (0.0.5)
safe_yaml (1.0.5)
sass (3.4.25)
sass-embedded (1.85.1)
google-protobuf (~> 4.29)
rake (>= 13)
sass-embedded (1.86.0-arm64-darwin)
google-protobuf (~> 4.30)
sass-embedded (1.86.0-x86_64-linux-gnu)
google-protobuf (~> 4.30)
sass-globbing (1.1.5)
sass (>= 3.1)
sassc (2.1.0)
@ -157,14 +158,14 @@ GEM
rack-protection (= 4.1.1)
rack-session (>= 2.0.0, < 3)
tilt (~> 2.0)
sorbet-runtime (0.5.11899)
sorbet-runtime (0.5.11953)
stringex (2.8.6)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
tilt (2.6.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
tzinfo-data (1.2025.1)
tzinfo-data (1.2025.2)
tzinfo (>= 1.0.0)
unicode-display_width (2.6.0)
webrick (1.9.1)
@ -180,12 +181,12 @@ DEPENDENCIES
jekyll-paginate (= 1.1.0)
jekyll-sitemap (= 1.4.0)
jekyll-toc (= 0.19.0)
nokogiri (= 1.18.3)
nokogiri (= 1.18.5)
rackup (= 2.2.1)
rake (= 13.2.1)
rubocop (= 1.73.2)
ruby-lsp (= 0.23.11)
sass-embedded (= 1.85.1)
rubocop (= 1.74.0)
ruby-lsp (= 0.23.12)
sass-embedded (= 1.86.0)
sass-globbing (= 1.1.5)
sassc (= 2.1.0)
sinatra (= 4.1.1)
@ -197,4 +198,4 @@ RUBY VERSION
ruby 2.6.2p47
BUNDLED WITH
2.5.3
2.5.3

View File

@ -108,8 +108,8 @@ social:
# Home Assistant release details
current_major_version: 2025
current_minor_version: 3
current_patch_version: 0
date_released: 2025-03-05
current_patch_version: 4
date_released: 2025-03-21
# Either # or the anchor link to latest release notes in the blog post.
# Must be prefixed with a # and have double quotes around it.

403
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,7 @@
"remark-lint-prohibited-strings": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-stringify": "^11.0.0",
"textlint": "^14.4.2",
"textlint": "^14.5.0",
"textlint-filter-rule-comments": "^1.2.2",
"textlint-rule-common-misspellings": "^1.0.1",
"textlint-rule-terminology": "^5.0.13"

View File

@ -124,6 +124,11 @@ module Jekyll
end
end
end
def case_insensitive_sort(input, key)
return input unless input.is_a?(Array)
input.sort_by { |item| item[key].to_s.downcase }
end
end
end

View File

@ -5,22 +5,156 @@
font-weight: 500;
letter-spacing: .005em;
color: $gray;
padding-top: 8px;
text-transform: uppercase;
}
}
.component-search {
margin-bottom: 24px;
min-height: 80px;
input {
width: 100%;
padding: 10px;
background-color: #fefefe;
border-radius: 8px;
border: 1px solid;
border-color: #7c7c7c #c3c3c3 #ddd;
}
}
.grid-filters {
@media only screen and (min-width: $desk-start) {
display: flex;
}
}
.integration-filter-radio {
display: flex;
border: none;
padding: 0;
grid-gap: 10px;
}
.filter-button {
display: flex;
align-items: center;
margin-bottom: 0;
width: fit-content;
font-size: 1rem;
box-shadow: none;
background-color: $blueDark;
color: white;
border-radius: 24px;
input {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
padding-left: 16px;
display: block;
margin-left: 10px;
flex-shrink: 0;
height: 1rem;
width: 1rem;
border-radius: 100%;
border-color: transparent;
background-color: white;
&:checked {
background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22%23007fa8%22%20transform%3D%22rotate(90)%22%3E%3Ccircle%20cx%3D%228%22%20cy%3D%228%22%20r%3D%223%22%2F%3E%3C%2Fsvg%3E");
}
}
label {
display: block;
width: 100%;
padding: 4px 16px 4px 10px;
}
}
.integration-filter.integration-filter-select {
position: relative;
&::after {
content: " ";
position: absolute;
top: 50%;
margin-top: 2px;
right: 8px;
width: 0;
height: 0;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-top: 5px solid black;
}
.ha_category {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
color: #222;
width: 100%;
margin-bottom: 15px;
text-align-last: center;
font-size: 16px;
line-height: 24px;
border: 2px solid $blueDark;
border-top-right-radius: 0px;
border-top-left-radius: 0px;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
border-top: 0;
position: relative;
top: -2px;
padding: 5px 5px 2px;
&:focus-visible {
outline: none;
}
}
}
.filter-title {
background: $blueDark;
color: white;
text-align: center;
border-top-right-radius: 5px;
border-top-left-radius: 5px;
padding: 5px;
margin-top: 0;
margin-bottom: -2px;
text-transform: capitalize;
font-size: 18px;
position: relative;
z-index: 1;
}
.active-filter {
margin: 10px 5px 0px 0px;
padding: 5px 10px;
min-width: 100px;
background-color: $blueDark;
border-radius: 28px;
border: none;
color: white;
font-size: 14px;
letter-spacing: 0.5px;
text-transform: capitalize;
line-height: 18px;
span {
display: flex;
align-items: center;
}
iconify-icon {
display: inline-block;
margin-left: 5px;
}
}
select {
font-family: $sans-serif;
border: 0;
@ -44,6 +178,10 @@
width: 100%;
}
div.alert {
text-align: center;
}
.option-card {
flex: 0 0 auto;
aspect-ratio: 1;
@ -147,7 +285,7 @@ a.option-card:hover {
img {
max-width: 48px;
max-height: 48px;
}
}
}
.title {
@ -201,7 +339,7 @@ a.option-card:hover {
}
.category_select {
display: block;
}
}
.category_list {
display: none;
}
@ -330,4 +468,4 @@ a.option-card:hover {
to {
opacity: 0;
}
}
}

View File

@ -19,7 +19,7 @@ related:
The map card allows you to display your home zone, entities, and other predefined zones on a map. This card is used on the [Map dashboard](/dashboards/dashboards/#map-dashboard), which is one of the default dashboards.
<p class='img'>
<img src='/images/dashboards/map_card.png' alt='Screenshot of the map card'>
<img src='/images/dashboards/map_card.webp' alt='Screenshot of the map card'>
Screenshot of the map card.
</p>

View File

@ -39,8 +39,10 @@ You can group cards without using horizontal or vertical stack cards.
5. When you are done, select **Save**.
- You are now presented with a new, empty view.
- If you chose a background image, the page is filled with that image.
Once you have created a sections view, you can populate it sections and cards. You can also add a header with a title and badges.
6. Once you have created a sections view, you can start curating it:
- [Add sections and cards](#adding-sections-and-cards-to-a-sections-view).
- [Rearrange](#rearranging-sections-and-cards) and [show or hide sections conditionally](#show-or-hide-section-conditionally).
- [Add a dashboard header with a title and badges](#editing-the-header).
## Editing the header

View File

@ -16,7 +16,7 @@ The tile card gives you a quick overview of your {% term entity %}. The card all
<p class='img'>
<img src='/images/dashboards/tile_card_tap_action.webp' alt='Screenshot of tile cards'>
The circular background behind an icon indicates that there is a tap action.
The circular background behind an icon indicates that there is a tap action.
The "Downstairs" and "Upstairs" climate entities have a badge and a feature that is bottom-aligned.
</p>
@ -152,15 +152,4 @@ features:
You want to colorize the tile card? Choose one of the following colors: `primary`, `accent`, `disabled`, `red`, `pink`, `purple`, `deep-purple`, `indigo`, `blue`, `light-blue`, `cyan`, `teal`, `green`, `light-green`, `lime`, `yellow`, `amber`, `orange`, `deep-orange`, `brown`, `grey`, `blue-grey`, `black` and `white`.
## Reordering features
Some features of the tile card, such as the presets or the HVAC modes of a
thermostat, can show many buttons. While you can limit the buttons youd
like to see, they may not be in the desired order.
For your thermostat, that means you can reorder the HVAC modes or presets.
<p class='img'>
<img src="/images/blog/2024-05/tile-card-reorder-features.gif" alt=" Screen recording showing how you can now reorder the HVAC modes on the thermostat shown in a tile card."/>
You can now reorder the features of the tile card.
</p>

View File

@ -222,6 +222,11 @@ yellow:
ship_to: Europe
url: https://thepihut.com/products/home-assistant-yellow
logo: /images/distributors/pi-hut.webp
- name: Domadoo
ship_from: France
ship_to: Europe
url: https://www.domadoo.fr/en/smart-home-hub/7113-nabu-casa-home-assistant-yellow-kit-with-power-supply.html
logo: /images/distributors/domadoo.jpg
zbt-1:
name: "<strong>Home Assistant Connect ZBT-1</strong>"
distributors:
@ -416,7 +421,7 @@ voice-pe:
ship_to: Europe
url: https://www.domadoo.fr/fr/box-domotique/7558-nabu-casa-home-assistant-voice-preview-edition-0860011789727.html
logo: /images/distributors/domadoo.jpg
- name: Mediarath
- name: mediarath
ship_from: Germany
ship_to: Europe
url: https://mediarath.de/products/home-assistant-voice-preview-edition-open-source-privacy-focused-voice-assistant-with-esphome

View File

@ -797,6 +797,8 @@ automation:
It's also possible to use [limited templates](/docs/configuration/templating/#limited-templates) for times.
{% raw %}
```yaml
blueprint:
input:
@ -821,6 +823,8 @@ blueprint:
- "{{ my_hour }}:30:00"
```
{% endraw %}
## Time pattern trigger
With the time pattern trigger, you can match if the hour, minute or second of the current time matches a specific value. You can prefix the value with a `/` to match whenever the value is divisible by that number. You can specify `*` to match any value (when using the web interface this is required, the fields cannot be left empty).

View File

@ -12,13 +12,14 @@ You need to have a compatible Z-Wave stick or module installed. The following de
The firmwares of 700 and 800 series Z-Wave controllers have several bugs which impact the stability of the mesh and can cause the controller to become unresponsive. Because there is no known firmware version that is completely fixed, it is recommended to choose a firmware based on the following criteria:
- 700 series:
- prefer SDK versions 7.17.2 to 7.18.x
- prefer SDK versions 7.17.2 to 7.18.x or 7.21.6 and newer
- SDK versions 7.19.x are okay
- avoid SDK versions before 7.17.2
- avoid SDK versions 7.20 to 7.21.3
- avoid SDK versions 7.20 to 7.21.5
- 800 series
- prefer SDK versions 7.22.x
- prefer SDK versions 7.23.x and newer
- SDK versions 7.22.x are okay
- SDK versions 7.17.2 to 7.19.x are okay
- avoid SDK versions before 7.17.2
- avoid SDK versions 7.20 to 7.21.3

View File

@ -29,10 +29,10 @@
<div class="ha-buy-dialog-tab-content-wrapper">
{% for distributor_region in distributor_regions %}
<div class="ha-buy-dialog-tab-content {% if forloop.first %}active{% endif %}" id="{{ distributor_region.name | slugify }}">
{% assign az_ship_distributors = distributor_region.items | sort: 'name' | sort: 'ship_from'%}
{% assign az_ship_distributors = distributor_region.items | case_insensitive_sort: 'name' | sort: 'ship_from' %}
<div class="ha-buy-dialog-distributor-items">
{% for distributor in az_ship_distributors %}
<a href="{{ distributor.url }}" target="_blank" rel="noreferrer" class="ha-buy-dialog-distributor-item">
<a href="{{ distributor.url }}" target="_blank" class="ha-buy-dialog-distributor-item">
{% if distributor.logo %}
<img src="{{ distributor.logo }}" alt="{{ distributor.name }} logo" class="ha-buy-dialog-distributor-logo">
{% else %}

View File

@ -10,4 +10,4 @@ To add the {{ title | downcase }} to your user interface:
- This means that it is no longer automatically updated when new dashboard elements become available.
- Once you've taken control, you can't get this specific dashboard back to update automatically. However, you can create a new default dashboard.
- To continue, in the dialog, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Take control**.
2. [Add a card](/dashboards/cards/#adding-cards-to-your-dashboard) to your dashboard.
2. [Add a card and customize actions and features](/dashboards/cards/#adding-cards-to-your-dashboard) to your dashboard.

View File

@ -462,7 +462,7 @@ Minimum recommended assignments:
1. Start the virtual machine.
2. Observe the boot process of the Home Assistant Operating System.
3. Once completed, you will be able to reach Home Assistant on <a href="http://homeassistant.local:8123" target="_blank">homeassistant.local:8123</a>. If you are running an older Windows version or have a stricter network configuration, you might need to access Home Assistant at <a href="http://homeassistant:8123" target="_blank">homeassistant:8123</a> or `http://X.X.X.X:8123` (replace X.X.X.X with your {{site.installation.types[page.installation_type].board}}s IP address).
3. Once completed, you will be able to reach Home Assistant on <a href="http://homeassistant.local:8123" target="_blank">homeassistant.local:8123</a>. If you are running an older Windows version or have a stricter network configuration, you might need to access Home Assistant at <a href="http://homeassistant:8123" target="_blank">homeassistant:8123</a> or `http://X.X.X.X:8123` (replace X.X.X.X with your virtual machines IP address).
{% endif %}

View File

@ -25,6 +25,7 @@ ha_zeroconf: true
---
The AirGradient integration will fetch data from your [AirGradient devices](https://www.airgradient.com/).
AirGradient creates indoor and outdoor air quality monitors that enable you know if the air quality is healthy or not. They measure metrics such as PM2.5, CO2, TVOCs, and NOx. Both the software and hardware are open-source, allowing you to customize or extend the device functionality.
{% important %}
In order for the device to be set up or discovered by Home Assistant, the [firmware](https://www.airgradient.com/documentation/firmwares) version should be at least 3.1.1.
@ -32,6 +33,11 @@ In order for the device to be set up or discovered by Home Assistant, the [firmw
{% include integrations/config_flow.md %}
{% configuration_basic %}
Host:
description: "The IP address or hostname for your AirGradient device."
{% endconfiguration_basic %}
## Available sensors
The integration will fetch data from each device. The following sensors are supported:
@ -61,3 +67,9 @@ The following entities are supported:
- Requesting CO2 calibration
- Requesting LED bar test
- Toggling sharing metrics with AirGradient
## Remove integration
This integration follows standard integration removal, no extra steps are required.
{% include integrations/remove_device_service.md %}

View File

@ -62,7 +62,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -71,7 +71,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -98,7 +98,7 @@ code_trigger_required:
type: boolean
default: true
command_template:
description: "The [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) used for the command payload. Available variables: `action` and `code`."
description: "The [template](/docs/configuration/templating/#using-command-templates-with-mqtt) used for the command payload. Available variables: `action` and `code`."
required: false
type: template
default: action
@ -182,7 +182,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -271,7 +271,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the value."
required: false
type: template
{% endconfiguration %}

View File

@ -46,6 +46,10 @@ For devices that support Auto Comfort and are running firmware 3.1 or later, an
For devices that support Auto Comfort, a climate {% term entity %} allows adjusting the target temperature.
{% note %}
**Climate and Climate Sensors Become Unavailable:** Climate and some sensors like temperature are provided by the remote, not the fan itself on certain models. When the fan loses connection to the remote, these entities may become unavailable while the fan remains available. Consult vendor documentation on how to re-establish connectivity between the fan and remote and reload the integration to restore entities availability.
{% endnote %}
### Number
Adjusting the minimum and maximum speed for devices that support Auto Comfort is available.

View File

@ -51,7 +51,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -60,7 +60,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -156,7 +156,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -214,7 +214,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that returns a string to be compared to `payload_on`/`payload_off` or an empty string, in which case the MQTT message will be removed. Remove this option when `payload_on` and `payload_off` are sufficient to match your payloads (i.e no preprocessing of original message is required)."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) that returns a string to be compared to `payload_on`/`payload_off` or an empty string, in which case the MQTT message will be removed. Remove this option when `payload_on` and `payload_off` are sufficient to match your payloads (i.e no preprocessing of original message is required)."
required: false
type: template
{% endconfiguration %}

View File

@ -40,7 +40,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -49,7 +49,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -57,7 +57,7 @@ availability_topic:
required: false
type: string
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`.
required: false
type: template
command_topic:
@ -144,7 +144,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:

View File

@ -50,7 +50,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -59,7 +59,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -146,7 +146,7 @@ image_encoding:
required: false
type: string
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
required: false
type: template
json_attributes_topic:

View File

@ -54,9 +54,11 @@ Home Assistant Cast requires your Home Assistant installation to be accessible v
{% note %}
Chromecasts generally ignore DNS servers from DHCP and will instead use Google's DNS servers, 8.8.8.8 and 8.8.4.4. This means media URLs must either be specifying the IP-address of the server directly, e.g. `http://192.168.1.1:8123/movie.mp4`, or be publicly resolvable, e.g. `http://homeassistant.internal.mydomain.com:8123/movie.mp4` where `homeassistant.internal.mydomain.com` resolves to `192.168.1.1`. A hostname which can't be publicly resolved, e.g. `http://homeassistant.local:8123/movie.mp4` will fail to play.
Chromecasts generally don't resolve hosts through mDNS and also ignore DNS servers from DHCP, they instead use Google's public DNS servers, 8.8.8.8 and 8.8.4.4.
This is important when casting TTS or local media sources; the cast integration will cast such media from the `external_url` if [configured](/integrations/homeassistant/#editing-the-general-settings-in-yaml), otherwise from the Home Assistant Cloud if configured, otherwise from the [`internal_url`](/integrations/homeassistant/#editing-the-general-settings-in-yaml). Note that the Home Assistant Cloud will not be used if an `external_url` is configured.
This means media URLs must either be specifying the IP-address of the server directly, e.g. `http://192.168.1.1:8123/movie.mp4`, or be publicly resolvable, e.g. `http://homeassistant.internal.mydomain.com:8123/movie.mp4` where `homeassistant.internal.mydomain.com` resolves to `192.168.1.1` using Google's DNS servers. A hostname which can't be publicly resolved, e.g. `http://homeassistant.local:8123/movie.mp4` will fail to play.
This is important when casting TTS or local media sources; the cast integration will cast such media from the local Home Assistant URL, which can be configured by navigating to **{% my network title="Settings > System > Network" %}** or by configuring an [`internal_url`](/integrations/homeassistant/#editing-the-general-settings-in-yaml).
{% endnote %}

View File

@ -54,7 +54,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -63,7 +63,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -187,7 +187,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -281,7 +281,7 @@ precision:
type: float
default: 0.1 for Celsius and 1.0 for Fahrenheit.
preset_mode_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `preset_mode_command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `preset_mode_command_topic`.
required: false
type: template
preset_mode_command_topic:
@ -293,7 +293,7 @@ preset_mode_state_topic:
required: false
type: string
preset_mode_value_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the `preset_mode` value from the payload received on `preset_mode_state_topic`.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the `preset_mode` value from the payload received on `preset_mode_state_topic`.
required: false
type: template
preset_modes:
@ -354,7 +354,7 @@ swing_modes:
default: ['on', 'off']
type: list
target_humidity_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `target_humidity_command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `target_humidity_command_topic`.
required: false
type: template
target_humidity_command_topic:
@ -366,7 +366,7 @@ target_humidity_state_topic:
required: false
type: string
target_humidity_state_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a value for the climate `target_humidity` state.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a value for the climate `target_humidity` state.
required: false
type: template
temperature_command_template:

View File

@ -28,7 +28,9 @@ ha_platforms:
ha_integration_type: hub
---
The Comelit SimpleHome integration allows you to control your [Comelit home automation devices](https://comelitgroup.it/installatore/offerta/domotica-e-smart-home).
The **Comelit SimpleHome** {% term integration %} allows you to control your [Comelit home automation devices](https://comelitgroup.it/installatore/offerta/home-building-automation/).
## Supported devices
There is support for the following platform types within Home Assistant:
@ -37,6 +39,36 @@ There is support for the following platform types within Home Assistant:
{% include integrations/config_flow.md %}
## Alarm control panel
{% configuration_basic %}
host:
description: The IP address of the Comelit SmartHome device.
port:
description: The TCP port of the Comelit SmartHome device. The default is port 80 (standard for HTTP).
pin:
description: The PIN of the Comelit SmartHome device.
type:
description: The type of Comelit SmartHome device.
keys:
bridge:
description: Comelit Serial Bridge.
vedo:
description: Comelit VEDO System.
{% endconfiguration_basic %}
## Data updates
This integration {% term polling polls %} data from the device every 5 seconds by default.
## Supported functionality
The **Comelit SimpleHome** {% term integration %} provides the following entities:
### Alarm control panel
The integration will create an alarm entity for each area. Additionally, it will create a sensor and a presence detection binary sensor for each zone, enhancing monitoring capabilities.
## Removing the integration
This integration follows standard integration removal. No extra steps are required.
{% include integrations/remove_device_service.md %}

View File

@ -57,7 +57,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -66,7 +66,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -131,7 +131,7 @@ device:
required: false
type: string
device_class:
description: Sets the [class of the device](/integrations/cover/), changing the device state and icon that is displayed on the frontend. The `device_class` can be `null`.
description: Sets the [class of the device](/integrations/cover/#device_class), changing the device state and icon that is displayed on the frontend. The `device_class` can be `null`.
required: false
type: string
enabled_by_default:
@ -157,7 +157,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -223,7 +223,7 @@ position_open:
type: integer
default: 100
position_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that can be used to extract the payload for the `position_topic` topic. Within the template the following variables are available: `entity_id`, `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;"
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) that can be used to extract the payload for the `position_topic` topic. Within the template the following variables are available: `entity_id`, `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;"
required: false
type: template
position_topic:
@ -241,7 +241,7 @@ retain:
type: boolean
default: false
set_position_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to define the position to be sent to the `set_position_topic` topic. Incoming position value is available for use in the template `{% raw %}{{ position }}{% endraw %}`. Within the template the following variables are available: `entity_id`, `position`, the target position in percent; `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;"
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to define the position to be sent to the `set_position_topic` topic. Incoming position value is available for use in the template `{% raw %}{{ position }}{% endraw %}`. Within the template the following variables are available: `entity_id`, `position`, the target position in percent; `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;"
required: false
type: template
set_position_topic:
@ -283,7 +283,7 @@ tilt_closed_value:
type: integer
default: 0
tilt_command_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that can be used to extract the payload for the `tilt_command_topic` topic. Within the template the following variables are available: `entity_id`, `tilt_position`, the target tilt position in percent; `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;"
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) that can be used to extract the payload for the `tilt_command_topic` topic. Within the template the following variables are available: `entity_id`, `tilt_position`, the target tilt position in percent; `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;"
required: false
type: template
tilt_command_topic:
@ -311,7 +311,7 @@ tilt_optimistic:
type: boolean
default: "`true` if `tilt_status_topic` is not defined, else `false`"
tilt_status_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that can be used to extract the payload for the `tilt_status_topic` topic. Within the template the following variables are available: `entity_id`, `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;"
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) that can be used to extract the payload for the `tilt_status_topic` topic. Within the template the following variables are available: `entity_id`, `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;"
required: false
type: template
tilt_status_topic:
@ -323,7 +323,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that can be used to extract the payload for the `state_topic` topic."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) that can be used to extract the payload for the `state_topic` topic."
required: false
type: template
{% endconfiguration %}

View File

@ -50,7 +50,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -59,7 +59,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -120,7 +120,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -189,7 +189,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that returns a device tracker state."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) that returns a device tracker state."
required: false
type: template
{% endconfiguration %}

View File

@ -97,7 +97,7 @@ device:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the value."
required: false
type: template
{% endconfiguration %}

View File

@ -42,7 +42,7 @@ This integration does not work with:
## Prerequisites
- The <abbr title="IQ Gateway">Envoy</abbr> must be configured and commissioned.
- The <abbr title="IQ Gateway">Envoy</abbr> must be on your local network with IPV4 connectivity from Home Assistant. (Also See troubleshooting, [single network](#single-network))
- The <abbr title="IQ Gateway">Envoy</abbr> must be on your local network with IPV4 connectivity from Home Assistant. (Also See troubleshooting, [periodic network connection issues](#periodic-network-connection-issues))
- <abbr title="IQ Gateway">Envoy</abbr> firmware version 3.9 or newer.
- With <abbr title="IQ Gateway">Envoy</abbr> firmware 7 and greater:
- an Enlighten cloud username and password.
@ -193,7 +193,7 @@ CT measure multiple properties of the energy exchange which are available as Env
- **Envoy <abbr title="Envoy serial number">SN</abbr> Production CT current**: Current in A.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Powerfactor production CT**: Powerfactor, ratio of active to apparent power.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Metering status production CT**: Status of the metering process: `normal`, `not-metering`, `check-wiring`.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Meter status flags active production CT**: Count of CT status flags active. See troubleshooting [CT Active flag count](#ct-active-flag-count) when non-zero.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Meter status flags active production CT**: Count of CT status flags active. See troubleshooting [CT Active flag count is non-zero](#ct-active-flag-count-is-non-zero) when non-zero.
##### Net-consumption CT sensor entities
@ -202,7 +202,7 @@ CT measure multiple properties of the energy exchange which are available as Env
- **Envoy <abbr title="Envoy serial number">SN</abbr> net consumption CT current**: Current in A.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Powerfactor net consumption CT**: Power factor, ratio of active to apparent power.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Metering status net consumption CT**: Status of the metering process: `normal`, `not-metering`, `check-wiring`.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Meter status flags active net consumption CT**: Count of CT status flags active. See troubleshooting [CT Active flag count](#ct-active-flag-count) when non-zero.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Meter status flags active net consumption CT**: Count of CT status flags active. See troubleshooting [CT Active flag count is non-zero](#ct-active-flag-count-is-non-zero) when non-zero.
##### Storage CT sensor entities
@ -211,7 +211,7 @@ CT measure multiple properties of the energy exchange which are available as Env
- **Envoy <abbr title="Envoy serial number">SN</abbr> storage CT current**: Current in A.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Powerfactor storage CT**: Power factor, ratio of active to apparent power.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Metering status storage CT**: Status of the metering process: `normal`, `not-metering`, `check-wiring`.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Meter status flags active storage CT**: Count of CT status flags active. See troubleshooting [CT Active flag count](#ct-active-flag-count) when non-zero.
- **Envoy <abbr title="Envoy serial number">SN</abbr> Meter status flags active storage CT**: Count of CT status flags active. See troubleshooting [CT Active flag count is non-zero](#ct-active-flag-count-is-non-zero) when non-zero.
For storage CT energy entities refer to [battery sensor](#aggregated-iq-battery-sensor-entities) description.
@ -403,7 +403,7 @@ With installed <abbr title="current transformers">CT</abbr>, data granularity in
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 [authentication requirements](#envoy-authentication-requirements)).
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

View File

@ -36,8 +36,7 @@ The integration will create the entities listed below. Some of the entities are
### Weather
- Current conditions and daily forecast
- Current conditions and hourly forecast (disabled by default)
- Current conditions, daily forecast, and hourly forecast
### Camera
@ -108,9 +107,13 @@ Not all weather stations provide a complete set of weather/sensor data. The data
## Template sensors
The configuration snippet below adds a useful [template sensors](/integrations/template/) showing the current "feels like" temperature among air temperature, humidex, and wind chill.
The configuration snippets below add [template sensors](/integrations/template/). See the [weather integration](/integrations/weather/) for additional examples.
Replace `NAME` with the name used to configure your integration.
Replace `NAME` with the weather entity used in your configuration.
### Feels Like
A sensor that takes into account the humidex or wind chill for what the temperature feels like.
{% raw %}
@ -132,6 +135,8 @@ template:
{% endraw %}
### Additional Forecast Data
The configuration snippet below adds a template sensor containing the current forecast information as attributes and the text summary of the forecast for the current day.
{% raw %}
@ -152,12 +157,12 @@ The configuration snippet below adds a template sensor containing the current fo
sensor:
- name: Weather Forecast Daily
unique_id: weather_forecast_daily
state: "{{ states('weather.ottawa_kanata_orleans_forecast') }}"
state: "{{ states('weather.NAME') }}"
attributes:
daily: "{{ forecasts['weather.ottawa_kanata_orleans_forecast']['daily_forecast'] }}"
hourly: "{{ forecasts['weather.ottawa_kanata_orleans_forecast']['hourly_forecast'] }}"
summary: "{{ forecasts['weather.ottawa_kanata_orleans_forecast']['daily_forecast'][0]['text_summary'] }}"
temperature_unit: "{{ state_attr('weather.ottawa_kanata_orleans_forecast', 'temperature_unit') }}"
daily: "{{ forecasts['weather.NAME']['daily_forecast'] }}"
hourly: "{{ forecasts['weather.NAME']['hourly_forecast'] }}"
summary: "{{ forecasts['weather.NAME']['daily_forecast'][0]['text_summary'] }}"
temperature_unit: "{{ state_attr('weather.NAME', 'temperature_unit') }}"
```
{% endraw %}

View File

@ -42,7 +42,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -51,7 +51,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -142,7 +142,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -186,7 +186,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the value and render it to a valid JSON event payload. If the template throws an error, the current state will be used instead."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the value and render it to a valid JSON event payload. If the template throws an error, the current state will be used instead."
required: false
type: template
{% endconfiguration %}

View File

@ -49,7 +49,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -58,7 +58,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -66,7 +66,7 @@ availability_topic:
required: false
type: string
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`.
required: false
type: template
command_topic:
@ -149,7 +149,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -171,7 +171,7 @@ optimistic:
type: boolean
default: "`true` if no state topic defined, else `false`."
direction_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `direction_command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `direction_command_topic`.
required: false
type: template
direction_command_topic:
@ -183,11 +183,11 @@ direction_state_topic:
required: false
type: string
direction_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a value from the direction."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a value from the direction."
required: false
type: template
oscillation_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `oscillation_command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `oscillation_command_topic`.
required: false
type: template
oscillation_command_topic:
@ -199,7 +199,7 @@ oscillation_state_topic:
required: false
type: string
oscillation_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a value from the oscillation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a value from the oscillation."
required: false
type: template
payload_available:
@ -243,7 +243,7 @@ payload_reset_preset_mode:
type: string
default: '"None"'
percentage_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `percentage_command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `percentage_command_topic`.
required: false
type: template
percentage_command_topic:
@ -255,7 +255,7 @@ percentage_state_topic:
required: false
type: string
percentage_value_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the `percentage` value from the payload received on `percentage_state_topic`.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the `percentage` value from the payload received on `percentage_state_topic`.
required: false
type: template
platform:
@ -263,7 +263,7 @@ platform:
required: true
type: string
preset_mode_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `preset_mode_command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `preset_mode_command_topic`.
required: false
type: template
preset_mode_command_topic:
@ -275,7 +275,7 @@ preset_mode_state_topic:
required: false
type: string
preset_mode_value_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the `preset_mode` value from the payload received on `preset_mode_state_topic`.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the `preset_mode` value from the payload received on `preset_mode_state_topic`.
required: false
type: template
preset_modes:
@ -308,7 +308,7 @@ state_topic:
required: false
type: string
state_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a value from the state."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a value from the state."
required: false
type: template
unique_id:

View File

@ -144,5 +144,6 @@ This video tutorial explains how Google Generative AI can be set up, how you can
logger:
logs:
homeassistant.components.conversation: debug
homeassistant.components.conversation.chat_log: debug
homeassistant.components.google_generative_ai_conversation: debug
```

View File

@ -632,11 +632,11 @@ Both entities can use these options, but the availability of these will depend o
<summary><b>Options:</b> (click to view)</summary>
- **Fan off** `cooking_hood_enum_type_stage_fan_off`
- **Fan stage 1** `cooking_hood_enum_type_stage_fan_stage01`
- **Fan stage 2** `cooking_hood_enum_type_stage_fan_stage02`
- **Fan stage 3** `cooking_hood_enum_type_stage_fan_stage03`
- **Fan stage 4** `cooking_hood_enum_type_stage_fan_stage04`
- **Fan stage 5** `cooking_hood_enum_type_stage_fan_stage05`
- **Fan stage 1** `cooking_hood_enum_type_stage_fan_stage_01`
- **Fan stage 2** `cooking_hood_enum_type_stage_fan_stage_02`
- **Fan stage 3** `cooking_hood_enum_type_stage_fan_stage_03`
- **Fan stage 4** `cooking_hood_enum_type_stage_fan_stage_04`
- **Fan stage 5** `cooking_hood_enum_type_stage_fan_stage_05`
</details>
- **Intensive level**:
@ -668,14 +668,14 @@ Both entities can use these options, but the availability of these will depend o
<summary><b>Options:</b> (click to view)</summary>
- **Cold**: `laundry_care_washer_enum_type_temperature_cold`
- **20ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c20`
- **30ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c30`
- **40ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c40`
- **50ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c50`
- **60ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c60`
- **70ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c70`
- **80ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c80`
- **90ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c90`
- **20ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c_20`
- **30ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c_30`
- **40ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c_40`
- **50ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c_50`
- **60ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c_60`
- **70ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c_70`
- **80ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c_80`
- **90ºC clothes**: `laundry_care_washer_enum_type_temperature_g_c_90`
- **Cold**: `laundry_care_washer_enum_type_temperature_ul_cold`
- **Warm**: `laundry_care_washer_enum_type_temperature_ul_warm`
- **Hot**: `laundry_care_washer_enum_type_temperature_ul_hot`
@ -689,13 +689,15 @@ Both entities can use these options, but the availability of these will depend o
<summary><b>Options:</b> (click to view)</summary>
- **Off**: `laundry_care_washer_enum_type_spin_speed_off`
- **400 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m400`
- **600 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m600`
- **800 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m800`
- **1000 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m1000`
- **1200 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m1200`
- **1400 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m1400`
- **1600 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m1600`
- **400 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_400`
- **600 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_600`
- **700 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_700`
- **800 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_800`
- **900 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_900`
- **1000 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_1000`
- **1200 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_1200`
- **1400 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_1400`
- **1600 rpm**: `laundry_care_washer_enum_type_spin_speed_r_p_m_1600`
- **Off**: `laundry_care_washer_enum_type_spin_speed_ul_off`
- **Low**: `laundry_care_washer_enum_type_spin_speed_ul_low`
- **Medium**: `laundry_care_washer_enum_type_spin_speed_ul_medium`
@ -1086,6 +1088,35 @@ To solve the above issue, follow these steps:
3. Select the three dots {% icon "mdi:dots-vertical" %} menu from the application credentials you created for the Home Connect integration and select **Delete**.
4. Add the Home Connect integration again under {% my integrations title="**Settings** > **Devices & services**" %}
### Missing options at the "active program" and "selected program" entities
#### Symptom: "Although I have options, some programs that are available on the app are not in the list of options at the "active program" and "selected program" entities"
Some programs that are available to select on the app, on the physical device or in the diagnostics file from the device are missing at the "active program" and "selected program" entities.
##### Description
If you see programs in the app or the physical device that are missing in the integration, first check if they are available in the [diagnostics file](https://www.home-assistant.io/docs/configuration/troubleshooting/#download-diagnostics). If they are in the diagnostics file, it means the API can send them to the integration, but the integration can't recognize them.
##### Solution
The program key needs to be added to the integration. To help with that, you can open an issue at [aiohomeconnect](https://github.com/MartinHjelmare/aiohomeconnect) about the missing program key.
#### Symptom: "No programs available at the "active program" and "selected program" entities nor in the diagnostics file"
There are no programs available to select at the "active program" and "selected program" entities, and the downloaded device diagnostics file does not list any programs.
##### Description
The Home Connect API is not sending any programs to the integration.
##### Solution
There's no solution for this issue. The only thing that can be done is reporting the issue to Home Connect through these channels:
- [Home Connect service and contact](https://www.home-connect.com/us/en/support/contact-and-service)
- [Home Connect developer Help & Support](https://developer.home-connect.com/support)
### Unavailable entities for a device
#### Symptom: "The entities related to an appliance were available but no longer are"

View File

@ -47,8 +47,6 @@ To get started with the general settings in YAML, follow these steps:
currency: USD
country: US
time_zone: "America/Los_Angeles"
external_url: "https://www.example.com"
internal_url: "http://homeassistant.local:8123"
allowlist_external_dirs:
- "/usr/var/dumping-ground"
- "/tmp"
@ -101,11 +99,11 @@ currency:
type: string
default: "EUR"
external_url:
description: "The URL that Home Assistant is available on from the internet. For example: `https://example.duckdns.org:8123`. Note that this setting may only contain a protocol, hostname and port; using a path is not supported."
description: "The URL that Home Assistant is available on from the internet. For example: `https://example.duckdns.org:8123`. Note that this setting may only contain a protocol, hostname and port; using a path is not supported. This can also be configured by navigating to **{% my network title="Settings > System > Network" %}**."
required: false
type: string
internal_url:
description: "The URL that Home Assistant is available on from your local network. For example: `http://homeassistant.local:8123`. Note that this setting may only contain a protocol, hostname and port; using a path is not supported."
description: "The URL that Home Assistant is available on from your local network. For example: `http://192.168.0.10:8123`. Note that this setting may only contain a protocol, hostname and port; using a path is not supported. This can also be configured by navigating to **{% my network title="Settings > System > Network" %}**."
required: false
type: string
customize:

View File

@ -59,7 +59,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -68,7 +68,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -84,7 +84,7 @@ current_humidity_topic:
required: false
type: string
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`.
required: false
type: template
command_topic:
@ -145,7 +145,7 @@ device:
required: false
type: string
device_class:
description: The device class of the MQTT device. Must be either `humidifier`, `dehumidifier` or `null`.
description: The [device class](/integrations/humidifier/#device-class) of the MQTT device. Must be either `humidifier`, `dehumidifier` or `null`.
required: false
type: string
default: humidifier
@ -172,7 +172,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -234,7 +234,7 @@ payload_reset_mode:
type: string
default: '"None"'
target_humidity_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `target_humidity_command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `target_humidity_command_topic`.
required: false
type: template
target_humidity_command_topic:
@ -246,11 +246,11 @@ target_humidity_state_topic:
required: false
type: string
target_humidity_state_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a value for the humidifier `target_humidity` state.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a value for the humidifier `target_humidity` state.
required: false
type: template
mode_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `mode_command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `mode_command_topic`.
required: false
type: template
mode_command_topic:
@ -262,7 +262,7 @@ mode_state_topic:
required: false
type: string
mode_state_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a value for the humidifier `mode` state.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a value for the humidifier `mode` state.
required: false
type: template
modes:
@ -289,7 +289,7 @@ state_topic:
required: false
type: string
state_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a value from the state."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a value from the state."
required: false
type: template
unique_id:

View File

@ -48,7 +48,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -57,7 +57,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -153,7 +153,7 @@ image_topic:
required: exclusive
type: string
json_attributes_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`.
required: false
type: template
json_attributes_topic:
@ -173,7 +173,7 @@ unique_id:
required: false
type: string
url_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the image URL from a message received at `url_topic`.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the image URL from a message received at `url_topic`.
required: false
type: template
url_topic:

View File

@ -6,7 +6,6 @@ ha_category:
ha_release: 0.108
ha_iot_class: Local Polling
ha_config_flow: true
ha_quality_scale: platinum
ha_codeowners:
- '@ctalkington'
ha_domain: ipp

View File

@ -28,7 +28,7 @@ activity_state_topic:
required: false
type: string
activity_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the value."
required: false
type: template
availability:
@ -51,7 +51,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the device's availability from the `topic`. To determine the device's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the device's availability from the `topic`. To determine the device's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -64,7 +64,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
device:
@ -121,7 +121,7 @@ device:
required: false
type: string
dock_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `dock_command_topic`. The `value` parameter in the template will be set to `dock`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `dock_command_topic`. The `value` parameter in the template will be set to `dock`.
required: false
type: template
dock_command_topic:
@ -151,7 +151,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
required: false
type: template
json_attributes_topic:
@ -172,7 +172,7 @@ optimistic:
type: boolean
default: "`true` if no `activity_state_topic` defined, else `false`."
pause_command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `pause_command_topic`. The `value` parameter in the template will be set to `pause`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `pause_command_topic`. The `value` parameter in the template will be set to `pause`.
required: false
type: template
pause_command_topic:
@ -189,7 +189,7 @@ qos:
type: integer
default: 0
start_mowing_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `start_mowing_command_topic`. The `value` parameter in the template will be set to `start_mowing`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `start_mowing_command_topic`. The `value` parameter in the template will be set to `start_mowing`.
required: false
type: template
start_mowing_command_topic:

View File

@ -284,10 +284,109 @@ entities:
```
### 2. Automation
**- Notification, Error event**
#### 1) Air conditioner, climate
> - Currently the Climate's set_hvac_mode, set_temperature service is not working properly. Each control must operate sequentially, but conditional wait for this has not yet been implemented in ThinQ integration.
> - We provide a script that can do turn_on, set_hvac_mode, and set_temperature at once, so please use it for automation.
> - Create a new script in 'CREATE SCRIPT' using the code below, then select the script in the 'Action' field.
> - This conditional wait is scheduled to be implemented in core 2025.4.
{% raw %}
```yaml
alias: LG ThinQ climate
description: "Action turn_on, set_hvac_mode, set_temperature"
fields:
input_device:
selector:
device:
filter:
- integration: lg_thinq
name: Device
required: true
input_entity:
selector:
entity:
filter:
- integration: lg_thinq
domain: climate
name: Entity
required: true
input_hvac:
selector:
select:
options:
- label: Off
value: off
- label: Auto
value: auto
- label: Cool
value: cool
- label: Dry
value: dry
- label: Fan only
value: fan_only
- label: Heat/cool
value: heat_cool
- label: Heat
value: heat
name: HVAC mode
required: true
default: cool
input_temperature:
selector:
number:
min: 1
max: 100
name: Target temperature
required: true
default: 18
sequence:
- sequence:
- variables:
entity_name: "{{ input_entity.split('.')[1] }}"
- if:
- condition: template
value_template: >-
{{ input_hvac != 'off' and states('climate.'+ entity_name) == 'off' }}
then:
- action: climate.turn_on
target:
device_id: "{{ input_device }}"
data: {}
- wait_template: "{{ states('climate.'+ entity_name) != 'off' }}"
- if:
- condition: template
value_template: "{{ states('climate.'+ entity_name) != input_hvac }}"
then:
- action: climate.set_hvac_mode
data:
hvac_mode: "{{ input_hvac }}"
target:
device_id: "{{ input_device }}"
- wait_template: "{{ states('climate.'+ entity_name) == input_hvac }}"
- if:
- condition: template
value_template: "{{ input_hvac != 'off' }}"
then:
- action: climate.set_temperature
data:
temperature: "{{ input_temperature }}"
target:
device_id: "{{ input_device }}"
```
{% endraw %}
#### 2) Notification, error event
> - Guide: [Automating on event](https://www.home-assistant.io/integrations/event/#automating-on-a-button-press)
> - Important: guide's step 3, 4
> - You can select the state change you want to act as trigger in step 4
{% raw %}
```yaml
alias: lack of water example
description: Toggle switch when air purifier's lack_of_water
@ -306,6 +405,8 @@ actions:
domain: switch
```
{% endraw %}
## Troubleshooting
### Setup

View File

@ -70,7 +70,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -79,7 +79,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -91,7 +91,7 @@ brightness_command_topic:
required: false
type: string
brightness_command_template:
description: "Defines a [template](/docs/configuration/templating/) to compose message which will be sent to `brightness_command_topic`. Available variables: `value`."
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to compose message which will be sent to `brightness_command_topic`. Available variables: `value`."
required: false
type: template
brightness_scale:
@ -104,7 +104,7 @@ brightness_state_topic:
required: false
type: string
brightness_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the brightness value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the brightness value."
required: false
type: template
color_mode_state_topic:
@ -112,11 +112,11 @@ color_mode_state_topic:
required: false
type: string
color_mode_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the color mode."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the color mode."
required: false
type: template
color_temp_command_template:
description: "Defines a [template](/docs/configuration/templating/) to compose message which will be sent to `color_temp_command_topic`. Available variables: `value`."
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to compose message which will be sent to `color_temp_command_topic`. Available variables: `value`."
required: false
type: template
color_temp_command_topic:
@ -133,7 +133,7 @@ color_temp_state_topic:
required: false
type: string
color_temp_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the color temperature value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the color temperature value."
required: false
type: template
command_topic:
@ -216,7 +216,7 @@ effect_command_topic:
required: false
type: string
effect_command_template:
description: "Defines a [template](/docs/configuration/templating/) to compose message which will be sent to `effect_command_topic`. Available variables: `value`."
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to compose message which will be sent to `effect_command_topic`. Available variables: `value`."
required: false
type: template
effect_list:
@ -228,11 +228,11 @@ effect_state_topic:
required: false
type: string
effect_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the effect value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the effect value."
required: false
type: template
hs_command_template:
description: "Defines a [template](/docs/configuration/templating/) to compose message which will be sent to `hs_command_topic`. Available variables: `hue` and `sat`."
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to compose message which will be sent to `hs_command_topic`. Available variables: `hue` and `sat`."
required: false
type: template
hs_command_topic:
@ -247,7 +247,7 @@ hs_state_topic:
required: false
type: string
hs_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the HS value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the HS value."
required: false
type: template
icon:
@ -255,7 +255,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -309,12 +309,12 @@ payload_not_available:
type: string
default: offline
payload_off:
description: The payload that represents disabled state.
description: The payload that represents the off state.
required: false
type: string
default: "OFF"
payload_on:
description: The payload that represents enabled state.
description: The payload that represents the on state.
required: false
type: string
default: "ON"
@ -333,7 +333,7 @@ retain:
type: boolean
default: false
rgb_command_template:
description: "Defines a [template](/docs/configuration/templating/) to compose message which will be sent to `rgb_command_topic`. Available variables: `red`, `green` and `blue`."
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to compose message which will be sent to `rgb_command_topic`. Available variables: `red`, `green` and `blue`."
required: false
type: template
rgb_command_topic:
@ -345,11 +345,11 @@ rgb_state_topic:
required: false
type: string
rgb_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the RGB value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the RGB value."
required: false
type: template
rgbw_command_template:
description: "Defines a [template](/docs/configuration/templating/) to compose message which will be sent to `rgbw_command_topic`. Available variables: `red`, `green`, `blue` and `white`."
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to compose message which will be sent to `rgbw_command_topic`. Available variables: `red`, `green`, `blue` and `white`."
required: false
type: template
rgbw_command_topic:
@ -361,11 +361,11 @@ rgbw_state_topic:
required: false
type: string
rgbw_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the RGBW value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the RGBW value."
required: false
type: template
rgbww_command_template:
description: "Defines a [template](/docs/configuration/templating/) to compose message which will be sent to `rgbww_command_topic`. Available variables: `red`, `green`, `blue`, `cold_white` and `warm_white`."
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to compose message which will be sent to `rgbww_command_topic`. Available variables: `red`, `green`, `blue`, `cold_white` and `warm_white`."
required: false
type: template
rgbww_command_topic:
@ -377,20 +377,20 @@ rgbww_state_topic:
required: false
type: string
rgbww_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the RGBWW value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the RGBWW value."
required: false
type: template
schema:
description: The schema to use. Must be `default` or omitted to select the default schema.
description: The schema to use. Must be `basic` or omitted to select the default schema.
required: false
type: string
default: default
default: basic
state_topic:
description: "The MQTT topic subscribed to receive state updates. A \"None\" payload resets to an `unknown` state. An empty payload is ignored. By default, valid state payloads are `OFF` and `ON`. The accepted payloads can be overridden with the `payload_off` and `payload_on` config options."
required: false
type: string
state_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the state value. The template should return the `payload_on` and `payload_off` values, so if your light uses `power on` to turn on, your `state_value_template` string should return `power on` when the switch is on. For example, if the message is just `on`, your `state_value_template` should be `power {{ value }}`. When your `payload_on = 27` and `payload_off = 'off'`, then this template might be `'off' if value_json.my_custom_brightness_field <= 0 else 27`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the state value. The template should return the values defined by `payload_on` (defaults to \"ON\") and `payload_off` (defaults to \"OFF\") settings, or \"None\"."
required: false
type: template
unique_id:
@ -407,7 +407,7 @@ white_scale:
type: integer
default: 255
xy_command_template:
description: "Defines a [template](/docs/configuration/templating/) to compose message which will be sent to `xy_command_topic`. Available variables: `x` and `y`."
description: "Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to compose message which will be sent to `xy_command_topic`. Available variables: `x` and `y`."
required: false
type: template
xy_command_topic:
@ -419,7 +419,7 @@ xy_state_topic:
required: false
type: string
xy_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the XY value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the XY value."
required: false
type: template
{% endconfiguration %}
@ -571,7 +571,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -580,7 +580,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -681,7 +681,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -748,7 +748,7 @@ schema:
description: The schema to use. Must be `json` to select the JSON schema.
required: false
type: string
default: default
default: basic
state_topic:
description: 'The MQTT topic subscribed to receive state updates in a JSON-format. The JSON payload may contain the elements: `"state"`: `"ON"` the light is on, `"OFF"` the light is off, `null` the state is `unknown`; `"color_mode"`: one of the `supported_color_modes`; `"color"`: A dict with the color attributes*; `"brightness"`: The brightness; `"color_temp"`: The color temperature; `"effect"`: The effect of the light.'
required: false
@ -969,7 +969,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -978,7 +978,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -986,11 +986,11 @@ availability_topic:
required: false
type: string
blue_template:
description: "[Template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract blue color from the state payload value. Expected result of the template is an integer from 0-255 range."
description: "[Template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract blue color from the state payload value. Expected result of the template is an integer from 0-255 range."
required: false
type: template
brightness_template:
description: "[Template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract brightness from the state payload value. Expected result of the template is an integer from 0-255 range."
description: "[Template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract brightness from the state payload value. Expected result of the template is an integer from 0-255 range."
required: false
type: template
color_temp_kelvin:
@ -999,15 +999,15 @@ color_temp_kelvin:
type: boolean
default: false
color_temp_template:
description: "[Template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract color temperature from the state payload value. Expected result of the template is an integer. If `color_temp_kelvin` is `true` the expected value is in Kelvin else mireds are expected."
description: "[Template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract color temperature from the state payload value. Expected result of the template is an integer. If `color_temp_kelvin` is `true` the expected value is in Kelvin else mireds are expected."
required: false
type: template
command_off_template:
description: "The [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) for *off* state changes. Available variables: `state` and `transition`."
description: "The [template](/docs/configuration/templating/#using-command-templates-with-mqtt) for *off* state changes. Available variables: `state` and `transition`."
required: true
type: template
command_on_template:
description: "The [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) for *on* state changes. Available variables: `state`, `brightness`, `color_temp`, `red`, `green`, `blue`, `hue`, `sat`, `flash`, `transition` and `effect`. Values `red`, `green`, `blue`, `brightness` are provided as integers from range 0-255. Value of `hue` is provided as float from range 0-360. Value of `sat` is provided as float from range 0-100. Value of `color_temp` is provided as integer representing mired or Kelvin units if `color_temp_kelvin` is `true`."
description: "The [template](/docs/configuration/templating/#using-command-templates-with-mqtt) for *on* state changes. Available variables: `state`, `brightness`, `color_temp`, `red`, `green`, `blue`, `hue`, `sat`, `flash`, `transition` and `effect`. Values `red`, `green`, `blue`, `brightness` are provided as integers from range 0-255. Value of `hue` is provided as float from range 0-360. Value of `sat` is provided as float from range 0-100. Value of `color_temp` is provided as integer representing mired or Kelvin units if `color_temp_kelvin` is `true`."
required: true
type: template
command_topic:
@ -1070,11 +1070,11 @@ effect_list:
required: false
type: [string, list]
effect_template:
description: "[Template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract effect from the state payload value."
description: "[Template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract effect from the state payload value."
required: false
type: template
green_template:
description: "[Template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract green color from the state payload value. Expected result of the template is an integer from 0-255 range."
description: "[Template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract green color from the state payload value. Expected result of the template is an integer from 0-255 range."
required: false
type: template
icon:
@ -1082,7 +1082,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -1141,16 +1141,16 @@ qos:
type: integer
default: 0
red_template:
description: "[Template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract red color from the state payload value. Expected result of the template is an integer from 0-255 range."
description: "[Template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract red color from the state payload value. Expected result of the template is an integer from 0-255 range."
required: false
type: template
schema:
description: The schema to use. Must be `template` to select the template schema.
required: false
type: string
default: default
default: basic
state_template:
description: "[Template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract state from the state payload value."
description: "[Template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract state from the state payload value."
required: false
type: template
state_topic:

View File

@ -51,7 +51,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -60,7 +60,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -72,7 +72,7 @@ code_format:
required: false
type: string
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`. The lock command template accepts the parameters `value` and `code`. The `value` parameter will contain the configured value for either `payload_open`, `payload_lock` or `payload_unlock`. The `code` parameter is set during the action to `open`, `lock` or `unlock` the MQTT lock and will be set `None` if no code was passed.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`. The lock command template accepts the parameters `value` and `code`. The `value` parameter will contain the configured value for either `payload_open`, `payload_lock` or `payload_unlock`. The `code` parameter is set during the action to `open`, `lock` or `unlock` the MQTT lock and will be set `None` if no code was passed.
required: false
type: template
command_topic:
@ -155,7 +155,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -253,7 +253,7 @@ unique_id:
required: false
type: string
value_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a state value from the payload.
description: Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a state value from the payload.
required: false
type: template
{% endconfiguration %}

View File

@ -1047,7 +1047,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract a device's availability from the `topic`. To determine the device's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract a device's availability from the `topic`. To determine the device's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -1060,7 +1060,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
payload_available:
@ -1416,6 +1416,18 @@ If you have a large number of manually configured items, you might want to consi
Documentation on the MQTT components that support YAML [can be found here](/integrations/mqtt/#configuration-via-yaml).
{% endnote %}
## Entity state updates
Entities receive state updates via MQTT subscriptions. The payloads received on the state topics are processed to determine whether there is a significant change. If a change is detected, the entity will be updated.
Note that MQTT device payloads often contain information for updating multiple entities that subscribe to the same topics. For example, a light status update might include information about link quality. This data can update a link quality sensor but is not used to update the light itself. MQTT filters out entity state updates when there are no changes.
### The last reported state attribute
Because MQTT state updates are often repeated frequently, even when no actual changes exist, it is up to the MQTT subscriber to determine whether a status update was received. If the latest update is missed, it might take some time before the next one arrives. If a retained payload exists at the broker, that value will be replayed first, but it will be an update of a previous last state.
MQTT devices often continuously generate numerous state updates. MQTT does not update `last_reported` to avoid impacting system stability unless `force_update` is set. Alternatively, an MQTT sensor can be created to measure the last update.
## Using Templates
The MQTT integration supports templating. Read more [about using templates with the MQTT integration](/docs/configuration/templating/#using-templates-with-the-mqtt-integration).
@ -1480,7 +1492,7 @@ The MQTT integration will register the `mqtt.publish` action, which allows publi
| `retain` | yes | If message should have the retain flag set. (default: false) |
{% note %}
When `payload` is rendered from [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) in a YAML script or automation, and the template renders to a `bytes` literal, the outgoing MQTT payload will only be sent as `raw` data, if the `evaluate_payload` option flag is set to `true`.
When `payload` is rendered from [template](/docs/configuration/templating/#using-value-templates-with-mqtt) in a YAML script or automation, and the template renders to a `bytes` literal, the outgoing MQTT payload will only be sent as `raw` data, if the `evaluate_payload` option flag is set to `true`.
{% endnote %}
```yaml

View File

@ -82,7 +82,13 @@ The scene platform lets you activate a nexia automation.
### Switch
The switch platform lets you enable or disable hold mode for each thermostat.
The following enable/disable switches are added for each thermostat:
- Emergency heat (if the device supports it)
The following enable/disable switches are added for each thermostat zone:
- Hold mode
### Action `nexia.set_aircleaner_mode`

View File

@ -40,7 +40,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the device's availability from the `topic`. To determine the device's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the device's availability from the `topic`. To determine the device's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -49,7 +49,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the device's availability from the `availability_topic`. To determine the device's availability result, the template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the device's availability from the `availability_topic`. To determine the device's availability result, the template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -57,7 +57,7 @@ availability_topic:
required: false
type: string
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`.
required: false
type: template
command_topic:
@ -140,7 +140,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:

View File

@ -51,7 +51,7 @@ availability_mode:
type: string
default: latest
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`.
required: false
type: template
command_topic:
@ -138,7 +138,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
required: false
type: template
json_attributes_topic:
@ -210,7 +210,7 @@ unit_of_measurement:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the value."
required: false
type: template
{% endconfiguration %}

View File

@ -25,8 +25,41 @@ ha_integration_type: device
The Network UPS Tools (NUT) integration allows you to monitor and manage a UPS (battery backup) using a [NUT](https://networkupstools.org/) server. It lets you view their status, receives notifications about important events, and execute commands as device actions.
## Supported devices
This integration supports hardware devices compatible with
NUT. NUT's hardware compatibility list is available from the [Network
UPS Tools](https://networkupstools.org/) website.
## Prerequisites
You must have a NUT server configured to monitor one or more supported
power device(s).
It is not possible to automatically detect a NUT server IP address
change. You should therefore configure the NUT server with a static
IP address, assign a fixed IP address reservation with DHCP, or use
DNS as appropriate for your network.
In addition, you will need a username and password for
this integration to log into the NUT server if authentication is
required.
{% include integrations/config_flow.md %}
Setting up the integration requires the following information:
{% configuration_basic %}
Host:
description: "The IP address or hostname of your NUT server."
Port:
description: "The network port of your NUT server. The NUT server's default port is '3493'."
Username:
description: "The username to log into the NUT server. This is configured in NUT."
Password:
description: "The password associated with the username to log into the NUT server. This is configured in NUT."
{% endconfiguration_basic %}
## Supported functionality
{% important %}
@ -60,6 +93,11 @@ The following switches are available for each switchable outlet:
|---------------------------|:------------------------------------------------|
| Power outlet `name` | Turn power on/off for named outlet |
## Data updates
The integration uses {% term polling %} to retrieve data from the NUT
server. The default polling interval is once every 60 seconds.
## Example Resources
Given the following example output from NUT (your variables may differ):
@ -144,3 +182,10 @@ Ensure the user you specify has the required permissions to execute the desired
In this example, the user `my_user` has permission to execute all commands (`instcmds = ALL`).
Please note that Home Assistant cannot determine whether a user can access a specific action without executing it. If you attempt to perform an action for which the user does not have permission, an exception will be thrown at runtime.
## Remove integration
This integration follows standard integration removal. No extra steps
are required.
{% include integrations/remove_device_service.md %}

View File

@ -80,7 +80,7 @@ Alternatively, you can create a new TOTP secret for your account and use the "no
When using Opower with any of the Exelon subsidiaries, such as BGE, ComEd, PECO, Pepco, etc., you need to actively disable two-factor authentication.
Before proceeding, make sure you understand the security implications of disabling 2FA.
Log onto the website, select **Don't use 2FA** and **Don't ask me again**. If you have already enabled 2FA, disable it.
Log onto the website, select **Don't use 2FA** and **Don't ask me again**. If you have already enabled 2FA, you most likely cannot disable it, which unfortunately means you cannot use this integration.
{% include integrations/config_flow.md %}

View File

@ -18,8 +18,6 @@ This integration is installed automatically when the **Open Thread Border Router
- [Enabling Thread on Home Assistant Yellow](https://yellow.home-assistant.io/procedures/enable-thread/)
- [Enabling Thread on Home Assistant Connect ZBT-1](https://connectzbt1.home-assistant.io/procedures/enable-thread/)
The integration is also installed automatically when enabling the experimental **Silicon Labs Multiprotocol** support.
Installing this integration manually is an advanced use case, for example if you run your own border router. If you do have such a use case, follow these steps:
{% include integrations/config_flow.md %}

View File

@ -24,10 +24,24 @@ ha_integration_type: integration
The `philips_js` platform allows you to control Philips TVs which expose the [jointSPACE](http://jointspace.sourceforge.net/) JSON-API.
If your TV responds to `http://IP_ADDRESS_OF_TV:1925/system` then this integration can be used. In the response, you should also be able to see the version of the API the TV uses (`"api_version":{"Major":6...`).
For older TVs follow instructions on how to activate the API and if your model is supported [here](http://jointspace.sourceforge.net/download.html). Note that not all listed, jointSPACE-enabled devices will have JSON-interface running on port 1925. This is true at least for some models before year 2011.
Also, note that version 6 of the API needs to be authenticated by a PIN code displayed on your TV.
## Prerequisites
Before adding the integration, it is worth checking if this integration works for you. As there are differences between TVs, you may need to try different addresses:
- Some TVs use `https://` and port 1926, other TVs use `http://` and port 1925.
### Check if this integration can be used
1. Check if your TV responds to one of the following combinations:
- `http://IP_ADDRESS_OF_TV:1925/system`
- `https://IP_ADDRESS_OF_TV:1926/system`
2. If you get a response, then this integration can be used.
- In the response, you should also be able to see the version of the API the TV uses (`"api_version":{"Major":6...`).
3. For older TVs, follow instructions on how to activate the API and if your model is supported [here](http://jointspace.sourceforge.net/download.html).
- Note that not all listed, jointSPACE-enabled devices will have JSON-interface running on port 1925.
- This is true at least for some models before year 2011.
- Also, note that version 6 of the API needs to be authenticated by a PIN code displayed on your TV.
{% include integrations/config_flow.md %}

View File

@ -56,6 +56,18 @@ Alternatively, the IRK of an Android phone and/or secondary device can be obtain
8. Select one of the frames and expand the "Bluetooth Security Manager Protocol." The hex dump will show either the sending or receiving device IRK.
9. Reverse the value displayed. For example, if it is `763af6c7f7d94ad6c262158e2320544e`, the IRK to use would be: `4e5420238e1562c2d64ad9f7c7f63a76`.
### On Windows - for any devices that will connect to a computer
1. Get the PsExec tool from Microsoft. It's available in the [Sysinternals Suite](https://learn.microsoft.com/en-us/sysinternals/downloads/psexec). Download and extract the `PsExec.exe` or `PsExec64.exe`.
2. Open Command Prompt as Administrator: Press the Windows key, type `cmd`, right-click on **Command Prompt**, and select **Run as administrator**.
3. Run PsExec: Navigate to the folder where PsExec is located and run `psexec -i -s cmd` or `psexec64 -i -s cmd`. This command will open a new command prompt window with SYSTEM rights.
4. Verify SYSTEM Rights: In the new command prompt window, type `whoami` to confirm that you have SYSTEM rights.
5. Open Registry Editor with SYSTEM Rights: In the new command prompt window, type `regedit` to open the Registry Editor with SYSTEM rights.
6. Locate the IRK: Navigate to `HKLM\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys`. There is one subfolder that probably holds the computer's Bluetooth radio's MAC address, look inside it for the folder corresponding to the MAC address of your Bluetooth device.
7. Right-click the key(folder) and select export. Save the `.reg` file somewhere.
8. Open the `.reg` file in Notepad. To open the **Replace** window, press Ctrl+H. **Find what:** "," and **Replace with** "". Select **Replace All**. This removes all commas from the hex value.
9. Copy the IRK value (only the part after `hex:`) and it can be used as-is. No reversing of byte order needs to be done.
## ESPresense
If you already use Identity Resolving Key tracking with ESPresence then you already have a hex-encoded version of your Identity Resolving Key. Home Assistant can use the key in this format directly.

View File

@ -28,7 +28,8 @@ Other imports like `min`, `max` are available as builtins. See the [python_scrip
[logger-api]: https://docs.python.org/3.7/library/logging.html#logger-objects
{% note %}
It is not possible to use Python imports with this integration. If you want to do more advanced scripts, you can take a look at [AppDaemon](https://appdaemon.readthedocs.io/en/latest/) or [pyscript](https://github.com/custom-components/pyscript)
- It is not possible to use Python imports with this integration. If you want to do more advanced scripts, you can take a look at [AppDaemon](https://appdaemon.readthedocs.io/en/latest/) or [pyscript](https://github.com/custom-components/pyscript)
- It is not possible to include your script as a button on the dashboard. A workaround is to create a [helper button](/integrations/input_button/) and create automation to run your script when the button state changes.
{% endnote %}
## Writing your first script, reading input and logging the activity

View File

@ -747,6 +747,7 @@ Prerequisites:
- Test if you can access the camera by its IP address in your browser `https://<your-camera-ip>`. If you cannot, in the [Reolink mobile app, Windows, or Mac client](https://reolink.com/software-and-manual/) ensure at least one of the HTTP/HTTPS ports are enabled under **Settings** > **top camera model box** > **Network Information** > **Advanced** (mobile) or **Settings** > **Network** > **Advanced** > **Port Settings** (PC). See [additional instructions](https://support.reolink.com/hc/en-us/articles/900000621783-How-to-Set-up-Reolink-Ports-Settings/) on the Reolink site.
- On some camera models, the RTMP port needs to be enabled in order for the HTTP(S) port to function properly. Make sure this port is also enabled if you get a `Cannot connect to host` error while one of the HTTP/HTTPS ports is already enabled.
- If the integration and the browser can't connect to the camera even after you enable the HTTP/HTTPS ports, try to create a new user on the camera; that fixes the problem in some cases.
- Using a VLAN or other network restrictions between the Home Assistant device and the Reolink device is possible, but is also known to cause issues when not properly configured. Ensure HTTP (port 80), HTTPS (port 443), RTMP (port 1935), RTSP (port 554), ONVIF (port 8000) and TCP (port 9000) communication is not being blocked. When experiencing issues, please first test if moving the Reolink device to the same VLAN as the Home Assistant device and lifting all restrictions between them solves the issue.
### Entities intermittently become unavailable

View File

@ -33,115 +33,229 @@ ha_platforms:
ha_integration_type: integration
---
The Roborock integration allows you to control your [Roborock](https://us.roborock.com/pages/robot-vacuum-cleaner) vacuum while using the Roborock app.
This integration requires a continuous cloud connection while using the device. However, excluding map data and routines, communication between the integration and the device is conducted locally.
The Roborock {% term integration %} allows you to connect your [Roborock](https://us.roborock.com/pages/robot-vacuum-cleaner) robotic vacuums to your Home Assistant. Roborock vacuums are
intelligent home cleaning robots and, depending on the specific device, may have features
like mopping capabilities, laser navigation, and options for changing cleaning
performance or location in the home. This integration enables you to control and
monitor your Roborock vacuum directly from Home Assistant.
Once you log in with your Roborock account, the integration will automatically discover your Roborock devices and get the needed information to communicate locally with them. Please ensure your Home Assistant instance can communicate with the local IP of your device. We recommend setting a static IP for your Roborock Vacuum to help prevent future issues. The device communicates on port 58867. Depending on your firewall, you may need to allow communication from Home Assistant to your vacuum on that port.
The integration also allows for automation and integration with other smart home
devices. For example, you could send a notification when the vacuum is stuck, or
pause the vacuum when a media player starts playing music.
## Prerequisites
1. Download the Roborock App for iOS or Android.
2. Create an account and log in.
3. Add your Roborock device to the Roborock App (for example, by scanning a QR code).
{% include integrations/config_flow.md %}
{% configuration_basic %}
Email address:
description: "The email address used to sign in to the Roborock app. A verification code will be sent to this email address when adding the Roborock integration."
Verification code:
description: "The verification code that is sent to your email address when adding the Roborock integration."
{% endconfiguration_basic %}
## Robovac entities
{% include integrations/option_flow.md %}
The integration can be configured to specify which Roborock App features are drawn
on the map.
{% configuration_basic %}
Charger:
description: Show the charger on the map.
Cleaned area:
description: Show the area cleaned on the map.
Go-to path:
description: Show the go-to path on the map.
Ignored obstacles:
description: Show ignored obstacles on the map.
Ignored obstacles with photo:
description: Show ignored obstacles with photos on the map.
Mop path:
description: Show the mop path on the map.
No carpet zones:
description: Show the no carpet zones on the map.
No-go zones:
description: Show the no-go zones on the map
No mopping zones:
description: Show the no-mop zones on the map.
Obstacles:
description: Show obstacles on the map.
Obstacles with photo:
description: Show obstacles with photos on the map.
Path:
description: Show the path on the map.
Predicted path:
description: Show the predicted path on the map.
Vacuum position:
description: Show the vacuum position on the map.
Virtual walls:
description: Show virtual walls on the map.
Zones:
description: Show zones on the map.
{% endconfiguration_basic %}
## Data Updates
This integration uses both local and cloud {% term polling %} and also receives
cloud push events using MQTT. Local communication is preferred when possible.
Map data is always fetched through the cloud, and Dyad and Zeo devices are cloud only.
The integration will automatically discover your Roborock devices using the cloud APIs and get
the needed information to communicate locally with them, if supported. Please ensure your Home Assistant
instance can communicate with the local IP of your device. We recommend setting a static IP
for your Roborock Vacuum to help prevent future issues. The device communicates on port 58867.
Depending on your firewall, you may need to allow communication from Home Assistant to your vacuum on that port.
## Supported functionality
Roborock devices have a variety of features that are supported on some devices but not on others. Only entities that your device supports will be added to your integration.
### Vacuum
### Robovac devices
#### Vacuum
The vacuum entity holds the ability to control most things the vacuum can do, such as start a clean, return to the dock, or set the fan speed.
### Select
#### Image
Mop mode - Describes how to mop the floor. On some firmware, it is called 'mop route'.
- **Map**
- **Description**: Displays a live map of your Roborock vacuum's cleaning area.
Mop intensity - How hard you would like your vacuum to mop.
#### Select
### Binary sensor
- **Mop mode**
- **Description**: Describes how to mop the floor. On some firmware, it is called 'mop route'.
Charging - States if the vacuum is currently charging or not.
- **Mop intensity**
- **Description**: How hard you would like your vacuum to mop.
Cleaning - States if the vacuum has a clean currently active. This is on when the robot is actively moving around or when the robot returns to the dock when the battery is low but a clean is still active and will resume later.
- **Selected map**
- **Description**: Choose the map that is loaded on the vacuum.
Mop attached - States if the mop is currently attached.
- **Empty mode**
- **Description**: You can set the "empty mode" setting including Max, Light, Balanced, and Smart.
- **Availability**: For vacuum equipped with an auto-empty dock
Mop drying status - Only available on docks with drying capabilites - States if the mop is currently being driven.
#### Binary sensor
Water box attached - States if the water box is currently attached.
- **Charging**
- **Description**: States if the vacuum is currently charging or not.
Water shortage - States if the water box is low on water - 'Ok' if it has not detected a water shortage.
- **Cleaning**
- **Description**: States if the vacuum is currently cleaning or not. This is on when the robot is actively moving around or when the robot returns to the dock when the battery is low but a clean is still active and will resume later.
- **Mop attached**
- **Description**: States if the mop is currently attached.
- **Mop drying status**
- **Description**: Only available on docks with drying capabilites - States if the mop is currently being driven.
- **Water box attached**
- **Description**: States if the water box is currently attached.
- **Water shortage**
- **Description**: States if the water box is low on water - 'Ok' if it has not detected a water shortage.
### Sensor
#### Sensor
Cleaning area - How much area the vacuum has cleaned in its current run. If the vacuum is not currently cleaning, how much area it has cleaned during its last run.
- **Cleaning area**
- **Description**: How much area the vacuum has cleaned in its current run. If the vacuum is not currently cleaning, how much area it has cleaned during its last run.
Cleaning time - How long the vacuum has been cleaning for. If the vacuum is not currently cleaning, how long it cleaned for in its last run.
- **Cleaning time**
- **Description**: How long the vacuum has been cleaning for. If the vacuum is not currently cleaning, how long it cleaned for in its last run.
Cleaning progress - Only available on some newer devices - what percent of the current cleaning is completed.
- **Cleaning progress**
- **Description**: Only available on some newer devices - what percent of the current cleaning is completed.
Current room - This is the room the vacuum currently is in. It utilizes the currently selected map, so if the map is incorrect, the room will be incorrect as well.
- **Dock error**
- **Description**: Only available on the non-basic docks - The current error of the vacuum or 'Ok' if none exists.
Dock error - Only available on the non-basic docks - The current error of the vacuum or 'Ok' if none exist
- **Main brush time left**
- **Description**: How much time is left before Roborock recommends you replace your main brush.
Main brush time left - How much time is left before Roborock recommends you replace your main brush.
- **Mop drying remaining time**
- **Description**: Only available on the non-basic docks - How much time is left until the mop is dry and ready to continue cleaning.
Mop drying remaining time - Only available on the non-basic docks - How much time is left until the mop is dry and ready to continue cleaning.
- **Side brush time left**
- **Description**: How much time is left before Roborock recommends you replace your side brush.
Side brush time left - How much time is left before Roborock recommends you replace your side brush.
- **Filter time left**
- **Description**: How much time is left before Roborock recommends you replace your vacuum's air filter.
Filter time left - How much time is left before Roborock recommends you replace your vacuum's air filter.
- **Status**
- **Description**: The current status of your vacuum. This typically describes the action that is currently being run. For example, 'spot_cleaning' or 'docking'.
Status - The current status of your vacuum. This typically describes the action that is currently being run. For example, 'spot_cleaning' or 'docking'.
- **Last clean begin**
- **Description**: the last time that your vacuum started cleaning.
Last clean begin - the last time that your vacuum started cleaning.
- **Last clean end**
- **Description**: The last time that your vacuum finished cleaning.
Last clean end - The last time that your vacuum finished cleaning.
- **Total cleaning time**
- **Description**: The lifetime cleaning duration of your vacuum.
Total cleaning time - The lifetime cleaning duration of your vacuum.
- **Total cleaning area**
- **Description**: The lifetime cleaning area of your vacuum.
Total cleaning area - The lifetime cleaning area of your vacuum.
- **Total cleaning count**
- **Description**: The lifetime cleaning count of your vacuum.
Total cleaning count - The lifetime cleaning count of your vacuum.
- **Vacuum error**
- **Description**: The current error with your vacuum, if there is one.
Vacuum error - The current error with your vacuum, if there is one.
#### Time
### Time
- **Do not disturb begin**
- **Description**: When _Do not disturb_ is enabled, the vacuum does not run or speak after this point.
Do not disturb begin - When _Do not disturb_ is enabled, the vacuum does not run or speak after this point.
- **Do not disturb end**
- **Description**: When _Do not disturb_ is enabled, the vacuum does not run or speak before this point.
Do not disturb end - When _Do not disturb_ is enabled, the vacuum does not run or speak before this point.
#### Switch
### Switch
- **Child lock**
- **Description**: This disables the buttons on the vacuum. Nothing happens when the buttons are pushed.
Child lock - This disables the buttons on the vacuum. Nothing happens when the buttons are pushed.
- **Status indicator light**
- **Description**: This is the LED on the top of your vacuum. The color changes depending on the status of your vacuum.
Status indicator light - This is the LED on the top of your vacuum. The color changes depending on the status of your vacuum.
- **Do not disturb**
- **Description**: This enables _Do not disturb_ during the time frame you have set in the app or on the time entity. When _Do not disturb_ is enabled, the vacuum does not run or speak.
Do not disturb - This enables _Do not disturb_ during the time frame you have set in the app or on the time entity. When _Do not disturb_ is enabled, the vacuum does not run or speak.
#### Number
### Number
- **Volume**
- **Description**: This allows you to control the volume of the robot's voice. For example, when it states "Starting cleaning". This allows you to set the volume to 0%, while the app limits it to 20%.
Volume - This allows you to control the volume of the robot's voice. For example, when it states "Starting cleaning". This allows you to set the volume to 0%, while the app limits it to 20%.
### Button
#### Button
There are currently four buttons that allow you to reset the various maintenance items on your vacuum. Pressing the button cannot be undone. For this reason, the buttons are disabled by default to make sure they are not pressed unintentionally.
Reset sensor consumable - The sensors on your vacuum are expected to be cleaned after 30 hours of use.
- **Reset sensor consumable**
- **Description**: The sensors on your vacuum are expected to be cleaned after 30 hours of use.
Reset side brush consumable - The side brush is expected to be replaced every 200 hours.
- **Reset side brush consumable**
- **Description**: The side brush is expected to be replaced every 200 hours.
Reset main brush consumable - The main brush/ roller is expected to be replaced every 300 hours.
- **Reset main brush consumable**
- **Description**: The main brush/ roller is expected to be replaced every 300 hours.
Reset air filter - The air filter is expected to be replaced every 150 hours.
- **Reset air filter**
- **Description**: The air filter is expected to be replaced every 150 hours.
In addition, some vacuums allow routines to be set up in the app. For each of those routines, a button entity will be created, allowing you to trigger it.
#### Actions
### Actions
##### Action Set Vacuum Goto Position
#### Action `roborock.set_vacuum_goto_position`
Go the specified coordinates.
The `roborock.set_vacuum_goto_position` action will set the vacuum to go to
the specified coordinates.
- **Data attribute**: `entity_id`
- **Description**: Only act on a specific robot.
@ -153,9 +267,11 @@ Go the specified coordinates.
- **Description**: Y-coordinate, integer value. The dock is located at y-coordinate 25500.
- **Optional**: No.
#### Action `roborock.get_vacuum_current_position`
##### Action Get Vacuum Current Position
Get the current position of the vacuum. This is a cloud call and should only be used for diagnostics. This is not meant to be used for automations. Frequent requests can lead to rate limiting.
The `roborock.get_vacuum_current_position` action will get the current position of the vacuum. This
is a cloud call and should only be used for diagnostics. This is not meant to be used for
automations. Frequent requests can lead to rate limiting.
- **Data attribute**: `entity_id`
- **Description**: Only act on a specific robot.
@ -178,43 +294,66 @@ data: {}
y: 25168
```
### Image
##### Action Get Maps
You can see all the maps within your Roborock account. Keep in mind that they are device-specific. The maps require the cloud API to communicate as the maps are seemingly stored on the cloud. If someone can figure out a way around this - contributions are always welcome.
The `roborock.get_maps` action will return the maps available on the device and
details about any named rooms on each map.
- **Data attribute**: `entity_id`
- **Description**: Get maps for a specific device
- **Optional**: No.
## Dyad entities
This will return the name of the map, and the room names and id numbers. See [How can I clean a specific room? ](#how-can-i-clean-a-specific-room) for more details on how to use the maps response.
### Dyad devices
Roborock wet/dry vacuums currently expose some entities through an MQTT connection - it is currently cloud dependent.
### Sensor
#### Sensor
Status - The current status of your vacuum. This typically describes the action that is currently being run. For example, 'drying' or 'charging'.
- **Status**
- **Description**: The current status of your vacuum. This typically describes the action that is currently being run. For example, 'drying' or 'charging'.
Battery - The current charge of your device.
- **Battery**
- **Description**: The current charge of your device.
Filter time left - how long until Roborock recommends cleaning/replacing your filter.
- **Filter time left**
- **Description**: how long until Roborock recommends cleaning/replacing your filter.
Brush time left - how long until Roborock recommends cleaning/replacing your brush.
- **Brush time left**
- **Description**: how long until Roborock recommends cleaning/replacing your brush.
Error - the current error of the device - if one exists - "None" otherwise.
- **Error**
- **Description**: the current error of the device - if one exists - "None" otherwise.
Total cleaning time - how long you have cleaned with your wet/dry vacuum.
- **Total cleaning time**
- **Description**: how long you have cleaned with your wet/dry vacuum.
## Zeo Entities
### Zeo Entities
Roborock Zeo One currently exposes some entities through an MQTT connection - it is currently cloud dependent.
### Sensor
#### Sensor
State - The current state of your washing machine. For example, 'washing' or 'rinsing'.
- **State**
- **Description**: The current state of your washing machine. For example, 'washing' or 'rinsing'.
Countdown - Countdown for how long until the machine starts.
- **Countdown**
- **Description**: Countdown for how long until the machine starts.
Washing left - The amount of time until your machine is done washing.
- **Washing left**
- **Description**: The amount of time until your machine is done washing.
- **Error**
- **Description**: The current error of the Zeo, if one exists.
## Removing the integration
This integration follows standard integration removal. No extra steps are required.
{% include integrations/remove_device_service.md %}
Error - The current error of the Zeo, if one exists.
## FAQ
@ -222,7 +361,7 @@ Error - The current error of the Zeo, if one exists.
No. This integration requires information from your Roborock app to set up and uses Roborock's protocols to communicate with your device. You must have your vacuum synced to the Roborock app.
### Can I block internet access for this device?
As of right now - no. When the vacuum is disconnected from the internet, it will attempt to disconnect itself from Wi-Fi and reconnect itself until it can reach the Roborock servers. We are looking for the best way to handle this and see what can be blocked while still allowing the vacuum to function.
As of right now - no. When the vacuum is disconnected from the internet, it will attempt to disconnect itself from Wi-Fi and reconnect itself until it can reach the Roborock servers.
### What devices are supported?
If you can add your device to the Roborock app - it is supported. However, some older vacuums like the Roborock S5 must be connected using the Mi Home app and can be set up in Home Assistant through the [Xiaomi Miio](/integrations/xiaomi_miio/) integration.

View File

@ -54,6 +54,6 @@ rocketchat_notification:
#### Message variables
- **message** (*Required*): Message to be displayed.
- **data** (*Optional*): Dictionary containing any of the variables defined in the [Rocket.Chat documentation](https://developer.rocket.chat/reference/api/rest-api/endpoints/core-endpoints/chat-endpoints/postmessage)
- **data** (*Optional*): Dictionary containing any of the variables defined in the [Rocket.Chat documentation](https://developer.rocket.chat/apidocs/post-message)
To use notifications, please see the [getting started with automation page](/getting-started/automation/).

View File

@ -42,7 +42,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -51,7 +51,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -138,7 +138,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:

View File

@ -46,7 +46,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -59,11 +59,11 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`.
required: false
type: template
command_topic:
@ -146,7 +146,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
required: false
type: template
json_attributes_topic:
@ -193,7 +193,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the value."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the value."
required: false
type: template
{% endconfiguration %}

View File

@ -43,7 +43,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -52,7 +52,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -149,7 +149,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
required: false
type: template
json_attributes_topic:
@ -157,7 +157,7 @@ json_attributes_topic:
required: false
type: string
last_reset_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the last_reset. When `last_reset_value_template` is set, the `state_class` option must be `total`. Available variables: `entity_id`. The `entity_id` can be used to reference the entity's attributes."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the last_reset. When `last_reset_value_template` is set, the `state_class` option must be `total`. Available variables: `entity_id`. The `entity_id` can be used to reference the entity's attributes."
required: false
type: template
name:
@ -213,7 +213,7 @@ unit_of_measurement:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the value. If the template throws an error, the current state will be used instead."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the value. If the template throws an error, the current state will be used instead."
required: false
type: template
{% endconfiguration %}

View File

@ -48,7 +48,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -57,7 +57,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -69,11 +69,11 @@ available_tones:
required: false
type: list
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate a custom payload to send to `command_topic`. The variable `value` will be assigned with the configured `payload_on` or `payload_off` setting. The siren turn on action parameters `tone`, `volume_level` or `duration` can be used as variables in the template. When operation in optimistic mode the corresponding state attributes will be set. Turn on parameters will be filtered if a device misses the support.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate a custom payload to send to `command_topic`. The variable `value` will be assigned with the configured `payload_on` or `payload_off` setting. The siren turn on action parameters `tone`, `volume_level` or `duration` can be used as variables in the template. When operation in optimistic mode the corresponding state attributes will be set. Turn on parameters will be filtered if a device misses the support.
required: false
type: template
command_off_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate a custom payload to send to `command_topic` when the siren turn off action is called. By default `command_template` will be used as template for action turn off. The variable `value` will be assigned with the configured `payload_off` setting.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate a custom payload to send to `command_topic` when the siren turn off action is called. By default `command_template` will be used as template for action turn off. The variable `value` will be assigned with the configured `payload_off` setting.
required: false
type: template
command_topic:
@ -157,7 +157,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -227,7 +227,7 @@ state_topic:
required: false
type: string
state_value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's state from the `state_topic`. To determine the siren's state result of this template will be compared to `state_on` and `state_off`. Alternatively `value_template` can be used to render to a valid JSON payload."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's state from the `state_topic`. To determine the siren's state result of this template will be compared to `state_on` and `state_off`. Alternatively `value_template` can be used to render to a valid JSON payload."
required: false
type: template
support_duration:

View File

@ -156,4 +156,4 @@ The `media_content_id` value can be obtained from the Spotify desktop app by cli
## Unsupported devices
- **Sonos**: Although Sonos is a Spotify Connect device, it is not supported by the official Spotify API.
- **Sonos**: Although Sonos is a Spotify Connect device, it is not supported by the official Spotify API. One workaround to use Sonos players with Spotify is through [Music Assistant](https://www.music-assistant.io/) using the action `music_assistant.play_media`. Music Assistant creates another media_player entity named after the original media_player, which you can use to play from Spotify.

View File

@ -26,6 +26,12 @@ Right now, it's impossible to add a device -- all of them are discovered from SU
For more complete Home Assistant support based on MQTT autodiscovery, consider switching your Supla devices to MQTT (through the setup interface). Or use the MQTT broker provided by [Supla Cloud](https://cloud.supla.org/integrations/mqtt-broker).
{% important %}
The Supla Cloud MQTT broker requires [changing the default MQTT protocol setting](https://www.home-assistant.io/integrations/mqtt/#broker-configuration) at version 3.1.
{% endimportant %}
## Configuration
To use SUPLA devices in your installation, add the following to your {% term "`configuration.yaml`" %}:

View File

@ -48,7 +48,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -57,7 +57,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -65,7 +65,7 @@ availability_topic:
required: false
type: string
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`. The switch command template accepts the parameters `value`. The `value` parameter will contain the configured value for either `payload_on` or `payload_off`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`. The switch command template accepts the parameters `value`. The `value` parameter will contain the configured value for either `payload_on` or `payload_off`.
required: false
type: template
command_topic:
@ -152,7 +152,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -226,7 +226,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's state from the `state_topic`. To determine the switches's state result of this template will be compared to `state_on` and `state_off`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's state from the `state_topic`. To determine the switches's state result of this template will be compared to `state_on` and `state_off`."
required: false
type: template
{% endconfiguration %}

View File

@ -170,3 +170,13 @@ This media browser supports multiple Synology Photos instances. `<unique_id>` is
To find the `<album_id>` you need to go to the album in your photos instance, and the id will be in the URL ex: `https://192.168.0.100:5001/#/album/19`, where 19 is the album id. An `<album_id>` of 0 will contain all images.
For performance reasons, a maximum of 1000 images will be shown in the Media Browser.
## Troubleshooting
In any case, when reporting an issue, please enable [debug logging](/docs/configuration/troubleshooting/#debug-logs-and-diagnostics), restart the integration, and as soon as the issue re-occurs stop the debug logging again (_download of debug log file will start automatically_). Further _if still possible_, please also download the [diagnostics](/integrations/diagnostics) data. If you have collected the debug log and the diagnostics data, provide them with the issue report.
## Remove the integration
{% include integrations/remove_device_service.md %}
If you don't use the separate created user anymore (_see [Separate User Configuration](#separate-user-configuration) above_), then remove it from the NAS under to **Control Panel** > **User & Group** > **User**. Don't forget to backup any data from the users home directory, if you want to keep them (_eq. Home Assistant backups_)

View File

@ -21,7 +21,7 @@ topic:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that returns a tag ID."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) that returns a tag ID."
required: false
type: template
device:

View File

@ -73,7 +73,7 @@ Entities (sensors, binary sensors, buttons, images, numbers, and selections) are
_For old sensor/binary sensor configuration format, [see below](#legacy-binary-sensor-configuration-format)._
### State-based template binary sensors, buttons, images, numbers, selects and sensors
### State-based template binary sensors, buttons, images, numbers, selects, sensors, and weathers
Template entities will by default update as soon as any of the referenced data in the template updates.
@ -95,8 +95,7 @@ template:
{% endraw %}
### Trigger-based template binary sensors, buttons, images, numbers, selects and sensors
### Trigger-based template binary sensors, images, numbers, selects, sensors, and weathers
If you want more control over when an entity updates, you can define a trigger. Triggers follow the same format and work exactly the same as [triggers in automations][trigger-doc]. This feature is a great way to create entities based on webhook data ([example](#trigger-based-sensor-and-binary-sensor-storing-webhook-information)), or update entities based on a schedule.
@ -106,6 +105,10 @@ Trigger-based entities do not automatically update when states referenced in the
The state, including attributes, of trigger-based sensors and binary sensors is restored when Home Assistant is restarted. The state of other trigger-based template entities is not restored.
{% note %}
Buttons do not support using `trigger` or `action` options.
{% endnote %}
{% raw %}
```yaml

View File

@ -42,7 +42,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -55,11 +55,11 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`.
required: false
type: template
command_topic:
@ -138,7 +138,7 @@ entity_picture:
required: false
type: string
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
required: false
type: template
json_attributes_topic:
@ -196,7 +196,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the text state value from the payload received on `state_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the text state value from the payload received on `state_topic`."
required: false
type: template
{% endconfiguration %}

View File

@ -83,7 +83,7 @@ Unlike other protocols, Thread can use multiple border routers in a single netwo
OpenThread is an open source implementation of Thread, originally released by Google. Almost all commercially available Thread border routers are based on the open source implementation. However, the configuration of <abbr title="Thread border routers">TBRs</abbr> is not part of the Thread standard. This means that Google and Apple <abbr title="Thread border routers">TBRs</abbr> implementation setup and configured by their respective ecosystems.
While Home Assistant can *use* any border router, it can *configure* and *control* only OpenThread border routers built with the REST API available in the open source implementation. The OpenThread Border Router add-on (as well as the OpenThread Border Router bundled in the experimental Silicon Labs Multiprotocol add-on) are built from this open source OpenThread code and have the REST API enabled.
While Home Assistant can *use* any border router, it can *configure* and *control* only OpenThread border routers built with the REST API available in the open source implementation. The OpenThread Border Router add-on is built from this open source OpenThread code and has the REST API enabled.
### List of Thread border router devices

View File

@ -141,7 +141,8 @@ $ curl -X POST -H "Authorization: Bearer <ACCESS TOKEN>" \
## Troubleshooting
{% important %}
Depending on your setup, you might need to set an external URL (`external_url`) inside the [configuration](/integrations/homeassistant/#external_url).
Playing TTS media will prioritize the local Home Assistant URL, which can be configured by navigating to **{% my network title="Settings > System > Network" %}**.
It is highly recommended to set the local Home Assistant URL to automatic, in which case the generated URL will be `http://<local_ip>:<local_port>`.
{% endimportant %}
The following sections describe some of the problems encountered with media devices.
@ -154,10 +155,14 @@ The `tts` action will send an `https://` URL to the media device, which will che
### Google cast devices
The Google cast devices (Google Home, Chromecast, etc.) present the following problems:
Google cast devices (Google Home, Chromecast, etc.) require the host in media URLs to be resolvable using Google's public DNS servers, and if the URL is specifying the `https` protocol, the certificate must be valid and not self-signed.
These requirements present the following problems, all of which create problems if the local Home Assistant URL is not `http://<local_ip>:<local_port>`:
- They [reject self-signed certificates](#self-signed-certificates).
- They do not work with URLs that contain hostnames established by local naming means. Let's say your Home Assistant instance is running on a machine made known locally as `ha`. All your machines on your local network are able to access it as `ha`. However, try as you may, your cast device won't download the media files from your `ha` machine. That's because your cast device ignores your local naming setup. In this example, the `say` action creates a URL like `http://ha/path/to/media.mp3` (or `https://...` if you are using SSL). If you are _not_ using SSL then setting an internal URL that contains the IP address of your server works around this issue. By using an IP address, the cast device does not have to resolve the hostname.
- They use Google's public DNS servers to resolve names, not DNS servers provided via DHCP. Additionally, they do not resolve local names through mDNS. This means they do not work with URLs that contain hostnames established by local naming means. Let's say your Home Assistant instance is running on a machine made known locally as `ha` (via local DNS) and `homeassistant.local` (via mDNS). All machines on your local network can access it as `ha` or `homeassistant.local`. However, try as you may, your cast device won't download the media files from your `ha` machine. That's because your cast device ignores your local naming setup. In this example, the `say` action creates a URL like `http://ha/path/to/media.mp3` (or `https://...` if you are using SSL). If you are _not_ using SSL, then setting an internal URL that contains the IP address of your server works around this issue. By using an IP address, the cast device does not have to resolve the hostname.
- If you are using SSL (e.g., `https://yourhost.example.org/...`) then you _must_ use the hostname in the certificate (e.g., `external_url: https://yourhost.example.org`). You cannot use an IP address since the certificate won't be valid for the IP address, and the cast device will refuse the connection.
The recommended way to overcome these obstacles is to not manually configure a local Home Assistant URL.

View File

@ -43,7 +43,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -56,7 +56,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
command_topic:
@ -148,7 +148,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`."
required: false
type: template
json_attributes_topic:
@ -156,7 +156,7 @@ json_attributes_topic:
required: false
type: string
latest_version_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the latest version value. Use `state_topic` with a `value_template` if all update state values can be extracted from a single JSON payload."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the latest version value. Use `state_topic` with a `value_template` if all update state values can be extracted from a single JSON payload."
required: false
type: template
latest_version_topic:
@ -210,7 +210,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the `installed_version` state value or to render to a valid JSON payload on from the payload received on `state_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the `installed_version` state value or to render to a valid JSON payload on from the payload received on `state_topic`."
required: false
type: template
{% endconfiguration %}

View File

@ -65,7 +65,7 @@ Sensor always available:
You need to understand that with this option activated, when the source entity becomes unavailable, the utility meter sensor will have the last totalized value and will not change until the source entity returns to a valid state.
{% endconfiguration_basic %}
If the meter reset cycle and reset offsets are to limited for your use case,
If the meter reset cycle and reset offsets are too limited for your use case,
consider using the YAML configuration below, which support CRON-style patterns
that provide a greater flexibility.

View File

@ -35,7 +35,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -44,7 +44,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -118,7 +118,7 @@ fan_speed_list:
required: false
type: [string, list]
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:

View File

@ -77,7 +77,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the device's availability from the `topic`. To determine the devices's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the device's availability from the `topic`. To determine the devices's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -86,7 +86,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the device's availability from the `availability_topic`. To determine the devices's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the device's availability from the `availability_topic`. To determine the devices's availability, the result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -94,7 +94,7 @@ availability_topic:
required: false
type: string
command_template:
description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`.
description: Defines a [template](/docs/configuration/templating/#using-command-templates-with-mqtt) to generate the payload to send to `command_topic`.
required: false
type: template
command_topic:
@ -155,7 +155,7 @@ device:
required: false
type: string
device_class:
description: Sets the [class of the device](/integrations/valve/), changing the device state and icon that is displayed on the frontend. The `device_class` can be `null`.
description: Sets the [class of the device](/integrations/valve/#device_class), changing the device state and icon that is displayed on the frontend. The `device_class` can be `null`.
required: false
type: string
enabled_by_default:
@ -181,7 +181,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. A usage example can be found in the [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. A usage example can be found in the [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:
@ -284,7 +284,7 @@ unique_id:
required: false
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that can be used to extract the payload for the `state_topic` topic. The rendered value should be a defined state payload or, if reporting a `position` is supported and `reports_position` is set to `true`, a numeric value is expected representing the position. See also `state_topic`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) that can be used to extract the payload for the `state_topic` topic. The rendered value should be a defined state payload or, if reporting a `position` is supported and `reports_position` is set to `true`, a numeric value is expected representing the position. See also `state_topic`."
required: false
type: template
{% endconfiguration %}

View File

@ -18,13 +18,46 @@ ha_platforms:
- diagnostics
- sensor
ha_integration_type: hub
ha_quality_scale: silver
---
The **Vodafone Station** {% term integration %} allows you to control your [Vodafone Station](https://www.vodafone.it/privati/area-supporto/assistenza-dispositivi/vodafone-station.html) based router.
{% note %}
The integration provides information about your internet connection and the connected devices.
## Supported devices
The integration supports only Sercomm models so far.
{% endnote %}
### Tested models
This {% term integration %} was tested against the following models from Sercomm:
- Vodafone Power Station (SHG3000)
- Vodafone Power Station WiFi 6 (SHG3060)
- Vodafone WiFi 6 Station (RHG3006)
- Vodafone Gigabox (SHG3000) - supplied by [Vodafone Ireland](https://deviceguides.vodafone.ie/vodafone/gigabox-windows-10/)
- Vodafone H300S
{% include integrations/config_flow.md %}
{% configuration_basic %}
host:
description: The IP address of the Vodafone Station router.
username:
description: The username of the Vodafone Station router.
password:
description: The password of the Vodafone Station router.
{% endconfiguration_basic %}
{% include integrations/option_flow.md %}
{% configuration_basic %}
consider home:
description: Number of seconds that must elapse before considering a disconnected device "not at home".
{% endconfiguration_basic %}
## Supported functionality
There is support for the following platform types within Home Assistant:
@ -32,14 +65,55 @@ There is support for the following platform types within Home Assistant:
- **Sensor** - external IP address, uptime, firmware, resources and network monitors.
- **Button** - restart router, dsl/fiber/internet key connections.
{% include integrations/config_flow.md %}
## Examples
## Integration options
### Automation: reconnect / get new IP every night
It is possible to change some behaviors through the {% term integration %} options.
To change the settings, go to {% my integrations title="**Settings** > **Devices & services**" %}. On the **Vodafone Station** integration, select the cogwheel. Then select **Configure**.
```yaml
automation:
- alias: "Reconnect Vodafone Station (Fiber)"
triggers:
- trigger: time
at: "05:00:00"
actions:
- action: button.press
target:
entity_id: button.vodafone_station_xxxx_reconnect_fiber
```
- **Consider home**: Number of seconds that must elapse before considering a disconnected device "not at home".
### Automation: notify connected device not home
```yaml
automation:
- alias: "Apple TV disconnect"
triggers:
- platform: state
entity_id: device_tracker.appletv
to: "not_home"
actions:
- action: notify.mobile_app_phone
data:
message: "TV lost network connection"
```
### Automation: notify router CPU usage too high
```yaml
automation:
- alias: "Vodafone Station CPU high cpu usage"
triggers:
- platform: numeric_state
entity_id: sensor.vodafone_station_xxxx_cpu_usage
above: 80
actions:
- action: notify.mobile_app_phone
data:
message: "Router CPU above 80%."
```
## Data updates
This integration {% term polling polls %} data from the device every 30 seconds by default.
## Additional info
@ -47,10 +121,24 @@ To change the settings, go to {% my integrations title="**Settings** > **Devices
**Note**: If you don't want to automatically track newly detected devices, disable the {% term integration %} system option `Enable new added entities`.
### Tested models
## Troubleshooting
This {% term integration %} was tested against the following models from Sercomm:
### Cant set up the device
- Vodafone Power Station (SHG3000)
- Vodafone WiFi 6 Station (RHG3006)
- Vodafone Gigabox (SHG3000) - supplied by [Vodafone Ireland](https://deviceguides.vodafone.ie/vodafone/gigabox-windows-10/)
#### Symptom: "User already logged-in"
When trying to set up the integration, the form shows the message "User already logged-in".
##### Description
This means that there is already a logged session to the Vodafone Station router.
##### Resolution
To resolve this issue, log out from all active sessions, or, if the session was abruptly closed, wait for the router timeout (usually 60 seconds).
## Removing the integration
This integration follows standard integration removal. No extra steps are required.
{% include integrations/remove_device_service.md %}

View File

@ -43,7 +43,7 @@ availability:
required: true
type: string
value_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_mode:
@ -52,7 +52,7 @@ availability_mode:
type: string
default: latest
availability_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract device's availability from the `availability_topic`. To determine the devices's availability result of this template will be compared to `payload_available` and `payload_not_available`."
required: false
type: template
availability_topic:
@ -147,7 +147,7 @@ icon:
required: false
type: icon
json_attributes_template:
description: "Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
description: "Defines a [template](/docs/configuration/templating/#using-value-templates-with-mqtt) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
required: false
type: template
json_attributes_topic:

View File

@ -36,7 +36,8 @@ Verify SSL:
### Common WebDAV URLs
- [Nextcloud](https://nextcloud.com/): `https://<your-nextcloud-domain>/remote.php/webdav/`
- [Nextcloud](https://nextcloud.com/): `https://<your-nextcloud-domain>/remote.php/webdav/` alternatively this can be found in the interface of your Nextcloud instance.
To do this, open the file overview and click on Settings in the left-hand column.
- [Owncloud](https://owncloud.com/): `https://<your-owncloud-domain>/remote.php/webdav/`
- [Hetzner Storage Box](https://www.hetzner.com/storage/storage-box): `https://<username>.your-storagebox.de`
- [Strato HiDrive](https://www.strato.de/): `https://webdav.hidrive.strato.com`
@ -48,3 +49,14 @@ This integration follows standard integration removal. No extra steps are requir
{% include integrations/remove_device_service.md %}
- If you remove the integration, the backup folder is not automatically deleted. You have to manually delete it.
## Known issues / limitations
Due to the nature of WebDAV, it is required to have a fairly high file upload limit on the server.
If you experience issues with the backup, please check the server configuration or with your WebDAV service provider.
Following WebDAV services are known to have issues with Home Assistant backups:
- Yandex Disk is not supported, as the speed is artificially slowed down when using WebDAV.
- mail.ru Cloud is not supported due to the lack of support for WebDAV properties.
- pCloud WebDAV implementation proved to be unstable and is not recommended for backups.

View File

@ -48,7 +48,7 @@ Devices must have a Yale Access module installed to function with this {% term i
These devices do not send updates, but can be locked and unlocked.
- MD-04I (Yale Conexis L1, Yale Conexis L2)
- MD-04I (Yale Conexis L1 (requires yale access module), Yale Conexis L2)
- YRCB-490 (Yale Smart Cabinet Lock)
## Troubleshooting

View File

@ -48,9 +48,7 @@ ha_zeroconf: true
ha_integration_type: integration
---
The ZHA (Zigbee Home Automation) {% term integration %} allows you to wirelessly connect many off-the-shelf [Zigbee-based devices](https://csa-iot.org/csa-iot_products/) directly to Home Assistant, using one of the many available Zigbee coordinators.
ZHA uses an open-source Python library implementing a hardware-independent Zigbee stack called [zigpy](https://github.com/zigpy/zigpy). All coordinators compatible with zigpy can be used with ZHA.
The Zigbee Home Automation (ZHA) {% term integration %} allows you to wirelessly connect many off-the-shelf [Zigbee-based devices](https://csa-iot.org/csa-iot_products/) directly to Home Assistant, using one of many compatible hardware adapters called _Zigbee coordinators_.
This {% term integration %} currently supports the following device types within Home Assistant:
@ -69,30 +67,33 @@ This {% term integration %} currently supports the following device types within
- [Switch](/integrations/switch/)
- [Update](/integrations/update/)
In addition, it has support for "Zigbee groups" that enable native on-device grouping of multiple Zigbee lights, switches, and fans that enable controlling all entities for those devices in those groups with one command. At least two entities must be added to a Zigbee group inside the ZHA {% term integration %} before a group entity is created. There is also support for native on-device binding. Refer to the [Zigbee groups and binding devices](#zigbee-groups-and-binding-devices) section for more information.
## Introduction
This ZHA integration is a hardware-independent Zigbee gateway implementation that can replace most proprietary Zigbee gateways/bridges/hubs/controllers. Zigbee is a low-bandwidth communication protocol that relies on using small low-power digital radios to connect compatible devices to local Zigbee wireless private area networks. ZHA will create a single Zigbee network to which you can then pair/join most Zigbee-based devices that are made for home automation and lighting.
The ZHA integration is a hardware-independent Zigbee gateway implementation that can replace most proprietary Zigbee gateways (or bridges, hubs, or controllers). ZHA creates a single Zigbee network to which you can add most Zigbee-based devices.
Before installing the ZHA integration in Home Assistant, you need to connect a Zigbee Coordinator radio adapter that will connect to your Zigbee network. Those normally come in the form of a USB dongle that plugs directly into the same computer that is running your Home Assistant installation. The ZHA integration is compatible with many different "Zigbee Coordinator" adapters from various manufacturers. Be sure to [note the recommendations in the respective sections below before buying a Zigbee Coordinator](#compatible-hardware). A Zigbee network always needs to have one Zigbee Coordinator (it can never have more than one), and Zigbee devices can never be connected to more than a single Zigbee network, however, a Zigbee network can have multiple "Zigbee Router" devices and "Zigbee End Device" products.
ZHA uses an open-source Python library called [zigpy](https://github.com/zigpy/zigpy), so any coordinator that is compatible with zigpy can be used with ZHA. Review [compatible hardware](#compatible-hardware) recommendations before purchasing Zigbee devices.
Once ZHA has been set up with a Zigbee Coordinator it will automatically create a Zigbee network and you will be able to join/pair any Zigbee Router devices and Zigbee End Devices. With only a few [limitations](#limitations), most devices will join/pair directly regardless of brand and manufacturer. Technically almost all devices that are compliant with the official Zigbee specifications should offer interoperability, though a newer Zigbee Coordinator with support for later firmware often offers better compatibility with both new and older devices. Still, be aware that [all functionality might not always be supported or exposed for every device out-of-the-box](#knowing-which-devices-are-supported) as some devices that use manufacturer-specific extensions to add non-standard functions and features could sometimes need [device-specific code to fully work with ZHA](#how-to-add-support-for-new-and-unsupported-devices).
### Zigbee terminology
Note that because Zigbee relies on "mesh networking" technology it depends heavily on having [Zigbee Router devices](#using-router-devices-to-add-more-devices) to expand the network coverage and extend its size. These are always mains-powered devices that route messages to other devices that are located close to them within the Zigbee network mesh to improve the range and increase the total amount of devices you can add. You should therefore make sure that you add many Zigbee Router devices and not just Zigbee End Devices or else its network mesh connection routes will be limited due to the short range and poor wall penetration of Zigbee radio signals. It is highly recommended that you read and follow all the general tips below about [Zigbee interference avoidance and network range/coverage optimization](#zigbee-interference-avoidance-and-network-rangecoverage-optimization).
- **Zigbee network**: A mesh-network of devices with low-power digital radios using a low-bandwidth communication protocol.
- **Zigbee coordinator**: A hardware radio adapter (typically a USB dongle) that plugs directly into the same computer running your Home Assistant installation.
- **Zigbee router device**: A hardware device that is always mains-powered (AC) such as outlets or fans.
- **Zigbee end device**: A hardware device that is typically battery-powered (DC) such as remotes or motion sensors.
- **Zigbee group**: A collection of two or more Zigbee devices of the same type, different from Home Assistant's [Groups](/integrations/group/).
### Zigbee concepts
- A Zigbee network can have **only one** Zigbee coordinator,
- The Zigbee coordinator can have multiple **Zigbee router** or **Zigbee end devices** connected,
- Each Zigbee router device can have multiple **Zigbee end devices** connected to it,
- A Zigbee device can only be connected to a single Zigbee network,
- Zigbee networks depend heavily on having multiple [Zigbee Router devices](#using-router-devices-to-add-more-devices) to expand coverage and increase device capacity.
- Router devices help pass messages to other nearby devices in the Zigbee network and therefore can improve range and increase the number of devices you can add.
## Compatible hardware
The hardware-independent design of this integration provides support for many Zigbee coordinators available from different manufacturers, as long as the coordinator is compatible with the [zigpy](https://github.com/zigpy/zigpy) library.
### Zigbee 3.0 support
Some coordinators may not support firmware capable of Zigbee 3.0, but they can still be fully functional and feature-complete for your needs. Support for Zigbee 3.0 depends primarily on your coordinator hardware and firmware.
{% note %}
Newer coordinators generally support Zigbee 3.0 firmware, but it is up to the manufacturer to make such firmware available to them. If your coordinator was shipped with an older firmware version, you may want to manually upgrade the firmware.
{% endnote %}
### Recommended Zigbee radio adapters and modules
- Silicon Labs EmberZNet based radios using the EZSP protocol (via the [bellows](https://github.com/zigpy/bellows) library for zigpy)
@ -177,6 +178,10 @@ If you find an opportunity to improve this information, refer to the section on
Be sure to connect a compatible radio module and restart Home Assistant before proceeding with configuration.
ZHA will automatically create a Zigbee network once it is configured with a Zigbee coordinator; you can then add compatible devices.
It is highly recommended to review the guidance for [Zigbee interference avoidance and network range/coverage optimization)](#zigbee-interference-avoidance-and-network-rangecoverage-optimization).
{% include integrations/config_flow.md %}
In the popup:
@ -223,6 +228,156 @@ If you are use ZiGate or Sonoff ZBBridge you have to use some special usb_path c
- Wifi Zigate : `socket://[IP]:[PORT]` for example `socket://192.168.1.10:9999`
- Sonoff ZBBridge : `socket://[IP]:[PORT]` for example `socket://192.168.1.11:8888`
### Global Options
There are a few global options available once ZHA has been configured. Press **Configure** to access these settings.
The options are as follows:
{% configuration_basic %}
Enable enhanced light color/temperature transition from an off-state:
description: "For older non Zigbee 3.0 lights, this still allows a proper transition from an off-state to a new color (without seeing the old color). _(default: off)_"
Enable enhanced brightness slider during light transition:
description: "This avoids seeing intermediary brightness state when turning on lights with a transition. _(default: on)_"
Group members assume state of group:
description: "When using ZHA groups, turning on a ZHA group light makes the ZHA group members optimistically change their state to \"on\", instead of waiting and polling the lights when off. _(default: on)_"
{% endconfiguration_basic %}
### Configuration - YAML
For more advanced configuration, you can modify {% term "`configuration.yaml`" %} and restart Home Assistant
{% configuration %}
database_path:
description: _Full_ path to the database which will keep persistent network data.
required: false
type: string
enable_quirks:
description: Enable quirks mode for devices where manufacturers didn't follow specs.
required: false
type: boolean
default: true
custom_quirks_path:
description: Full path to a directory containing custom quirk modules that will take precedence over any built-in quirks matching a device.
required: false
type: string
{% endconfiguration %}
#### Defining Zigbee channel to use
{% important %}
The best practice is to **not change the Zigbee channel** from the ZHA default.
{% endimportant %}
{% note %}
**Before changing the Zigbee channel on an existing network**, review the following sections on this page:
- [Best practices to avoid pairing/connection difficulties](#best-practices-to-avoid-pairingconnection-difficulties)
- [Zigbee interference avoidance and network range/coverage optimization](#zigbee-interference-avoidance-and-network-rangecoverage-optimization)
These sections both provide helpful advice on improving your Zigbee network performance.
{% endnote %}
ZHA prefers to use Zigbee channel 15 by default. You can change this using YAML configuration, but this only works
if there's no existing network. To change the channel for an existing network, radio has to be factory reset and a new network to be formed. This requires re-pairing of all the devices.
```yaml
zha:
zigpy_config:
network:
channel: 15 # What channel the radio should try to use.
channels: [15, 20, 25] # Channel mask
```
The related troubleshooting segments mentioned above will, among other things, inform that if you have issues with overlapping frequencies between Wi-Fi and Zigbee, then it is usually better to first only try changing and setting a static Wi-Fi channel on your Wi-Fi router or all your Wi-Fi access points (instead of just changing to another Zigbee channel).
MetaGeek Support has a good reference article about channel selection for [Zigbee and WiFi coexistence](https://support.metageek.com/hc/en-us/articles/203845040-ZigBee-and-WiFi-Coexistence).
The Zigbee specification standards divide the 2.4&nbsp;GHz ISM radio band into 16 Zigbee channels (i.e. distinct radio frequencies for Zigbee). For all Zigbee devices to be able to communicate, they must support the same Zigbee channel (i.e. Zigbee radio frequency) that is set on the Zigbee Coordinator as the channel to use for its Zigbee network. Not all Zigbee devices support all Zigbee channels. Channel support usually depends on the age of the hardware and firmware, as well as on the device's power ratings.
The general recommendation is to only use channels 15, 20, or 25 in order to avoid interoperability problems with Zigbee devices. Not only because there is less chance of Wi-Fi networks interfering too much with the Zigbee network on other channels, but also because not all Zigbee devices support all channels. Some devices, for example, are limited to only being compatible with ZLL (Zigbee Light Link) channels. It is therefore especially not recommended to use Zigbee channels 11, 24, 25, or 26 on your Zigbee coordinator. These Zigbee channels are commonly only supported by relatively modern Zigbee hardware devices with newer Zigbee firmware. If using those channels, your coordinator may not be usable with older Zigbee devices.
#### Modifying the device type
As not all device manufacturers follow the Zigbee standard, at times a device can be incorrectly classified. For example, a switch could be classified as a light.
To correct the device type, also called domain, add the following to your {% term "`configuration.yaml`" %} and restart Home Assistant:
```yaml
zha:
device_config:
84:71:27:ff:fe:93:17:24-1: # format: {ieee}-{endpoint_id}
type: "switch" # corrected device type
```
`{ieee}` is the device hardware address which can be read from the Home Assistant UI when looking at _Device info_. From device info, you can find the `{endpoint_id}` by viewing the _Zigbee device signature_.
### OTA updates of Zigbee device firmware
The ZHA integration has the ability to perform OTA (over-the-air) firmware updates of Zigbee devices. This feature is enabled by default. As it uses standard [Update](/integrations/update/) entities in Home Assistant, users will get a UI notification if and when an OTA firmware update is available for a specific device, with an option to initiate the update or ignore that specific update for the device.
To see OTA updates for a device, it must support OTA updates and firmware images for the device must be publicly provided by the manufacturer. ZHA currently only includes OTA providers for a few manufacturers that provide these updates publicly.
**Included manufacturers:**
- IKEA
- Inovelli
- Ledvance/OSRAM
- SALUS/Computime
- Sonoff/iTead
- Third Reality
{% warning %}
Before updating a device, you should search for any disadvantages or if you even need to install an available update. Some firmware updates can break features you might use (e.g. group binding for IKEA devices). Some updates might also require changes to ZHA. In rare cases, you can even brick devices by installing a firmware update.
{% endwarning %}
#### Advanced OTA configuration
OTA for a few manufacturers is enabled by default, currently Ledvance, Sonoff, Inovelli, and ThirdReality. Other manufacturers are supported but disabled by default because their updates may change or remove device functionality, may require you to reconfigure devices, or are contributed by the community and may be minimally tested.
Refer to the [zigpy documentation for OTA configuration](https://github.com/zigpy/zigpy/wiki/OTA-Configuration) for more information on additional OTA providers.
## Adding devices
{% tip %}
When adding devices, review the following sections on this page:
- [Best practices to avoid pairing/connection difficulties](#best-practices-to-avoid-pairingconnection-difficulties)
- [Zigbee interference avoidance and network range/coverage optimization](#zigbee-interference-avoidance-and-network-rangecoverage-optimization)
These sections both provide helpful advice on improving your Zigbee network performance.
{% endtip %}
**To add a new Zigbee device:**
1. Go to {% my integrations title="**Settings** > **Devices & services**" %}.
2. Select the **Zigbee Home Automation** {% term integration %}. Then, select **Configure**.
3. To start a scan for new devices, on the bottom right corner of the screen, select **Add device**.
4. Reset your Zigbee devices to factory default settings according to the device instructions provided by the manufacturer (e.g., turn on/off lights up to 10 times; switches usually have a reset button/pin). It might take a few seconds for the devices to appear. You can click on **Show logs** for more verbose output.
5. Once the device is found, it will appear on that page and will be automatically added to your devices. You can optionally change its name and add it to an area (you can change this later). You can search again to add another device, or you can go back to the list of added devices.
### Using router devices to add more devices
Most mains-powered devices, e.g., many always-powered wall plugs or light bulbs in your Zigbee network will automatically act as a Zigbee router device (sometimes also referred to as a Zigbee "signal repeater" or "range extender").
Because Zigbee should use a [wireless mesh network](https://en.wikipedia.org/wiki/Wireless_mesh_network) to be effective, you will need to add Zigbee router devices to increase the number of Zigbee devices that can be used in your Zigbee network, both in the total number of devices that can be added as well as the total range and coverage of the network. Some Zigbee router devices do a much better job at routing and repeating Zigbee signals and messages than some other devices. You should not have a setup where Zigbee router devices (e.g. light bulbs) are often powered-off. Zigbee router devices are meant to be always available.
All Zigbee coordinator firmware will only allow you to directly connect a certain amount of devices. That limit is set for two reasons; firstly, to not overload the Zigbee coordinator, and secondly, to encourage your Zigbee network to quickly begin to utilize a "[mesh networking](https://en.wikipedia.org/wiki/Mesh_networking)" topology instead of only a "[star network](https://en.wikipedia.org/wiki/Star_network)" topology.
The total number of Zigbee devices that you can have on a Zigbee network depends on a few things. The Zigbee coordinator hardware and its firmware only play a larger role in Zigbee networks with a lot of devices. More important is the number of directly connected devices ("direct children") versus the number of routers that are connected to your Zigbee coordinator. The Zigpy library, which the ZHA {% term integration %} depends on, has an upper limit that is 32 direct children, but you can still have hundreds of Zigbee devices in total connected indirectly through routes via Zigbee router devices.
In this theoretical example, a CC2652-based Zigbee coordinator has three CC2530 Zigbee router devices for a total limit of 77 devices:
- Coordinator: 32 Zigbee End devices - 3 routers = 29
- Router one: + 16 devices
- Router two: + 16 devices
- Router three: + 16 devices
- Total device limit = **77 devices**
In practice, you will likely need to add a lot more Zigbee router devices than in this example in order to extend the coverage of the network to reach that many devices.
### Discovery via USB or Zeroconf
Some devices can be auto-discovered, which can simplify the ZHA setup process. The following devices have been tested with discovery and offer a quick setup experience.
@ -290,108 +445,6 @@ Some devices can be auto-discovered, which can simplify the ZHA setup process. T
Additional devices in the [Compatible hardware](#compatible-hardware) section may be discoverable, however, only devices that have been confirmed discoverable are listed above.
### OTA updates of Zigbee device firmware
The ZHA integration has the ability to perform OTA (over-the-air) firmware updates of Zigbee devices. This feature is enabled by default. As it uses standard [Update](/integrations/update/) entities in Home Assistant, users will get a UI notification if and when an OTA firmware update is available for a specific device, with an option to initiate the update or ignore that specific update for the device.
To see OTA updates for a device, it must support OTA updates and firmware images for the device must be publicly provided by the manufacturer. ZHA currently only includes OTA providers for a few manufacturers that provide these updates publicly.
**Included manufacturers:**
- IKEA
- Inovelli
- Ledvacnce/OSRAM
- SALUS/Computime
- Sonoff/iTead
- Third Reality
{% warning %}
Before updating a device, you should search for any disadvantages or if you even need to install an available update. Some firmware updates can break features you might use (e.g. group binding for IKEA devices). Some updates might also require changes to ZHA. In rare cases, you can even brick devices by installing a firmware update.
{% endwarning %}
### Global Options
There are a few global options available once ZHA has been configured. Press **Configure** to access these settings.
The options are as follows:
{% configuration_basic %}
Enable enhanced light color/temperature transition from an off-state:
description: "For older non Zigbee 3.0 lights, this still allows a proper transition from an off-state to a new color (without seeing the old color). _(default: off)_"
Enable enhanced brightness slider during light transition:
description: "This avoids seeing intermediary brightness state when turning on lights with a transition. _(default: on)_"
Group members assume state of group:
description: "When using ZHA groups, turning on a ZHA group light makes the ZHA group members optimistically change their state to \"on\", instead of waiting and polling the lights when off. _(default: on)_"
{% endconfiguration_basic %}
### Configuration - YAML
For more advanced configuration, you can modify {% term "`configuration.yaml`" %} and restart Home Assistant
{% configuration %}
database_path:
description: _Full_ path to the database which will keep persistent network data.
required: false
type: string
enable_quirks:
description: Enable quirks mode for devices where manufacturers didn't follow specs.
required: false
type: boolean
default: true
custom_quirks_path:
description: Full path to a directory containing custom quirk modules that will take precedence over any built-in quirks matching a device.
required: false
type: string
{% endconfiguration %}
#### Advanced OTA configuration
OTA for a few manufacturers is enabled by default, currently Ledvance, Sonoff, Inovelli, and ThirdReality. Other manufacturers are supported but disabled by default because their updates may change or remove device functionality, may require you to reconfigure devices, or are contributed by the community and may be minimally tested.
Refer to the [zigpy documentation for OTA configuration](https://github.com/zigpy/zigpy/wiki/OTA-Configuration) for more information on additional OTA providers.
#### Defining Zigbee channel to use
Tip! Before considering to change to an other Zigbee channel on an existing Zigbee network, it is highly recommended that you read through the two segments under the [troubleshooting](#troubleshooting) section below about _Best practices to avoid pairing/connection difficulties_ and _Zigbee interference avoidance and network range/coverage optimization_. These sections provide prerequisite information and advice on how to achieve the best possible Zigbee network in your environment.
ZHA prefers to use Zigbee channel 15 by default. You can change this using YAML configuration, but this only works
if there's no existing network. To change the channel for an existing network, radio has to be factory reset and a new network to be formed. This requires re-pairing of all the devices.
```yaml
zha:
zigpy_config:
network:
channel: 15 # What channel the radio should try to use.
channels: [15, 20, 25] # Channel mask
```
{% note %}
The best practice is to not change the Zigbee channel from the ZHA default.
{% endnote %}
The related troubleshooting segments mentioned above will, among other things, inform that if you have issues with overlapping frequencies between Wi-Fi and Zigbee, then it is usually better to first only try changing and setting a static Wi-Fi channel on your Wi-Fi router or all your Wi-Fi access points (instead of just changing to another Zigbee channel).
MetaGeek Support has a good reference article about channel selection for [Zigbee and WiFi coexistence](https://support.metageek.com/hc/en-us/articles/203845040-ZigBee-and-WiFi-Coexistence).
The Zigbee specification standards divide the 2.4&nbsp;GHz ISM radio band into 16 Zigbee channels (i.e. distinct radio frequencies for Zigbee). For all Zigbee devices to be able to communicate, they must support the same Zigbee channel (i.e. Zigbee radio frequency) that is set on the Zigbee Coordinator as the channel to use for its Zigbee network. Not all Zigbee devices support all Zigbee channels. Channel support usually depends on the age of the hardware and firmware, as well as on the device's power ratings.
The general recommendation is to only use channels 15, 20, or 25 in order to avoid interoperability problems with Zigbee devices. Not only because there is less chance of Wi-Fi networks interfering too much with the Zigbee network on other channels, but also because not all Zigbee devices support all channels. Some devices, for example, are limited to only being compatible with ZLL (Zigbee Light Link) channels. It is therefore especially not recommended to use Zigbee channels 11, 24, 25, or 26 on your Zigbee coordinator. These Zigbee channels are commonly only supported by relatively modern Zigbee hardware devices with newer Zigbee firmware. If using those channels, your coordinator may not be usable with older Zigbee devices.
#### Modifying the device type
As not all device manufacturers follow the Zigbee standard, at times a device can be incorrectly classified. For example, a switch could be classified as a light.
To correct the device type, also called domain, add the following to your {% term "`configuration.yaml`" %} and restart Home Assistant:
```yaml
zha:
device_config:
84:71:27:ff:fe:93:17:24-1: # format: {ieee}-{endpoint_id}
type: "switch" # corrected device type
```
`{ieee}` is the device hardware address which can be read from the Home Assistant UI when looking at _Device info_. From device info, you can find the `{endpoint_id}` by viewing the _Zigbee device signature_.
## Actions
### Action `zha.permit`
@ -463,38 +516,6 @@ This action disables a lock code on a Zigbee lock.
| ----------- | -------- | ------------------------------- |
| `code_slot` | no | Which lock code slot to disable |
## Adding devices
Tip! It is highly recommended that you read through the two segments under the troubleshooting section below about _Best practices to avoid pairing/connection difficulties_ and _Zigbee interference avoidance and network range/coverage optimization_ for general prerequisite knowledge and advice on how to achieve the best possible Zigbee network in your environment.
**To add a new Zigbee device:**
1. Go to {% my integrations title="**Settings** > **Devices & services**" %}.
2. Select the **Zigbee Home Automation** {% term integration %}. Then, select **Configure**.
3. To start a scan for new devices, on the bottom right corner of the screen, select **Add device**.
4. Reset your Zigbee devices to factory default settings according to the device instructions provided by the manufacturer (e.g., turn on/off lights up to 10 times; switches usually have a reset button/pin). It might take a few seconds for the devices to appear. You can click on **Show logs** for more verbose output.
5. Once the device is found, it will appear on that page and will be automatically added to your devices. You can optionally change its name and add it to an area (you can change this later). You can search again to add another device, or you can go back to the list of added devices.
### Using router devices to add more devices
Most mains-powered devices, e.g., many always-powered wall plugs or light bulbs in your Zigbee network will automatically act as a Zigbee router device (sometimes also referred to as a Zigbee "signal repeater" or "range extender").
Because Zigbee should use a [wireless mesh network](https://en.wikipedia.org/wiki/Wireless_mesh_network) to be effective, you will need to add Zigbee router devices to increase the number of Zigbee devices that can be used in your Zigbee network, both in the total number of devices that can be added as well as the total range and coverage of the network. Some Zigbee router devices do a much better job at routing and repeating Zigbee signals and messages than some other devices. You should not have a setup where Zigbee router devices (e.g. light bulbs) are often powered-off. Zigbee router devices are meant to be always available.
All Zigbee coordinator firmware will only allow you to directly connect a certain amount of devices. That limit is set for two reasons; firstly, to not overload the Zigbee coordinator, and secondly, to encourage your Zigbee network to quickly begin to utilize a "[mesh networking](https://en.wikipedia.org/wiki/Mesh_networking)" topology instead of only a "[star network](https://en.wikipedia.org/wiki/Star_network)" topology.
The total number of Zigbee devices that you can have on a Zigbee network depends on a few things. The Zigbee coordinator hardware and its firmware only play a larger role in Zigbee networks with a lot of devices. More important is the number of directly connected devices ("direct children") versus the number of routers that are connected to your Zigbee coordinator. The Zigpy library, which the ZHA {% term integration %} depends on, has an upper limit that is 32 direct children, but you can still have hundreds of Zigbee devices in total connected indirectly through routes via Zigbee router devices.
In this theoretical example, a CC2652-based Zigbee coordinator has three CC2530 Zigbee router devices for a total limit of 77 devices:
- Coordinator: 32 Zigbee End devices - 3 routers = 29
- Router one: + 16 devices
- Router two: + 16 devices
- Router three: + 16 devices
- Total device limit = **77 devices**
In practice, you will likely need to add a lot more Zigbee router devices than in this example in order to extend the coverage of the network to reach that many devices.
## Zigbee groups and binding devices
ZHA supports the creation of Zigbee groups (different from Home Assistant's [Group](/integrations/group/) integration), as well as binding devices to each other. Groups and device binding can be set up independently of each other, but they can be also used in combination (such as binding a device to another group of devices).
@ -558,16 +579,22 @@ ZHA supports migrating the Zigbee network between different Zigbee Coordinators
#### Prerequisites
To migrate your Zigbee network from one Zigbee Coordinator to another, confirm you meet the following requirements before proceeding with the migration process:
Confirm you meet the following requirements before migrating:
- The previous Zigbee Coordinator is used in the ZHA {% term integration %} and _not_ in deCONZ or MQTT.
- The previous coordinator is used in the ZHA {% term integration %} and _not_ in deCONZ or MQTT.
- The radio type is one of the following:
- ezsp (Silicon Labs EmberZnet)
- znp (Texas Instruments Z-Stack ZNP)
- deCONZ (ConBee/RaspBee from dresden elektronik)
- For deCONZ (ConBee/RaspBee) radio adapters, make sure it is running [firmware 0x26700700 (from 2021-08-18)](https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/Firmware-Changelog) or later.
- ezsp _(Silicon Labs EmberZnet)_
- znp _(Texas Instruments Z-Stack ZNP)_
- deCONZ _(ConBee/RaspBee from dresden elektronik)_
- Be sure it is running [firmware 0x26700700 (from 2021-08-18)](https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/Firmware-Changelog) or later.
#### To migrate to a new Zigbee coordinator radio inside ZHA
{% details "To migrate to a new Zigbee coordinator radio inside ZHA:" %}
{% important %}
You will not be able to control your existing Zigbee devices until the new coordinator fully joins the network after the migration. **This can take a few minutes.**
If some existing devices do not resume normal functions after some time, try power-cycling them to attempt rejoining to the network.
{% endimportant %}
1. Go to **{% my integrations title="Settings > Devices & services" %}** and select the ZHA {% term integration %}. Then select **Configure**.
2. Under **Network settings**, select **Migrate radio**.
@ -599,42 +626,74 @@ To migrate your Zigbee network from one Zigbee Coordinator to another, confirm y
11. Finally, a **Success!** message should pop up with information that all options were successfully saved.
- Select **Finish** to confirm.
{% important %}
You will not be able to control your existing Zigbee devices until the new coordinator fully joins the network after the migration. **This can take a few minutes.**
If some existing devices do not resume normal functions after some time, try power-cycling them to attempt rejoining to the network.
{% endimportant %}
{% enddetails %}
## Troubleshooting
Please note the current limitations and follow the instructions in this troubleshooting section.
{% note %}
To help resolve any kinks or compatibility problems, report bugs as issues with debug logs.
{% endnote %}
### Limitations
ZHA only supports connecting a single dedicated Zigbee Coordinator radio adapter or module with a single Zigbee network. The Zigbee Coordinator cannot already be connected or used by any other application. Devices currently or previously connected to another Zigbee implementation will need to be reset to their factory default settings before they can be paired/joined to ZHA. Refer to each device manufacturer's documentation for reset steps.
The list of ZHA limitations may not be exhaustive.
Any Zigbee device can only be connected to a single Zigbee Coordinator (only one Zigbee gateway). This is a limitation in the Zigbee protocol specifications, governed by the [CSA (Connectivity Standards Alliance)](https://csa-iot.org/all-solutions/zigbee/), applying to all Zigbee implementations and not just the ZHA implementation.
{% details "List of ZHA limitations:" %}
Support for commissioning Zigbee 3.0 devices via "Install Code" or "QR Code" via the `zha.permit` action has so far only been implemented for 'ezsp' (Silicon Labs EmberZNet) or 'znp' (Texas Instruments) radio type in ZHA. Other radio types are missing support in their respective [radio libraries for zigpy](https://github.com/zigpy/) or manufacturer's firmware commands/APIs.
**ZHA only supports connecting a single dedicated Zigbee coordinator with a single Zigbee network:**
ZHA currently does not support devices that can only use the ZGP ("Zigbee Green Power") profile which is used in a few batteryless self-powered or energy harvesting devices, (such as for example; Philips Hue Click, Philips Hue Tap, and some "Friends of Hue" partnership switches).
- The Zigbee Coordinator cannot already be connected or used by any other application.
- Devices currently or previously connected to another Zigbee implementation will need to be reset to their factory default settings before they can be paired/joined to ZHA.
- Refer to each device manufacturer's documentation for reset steps.
ZHA does not currently support devices that can only use the ZSE ("Zigbee Smart Energy") profile, that is however due to the "Zigbee SE" specification not being part of the standard Zigbee 3.0 specification and thus not implemented in most of the Zigbee protocol stacks that are commonly available Zigbee Coordinator radio adapters and modules.
**A Zigbee device can only be connected to a single Zigbee Coordinator (only one Zigbee gateway):**
- This is a limitation in the Zigbee protocol specifications, governed by the [CSA (Connectivity Standards Alliance)](https://csa-iot.org/all-solutions/zigbee/), applying to all Zigbee implementations and not just the ZHA implementation.
**Support for commissioning Zigbee 3.0 devices via "Install Code" or "QR Code" via the `zha.permit` action:**
- This has so far only been implemented for 'ezsp' (Silicon Labs EmberZNet) or 'znp' (Texas Instruments) radio type in ZHA.
- Other radio types are missing support in their respective [radio libraries for zigpy](https://github.com/zigpy/) or manufacturer's firmware commands/APIs.
**ZHA does _not_ currently support devices that can only use:**
- The ZGP ("Zigbee Green Power") profile:
- This is used in a few batteryless self-powered or energy harvesting devices, (such as Philips Hue Click, Philips Hue Tap, and some "Friends of Hue" partnership switches).
- The ZSE ("Zigbee Smart Energy") profile:
- This is due to the "Zigbee SE" specification not being part of the standard Zigbee 3.0 specification and thus not implemented in most of the Zigbee protocol stacks that are commonly available Zigbee Coordinator radio adapters and modules.
{% enddetails %}
### Knowing which devices are supported
Home Assistant's ZHA {% term integration %} supports all standard Zigbee device types. It should be compatible with most Zigbee devices as long as they fully conform to the official ZCL (Zigbee Cluster Library) specifications defined by the [CSA (Connectivity Standards Alliance, formerly the Zigbee Alliance)](https://csa-iot.org/all-solutions/zigbee/). There is therefore no official compatibility list of devices that will work out-of-the-box with the ZHA {% term integration %}
Not all hardware manufacturers always fully comply with the standard specifications. Sometimes, they may also implement unique features. For this reason, some Zigbee devices pair/join fine with ZHA but then only show none or only a few entities in the {% term integration %}. Developers can work around most such interoperability issues by adding conversion/translation code in custom device handlers. For more information, refer to the section below on [How to add support for new and unsupported devices](#how-to-add-support-for-new-and-unsupported-devices).
Home Assistant's ZHA {% term integration %} supports all standard Zigbee device types as defined by the [CSA (Connectivity Standards Alliance, formerly the Zigbee Alliance)](https://csa-iot.org/all-solutions/zigbee/).
For clarification, normally only devices that do not fully conform to CSA's ZCL specifications that will not present all standard attributes as entities for configuration in the ZHA {% term integration %}. Zigbee devices that only use the standard clusters and attributes that are Zigbee specifications set by the Connectivity Standards Alliance should not need custom device handlers.
**There is therefore no official compatibility list of devices that will work out-of-the-box with the ZHA {% term integration %}.**
Before continuing with this section: If a device does not join/pair at all, read the troubleshooting sections about how to avoid pairing/connection difficulties, interference avoidance, and network range/coverage optimization.
{% tip %}
Check out [blakadder's unofficial Zigbee Device Compatibility Repository](https://zigbee.blakadder.com).
Tip to new Zigbee users: Checkout [blakadder's unofficial Zigbee Device Compatibility Repository](https://zigbee.blakadder.com). Anyone can help maintain the site by submitting device compatibility information to it. The repository contains independent community member's reports or device-specific pairing tips for several home automation gateway/bridge/hub software, including open-source Zigbee implementations, such as ZHA, Zigbee2MQTT, and Tasmota (Zigbee2Tasmota).
This unofficial list contains independent community members' reports _(or device-specific pairing tips)_ for several home automation gateway/bridge/hub software (including open-source Zigbee implementations such as ZHA, Zigbee2MQTT, and Tasmota/Zigbee2Tasmota).
Anyone can help maintain the site by submitting device compatibility information to it.
{% endtip %}
Not all hardware manufacturers fully comply with the standard. This can include:
- Implementing unique (but non-standard) features,
- Not showing all expected entities within the Home Assistant {% term integration %} overview.
- Showing no entities within Home Assistant at all.
Developers (or even advanced users) might be able to work around such interoperability issues by adding conversion/translation code in custom device handlers. For more information, refer to [How to add support for new and unsupported devices](#how-to-add-support-for-new-and-unsupported-devices).
{% note %}
**If a device will not join/pair** at all, review the following sections on this page:
- [Best practices to avoid pairing/connection difficulties](#best-practices-to-avoid-pairingconnection-difficulties)
- [Zigbee interference avoidance and network range/coverage optimization](#zigbee-interference-avoidance-and-network-rangecoverage-optimization)
These sections both provide helpful advice on improving your Zigbee network performance.
{% endnote %}
### How to add support for new and unsupported devices
@ -770,7 +829,12 @@ When reporting potential bugs related to the ZHA integration on the issues track
3. If the issue is related to a specific Zigbee device, provide both the **Zigbee Device Signature** and the **Diagnostics** information.
- Both the **Zigbee Device Signature** and the **Diagnostics** information can be found under {% my integrations title="**Settings** > **Devices & services**" %}. Select the **Zigbee Home Automation** integration. Then, select **Configure** > **Devices** (pick your device). Select **Zigbee Device Signature** and **Download Diagnostics**, respectively.
Note: Please also make sure you give it your best effort to follow the recommended best practices for avoiding both [pairing/connection difficulties](#best-practices-to-avoid-pairingconnection-difficulties) and [Zigbee interference](#zigbee-interference-avoidance-and-network-rangecoverage-optimization), (which helps free up time for developers).
{% tip %}
For troubleshooting, read the following sections on this page. They provide information on improving your Zigbee network performance.
- [Best practices to avoid pairing/connection difficulties](#best-practices-to-avoid-pairingconnection-difficulties)
- [Zigbee interference avoidance and network range/coverage optimization](#zigbee-interference-avoidance-and-network-rangecoverage-optimization)
{% endtip %}
### Debug logging
@ -895,3 +959,11 @@ services:
When you see `NCP entered failed state. Requesting APP controller restart` in logs during normal operation, it indicates a drop in communication between ZHA and the serial interface of the Silabs EmberZNet Zigbee Coordinator.
The EZSP (EmberZNet Serial Protocol) interface used by Silicon Labs EmberZNet Zigbee Coordinator adapters requires a stable connection to the serial port; therefore, it is not recommended to use a connection over Wi-Fi, WAN, VPN, etc.
### Zigbee 3.0 support
Some coordinators may not support firmware capable of Zigbee 3.0, but they can still be fully functional and feature-complete for your needs.
{% note %}
It is up to hardware manufacturers to make such firmware available to them. If your coordinator was shipped with an older firmware version, you be able to manually upgrade the firmware.
{% endnote %}

View File

@ -67,6 +67,11 @@ Enjoy the release!
- [Other noteworthy changes](#other-noteworthy-changes)
- [Iterating on the legends of graphs](#iterating-on-the-legends-of-graphs)
- [Grouping/clustering of trackables on the maps](#groupingclustering-of-trackables-on-the-maps)
- [Patch releases](#patch-releases)
- [2025.3.1 - March 7](#202531---march-7)
- [2025.3.2 - March 11](#202532---march-11)
- [2025.3.3 - March 14](#202533---march-14)
- [2025.3.4 - March 21](#202534---march-21)
- [Need help? Join the community!](#need-help-join-the-community)
- [Backward-incompatible changes](#backward-incompatible-changes)
- [All changes](#all-changes)
@ -309,7 +314,7 @@ changes to existing integrations:
The [SmartThings] integration has been completely rewritten! 🎉 In December,
SmartThings shut down the old authentication method, but thanks to
SmartThings' hard work and close collaboration with us, [@joostlek] was able to
bring back the integration is back—better than ever.
bring back the integration—better than ever.
No more setting up routing, exposing ports, or creating developer accounts with
access tokens—**just log in with your Samsung account**, and youre good to go!
@ -407,6 +412,312 @@ Thanks [@jpbede] and [@marcinbauer85] for this awesome improvement!
[@jpbede]: https://github.com/jpbede
[@marcinbauer85]: https://github.com/marcinbauer85
## Patch releases
We will also release patch releases for Home Assistant 2025.3 in March.
These patch releases only contain bug fixes. Our goal is to release a patch
release every Friday.
### 2025.3.1 - March 7
- Check support for demand load control in SmartThings AC ([@Ishima] - [#139616])
- Fix Unit of Measurement for Squeezebox duration sensor entity on LMS service ([@peteS-UK] - [#139861])
- Trim the Schema allowed keys to match the Public Gemini API docs. ([@IvanLH] - [#139876])
- Bump thermobeacon-ble to 0.8.1 ([@bdraco] - [#139919])
- Deduplicate climate modes in SmartThings ([@joostlek] - [#139930])
- Check if the unit of measurement is valid before creating the entity ([@jbouwh] - [#139932])
- Bump pysmartthings to 2.6.1 ([@joostlek] - [#139936])
- Bump aiowebdav2 to 0.4.0 ([@jpbede] - [#139938])
- Add config entry level diagnostics to SmartThings ([@joostlek] - [#139939])
- Set content length when uploading files to WebDAV ([@jpbede] - [#139950])
- Bump to python-snoo 0.6.1 ([@Lash-L] - [#139954])
- Fix SmartThings fan ([@joostlek] - [#139962])
- Update frontend to 20250306.0 ([@bramkragten] - [#139965])
- Fix SmartThings dust sensor UoM ([@joostlek] - [#139977])
- Bump nexia to 2.2.2 ([@bdraco] - [#139986])
- Bump aiowebdav2 to 0.4.1 ([@jpbede] - [#139988])
- Correctly retrieve only loaded Google Generative AI config_entries ([@IvanLH] - [#139999])
- Fix regression to evohome debug logging ([@zxdavb] - [#140000])
- Check operation state on Home Connect program sensor update ([@Diegorro98] - [#140011])
- Bump aiohomeconnect to 0.16.3 ([@MartinHjelmare] - [#140014])
- Fix powerwall 0% in Tessie and Tesla Fleet ([@Bre77] - [#140017])
- Fix shift state default in Teslemetry and Tessie ([@Bre77] - [#140018])
- Add description for HomematicIP HCU1 in homematicip_cloud setup config flow ([@hahn-th] - [#140025])
- Fix evohome to gracefully handle null schedules ([@zxdavb] - [#140036])
- Fix SmartThings disabling working capabilities ([@joostlek] - [#140039])
- Fix SmartThings thermostat climate check ([@joostlek] - [#140046])
- Bump pysmartthings to 2.7.0 ([@joostlek] - [#140047])
- Only keep valid powerConsumptionReports in SmartThings ([@joostlek] - [#140049])
- Bump py-synologydsm-api to 2.7.1 ([@mib1185] - [#140052])
- Restore SmartThings button event ([@joostlek] - [#140044])
[#139616]: https://github.com/home-assistant/core/pull/139616
[#139859]: https://github.com/home-assistant/core/pull/139859
[#139861]: https://github.com/home-assistant/core/pull/139861
[#139876]: https://github.com/home-assistant/core/pull/139876
[#139919]: https://github.com/home-assistant/core/pull/139919
[#139930]: https://github.com/home-assistant/core/pull/139930
[#139932]: https://github.com/home-assistant/core/pull/139932
[#139936]: https://github.com/home-assistant/core/pull/139936
[#139938]: https://github.com/home-assistant/core/pull/139938
[#139939]: https://github.com/home-assistant/core/pull/139939
[#139950]: https://github.com/home-assistant/core/pull/139950
[#139954]: https://github.com/home-assistant/core/pull/139954
[#139962]: https://github.com/home-assistant/core/pull/139962
[#139965]: https://github.com/home-assistant/core/pull/139965
[#139977]: https://github.com/home-assistant/core/pull/139977
[#139986]: https://github.com/home-assistant/core/pull/139986
[#139988]: https://github.com/home-assistant/core/pull/139988
[#139999]: https://github.com/home-assistant/core/pull/139999
[#140000]: https://github.com/home-assistant/core/pull/140000
[#140011]: https://github.com/home-assistant/core/pull/140011
[#140014]: https://github.com/home-assistant/core/pull/140014
[#140017]: https://github.com/home-assistant/core/pull/140017
[#140018]: https://github.com/home-assistant/core/pull/140018
[#140025]: https://github.com/home-assistant/core/pull/140025
[#140036]: https://github.com/home-assistant/core/pull/140036
[#140039]: https://github.com/home-assistant/core/pull/140039
[#140044]: https://github.com/home-assistant/core/pull/140044
[#140046]: https://github.com/home-assistant/core/pull/140046
[#140047]: https://github.com/home-assistant/core/pull/140047
[#140049]: https://github.com/home-assistant/core/pull/140049
[#140052]: https://github.com/home-assistant/core/pull/140052
[@Bre77]: https://github.com/Bre77
[@Diegorro98]: https://github.com/Diegorro98
[@Ishima]: https://github.com/Ishima
[@IvanLH]: https://github.com/IvanLH
[@Lash-L]: https://github.com/Lash-L
[@MartinHjelmare]: https://github.com/MartinHjelmare
[@bdraco]: https://github.com/bdraco
[@bramkragten]: https://github.com/bramkragten
[@frenck]: https://github.com/frenck
[@hahn-th]: https://github.com/hahn-th
[@jbouwh]: https://github.com/jbouwh
[@joostlek]: https://github.com/joostlek
[@jpbede]: https://github.com/jpbede
[@mib1185]: https://github.com/mib1185
[@peteS-UK]: https://github.com/peteS-UK
[@zxdavb]: https://github.com/zxdavb
### 2025.3.2 - March 11
- Don't allow creating backups if Home Assistant is not running ([@emontnemery] - [#139499])
- Bump govee_ble to 0.43.1 ([@moosilauke18] - [#139862])
- Label emergency heat switch ([@jrhillery] - [#139872])
- Bump sense-energy lib to 0.13.7 ([@kbickar] - [#140068])
- Update jinja to 3.1.6 ([@frenck] - [#140069])
- Update evohome-async to 1.0.3 ([@zxdavb] - [#140083])
- Fix HEOS discovery error when previously ignored ([@andrewsayre] - [#140091])
- Map prewash job state in SmartThings ([@joostlek] - [#140097])
- Check support for thermostat operating state in SmartThings ([@joostlek] - [#140103])
- Handle None options in SmartThings ([@joostlek] - [#140110])
- Fix MQTT JSON light not reporting color temp status if color is not supported ([@jbouwh] - [#140113])
- Fix HEOS user initiated setup when discovery is waiting confirmation ([@andrewsayre] - [#140119])
- Support null supported Thermostat modes in SmartThings ([@joostlek] - [#140101])
- Set device class for Oven Completion time in SmartThings ([@joostlek] - [#140139])
- Revert "Check if the unit of measurement is valid before creating the entity" ([@jbouwh] - [#140155])
- Fix the order of the group members attribute of the Music Assistant integration ([@msm595] - [#140204])
- Fix events without user in Bring integration ([@tr4nt0r] - [#140213])
- Log broad exception in Electricity Maps config flow ([@jpbede] - [#140219])
- Bump evohome-async to 1.0.4 to fix #140194 ([@zxdavb] - [#140230])
- Refresh Home Connect token during config entry setup ([@Diegorro98] - [#140233])
- Add 900 RPM option to washer spin speed options at Home Connect ([@Diegorro98] - [#140234])
- Fix todo tool broken with Gemini 2.0 models. ([@Lash-L] - [#140246])
- Fix version not always available in onewire ([@epenet] - [#140260])
- Fix `client_id` not generated when connecting to the MQTT broker ([@jbouwh] - [#140264])
- Bump velbusaio to 2025.3.0 ([@cereal2nd] - [#140267])
- Fix dryer operating state in SmartThings ([@joostlek] - [#140277])
- FGLair : Upgrade to ayla-iot-unofficial 1.4.7 ([@crevetor] - [#140296])
- Bump pyheos to v1.0.3 ([@andrewsayre] - [#140310])
- Bump ZHA to 0.0.52 ([@puddly] - [#140325])
- Bump pydrawise to 2025.3.0 ([@dknowles2] - [#140330])
- Bump teslemetry-stream ([@Bre77] - [#140335])
- Fix no temperature unit in SmartThings ([@joostlek] - [#140363])
- Fix double space quoting in WebDAV ([@jpbede] - [#140364])
- Bump python-roborock to 2.12.2 ([@Lash-L] - [#140368])
- Handle incomplete power consumption reports in SmartThings ([@joostlek] - [#140370])
- Fix browsing Audible Favorites in Sonos ([@PeteRager] - [#140378])
- Make sure SmartThings light can deal with unknown states ([@joostlek] - [#140190])
- Delete subscription on shutdown of SmartThings ([@joostlek] - [#140135])
[#139499]: https://github.com/home-assistant/core/pull/139499
[#139859]: https://github.com/home-assistant/core/pull/139859
[#139862]: https://github.com/home-assistant/core/pull/139862
[#139872]: https://github.com/home-assistant/core/pull/139872
[#140061]: https://github.com/home-assistant/core/pull/140061
[#140068]: https://github.com/home-assistant/core/pull/140068
[#140069]: https://github.com/home-assistant/core/pull/140069
[#140083]: https://github.com/home-assistant/core/pull/140083
[#140091]: https://github.com/home-assistant/core/pull/140091
[#140097]: https://github.com/home-assistant/core/pull/140097
[#140101]: https://github.com/home-assistant/core/pull/140101
[#140103]: https://github.com/home-assistant/core/pull/140103
[#140110]: https://github.com/home-assistant/core/pull/140110
[#140113]: https://github.com/home-assistant/core/pull/140113
[#140119]: https://github.com/home-assistant/core/pull/140119
[#140135]: https://github.com/home-assistant/core/pull/140135
[#140139]: https://github.com/home-assistant/core/pull/140139
[#140155]: https://github.com/home-assistant/core/pull/140155
[#140190]: https://github.com/home-assistant/core/pull/140190
[#140204]: https://github.com/home-assistant/core/pull/140204
[#140213]: https://github.com/home-assistant/core/pull/140213
[#140219]: https://github.com/home-assistant/core/pull/140219
[#140230]: https://github.com/home-assistant/core/pull/140230
[#140233]: https://github.com/home-assistant/core/pull/140233
[#140234]: https://github.com/home-assistant/core/pull/140234
[#140246]: https://github.com/home-assistant/core/pull/140246
[#140260]: https://github.com/home-assistant/core/pull/140260
[#140264]: https://github.com/home-assistant/core/pull/140264
[#140267]: https://github.com/home-assistant/core/pull/140267
[#140277]: https://github.com/home-assistant/core/pull/140277
[#140296]: https://github.com/home-assistant/core/pull/140296
[#140310]: https://github.com/home-assistant/core/pull/140310
[#140325]: https://github.com/home-assistant/core/pull/140325
[#140330]: https://github.com/home-assistant/core/pull/140330
[#140335]: https://github.com/home-assistant/core/pull/140335
[#140363]: https://github.com/home-assistant/core/pull/140363
[#140364]: https://github.com/home-assistant/core/pull/140364
[#140368]: https://github.com/home-assistant/core/pull/140368
[#140370]: https://github.com/home-assistant/core/pull/140370
[#140378]: https://github.com/home-assistant/core/pull/140378
[@Bre77]: https://github.com/Bre77
[@Diegorro98]: https://github.com/Diegorro98
[@Lash-L]: https://github.com/Lash-L
[@PeteRager]: https://github.com/PeteRager
[@andrewsayre]: https://github.com/andrewsayre
[@cereal2nd]: https://github.com/cereal2nd
[@crevetor]: https://github.com/crevetor
[@dknowles2]: https://github.com/dknowles2
[@emontnemery]: https://github.com/emontnemery
[@epenet]: https://github.com/epenet
[@frenck]: https://github.com/frenck
[@jbouwh]: https://github.com/jbouwh
[@joostlek]: https://github.com/joostlek
[@jpbede]: https://github.com/jpbede
[@jrhillery]: https://github.com/jrhillery
[@kbickar]: https://github.com/kbickar
[@moosilauke18]: https://github.com/moosilauke18
[@msm595]: https://github.com/msm595
[@puddly]: https://github.com/puddly
[@tr4nt0r]: https://github.com/tr4nt0r
[@zxdavb]: https://github.com/zxdavb
### 2025.3.3 - March 14
- Fix bug with all Roborock maps being set to the wrong map when empty ([@Lash-L] - [#138493])
- Bump pysuezV2 to 2.0.4 ([@jb101010-2] - [#139824])
- Bump upb-lib to 0.6.1 ([@gwww] - [#140212])
- Use only IPv4 for zeroconf in bluesound integration ([@LouisChrist] - [#140226])
- Only do WebDAV path migration when path differs ([@jpbede] - [#140402])
- Bump velbusaio to 2025.3.1 ([@cereal2nd] - [#140443])
- Mark value in number.set_value action as required ([@joostlek] - [#140445])
- Bump Tesla Fleet API to 0.9.13 ([@Bre77] - [#140485])
- Update xknxproject to 3.8.2 ([@farmio] - [#140499])
- Fix Shelly diagnostics for devices without WebSocket Outbound support ([@bieniu] - [#140501])
- Fix windowShadeLevel capability in SmartThings ([@joostlek] - [#140552])
- Set unit of measurement for SmartThings oven setpoint ([@joostlek] - [#140560])
- Fix missing UnitOfPower.MILLIWATT in sensor and number allowed units ([@ashionky] - [#140567])
[#138493]: https://github.com/home-assistant/core/pull/138493
[#139824]: https://github.com/home-assistant/core/pull/139824
[#139859]: https://github.com/home-assistant/core/pull/139859
[#140061]: https://github.com/home-assistant/core/pull/140061
[#140212]: https://github.com/home-assistant/core/pull/140212
[#140226]: https://github.com/home-assistant/core/pull/140226
[#140392]: https://github.com/home-assistant/core/pull/140392
[#140402]: https://github.com/home-assistant/core/pull/140402
[#140443]: https://github.com/home-assistant/core/pull/140443
[#140445]: https://github.com/home-assistant/core/pull/140445
[#140485]: https://github.com/home-assistant/core/pull/140485
[#140499]: https://github.com/home-assistant/core/pull/140499
[#140501]: https://github.com/home-assistant/core/pull/140501
[#140552]: https://github.com/home-assistant/core/pull/140552
[#140560]: https://github.com/home-assistant/core/pull/140560
[#140567]: https://github.com/home-assistant/core/pull/140567
[@Bre77]: https://github.com/Bre77
[@Lash-L]: https://github.com/Lash-L
[@LouisChrist]: https://github.com/LouisChrist
[@ashionky]: https://github.com/ashionky
[@bieniu]: https://github.com/bieniu
[@cereal2nd]: https://github.com/cereal2nd
[@farmio]: https://github.com/farmio
[@frenck]: https://github.com/frenck
[@gwww]: https://github.com/gwww
[@jb101010-2]: https://github.com/jb101010-2
[@joostlek]: https://github.com/joostlek
[@jpbede]: https://github.com/jpbede
### 2025.3.4 - March 21
- Fix initial fetch of Home Connect appliance data to handle API rate limit errors ([@Diegorro98] - [#139379])
- Handle API rate limit error on Home Connect entities fetch ([@Diegorro98] - [#139384])
- Album art not available for Sonos media library favorites ([@PeteRager] - [#140557])
- Change max ICP value to fixed value for Wallbox Integration ([@hesselonline] - [#140592])
- Add 700 RPM option to washer spin speed options at Home Connect ([@Diegorro98] - [#140607])
- Handle non documented options at Home Connect select entities ([@Diegorro98] - [#140608])
- Fix optional password in Velbus config flow ([@cereal2nd] - [#140615])
- Make Oven setpoint follow temperature UoM in SmartThings ([@joostlek] - [#140666])
- Fix Elk-M1 missing TLS 1.2 check ([@gwww] - [#140672])
- Bump PySwitchBot to 0.57.1 ([@bdraco] - [#140681])
- Check Celsius in SmartThings oven setpoint ([@joostlek] - [#140687])
- Fix broken core integration Smart Meter Texas by switching it to use HA's SSL Context ([@adamfeldman] - [#140694])
- Don't reload onedrive on options flow ([@zweckj] - [#140712])
- Bump pySmartThings to 2.7.4 ([@joostlek] - [#140720])
- Fix SmartThings ACs without supported AC modes ([@joostlek] - [#140744])
- Bump pylamarzocco to 1.4.9 ([@zweckj] - [#140916])
- Log SmartThings subscription error on exception ([@joostlek] - [#140939])
- Ensure file is correctly uploaded by the GenAI SDK ([@IvanLH] - [#140969])
- Reolink fix playback headers ([@starkillerOG] - [#141015])
- Fix some Home Connect options keys ([@Diegorro98] - [#141023])
- Bump ZHA to 0.0.53 ([@puddly] - [#141025])
- Bump Python-Snoo to 0.6.3 ([@Lash-L] - [#140628])
- Bump python-snoo to 0.6.4 ([@Lash-L] - [#141030])
- Improve Home Connect appliances test fixture ([@MartinHjelmare] - [#139787])
[#139379]: https://github.com/home-assistant/core/pull/139379
[#139384]: https://github.com/home-assistant/core/pull/139384
[#139787]: https://github.com/home-assistant/core/pull/139787
[#139859]: https://github.com/home-assistant/core/pull/139859
[#140061]: https://github.com/home-assistant/core/pull/140061
[#140392]: https://github.com/home-assistant/core/pull/140392
[#140557]: https://github.com/home-assistant/core/pull/140557
[#140583]: https://github.com/home-assistant/core/pull/140583
[#140592]: https://github.com/home-assistant/core/pull/140592
[#140607]: https://github.com/home-assistant/core/pull/140607
[#140608]: https://github.com/home-assistant/core/pull/140608
[#140615]: https://github.com/home-assistant/core/pull/140615
[#140628]: https://github.com/home-assistant/core/pull/140628
[#140666]: https://github.com/home-assistant/core/pull/140666
[#140672]: https://github.com/home-assistant/core/pull/140672
[#140681]: https://github.com/home-assistant/core/pull/140681
[#140687]: https://github.com/home-assistant/core/pull/140687
[#140694]: https://github.com/home-assistant/core/pull/140694
[#140712]: https://github.com/home-assistant/core/pull/140712
[#140720]: https://github.com/home-assistant/core/pull/140720
[#140744]: https://github.com/home-assistant/core/pull/140744
[#140916]: https://github.com/home-assistant/core/pull/140916
[#140939]: https://github.com/home-assistant/core/pull/140939
[#140969]: https://github.com/home-assistant/core/pull/140969
[#141015]: https://github.com/home-assistant/core/pull/141015
[#141023]: https://github.com/home-assistant/core/pull/141023
[#141025]: https://github.com/home-assistant/core/pull/141025
[#141030]: https://github.com/home-assistant/core/pull/141030
[@Diegorro98]: https://github.com/Diegorro98
[@IvanLH]: https://github.com/IvanLH
[@Lash-L]: https://github.com/Lash-L
[@MartinHjelmare]: https://github.com/MartinHjelmare
[@PeteRager]: https://github.com/PeteRager
[@adamfeldman]: https://github.com/adamfeldman
[@bdraco]: https://github.com/bdraco
[@cereal2nd]: https://github.com/cereal2nd
[@frenck]: https://github.com/frenck
[@gwww]: https://github.com/gwww
[@hesselonline]: https://github.com/hesselonline
[@joostlek]: https://github.com/joostlek
[@puddly]: https://github.com/puddly
[@starkillerOG]: https://github.com/starkillerOG
[@zweckj]: https://github.com/zweckj
## Need help? Join the community!
Home Assistant has a great community of users who are all more than willing

View File

@ -0,0 +1,78 @@
---
layout: post
title: "Home Assistant officially Matters"
description: "Home Assistant gains certification, but also a powerful tool for any open source project"
date: 2025-03-10 00:00:01
date_formatted: "March 10, 2025"
author: Marcel van der Veldt
comments: true
categories:
- Announcements
- Matter
og_image: /images/blog/2025-03-matter-certification/art.jpg
---
<p><img src='/images/blog/2025-03-matter-certification/art.jpg' alt="Home Assistant is officially matter certified" class='no-shadow' /></p>
Matter in Home Assistant has been officially certified! 🎉 The Connectivity Standards Alliance (CSA) has certified [Home Assistant](https://csa-iot.org/csa_product/home-assistant/) and the [Open Home Foundation Matter Server](https://csa-iot.org/csa_product/open-home-foundation-matter-server/), the first open-source project to receive this certification. Certification is proof that open source projects can sit among, or even above, big tech when it comes to providing the best smart home experience.
Home Assistant, as part of the [Open Home Foundation](https://www.openhomefoundation.org/), strongly believes in open standards. They embody our values of choice, privacy, and sustainability in the smart home. When a standard is well supported, consumers get access to a wide range of smart home devices that should work far into the future, which is great for sustainability. Best of all, they work locally, keeping your smart home data in your home.
All these benefits led us to include open standards certification [in our roadmap](/blog/2024/06/12/roadmap-2024h1/#open-standards-certified-quality). Home Assistant's implementations of Matter, Zigbee, and Z-Wave are already industry-leading, so it only makes sense to clearly signal and give users peace of mind that we provide true compatibility. This most recent certification is not just big for Home Assistant, but read on to see how it also helps any open source project looking to use Matter.
<!--more-->
## Matter matters
<p class="img"><lite-youtube videoid="rEugjMk-4II" videotitle="State of Matter 2024"></lite-youtube>Our live stream from 2024 explains Matter in depth</p>
Matter is the latest smart home open standard, which is looking to connect and control smart home devices regardless of their manufacturer or which ecosystem you want to control them from. Like the other open standards we support, it can be controlled fully locally, meaning these devices are not reliant on the cloud to work. The Connectivity Standards Alliance (CSA) is the body behind the Matter standard, representing its many members. They certify devices and set the rules on how they work together.
If you're not familiar with Matter, I'm not surprised. Though its adoption is growing, it's only a [couple of years old](https://csa-iot.org/newsroom/matter-arrives/). The most important companies in the smart home space have joined this standard, but support is still growing and becoming more consistent. If it fulfills its promise, any smart home product should work with your ecosystem of choice, and that makes us optimistic about its future.
More and more Matter devices are entering the market, and if you're buying new smart devices, it will just be a matter of time 😉 before you own one. To this point, Matter devices are even a part of our [Works With Home Assistant](https://partner.home-assistant.io/) program. [Aqara was the first](/blog/2024/09/03/aqara-joins-works-with-home-assistant/) to join our program with Matter devices, and we tested these devices ourselves to ensure they give the best experience possible in Home Assistant. This year, we expect many more Matter devices to join the program, and we should have more updates soon.
From a technical perspective, Matter is really interesting---it can work with different smart home systems at the same time. It also keeps the way devices connect and communicate separate, allowing it to connect to devices over Wi-Fi, Ethernet, and [Thread](/integrations/thread/) (a new mesh network technology for smart devices). Read our [State of Matter blog](/blog/2024/01/25/matter-livestream-blog/) or watch Paulus' appearance on [the Vergecast Matter Holiday Spec-Tacular](https://youtu.be/0Y75XEXAXfY?si=nSDpP6THkWhkARuc&t=3493) for a deeper dive into the standard.
## What certification brings
<p class="img"><img src='/images/blog/2025-03-matter-certification/ha-matter.png' alt="Home Assistant Matter certification"/>Well, this is a bit... awesome</p>
First and foremost, from a usability perspective, nothing will change for you. We are consistently the first to adopt the newest Matter versions, currently providing the highest version available. We'll keep on improving the Matter Server and the Matter integration at the same pace, ensuring that all device types in the Matter spec will work perfectly with Home Assistant---just from now on it will come with this certification badge.
The [Open Home Foundation Matter Server](https://csa-iot.org/csa_product/open-home-foundation-matter-server/) is now an officially trusted/certified software component, while [Home Assistant](https://csa-iot.org/csa_product/home-assistant/) is a certified "User Interface Component" (more on this distinction below). This allows us to clearly show this with a logo, along with being listed on the Matter website. For new Home Assistant users, this helps build confidence, knowing it is a supported way to use Matter. Similarly, for brands that don't know much about Home Assistant, these references can be surprisingly helpful, and it's our goal to have more brands target Home Assistant in their development. Another handy part of being certified is getting more access to pre-test new devices and SDK revisions, which will help development going forward.
### Why two certifications (and the server add-on)
<p class="img"><img src='/images/blog/2025-03-matter-certification/ohf-matter.png' alt="Open Home Foundation Matter Server is certified"/>So much fun we did it twice</p>
If you're confused why we certified both Home Assistant and Open Home Foundation Matter Server, there are a couple of legal/procedural reasons, but it comes with some useful benefits. We certified the server as a standalone component to allow any project to use it. Each project that uses it, including Home Assistant, will have to go through a certification process to acknowledge that it uses a certified component as a "User Interface Component". Certification for the Open Home Foundation Matter Server means it properly connects and communicates with other Matter devices, while certification for Home Assistant is about being able to display the Matter trademark.
This separation is important because it means that we won't need to go through recertification every time we update Home Assistant. This way we can keep the Matter-related backend isolated in both a software and certification sense. This is also why we will need to continue to have the Open Home Foundation Matter Server as an add-on, and it cannot be built into [Home Assistant Core](/installation/#advanced-installation-methods).
## The road to certification
Becoming Matter certified was not easy. When we started certification, the process was tooled up to test and certify devices, not Matter controllers, let alone completely software-based (and open source) controllers. We chose to collaborate with [Resillion](https://www.resillion.com/services/conformance-interoperability/wireless-product-testing/matter-certification/) for our certification. They are a testing and certification house based in Belgium with a lot of experience certifying Matter products. They do the formal testing and submit the results to the CSA. Together, we collaborated to write thousands of lines of test scripts, ensuring that as many test cases as possible were automated.
<p class="img"><img src='/images/blog/2025-03-matter-certification/lab.jpg' alt="Marcel van der Veldt at the Resillion lab"/>My visit to Resillion's lab, I brought my own lab coat</p>
We really appreciate Resillion for taking on this challenge. Not only were we the first controller they certified, but we also went for all the device types in the Matter 1.3 specification. This was a huge effort for all involved, but now that these test scripts exist, they only require minor updates for each new version; we can reuse them whenever we need to recertify.
<div class="alert">
<p>“At Resillion, we strongly support interoperability in connected home technology, and assure, secure and innovate to help make this technology work for everyone. For us, this was not only a fantastic way to contribute to the Home Assistant open-source project, but also upgrade our own Home Assistant instances with Matter, as enthusiasts of the project running active instances of HA in our own homes.</p>
<p>“Working on a controller utilizing the full Matter 1.3 feature set presents a great opportunity to advance HA and Matter, and we look forward to supporting the developed codebase and further contributing to an open smart home.”</p>
<em style="text-align: right; display: block;">- Jan Claes, Head of testing services - C&I Global, Resillion</em>
</div>
This is another example of something that's only possible because of the support we get from users subscribing to [Home Assistant Cloud](/cloud/). Certification would be very difficult for any other open-source project, but we have the funding first to build a great server and also to pay for the required testing. Now this open source implementation exists and can be used by any project looking to add Matter.
## The future Matters
As we continue improving our Matter implementation, the Matter standard itself is also evolving. Even with the progress it has made in the past year, there are still challenges to overcome. Matter is completely built on IPv6, and its rollout is uncovering the poor state of IPv6 support in today's network hardware. Also, as it's a complicated standard, it can be difficult to explain concepts like Thread and Fabrics to the average user, but hopefully users won't need to be experts in the future to get the most out of Matter in their homes.
Some might call Matter the smart home standard to replace all others, but we believe that there's room for multiple standards, each providing its own unique benefits. We are focused on providing the highest support for all local smart home standards ([certifying other standards is on our roadmap](/blog/2024/11/15/roadmap-2024h2/#open-protocols)) and ensuring they work far into the future, which is great for consumer choice and sustainability.
As Home Assistant grows and takes important steps like certification, the more credibility we gain in the industry---it's a virtuous circle that helps us and Open Home projects continuously improve. Thanks for your support and helping us make this possible 🙏.
**Try the Matter in Home Assistant today:**
[<img src='https://my.home-assistant.io/badges/config_flow_start.svg' style='border: 0;box-shadow: none;' alt="!Open your Home Assistant instance and show the dashboard of an add-on.">](https://my.home-assistant.io/redirect/config_flow_start?domain=matter)

View File

@ -1162,6 +1162,306 @@ For a summary in a more readable format:
- Bump intents to 2025.3.5 ([@synesthesiam] - [#139851])
- Fix no disabled capabilities in SmartThings ([@joostlek] - [#139860])
## Release 2025.3.1 - March 7
- Check support for demand load control in SmartThings AC ([@Ishima] - [#139616])
- Fix Unit of Measurement for Squeezebox duration sensor entity on LMS service ([@peteS-UK] - [#139861])
- Trim the Schema allowed keys to match the Public Gemini API docs. ([@IvanLH] - [#139876])
- Bump thermobeacon-ble to 0.8.1 ([@bdraco] - [#139919])
- Deduplicate climate modes in SmartThings ([@joostlek] - [#139930])
- Check if the unit of measurement is valid before creating the entity ([@jbouwh] - [#139932])
- Bump pysmartthings to 2.6.1 ([@joostlek] - [#139936])
- Bump aiowebdav2 to 0.4.0 ([@jpbede] - [#139938])
- Add config entry level diagnostics to SmartThings ([@joostlek] - [#139939])
- Set content length when uploading files to WebDAV ([@jpbede] - [#139950])
- Bump to python-snoo 0.6.1 ([@Lash-L] - [#139954])
- Fix SmartThings fan ([@joostlek] - [#139962])
- Update frontend to 20250306.0 ([@bramkragten] - [#139965])
- Fix SmartThings dust sensor UoM ([@joostlek] - [#139977])
- Bump nexia to 2.2.2 ([@bdraco] - [#139986])
- Bump aiowebdav2 to 0.4.1 ([@jpbede] - [#139988])
- Correctly retrieve only loaded Google Generative AI config_entries ([@IvanLH] - [#139999])
- Fix regression to evohome debug logging ([@zxdavb] - [#140000])
- Check operation state on Home Connect program sensor update ([@Diegorro98] - [#140011])
- Bump aiohomeconnect to 0.16.3 ([@MartinHjelmare] - [#140014])
- Fix powerwall 0% in Tessie and Tesla Fleet ([@Bre77] - [#140017])
- Fix shift state default in Teslemetry and Tessie ([@Bre77] - [#140018])
- Add description for HomematicIP HCU1 in homematicip_cloud setup config flow ([@hahn-th] - [#140025])
- Fix evohome to gracefully handle null schedules ([@zxdavb] - [#140036])
- Fix SmartThings disabling working capabilities ([@joostlek] - [#140039])
- Fix SmartThings thermostat climate check ([@joostlek] - [#140046])
- Bump pysmartthings to 2.7.0 ([@joostlek] - [#140047])
- Only keep valid powerConsumptionReports in SmartThings ([@joostlek] - [#140049])
- Bump py-synologydsm-api to 2.7.1 ([@mib1185] - [#140052])
- Restore SmartThings button event ([@joostlek] - [#140044])
[#139616]: https://github.com/home-assistant/core/pull/139616
[#139859]: https://github.com/home-assistant/core/pull/139859
[#139861]: https://github.com/home-assistant/core/pull/139861
[#139876]: https://github.com/home-assistant/core/pull/139876
[#139919]: https://github.com/home-assistant/core/pull/139919
[#139930]: https://github.com/home-assistant/core/pull/139930
[#139932]: https://github.com/home-assistant/core/pull/139932
[#139936]: https://github.com/home-assistant/core/pull/139936
[#139938]: https://github.com/home-assistant/core/pull/139938
[#139939]: https://github.com/home-assistant/core/pull/139939
[#139950]: https://github.com/home-assistant/core/pull/139950
[#139954]: https://github.com/home-assistant/core/pull/139954
[#139962]: https://github.com/home-assistant/core/pull/139962
[#139965]: https://github.com/home-assistant/core/pull/139965
[#139977]: https://github.com/home-assistant/core/pull/139977
[#139986]: https://github.com/home-assistant/core/pull/139986
[#139988]: https://github.com/home-assistant/core/pull/139988
[#139999]: https://github.com/home-assistant/core/pull/139999
[#140000]: https://github.com/home-assistant/core/pull/140000
[#140011]: https://github.com/home-assistant/core/pull/140011
[#140014]: https://github.com/home-assistant/core/pull/140014
[#140017]: https://github.com/home-assistant/core/pull/140017
[#140018]: https://github.com/home-assistant/core/pull/140018
[#140025]: https://github.com/home-assistant/core/pull/140025
[#140036]: https://github.com/home-assistant/core/pull/140036
[#140039]: https://github.com/home-assistant/core/pull/140039
[#140044]: https://github.com/home-assistant/core/pull/140044
[#140046]: https://github.com/home-assistant/core/pull/140046
[#140047]: https://github.com/home-assistant/core/pull/140047
[#140049]: https://github.com/home-assistant/core/pull/140049
[#140052]: https://github.com/home-assistant/core/pull/140052
[@Bre77]: https://github.com/Bre77
[@Diegorro98]: https://github.com/Diegorro98
[@Ishima]: https://github.com/Ishima
[@IvanLH]: https://github.com/IvanLH
[@Lash-L]: https://github.com/Lash-L
[@MartinHjelmare]: https://github.com/MartinHjelmare
[@bdraco]: https://github.com/bdraco
[@bramkragten]: https://github.com/bramkragten
[@frenck]: https://github.com/frenck
[@hahn-th]: https://github.com/hahn-th
[@jbouwh]: https://github.com/jbouwh
[@joostlek]: https://github.com/joostlek
[@jpbede]: https://github.com/jpbede
[@mib1185]: https://github.com/mib1185
[@peteS-UK]: https://github.com/peteS-UK
[@zxdavb]: https://github.com/zxdavb
## Release 2025.3.2 - March 11
- Don't allow creating backups if Home Assistant is not running ([@emontnemery] - [#139499])
- Bump govee_ble to 0.43.1 ([@moosilauke18] - [#139862])
- Label emergency heat switch ([@jrhillery] - [#139872])
- Bump sense-energy lib to 0.13.7 ([@kbickar] - [#140068])
- Update jinja to 3.1.6 ([@frenck] - [#140069])
- Update evohome-async to 1.0.3 ([@zxdavb] - [#140083])
- Fix HEOS discovery error when previously ignored ([@andrewsayre] - [#140091])
- Map prewash job state in SmartThings ([@joostlek] - [#140097])
- Check support for thermostat operating state in SmartThings ([@joostlek] - [#140103])
- Handle None options in SmartThings ([@joostlek] - [#140110])
- Fix MQTT JSON light not reporting color temp status if color is not supported ([@jbouwh] - [#140113])
- Fix HEOS user initiated setup when discovery is waiting confirmation ([@andrewsayre] - [#140119])
- Support null supported Thermostat modes in SmartThings ([@joostlek] - [#140101])
- Set device class for Oven Completion time in SmartThings ([@joostlek] - [#140139])
- Revert "Check if the unit of measurement is valid before creating the entity" ([@jbouwh] - [#140155])
- Fix the order of the group members attribute of the Music Assistant integration ([@msm595] - [#140204])
- Fix events without user in Bring integration ([@tr4nt0r] - [#140213])
- Log broad exception in Electricity Maps config flow ([@jpbede] - [#140219])
- Bump evohome-async to 1.0.4 to fix #140194 ([@zxdavb] - [#140230])
- Refresh Home Connect token during config entry setup ([@Diegorro98] - [#140233])
- Add 900 RPM option to washer spin speed options at Home Connect ([@Diegorro98] - [#140234])
- Fix todo tool broken with Gemini 2.0 models. ([@Lash-L] - [#140246])
- Fix version not always available in onewire ([@epenet] - [#140260])
- Fix `client_id` not generated when connecting to the MQTT broker ([@jbouwh] - [#140264])
- Bump velbusaio to 2025.3.0 ([@cereal2nd] - [#140267])
- Fix dryer operating state in SmartThings ([@joostlek] - [#140277])
- FGLair : Upgrade to ayla-iot-unofficial 1.4.7 ([@crevetor] - [#140296])
- Bump pyheos to v1.0.3 ([@andrewsayre] - [#140310])
- Bump ZHA to 0.0.52 ([@puddly] - [#140325])
- Bump pydrawise to 2025.3.0 ([@dknowles2] - [#140330])
- Bump teslemetry-stream ([@Bre77] - [#140335])
- Fix no temperature unit in SmartThings ([@joostlek] - [#140363])
- Fix double space quoting in WebDAV ([@jpbede] - [#140364])
- Bump python-roborock to 2.12.2 ([@Lash-L] - [#140368])
- Handle incomplete power consumption reports in SmartThings ([@joostlek] - [#140370])
- Fix browsing Audible Favorites in Sonos ([@PeteRager] - [#140378])
- Make sure SmartThings light can deal with unknown states ([@joostlek] - [#140190])
- Delete subscription on shutdown of SmartThings ([@joostlek] - [#140135])
[#139499]: https://github.com/home-assistant/core/pull/139499
[#139859]: https://github.com/home-assistant/core/pull/139859
[#139862]: https://github.com/home-assistant/core/pull/139862
[#139872]: https://github.com/home-assistant/core/pull/139872
[#140061]: https://github.com/home-assistant/core/pull/140061
[#140068]: https://github.com/home-assistant/core/pull/140068
[#140069]: https://github.com/home-assistant/core/pull/140069
[#140083]: https://github.com/home-assistant/core/pull/140083
[#140091]: https://github.com/home-assistant/core/pull/140091
[#140097]: https://github.com/home-assistant/core/pull/140097
[#140101]: https://github.com/home-assistant/core/pull/140101
[#140103]: https://github.com/home-assistant/core/pull/140103
[#140110]: https://github.com/home-assistant/core/pull/140110
[#140113]: https://github.com/home-assistant/core/pull/140113
[#140119]: https://github.com/home-assistant/core/pull/140119
[#140135]: https://github.com/home-assistant/core/pull/140135
[#140139]: https://github.com/home-assistant/core/pull/140139
[#140155]: https://github.com/home-assistant/core/pull/140155
[#140190]: https://github.com/home-assistant/core/pull/140190
[#140204]: https://github.com/home-assistant/core/pull/140204
[#140213]: https://github.com/home-assistant/core/pull/140213
[#140219]: https://github.com/home-assistant/core/pull/140219
[#140230]: https://github.com/home-assistant/core/pull/140230
[#140233]: https://github.com/home-assistant/core/pull/140233
[#140234]: https://github.com/home-assistant/core/pull/140234
[#140246]: https://github.com/home-assistant/core/pull/140246
[#140260]: https://github.com/home-assistant/core/pull/140260
[#140264]: https://github.com/home-assistant/core/pull/140264
[#140267]: https://github.com/home-assistant/core/pull/140267
[#140277]: https://github.com/home-assistant/core/pull/140277
[#140296]: https://github.com/home-assistant/core/pull/140296
[#140310]: https://github.com/home-assistant/core/pull/140310
[#140325]: https://github.com/home-assistant/core/pull/140325
[#140330]: https://github.com/home-assistant/core/pull/140330
[#140335]: https://github.com/home-assistant/core/pull/140335
[#140363]: https://github.com/home-assistant/core/pull/140363
[#140364]: https://github.com/home-assistant/core/pull/140364
[#140368]: https://github.com/home-assistant/core/pull/140368
[#140370]: https://github.com/home-assistant/core/pull/140370
[#140378]: https://github.com/home-assistant/core/pull/140378
[@Bre77]: https://github.com/Bre77
[@Diegorro98]: https://github.com/Diegorro98
[@Lash-L]: https://github.com/Lash-L
[@PeteRager]: https://github.com/PeteRager
[@andrewsayre]: https://github.com/andrewsayre
[@cereal2nd]: https://github.com/cereal2nd
[@crevetor]: https://github.com/crevetor
[@dknowles2]: https://github.com/dknowles2
[@emontnemery]: https://github.com/emontnemery
[@epenet]: https://github.com/epenet
[@frenck]: https://github.com/frenck
[@jbouwh]: https://github.com/jbouwh
[@joostlek]: https://github.com/joostlek
[@jpbede]: https://github.com/jpbede
[@jrhillery]: https://github.com/jrhillery
[@kbickar]: https://github.com/kbickar
[@moosilauke18]: https://github.com/moosilauke18
[@msm595]: https://github.com/msm595
[@puddly]: https://github.com/puddly
[@tr4nt0r]: https://github.com/tr4nt0r
[@zxdavb]: https://github.com/zxdavb
## Release 2025.3.3 - March 14
- Fix bug with all Roborock maps being set to the wrong map when empty ([@Lash-L] - [#138493])
- Bump pysuezV2 to 2.0.4 ([@jb101010-2] - [#139824])
- Bump upb-lib to 0.6.1 ([@gwww] - [#140212])
- Use only IPv4 for zeroconf in bluesound integration ([@LouisChrist] - [#140226])
- Only do WebDAV path migration when path differs ([@jpbede] - [#140402])
- Bump velbusaio to 2025.3.1 ([@cereal2nd] - [#140443])
- Mark value in number.set_value action as required ([@joostlek] - [#140445])
- Bump Tesla Fleet API to 0.9.13 ([@Bre77] - [#140485])
- Update xknxproject to 3.8.2 ([@farmio] - [#140499])
- Fix Shelly diagnostics for devices without WebSocket Outbound support ([@bieniu] - [#140501])
- Fix windowShadeLevel capability in SmartThings ([@joostlek] - [#140552])
- Set unit of measurement for SmartThings oven setpoint ([@joostlek] - [#140560])
- Fix missing UnitOfPower.MILLIWATT in sensor and number allowed units ([@ashionky] - [#140567])
[#138493]: https://github.com/home-assistant/core/pull/138493
[#139824]: https://github.com/home-assistant/core/pull/139824
[#139859]: https://github.com/home-assistant/core/pull/139859
[#140061]: https://github.com/home-assistant/core/pull/140061
[#140212]: https://github.com/home-assistant/core/pull/140212
[#140226]: https://github.com/home-assistant/core/pull/140226
[#140392]: https://github.com/home-assistant/core/pull/140392
[#140402]: https://github.com/home-assistant/core/pull/140402
[#140443]: https://github.com/home-assistant/core/pull/140443
[#140445]: https://github.com/home-assistant/core/pull/140445
[#140485]: https://github.com/home-assistant/core/pull/140485
[#140499]: https://github.com/home-assistant/core/pull/140499
[#140501]: https://github.com/home-assistant/core/pull/140501
[#140552]: https://github.com/home-assistant/core/pull/140552
[#140560]: https://github.com/home-assistant/core/pull/140560
[#140567]: https://github.com/home-assistant/core/pull/140567
[@Bre77]: https://github.com/Bre77
[@Lash-L]: https://github.com/Lash-L
[@LouisChrist]: https://github.com/LouisChrist
[@ashionky]: https://github.com/ashionky
[@bieniu]: https://github.com/bieniu
[@cereal2nd]: https://github.com/cereal2nd
[@farmio]: https://github.com/farmio
[@frenck]: https://github.com/frenck
[@gwww]: https://github.com/gwww
[@jb101010-2]: https://github.com/jb101010-2
[@joostlek]: https://github.com/joostlek
[@jpbede]: https://github.com/jpbede
## Release 2025.3.4 - March 21
- Fix initial fetch of Home Connect appliance data to handle API rate limit errors ([@Diegorro98] - [#139379])
- Handle API rate limit error on Home Connect entities fetch ([@Diegorro98] - [#139384])
- Album art not available for Sonos media library favorites ([@PeteRager] - [#140557])
- Change max ICP value to fixed value for Wallbox Integration ([@hesselonline] - [#140592])
- Add 700 RPM option to washer spin speed options at Home Connect ([@Diegorro98] - [#140607])
- Handle non documented options at Home Connect select entities ([@Diegorro98] - [#140608])
- Fix optional password in Velbus config flow ([@cereal2nd] - [#140615])
- Make Oven setpoint follow temperature UoM in SmartThings ([@joostlek] - [#140666])
- Fix Elk-M1 missing TLS 1.2 check ([@gwww] - [#140672])
- Bump PySwitchBot to 0.57.1 ([@bdraco] - [#140681])
- Check Celsius in SmartThings oven setpoint ([@joostlek] - [#140687])
- Fix broken core integration Smart Meter Texas by switching it to use HA's SSL Context ([@adamfeldman] - [#140694])
- Don't reload onedrive on options flow ([@zweckj] - [#140712])
- Bump pySmartThings to 2.7.4 ([@joostlek] - [#140720])
- Fix SmartThings ACs without supported AC modes ([@joostlek] - [#140744])
- Bump pylamarzocco to 1.4.9 ([@zweckj] - [#140916])
- Log SmartThings subscription error on exception ([@joostlek] - [#140939])
- Ensure file is correctly uploaded by the GenAI SDK ([@IvanLH] - [#140969])
- Reolink fix playback headers ([@starkillerOG] - [#141015])
- Fix some Home Connect options keys ([@Diegorro98] - [#141023])
- Bump ZHA to 0.0.53 ([@puddly] - [#141025])
- Bump Python-Snoo to 0.6.3 ([@Lash-L] - [#140628])
- Bump python-snoo to 0.6.4 ([@Lash-L] - [#141030])
- Improve Home Connect appliances test fixture ([@MartinHjelmare] - [#139787])
[#139379]: https://github.com/home-assistant/core/pull/139379
[#139384]: https://github.com/home-assistant/core/pull/139384
[#139787]: https://github.com/home-assistant/core/pull/139787
[#139859]: https://github.com/home-assistant/core/pull/139859
[#140061]: https://github.com/home-assistant/core/pull/140061
[#140392]: https://github.com/home-assistant/core/pull/140392
[#140557]: https://github.com/home-assistant/core/pull/140557
[#140583]: https://github.com/home-assistant/core/pull/140583
[#140592]: https://github.com/home-assistant/core/pull/140592
[#140607]: https://github.com/home-assistant/core/pull/140607
[#140608]: https://github.com/home-assistant/core/pull/140608
[#140615]: https://github.com/home-assistant/core/pull/140615
[#140628]: https://github.com/home-assistant/core/pull/140628
[#140666]: https://github.com/home-assistant/core/pull/140666
[#140672]: https://github.com/home-assistant/core/pull/140672
[#140681]: https://github.com/home-assistant/core/pull/140681
[#140687]: https://github.com/home-assistant/core/pull/140687
[#140694]: https://github.com/home-assistant/core/pull/140694
[#140712]: https://github.com/home-assistant/core/pull/140712
[#140720]: https://github.com/home-assistant/core/pull/140720
[#140744]: https://github.com/home-assistant/core/pull/140744
[#140916]: https://github.com/home-assistant/core/pull/140916
[#140939]: https://github.com/home-assistant/core/pull/140939
[#140969]: https://github.com/home-assistant/core/pull/140969
[#141015]: https://github.com/home-assistant/core/pull/141015
[#141023]: https://github.com/home-assistant/core/pull/141023
[#141025]: https://github.com/home-assistant/core/pull/141025
[#141030]: https://github.com/home-assistant/core/pull/141030
[@Diegorro98]: https://github.com/Diegorro98
[@IvanLH]: https://github.com/IvanLH
[@Lash-L]: https://github.com/Lash-L
[@MartinHjelmare]: https://github.com/MartinHjelmare
[@PeteRager]: https://github.com/PeteRager
[@adamfeldman]: https://github.com/adamfeldman
[@bdraco]: https://github.com/bdraco
[@cereal2nd]: https://github.com/cereal2nd
[@frenck]: https://github.com/frenck
[@gwww]: https://github.com/gwww
[@hesselonline]: https://github.com/hesselonline
[@joostlek]: https://github.com/joostlek
[@puddly]: https://github.com/puddly
[@starkillerOG]: https://github.com/starkillerOG
[@zweckj]: https://github.com/zweckj
[#109725]: https://github.com/home-assistant/core/pull/109725
[#116024]: https://github.com/home-assistant/core/pull/116024
[#116452]: https://github.com/home-assistant/core/pull/116452

View File

@ -55,9 +55,13 @@ A card can be added to a dashboard directly [from the view](#to-add-a-card-from-
3. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#showing-or-hiding-a-card-or-badge-conditionally).
4. If you are adding this card to a [sections view](/dashboards/sections/), on the **Layout** tab, you can [resize the card](#resizing-a-card).
5. If you like, define [card actions, features, header and footer widgets](#card-actions-features-header-and-footer-widgets).
5. Customize your card:
- [define card actions](/dashboards/actions/).
- [define header and footer](/dashboards/header-footer/)
- [customize features](/dashboards/features/#customizing-features).
- Not all cards support these elements. Refer to the documentation of the specific card type.
6. Select **Add to dashboard**.
![Screenshot card suggestions](/images/dashboards/dashboard_add-by-entity_04.png)
### To add a card from the device page
@ -81,7 +85,10 @@ This method is useful if you are on the **Device** page and want to create a car
6. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#showing-or-hiding-a-card-or-badge-conditionally).
7. If you are adding this card to a [sections view](/dashboards/sections/), on the **Layout** tab, you can [resize the card](#resizing-a-card).
8. If you like, define [card actions, features, header and footer widgets](#card-actions-features-header-and-footer-widgets).
8. Customize your card:
- [define card actions or header and footer widgets](#card-actions-features-header-and-footer-widgets).
- [define header and footer](/dashboards/header-footer/)
- [customize features](/dashboards/features/#customizing-features).
- Not all cards support these elements. Refer to the documentation of the specific card type.
## Showing or hiding a card or badge conditionally

View File

@ -22,6 +22,25 @@ Features can be enabled on the following cards:
- [Thermostat](/dashboards/thermostat/)
- [Tile](/dashboards/tile/)
## Customizing features
1. Edit the card and open the **Features** section.
2. To add an additional feature to your card, select **Add feature**.
- **Info**: The available options for a feature depend on the entity and type of feature.
- For example, not all entities have a [toggle](#toggle) or a [counter-action](#counter-actions).
3. On tile cards, you can adjust the feature position.
- Under **Features** > **Feature position**, select **Bottom** or **Inline**:
![Screen recording showing how you can now reorder the HVAC modes on the thermostat shown in a tile card.](/images/dashboards/features/tile-card-feature-position.png)
4. Reordering features:
- Some features of the tile card, such as the presets or the HVAC modes of a thermostat, can show buttons.
- To reorder the buttons, enable **Customize** and drag and drop the buttons into position.
- If you don't like the buttons, you can replace them by a **Dropdown** instead.
- Under **Style**, select the **Dropdown** option.
![Screen recording showing how you can now reorder the HVAC modes on the thermostat shown in a tile card.](/images/blog/2024-05/tile-card-reorder-features.gif)
## Alarm modes
Widget that displays buttons to arm and disarm an [alarm](/integrations/alarm_control_panel).

View File

@ -22,7 +22,7 @@ Header and footer can be used on the following cards:
- [Entity](/dashboards/entity/)
- [Entities](/dashboards/entities/)
- [Statistics](/dashboards/statistics/)
- [Statistic](/dashboards/statistic/)
## Picture header & footer

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

View File

@ -23,68 +23,38 @@ regenerate: false
{%- assign components = site.integrations | sort: 'title' -%}
{%- assign components_by_version = site.integrations | group_components_by_release -%}
{%- assign categories = components | map: 'ha_category' | join: ',' | downcase | split: ',' | uniq | sort -%}
{%- assign iot_classes = "Local Push,Local Polling,Cloud Push,Cloud Polling,Assumed State,Calculated,Configurable" |
join: ',' | split: ',' -%}
{% assign quality_scales =
"icon:🏆,name:platinum|icon:🥇,name:gold|icon:🥈,name:silver|icon:🥉,name:bronze|icon:🏠,name:internal|icon:💾,name:legacy"
| split: "|"
%}
<div class="grid">
<div class="grid__item one-fifth lap-one-whole palm-one-whole">
<div class="filter-button-group">
<div class="all">
<a href='#all' class="btn">All <span class="count">{{tot}}</span></a>
<div class="grid__item six-sixths lap-one-whole palm-one-whole">
<fieldset class="integration-filter integration-filter-radio">
<div class="filter-button">
<input type="radio" id="brandsAll" name="brands" value="all" data-id="brands" checked="checked" />
<label for="brandsAll">All</label>
</div>
<div class="featured">
<a href='#featured' class="btn">Featured</a>
<a href='#works-with-home-assistant' class="btn">Partner brands</a>
<div class="filter-button">
<input type="radio" id="brandsFeatured" name="brands" value="featured" data-id="brands" />
<label for="brandsFeatured">Featured</label>
</div>
<div class="version_select">
<label>By release</label>
<select id="versions" name="versions">
<option value="#"></option>
{%- for group in components_by_version -%}
<optgroup label="{{ group.label }} ({{group.new_components_count}})">
{%- for version in group.versions -%}
<option value="#version/{{ version.label }}">{{ version.label }} ({{ version.new_components_count }})
</option>
{%- endfor -%}
</optgroup>
{%- endfor -%}
</select>
<div class="filter-button">
<input type="radio" id="brandsPartners" name="brands" value="partners" data-id="brands" />
<label for="brandsPartners">Partners</label>
</div>
</fieldset>
</div>
<div class="category_list">
<label>By Categories</label>
{%- for category in categories -%}
{%- assign category_name = "" -%}
{%- assign components_count = 0 -%}
{%- for comp in components -%}
{%- assign comp_categories = comp.ha_category | join: ',' | downcase -%}
{%- if comp_categories contains category -%}
{%- if category_name == "" -%}
{%- for cat in comp.ha_category -%}
{%- assign lower_cat = cat | downcase -%}
{%- if lower_cat == category -%}
{%- assign category_name = cat -%}
{%- endif -%}
{%- endfor -%}
{%- endif -%}
{%- assign components_count = components_count | plus: 1 -%}
{%- endif -%}
{%- endfor -%}
{%- if category != 'other' and components_count != 0 -%}
{%- if category_name == "" -%}
{%- assign category_name = category | capitalize -%}
{%- endif -%}
<a href='#{{ category_name | slugify }}' class="btn" onclick="document.querySelector('.page-content').scrollTop = 0">{{ category_name }} <span class="count">{{ components_count }}</span></a>
{%- endif -%}
{%- endfor -%}
<a href='#other' class="btn" onclick="document.querySelector('.page-content').scrollTop = 0">Other <span class="count">{{ components | where: 'ha_category', 'Other' | size }}</span></a>
</div>
<div class="category_select">
<label>By Categories</label>
<select id="categories" name="categories">
<option value="#"></option>
<div class="grid-filters">
<div class="grid__item one-quarter lap-one-whole palm-one-whole">
<div class="integration-filter integration-filter-select">
<h3 class="filter-title">Category</h3>
<select class="ha_category" name="category" data-id="cat">
<option value="#">All</option>
{%- for category in categories -%}
{%- assign category_name = "" -%}
{%- assign components_count = 0 -%}
@ -106,154 +76,341 @@ regenerate: false
{%- if category_name == "" -%}
{%- assign category_name = category | capitalize -%}
{%- endif -%}
<option value="#{{ category_name | slugify }}">{{ category_name }} ({{ components_count }})
</option>
<option value='{{ category | slugify }}'>{{ category_name }}</option>
{%- endif -%}
{%- endfor -%}
<option value="#other">Other ({{ components | where: 'ha_category', 'Other' | size }})
</option>
<option value='other'>Other</option>
</select>
</div>
</div>
<div class="grid__item one-quarter lap-one-whole palm-one-whole">
<div class="integration-filter integration-filter-select">
<h3 class="filter-title">Version</h3>
<select class="ha_category" name="versions" data-id="version">
<option value="#">All</option>
{%- for group in components_by_version -%}
<optgroup label="{{ group.label }} ({{group.new_components_count}})">
{%- for version in group.versions -%}
<option value="{{ version.label }}">{{ version.label }}</option>
{%- endfor -%}
</optgroup>
{%- endfor -%}
</select>
</div>
</div>
<div class="grid__item one-quarter lap-one-whole palm-one-whole">
<div class="integration-filter integration-filter-select">
<h3 class="filter-title">IoT Class</h3>
<select class="ha_category" name="iot_classes" data-id="iot_class">
<option value="#">All</option>
{%- for iot_class in iot_classes -%}
{%- assign iot_class_count = components | where: 'ha_iot_class', iot_class | size -%}
{%- if iot_class_count != 0 -%}
<option value="{{ iot_class | slugify }}">{{ iot_class }}</option>
{%- endif -%}
{%- endfor -%}
</select>
</div>
</div>
<div class="grid__item one-quarter lap-one-whole palm-one-whole">
<div class="integration-filter integration-filter-select">
<h3 class="filter-title">Quality Scale</h3>
<select class="ha_category" name="quality_scales" data-id="quality_scale">
<option value="#">All</option>
{%- for quality_scale in quality_scales -%}
{% assign quality_scale_data = quality_scale | split: "," %}
{% assign quality_icon = quality_scale_data[0] | split: ":" | last %}
{% assign quality_name = quality_scale_data[1] | split: ":" | last %}
{%- assign quality_scale_count = components | where: 'ha_quality_scale', quality_name | size -%}
{%- if quality_scale_count != 0 -%}
<option value="{{ quality_name | slugify }}">{{quality_icon}} {{ quality_name | capitalize }}</option>
{%- endif -%}
{%- endfor -%}
</select>
</div>
</div>
</div>
<div class="grid__item four-fifths lap-one-whole palm-one-whole">
<div class="grid__item six-sixths lap-one-whole palm-one-whole">
<div class="component-search">
<form onsubmit="event.preventDefault(); return false">
<input type="text" name="search" id="search" class="search text-input" placeholder="Search integrations..." autofocus />
<input type="text" name="search" id="search" data-id="search" class="search text-input"
placeholder="Search integrations..." autofocus />
</form>
</div>
</div>
<div class="grid__item six-sixths lap-one-whole palm-one-whole">
<div class="hass-option-cards" id="componentContainer"> </div>
</div>
</div>
<script type="text/javascript">
// This object contains all components we have
const allComponents = [
{%- for component in components -%}
{%- if component.ha_category -%}
{%- assign sliced_version = component.ha_release | split: '.' -%}
{%- assign minor_version = sliced_version[1]|plus: 0 -%}
{%- assign major_version = sliced_version[0]|plus: 0 -%}
{% assign categories = "" | split: ',' %}
{%- for ha_category in component.ha_category -%}
{% capture category %}"{{ ha_category | slugify | downcase }}"{% endcapture %}
{% assign categories = categories | push: category %}
{%- endfor -%}
{url:"{{ component.url }}", title:"{{component.title}}", cat: [{{categories|join: ","}}], featured: {% if component.featured %}true{% else %}false{% endif %}, v: "{{major_version}}.{{minor_version}}", logo: "{{component.logo}}", domain: "{{component.ha_domain}}", ha_brand: "{{component.ha_brand}}", wwha: {% if component.works_with %}true{% else %}false{% endif %}},
{% endif -%}
{%- endfor -%}
false
];
allComponents.pop(); // remove placeholder element at the end
// This object contains all components we have
const integrations = [
{%- for component in components -%}
{%- if component.ha_category -%}
{%- assign sliced_version = component.ha_release | split: '.' -%}
{%- assign minor_version = sliced_version[1] | plus: 0 -%}
{%- assign major_version = sliced_version[0] | plus: 0 -%}
{%- assign categories = "" | split: ',' -%}
{%- for ha_category in component.ha_category -%}
{% capture category %} "{{ ha_category | slugify | downcase }}"{% endcapture %}
{% assign categories = categories | push: category %}
{%- endfor -%}
{
url: "{{ component.url }}",
title: "{{component.title}}",
cat: [{{ categories| join: ","}}],
featured: {{ component.featured }},
version: "{{major_version}}.{{minor_version}}",
logo: "{{component.logo}}",
domain: "{{component.ha_domain}}",
ha_brand: "{{component.ha_brand}}",
wwha: {% if component.works_with %} true{% else %} false{% endif %},
iot_class: "{{component.ha_iot_class | slugify }}",
quality_scale: "{{component.ha_quality_scale}}"
},
{% endif -%}
{%- endfor -%}
false
];
integrations.pop(); // remove placeholder element at the end
</script>
<script type="text/javascript">
(function () {
const SEARCH_PREFIX = '#search/';
const VERSION_PREFIX = '#version/';
let filteredComponents = {};
const baseHashRegex = /(^.*)(?=\?)/;
const integrationSelectFilterElements = [...document.querySelectorAll('.integration-filter select')];
const integrationRadioFilterElements = [...document.querySelectorAll('.integration-filter input[name="brands"]')];
const searchInputEl = document.querySelector('.component-search input');
const componentContainerEl = document.querySelector('#componentContainer');
let searchInputDirty = false;
function init() {
let queryParams = new URLSearchParams(document.location.search);
// do the lowerCase transformation once
for (let component of allComponents) {
const title = component.title.toLowerCase();
const domain = component.domain;
const titleNormalized = title
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "");
const titleDedashed = title.replace(/[-_]/g, " ");
const titleNormalizedDedashed = titleNormalized.replace(/[-_]/g, " ");
for (let i = 0; i < integrations.length; i++) {
const title = integrations[i].title.toLowerCase();
const domain = integrations[i].domain;
const iot_class = integrations[i].iot_class;
const quality_scale = integrations[i].quality_scale;
const title_normalized = title.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
const title_dedashed = title.replace(/[-_]/g, " ");
const title_normalized_dedashed = title_normalized.replace(/[-_]/g, " ");
component.titleLC = title;
component.search = `${title} ${titleNormalized} ${titleDedashed} ${titleNormalizedDedashed} ${domain}`;
integrations[i].titleLC = title;
integrations[i].search = `${title} ${title_normalized} ${title_dedashed} ${title_normalized_dedashed} ${domain} ${iot_class} ${quality_scale}`;
}
// sort the components alphabetically
allComponents.sort((a, b) => a.titleLC.localeCompare(b.titleLC));
integrations.sort(function (a, b) {
return a.titleLC.localeCompare(b.titleLC);
});
if (location.hash !== '' && location.hash.indexOf(SEARCH_PREFIX) === 0) {
// set default value in search from URL
const search = decodeURIComponent(location.hash).substring(SEARCH_PREFIX.length);
searchInputEl.value = search;
//add these to the window for dynamic grabbing in matchFilterElementToQuery()
window.$catFilter = document.querySelector('.integration-filter select[data-id="cat"]');
window.$versionFilter = document.querySelector('.integration-filter select[data-id="version"]');
window.$iot_classFilter = document.querySelector('.integration-filter select[data-id="iot_class"]');
window.$quality_scaleFilter = document.querySelector('.integration-filter select[data-id="quality_scale"]');
window.$searchFilter = document.querySelector('.component-search input');
window.$brandsFilter = [...document.querySelectorAll('.integration-filter input[name="brands"]')]
//listen for changes in the hash / user clicking back or forward button in browser
window.addEventListener('hashchange', applyFilter);
window.addEventListener('popstate', applyFilter);
//on initial page load, if there's no active filters set the default to featured
let query = buildQueryFromURL();
if (query !== null) {
if (Object.keys(query).length === 0) {
setQueryURL('brands', 'featured');
} else {
if (query['brands'] !== 'featured') {
searchInputDirty = true;
}
}
}
applyFilter();
// add focus to the search field
setTimeout(() => searchInputEl.focus(), 1);
}
init();
/**
* filter all components, based on the location's hash and render them into the component box
*/
function applyFilter() {
const hash = location.hash || '';
let components = [];
// get query value pair that matches provided id from url. // for buildQueryFromURL()
function getQueryValue(id) {
let index = id.length + 2; // id + '#' and '/' => '#search/'
if (id === 'cat' || id === 'brands') {
index = 1;
}
// get value from #hash url
let query = decodeURIComponent(location.hash).substring(index).toLowerCase();
// get value from ?query url if it's present
let queryParams = new URLSearchParams(location.search);
if (queryParams.has(id)) {
query = queryParams.get(id);
}
// adjust query for wwha # url
if (query === 'works-with-home-assistant') {
query = 'partners';
}
return query;
}
// build out query object of active filters for applyFilter()
function buildQueryFromURL() {
let queryFilter = {};
let hash = location.hash || '';
let queryParams = new URLSearchParams(location.search);
if (hash.startsWith('#featured') || queryParams.get('brands') === 'featured') {
// only show those with featured = true
let query = getQueryValue('brands');
queryFilter.brands = query;
}
if (hash.startsWith('#works-with-home-assistant') || queryParams.get('brands') === 'partners') {
// only show those with partners = true
let query = getQueryValue('brands');
queryFilter.brands = query;
}
if (hash.startsWith('#search/') || queryParams.has('search')) {
let query = getQueryValue('search');
queryFilter.search = query;
} else {
// reset search box when not searching
$searchFilter.value = '';
}
if (hash.startsWith('#version/') || queryParams.has('version')) {
// filter by a version
let query = getQueryValue('version');
queryFilter.version = query;
}
if (
// check for old # categories urls
(hash.startsWith('#') || queryParams.has("cat"))
&& !(hash.startsWith('#all'))
&& !(hash.startsWith('#featured'))
&& !(hash.startsWith('#works-with-home-assistant'))
&& !(hash.startsWith('#search'))
&& !(hash.startsWith('#version'))
&& !(hash.startsWith('#iot_class'))
&& !(hash.startsWith('#quality_scale'))
) {
// regular filter categories
let query = getQueryValue('cat');
queryFilter.cat = query;
}
if (hash.startsWith('#iot_class/') || queryParams.has('iot_class')) {
let query = getQueryValue('iot_class');
queryFilter.iot_class = query;
}
if (hash.startsWith('#quality_scale/') || queryParams.has('quality_scale')) {
let query = getQueryValue('quality_scale');
queryFilter.quality_scale = query;
}
if (hash.startsWith('#all')) {
queryFilter = null;
}
// filter all components by comparing against query object
return queryFilter;
}
// filter all components, based on the url hash/search query string and render them into the component box
// if a custom query is provided, this will override all current filters, and update the url / elements accordingly
function applyFilter(query = false) {
var data = {
components: []
};
// fade-out css effect on the old elements. This is actually not visible on fast browsers
componentContainerEl.classList.add('remove-items');
if (hash.indexOf('#search/') === -1) {
// reset search box when not searching
searchInputEl.value = null;
// make sure no query exists and its not an event object being passed in
if (!query || query.target) {
query = buildQueryFromURL();
} else {
//set url to custom query filter
overrideQueryURL(query)
}
if (hash === '#all') {
// shortcut: no need to filter
components = allComponents;
} else {
let filter, search;
if (hash.indexOf(SEARCH_PREFIX) === 0) {
// search through title and category
search = decodeURIComponent(hash).substring(SEARCH_PREFIX.length).toLowerCase();
filter = comp =>
comp.search.indexOf(search) !== -1 ||
comp.cat.find((c) => c.includes("#")) != undefined;
// update dom elements to match new filters
updateFilterButtons(query);
updateFilterElements(query);
} else if (hash === '#featured' || hash === '') {
// only show those with featured = true
filter = comp => comp.featured;
data.components = integrations.filter(integration => {
for (let key in query) {
// compare against search string and categories in integration
if (key === 'search') {
if (
integration[key].indexOf(query[key]) === -1
&& integration.cat.find((c) => c.includes(query[key])) == undefined
) {
return false;
}
}
} else if (hash === '#works-with-home-assistant') {
// only show those partners of the Works with Home Assistant program
filter = comp => comp.wwha;
// check for matching categories in integration's category array
if (key === 'cat') {
if (!integration[key].includes(query[key])) return false;
}
} else if (hash.indexOf(VERSION_PREFIX) === 0) {
// compare against a version
search = decodeURIComponent(hash).substring(VERSION_PREFIX.length).toLowerCase();
// compare version string against version js
filter = comp => comp.v === search;
// check for matching featured brands in integration
if (key === 'brands' && query[key] === 'featured') {
if (!(integration['featured'])) return false;
}
} else {
// regular filter categories
search = hash.substring(1);
filter = comp => comp.cat.includes(search);
// check for matching partner brands in integration
if (key === 'brands' && query[key] === 'partners') {
if (!integration['wwha']) return false;
}
// check for version / iot / quality matches
if (!(key === 'cat' || key === 'search' || key === 'brands')) {
if (
integration[key] == undefined // match doesn't exist
|| integration[key] != query[key] // strings dont match
) {
return false;
}
}
}
// filter all components using the filter function
components = allComponents.filter(filter);
}
return true;
});
// let rendered = Mustache.render(template, data);
let rendered;
if (components.length > 0) {
if (data.components.length > 0) {
// Note: Assumes all data has already been sanitized
rendered = components.map(component => `
rendered = data.components.map(component => `
<a href="${component.url}" class="option-card">
<div class="img-container">${buildImageEl(component)}</div>
<div class='title'>${component.title}</div>
</a>
`).join('\n');
} else {
rendered = '<div class="alert alert-note"><p class="alert-content">Nothing found!</p></div>';
}
// set active class on active menu item
document.querySelector('.filter-button-group a.active')?.classList?.remove?.('active');
document.querySelector(`.filter-button-group a[href="${hash}"]`)?.classList?.add?.('active');
if (hash === "") {
document.querySelector('.filter-button-group a[href*="#featured"]').classList.add('active');
rendered = '<div class="alert alert-note"><p class="alert-content">No results matching this filter</p></div>';
}
// remove previous elements and css classes, add the new stuff and then trigger the fade-in css animation
@ -264,6 +421,296 @@ allComponents.pop(); // remove placeholder element at the end
componentContainerEl.classList.add('show-items');
}
// add / update a filter in the url, upated # urls to query string urls
function setQueryURL(id, value) {
const hashExists = location.hash !== '';
let queryParams = new URLSearchParams(location.search);
let query = buildQueryFromURL();
// append new query string
if (hashExists) {
location.hash = '';
if (query !== null) {
let currentId = Object.keys(query)[0];
let currentVal = Object.values(query)[0];
queryParams.set(currentId, currentVal);
}
}
queryParams.set(id, value);
newURL = `?${queryParams.toString()}`;
if ('pushState' in history) {
history.pushState('', '', newURL);
} else {
location.search = newURL;
}
//make sure search input keeps text after url is adjusted
if (queryParams.has('search')) {
let searchText = queryParams.get('search');
$searchFilter.value = searchText;
}
}
//remove a filter in the url
function removeQueryFromURL(queryId) {
const hashExists = location.hash !== '';
let newURL;
const queryParams = new URLSearchParams(location.search);
if (hashExists) {
location.hash = '';
} else {
queryParams.delete(queryId);
if (queryParams.toString() !== '') {
let baseURL = getCleanURL();
newURL = `${baseURL}?${queryParams.toString()}`
} else {
newURL = getCleanURL();
}
}
if ('pushState' in history) {
history.pushState('', '', newURL);
} else {
location.href = newURL;
}
}
//override current url filters with a new custom filter
function overrideQueryURL(query) {
const hashExists = location.hash !== '';
let newURL;
const newSearchParams = new URLSearchParams();
if (hashExists) {
location.hash = '';
}
Object.keys(query).forEach(key => {
newSearchParams.set(key, query[key])
})
if (newSearchParams.toString() !== '') {
let baseURL = getCleanURL();
newURL = `${baseURL}?${newSearchParams.toString()}`
} else {
newURL = getCleanURL();
}
if ('pushState' in history) {
history.pushState('', '', newURL);
} else {
location.href = newURL;
}
}
function getCleanURL() {
const baseUrlRegex = /(^.*)(?=[\?#])/;
let url = '';
let urlMatch = location.href.match(baseUrlRegex);
if (urlMatch !== null) {
url = urlMatch[0];
}
return url;
}
function clearURL() {
history.pushState({}, '', window.location.pathname);
}
//update a specific filter radio / dropdown / search. used in updateFilterElements()
function matchFilterElementToQuery(id, query) {
//dynamically grab select variables
let $filterElement = window[`$${id}Filter`];
if (id === 'search') {
if ($filterElement.value !== query) {
// set value of search input
$filterElement.value = query;
}
} else if (id === 'brands') {
$filterElement.forEach(option => {
if (option.value.trim() === query.trim() && !option.checked) {
option.checked = true;
}
});
} else {
let options = [...$filterElement.querySelectorAll('option')];
//set the value of select dropdown if it doesn't currently match the query in the url
if ($filterElement.value !== query) {
// only change the select dropdown if it matches an available dropdown value
options.forEach(option => {
if (option.value === query) {
$filterElement.value = query;
}
})
}
}
}
// update all filter elements to match current filter obj
function updateFilterElements(queryFilter) {
let filterElements = [...document.querySelectorAll('.integration-filter select, input.search, .integration-filter input')];
let activeFilterElements = filterElements.filter(el => !(el.value === '#' || el.value === '' || (el.id !== 'search' && el.checked === false)));
if (queryFilter === null) {
// resetFilterElements will match elements to query string filter in url
resetFilterElements(activeFilterElements);
return;
}
// clear filters if there's more than the current queryFilter
if (activeFilterElements.length > Object.keys(queryFilter).length) {
// filter out filter elements that don't match query object
let filtersToReset = activeFilterElements.filter(el => {
for (key in queryFilter) {
if (el.getAttribute('data-id') === key) return false;
}
return true;
});
// set filter elements to default 'All' value
resetFilterElements(filtersToReset);
} else {
// update new filters
if (Object.keys(queryFilter).length) {
for (key in queryFilter) {
matchFilterElementToQuery(key, queryFilter[key]);
}
}
}
}
function resetFilterElements(elementArray) {
elementArray.forEach(element => {
let queryId = element.getAttribute('data-id');
if (queryId === 'search') {
matchFilterElementToQuery(queryId, '');
} else if (queryId === 'brands') {
matchFilterElementToQuery(queryId, 'all');
} else {
matchFilterElementToQuery(queryId, '#');
}
});
}
function resetAllFilters() {
clearURL();
applyFilter()
}
// filter button name cleanup. used in updateFilterButtons()
function getButtonText(id, key) {
let category;
switch (id) {
case 'cat':
category = 'Category';
break;
case 'iot_class':
category = 'IoT class';
break;
case 'quality_scale':
category = 'Quality scale';
break;
default:
category = id;
}
if (id !== 'search' && id !== 'brands') {
let $filterElement = window[`$${id}Filter`];
let options = [...$filterElement.querySelectorAll('option')]
let filteredOption = options.filter(option => option.value === key)[0];
if (filteredOption) {
return `${category}: ${filteredOption.innerText}`;
} else {
return `${category}: Not Found`;
}
} else {
return `${category}: ${key}`;
}
}
// update all filter buttons to match current obj filter
function updateFilterButtons(queryFilter) {
let filterButtonParent = document.querySelector('.component-search');
let currentFilterButtons = [...document.querySelectorAll('.component-search .active-filter')];
if (queryFilter === null) {
currentFilterButtons.forEach(button => button.remove());
return;
}
// update text of buttons if filter value has changed
updateFilterButtonsText(currentFilterButtons, queryFilter);
// create a filter button if missing for current filter
createFilterButtons(filterButtonParent, queryFilter)
// remove buttons that don't match current filter
if (currentFilterButtons.length >= Object.keys(queryFilter).length) {
// filter out buttons that don't match query obj
removeFilterButtons(currentFilterButtons, queryFilter)
}
}
// update text of buttons if filter value has changed // used in updateFilterButtons
function updateFilterButtonsText(buttons, query) {
buttons.forEach(button => {
for (key in query) {
if (button.dataset.id === key) {
// check for mismatched filter value
if (button.dataset.filter !== query[key]) {
button.dataset.filter = query[key];
button.innerHTML = `<span>${getButtonText(key, query[key])} <iconify-icon icon="mdi:close-circle"></iconify-icon></span>`;
}
}
}
});
}
// create a filter button if it's missing from current applied filter // used in updateFilterButtons
function createFilterButtons(buttonParent, query) {
for (key in query) {
if (document.querySelector(`.component-search .active-filter[data-id="${key}"]`) === null) {
let button = document.createElement('button');
button.innerHTML = `<span>${getButtonText(key, query[key])} <iconify-icon icon="mdi:close-circle"></iconify-icon></span>`;
button.classList.add('active-filter');
button.dataset.id = key;
button.dataset.filter = query[key]
// add click listener to button to remove filter
button.addEventListener('click', function () {
removeQueryFromURL(this.dataset.id);
applyFilter();
// remove event listener after click
}, { once: true });
//add button to the dom
buttonParent.appendChild(button);
}
}
}
// remove buttons that don't match current filter // used in updateFilterButtons
function removeFilterButtons(buttons, query) {
let buttonsToRemove = buttons.filter(button => {
for (key in query) {
if (button.dataset.id === key) {
return false;
}
}
return true;
});
buttonsToRemove.forEach(button => button.remove());
}
function buildImageEl(component) {
const urlBase = [
'https://brands.home-assistant.io',
@ -275,28 +722,39 @@ allComponents.pop(); // remove placeholder element at the end
return `<img src="${urlBase}.png" srcset="${urlBase}@2x.png 2x" loading="lazy">`;
}
// update view by filter selection
for (let filterLink of document.querySelectorAll('.filter-button-group a')) {
filterLink.addEventListener('click', () => {
history.pushState('', '', filterLink.getAttribute('href'));
applyFilter();
return false;
});
}
// update view on select change
const versionsEl = document.getElementById('versions');
versionsEl.addEventListener('change', () => {
history.pushState('', '', versionsEl.value);
applyFilter();
});
integrationSelectFilterElements.forEach(select => select.addEventListener("change", () => {
let id = select.dataset.id;
let value = select.value;
const categoriesEl = document.getElementById('categories');
categoriesEl.addEventListener('change', () => {
history.pushState('', '', categoriesEl.value);
applyFilter();
});
if (value !== '#') {
setQueryURL(id, value);
} else {
// clear current filter
removeQueryFromURL(id);
}
applyFilter();
return false;
}));
// update view on radio change
integrationRadioFilterElements.forEach(radioInput => radioInput.addEventListener("click", () => {
let id = radioInput.name;
let value = radioInput.value;
if (radioInput.checked && value !== 'all') {
//clear all current filters, append new brand filter selection
applyFilter({ 'brands': value });
} else if (radioInput.checked && value === 'all') {
// clear current filter
removeQueryFromURL(id);
applyFilter();
}
return false;
}))
/**
* Simple debounce implementation
*/
@ -310,25 +768,30 @@ allComponents.pop(); // remove placeholder element at the end
// update view by search text
let lastSearchText = '';
searchInputEl.addEventListener('keyup', debounce(() => {
const text = searchInputEl.value
searchInputEl.addEventListener('input', debounce(() => {
let value = searchInputEl.value
.toLowerCase()
// sanitize input
.replace(/[(\?|\&\{\}\(\))]/gi, '')
.trim();
if (typeof value === "string" && value.length >= 1) {
if (!searchInputDirty) {
resetAllFilters();
searchInputDirty = true;
}
// Only apply filter if value has changed
if (lastSearchText !== text) {
lastSearchText = text;
const newHash = typeof text === "string" && text.length >= 1
? SEARCH_PREFIX + text
: '#all';
history.pushState('', '', newHash);
if (value !== lastSearchText) {
lastSearchText = value;
setQueryURL('search', value);
applyFilter();
}
}
else {
removeQueryFromURL('search');
applyFilter();
}
}, 500));
window.addEventListener('hashchange', applyFilter);
applyFilter();
})();
</script>

View File

@ -66,87 +66,86 @@ Assist aims to support more languages than other voice assistants, but this is s
<div class="input-wrapper">
<select id="language-select">
<option data-display="Select">Choose your language</option>
<option value="en-US">English</option>
<option value="es-ES">Spanish</option>
<option value="pt-BR">Portuguese</option>
<option value="de-DE">German</option>
<option value="it-IT">Italian</option>
<option value="ru-RU">Russian</option>
<option value="ja-JP">Japanese</option>
<option value="tr-TR">Turkish</option>
<option value="ko-KR">Korean</option>
<option value="fr-FR">French</option>
<option value="af-ZA">Afrikaans</option>
<option value="sq-AL">Albanian</option>
<option value="am-ET">Amharic</option>
<option value="ar-JO">Arabic</option>
<option value="hy-AM">Armenian</option>
<option value="az-AZ">Azerbaijani</option>
<option value="eu-ES">Basque</option>
<option value="bn-IN">Bengali</option>
<option value="bs-BA">Bosnian</option>
<option value="bg-BG">Bulgarian</option>
<option value="my-MM">Burmese</option>
<option value="yue-CN">Cantonese</option>
<option value="ca-ES">Catalan</option>
<option value="pl-PL">Polish</option>
<option value="nl-BE">Dutch</option>
<option value="id-ID">Indonesian</option>
<option value="zh-HK">Chinese (Cantonese)</option>
<option value="zh-CN">Chinese (Mandarin)</option>
<option value="ms-MY">Malay</option>
<option value="sv-SE">Swedish</option>
<option value="uk-UA">Ukrainian</option>
<option value="th-TH">Thai</option>
<option value="vi-VN">Vietnamese</option>
<option value="fi-FI">Finnish</option>
<option value="no-NO">Norwegian</option>
<option value="gl-ES">Galician</option>
<option value="ar-JO">Arabic</option>
<option value="ur-IN">Urdu</option>
<option value="el-GR">Greek</option>
<option value="ro-RO">Romanian</option>
<option value="da-DK">Danish</option>
<option value="ta-IN">Tamil</option>
<option value="hr-HR">Croatian</option>
<option value="mk-MK">Macedonian</option>
<option value="sk-SK">Slovak</option>
<option value="he-IL">Hebrew</option>
<option value="sr-RS">Serbian</option>
<option value="hu-HU">Hungarian</option>
<option value="bg-BG">Bulgarian</option>
<option value="cs-CZ">Czech</option>
<option value="bs-BA">Bosnian</option>
<option value="sl-SI">Slovenian</option>
<option value="az-AZ">Azerbaijani</option>
<option value="da-DK">Danish</option>
<option value="nl-BE">Dutch</option>
<option value="en-US">English</option>
<option value="et-EE">Estonian</option>
<option value="lv-LV">Latvian</option>
<option value="af-ZA">Afrikaans</option>
<option value="cy-GB">Welsh</option>
<option value="fa-IR">Persian</option>
<option value="lt-LT">Lithuanian</option>
<option value="fil-PH">Filipino</option>
<option value="fi-FI">Finnish</option>
<option value="fr-FR">French</option>
<option value="gl-ES">Galician</option>
<option value="ka-GE">Georgian</option>
<option value="de-DE">German</option>
<option value="el-GR">Greek</option>
<option value="gu-IN">Gujarati</option>
<option value="he-IL">Hebrew</option>
<option value="hi-IN">Hindi</option>
<option value="hu-HU">Hungarian</option>
<option value="is-IS">Icelandic</option>
<option value="id-ID">Indonesian</option>
<option value="ga-IE">Irish</option>
<option value="it-IT">Italian</option>
<option value="ja-JP">Japanese</option>
<option value="jv-ID">Javanese</option>
<option value="kn-IN">Kannada</option>
<option value="kk-KZ">Kazakh</option>
<option value="km-KH">Khmer</option>
<option value="ko-KR">Korean</option>
<option value="lo-LA">Lao</option>
<option value="lv-LV">Latvian</option>
<option value="lt-LT">Lithuanian</option>
<option value="lb-LU">Luxembourgish</option>
<option value="mk-MK">Macedonian</option>
<option value="ms-MY">Malay</option>
<option value="ml-IN">Malayalam</option>
<option value="mt-MT">Maltese</option>
<option value="mr-IN">Marathi</option>
<option value="mn-MN">Mongolian</option>
<option value="ne-NP">Nepali</option>
<option value="nb-NO">Norwegian Bokmål</option>
<option value="ps-AF">Pashto</option>
<option value="fa-IR">Persian</option>
<option value="pl-PL">Polish</option>
<option value="pt-BR">Portuguese</option>
<option value="ro-RO">Romanian</option>
<option value="ru-RU">Russian</option>
<option value="sr-RS">Serbian</option>
<option value="wuu-CN">Shanghainese</option>
<option value="si-LK">Sinhala</option>
<option value="sk-SK">Slovak</option>
<option value="sl-SI">Slovenian</option>
<option value="so-SO">Somali</option>
<option value="es-ES">Spanish</option>
<option value="su-ID">Sundanese</option>
<option value="sw-KE">Swahili</option>
<option value="sw-TZ">Swahili</option>
<option value="is-IS">Icelandic</option>
<option value="mt-MT">Maltese</option>
<option value="ps-AF">Pashto</option>
<option value="mr-IN">Marathi</option>
<option value="bn-IN">Bengali</option>
<option value="lb-LU">Luxembourgish</option>
<option value="hi-IN">Hindi</option>
<option value="gu-IN">Gujarati</option>
<option value="km-KH">Khmer</option>
<option value="ne-NP">Nepali</option>
<option value="lo-LA">Lao</option>
<option value="sv-SE">Swedish</option>
<option value="ta-IN">Tamil</option>
<option value="te-IN">Telugu</option>
<option value="kn-IN">Kannada</option>
<option value="ml-IN">Malayalam</option>
<option value="kk-KZ">Kazakh</option>
<option value="so-SO">Somali</option>
<option value="th-TH">Thai</option>
<option value="tr-TR">Turkish</option>
<option value="uk-UA">Ukrainian</option>
<option value="ur-IN">Urdu</option>
<option value="uz-UZ">Uzbek</option>
<option value="ka-GE">Georgian</option>
<option value="my-MM">Burmese</option>
<option value="mn-MN">Mongolian</option>
<option value="hy-AM">Armenian</option>
<option value="am-ET">Amharic</option>
<option value="nb-NO">Norwegian Bokmål</option>
<option value="eu-ES">Basque</option>
<option value="fil-PH">Filipino</option>
<option value="ga-IE">Irish</option>
<option value="si-LK">Sinhala</option>
<option value="sq-AL">Albanian</option>
<option value="su-ID">Sundanese</option>
<option value="wuu-CN">Shanghainese</option>
<option value="yue-CN">Cantonese</option>
<option value="vi-VN">Vietnamese</option>
<option value="cy-GB">Welsh</option>
<option value="zu-ZA">Zulu</option>
</select>
</div>
@ -411,87 +410,86 @@ function registerLanguageSelectChange() {
function updateLanguageSupports(locale = null) {
let data = {
"af-ZA": [0, 0],
"am-ET": [0, 0],
"ar-JO": [0, 2],
"az-AZ": [0, 0],
"bg-BG": [0, 2],
"bn-IN": [0, 0],
"bs-BA": [0, 0],
"ca-ES": [0, 3],
"cs-CZ": [0, 1],
"cy-GB": [0, 0],
"da-DK": [0, 2],
"de-DE": [3, 3],
"el-GR": [0, 1],
"en-US": [3, 3],
"es-ES": [3, 3],
"pt-BR": [3, 3],
"de-DE": [3, 3],
"it-IT": [2, 2],
"ru-RU": [2, 2],
"ja-JP": [0, 0],
"tr-TR": [0, 1],
"ko-KR": [0, 1],
"fr-FR": [0, 3],
"ca-ES": [0, 3],
"pl-PL": [0, 3],
"nl-BE": [0, 3],
"id-ID": [0, 1],
"zh-HK": [0, 2],
"zh-CN": [0, 1],
"ms-MY": [0, 1],
"sv-SE": [0, 2],
"uk-UA": [0, 2],
"th-TH": [0, 1],
"vi-VN": [0, 1],
"fi-FI": [0, 3],
"no-NO": [0, 0],
"gl-ES": [0, 2],
"ar-JO": [0, 2],
"ur-IN": [0, 0],
"el-GR": [0, 1],
"ro-RO": [0, 3],
"da-DK": [0, 2],
"ta-IN": [0, 0],
"hr-HR": [0, 3],
"mk-MK": [0, 0],
"sk-SK": [0, 1],
"he-IL": [0, 2],
"sr-RS": [0, 1],
"hu-HU": [0, 3],
"bg-BG": [0, 2],
"cs-CZ": [0, 1],
"bs-BA": [0, 0],
"sl-SI": [0, 2],
"az-AZ": [0, 0],
"et-EE": [0, 1],
"lv-LV": [0, 1],
"af-ZA": [0, 0],
"cy-GB": [0, 0],
"eu-ES": [0, 1],
"fa-IR": [0, 1],
"lt-LT": [0, 1],
"fi-FI": [0, 3],
"fil-PH": [0, 0],
"fr-FR": [0, 3],
"ga-IE": [0, 0],
"gl-ES": [0, 2],
"gu-IN": [0, 0],
"he-IL": [0, 2],
"hi-IN": [0, 0],
"hr-HR": [0, 3],
"hu-HU": [0, 3],
"hy-AM": [0, 0],
"id-ID": [0, 1],
"is-IS": [0, 1],
"it-IT": [2, 2],
"ja-JP": [0, 0],
"jv-ID": [0, 0],
"ka-GE": [0, 1],
"kk-KZ": [0, 0],
"km-KH": [0, 0],
"kn-IN": [0, 0],
"ko-KR": [0, 1],
"lb-LU": [0, 0],
"lo-LA": [0, 0],
"lt-LT": [0, 1],
"lv-LV": [0, 1],
"mk-MK": [0, 0],
"ml-IN": [0, 1],
"mn-MN": [0, 0],
"mr-IN": [0, 0],
"ms-MY": [0, 1],
"mt-MT": [0, 0],
"my-MM": [0, 0],
"nb-NO": [0, 3],
"ne-NP": [0, 0],
"nl-BE": [0, 3],
"pl-PL": [0, 3],
"ps-AF": [0, 0],
"pt-BR": [3, 3],
"ro-RO": [0, 3],
"ru-RU": [2, 2],
"si-LK": [0, 0],
"sk-SK": [0, 1],
"sl-SI": [0, 2],
"so-SO": [0, 0],
"sq-AL": [0, 0],
"sr-RS": [0, 1],
"su-ID": [0, 0],
"sv-SE": [0, 2],
"sw-KE": [0, 0],
"sw-TZ": [0, 0],
"is-IS": [0, 1],
"mt-MT": [0, 0],
"ps-AF": [0, 0],
"mr-IN": [0, 0],
"bn-IN": [0, 0],
"lb-LU": [0, 0],
"hi-IN": [0, 0],
"gu-IN": [0, 0],
"km-KH": [0, 0],
"ne-NP": [0, 0],
"lo-LA": [0, 0],
"ta-IN": [0, 0],
"te-IN": [0, 1],
"kn-IN": [0, 0],
"ml-IN": [0, 1],
"kk-KZ": [0, 0],
"so-SO": [0, 0],
"th-TH": [0, 1],
"tr-TR": [0, 1],
"uk-UA": [0, 2],
"ur-IN": [0, 0],
"uz-UZ": [0, 0],
"ka-GE": [0, 1],
"my-MM": [0, 0],
"mn-MN": [0, 0],
"hy-AM": [0, 0],
"am-ET": [0, 0],
"nb-NO": [0, 3],
"eu-ES": [0, 1],
"fil-PH": [0, 0],
"ga-IE": [0, 0],
"si-LK": [0, 0],
"sq-AL": [0, 0],
"su-ID": [0, 0],
"vi-VN": [0, 1],
"wuu-CN": [0, 0],
"yue-CN": [0, 0],
"zh-CN": [0, 1],
"zh-HK": [0, 2],
"zu-ZA": [0, 0]
};