-
- Screenshot of the area card.
+
+ Screenshot of the area cards.
{% include dashboard/edit_dashboard.md %}
@@ -42,14 +40,18 @@ area:
required: true
description: ID of the `area`.
type: string
-show_camera:
+color:
required: false
- description: Changes the area picture to a live feed of the camera set for the area.
- type: boolean
- default: false
+ description: Set the color for the icon and the hover/focus state. It accepts [color token](/dashboards/area/#available-colors) or hex color code.
+ type: string
+display_type:
+ required: false
+ description: Defines the card's display style. Options include `compact` (a minimal layout), `icon` (shows an area icon), `picture` (displays an image of the area), or `camera` (shows the live camera feed).
+ type: string
+ default: "picture"
camera_view:
required: false
- description: 'If showing a camera, "live" will show the live view if `stream` is enabled.'
+ description: 'If showing a camera, `live` will show the live view if `stream` is enabled.'
default: auto
type: string
aspect_ratio:
@@ -61,20 +63,29 @@ navigation_path:
required: false
description: link to view. For more information about views, see the [view documentation](/dashboards/views/)
type: string
-theme:
- required: false
- description: Override the used theme for this card with any loaded theme. For more information about themes, see the [frontend documentation](/integrations/frontend/).
- type: string
alert_classes:
required: false
type: list
default: "moisture, motion"
- description: A list of binary sensor device classes which will populate alert icons in the card when the state is on.
+ description: A list of binary sensor device classes which will populate alert icons in the card when the state is on. If the display type is set to `compact`, only the first alert icon will be displayed.
sensor_classes:
required: false
type: list
default: "temperature, humidity"
- description: A list of sensor device classes which will display their averaged sensor readings for the area.
+ description: A list of sensor device classes which will display their averaged sensor readings for the area.
+features:
+ required: false
+ description: Additional widgets to control entities in the area. See [available features](/dashboards/features).
+ type: list
+features_position:
+ required: false
+ description: Position of the features on the area card. Can be `bottom` or `inline`. Only the first feature will be displayed when the option is set to `inline`.
+ type: string
+ default: bottom
+exclude_entities:
+ required: false
+ description: A list of entities that will be excluded from the card. It will affect sensor_classes, alert_classes, and features.
+ type: list
{% endconfiguration %}
### Example
@@ -91,7 +102,18 @@ Complex example
```yaml
type: area
area: bedroom
+display_type: picture
navigation_path: my_bedroom
-show_camera: true
-theme: green
+sensor_classes:
+ - temperature
+ - humidity
+alert_classes:
+ - moisture
+ - motion
+features:
+ - type: area-controls
```
+
+## Available colors
+
+You want to colorize the area 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`.
diff --git a/source/_dashboards/light.markdown b/source/_dashboards/light.markdown
index 006bb3ccc82..55c78f601f8 100644
--- a/source/_dashboards/light.markdown
+++ b/source/_dashboards/light.markdown
@@ -2,7 +2,7 @@
type: card
title: "Light card"
sidebar_label: Light
-description: "The light card allows you to change the brightness of the light."
+description: "The light card allows you to change the brightness of a light."
related:
- docs: /dashboards/actions/
title: Card actions
@@ -12,7 +12,7 @@ related:
title: Dashboard cards
---
-The light card allows you to change the brightness of the light.
+The light card allows you to change the brightness of a light.
diff --git a/source/_dashboards/sensor.markdown b/source/_dashboards/sensor.markdown
index ae181701ce7..8536531bac8 100644
--- a/source/_dashboards/sensor.markdown
+++ b/source/_dashboards/sensor.markdown
@@ -2,7 +2,7 @@
type: card
title: "Sensor card"
sidebar_label: Sensor
-description: "The sensor card gives you a quick overview of your sensors state with an optional graph to visualize change over time."
+description: "The sensor card gives you a quick overview of a sensor's state with an optional graph to visualize change over time."
related:
- docs: /integrations/frontend/
title: Themes
@@ -10,7 +10,7 @@ related:
title: Dashboard cards
---
-The sensor card gives you a quick overview of your sensors state with an optional graph to visualize change over time.
+The sensor card gives you a quick overview of a sensor's state with an optional graph to visualize change over time.
diff --git a/source/_dashboards/tile.markdown b/source/_dashboards/tile.markdown
index f64909d7e11..7974ecaa559 100644
--- a/source/_dashboards/tile.markdown
+++ b/source/_dashboards/tile.markdown
@@ -2,7 +2,7 @@
type: card
title: "Tile card"
sidebar_label: Tile
-description: "The tile card gives you a quick overview of your entity. The card allows you to toggle the entity, show the more-info dialog, or custom actions."
+description: "The tile card gives you a quick overview of an entity. The card allows you to toggle the entity, show the more-info dialog, or custom actions."
related:
- docs: /dashboards/actions/
title: Card actions
@@ -12,7 +12,7 @@ related:
title: Dashboard cards
---
-The tile card gives you a quick overview of your {% term entity %}. The card allows you to add tap actions, and features to control the entity. You can also select the {% term entity %} to open the more info dialog. A badge is shown for some {% term entities %} like the [climate](/integrations/climate) or [person](/integrations/person) {% term entities %}.
+The tile card gives you a quick overview of an {% term entity %}. The card allows you to add tap actions, and features to control the entity. You can also select the {% term entity %} to open the more info dialog. A badge is shown for some {% term entities %} like the [climate](/integrations/climate) or [person](/integrations/person) {% term entities %}.
diff --git a/source/_dashboards/weather-forecast.markdown b/source/_dashboards/weather-forecast.markdown
index 1f9b40edb8e..3079773a75b 100644
--- a/source/_dashboards/weather-forecast.markdown
+++ b/source/_dashboards/weather-forecast.markdown
@@ -61,6 +61,11 @@ name:
description: Overwrites the friendly name.
type: string
default: Entity name
+show_current:
+ required: false
+ description: Show the current weather conditions above the forecast.
+ type: boolean
+ default: true
show_forecast:
required: false
description: Show next hours/days forecast.
@@ -70,7 +75,6 @@ forecast_type:
required: true
description: Type of forecast to display, one of `daily`, `hourly` or `twice_daily`.
type: string
- default: Automatically selects in order of `daily`, `hourly` and `twice_daily`.
secondary_info_attribute:
required: false
description: Which attribute to display under the temperature.
diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown
index a2bf1ede505..b50e46d9f6a 100644
--- a/source/_docs/authentication/providers.markdown
+++ b/source/_docs/authentication/providers.markdown
@@ -161,7 +161,7 @@ Assuming you have only the owner created though onboarding process, no other use
The command line auth provider executes a configurable shell command to perform user authentication. Two environment variables, `username` and `password`, are passed to the command. Access is granted when the command exits successfully (with exit code 0).
-This provider can be used to integrate Home Assistant with arbitrary external authentication services, from plaintext databases over LDAP to RADIUS. A compatible script for LDAP authentication is [this one](https://github.com/bob1de/ldap-auth-sh), for instance. Please note, this will only work when using the Home Assistant Core installation type.
+This provider can be used to integrate Home Assistant with arbitrary external authentication services, from plaintext databases over LDAP to RADIUS.
Here is a configuration example:
diff --git a/source/_docs/automation/templating.markdown b/source/_docs/automation/templating.markdown
index dd6de68240e..0b6d054283e 100644
--- a/source/_docs/automation/templating.markdown
+++ b/source/_docs/automation/templating.markdown
@@ -1,30 +1,37 @@
---
-title: "Automation trigger variables"
-description: "List all available variables made available by triggers."
+title: "Automation Templates"
+description: "List all trigger variables available to templates."
---
-Automations support [templating](/docs/configuration/templating/) in the same way as scripts do. In addition to the [Home Assistant template extensions](/docs/configuration/templating/#home-assistant-template-extensions) available to scripts, the `trigger` and `this` template variables are available.
+Automations support the advanced features of [templating](/docs/configuration/templating/) in the same way as scripts do. In addition to the [Home Assistant template extensions](/docs/configuration/templating/#home-assistant-template-extensions) available to scripts, the `trigger` and `this` template variables are available for automations.
-The template variable `this` is also available when evaluating any `trigger_variables` declared in the configuration.
+Example of variables used in templates:
-## Available `this` data
+```jinja
+ {{ this.name }} is the name of the automation executing from this trigger
+ {{ trigger.platform }} is the type of trigger object, like `calendar`
+ ```
-The variable `this` is the [state object](/docs/configuration/state_object) of the automation at the moment of triggering the actions. State objects also contain context data which can be used to identify the user that caused a {% term script %} or {% term automation %} to execute. Note that `this` will not change while executing the {% term actions %}.
+## Available state data
+
+The template variable `this` is an object that contains the [state](/docs/configuration/state_object) of the automation at the moment of triggering the actions and can be used to evaluate [`trigger_variables`](/docs/automation/trigger/#trigger-variables) declared in the configuration of the active {% term trigger %}.
+State objects also contain context data which can be used to identify the user that caused a {% term script %} or {% term automation %} to execute. Note that `this` will not change while executing the {% term actions %}.
## Available trigger data
-The variable `trigger` is an object that contains details about which {% term trigger %} triggered the automation.
+The template variable `trigger` is an object that contains details about which {% term platform %} triggered the automation. The `platform` property contains the name of the {% term platform %} whose event triggered the automation.
Templates can use the data to modify the actions performed by the automation or displayed in a message. For example, you could create an automation that multiple sensors can trigger and then use the sensor's location to specify a light to activate; or you could send a notification containing the friendly name of the sensor that triggered it.
-Each [trigger platform](/docs/automation/trigger/#event-trigger) can include additional data specific to that platform.
+Each [trigger](/docs/automation/trigger/#event-trigger) platform includes additional data specific to that {% term platform %}.
### All
-Triggers from all platforms will include the following data.
+Triggers from all platforms will include the following properties.
| Template variable | Data |
| ---- | ---- |
+| `trigger.platform` | Trigger object type.
| `trigger.alias` | Alias of the trigger.
| `trigger.id` | The [`id` of the trigger](/docs/automation/trigger/#trigger-id).
| `trigger.idx` | Index of the trigger. (The first trigger idx is `0`.)
@@ -33,18 +40,18 @@ Triggers from all platforms will include the following data.
These are the properties available for a [Calendar trigger](/docs/automation/trigger/#calendar-trigger).
-| Template variable | Data |
-| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
-| `trigger.platform` | Hardcoded: `calendar` |
-| `trigger.event` | The trigger event type, either `start` or `end` |
-| `trigger.calendar_event` | The calendar event object matched. |
-| `trigger.calendar_event.summary` | The title or summary of the calendar event. |
-| `trigger.calendar_event.start` | String representation of the start date or date time of the calendar event e.g. `2022-04-10`, or `2022-04-10 11:30:00-07:00` |
-| `trigger.calendar_event.end` | String representation of the end time of date time the calendar event in UTC e.g. `2022-04-11`, or `2022-04-10 11:45:00-07:00` |
-| `trigger.calendar_event.all_day` | Indicates the event spans the entire day. |
-| `trigger.calendar_event.description` | A detailed description of the calendar event, if available. |
-| `trigger.calendar_event.location` | Location information for the calendar event, if available. |
-| `trigger.offset` | Timedelta object with offset to the event, if any |
+| Template variable | Data |
+| ---- | ---- |
+| `trigger.platform` | Hardcoded: `calendar`
+| `trigger.event` | The trigger event type, either `start` or `end`.
+| `trigger.calendar_event` | The calendar event object matched.
+| `trigger.calendar_event.summary` | The title or summary of the calendar event.
+| `trigger.calendar_event.start` | String representation of the start date or date time of the calendar event e.g. `2022-04-10`, or `2022-04-10 11:30:00-07:00`
+| `trigger.calendar_event.end` | String representation of the end time of date time the calendar event in UTC e.g. `2022-04-11`, or `2022-04-10 11:45:00-07:00`
+| `trigger.calendar_event.all_day` | Indicates the event spans the entire day.
+| `trigger.calendar_event.description` | A detailed description of the calendar event, if available.
+| `trigger.calendar_event.location` | Location information for the calendar event, if available.
+| `trigger.offset` | Timedelta object with offset to the event, if any.
### Device
@@ -54,18 +61,42 @@ Inherites template variables from [event](#event) or [state](#state) template ba
| Template variable | Data |
| ---- | ---- |
-| `trigger.platform` | Hardcoded: `device`.
+| `trigger.platform` | Hardcoded: `device`
### Event
-These are the properties available for a [Event trigger](/docs/automation/trigger/#event-trigger).
+An [Event](/docs/configuration/events/) trigger is fired each time an {% term entity %} state changes or an event matching the configured event_type occurs.
+
+These are the properties available for an [Event trigger](/docs/automation/trigger/#event-trigger).
| Template variable | Data |
| ---- | ---- |
-| `trigger.platform` | Hardcoded: `event`.
-| `trigger.event` | Event object that matched.
+| `trigger.platform` | Hardcoded: `event`
+| `trigger.event` | Event object that matched.
| `trigger.event.event_type` | Event type.
-| `trigger.event.data` | Optional event data.
+| `trigger.event.data` | Optional event data.
+
+### Geolocation
+
+These are the properties available for a [Geolocation trigger](/docs/automation/trigger/#geolocation-trigger).
+
+| Template variable | Data |
+| ---- | ---- |
+| `trigger.platform` | Hardcoded: `geo_location`
+| `trigger.event` | The trigger event type, either `enter` or `leave`.
+| `trigger.source` | The Geolocation platform creating the trigger event.
+| `trigger.zone` | State object of the zone.
+
+### Home Assistant
+
+The Home Assistant trigger is recommended for automations instead of [homeassistant_start or homeassistant_stop events](/docs/configuration/events/#homeassistant_start-homeassistant_started).
+
+These are the properties available for a [Home Assistant trigger](/docs/automation/trigger/#home-assistant-trigger).
+
+| Template variable | Data |
+| ---- | ---- |
+| `trigger.platform` | Hardcoded: `homeassistant`
+| `trigger.event` | The trigger event type, either `start` or `shutdown`.
### MQTT
@@ -73,7 +104,7 @@ These are the properties available for a [MQTT trigger](/docs/automation/trigger
| Template variable | Data |
| ---- | ---- |
-| `trigger.platform` | Hardcoded: `mqtt`.
+| `trigger.platform` | Hardcoded: `mqtt`
| `trigger.topic` | Topic that received payload.
| `trigger.payload` | Payload.
| `trigger.payload_json` | Dictionary of the JSON parsed payload.
@@ -100,9 +131,9 @@ These are the properties available for a [Sentence trigger](/docs/automation/tri
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `conversation`
-| `trigger.sentence` | Text of the sentence that was matched
-| `trigger.slots` | Object with matched slot values
-| `trigger.details` | Object with matched slot details by name, such as [wildcards](/docs/automation/trigger/#sentence-wildcards). Each detail contains:
`name` - name of the slot
`text` - matched text
`value` - output value (see [lists](https://developers.home-assistant.io/docs/voice/intent-recognition/template-sentence-syntax/#lists))
+| `trigger.sentence` | Text of the sentence that was matched.
+| `trigger.slots` | Object with matched slot values.
+| `trigger.details` | Object with matched slot details by name, such as [wildcards](/docs/automation/trigger/#sentence-wildcards). Each detail contains:
`name` - name of the slot
`text` - matched text
`value` - output value (see [lists](/docs/voice/intent-recognition/template-sentence-syntax/#lists))
.
| `trigger.device_id` | The device ID that captured the command, if any.
### State
@@ -127,6 +158,16 @@ These are the properties available for a [Sun trigger](/docs/automation/trigger/
| `trigger.event` | The event that just happened: `sunset` or `sunrise`.
| `trigger.offset` | Timedelta object with offset to the event, if any.
+### Tag
+
+These are the properties available for a [Tag trigger](/docs/automation/trigger/#tag-trigger).
+
+| Template variable | Data |
+| ---- | ---- |
+| `trigger.platform` | Hardcoded: `tag`
+| `trigger.tag_id` | The tag ID captured.
+| `trigger.device_id` | Optional device ID that captured the tag.
+
### Template
These are the properties available for a [Template trigger](/docs/automation/trigger/#template-trigger).
@@ -166,9 +207,9 @@ These properties are available for a [persistent notification trigger](/docs/aut
| `trigger.platform` | Hardcoded: `persistent_notification`
| `trigger.update_type` | Type of persistent notification update `added`, `removed`, `current`, or `updated`.
| `trigger.notification` | Notification object that triggered the persistent notification trigger.
-| `trigger.notification.notification_id` | The notification ID
-| `trigger.notification.title` | Title of the notification
-| `trigger.notification.message` | Message of the notification
+| `trigger.notification.notification_id` | The notification ID.
+| `trigger.notification.title` | Title of the notification.
+| `trigger.notification.message` | Message of the notification.
| `trigger.notification.created_at` | DateTime object indicating when the notification was created.
### Webhook
@@ -193,7 +234,7 @@ These are the properties available for a [Zone trigger](/docs/automation/trigger
| `trigger.entity_id` | Entity ID that we are observing.
| `trigger.from_state` | Previous [state object] of the entity.
| `trigger.to_state` | New [state object] of the entity.
-| `trigger.zone` | State object of zone
+| `trigger.zone` | State object of the zone.
| `trigger.event` | Event that trigger observed: `enter` or `leave`.
## Examples
diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown
index c26ec5882ab..36d86ba8b80 100644
--- a/source/_docs/automation/trigger.markdown
+++ b/source/_docs/automation/trigger.markdown
@@ -825,6 +825,101 @@ blueprint:
{% endraw %}
+### Weekday filtering
+
+Time triggers can be filtered to fire only on specific days of the week using the `weekday` option. This allows you to create automations that only run on certain days, such as weekdays or weekends.
+
+The `weekday` option accepts:
+- A single weekday as a string: `"mon"`, `"tue"`, `"wed"`, `"thu"`, `"fri"`, `"sat"`, `"sun"`
+- A list of weekdays using the expanded format
+
+#### Single weekday
+
+This example will turn on the lights only on Mondays at 8:00 AM:
+
+```yaml
+automation:
+ - triggers:
+ - trigger: time
+ at: "08:00:00"
+ weekday: "mon"
+ actions:
+ - action: light.turn_on
+ target:
+ entity_id: light.bedroom
+```
+
+#### Multiple weekdays
+
+This example will run a morning routine only on weekdays (Monday through Friday) at 6:30 AM:
+
+```yaml
+automation:
+ - triggers:
+ - trigger: time
+ at: "06:30:00"
+ weekday:
+ - "mon"
+ - "tue"
+ - "wed"
+ - "thu"
+ - "fri"
+ actions:
+ - action: script.morning_routine
+```
+
+#### Weekend example
+
+This example demonstrates a different wake-up time for weekends:
+
+```yaml
+automation:
+ - alias: "Weekday alarm"
+ triggers:
+ - trigger: time
+ at: "06:30:00"
+ weekday:
+ - "mon"
+ - "tue"
+ - "wed"
+ - "thu"
+ - "fri"
+ actions:
+ - action: script.weekday_morning
+
+ - alias: "Weekend alarm"
+ triggers:
+ - trigger: time
+ at: "08:00:00"
+ weekday:
+ - "sat"
+ - "sun"
+ actions:
+ - action: script.weekend_morning
+```
+
+#### Combined with input datetime
+
+The `weekday` option works with all time formats, including input datetime entities:
+
+```yaml
+automation:
+ - triggers:
+ - trigger: time
+ at: input_datetime.work_start_time
+ weekday:
+ - "mon"
+ - "tue"
+ - "wed"
+ - "thu"
+ - "fri"
+ actions:
+ - action: notify.mobile_app
+ data:
+ title: "Work Day!"
+ message: "Time to start working"
+```
+
## 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).
@@ -985,7 +1080,7 @@ additional event data available for use by an automation.
## Sentence trigger
-A sentence trigger fires when [Assist](/voice_control/) matches a sentence from a voice assistant using the default [conversation agent](/integrations/conversation/). Sentence triggers only work with Home Assistant Assist. External conversation agents such as OpenAI or Google Generative AI cannot be used to trigger automations.
+A sentence trigger fires when [Assist](/voice_control/) matches a sentence from a voice assistant using the default [conversation agent](/integrations/conversation/). Sentence triggers work with Home Assistant Assist. They will not work with external conversation agents such as OpenAI or Google Generative AI unless "Prefer handling commands locally" is enabled in the conversation agent settings.
Sentences are allowed to use some basic [template syntax](https://developers.home-assistant.io/docs/voice/intent-recognition/template-sentence-syntax/#sentence-templates-syntax) like optional and alternative words. For example, `[it's ]party time` will match both "party time" and "it's party time".
diff --git a/source/_docs/backend/database.markdown b/source/_docs/backend/database.markdown
index 99b2e064797..365be9fa6a9 100644
--- a/source/_docs/backend/database.markdown
+++ b/source/_docs/backend/database.markdown
@@ -74,7 +74,7 @@ CREATE TABLE statistics_meta (
unit_of_measurement VARCHAR(255),
has_mean BOOLEAN,
has_sum BOOLEAN,
- name VARCHAR(255),
+ name VARCHAR(255), mean_type INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (id)
)
@@ -87,14 +87,6 @@ CREATE TABLE recorder_runs (
PRIMARY KEY (run_id)
)
-CREATE TABLE migration_changes (
- migration_id VARCHAR(255) NOT NULL,
- version SMALLINT NOT NULL,
- PRIMARY KEY (migration_id)
-)
-
-
-
CREATE TABLE schema_changes (
change_id INTEGER NOT NULL,
schema_version INTEGER,
@@ -137,7 +129,6 @@ CREATE TABLE states (
event_id SMALLINT,
last_changed CHAR(0),
last_changed_ts FLOAT,
- last_reported_ts FLOAT,
last_updated CHAR(0),
last_updated_ts FLOAT,
old_state_id INTEGER,
@@ -149,7 +140,7 @@ CREATE TABLE states (
context_id_bin BLOB,
context_user_id_bin BLOB,
context_parent_id_bin BLOB,
- metadata_id INTEGER,
+ metadata_id INTEGER, last_reported_ts FLOAT,
PRIMARY KEY (state_id),
FOREIGN KEY(old_state_id) REFERENCES states (state_id),
FOREIGN KEY(attributes_id) REFERENCES state_attributes (attributes_id),
@@ -169,7 +160,7 @@ CREATE TABLE statistics (
last_reset CHAR(0),
last_reset_ts FLOAT,
state FLOAT,
- sum FLOAT,
+ sum FLOAT, mean_weight FLOAT,
PRIMARY KEY (id),
FOREIGN KEY(metadata_id) REFERENCES statistics_meta (id) ON DELETE CASCADE
)
@@ -187,7 +178,7 @@ CREATE TABLE statistics_short_term (
last_reset CHAR(0),
last_reset_ts FLOAT,
state FLOAT,
- sum FLOAT,
+ sum FLOAT, mean_weight FLOAT,
PRIMARY KEY (id),
FOREIGN KEY(metadata_id) REFERENCES statistics_meta (id) ON DELETE CASCADE
)
@@ -212,27 +203,33 @@ CREATE INDEX ix_events_data_id ON events (data_id)
CREATE INDEX ix_events_event_type_id_time_fired_ts ON events (event_type_id, time_fired_ts)
-CREATE INDEX ix_events_context_id_bin ON events (context_id_bin)
-
CREATE INDEX ix_events_time_fired_ts ON events (time_fired_ts)
+CREATE INDEX ix_events_context_id_bin ON events (context_id_bin)
+
+CREATE INDEX ix_states_context_id_bin ON states (context_id_bin)
+
CREATE INDEX ix_states_attributes_id ON states (attributes_id)
+CREATE INDEX ix_states_last_updated_ts ON states (last_updated_ts)
+
CREATE INDEX ix_states_metadata_id_last_updated_ts ON states (metadata_id, last_updated_ts)
CREATE INDEX ix_states_old_state_id ON states (old_state_id)
-CREATE INDEX ix_states_context_id_bin ON states (context_id_bin)
-
-CREATE INDEX ix_states_last_updated_ts ON states (last_updated_ts)
+CREATE INDEX ix_statistics_start_ts ON statistics (start_ts)
CREATE UNIQUE INDEX ix_statistics_statistic_id_start_ts ON statistics (metadata_id, start_ts)
-CREATE INDEX ix_statistics_start_ts ON statistics (start_ts)
+CREATE UNIQUE INDEX ix_statistics_short_term_statistic_id_start_ts ON statistics_short_term (metadata_id, start_ts)
CREATE INDEX ix_statistics_short_term_start_ts ON statistics_short_term (start_ts)
-CREATE UNIQUE INDEX ix_statistics_short_term_statistic_id_start_ts ON statistics_short_term (metadata_id, start_ts)
+CREATE TABLE migration_changes (
+ migration_id VARCHAR(255) NOT NULL,
+ version SMALLINT NOT NULL,
+ PRIMARY KEY (migration_id)
+)
```
To only show the details about the `states` table (since we are using that one in the next examples):
diff --git a/source/_docs/blueprint/schema.markdown b/source/_docs/blueprint/schema.markdown
index 02b44b173cb..602caef5a82 100644
--- a/source/_docs/blueprint/schema.markdown
+++ b/source/_docs/blueprint/schema.markdown
@@ -16,16 +16,18 @@ related:
## The blueprint schema
+Blueprint schemas currently supports three types of schema depending on its domain: [`automation`](/docs/automation/yaml/); `script`; and [`template`](/integrations/template/#using-blueprints).
+
The configuration schema of a blueprint consists of 2 parts:
-1. The blueprint's high-level metadata: name, description, the input required from the user.
-2. The schema of the thing the blueprint describes.
+1. The blueprint's high-level metadata: name, domain and, optionally, any input required from the user.
+2. The schema for the blueprint domain it describes.
The first part is referred to as the *blueprint schema*. It contains the
blueprint's metadata.
-The only requirement for a blueprint is a name. In its most basic form,
-a blueprint would look like:
+Minimum required metadata for a blueprint is its name and domain. In its most basic form,
+a blueprint looks like:
```yaml
blueprint:
@@ -35,10 +37,9 @@ blueprint:
Although this is a valid blueprint, it is not very useful.
-The second part depends on the use case of the blueprint. For example, if you create a blueprint for an automation, the full
+The second part depends on its domain, the type of blueprint. For example, when creating a blueprint for an automation, the full
schema for an [automation](/docs/automation/yaml/) applies.
-You can add a description of the blueprint's use case and user inputs.
This is the full blueprint schema:
@@ -50,13 +51,13 @@ name:
description:
description: >
The description of the blueprint. While optional, this field is highly
- recommended. Describe what the blueprint does and describe the inputs the blueprint provide. The description can
+ recommended. Describe what the blueprint does and describe the inputs the blueprint requires. The description can
include [Markdown](https://commonmark.org/help/).
type: string
required: false
domain:
description: >
- The domain in which this blueprint is used. Currently, only
+ The domain in which this blueprint is used. Currently, only three types,
[`automation`](/docs/automation/yaml/), `script` and [`template`](/integrations/template/#using-blueprints) are supported.
type: string
required: true
@@ -66,7 +67,7 @@ author:
required: false
homeassistant:
description: >
- Home Assistant requirements to be able to use the blueprint successfully.
+ Home Assistant version required for the blueprint to work successfully.
type: map
required: false
keys:
@@ -90,10 +91,9 @@ input:
### Blueprint inputs
-As described above, a blueprint can accept one (or multiple)
-inputs from the blueprint user.
+A blueprint can accept one or multiple inputs from the user, but does not require any input.
-These inputs can be of any type (string, boolean, list, dictionary). They can have
+These inputs can be of any type (string, boolean, list, map). They can have
a default value and also provide a [selector](/docs/blueprint/selectors/) that
ensures a matching input field in the user interface.
@@ -126,9 +126,9 @@ A blueprint input has the following configuration:
{% endconfiguration %}
Each input field can be referred to, outside of the blueprint metadata, using
-the `!input` custom YAML tag.
+the `!input` custom YAML tag before its name.
-The following example shows a minimal blueprint with a single input:
+The following example shows a minimal *blueprint schema* with a single input:
```yaml
blueprint:
@@ -161,7 +161,7 @@ A section is differentiated from an input by the presence of an additional `inpu
Input sections are a new feature in version 2024.6.0. Set the `min_version` for the blueprint to at least this version if using input sections. Otherwise, the blueprint will generate errors on older versions. See [this section](/docs/blueprint/schema/#min_version) for more details.
{% endcaution %}
-The full configuration for a section is below:
+The full configuration for an input section is below:
{% configuration %}
@@ -194,7 +194,7 @@ input:
-The following example shows a blueprint with some inputs in a section:
+The following example shows a *blueprint schema* with some inputs in a section:
```yaml
blueprint:
@@ -232,7 +232,8 @@ variables:
The [built-in blueprints][blueprint-built-in]
are great examples to get a bit of a feeling of how blueprints work.
-Here is the built-in motion light automation blueprint:
+Here is the built-in motion light automation blueprint.
+Note the *blueprint schema* under the blueprint key is followed by its domain schema. In this example, an automation schema.
```yaml
blueprint:
diff --git a/source/_docs/blueprint/selectors.markdown b/source/_docs/blueprint/selectors.markdown
index 8515a63a6f5..e1273770f3c 100644
--- a/source/_docs/blueprint/selectors.markdown
+++ b/source/_docs/blueprint/selectors.markdown
@@ -45,6 +45,7 @@ The following selectors are currently available:
- [RGB color selector](#rgb-color-selector)
- [Select selector](#select-selector)
- [State selector](#state-selector)
+- [Statistic selector](#statistic-selector)
- [Target selector](#target-selector)
- [Template selector](#template-selector)
- [Text selector](#text-selector)
@@ -154,7 +155,7 @@ device:
When set, the list of areas is limited to areas with devices that have
the set model ID.
type: string
- required: false
+ required: false
entity:
description: >
When entity options are provided, the list of areas is filtered by areas
@@ -570,7 +571,7 @@ filter:
description: >
When set, the list of devices is limited to devices that have the set model ID.
type: string
- required: false
+ required: false
multiple:
description: >
Allows selecting multiple devices. If set to `true`, the resulting value of
@@ -607,7 +608,7 @@ device:
filter:
- integration: deconz
manufacturer: Philips
- model: RWL021
+ model: RWL021
entity:
- domain: sensor
device_class: battery
@@ -634,7 +635,7 @@ enable_millisecond:
description: When `true`, the duration selector will allow selecting milliseconds.
type: boolean
default: false
- required: false
+ required: false
{% endconfiguration %}
The output of this selector is a mapping of the time values the user selected.
@@ -720,6 +721,12 @@ multiple:
type: boolean
default: false
required: false
+reorder:
+ description: >
+ Allows reordering of entities (only applies if `multiple` is set to `true`).
+ type: boolean
+ default: false
+ required: false
{% endconfiguration %}
The output of this selector is the entity ID, or (in case `multiple` is set to
@@ -756,7 +763,7 @@ entity:
## Floor selector
-The floor selector shows a floor finder that can pick
+The floor selector shows a floor finder that can pick
floors based on the selector configuration. The value of the input will be the
floor ID. If `multiple` is set to `true`, the value is a list of floor IDs.
@@ -807,7 +814,7 @@ device:
When set, the list only includes floors with devices that have
the set model ID.
type: string
- required: false
+ required: false
entity:
description: >
When entity options are provided, the list only includes floors
@@ -1024,15 +1031,34 @@ The media selector is a powerful selector that allows a user to easily select
media to play on a media device. Media can be a lot of things, for example,
cameras, local media, text-to-speech, Home Assistant Dashboards, and many more.
-The user selects the device to play media on, and automatically limits the
-selectable media suitable for the selected device.
+You are prompted to select the device used to play media. Once the device is selected, the media selector only shows media that is suitable for this device.

+To ask the user to select a media device and suitable media, you can use the
+media selector without any options:
+
```yaml
media:
```
+You can also use the media selector with an optional `accept` filter to limit the
+media types that can be selected. The user will not be asked to pick a device.
+
+```yaml
+media:
+ accept:
+ - image/*
+```
+
+{% configuration media %}
+accept:
+ description: >
+ List of media types the user is allowed to select.
+ type: list
+ required: false
+{% endconfiguration %}
+
The output of the media selector, is an mapping with information about
the selected media device and the selected media to play. There is also
metadata, which is used by the frontend and should not be used in the
@@ -1058,6 +1084,25 @@ metadata:
media-source://tts/cloud?message=TTS+Message&language=en-US&gender=female
```
+Example output if accept filter is used. Note that the `entity_id` is not present:
+
+```yaml
+media_content_id: media-source://tts/cloud?message=TTS+Message&language=en-US&gender=female
+media_content_type: provider
+metadata:
+ title: TTS Message
+ thumbnail: https://brands.home-assistant.io/_/cloud/logo.png
+ media_class: app
+ children_media_class: null
+ navigateIds:
+ - {}
+ - media_content_type: app
+ media_content_id: media-source://tts
+ - media_content_type: provider
+ media_content_id: >-
+ media-source://tts/cloud?message=TTS+Message&language=en-US&gender=female
+```
+
## Number selector
The number selector shows either a number input or a slider input, that allows
@@ -1082,11 +1127,11 @@ number:
min:
description: The minimum user-settable number value.
type: [integer, float]
- required: true
+ required: false
max:
description: The maximum user-settable number value.
type: [integer, float]
- required: true
+ required: false
step:
description: The step size of the number value. Set to `"any"` to allow any number.
type: [integer, float, "any"]
@@ -1100,7 +1145,16 @@ mode:
description: This can be either `box` or `slider` mode.
type: string
required: false
- default: slider
+ default: slider if min and max are set, otherwise box
+translation_key:
+ description: >
+ Allows translations provided by an integration where `translation_key`
+ is the translation key that is providing the unit_of_measurement string
+ translation. See the documentation on
+ [Backend Localization](https://developers.home-assistant.io/docs/internationalization/core/#selectors)
+ for more information.
+ type: string
+ required: false
{% endconfiguration %}
The output of this selector is a number, for example: `42`
@@ -1135,16 +1189,79 @@ number:
The object selector can be used to input arbitrary data in YAML form. This is useful for e.g. lists and dictionaries containing data for actions. The value of the input will contain the provided data.
-
+When used without options, the selector will accept a free form object.
-This selector does not have any other options; therefore, it only has its key.
+
```yaml
object:
```
+When used with a `schema`, the selector will force the object to be in this format by displaying a form.
+
+
+
+```yaml
+object:
+ label_key: name
+ description_key: percentage
+ multiple: true
+ fields:
+ name:
+ label: Name
+ selector:
+ text:
+ percentage:
+ label: Percentage
+ selector:
+ number:
+ unit_of_measurement: "%"
+```
+
The output of this selector is a YAML object.
+{% configuration qr_code %}
+fields:
+ description: >
+ List of fields of the object.
+ type: map
+ required: false
+ keys:
+ label:
+ description: The label of the field
+ required: false
+ type: string
+ selector:
+ description: The selector to use for this field. It can be any available selector.
+ required: true
+ type: string
+label_field:
+ description: >
+ The field to use as a label. By default, it will be the first field defined. This option is only used if `fields` option set.
+ type: string
+ required: false
+description_field:
+ description: >
+ The field to use as a description. This option is only used if `fields` option set.
+ type: string
+ required: false
+translation_key:
+ description: >
+ Allows translations provided by an integration where `translation_key`
+ is the translation key that is providing the selector option strings
+ translation. See the documentation on
+ [Backend Localization](https://developers.home-assistant.io/docs/internationalization/core/#selectors)
+ for more information.
+ type: string
+ required: false
+multiple:
+ description: >
+ Allows selecting multiple options. If set to `true`, the resulting value of this selector will be a list instead of a single string value. This option is only used if `fields` option set.
+ type: boolean
+ required: false
+ default: false
+{% endconfiguration %}
+
## QR code selector
The QR code selector shows a QR code. It has no return value.
@@ -1305,14 +1422,17 @@ one or more can be selected.
entity_id:
description: The entity ID of which an state can be selected from.
type: string
- required: true
+ required: false
+hide_states:
+ description: The states to exclude from the list of options
+ type: list
+ required: false
multiple:
description: >
Allows selecting multiple states. If set to `true`, the resulting value of
this selector will be a list instead of a single string value.
type: boolean
- default: false
- required: false
+ default: false
{% endconfiguration %}
The output of this selector is the select state (not the translated or
@@ -1320,6 +1440,26 @@ prettified name shown in the frontend), or a list of states if `multiple` is tru
For example: `heat_cool`.
+## Statistic selector
+
+The statistic selector selects the statistic ID of an entity that records
+long-term statistics. It may resemble an entity ID (like `sensor.temperature`),
+or an external statistic ID (like `external:temperature`).
+
+
+
+{% configuration statistic %}
+multiple:
+ description: >
+ If set to true, the selector returns a list of statistic IDs.
+ type: boolean
+ default: false
+ required: false
+{% endconfiguration %}
+
+The output of this selector is a string representing a statistic ID, or
+a list of statistic IDs if `multiple` is set to `true`.
+
## Target selector
The target selector is a rather special selector, allowing the user to select
@@ -1368,7 +1508,7 @@ device:
model_id:
description: When set, the targets are limited to devices that have the set model ID.
type: string
- required: false
+ required: false
entity:
description: >
When entity options are provided, the targets are limited by entities
diff --git a/source/_docs/configuration/customizing-devices.markdown b/source/_docs/configuration/customizing-devices.markdown
index 2e47158f0be..decc7d5529f 100644
--- a/source/_docs/configuration/customizing-devices.markdown
+++ b/source/_docs/configuration/customizing-devices.markdown
@@ -9,23 +9,35 @@ related:
- docs: /docs/organizing/labels/
---
-## Customizing an entity
-
After adding a new device, you might find the automatically assigned entity ID too technical and the entity lacking a friendly name. You can personalize these elements to better fit your naming conventions or modify other attributes like the icon.
To change entity attributes, follow these steps:
1. Go to {% my entities title="**Settings** > **Devices & services** > **Entities**" %} and select the entity from the list.
-2. In the top right corner, select the cog icon.
+2. In the top-right corner, select the {% icon "mdi:cog" %} cog icon.

3. Enter or edit the attributes:
- - For example, the entity ID here could be shortened to `binary_sensor.living_room_motion_1`.
- - Do not change the domain of the entity - the part before the `.` (binary_sensor, in this example).
+ - For example, the entity ID here could be shortened to `binary_sensor.lumi_sensor_aq2_opening`.
- You can use lowercase letters, numbers, and underscores.
- The ID must not start or end with an underscore.
+ - To undo the change and revert the ID to the default, select the {% icon "mdi:restore" %} icon.
+ - **Note**: You can only reset the ID to the default ID for entities with a unique ID.
+ - IDs of entities that are disabled or for which the integration is not set up cannot be reverted.
+ - To revert all the entity IDs for a device, on the device page, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Recreate entity IDs**.
+ - **Result**: This resets the entity ID and applies the current default naming convention.
+ - The terms used to generate the entity ID depends on a few factors. Prioritization is as follows:
+ 1. If you changed the friendly name of the entity, the friendly name will be used.
+ 2. The entity ID suggested by the integration (just a few integrations do this).
+ 3. The default name in the user language, if using Latin script.
+ - If the something other than Latin script is used, the entity ID is based on the English default name.
+ - This is because entity IDs must use lowercase alphanumeric characters in the range of [a-z,1-9].
+
+ 
+
- Enter or edit the friendly name.
+ - In this example, this would change "Opening".
- If needed, from the **Shown as** menu, you can select a different [device class](/integrations/homeassistant/#device-class).
- If you like, add a [label](/docs/organizing/labels/).
diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown
index cc6f0f60ccd..48f8ec087a8 100644
--- a/source/_docs/configuration/templating.markdown
+++ b/source/_docs/configuration/templating.markdown
@@ -52,8 +52,8 @@ There are a few very important rules to remember when adding templates to YAML:
1. You **must** surround single-line templates with double quotes (`"`) or single quotes (`'`).
2. It is advised that you prepare for undefined variables by using `if ... is not none` or the [`default` filter](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.default), or both.
-3. It is advised that when comparing numbers, you convert the number(s) to a [`float`](https://jinja.palletsprojects.com/en/latest/templates/#float) or an [`int`](https://jinja.palletsprojects.com/en/latest/templates/#int) by using the respective [filter](https://jinja.palletsprojects.com/en/latest/templates/#list-of-builtin-filters).
-4. While the [`float`](https://jinja.palletsprojects.com/en/latest/templates/#float) and [`int`](https://jinja.palletsprojects.com/en/latest/templates/#int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables.
+3. It is advised that when comparing numbers, you convert the number(s) to a [`float`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.float) or an [`int`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.int) by using the respective [filter](https://jinja.palletsprojects.com/en/latest/templates/#list-of-builtin-filters).
+4. While the [`float`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.float) and [`int`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables.
Remembering these simple rules will help save you from many headaches and endless hours of frustration when using automation templates.
@@ -97,7 +97,7 @@ In your automations, you could then reuse this macro by importing it:
{{ format_entity('sensor.temperature') }}
```
-{$ endraw %}
+{% endraw %}
Home Assistant also allows you to write macros with non-string return values by
taking a named argument called `returns` and calling it with a return value. Once created,
@@ -623,6 +623,7 @@ If there is more than one entry with the same title, the entities for all the ma
- `labels()` returns the full list of label IDs, or those for a given area ID, device ID, or entity ID.
- `label_id(lookup_value)` returns the label ID for a given label name.
- `label_name(lookup_value)` returns the label name for a given label ID.
+- `label_description(lookup_value)` returns the label description for a given label ID.
- `label_areas(label_name_or_id)` returns the list of area IDs tied to a given label ID or name.
- `label_devices(label_name_or_id)` returns the list of device IDs tied to a given label ID or name.
- `label_entities(label_name_or_id)` returns the list of entity IDs tied to a given label ID or name.
@@ -774,7 +775,7 @@ For example, if you wanted to select a field from `trigger` in an automation bas
{% endraw %}
-- `as_datetime(value, default)` converts a string containing a timestamp, or valid UNIX timestamp, to a datetime object. If that fails, it returns the `default` value or, if omitted, raises an error. When the input is already a datetime object it will be returned as is. in case the input is a datetime.date object, midnight will be added as time. This function can also be used as a filter.
+- `as_datetime(value, default)` converts a string containing a timestamp or a valid UNIX timestamp to a datetime object. If conversion fails, the function returns the `default` value. If no `default` is provided and the input is a string that cannot be converted to a datetime, it returns `None`. For other invalid inputs (e.g., a list, dictionary, or a numeric value too large to convert), it raises an error when no `default` is supplied. In case the input is already a datetime object, it is returned unchanged. If the input is a `datetime.date` object, midnight is added as the time. This function can also be used as a filter.
- `as_timestamp(value, default)` converts a datetime object or string to UNIX timestamp. If that fails, returns the `default` value, or if omitted raises an error. This function can also be used as a filter.
- `as_local()` converts a datetime object to local time. This function can also be used as a filter.
- `strptime(string, format, default)` parses a string based on a [format](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior) and returns a datetime object. If that fails, it returns the `default` value or, if omitted, raises an error.
@@ -902,6 +903,29 @@ The temperature is 25°C
{% endraw %}
+`from_json(default)` function will attempt to convert the input to `json`. If that fails, returns the `default` value, or if omitted raises an error.
+
+#### Template
+
+{% raw %}
+
+```text
+{% set result = 'not json'|from_json('not json') %}
+The value is {{ result }}
+```
+
+{% endraw %}
+
+#### Output
+
+{% raw %}
+
+```text
+The value is not json
+```
+
+{% endraw %}
+
### Is defined
Sometimes a template should only return if a value or object is defined, if not, the supplied default value should be returned. This can be useful to validate a JSON payload.
diff --git a/source/_docs/energy/water.markdown b/source/_docs/energy/water.markdown
index 8dfb726ee1b..0e6faa81e0d 100644
--- a/source/_docs/energy/water.markdown
+++ b/source/_docs/energy/water.markdown
@@ -42,7 +42,7 @@ There are also products for water usage monitoring that are based on existing co
If your water meter lacks a rotary disk, magnetic disk, or coil. There are alternative solutions available to seamlessly integrate water monitoring into your smart home setup:
-- [AI-on-the-edge-device](https://github.com/jomjol/AI-on-the-edge-device) is a project running on an ESP32-CAM and can be fully integrated into Home Assistant using the Home Assistant Discovery Functionality of MQTT. It digitalizes your gas/water/electricity meter display and provides its data in various ways. is a project running on an ESP32-CAM and can be fully integrated into Home Assistant using the Home Assistant Discovery Functionality of MQTT. It digitalizes your gas/water/electricity meter display and provides its data in various ways.
If you have a Culligan Water Softener, you may be able to interface with the inbuilt `DEBUG PORT` and receive water usage stats including `Gallons` (gal), `Gallons Per Minute` (gal/min), and `Gallons to Recharge` (gal):
diff --git a/source/_docs/z-wave/controllers.markdown b/source/_docs/z-wave/controllers.markdown
index 79a0dacc826..97117102ff0 100644
--- a/source/_docs/z-wave/controllers.markdown
+++ b/source/_docs/z-wave/controllers.markdown
@@ -1,15 +1,18 @@
---
-title: "Z-Wave Controllers"
-description: "Extended instructions how to setup Z-Wave."
+title: "Z-Wave adapters"
+description: "Extended instructions how to set up Z-Wave."
+related:
+ - docs: /integrations/zwave_js/
+ title: Z-Wave integration
---
-## Supported Z-Wave USB Sticks & Hardware Modules
+## Supported Z-Wave adapters
-You need to have a compatible Z-Wave stick or module installed. The following devices have been confirmed to work with Z-Wave JS:
+You need to have a compatible Z-Wave adapter installed. The following devices have been confirmed to work with Z-Wave JS:
{% warning %}
-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:
+The firmwares of 700 and 800 series Z-Wave adapters have several bugs which impact the stability of the mesh and can cause the adapter 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 or 7.21.6 and newer
@@ -29,7 +32,7 @@ The SDK version does not have to match the firmware version. If you are unsure w
{% endnote %}
{% important %}
-You should upgrade the firmware on all 700 and 800 series controllers to a recommended version.
+You should upgrade the firmware on all 700 and 800 series adapters to a recommended version.
{% endimportant %}
Firmware can be upgraded using the below directions:
@@ -41,11 +44,11 @@ Firmware can be upgraded using the below directions:
{% endwarning %}
-- 800 series controllers (with some caveats, see notes)
+- 800 series USB adapters (with some caveats, see notes)
- HomeSeer SmartStick G8
- Zooz 800 Series Z-Wave Long Range S2 Stick (ZST39 LR)
-- 700 series controllers
+- 700 series USB adapters
- Aeotec Z-Stick 7 USB stick (ZWA010) (the EU version is not recommended due to RF performance issues)
- HomeSeer SmartStick+ G3
- HomeSeer Z-NET G3
@@ -53,7 +56,7 @@ Firmware can be upgraded using the below directions:
- Zooz S2 Stick 700 (ZST10 700)
- Z-Wave.Me Z-Station
-- 500 series controllers
+- 500 series USB adapters
- Aeotec Z-Stick Gen5 (see note below)
- Everspring USB stick - Gen 5
- GoControl HUSBZB-1 stick
@@ -63,39 +66,34 @@ Firmware can be upgraded using the below directions:
- HomeSeer SmartStick+ G2
- HomeSeer Z-NET G2
-- Raspberry Pi modules
+- Raspberry Pi HAT adapters
- Aeotec Z-Pi 7 Raspberry Pi HAT/Shield (ZWA025, 700 series)
- Z-Wave.Me RaZberry 7 (ZME_RAZBERRY7, 700 series)
- Z-Wave.Me RaZberry 7 Pro (ZMEERAZBERRY7_PRO or ZMEURAZBERRY7_PRO, 700 series)
- Z-Wave.Me Razberry 2 (500 series)
- Z-Wave.Me Razberry 1 (300 series)
-If you are just starting out, we recommend that you purchase a 700 series controller or a Raspberry Pi module. The 700 series controllers are the more recent version (when compared to the 500 series). The 700 series controllers support SmartStart, which allows you to add a device by scanning a QR code.
-
+If you are just starting out, we recommend that you purchase an 800 series adapter (with firmware updated to ≥ 7.23.2). The 800 series adapters are the most future-proof and offer the best RF performance.
{% tip %}
It's recommended to use a USB stick, not a module. Passing a module through Docker is more complicated than passing a USB stick through.
{% endtip %}
-## Stick alternatives
+## Third-party hubs
-The alternative to a stick is a hub that supports Z-Wave. Home Assistant supports the following hubs with Z-Wave support:
+For the best experience, it is recommended to use an adapter directly with Home Assistant. If this doesn't work for you, you can use a hub that supports Z-Wave. Home Assistant supports the following third-party hubs with Z-Wave support:
- [Vera](/integrations/vera/)
- [Fibaro](/integrations/fibaro/)
- [SmartThings](/integrations/smartthings/)
- [Z-Wave.Me Z-Way](/integrations/zwave_me)
-## Controller notes
-
-### 800 Series Controllers
-
-Z-Wave JS does not support Z-Wave Long Range yet.
+## Adapter notes
### Aeotec Z-Stick
{% note %}
-The Aeotec Z-Stick and some of its variants (e.g. Z-Wave.Me UZB1) are known to have compatibility issues with the Linux kernel because of their [non-compliant behavior](https://forums.raspberrypi.com/viewtopic.php?f=28&t=245031#p1502030). Plugging these controllers through a USB hub can serve as a workaround that sometimes mitigates the issue.
+The Aeotec Z-Stick and some of its variants (e.g. Z-Wave.Me UZB1) are known to have compatibility issues with the Linux kernel because of their [non-compliant behavior](https://forums.raspberrypi.com/viewtopic.php?f=28&t=245031#p1502030). Plugging these adapters through a USB hub can serve as a workaround that sometimes mitigates the issue.
{% endnote %}
diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html
index 0f2198ebdcb..33995c96ee0 100644
--- a/source/_includes/asides/component_navigation.html
+++ b/source/_includes/asides/component_navigation.html
@@ -69,13 +69,11 @@
{%- endif -%}
{% if page.works_with %}
- {%- for type in page.works_with -%}
-
{%- endif -%}
{% if page.ha_domain %}
diff --git a/source/_includes/common-tasks/network_storage.md b/source/_includes/common-tasks/network_storage.md
index b8cb9a77ddb..b7feb0bafa2 100644
--- a/source/_includes/common-tasks/network_storage.md
+++ b/source/_includes/common-tasks/network_storage.md
@@ -9,14 +9,6 @@ To list all your currently connected network storages, go to **{% my storage tit
You need to update to Home Assistant Operating System 10.2 before you can use this feature.
{% endimportant %}
-{% else %}
-
-{% important %}
-
-You need to make sure you run a supported {% term "Home Assistant Supervised" %} installation with the latest version of the [os-agent](https://github.com/home-assistant/os-agent). Make sure that your supervisor uses [slave bind propagation](https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation) for the data volume.
-
-{% endimportant %}
-
{% endif %}
diff --git a/source/_includes/common-tasks/update.md b/source/_includes/common-tasks/update.md
index 19c6f7cc2dc..bacdb23648f 100644
--- a/source/_includes/common-tasks/update.md
+++ b/source/_includes/common-tasks/update.md
@@ -1,9 +1,12 @@
-Best practice for updating Home Assistant Core:
+#### Prerequisites
1. [Back up your installation](/common-tasks/general/#backups) and store the backup and the [backup emergency kit](/more-info/backup-emergency-kit/) somewhere safe.
- This ensures that you can [restore your installation from backup](/common-tasks/general/#restoring-a-backup) if needed.
2. Check the release notes for backward-incompatible changes on [Home Assistant release notes](/blog/categories/core/). Be sure to check all release notes between the version you are running and the one you are upgrading to. Use the search function in your browser (`CTRL + f` / `CMD + f`) and search for **Backward-incompatible changes**.
-3. To update Home Assistant Core, choose one of the following options.
+
+#### To update Home Assistant Core
+
+To update Home Assistant Core, choose one of the following options.
{% if page.installation == "os" %}
@@ -20,6 +23,10 @@ Best practice for updating Home Assistant Core:
- Go to {% my updates title="**System** > **Updates**" %}.
- Select the update notification.
- Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active.
+ 4. Open the notification for the component you want to update.
+ 5. If you want to backup the system first (recommended), enable the backup toggle.
+ 6. Select **Update**.
+ 7. After the update completed, check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
- title: Using the CLI
content: |
@@ -57,6 +64,7 @@ Best practice for updating Home Assistant Core:
{% endtabbed_block %}
+After the update, check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
+
{% endif %}
-4. Check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
diff --git a/source/_includes/custom/news.html b/source/_includes/custom/news.html
index 5610e459f6f..1afa2c24901 100644
--- a/source/_includes/custom/news.html
+++ b/source/_includes/custom/news.html
@@ -1,13 +1,6 @@
diff --git a/source/_integrations/adax.markdown b/source/_integrations/adax.markdown
index 35d3ee3a7c2..503606044e0 100644
--- a/source/_integrations/adax.markdown
+++ b/source/_integrations/adax.markdown
@@ -3,14 +3,17 @@ title: Adax
description: Instructions on how to integrate Adax heater into Home Assistant.
ha_category:
- Climate
+ - Sensor
ha_release: 2021.8
ha_iot_class: Local Polling
ha_codeowners:
- '@danielhiversen'
+ - '@lazytarget'
ha_domain: adax
ha_config_flow: true
ha_platforms:
- climate
+ - sensor
ha_integration_type: integration
---
@@ -41,3 +44,13 @@ You will also need a credential, which you can create in the Adax app:
In the configuration popup you will need the Account ID, and the generated API password (not the account password)
{% include integrations/config_flow.md %}
+
+## Energy monitoring
+
+When using the cloud integration, the Adax integration provides energy monitoring sensors that track the power consumption of your heaters. These sensors are only available when using the cloud connection, as the local integration does not support energy data.
+
+The integration creates the following energy sensors:
+
+- **Individual energy sensors** - One sensor for each Adax heater showing its energy consumption in Wh
+
+The energy sensors use the `total_increasing` state class, making them suitable for use with Home Assistant's energy dashboard to track your heating costs and consumption over time.
diff --git a/source/_integrations/adguard.markdown b/source/_integrations/adguard.markdown
index dbb2537c60b..b02b55667b6 100644
--- a/source/_integrations/adguard.markdown
+++ b/source/_integrations/adguard.markdown
@@ -9,7 +9,7 @@ ha_release: 0.95
ha_iot_class: Local Polling
ha_config_flow: true
ha_codeowners:
- - '@frenck'
+ - "@frenck"
ha_domain: adguard
ha_platforms:
- sensor
@@ -17,15 +17,38 @@ ha_platforms:
ha_integration_type: service
---
-AdGuard Home is a network-wide DNS server that supports ad, tracker,
-and adult content blocking. The **AdGuard** integration allows you to control and
-monitor your AdGuard Home instance in Home Assistant.
+The **AdGuard Home** {% term integration %} allows you to control and monitor your [AdGuard Home](https://adguard.com/adguard-home/overview.html) instance in Home Assistant.
+
+AdGuard Home is a network-wide software for blocking advertisements and tracking. It provides DNS-level protection, automatically covering all home devices without requiring client-side software. When you use AdGuard Home as your DNS server, it blocks advertisements, trackers, and malicious domains for all devices on your network.
+
+## Prerequisites
+
+Before setting up the AdGuard Home integration, ensure you have:
+
+1. AdGuard Home installed and running on your network
+2. The IP address or hostname of your AdGuard Home instance
+3. Admin access to AdGuard Home
{% include integrations/config_flow.md %}
-## Sensors
+{% configuration_basic %}
+Host:
+ description: "The IP address or hostname of your AdGuard Home instance. For example: `192.168.1.100` or `adguard.local`."
+Port:
+ description: "The port AdGuard Home is running on. Default is `3000` for the web interface."
+Username:
+ description: "Your AdGuard Home admin username."
+Password:
+ description: "Your AdGuard Home admin password."
+Verify SSL certificate:
+ description: "Enable SSL certificate verification when connecting via HTTPS."
+{% endconfiguration_basic %}
-This integration provides {% term sensors %} for the following information from AdGuard Home:
+## Supported functionality
+
+### Sensors
+
+This integration provides sensors for the following information from AdGuard Home:
- Number of DNS queries.
- Number of blocked DNS queries.
@@ -36,77 +59,193 @@ This integration provides {% term sensors %} for the following information from
- Total number of active filter rules loaded.
- Average response time of AdGuard's DNS server in milliseconds.
-## Switches
+### Switches
-The integration will create a number of switches:
+The integration provides switches to control AdGuard Home features:
-- AdGuard Protection (master switch).
-- Filtering.
-- Safe Browsing.
-- Parental Control.
-- Safe Search.
-- Query Log.
+- **AdGuard protection**: Master switch that controls all AdGuard features
+- **Filtering**: Enables DNS filtering using blocklists
+- **Safe browsing**: Blocks known phishing and malware sites
+- **Parental control**: Blocks adult content
+- **Safe search**: Enforces safe search on search engines
+- **Query log**: Records DNS queries for statistics
-These switches allow you to automate things easily. For example, one could
-write an automation to turn off Safe Search after the kids' bedtime.
+These switches enable powerful automations. For example, you could automatically enable parental controls during school hours or disable ad blocking for specific time periods.
-The "AdGuard Protection" switch is a master switch. It will turn off and
-bypass all AdGuard features, regardless of whether they are switched on or not.
+The **AdGuard protection** switch acts as a master control. When turned off, it bypasses all AdGuard features regardless of individual switch states.
{% important %}
-Turning off Query Log will result in all sensors not receiving updates anymore.
-AdGuard relies on Query Log to provide stats.
+Turning off **Query log** stops all sensor updates. AdGuard requires query logging to provide statistics.
{% endimportant %}
## Actions
-These {% term actions %} allow one to manage filter subscriptions in AdGuard Home.
-Using these actions in automations could be helpful to block certain
-sites/domains at certain times.
+The integration provides {% term actions %} to manage filter subscriptions in AdGuard Home. Use these actions in automations to dynamically control content filtering based on time, presence, or other conditions.
-For example, you could create a custom filter list that blocks social media sites
-during the day and releases them during the evening.
+For example, you could create automations that:
-### Action `add_url`
+- Block social media during work hours
+- Enable strict filtering when guests connect to your network
+- Temporarily disable filtering for specific downloads
-Add a new filter subscription to AdGuard Home.
+### Action `adguard.add_url`
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | ------------------------------------------------------------ |
-| `name` | No | The name of the filter subscription. |
-| `url` | No | The filter URL to subscribe to, containing the filter rules. |
+Adds a new filter subscription to AdGuard Home.
-### Action `remove_url`
+| Data attribute | Optional | Description |
+| -------------- | -------- | --------------------------------------------- |
+| `name` | No | The name of the filter subscription |
+| `url` | No | The filter list URL containing blocking rules |
+
+### Action `adguard.remove_url`
Removes a filter subscription from AdGuard Home.
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | -------------------------------------- |
-| `url` | No | The filter subscription URL to remove. |
+| Data attribute | Optional | Description |
+| -------------- | -------- | ------------------------------------- |
+| `url` | No | The filter subscription URL to remove |
-### Action `enable_url`
+### Action `adguard.enable_url`
-Enables a filter subscription in AdGuard Home.
+Enables a previously disabled filter subscription.
+
+| Data attribute | Optional | Description |
+| -------------- | -------- | ------------------------------------- |
+| `url` | No | The filter subscription URL to enable |
+
+### Action `adguard.disable_url`
+
+Temporarily disables a filter subscription without removing it.
| Data attribute | Optional | Description |
-| ---------------------- | -------- | -------------------------------------- |
-| `url` | No | The filter subscription URL to enable. |
+| -------------- | -------- | -------------------------------------- |
+| `url` | No | The filter subscription URL to disable |
-### Action `disable_url`
+### Action `adguard.refresh`
-Disables a filter subscription in AdGuard Home.
+Refreshes all filter subscriptions to get the latest blocking rules.
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | --------------------------------------- |
-| `url` | No | The filter subscription URL to disable. |
+| Data attribute | Optional | Description |
+| -------------- | -------- | ----------------------------------------------- |
+| `force` | Yes | Force update (bypasses AdGuard Home throttling) |
-### Action `refresh`
+By default, `force` is `false`. AdGuard Home normally throttles filter updates to reduce server load. Use forced updates sparingly.
-Refresh all filter subscriptions in AdGuard Home.
+## Examples
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | ------------------------------------------------- |
-| `force` | Yes | Force update (bypasses AdGuard Home throttling). |
+### Block social media during work hours
-By default, `force` is set to `false`. Forcing an update bypasses AdGuard Home's
-throttling logic, so use with care.
+This automation blocks social media sites during business hours:
+
+```yaml
+automation:
+ - alias: "Block social media during work"
+ triggers:
+ - trigger: time
+ at: "09:00:00"
+ actions:
+ - action: adguard.add_url
+ data:
+ name: "Social media blocklist"
+ url: "https://raw.githubusercontent.com/example/social-media-blocklist/main/list.txt"
+ - action: adguard.refresh
+
+ - alias: "Unblock social media after work"
+ triggers:
+ - trigger: time
+ at: "17:00:00"
+ actions:
+ - action: adguard.remove_url
+ data:
+ url: "https://raw.githubusercontent.com/example/social-media-blocklist/main/list.txt"
+```
+
+### Enable strict filtering when guests arrive
+
+Automatically enable all protection features when guests connect to your network:
+
+```yaml
+automation:
+ - alias: "Enable strict filtering for guests"
+ triggers:
+ - trigger: state
+ entity_id: group.guest_devices
+ from: "not_home"
+ to: "home"
+ actions:
+ - action: switch.turn_on
+ target:
+ entity_id:
+ - switch.adguard_parental_control
+ - switch.adguard_safe_browsing
+ - switch.adguard_safe_search
+```
+
+### Monitor DNS performance
+
+Send a notification if DNS response time exceeds threshold:
+
+{% raw %}
+
+```yaml
+automation:
+ - alias: "Alert on slow DNS"
+ triggers:
+ - trigger: numeric_state
+ entity_id: sensor.adguard_average_processing_speed
+ above: 50
+ actions:
+ - action: notify.mobile_app
+ data:
+ title: "DNS Performance Alert"
+ message: "AdGuard DNS response time is {{ states('sensor.adguard_average_processing_speed') }}ms"
+```
+
+{% endraw %}
+
+
+## Data updates
+
+The AdGuard Home integration polls for updates every 10 seconds to provide near real-time statistics and ensure switch states remain synchronized.
+
+## Troubleshooting
+
+### Integration fails to connect
+
+#### Symptom: "Cannot connect to AdGuard Home"
+
+When setting up the integration, you receive a connection error.
+
+##### Resolution
+
+1. Verify AdGuard Home is running:
+
+ - Access the AdGuard Home web interface at `http://YOUR_IP:3000`.
+ - Check the service status on your server.
+
+2. Check network connectivity:
+
+ - Ensure Home Assistant can reach the AdGuard Home instance.
+ - Verify no firewall rules block port 3000.
+
+3. Confirm credentials:
+ - Test login via the AdGuard Home web interface.
+ - Ensure you're using admin credentials.
+
+### Sensors show unavailable
+
+If sensors display as unavailable:
+
+1. Check that **Query log** switch is enabled.
+2. Verify AdGuard Home is processing DNS queries.
+3. Ensure at least one device uses AdGuard Home as DNS server.
+
+### Actions fail with "Filter URL not found"
+
+This error occurs when trying to enable, disable, or remove a non-existent filter URL. Verify the exact URL using the AdGuard Home web interface under **Filters** > **DNS blocklists**.
+
+## Removing the integration
+
+This integration follows standard integration removal. After removal, your AdGuard Home instance continues running with its current configuration.
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/ai_task.markdown b/source/_integrations/ai_task.markdown
new file mode 100644
index 00000000000..1617f5d6a13
--- /dev/null
+++ b/source/_integrations/ai_task.markdown
@@ -0,0 +1,149 @@
+---
+title: AI Task
+description: Instructions on how to setup AI task entities with Home Assistant.
+ha_category:
+ - AI
+ha_release: '2025.7'
+ha_quality_scale: internal
+ha_domain: ai_task
+ha_codeowners:
+ - '@home-assistant/core'
+ha_integration_type: entity
+---
+
+The **AI Task** {% term integration %} allows you to use AI to help you configure Home Assistant.
+
+{% include integrations/building_block_integration.md %}
+
+For each task, you can set a preferred AI task entity. This allows you to use different AI models for different purposes, such as generating text, summarizing information, or even controlling devices. When the entity ID is omitted in the action, the preferred AI task entity will be used.
+
+## The state of an AI task entity
+
+The {% term state %} of an AI task {% term entity %} is a timestamp showing the date and time when the AI task was last used.
+
+## Action `ai_task.generate_data`
+
+Generates data using AI.
+
+| Data attribute | Optional | Description |
+| ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------- |
+| `task_name` | no | String that identifies the type of text generation task (for example, "home summary", "alert notification"). |
+| `instructions` | no | String containing the specific instructions for the AI to follow when generating the text. |
+| `entity_id` | yes | String that points at an `entity_id` of an LLM task entity. If not specified, uses the default LLM task. |
+| `structure` | yes | Dictionary defining the structure of the output data. When set, the AI will return structured data with the specified fields. Each field can have a `description`, `selector`, and optional `required` property. |
+| `attachments` | yes | List of attachments to include in the task. Each attachment is the output of the [Media Selector](https://www.home-assistant.io/docs/blueprint/selectors/#media-selector).
+
+The response variable is a dictionary with the following keys:
+
+- `data`: The generated text or structured data (depending on whether `structure` is specified).
+- `conversation_id`: The ID of the conversation used for the task.
+
+## Examples
+
+### Template entity counting items on a camera
+
+{% raw %}
+
+```yaml
+template:
+ - triggers:
+ - trigger: homeassistant
+ event: start
+ - trigger: time_pattern
+ minutes: "/5" # update every 5 minutes
+ actions:
+ - action: ai_task.generate_data
+ data:
+ task_name: "{{ this.entity_id }}"
+ instructions: >-
+ This is the inside of my goose coop. How many birds (chickens, geese, and
+ ducks) are inside the coop?
+ structure:
+ birds:
+ selector:
+ number:
+ attachments:
+ media_content_id: media-source://camera/camera.chicken_coop
+ media_content_type: image/jpeg
+ response_variable: result
+ sensor:
+ - name: "Chickens"
+ state: "{{ result.data.birds }}"
+ state_class: total
+```
+
+{% endraw %}
+
+Alternative ideas: detect number of parking spots available, count people in a room, or detect if a door is open.
+
+### Structured output example
+
+{% raw %}
+
+```yaml
+# Example: Generate weather and indoor comfort report
+script:
+- alias: "Weather and comfort report"
+ sequence:
+ - action: ai_task.generate_data
+ data:
+ task_name: "weather comfort report"
+ instructions: |
+ Based on the current conditions:
+ - Outdoor temperature: {{ states('sensor.outdoor_temperature') }}°C
+ - Weather condition: {{ states('weather.home') }}
+ - Indoor temperature: {{ states('sensor.living_room_temperature') }}°C
+ - Indoor humidity: {{ states('sensor.living_room_humidity') }}%
+
+ Generate a funny weather description and assess indoor comfort level.
+ structure:
+ weather_description:
+ description: "A humorous description of the current weather outside"
+ required: true
+ selector:
+ text:
+ indoor_comfort:
+ description: "Assessment of how comfortable it is inside compared to outside"
+ required: true
+ selector:
+ text:
+ response_variable: comfort_report
+ - action: notify.persistent_notification
+ data:
+ title: "🏠 Home climate report"
+ message: |
+ 🌤️ **Weather outside:**
+ {{ comfort_report.data.weather_description }}
+
+ 🛋️ **Indoor comfort:**
+ {{ comfort_report.data.indoor_comfort }}
+```
+
+{% endraw %}
+
+### Simple text generation example
+
+{% raw %}
+
+```yaml
+# Example: Generate a notification when garage door is left open
+automation:
+- alias: "Garage door notification"
+ triggers:
+ - trigger: state
+ entity_id: cover.garage_door
+ to: 'on'
+ for:
+ minutes: 10
+ actions:
+ - action: ai_task.generate_data
+ data:
+ task_name: "garage door left open comment"
+ instructions: "Generate a funny notification that garage door was left open"
+ response_variable: generated_text
+ - action: notify.persistent_notification
+ data:
+ message: "{{ generated_text.data }}"
+```
+
+{% endraw %}
diff --git a/source/_integrations/airgradient.markdown b/source/_integrations/airgradient.markdown
index 6bd789f5ce6..f2c0bd03353 100644
--- a/source/_integrations/airgradient.markdown
+++ b/source/_integrations/airgradient.markdown
@@ -27,6 +27,18 @@ 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.
+## Use cases
+
+- Monitor indoor and outdoor air quality.
+- Warn to open windows when CO2 levels are too high.
+- Control ventilation systems based on air quality.
+
+## Supported devices
+
+- AirGradient DIY Air Quality Monitor
+- AirGradient Indoor Air Quality Monitor
+- AirGradient Outdoor Air Quality Monitor
+
{% 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.
{% endimportant %}
@@ -38,7 +50,11 @@ Host:
description: "The IP address or hostname for your AirGradient device."
{% endconfiguration_basic %}
-## Available sensors
+## Supported functionality
+
+Below is a complete overview of the entities this integration provides.
+
+### Available sensors
The integration will fetch data from each device. The following sensors are supported:
@@ -65,7 +81,7 @@ A number of configuration entities are available as sensors to automate with if
- Display temperature unit
- Display brightness
-## Available configuration entities
+### Available configuration entities
The integration provides a few configuration entities to customize the device experience.
The settings are only available when the configuration source is set to local.
@@ -84,6 +100,67 @@ The following entities are supported:
- NOx learning offset
- Total volatile organic compounds learning offset
+### Updates
+
+The AirGradient integration provides an update entity that checks for firmware updates for your AirGradient device.
+To install the update, the device needs to be rebooted.
+
+## Data updates
+
+This integration uses local {% term polling %}, meaning it checks for changes to all entities by regularly communicating with the AirGradient device.
+
+The integration will retrieve data from the device every minute.
+
+The updates for the device are checked once every hour.
+
+## Actions
+
+This integration does not provide additional actions. All actions available
+for this integration are provided by their respective entities.
+
+## Examples
+
+The following examples show how to use the AirGradient integration in Home
+Assistant automations. These examples are just a starting point, and you can
+use them as inspiration to create your own automations.
+
+### Notify when the CO2 level is too high
+
+The following example sends a notification to your mobile device when the CO2 level exceeds 1000 ppm.
+
+{% raw %}
+
+```yaml
+automation:
+ - alias: "Notify when CO2 level is too high"
+ triggers:
+ - trigger: numeric_state
+ entity_id: sensor.airgradient_carbon_dioxide
+ above: 1000
+
+ actions:
+ - action: notify.mobile_app_your_device
+ data:
+ title: "High CO2 Level Alert"
+ message: >
+ The CO2 level is too high at {{ states('sensor.airgradient_carbon_dioxide') }} ppm.
+ Please consider ventilating the room.
+```
+
+{% endraw %}
+
+## Known limitations
+
+The AirGradient integration currently has the following limitations:
+- The update entity is not able to install updates automatically. You will need to reboot the device manually after installing the update.
+
+## Troubleshooting
+
+If you're experiencing issues with your AirGradient integration, try these general troubleshooting steps:
+
+1. Make sure your AirGradient is powered on and properly connected to your home network.
+2. If the integration shows as unavailable, try restarting both your AirGradient and Home Assistant.
+
## Removing the integration
This integration follows standard integration removal, no extra steps are required.
diff --git a/source/_integrations/airthings.markdown b/source/_integrations/airthings.markdown
index f8842ee5af9..efa56cfd300 100644
--- a/source/_integrations/airthings.markdown
+++ b/source/_integrations/airthings.markdown
@@ -15,6 +15,7 @@ ha_config_flow: true
ha_platforms:
- sensor
ha_integration_type: integration
+ha_dhcp: true
---
Integrates Airthings sensors into Home Assistant.
@@ -45,3 +46,10 @@ Upon saving the settings, you will be presented with a generated id and secret.
The Airthings integration can now be activated using the generated id and secret that you have just created.
{% include integrations/config_flow.md %}
+
+## Troubleshooting
+
+
+### The radon sensor does not show up
+
+Initially, the radon sensor may not be published by the Airthings API (at device startup, the value is considered "unknown"), and so you may have to wait for the radon sensor to appear for a new device.
diff --git a/source/_integrations/alarm_control_panel.markdown b/source/_integrations/alarm_control_panel.markdown
index a5c4810db2e..5ccb8b0a88d 100644
--- a/source/_integrations/alarm_control_panel.markdown
+++ b/source/_integrations/alarm_control_panel.markdown
@@ -12,12 +12,12 @@ ha_integration_type: entity
related:
- docs: /integrations/manual/
title: Manual alarm
- - docs: /integrations/alarm_control_panel.template/
+ - docs: /integrations/template/#alarm-control-panel
title: Template alarm
---
Home Assistant can give you an interface which is similar to a classic alarm system.
-Please see [manual alarm](/integrations/manual) or [template alarm](/integrations/alarm_control_panel.template) for alarm configuration.
+Please see [manual alarm](/integrations/manual) or [template alarm](/integrations/template/#alarm-control-panel) for alarm configuration.
{% include integrations/building_block_integration.md %}
diff --git a/source/_integrations/alarm_control_panel.mqtt.markdown b/source/_integrations/alarm_control_panel.mqtt.markdown
index 10a55d74967..ef56a37d347 100644
--- a/source/_integrations/alarm_control_panel.mqtt.markdown
+++ b/source/_integrations/alarm_control_panel.mqtt.markdown
@@ -195,7 +195,7 @@ name:
type: string
default: MQTT Alarm
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
payload_arm_away:
diff --git a/source/_integrations/alarm_control_panel.template.markdown b/source/_integrations/alarm_control_panel.template.markdown
deleted file mode 100644
index 47bc9d9b3f6..00000000000
--- a/source/_integrations/alarm_control_panel.template.markdown
+++ /dev/null
@@ -1,147 +0,0 @@
----
-title: "Template Alarm control panel"
-description: "Instructions on how to integrate template alarm control panels into Home Assistant."
-ha_category:
- - Alarm
- - Helper
-ha_release: 0.105
-ha_iot_class: "Local Push"
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_config_flow: true
-ha_platforms:
- - alarm_control_panel
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` {% term integration %} creates alarm control panels that combine integrations or adds preprocessing logic to actions.
-
-There are several powerful ways to use this {% term integration %}, including grouping existing integrations into a simpler integrations, or adding logic that Home Assistant will execute when accessed.
-
-For example, if you want to expose a true alarm panel to Google Home, Alexa, or HomeKit - but limit its ability to disarm when there's no one home, you can do that using a template.
-
-Another use case could be grouping a series of sensors and services together to represent various "armed" and "disarmed" states and actions.
-
-This can simplify the GUI and make it easier to write automations.
-
-In optimistic mode, the alarm control panel will immediately change state after every command. Otherwise, the alarm control panel will wait for state confirmation from the template. Try to enable it, if experiencing incorrect operation.
-
-{% include integrations/config_flow.md %}
-
-## YAML Configuration
-
-To enable a template alarm control panel in your installation, add the following to your {% term "`configuration.yaml`" %} file.
-{% include integrations/restart_ha_after_config_inclusion.md %}
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-alarm_control_panel:
- - platform: template
- panels:
- safe_alarm_panel:
- value_template: "{{ states('alarm_control_panel.real_alarm') }}"
- arm_away:
- action: alarm_control_panel.alarm_arm_away
- target:
- entity_id: alarm_control_panel.real_alarm
- data:
- code: !secret alarm_code
- arm_home:
- action: alarm_control_panel.alarm_arm_home
- target:
- entity_id: alarm_control_panel.real_alarm
- data:
- code: !secret alarm_code
- disarm:
- - condition: state
- entity_id: device_tracker.paulus
- state: "home"
- - action: alarm_control_panel.alarm_disarm
- target:
- entity_id: alarm_control_panel.real_alarm
- data:
- code: !secret alarm_code
-```
-
-{% endraw %}
-
-{% configuration %}
-panels:
- description: List of your panels.
- required: true
- type: map
- keys:
- alarm_control_panel_name:
- description: The slug of the panel.
- required: true
- type: map
- keys:
- name:
- description: Name to use in the frontend.
- required: false
- type: string
- default: Template Alarm Control Panel
- unique_id:
- description: An ID that uniquely identifies this alarm control panel. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: "Defines a template to set the state of the alarm panel. Only the states `armed_away`, `armed_home`, `armed_night`, `armed_vacation`, `arming`, `disarmed`, `pending`, `triggered` and `unavailable` are used."
- required: false
- type: template
- disarm:
- description: Defines an action to run when the alarm is disarmed.
- required: false
- type: action
- arm_away:
- description: Defines an action to run when the alarm is armed to away mode.
- required: false
- type: action
- arm_home:
- description: Defines an action to run when the alarm is armed to home mode.
- required: false
- type: action
- arm_night:
- description: Defines an action to run when the alarm is armed to night mode.
- required: false
- type: action
- arm_vacation:
- description: Defines an action to run when the alarm is armed to vacation mode.
- required: false
- type: action
- arm_custom_bypass:
- description: Defines an action to run when the alarm is armed to custom bypass mode.
- required: false
- type: action
- trigger:
- description: Defines an action to run when the alarm is triggered.
- required: false
- type: action
- code_arm_required:
- description: If true, the code is required to arm the alarm.
- required: false
- type: boolean
- default: true
- code_format:
- description: One of `number`, `text` or `no_code`. Format for the code used to arm/disarm the alarm.
- required: false
- type: string
- default: number
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of an integration that takes extra time to load, the template alarm control panel may get an `unknown` state during startup. This results in error messages in your log file until that integration has completed loading. If you use `is_state()` function in your template, you can avoid this situation.
-
-For example, you would replace {% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %} with this equivalent that returns `true`/`false` and never gives an unknown result: {% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
diff --git a/source/_integrations/alexa.intent.markdown b/source/_integrations/alexa.intent.markdown
index ed36cb24646..49ad4fe2817 100644
--- a/source/_integrations/alexa.intent.markdown
+++ b/source/_integrations/alexa.intent.markdown
@@ -65,7 +65,7 @@ Next you need to create a Lambda function.
- **US West (Oregon)** region for Japanese and English (AU) skills.
- Click `Functions` in the left navigation bar, display list of your Lambda functions.
- Click `Create function`, select `Author from scratch`, then input a `Function name`.
-- Select *Python 3.* as `Runtime` (Python 3.9 was available at this time).
+- Select `Python 3.x` as the `Runtime` (choose the latest available Python 3 version).
- Select *Use an existing role* as `Execution role`, then select the role you just created from the `Existing role` list.
- Click `Create function`, then you can configure the details of the Lambda function.
- Under the `Configuration` tab, expand `Designer`, then click on `+ Add trigger` in the left part of the panel and select `Alexa Skills Kit` from the dropdown list to add an Alexa Skills Kit trigger to your Lambda function.
diff --git a/source/_integrations/alexa.smart_home.markdown b/source/_integrations/alexa.smart_home.markdown
index 01be1469774..1579315f2ee 100644
--- a/source/_integrations/alexa.smart_home.markdown
+++ b/source/_integrations/alexa.smart_home.markdown
@@ -157,7 +157,7 @@ Next you need create a Lambda function.
- Click `Functions` in the left navigation bar, to display the list of your Lambda functions.
- Click `Create function`, select `Author from scratch`, then input a `Function name`.
-- Select *Python 3.9*, *Python 3.8* or *Python 3.7* as `Runtime`.
+- Select `Python 3.x` as the `Runtime` (choose the latest available Python 3 version).
- Expand the `Change default execution role` dropdown and make sure to select *Use an existing role* as `Execution role`, then select the role you just created from `Existing role` list.
- Click `Create function`, then you can configure the details of Lambda function.
- Expand the `Function overview` (if it isn't already expanded), then click `+ Add trigger` in the left part of the panel, then click `Alexa Smart Home` from the drop down list to add an Alexa Smart Home trigger to your Lambda function.
diff --git a/source/_integrations/amazon_devices.markdown b/source/_integrations/alexa_devices.markdown
similarity index 69%
rename from source/_integrations/amazon_devices.markdown
rename to source/_integrations/alexa_devices.markdown
index 028fec57641..c49c7b40a99 100644
--- a/source/_integrations/amazon_devices.markdown
+++ b/source/_integrations/alexa_devices.markdown
@@ -1,23 +1,28 @@
---
-title: Amazon Devices
-description: Instructions on how to integrate Amazon Devices into Home Assistant.
+title: Alexa Devices
+description: Instructions on how to integrate Alexa Devices into Home Assistant.
ha_category:
- Binary Sensor
- Notify
+ - Sensor
+ - Switch
ha_release: '2025.6'
-ha_domain: amazon_devices
+ha_domain: alexa_devices
ha_config_flow: true
ha_codeowners:
- '@chemelli74'
-ha_iot_class: Local Polling
+ha_iot_class: Cloud Polling
ha_platforms:
- binary_sensor
+ - diagnostics
- notify
+ - sensor
+ - switch
ha_integration_type: hub
ha_quality_scale: bronze
---
-The **Amazon Devices** {% term integration %} lets you control Alexa-enabled devices connected to your Amazon account.
+The **Alexa Devices** {% term integration %} lets you control Alexa-enabled devices connected to your Amazon account.
The integration provides information on connected devices and enables control of the main features.
@@ -31,7 +36,7 @@ There is support for the following device families within Home Assistant:
- **Amazon Echo Plus**
- **Amazon Echo Show**
- **Amazon Fire TV Stick**
-- **Fire Tablet**
+- **Amazon Fire Tablet**
and all 3rd party that has Alexa capabilities built-in
@@ -77,30 +82,7 @@ automation:
data:
message: Welcome home Simone
target:
- entity_id: notify.announce_echo_dot_livingroom
-```
-
-### Automation: Start Radio on all Echo dots
-
-```yaml
-automation:
-- alias: Start Radio B.B.C.
- id: "start_radio_bbc"
- trigger:
- - platform: sun
- event: sunset
- condition:
- conditions:
- - alias: "condition alias (home)"
- condition: state
- entity_id: group.person_family
- state: "home"
- action:
- - action: notify.send_message
- data:
- message: Play B.B.C. on Tunein
- target:
- entity_id: notify.custom_everywhere
+ entity_id: notify.echo_dot_livingroom_announce
```
## Data updates
@@ -109,10 +91,12 @@ This integration {% term polling polls %} data from the device every 30 seconds
## Supported functionality
-The **Amazon Devices** {% term integration %} provides the following entities:
+The **Alexa Devices** {% term integration %} provides the following entities:
- Binary sensor - main and Bluetooth connectivity
- Notify - Speak and Announce notifications
+- Sensor - temperature and illuminance sensors
+- Switch - Do not disturb
## Removing the integration
diff --git a/source/_integrations/altruist.markdown b/source/_integrations/altruist.markdown
new file mode 100644
index 00000000000..838aabd4f45
--- /dev/null
+++ b/source/_integrations/altruist.markdown
@@ -0,0 +1,49 @@
+---
+title: Altruist
+description: Instructions on how to setup Altruist Sensors in Home Assistant.
+ha_category:
+ - Health
+ - Sensor
+ha_config_flow: true
+ha_release: 2025.7
+ha_iot_class: Local Polling
+ha_codeowners:
+ - '@airalab'
+ - '@LoSk-p'
+ha_domain: altruist
+ha_platforms:
+ - sensor
+ha_integration_type: device
+ha_zeroconf: true
+ha_quality_scale: bronze
+---
+
+The **Altruist** {% term integration %} connects Home Assistant to [Air Quality Sensor “Altruist“](https://robonomics.network/devices/altruist/) — a device designed for decentralized environmental monitoring. It captures noise, dust, and temperature data from the sensor over HTTP, making it available as locally usable entities within Home Assistant.
+
+{% include integrations/config_flow.md %}
+
+{% configuration_basic %}
+IP Address:
+ description: "The local IP address for your Altruist device."
+{% endconfiguration_basic %}
+
+## Available sensors
+
+The integration will fetch data from each device. The following sensors are supported:
+
+- Humidity
+- Temperature
+- Atmospheric pressure
+- PM2.5 density
+- PM10 density
+- Ambient noise level
+- Carbon dioxide (CO2) level
+- Total volatile organic compounds (TVOC)
+- Ambient radiation level
+- Wi-Fi signal strength
+
+## Removing the integration
+
+This integration follows standard integration removal, no extra steps are required.
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/androidtv_remote.markdown b/source/_integrations/androidtv_remote.markdown
index f5be3626215..a1a0fe40951 100644
--- a/source/_integrations/androidtv_remote.markdown
+++ b/source/_integrations/androidtv_remote.markdown
@@ -156,7 +156,7 @@ media_player:
## Remote
-The remote allows you to send key commands to your Android TV device with the `remote.send_command` action.
+The remote allows you to send key commands and text as input to your Android TV device with the `remote.send_command` action.
The entity has the `current_activity` attribute that shows the current foreground app on the Android TV.
You can pass the application ID shown in this `current_activity` as `activity` in the `remote.turn_on` action to launch that app.
@@ -242,6 +242,8 @@ Other:
{% enddetails %}
+To send text as keyboard input use the `remote.send_command` and prefix the text to send with `text:`, e.g. `command: text:hello world` to type "hello world" in the selected input field.
+
If `activity` is specified in `remote.turn_on` it will open the specified URL or the application with the given package name. See [Launching apps section](#launching-apps).
Example actions:
@@ -265,6 +267,15 @@ target:
entity_id: remote.living_room_tv
```
+```yaml
+# Send "Never Gonna Give You Up" as keyboard input text to the selected input field
+action: remote.send_command
+data:
+ command: text:Never Gonna Give You Up
+target:
+ entity_id: remote.living_room_tv
+```
+
```yaml
# Launch YouTube
action: remote.turn_on
diff --git a/source/_integrations/aqara.markdown b/source/_integrations/aqara.markdown
index a418c8b7650..6c94d1cef47 100644
--- a/source/_integrations/aqara.markdown
+++ b/source/_integrations/aqara.markdown
@@ -15,10 +15,4 @@ ha_iot_standard: matter
ha_brand: true
---
-[Aqara](https://www.aqara.com/) is a member of the Works with Home Assistant partner program for their Matter products. Aqara is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Aqara Matter devices work locally and integrate seamlessly with the Matter integration in Home Assistant. As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
-
-{% my add_matter_device badge domain=page.ha_domain %}
-
-[Learn more about Matter in Home Assistant.](/integrations/matter/)
\ No newline at end of file
+{% include integrations/wwha.md url="https://www.aqara.com/" %}
diff --git a/source/_integrations/assist_satellite.markdown b/source/_integrations/assist_satellite.markdown
index 9cdbd19935b..f9873249f7b 100644
--- a/source/_integrations/assist_satellite.markdown
+++ b/source/_integrations/assist_satellite.markdown
@@ -112,3 +112,130 @@ target:
extra_system_prompt: "The user has left the lights on in the living room and is being asked if they'd like to turn them off."
preannounce: false # chime disabled
```
+
+### Action `assist_satellite.ask_question`
+
+The {% my developer_call_service service="assist_satellite.ask_question" %} action asks a question on the satellite, listens for a response, and matches it against a predefined list of possible answers. Information about the matched answer is stored in a `response_variable` so the appropriate next steps can be taken in your automation or script.
+
+The question may be provided as text or a media id. If text is used, it will first be converted to a media id using the [text-to-speech](/integrations/tts) system of the satellite's configured [pipeline](/voice_control/voice_remote_local_assistant/).
+
+Audio from the user's response is transcribed using the [speech-to-text](/integrations/stt) system of the satellite's configured [pipeline](/voice_control/voice_remote_local_assistant/).
+
+The `answers` are given as a list of objects with the following structure:
+
+- `id` - unique id of the answer
+- `sentences` - list of [sentence templates](https://developers.home-assistant.io/docs/voice/intent-recognition/template-sentence-syntax/#sentence-templates-syntax)
+
+Sentence templates may contain wildcard `{slots}` that will be stored in the answer's `slots` field. For example, `play {album} by {artist}` will match "play the white album by the beatles" with "white album" stored in `slots.album` and "the beatles" in `slots.artist`.
+
+The matched answer will be stored in a `response_variable` with the structure:
+
+- `id` - unique id of the matching answer (or `None` if no match)
+- `sentence` - response text from user
+- `slots` - values of wildcard `{slots}` from matching answer
+
+{% my developer_call_service badge service="assist_satellite.ask_question" %}
+
+Examples in YAML:
+
+{% raw %}
+
+```yaml
+actions:
+ - action: assist_satellite.ask_question
+ data:
+ question: "Welcome home! What kind of music would you like to listen to?"
+ entity_id: assist_satellite.my_entity
+ answers:
+ - id: jazz
+ sentences:
+ - "[some] jazz [music] [please]"
+ - "something spicy"
+ - id: rock
+ sentences:
+ - "[some] rock [music] [please]"
+ - "something with a beat"
+ - id: nothing
+ sentences:
+ - "nothing [for now] [please]"
+ - "nevermind"
+ - "cancel"
+ response_variable: answer
+ - choose:
+ - conditions:
+ - condition: template
+ value_template: "{{ answer.id == 'jazz' }}"
+ sequence:
+ - action: play_jazz_action
+ - conditions:
+ - condition: template
+ value_template: "{{ answer.id == 'rock' }}"
+ sequence:
+ - action: play_rock_action
+ default:
+ - action: assist_satellite.announce
+ data:
+ message: "OK, maybe some other time."
+ target:
+ entity_id: assist_satellite.my_entity
+```
+
+{%endraw %}
+
+
+Instead of text, the question can also be a media ID:
+
+```yaml
+action: assist_satellite.ask_question
+data:
+ entity_id: assist_satellite.my_entity
+ question_media_id: ITEM_ID
+ answers: ANSWERS
+response_variable: answer
+```
+
+A chime is automatically played before the question. You can override this with your own sound by setting `preannounce_media_id`, or disable the chime entirely by setting `preannounce` to `false`.
+
+Examples in YAML:
+
+```yaml
+action: assist_satellite.ask_question
+data:
+ entity_id: assist_satellite.my_entity
+ preannounce_media_id: ITEM_ID # custom chime
+ question: QUESTION
+ answers: ANSWERS
+response_variable: answer
+```
+
+```yaml
+action: assist_satellite.ask_question
+data:
+ entity_id: assist_satellite.my_entity
+ preannounce: false # chime disabled
+ question: QUESTION
+ answers: ANSWERS
+response_variable: answer
+```
+
+If `answers` is omitted, the response text from the user will be available in the `sentence` text of the `response_variable`.
+
+Examples in YAML:
+
+{% raw %}
+
+```yaml
+actions:
+ - action: assist_satellite.ask_question
+ data:
+ question: "Say something"
+ entity_id: assist_satellite.my_entity
+ response_variable: answer
+ - action: assist_satellite.announce
+ data:
+ message: "You said {{ answer.sentence }}"
+ target:
+ entity_id: assist_satellite.my_entity
+```
+
+{% endraw %}
diff --git a/source/_integrations/axis.markdown b/source/_integrations/axis.markdown
index a33b0195055..088440a8c8b 100644
--- a/source/_integrations/axis.markdown
+++ b/source/_integrations/axis.markdown
@@ -53,6 +53,10 @@ If you are having issues and want to report a problem, always start with making
If your device is not discovered. On your camera, go to **System Options** -> **Advanced** -> **Plain Configuration**. Change the drop-down box to `network` and click `Select Group`. If `Network Interface I0 ZeroConf` contains the `169.x.x.x` IP address, unchecked the box next to `Enabled` for this section and click `Save`.
+### Internet access required for full integration
+
+If the Axis device does not have internet access, Home Assistant may only display the camera stream. Other entities such as sensors and output controls might not appear. To ensure all device features are available, make sure the camera has internet access during initial setup.
+
### Reporting a problem
When creating an issue detailing a problem related to the integration make sure to share the device model and firmware as well as prepare logs. Logs might contain sensitive information so make sure to look through it before sharing.
diff --git a/source/_integrations/balay.markdown b/source/_integrations/balay.markdown
index 2196a2f82ea..32fa2f77d20 100644
--- a/source/_integrations/balay.markdown
+++ b/source/_integrations/balay.markdown
@@ -31,6 +31,8 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
+ha_zeroconf: true
---
{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/bauknecht.markdown b/source/_integrations/bauknecht.markdown
new file mode 100644
index 00000000000..883da38ef3d
--- /dev/null
+++ b/source/_integrations/bauknecht.markdown
@@ -0,0 +1,23 @@
+---
+title: Bauknecht
+description: Connect and control your Bauknecht devices using the Whirlpool Appliances integration
+ha_category:
+ - Hub
+ha_integration_type: virtual
+ha_supporting_domain: whirlpool
+ha_supporting_integration: Whirlpool Appliances
+ha_release: '2025.8'
+ha_domain: bauknecht
+ha_codeowners:
+ - '@abmantis'
+ - '@mkmer'
+ha_config_flow: true
+ha_platforms:
+ - binary_sensor
+ - climate
+ - diagnostics
+ - sensor
+ha_iot_class: Cloud Push
+---
+
+{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/binary_sensor.mqtt.markdown b/source/_integrations/binary_sensor.mqtt.markdown
index 5b7f8a1be0f..1931e808e80 100644
--- a/source/_integrations/binary_sensor.mqtt.markdown
+++ b/source/_integrations/binary_sensor.mqtt.markdown
@@ -169,7 +169,7 @@ name:
type: string
default: MQTT binary sensor
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
off_delay:
diff --git a/source/_integrations/blue_current.markdown b/source/_integrations/blue_current.markdown
index 3510cec4bac..c88b7270063 100644
--- a/source/_integrations/blue_current.markdown
+++ b/source/_integrations/blue_current.markdown
@@ -13,6 +13,7 @@ ha_codeowners:
- '@jtodorova23'
ha_domain: blue_current
ha_platforms:
+ - button
- sensor
ha_integration_type: integration
---
diff --git a/source/_integrations/bluesound.markdown b/source/_integrations/bluesound.markdown
index f62b71ce814..f4b8393ba66 100644
--- a/source/_integrations/bluesound.markdown
+++ b/source/_integrations/bluesound.markdown
@@ -7,8 +7,8 @@ ha_release: 0.51
ha_iot_class: Local Polling
ha_domain: bluesound
ha_platforms:
- - media_player
- button
+ - media_player
ha_codeowners:
- '@thrawnarn'
- '@LouisChrist'
diff --git a/source/_integrations/bosch_alarm.markdown b/source/_integrations/bosch_alarm.markdown
index 1688537a4c0..543f0fa3ee1 100644
--- a/source/_integrations/bosch_alarm.markdown
+++ b/source/_integrations/bosch_alarm.markdown
@@ -20,13 +20,32 @@ ha_platforms:
- sensor
- switch
ha_integration_type: device
-ha_quality_scale: bronze
+ha_quality_scale: platinum
+ha_dhcp: true
---
The **Bosch Alarm Panel** {% term integration %} allows you to connect your [Bosch Alarm Panel](https://www.boschsecurity.com) to Home Assistant to control and monitor your Bosch Alarm Panel.
{% include integrations/config_flow.md %}
+{% configuration_basic %}
+Host:
+ description: "The IP address of your panel. You can find it in your router, or within A-Link Plus / RPS."
+Port:
+ description: "The port used by your panel. This is usually 7700 unless it was changed when the panel was configured."
+Password:
+ description: "The automation code set up for your panel. This can be found within A-Link Plus or RPS. Used by the AMAX, B and G series panels."
+User code:
+ description: "The user code for the user that this integration will communicate with the panel with. This is usually the code you would use when arming or disarming the panel via a code pad. Used by the Solution series panels."
+Installer code:
+ description: "The installer code for your panel. This can be found within A-Link Plus. Used by the AMAX series panels."
+
+{% endconfiguration_basic %}
+
+{% important %}
+Since the _Mode 2_ automation user has "superuser" privileges, it bypasses the regularly configured alarm pin: you will _not_ be prompted for a _User_ code when arming/disarming through the integration.
+{% endimportant %}
+
## Supported devices
- _Solution 2000/3000/4000_
diff --git a/source/_integrations/bring.markdown b/source/_integrations/bring.markdown
index d214b7afe73..3608a479f29 100644
--- a/source/_integrations/bring.markdown
+++ b/source/_integrations/bring.markdown
@@ -97,7 +97,7 @@ If you want to receive these notifications, you must use a dedicated account, as
| `message` | no | Type of push notification to send to list members. See [Notification types](#available-notification-types). |
| `item` | yes | Required for `urgent_message`. Item to include in the message. For example: *Attention! Attention! - We still urgently need: Cilantro*. |
-### Available notification types
+#### Available notification types
| Notification type | Name of notification |
| ------------------- | -------------------------------------------------------------- |
@@ -117,7 +117,9 @@ The notification that list members receive differs from the label shown in the B
{% endnote %}
-### Sending a going shopping notification
+{% details "Example YAML configuration" %}
+
+#### Sending a going shopping notification
```yaml
...
@@ -129,7 +131,7 @@ actions:
message: going_shopping
```
-### Sending an urgent message notification
+#### Sending an urgent message notification
Note that for the notification type `urgent_message` the attribute `item` is **required**.
@@ -144,6 +146,40 @@ actions:
item: Cilantro
```
+{% enddetails %}
+
+### Action: Send reaction
+
+Reactions in **Bring!** let users quickly acknowledge shopping list updates with emojis. The action `bring.send_reaction` in Home Assistant allows sending reactions like 👍 or ❤️ to the latest event from the [Activities entity](#events).
+
+| Data attribute | Optional | Description |
+| ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ |
+| `entity_id` | no | The Bring! Activities entity to react to its latest activity. For example, event.shopping_list_activities. |
+| `reaction` | no | Reaction to send in response to an activity by a list member. |
+
+#### Available reactions
+
+| Reaction | Emoji |
+|------------|-------|
+| `THUMBS_UP`| 👍🏼 |
+| `MONOCLE` | 🧐 |
+| `DROOLING` | 🤤 |
+| `HEART` | ❤️ |
+
+{% details "Example YAML configuration" %}
+
+```yaml
+...
+actions:
+ - action: bring.send_reaction
+ data:
+ reaction: HEART
+ target:
+ entity_id: event.shoppinglist_activities
+```
+
+{% enddetails %}
+
## Automations
Get started with these automation examples for **Bring!**, each featuring ready-to-use blueprints!
diff --git a/source/_integrations/bsblan.markdown b/source/_integrations/bsblan.markdown
index e03f3182304..d844b4b14f9 100644
--- a/source/_integrations/bsblan.markdown
+++ b/source/_integrations/bsblan.markdown
@@ -17,6 +17,7 @@ ha_platforms:
- sensor
- water_heater
ha_integration_type: device
+ha_zeroconf: true
---
The **BSB-Lan** {% term integration %} integrates [BSBLan](https://github.com/fredlcore/BSB-LAN) devices into Home Assistant.
@@ -35,11 +36,21 @@ For more information of which system it supports, take a look at their [document
For authentication HTTP authentication using a username and password,
or using a passkey is supported. Use either one.
+## Available sensors depending on your heating system
+
+- `inside temperature`
+- `outside temperature`
+
+## Available platforms depending on your system
+
+- `climate`
+- `water heater`
+
For more documentation of the BSBLan device, check the [manual](https://docs.bsb-lan.de).
To see a more detailed listing of the reported systems which are successfully used with BSB-LAN, please follow the corresponding link:
[Supported heating systems](https://docs.bsb-lan.de/supported_heating_systems.html)
-The integration is tested with the stable firmware version `3.1.6-20230327101530`. A newer firmware version may not work because the API could have changed.
-Please use this release. [release 3.1](https://github.com/fredlcore/BSB-LAN/releases/tag/v3.1)
+The integration is tested with the stable firmware version `5.0.16-20250525002819`. A newer firmware version may not work because the API could have changed.
+For autodiscovery, use the latest release. [release 5.0](https://github.com/fredlcore/BSB-LAN/releases/tag/v5.0)
diff --git a/source/_integrations/button.markdown b/source/_integrations/button.markdown
index ac62dcc0ccf..8b7b2544176 100644
--- a/source/_integrations/button.markdown
+++ b/source/_integrations/button.markdown
@@ -42,7 +42,10 @@ In addition, the entity can have the following states:
- **Unknown**: The state is not yet known.
Because the {% term state %} of a button entity in Home Assistant is a timestamp, it
-means we can use it in our automations. For example:
+changes every time the button is pressed. This means we can trigger automations on
+any state change of the button entity, which effectively captures when the button
+is pressed. We don't need to use the actual timestamp value; we only care that the
+state changed, indicating a button press:
```yaml
triggers:
diff --git a/source/_integrations/button.mqtt.markdown b/source/_integrations/button.mqtt.markdown
index 8cda3240c31..36fcad4a52d 100644
--- a/source/_integrations/button.mqtt.markdown
+++ b/source/_integrations/button.mqtt.markdown
@@ -157,7 +157,7 @@ name:
type: string
default: MQTT Button
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
payload_available:
diff --git a/source/_integrations/camera.mqtt.markdown b/source/_integrations/camera.mqtt.markdown
index 32b8827f32a..179b0cadf46 100644
--- a/source/_integrations/camera.mqtt.markdown
+++ b/source/_integrations/camera.mqtt.markdown
@@ -158,7 +158,7 @@ name:
required: false
type: string
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
topic:
diff --git a/source/_integrations/climate.mqtt.markdown b/source/_integrations/climate.mqtt.markdown
index 6d13385fa05..c03f1a36914 100644
--- a/source/_integrations/climate.mqtt.markdown
+++ b/source/_integrations/climate.mqtt.markdown
@@ -239,7 +239,7 @@ name:
type: string
default: MQTT HVAC
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/comelit.markdown b/source/_integrations/comelit.markdown
index e05e6c339ae..1ba6d2ad627 100644
--- a/source/_integrations/comelit.markdown
+++ b/source/_integrations/comelit.markdown
@@ -26,7 +26,7 @@ ha_platforms:
- sensor
- switch
ha_integration_type: hub
-ha_quality_scale: bronze
+ha_quality_scale: silver
---
The **Comelit SimpleHome** {% term integration %} allows you to control your [Comelit home automation devices](https://comelitgroup.it/installatore/offerta/home-building-automation/).
diff --git a/source/_integrations/compensation.markdown b/source/_integrations/compensation.markdown
index ff3f4938810..28e3f9f5327 100644
--- a/source/_integrations/compensation.markdown
+++ b/source/_integrations/compensation.markdown
@@ -49,34 +49,21 @@ compensation:
```
{% configuration %}
-source:
- description: The entity to monitor/compensate.
- required: true
+attribute:
+ description: Attribute from the source to monitor/compensate. When omitted, the state value of the source will be used.
+ required: false
type: string
data_points:
description: "The collection of data point conversions with the format `[uncompensated_value, compensated_value]`. e.g., `[1.0, 2.1]`. The number of required data points is equal to the polynomial `degree` + 1. For example, a linear compensation (with `degree: 1`) requires at least 2 data points."
required: true
type: list
-unique_id:
- description: An ID that uniquely identifies this sensor. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
-attribute:
- description: Attribute from the source to monitor/compensate. When omitted the state value of the source will be used.
- required: false
- type: string
degree:
description: "The degree of a polynomial. e.g., Linear compensation (y = x + 3) has 1 degree, Quadratic compensation (y = x2 + x + 3) has 2 degrees, etc."
required: false
default: 1
type: integer
-precision:
- description: Defines the precision of the calculated values, through the argument of round().
- required: false
- default: 2
- type: integer
-unit_of_measurement:
- description: Defines the units of measurement of the sensor, if any.
+device_class:
+ description: Sets the [class of the device](/integrations/sensor#device-class), changing the device state and icon that is displayed on the frontend.
required: false
type: string
lower_limit:
@@ -84,6 +71,31 @@ lower_limit:
required: false
type: boolean
default: false
+name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+precision:
+ description: Defines the precision of the calculated values, through the argument of round().
+ required: false
+ default: 2
+ type: integer
+source:
+ description: The entity to monitor/compensate.
+ required: true
+ type: string
+state_class:
+ description: The [state_class](https://developers.home-assistant.io/docs/core/entity/sensor#available-state-classes) of the sensor.
+ required: false
+ type: string
+unique_id:
+ description: An ID that uniquely identifies this sensor. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+unit_of_measurement:
+ description: Defines the units of measurement of the sensor, if any.
+ required: false
+ type: string
upper_limit:
description: "Enables an upper limit for the sensor. The upper limit is defined by the data collections (`data_points`) greatest `uncompensated_value`. For example, if the greatest `uncompensated_value` value is `5.0` and the paired `compensated_value` is `10.0`, any `source` state greater than `5.0` will produce a compensated state of `10.0`."
required: false
diff --git a/source/_integrations/constructa.markdown b/source/_integrations/constructa.markdown
index 81324c5b23a..7e59f7a5786 100644
--- a/source/_integrations/constructa.markdown
+++ b/source/_integrations/constructa.markdown
@@ -31,6 +31,8 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
+ha_zeroconf: true
---
{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/cover.mqtt.markdown b/source/_integrations/cover.mqtt.markdown
index 61e61ca4313..f6c90f35845 100644
--- a/source/_integrations/cover.mqtt.markdown
+++ b/source/_integrations/cover.mqtt.markdown
@@ -170,7 +170,7 @@ name:
type: string
default: MQTT Cover
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/cover.template.markdown b/source/_integrations/cover.template.markdown
deleted file mode 100644
index c24773e2854..00000000000
--- a/source/_integrations/cover.template.markdown
+++ /dev/null
@@ -1,376 +0,0 @@
----
-title: "Template cover"
-description: "Instructions on how to integrate template covers into Home Assistant."
-ha_category:
- - Cover
- - Helper
-ha_release: 0.48
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - cover
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform can create covers that combine integrations and provides
-the ability to run scripts or invoke actions for each of the open,
-close, stop, position and tilt commands of a cover.
-
-## Configuration
-
-To enable Template Covers in your installation,
-add the following to your {% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-cover:
- - platform: template
- covers:
- garage_door:
- device_class: garage
- friendly_name: "Garage Door"
- value_template: "{{ states('sensor.garage_door')|float > 0 }}"
- open_cover:
- action: script.open_garage_door
- close_cover:
- action: script.close_garage_door
- stop_cover:
- action: script.stop_garage_door
-```
-
-{% endraw %}
-
-{% configuration %}
- covers:
- description: List of your covers.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this cover. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `value_template` and a `position_template`](#combining-value_template-and-position_template) are specified, only `opening` and `closing` are set from the `value_template`. If the template produces a `None` value the state will be set to `unknown`.
- required: false
- type: template
- position_template:
- description: Defines a template to get the position of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current position will be set to `unknown`.
- required: false
- type: template
- icon_template:
- description: Defines a template to specify which icon to use.
- required: false
- type: template
- entity_picture_template:
- description: Defines a template for the entity picture of the cover.
- required: false
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- device_class:
- description: Sets the [class of the device](/integrations/cover/), changing the device state and icon that is displayed on the frontend.
- required: false
- type: string
- open_cover:
- description: Defines an action to open the cover. If [`open_cover`](#open_cover) is specified, [`close_cover`](#close_cover) must also be specified. At least one of [`open_cover`](#open_cover) and [`set_cover_position`](#set_cover_position) must be specified.
- required: inclusive
- type: action
- close_cover:
- description: Defines an action to close the cover.
- required: inclusive
- type: action
- stop_cover:
- description: Defines an action to stop the cover.
- required: false
- type: action
- set_cover_position:
- description: Defines an action to set to a cover position (between `0` and `100`). The variable `position` will contain the entity's set position.
- required: false
- type: action
- set_cover_tilt_position:
- description: Defines an action to set the tilt of a cover (between `0` and `100`). The variable `tilt` will contain the entity's set tilt position.
- required: false
- type: action
- optimistic:
- description: Force cover position to use [optimistic mode](#optimistic-mode).
- required: false
- type: boolean
- default: false
- tilt_optimistic:
- description: Force cover tilt position to use [optimistic mode](#optimistic-mode).
- required: false
- type: boolean
- default: false
- tilt_template:
- description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current tilt state will be set to `unknown`.
- required: false
- type: template
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of a platform that takes extra time to load, the
-Template Cover may get an `unknown` state during startup. This results in error
-messages in your log file until that platform has completed loading.
-If you use `is_state()` function in your template, you can avoid this situation.
-For example, you would replace
-{% raw %}`{{ states.cover.source.state == 'open' }}`{% endraw %}
-with this equivalent that returns `true`/`false` and never gives an unknown
-result:
-{% raw %}`{{ is_state('cover.source', 'open') }}`{% endraw %}
-
-## Optimistic mode
-
-In optimistic mode, the cover position state is maintained internally. This mode
-is automatically enabled if neither [`value_template`](#value_template) or
-[`position_template`](#position_template) are specified. Note that this is
-unlikely to be very reliable without some feedback mechanism, since there is
-otherwise no way to know if the cover is moving properly. The cover can be
-forced into optimistic mode by using the [`optimistic`](#optimistic) attribute.
-There is an equivalent mode for `tilt_position` that is enabled when
-[`tilt_template`](#tilt_template) is not specified or when the
-[`tilt_optimistic`](#tilt_optimistic) attribute is used.
-
-## Combining `value_template` and `position_template`
-
-If both a [`value_template`](#value_template) and a [`position_template`](#position_template) are specified only `opening` and `closing` states are set directly from the `value_template`, the `open` and `closed` states will instead be derived from the cover position.
-
-| value_template output | result |
-| --------------------- | ------------------------------------ |
-| open | state defined by `position_template` |
-| closed | state defined by `position_template` |
-| true | state defined by `position_template` |
-| false | state defined by `position_template` |
-| opening | state set to `opening` |
-| closing | state set to `closing` |
-| | No change of state or position |
-
-## Examples
-
-In this section you will find some real-life examples of how to use this cover.
-
-### Garage door
-
-This example converts a garage door with a controllable switch and position
-sensor into a cover. The condition check is optional, but suggested if you
-use the same switch to open and close the garage.
-
-{% raw %}
-
-```yaml
-cover:
- - platform: template
- covers:
- garage_door:
- device_class: garage
- friendly_name: "Garage Door"
- position_template: "{{ states('sensor.garage_door') }}"
- open_cover:
- - condition: state
- entity_id: sensor.garage_door
- state: "off"
- - action: switch.turn_on
- target:
- entity_id: switch.garage_door
- close_cover:
- - condition: state
- entity_id: sensor.garage_door
- state: "on"
- - action: switch.turn_off
- target:
- entity_id: switch.garage_door
- stop_cover:
- action: switch.turn_on
- target:
- entity_id: switch.garage_door
- icon_template: >-
- {% if states('sensor.garage_door')|float > 0 %}
- mdi:garage-open
- {% else %}
- mdi:garage
- {% endif %}
-```
-
-{% endraw %}
-
-### Multiple covers
-
-This example allows you to control two or more covers at once.
-
-{% raw %}
-
-```yaml
-homeassistant:
- customize:
- cover_group:
- assumed_state: true
-
-cover:
- - platform: template
- covers:
- cover_group:
- friendly_name: "Cover Group"
- open_cover:
- action: script.cover_group
- data:
- modus: "open"
- close_cover:
- action: script.cover_group
- data:
- modus: "close"
- stop_cover:
- action: script.cover_group
- data:
- modus: "stop"
- set_cover_position:
- action: script.cover_group_position
- data:
- position: "{{position}}"
- set_cover_tilt_position:
- action: script.cover_group_tilt_position
- data:
- tilt: "{{tilt}}"
- value_template: "{{is_state('sensor.cover_group', 'open')}}"
- icon_template: >-
- {% if is_state('sensor.cover_group', 'open') %}
- mdi:window-open
- {% else %}
- mdi:window-closed
- {% endif %}
-
-sensor:
- - platform: template
- sensors:
- cover_group:
- value_template: >-
- {% if is_state('cover.bedroom', 'open') %}
- open
- {% elif is_state('cover.livingroom', 'open') %}
- open
- {% else %}
- closed
- {% endif %}
-
-script:
- cover_group:
- sequence:
- - action: "cover.{{modus}}_cover"
- target:
- entity_id:
- - cover.bedroom
- - cover.livingroom
- cover_group_position:
- sequence:
- - action: cover.set_cover_position
- target:
- entity_id:
- - cover.bedroom
- - cover.livingroom
- data:
- position: "{{position}}"
-
-automation:
- - alias: "Close covers at night"
- triggers:
- - trigger: sun
- event: sunset
- offset: "+00:30:00"
- actions:
- - action: cover.set_cover_position
- target:
- entity_id: cover.cover_group
- data:
- position: 25
-```
-
-{% endraw %}
-
-### Change the icon
-
-This example shows how to change the icon based on the cover state.
-
-{% raw %}
-
-```yaml
-cover:
- - platform: template
- covers:
- cover_group:
- friendly_name: "Cover Group"
- open_cover:
- action: script.cover_group
- data:
- modus: "open"
- close_cover:
- action: script.cover_group
- data:
- modus: "close"
- stop_cover:
- action: script.cover_group
- data:
- modus: "stop"
- value_template: "{{is_state('sensor.cover_group', 'open')}}"
- icon_template: >-
- {% if is_state('sensor.cover_group', 'open') %}
- mdi:window-open
- {% else %}
- mdi:window-closed
- {% endif %}
-```
-
-{% endraw %}
-
-### Change the entity picture
-
-This example shows how to change the entity picture based on the cover state.
-
-{% raw %}
-
-```yaml
-cover:
- - platform: template
- covers:
- cover_group:
- friendly_name: "Cover Group"
- open_cover:
- action: script.cover_group
- data:
- modus: "open"
- close_cover:
- action: script.cover_group
- data:
- modus: "close"
- stop_cover:
- action: script.cover_group
- data:
- modus: "stop"
- value_template: "{{is_state('sensor.cover_group', 'open')}}"
- entity_picture_template: >-
- {% if is_state('sensor.cover_group', 'open') %}
- /local/cover-open.png
- {% else %}
- /local/cover-closed.png
- {% endif %}
-```
-
-{% endraw %}
diff --git a/source/_integrations/derivative.markdown b/source/_integrations/derivative.markdown
index 07fc32a3744..909ba0029a6 100644
--- a/source/_integrations/derivative.markdown
+++ b/source/_integrations/derivative.markdown
@@ -11,6 +11,7 @@ ha_iot_class: Calculated
ha_qa_scale: internal
ha_codeowners:
- '@afaucogney'
+ - '@karwosts'
ha_domain: derivative
ha_config_flow: true
ha_platforms:
@@ -37,6 +38,8 @@ Metric Prefix:
description: Metric unit to prefix the derivative result ([Wikipedia](https://en.wikipedia.org/wiki/Unit_prefix)).
Time unit:
description: SI unit of time of the derivative. If this parameter is set, the unit of measurement will be set to **x/y** where **x** is the unit of the source sensor and **y** is the value of this parameter.
+Max sub-interval:
+ description: Normally, the derivative is calculated each time the source sensor updates. If a time is specified for this option, the derivative will also be recalculated if this amount of time elapses without an update of the source sensor.
{% endconfiguration_basic %}
## YAML configuration
@@ -86,6 +89,11 @@ time_window:
default: 0
required: false
type: time
+max_sub_interval:
+ description: Normally, the derivative is calculated each time the source sensor updates. If a time is specified for this option, the derivative will also be recalculated if this amount of time elapses without an update of the source sensor.
+ required: false
+ type: time
+ default: 0
{% endconfiguration %}
## Temperature example
diff --git a/source/_integrations/device_tracker.markdown b/source/_integrations/device_tracker.markdown
index 0d8a4841115..11705f3ffb1 100644
--- a/source/_integrations/device_tracker.markdown
+++ b/source/_integrations/device_tracker.markdown
@@ -17,10 +17,10 @@ The device tracker allows you to track devices in Home Assistant. This can happe
## Configuring a `device_tracker` platform
-To get started add the following lines to your {% term "`configuration.yaml`" %} (example for Netgear):
+To get started add the following lines to your {% term "`configuration.yaml`" %} (example for NETGEAR):
```yaml
-# Example configuration.yaml entry for Netgear device
+# Example configuration.yaml entry for NETGEAR device
device_tracker:
- platform: netgear
host: IP_ADDRESS
@@ -50,7 +50,7 @@ Note that setting `track_new_devices: false` will still result in new devices be
In the {% term "`configuration.yaml`" %}, the extended example from above would look like the following sample:
```yaml
-# Example configuration.yaml entry for Netgear device
+# Example configuration.yaml entry for NETGEAR device
device_tracker:
- platform: netgear
host: IP_ADDRESS
diff --git a/source/_integrations/device_tracker.mqtt.markdown b/source/_integrations/device_tracker.mqtt.markdown
index 5efd902efbf..09e3f0e5b7a 100644
--- a/source/_integrations/device_tracker.mqtt.markdown
+++ b/source/_integrations/device_tracker.mqtt.markdown
@@ -139,7 +139,7 @@ name:
required: false
type: string
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
payload_available:
diff --git a/source/_integrations/doorbird.markdown b/source/_integrations/doorbird.markdown
index 6d8f769487a..9f092be616c 100644
--- a/source/_integrations/doorbird.markdown
+++ b/source/_integrations/doorbird.markdown
@@ -32,7 +32,7 @@ There is currently support for the following device types within Home Assistant:
## Setup
-It is recommended to set up a new & dedicated account on your DoorBird App/web portal for use with Home Assistant. The instructions in this document refer specifically to the DoorBird IOS/Android app. Still, most actions can also be performed using the web-based [DoorBird - WebAdmin](https://webadmin.doorbird.com) portal and logging in on your DoorBird admin account.
+It is recommended to set up a new & dedicated account on your DoorBird App/web portal for use with Home Assistant. The instructions in this document refer specifically to the DoorBird iOS/Android app. Still, most actions can also be performed using the web-based [DoorBird - WebAdmin](https://webadmin.doorbird.com) portal and logging in on your DoorBird admin account.
To setup a new account for Home Assistant, open the DoorBird App by selecting **Settings** (cog icon) > **Administration** > **LOGIN** (using your DoorBird App Administration details). Under the **USER** section, choose **Add**. This new user account requires specific permissions enabled (depending on what functionality you want). Permissions can be found under **Permissions**. The following permissions are recommended (or amend depending on your requirements:
@@ -84,7 +84,7 @@ The URLs on the event will be based on the configuration used to connect to your
Once events have been registered on the DoorBird device, they must be attached to a schedule using the official DoorBird app on Android or iOS or the [DoorBird - WebAdmin](https://webadmin.doorbird.com) portal. Currently, there are schedules available for doorbell, motion, relay, and RFID events (on supported DoorBird devices). Essentially, you can enable an HTTP(S) call from your DoorBird device to the Home Assistant DoorBird API by configuring an action/event (by enabling a schedule).
-The schedules can be found by navigating to the following area of the DoorBird app (Android or IOS):
+The schedules can be found by navigating to the following area of the DoorBird app (Android or iOS):
**Settings** (cog icon) > **Administration** > **LOGIN** (using your App Administration details) > (under **EXPERT SETTINGS**) Schedule for doorbell.
diff --git a/source/_integrations/dweet.markdown b/source/_integrations/dweet.markdown
deleted file mode 100644
index 34149c3602c..00000000000
--- a/source/_integrations/dweet.markdown
+++ /dev/null
@@ -1,148 +0,0 @@
----
-title: dweet.io
-description: Transfer events to Dweet.io.
-ha_category:
- - History
- - Sensor
-ha_release: 0.19
-ha_iot_class: Cloud Polling
-ha_domain: dweet
-ha_platforms:
- - sensor
-ha_integration_type: integration
-related:
- - docs: /docs/configuration/
- title: Configuration file
-ha_quality_scale: legacy
----
-
-The `dweet` {% term integration %} makes it possible to transfer details collected with Home Assistant to [Dweet.io](https://dweet.io/) and visualize them with [freeboard.io](https://freeboard.io). Keep in mind that your information will be public!
-
-
-
-
-
-{% note %}
-The publishing interval is limited to 1 second. This means that it's possible to miss fast changes.
-{% endnote %}
-
-There is currently support for the following device types within Home Assistant:
-
-- [Sensor](#sensor)
-
-## Configuration
-
-To use the `dweet` integration in your installation, add the following to your {% term "`configuration.yaml`" %} file.
-{% include integrations/restart_ha_after_config_inclusion.md %}
-
-```yaml
-# Example configuration.yaml entry
-dweet:
- name: YOUR_UNIQUE_IDENTIFIER
- whitelist:
- - input_number.brightness
- - input_boolean.notify_home
- - sensor.weather_temperature
- - sensor.cpu
-```
-
-{% configuration %}
-name:
- description: A unique identifier for your Home Assistant instance.
- required: true
- type: string
-whitelist:
- description: List of entity IDs you want to publish
- required: true
- type: list
-{% endconfiguration %}
-
-## Sensor
-
-The `dweet` sensor platform allows you to get details from your devices which are publishing their values to [Dweet.io](https://dweet.io/).
-
-### Configuration
-
-To use Dweet.io sensors in your installation, add the following to your {% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-sensor:
- - platform: dweet
- device: THING_NAME
- value_template: "{{ value_json.VARIABLE }}"
-```
-
-{% endraw %}
-
-{% configuration %}
-device:
- description: Identification of the device (also known as `thing`).
- required: true
- type: string
-value_template:
- description: The variable to extract a value from the content.
- required: true
- type: template
-name:
- description: Let you overwrite the name of the device in the frontend.
- required: false
- default: Dweet.io Sensor
- type: string
-unit_of_measurement:
- description: Defines the unit of measurement of the sensor, if any.
- required: false
- type: string
-{% endconfiguration %}
-
-### Full configuration sample
-
-A full configuration entry could look like the sample below.
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-sensor:
- - platform: dweet
- name: Temperature
- device: THING_NAME
- value_template: "{{ value_json.VARIABLE }}"
- unit_of_measurement: "°C"
-```
-
-{% endraw %}
-
-### Interacting with Dweet.io
-
-You can easily send dweets from the command-line to test your sensor with `curl`.
-
-```bash
-curl -H 'Content-Type: application/json' -d '{"temperature": 40, "humidity": 65}' https://dweet.io/dweet/for/ha-sensor
-```
-
-will give you a response like the one below:
-
-```json
-{"this":"succeeded","by":"dweeting","the":"dweet","with":{"thing":"ha-sensor","created":"2015-12-10T09:43:31.133Z","content":{"temperature":40,"humidity":65}}}
-```
-
-The [dweepy](https://github.com/paddycarey/dweepy) module gives you another option to work with [Dweet.io](https://dweet.io/).
-
-Send a dweet.
-
-```bash
-$ python3
->>> import dweepy
->>> dweepy.dweet_for('ha-sensor', {'temperature': '23', 'humiditiy':'81'})
-{'thing': 'ha-sensor', 'created': '2015-12-10T09:46:08.559Z', 'content': {'humiditiy': 81, 'temperature': 23}}
-```
-
-Receive the latest dweet.
-
-```bash
->>> dweepy.get_latest_dweet_for('ha-sensor')
-[{'thing': 'ha-sensor'', 'created': '2015-12-10T09:43:31.133Z', 'content': {'humidity': 65, 'temperature': 40}}]
-```
diff --git a/source/_integrations/eafm.md b/source/_integrations/eafm.markdown
similarity index 97%
rename from source/_integrations/eafm.md
rename to source/_integrations/eafm.markdown
index 9e308858fb1..6e9e99e0d32 100644
--- a/source/_integrations/eafm.md
+++ b/source/_integrations/eafm.markdown
@@ -1,27 +1,27 @@
----
-title: UK Environment Agency Flood Monitoring
-description: Monitor nearby water levels and be prepared for flooding with the UK Environment Agency API integration.
-ha_category:
- - Sensor
-ha_release: 0.115
-ha_iot_class: Cloud Polling
-ha_config_flow: true
-ha_codeowners:
- - '@Jc2k'
----
-
-The `eafm` integration offers integration with the [UK Environment Agency Flood Monitoring](https://environment.data.gov.uk/flood-monitoring/doc/reference) API to provide sensors for nearby water levels. Combined with Home Assistant notifications, you could give yourself a warning if a nearby river was likely to flood your local cycle path or the only road out of your village.
-
-{% important %}
-
-The UK Environment Agency Flood Monitoring only provides data for England - Northern Ireland, Scotland and Wales have their own flood agencies.
-
-{% endimportant %}
-
-## Configuration
-
-Home Assistant offers the flood monitoring integration through **Settings** -> **Devices & services** -> **Environment Agency Flood Gauges**.
-
-You will be prompted to select a monitoring station. You can find the name of nearby monitoring stations on the Flood information service [website](https://check-for-flooding.service.gov.uk/river-and-sea-levels).
-
-Sensors for that monitoring station should then appear in your Home Assistant instance.
+---
+title: UK Environment Agency Flood Monitoring
+description: Monitor nearby water levels and be prepared for flooding with the UK Environment Agency API integration.
+ha_category:
+ - Sensor
+ha_release: 0.115
+ha_iot_class: Cloud Polling
+ha_config_flow: true
+ha_codeowners:
+ - '@Jc2k'
+---
+
+The `eafm` integration offers integration with the [UK Environment Agency Flood Monitoring](https://environment.data.gov.uk/flood-monitoring/doc/reference) API to provide sensors for nearby water levels. Combined with Home Assistant notifications, you could give yourself a warning if a nearby river was likely to flood your local cycle path or the only road out of your village.
+
+{% important %}
+
+The UK Environment Agency Flood Monitoring only provides data for England - Northern Ireland, Scotland and Wales have their own flood agencies.
+
+{% endimportant %}
+
+## Configuration
+
+Home Assistant offers the flood monitoring integration through **Settings** -> **Devices & services** -> **Environment Agency Flood Gauges**.
+
+You will be prompted to select a monitoring station. You can find the name of nearby monitoring stations on the Flood information service [website](https://check-for-flooding.service.gov.uk/river-and-sea-levels).
+
+Sensors for that monitoring station should then appear in your Home Assistant instance.
diff --git a/source/_integrations/eastron.markdown b/source/_integrations/eastron.markdown
index 826ea9fd210..87dbdc73a9f 100644
--- a/source/_integrations/eastron.markdown
+++ b/source/_integrations/eastron.markdown
@@ -15,6 +15,7 @@ ha_platforms:
- button
- diagnostics
- number
+ - select
- sensor
- switch
ha_iot_class: Local Polling
diff --git a/source/_integrations/eheimdigital.markdown b/source/_integrations/eheimdigital.markdown
index 66b5e2cc6b9..0a99de2a4f8 100644
--- a/source/_integrations/eheimdigital.markdown
+++ b/source/_integrations/eheimdigital.markdown
@@ -18,6 +18,7 @@ ha_domain: eheimdigital
ha_integration_type: hub
ha_platforms:
- climate
+ - diagnostics
- light
- number
- select
diff --git a/source/_integrations/enphase_envoy.markdown b/source/_integrations/enphase_envoy.markdown
index 0e3be7650e8..579b54d4d99 100644
--- a/source/_integrations/enphase_envoy.markdown
+++ b/source/_integrations/enphase_envoy.markdown
@@ -128,7 +128,21 @@ The Envoy reports individual micro-inverter device production data. SN is the mi
##### Sensor entities
- **Inverter SN**: Current power generated by the inverter in W.
-- **Inverter SN last reported**: Time when Envoy last received a data update from the inverter. Typical update rate for an inverter to the Envoy is every 5 minutes. This entity is disabled by default for all inverters.
+- **Inverter SN last reported**: Time when Envoy last received a data update from the inverter. Typical update rate for an inverter to the Envoy is every 5 to 15 minutes. This entity is disabled by default for all inverters.
+- **Inverter SN Lifetime maximum power**: Maximum power production measured by the inverter (W). This entity is disabled by default for all inverters.
+
+Based on the Envoy firmware version, the Envoy may provide inverter device data as well. If that is the case, additional entities are available. These are disabled by default for all inverters. Enable these as desired.
+
+- **Inverter SN DC voltage**: DC voltage measured by the inverter (V).
+- **Inverter SN DC current**: DC current measured by the inverter (A).
+- **Inverter SN AC voltage**: AC voltage measured by the inverter (V).
+- **Inverter SN AC current**: AC current measured by the inverter (A).
+- **Inverter SN Frequency**: Frequency measured by the inverter (Hz).
+- **Inverter SN Temperature**: Temperature measured by the inverter (°C).
+- **Inverter SN Energy produced**: Energy produced by the inverter during last report cycle (mWh).
+- **Inverter SN Energy today**: Energy produced today by the inverter (Wh).
+- **Inverter SN Lifetime energy**: Total energy produced during inverter lifetime (Wh).
+- **Inverter SN Report duration**: Time in seconds covered by the last report data.
diff --git a/source/_integrations/esphome.markdown b/source/_integrations/esphome.markdown
index 112f5f03c5b..a586145fd21 100644
--- a/source/_integrations/esphome.markdown
+++ b/source/_integrations/esphome.markdown
@@ -49,11 +49,12 @@ ha_quality_scale: platinum
## Overview
-This integration allows [ESPHome](https://esphome.io) devices to connect directly to Home Assistant with the [native ESPHome API](https://esphome.io/components/api.html).
+The **ESPHome** {% term integration %} allows [ESPHome](https://esphome.io) devices to connect directly to Home Assistant with the [native ESPHome API](https://esphome.io/components/api.html).
ESPHome is a firmware generator and configuration system that enables the transformation of microcontrollers into fully customizable smart home devices. Using a simple YAML configuration file, ESPHome allows users to define hardware components like sensors, actuators, and peripherals. These configurations are then compiled into custom firmware that can be flashed onto the target device.
-### Key Features
+### Key features
+
- **YAML Configuration**: Specify hardware components, sensors, actuators, and integrations using a clean and straightforward YAML syntax.
- **Custom Firmware Generation**: ESPHome compiles the provided configuration into a highly optimized, device-specific firmware image that is ready to be flashed onto microcontrollers.
- **Seamless Integration**: After flashing, ESPHome devices can integrate seamlessly with Home Assistant using the ESPHome native API. This documentation page focuses on the [native API](https://esphome.io/components/api.html), which allows devices to communicate directly with Home Assistant for real-time automation and monitoring. For other integrations, such as MQTT or HTTP, please refer to the relevant sections of the [ESPHome documentation](https://esphome.io/).
@@ -95,12 +96,6 @@ password:
For more information, see the [ESPHome Native API Component documentation](https://esphome.io/components/api.html).
-## Removing the integration
-
-This integration follows the standard integration removal process; no extra steps are required.
-
-{% include integrations/remove_device_service.md %}
-
{% include integrations/option_flow.md %}
These options are disabled by default and not required—only set them if specifically needed.
@@ -114,25 +109,26 @@ Subscribe to logs from the device:
## Supported devices
-The ESPHome integration works with devices that run ESPHome firmware and expose their functionality through the [native ESPHome API](https://esphome.io/components/api.html). This API is designed for tight, efficient integration with Home Assistant, enabling ESPHome devices to push updates directly to Home Assistant in **near real time**.
+The ESPHome {% term integration %} works with devices that run ESPHome firmware and expose their functionality through the [native ESPHome API](https://esphome.io/components/api.html). This API is designed for tight, efficient integration with Home Assistant, enabling ESPHome devices to push updates directly to Home Assistant in **near real time**.
## Updating data
Rather than polling for sensor values or device states, Home Assistant maintains a persistent connection to each ESPHome device using the native API. This allows state changes—such as a temperature sensor update, a button press, or a binary sensor trigger—to be sent immediately as they happen, reducing latency and improving responsiveness in automations.
-### Additional Technical Details
+### Additional technical details
+
- **Efficient Communication Protocol**: ESPHome uses a lightweight, bi-directional protocol over TCP, optimized for microcontrollers. This protocol is implemented in [aioesphomeapi](https://github.com/esphome/aioesphomeapi), the async Python library used by Home Assistant to handle real-time communication with ESPHome devices. It enables low-latency updates and near instant command execution.
- **Automatic Reconnection**: Home Assistant maintains a persistent connection to each ESPHome device and will automatically attempt to reconnect if the connection is lost. This includes support for "sleepy" or battery-powered devices that periodically wake from deep sleep. When such a device comes online, Home Assistant quickly re-establishes the connection—especially when **mDNS** (Multicast DNS) is available—allowing the device to be discovered and connected without requiring static IPs or manual configuration.
This real-time behavior enables fast, reactive automations and a smooth user experience compared to traditional polling-based integrations.
-## Supported Functionality
+## Supported functionality
### Entities
The available entities depend on the components defined in the ESPHome YAML configuration for each device. These entities are exposed through the [Native API Component](https://esphome.io/components/api.html).
-### Firing Events on the Home Assistant Event Bus
+### Firing events on the Home Assistant event bus
When using the native API with Home Assistant, you can trigger events on the Home Assistant event bus directly from ESPHome. For more details, see the [homeassistant.event Action](https://esphome.io/components/api.html#homeassistant-event-action).
@@ -140,15 +136,15 @@ When using the native API with Home Assistant, you can trigger events on the Hom
Each device can define Home Assistant Actions based on its ESPHome YAML configuration. For more information, refer to the [Actions](https://esphome.io/components/api.html#actions) section in the [Native API Component](https://esphome.io/components/api.html) documentation.
-### Retrieving Data from Home Assistant
+### Retrieving data from Home Assistant
ESPHome can retrieve the state of Home Assistant entities using the [Native API](https://esphome.io/components/api.html) with [User-Defined Actions](https://esphome.io/components/api.html#user-defined-actions).
-### Home Assistant Actions
+### Home Assistant actions
ESPHome devices can call any [Home Assistant Action](https://esphome.io/components/api.html#homeassistant-service-action). This feature is not enabled by default for newly added devices but can be enabled through the options flow on a per-device basis.
-### Tag Scanning Support
+### Tag scanning support
The [Native API Component](https://esphome.io/components/api.html) also supports sending tag scan events to Home Assistant. See the [homeassistant.tag_scanned Action](https://esphome.io/components/api.html#homeassistant-tag-scanned-action) for more information.
@@ -156,6 +152,7 @@ The [Native API Component](https://esphome.io/components/api.html) also supports
- Entity name is a combination of the friendly name (or name if unset) and component name
- Entity ID is derived from the entity name with the device name prepended
+- Unicode characters in names are transliterated to their closest ASCII equivalents for compatibility
Example with `friendly_name` set:
@@ -182,20 +179,35 @@ sensor:
The entity will be named `livingroomdesk Temperature` and will default to having an entity ID of `sensor.livingroomdesk_temperature`.
+Example with Unicode characters:
+
+```yaml
+esphome:
+ name: "haloszoba-klima"
+ friendly_name: "Hálószoba klíma"
+
+sensor:
+ name: "Árvíztűrő tükörfúrógép"
+```
+
+The entity will be named `Hálószoba klíma Árvíztűrő tükörfúrógép` and will default to having an entity ID of `sensor.haloszoba_klima_arvizturo_tukorfurogep`. Note how the Unicode characters are transliterated rather than replaced with underscores.
+
## Troubleshooting
-### Viewing Live Logs
+### Viewing live logs
To troubleshoot your ESPHome devices, you can easily view live logs, whether you're using the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon) or the **ESPHome CLI**. The logs contain detailed information such as Wi-Fi connection status, errors, and debug messages, which can help you identify and resolve issues with your device.
#### Using the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon)
+
1. In the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon) add-on, find the device you're working with.
2. Click the **LOGS** button to open the log view.
#### Using the **ESPHome CLI**
+
If you're using the **ESPHome CLI**, follow the instructions for the [logs Command](https://esphome.io/guides/cli.html#logs-command) to access the logs.
-### Obtaining Logs from the Device
+### Obtaining logs from the device
If you want the device to send logs without requiring you to be actively monitoring, follow these steps:
@@ -216,7 +228,7 @@ If you want the device to send logs without requiring you to be actively monitor
This integration supports reconfiguration, allowing you to make changes—such as updating the IP address—even after a device has already been set up.
-### Name Conflict Resolution
+### Name conflict resolution
If Home Assistant detects multiple devices with the same [**name**](https://esphome.io/components/esphome.html#configuration-variables), it will automatically initiate **Name Conflict Resolution**. This process is designed to help you seamlessly replace a failed or retired device with new hardware, while preserving your existing configuration if desired.
@@ -232,7 +244,7 @@ If you’re using the same YAML file on the new device, choose **Migrate**. If i
---
-### Requirements for Name Conflict Resolution
+### Requirements for name conflict resolution
To trigger Name Conflict Resolution, all of the following must be true:
@@ -242,7 +254,7 @@ To trigger Name Conflict Resolution, all of the following must be true:
---
-### How to Trigger Name Conflict Resolution
+### How to trigger name conflict resolution
You can trigger Name Conflict Resolution in several ways:
@@ -251,8 +263,14 @@ You can trigger Name Conflict Resolution in several ways:
- Configuring a **newly discovered device** that uses the same name.
- **Manually adding** a device with the same name via the integration setup.
-## Known Limitations
+## Known limitations
Each ESPHome device must have a **unique name**. This name is important for mDNS announcements, ensuring that the device can be properly discovered, quickly reconnected when it comes online or wakes from deep sleep (for devices that support deep sleep), and correctly linked to the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon). It's also crucial for **DHCP discovery** if mDNS is not available.
Using duplicate names can lead to connection issues, failed discovery, and unexpected behavior with both the integration and the add-on.
+
+## Removing the integration
+
+This integration follows the standard integration removal process; no extra steps are required.
+
+{% include integrations/remove_device_service.md %}
\ No newline at end of file
diff --git a/source/_integrations/eve.markdown b/source/_integrations/eve.markdown
index c3fb407b6af..da9061ac325 100644
--- a/source/_integrations/eve.markdown
+++ b/source/_integrations/eve.markdown
@@ -13,15 +13,11 @@ ha_platforms:
- sensor
ha_iot_standard: matter
ha_brand: true
+works_with:
+ - matter
---
-[Eve](https://www.evehome.com/) is a member of the Works with Home Assistant partner program for their Matter products. Eve is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Eve Matter devices work locally and integrate seamlessly with the Matter integration in Home Assistant. As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
-
-{% my add_matter_device badge domain=page.ha_domain %}
-
-[Learn more about Matter in Home Assistant.](/integrations/matter/)
+{% include integrations/wwha.md url="https://www.evehome.com/" %}
The following devices are supported:
diff --git a/source/_integrations/event.mqtt.markdown b/source/_integrations/event.mqtt.markdown
index 07f0ae45700..44105791e8c 100644
--- a/source/_integrations/event.mqtt.markdown
+++ b/source/_integrations/event.mqtt.markdown
@@ -155,7 +155,7 @@ name:
type: string
default: MQTT Event
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
payload_available:
diff --git a/source/_integrations/ezviz.markdown b/source/_integrations/ezviz.markdown
index ee803638997..9760938e0e2 100644
--- a/source/_integrations/ezviz.markdown
+++ b/source/_integrations/ezviz.markdown
@@ -9,7 +9,6 @@ ha_iot_class: Cloud Polling
ha_domain: ezviz
ha_codeowners:
- '@RenierM26'
- - '@baqs'
ha_config_flow: true
ha_platforms:
- alarm_control_panel
@@ -158,6 +157,18 @@ Once triggered, the siren will automatically deactivate after 60 seconds (EZVIZ
If your camera supports motion detection warning sounds, you can use this entity to select the level.
+### Battery work mode
+
+For battery powered cameras, you can use this entity to select the battery work mode to optimize your battery consumption.
+
+| Battery work mode | Description |
+| ---------------------- | ---------------------------------------------------------------------------------------------------- |
+| Plugged in | The camera will keep recording. The camera should be plugged in. |
+| High performance | One video clip is longer but saves less power. |
+| Power save | One video clip is shorter and saves more power. |
+| Super power saving | Sleep mode is on. Active live view can wake up the camera. |
+| Custom | The camera will use the schedules registered in the app. |
+
### Light entity
A light entity will be added to cameras + light combos. You can turn it on/off and set the brightness.
diff --git a/source/_integrations/fan.mqtt.markdown b/source/_integrations/fan.mqtt.markdown
index 5cb84cbcd0a..2bde863b89d 100644
--- a/source/_integrations/fan.mqtt.markdown
+++ b/source/_integrations/fan.mqtt.markdown
@@ -162,7 +162,7 @@ name:
type: string
default: MQTT Fan
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/fan.template.markdown b/source/_integrations/fan.template.markdown
deleted file mode 100644
index b2d4caa0871..00000000000
--- a/source/_integrations/fan.template.markdown
+++ /dev/null
@@ -1,266 +0,0 @@
----
-title: "Template fan"
-description: "Instructions how to setup the template fans within Home Assistant."
-ha_category:
- - Fan
- - Helper
-ha_release: 0.69
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - fan
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The **Template** {% term integration %} creates fans that combine integrations and provides the
-ability to run scripts or invoke actions for each of the `turn_on`, `turn_off`, `set_percentage`,
-`set_preset_mode`, `set_oscillating`, and `set_direction` commands of a fan.
-
-## Configuration
-
-To enable template fans in your installation, add the following to your
-{% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-fan:
- - platform: template
- fans:
- bedroom_fan:
- friendly_name: "Bedroom fan"
- value_template: "{{ states('input_boolean.state') }}"
- percentage_template: "{{ states('input_number.percentage') }}"
- preset_mode_template: "{{ states('input_select.preset_mode') }}"
- oscillating_template: "{{ states('input_select.osc') }}"
- direction_template: "{{ states('input_select.direction') }}"
- turn_on:
- action: script.fan_on
- turn_off:
- action: script.fan_off
- set_percentage:
- action: script.fans_set_speed
- data:
- percentage: "{{ percentage }}"
- set_preset_mode:
- action: script.fans_set_preset_mode
- data:
- preset_mode: "{{ preset_mode }}"
- set_oscillating:
- action: script.fan_oscillating
- data:
- oscillating: "{{ oscillating }}"
- set_direction:
- action: script.fan_direction
- data:
- direction: "{{ direction }}"
- speed_count: 6
- preset_modes:
- - 'auto'
- - 'smart'
- - 'whoosh'
-```
-
-{% endraw %}
-
-{% configuration %}
- fans:
- description: List of your fans.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this fan. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: "Defines a template to get the state of the fan. Valid values: `on`, `off`"
- required: true
- type: template
- percentage_template:
- description: Defines a template to get the speed percentage of the fan.
- required: false
- type: template
- preset_mode_template:
- description: Defines a template to get the preset mode of the fan.
- required: false
- type: template
- oscillating_template:
- description: "Defines a template to get the osc state of the fan. Valid values: `true`, `false`"
- required: false
- type: template
- direction_template:
- description: "Defines a template to get the direction of the fan. Valid values: `forward`, `reverse`"
- required: false
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- turn_on:
- description: Defines an action to run when the fan is turned on.
- required: true
- type: action
- turn_off:
- description: Defines an action to run when the fan is turned off.
- required: true
- type: action
- set_percentage:
- description: Defines an action to run when the fan is given a speed percentage command.
- required: false
- type: action
- set_preset_mode:
- description: Defines an action to run when the fan is given a preset command.
- required: false
- type: action
- set_oscillating:
- description: Defines an action to run when the fan is given an osc state command.
- required: false
- type: action
- set_direction:
- description: Defines an action to run when the fan is given a direction command.
- required: false
- type: action
- preset_modes:
- description: List of preset modes the fan is capable of. This is an arbitrary list of strings and must not contain any speeds.
- required: false
- type: [string, list]
- default: []
- speed_count:
- description: The number of speeds the fan supports. Used to calculate the percentage step for the `fan.increase_speed` and `fan.decrease_speed` actions.
- required: false
- type: integer
- default: 100
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Converting from speeds to percentage
-
-When converting a fan with 3 speeds from the old fan entity model, the following percentages can be used:
-
-0 - `off`
-33 - `low`
-66 - `medium`
-100 - `high`
-
-## Examples
-
-### Helper fan
-
-This example uses an input_boolean and an input_number to mimic a fan, and
-the example shows multiple actions for `set_percentage`.
-
-{% raw %}
-
-```yaml
-fan:
- - platform: template
- fans:
- helper_fan:
- friendly_name: "Helper Fan"
- value_template: "{{ states('input_boolean.state') }}"
- turn_on:
- - action: input_boolean.turn_on
- target:
- entity_id: input_boolean.state
- turn_off:
- - action: input_boolean.turn_off
- target:
- entity_id: input_boolean.state
- percentage_template: >
- {{ states('input_number.percentage') if is_state('input_boolean.state', 'on') else 0 }}
- speed_count: 6
- set_percentage:
- - action: input_boolean.turn_{{ 'on' if percentage > 0 else 'off' }}
- target:
- entity_id: input_boolean.state
- - action: input_number.set_value
- target:
- entity_id: input_number.percentage
- data:
- value: "{{ percentage }}"
-```
-
-{% endraw %}
-
-### Preset modes fan
-
-This example uses an existing fan with only a percentage. It extends the
-percentage value into useable preset modes without a helper entity.
-
-{% raw %}
-
-```yaml
-fan:
- - platform: template
- fans:
- preset_mode_fan:
- friendly_name: "Preset Mode Fan Example"
- value_template: "{{ states('fan.percentage_fan') }}"
- turn_on:
- - action: fan.turn_on
- target:
- entity_id: fan.percentage_fan
- turn_off:
- - action: fan.turn_off
- target:
- entity_id: fan.percentage_fan
- percentage_template: >
- {{ state_attr('fan.percentage_fan', 'percentage') }}
- speed_count: 3
- set_percentage:
- - action: fan.set_percentage
- target:
- entity_id: fan.percentage_fan
- data:
- percentage: "{{ percentage }}"
- preset_modes:
- - "off"
- - "low"
- - "medium"
- - "high"
- preset_mode_template: >
- {% if is_state('fan.percentage_fan', 'on') %}
- {% if state_attr('fan.percentage_fan', 'percentage') == 100 %}
- high
- {% elif state_attr('fan.percentage_fan', 'percentage') == 66 %}
- medium
- {% else %}
- low
- {% endif %}
- {% else %}
- off
- {% endif %}
- set_preset_mode:
- - action: fan.set_percentage
- target:
- entity_id: fan.percentage_fan
- data:
- percentage: >-
- {% if preset_mode == 'high' %}
- 100
- {% elif preset_mode == 'medium' %}
- 66
- {% elif preset_mode == 'low' %}
- 33
- {% else %}
- 0
- {% endif %}
-```
-
-{% endraw %}
diff --git a/source/_integrations/file.markdown b/source/_integrations/file.markdown
index f275b829a54..942d315b0c2 100644
--- a/source/_integrations/file.markdown
+++ b/source/_integrations/file.markdown
@@ -31,7 +31,7 @@ After creating a config entry, you can change the entry name, the name of the no
To use notifications in automations or scripts, see the [getting started with automation page](/getting-started/automation/).
-Use the `notify.send_message` entity to store notification messages.
+Use the `notify.send_message` action to store notification messages.
## Sensor
diff --git a/source/_integrations/gaggenau.markdown b/source/_integrations/gaggenau.markdown
index 4e9182b5dfc..dc25767dbcc 100644
--- a/source/_integrations/gaggenau.markdown
+++ b/source/_integrations/gaggenau.markdown
@@ -31,6 +31,8 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
+ha_zeroconf: true
---
{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/google_gemini.markdown b/source/_integrations/google_gemini.markdown
index ec157943e21..3b1bd2ddcc5 100644
--- a/source/_integrations/google_gemini.markdown
+++ b/source/_integrations/google_gemini.markdown
@@ -2,6 +2,7 @@
title: Google Gemini
description: Instructions on how to integrate Google Gemini as a conversation agent
ha_category:
+ - Text-to-speech
- Voice
ha_release: 2023.6
ha_domain: google_gemini
@@ -15,6 +16,7 @@ ha_config_flow: true
ha_platforms:
- conversation
- diagnostics
+ - tts
ha_iot_class: Cloud Polling
---
diff --git a/source/_integrations/google_generative_ai_conversation.markdown b/source/_integrations/google_generative_ai_conversation.markdown
index 5627a96dad4..7fbfed6c25a 100644
--- a/source/_integrations/google_generative_ai_conversation.markdown
+++ b/source/_integrations/google_generative_ai_conversation.markdown
@@ -2,6 +2,8 @@
title: Google Generative AI
description: Instructions on how to integrate Google Generative AI as a conversation agent
ha_category:
+ - Speech-to-text
+ - Text-to-speech
- Voice
ha_release: 2023.6
ha_iot_class: Cloud Polling
@@ -14,6 +16,8 @@ ha_integration_type: service
ha_platforms:
- conversation
- diagnostics
+ - stt
+ - tts
related:
- docs: /voice_control/voice_remote_expose_devices/
title: Exposing entities to Assist
@@ -25,7 +29,7 @@ related:
title: Google Generative AI
---
-The Google Generative AI integration adds a conversation agent powered by [Google Generative AI](https://ai.google.dev/) in Home Assistant. It can optionally be allowed to control Home Assistant.
+The Google Generative AI integration adds a conversation agent, speech-to-text, and text-to-speech entities powered by [Google Generative AI](https://ai.google.dev/) to Home Assistant. The conversation agent can optionally be allowed to control Home Assistant.
Controlling Home Assistant is done by providing the AI access to the Assist API of Home Assistant. You can control what devices and entities it can access from the {% my voice_assistants title="exposed entities page" %}. The AI is able to provide you information about your devices and control them.
@@ -77,7 +81,7 @@ Enable Google Search tool:
## Google Search
Due to an API limitation we cannot have the [Google Search tool](https://ai.google.dev/gemini-api/docs/grounding) together with other tools. Request fails with `400 INVALID_ARGUMENT. {'error': {'code': 400, 'message': 'Tool use with function calling is unsupported', 'status': 'INVALID_ARGUMENT'}}`.
-But you can do the following workaround that exposes a script to voice assistants. The script calls a Google Generative AI Conversation that only has the Google Search tool enabled.
+But you can do the following workaround that exposes a script to voice assistants. The script calls a Google Generative AI Conversation that only has the Google Search tool enabled.
{% details "Workaround for Google Search tool" %}
@@ -121,6 +125,7 @@ fields:
description: The query to search Google for
required: true
```
+
{% endraw %}
11. Select **Save script**
@@ -146,10 +151,10 @@ This action isn't tied to any integration entry, so it won't use the model, prom
Allows you to ask Gemini Pro or Gemini Pro Vision to generate content from a prompt consisting of text and optionally attachments (images, PDFs, etc.).
This action populates [response data](/docs/scripts/perform-actions#use-templates-to-handle-response-data) with the generated content.
-| Data attribute | Optional | Description | Example |
-| ---------------------- | -------- | ----------------------------------------------- | ------------------- |
-| `prompt` | no | The prompt for generating the content. | Describe this image |
-| `filenames` | yes | File names for attachments to include in the prompt. | /tmp/image.jpg |
+| Data attribute | Optional | Description | Example |
+| -------------- | -------- | ---------------------------------------------------- | ------------------- |
+| `prompt` | no | The prompt for generating the content. | Describe this image |
+| `filenames` | yes | File names for attachments to include in the prompt. | /tmp/image.jpg |
{% raw %}
@@ -188,6 +193,39 @@ response_variable: generated_content
{% endraw %}
+### Speak
+
+The `tts.speak` action is the modern way to use TTS. Add the `speak` action, select the Google Generative AI TTS entity, select the media player entity or group to send the TTS audio to, and enter the message to speak.
+
+Text-to-speech (TTS) generation is controllable, meaning you can use natural language to structure interactions and guide the style, accent, pace, and tone of the audio. You can change the way the text is spoken directly in the message by, e.g. entering "Say cheerfully: Have a wonderful day" instead of just "Have a wonderful day".
+
+For more options about `speak`, see the Speak section on the main [TTS](/integrations/tts/#service-speak) building block page.
+
+In YAML, your action will look like this:
+
+{% raw %}
+
+```yaml
+action: tts.speak
+target:
+ entity_id: tts.google_generative_ai_tts
+data:
+ media_player_entity_id: media_player.tv
+ message: Say cheerfully: Have a wonderful day!
+ options:
+ voice:
+```
+
+{% endraw %}
+
+You can configure the following options:
+
+| Option attribute | Optional | Description | Example |
+| ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------- |
+| `voice` | yes | The [voice name](https://ai.google.dev/gemini-api/docs/speech-generation#voices) to be used for the generated speech. The default is `zephyr`. | `achernar` |
+
+The input language is detected automatically. Check the [Google AI documentation](https://ai.google.dev/gemini-api/docs/speech-generation#languages) for the supported languages.
+
## Video tutorial
This video tutorial explains how Google Generative AI can be set up, how you can send an AI-generated message to your smart speaker when you arrive home, and how you can analyze an image taken from your doorbell camera as soon as someone rings the doorbell.
diff --git a/source/_integrations/govee_ble.markdown b/source/_integrations/govee_ble.markdown
index cbb0babb24c..8e76801b033 100644
--- a/source/_integrations/govee_ble.markdown
+++ b/source/_integrations/govee_ble.markdown
@@ -32,7 +32,7 @@ The Govee BLE integration will automatically discover devices once the [Bluetoot
- H5071 Hygrometer Thermometer
- H5072 Hygrometer Thermometer
- H5074 Hygrometer Thermometer (Active scans required)
-- [H5075 Bluetooth Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-bluetooth-hygrometer-thermometer-h5075)
+- [H5075 Bluetooth Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-bluetooth-hygrometer-thermometer-h5075) (Active scans required)
- [H5100 Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-h5100-mini-hygrometer-thermometer-sensors)
- H5101 Hygrometer Thermometer
- H5102 Hygrometer Thermometer
@@ -49,6 +49,7 @@ The Govee BLE integration will automatically discover devices once the [Bluetoot
- H5125 2 Button Switch
- H5126 6 Button Switch
- H5127 Presence Sensor
+- [H5129 Hygrometer Thermometer](https://us.govee.com/products/wi-fi-temperature-humidity-sensor) (Active scans required)
- H5130 Pressure Sensor
- [H5177/5178 Bluetooth Thermo-Hygrometer](https://us.govee.com/collections/thermo-hydrometer/products/bluetooth-thermo-hygrometer)
- H5174 Hygrometer Thermometer
diff --git a/source/_integrations/growatt_server.markdown b/source/_integrations/growatt_server.markdown
index 192db9e3ed7..619cd891d6e 100644
--- a/source/_integrations/growatt_server.markdown
+++ b/source/_integrations/growatt_server.markdown
@@ -24,4 +24,9 @@ Users keen to explore all current supported servers and configuration possibilit
Once integrated, the sensor logs into the user's Growatt account and accesses the first "Plant." It then retrieves the inverters associated with this plant and generates sensors for these inverters, as well as overall plant sensors.
+## Prerequisites
+
+- Growatt account
+- Login credentials to that Growatt account, you will need them during setup of the integration
+
{% include integrations/config_flow.md %}
diff --git a/source/_integrations/harmony.markdown b/source/_integrations/harmony.markdown
index cb02f63214d..0564c3f1bb6 100644
--- a/source/_integrations/harmony.markdown
+++ b/source/_integrations/harmony.markdown
@@ -99,6 +99,7 @@ Send a single command or a set of commands to one device, device ID and availabl
| `command` | no | A single command or a list of commands to send. |
| `num_repeats` | yes | The number of times to repeat the command(s). |
| `delay_secs` | yes | The number of seconds between sending each command. |
+| `hold_secs` | yes | The number of seconds the button on the remote is held before the release is sent. |
In the file 'harmony_REMOTENAME.conf' you can find the available devices and commands, for example:
diff --git a/source/_integrations/heltun.markdown b/source/_integrations/heltun.markdown
index 9b2db3227c8..25b62bd8bb6 100644
--- a/source/_integrations/heltun.markdown
+++ b/source/_integrations/heltun.markdown
@@ -21,16 +21,10 @@ ha_iot_standard: zwave
ha_brand: true
---
-[HELTUN](https://www.heltun.com/) is a member of the Works with Home Assistant partner program for their Z-Wave products. HELTUN is committed to making sure their products are up-to-date and ready to use in Home Assistant.
+[HELTUN](https://www.heltun.com/) thermostats make it easy to automate your heating system, their touch panel switches control your lighting and motorized appliances and their high load switches control any high load appliances like groups of lights, heaters, or individual sockets.
-HELTUN thermostats make it easy to automate your heating system, their touch panel switches control your lighting and motorized appliances and their high load switches control any high load appliances like groups of lights, heaters, or individual sockets.
-
-HELTUN Z-Wave devices work locally and integrate seamlessly with the Z-Wave integration in Home Assistant (Z-Wave stick required). As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
+{% include integrations/wwha.md %}
### Firmware updates
HELTUN periodically releases new firmware with additional features and functionality which can be sent to devices via an encrypted OTA (Over-The-Air) update process. In Home Assistant, you can navigate to your device page and use the Update Device Firmware option to upload the firmware from HELTUN for your device.
-
-{% my add_zwave_device badge domain=page.ha_domain %}
-
-[Learn more about Z-Wave in Home Assistant.](/integrations/zwave_js/)
\ No newline at end of file
diff --git a/source/_integrations/here_travel_time.markdown b/source/_integrations/here_travel_time.markdown
index 145df81eef8..d92d04c9235 100644
--- a/source/_integrations/here_travel_time.markdown
+++ b/source/_integrations/here_travel_time.markdown
@@ -20,9 +20,9 @@ The `here_travel_time` sensor provides travel time from the [HERE Routing API](h
You need to register for an API key by following the instructions in the [API Developer Guide](https://www.here.com/docs/bundle/routing-api-developer-guide-v8/page/topics/send-request.html).
-HERE offers a Limited Plan which includes 1000 free transactions per day. If you are not [updating sensors on demand](#updating-sensors-on-demand-using-automation), you can track 3 routes without exceeding the limit.
+HERE offers a Base Plan which includes 5000 free transactions per month. If you are not [updating sensors on demand](#updating-sensors-on-demand-using-automation), you can track 1 route without exceeding the limit.
-You can provide payment details if you want to pay for unlimited transactions. Be aware that the amount of transactions included for free in the paid plan might be _less_ than the 1000 transactions per day in the free plan. More information can be found [on the pricing page](https://www.here.com/get-started/pricing)
+More information can be found [on the pricing page](https://www.here.com/get-started/pricing)
{% include integrations/config_flow.md %}
diff --git a/source/_integrations/home_connect.markdown b/source/_integrations/home_connect.markdown
index 13f558fc9e3..0e66fd0d1cb 100644
--- a/source/_integrations/home_connect.markdown
+++ b/source/_integrations/home_connect.markdown
@@ -13,6 +13,7 @@ ha_category:
ha_iot_class: Cloud Push
ha_release: '0.110'
ha_domain: home_connect
+ha_quality_scale: platinum
ha_codeowners:
- '@DavidMStraub'
- '@Diegorro98'
@@ -30,6 +31,7 @@ ha_platforms:
- time
ha_integration_type: integration
ha_zeroconf: true
+ha_dhcp: true
---
The Home Connect integration allows users to integrate their home appliances supporting the Home Connect standard for Bosch and Siemens using the [official cloud API](https://developer.home-connect.com).
@@ -724,7 +726,7 @@ Both entities can use these options, but the availability of these will depend o
### Sensor
-{% details "List of binary sensors" %}
+{% details "List of sensors" %}
- **Finish time**:
- **Description**: Represents the time when the program will end.
diff --git a/source/_integrations/homee.markdown b/source/_integrations/homee.markdown
index f9c18d0841d..353cc785ef1 100644
--- a/source/_integrations/homee.markdown
+++ b/source/_integrations/homee.markdown
@@ -2,7 +2,20 @@
title: Homee
description: Instructions on how to setup Homee devices in Home Assistant.
ha_category:
+ - Alarm
+ - Binary sensor
+ - Button
+ - Climate
- Cover
+ - Event
+ - Fan
+ - Light
+ - Lock
+ - Number
+ - Select
+ - Sensor
+ - Switch
+ - Valve
ha_config_flow: true
ha_release: 2025.2
ha_iot_class: Local Push
@@ -10,11 +23,12 @@ ha_codeowners:
- '@Taraman17'
ha_domain: homee
ha_platforms:
- - alarm-control-panel
+ - alarm_control_panel
- binary_sensor
- button
- climate
- cover
+ - diagnostics
- event
- fan
- light
@@ -62,6 +76,22 @@ New devices added to Homee will be automatically discovered after a restart of H
Changed values are reported from Homee in defined time intervals and not always in realtime. For example, while a cover moves, the position is updated only every few seconds and intermediate states may be missed by Home Assistant.
+## Troubleshooting
+
+First, see the general [Home Assistant troubleshooting guide](/docs/configuration/troubleshooting/).
+
+The **homee** integration supports [debug logs and diagnostics](/docs/configuration/troubleshooting/#debug-logs-and-diagnostics).
+
+### Homee device not working as expected
+
+Make sure, the {% term device %} works as expected in homee.
+If a homee device shows up in Home Assistant, but does not work as expected or is missing {% term entities %}, open a [report](https://github.com/home-assistant/core/issues) and attach error logs and the device's {% term diagnostics %} data.
+
+### Integration not loading or homee device not showing up in HA
+
+Check that the homee-user, used for Home Assistant, is allowed to see the device.
+If that is the case, open a [report](https://github.com/home-assistant/core/issues) and attach error logs and the diagnostic data of the {% term integration %}.
+
## Reconfiguration
This integration supports reconfiguration, allowing you to change the IP address, even after a device has already been set up.
diff --git a/source/_integrations/homematicip_cloud.markdown b/source/_integrations/homematicip_cloud.markdown
index 6742f80edb2..ecc0344f7c1 100644
--- a/source/_integrations/homematicip_cloud.markdown
+++ b/source/_integrations/homematicip_cloud.markdown
@@ -13,6 +13,7 @@ ha_category:
- Lock
- Sensor
- Switch
+ - Valve
ha_iot_class: Cloud Push
ha_release: 0.66
ha_config_flow: true
@@ -28,6 +29,7 @@ ha_platforms:
- lock
- sensor
- switch
+ - valve
- weather
ha_integration_type: integration
ha_codeowners:
@@ -48,6 +50,7 @@ There is currently support for the following device types within Home Assistant:
- Lock
- Sensor
- Switch
+- Valve
- Weather
{% include integrations/config_flow.md %}
@@ -207,6 +210,9 @@ Currently, the **HmIP-DLD** can only be used in Home Assistant without a PIN. En
- Switch Actuator for DIN rail mount – 1x channels (*HMIP-DRSI1*)
- Switch Actuator - 2x channels (*HmIP-BS2*)
+- homematicip_cloud.valve
+ - Smart Watering Actuator (*ELV-SH-WSM*)
+
- homematicip_cloud.weather
- Weather Sensor – basic (*HmIP-SWO-B*)
- Weather Sensor – plus (*HmIP-SWO-PL*)
diff --git a/source/_integrations/homewizard.markdown b/source/_integrations/homewizard.markdown
index c3dbaabcf38..e4ca1684112 100644
--- a/source/_integrations/homewizard.markdown
+++ b/source/_integrations/homewizard.markdown
@@ -13,6 +13,7 @@ ha_platforms:
- button
- diagnostics
- number
+ - select
- sensor
- switch
ha_zeroconf: true
@@ -38,7 +39,13 @@ Integration for the [HomeWizard Energy](https://www.homewizard.com) platform. It
You have to enable the local API to allow Home Assistant to communicate with your device. Do this in the HomeWizard Energy app:
{% tip %}
-You can skip this step if you are configuring your Wi-Fi P1 Meter with firmware version 6 or higher, or your Plug-In Battery. These products use a different authentication method that doesn't require enabling the local API.
+You can skip this step if you are configuring one of the following devices:
+
+- Wi-Fi P1 Meter with firmware version 6 or higher
+- Wi-Fi kWh Meter with firmware version 5 or higher
+- Plug-In Battery
+
+These products use a different authentication method that doesn't require enabling the local API.
{% endtip %}
1. Go to Settings (gear icon in the upper-right).
@@ -118,6 +125,16 @@ The Energy Socket also has a switch to control the outlet state and a status lig
- **Cycles**: Number of charge cycles the battery has gone through.
- **State of charge (%)**: The current state of charge of the battery.
+#### Battery group mode
+
+The group of connected batteries can be controlled in three different modes using the **Battery group mode** select entity:
+
+- **Zero on meter**: The Plug-In Battery will try to keep the power consumption/production of your home at zero. This means that the Plug-In Battery will charge or discharge to maintain a net-zero power balance. This is the default mode.
+- **Charge to full**: All connected Plug-In Batteries will be charged to 100%, regardless of the power consumption/production of your home. When all batteries are fully charged, the Plug-In Battery will switch to the standby mode.
+- **Standby**: Batteries will enter standby mode. This means that the Plug-In Battery will neither charge nor discharge.
+
+The **Battery group mode** select can be found in the P1 Meter device, as the P1 Meter is responsible for controlling the Plug-In Battery. This select entity is disabled by default. See [I can't find entities](#i-cant-find-entities-like-voltage-current-or-battery-group-mode) for instructions on enabling disabled entities.
+
## Identify
The identify button can be pressed to let the status light blink for a few seconds.
@@ -172,14 +189,15 @@ It may happen that you can't find your devices or they won't show up in the inte
1. During setup, you may be asked to press a button on your device to authenticate it with Home Assistant.
- **P1 Meter**: Press the white button on the front of the P1 Meter.
- - **Plug-In Battery**: Press the black touch button on the front of the device. You will hear a beep.
- - **Energy Socket**, **Water Meter** and **kWh Meter**: they do not require this step.
+ - **Plug-In Battery**: Press the black touch button on the front of the device. You will hear a beep.
+ - **kWh Meter**: Press and hold the button with the Wi‑Fi icon for two seconds. Release the button before the display shows "AP".
+ - **Energy Socket** and **Water Meter**: they do not require this step.
2. After pressing the button, you must select **Continue** within 30 seconds to complete the setup.
- If the setup times out, you may need to press the button again.
-## I can't find sensors like voltage, current, or frequency
+## I can't find entities like voltage, current, or battery group mode
-Some sensors are disabled by default. You can enable them in the integration setup. See the [enabling or disabling entities](/common-tasks/general/#enabling-or-disabling-entities) documentation for more information.
+Some entities are disabled by default. You can enable them in the integration setup. See the [enabling or disabling entities](/common-tasks/general/#enabling-or-disabling-entities) documentation for more information.
## Removing the integration
diff --git a/source/_integrations/html5.markdown b/source/_integrations/html5.markdown
index c5317a29df3..1dd12fb130c 100644
--- a/source/_integrations/html5.markdown
+++ b/source/_integrations/html5.markdown
@@ -30,7 +30,6 @@ The `html5` platform can only function if all of the following requirements are
- You are using Chrome and/or Firefox on any desktop platform, ChromeOS or Android. Or you added your Home Assistant instance to your home screen on iOS 16.4 or higher.
- Your Home Assistant instance is accessible from outside your network over HTTPS or can perform an alternative [Domain Name Verification Method](https://support.google.com/webmasters/answer/9008080#domain_name_verification) on the domain used by Home Assistant.
- If using a proxy, HTTP basic authentication must be disabled to register or deregister push notifications. It can be re-enabled afterwards.
-- If you don't run Hass.io: `pywebpush` must be installed. `libffi-dev`, `libpython-dev` and `libssl-dev` must be installed prior to `pywebpush` (i.e., `pywebpush` probably won't automatically install).
- You have configured SSL/TLS for your Home Assistant. It doesn't need to be configured in Home Assistant though, e.g., you can be running NGINX in front of Home Assistant and this will still work. The certificate must be trustworthy (i.e., not self-signed).
- You are willing to accept the notification permission in your browser.
diff --git a/source/_integrations/humidifier.mqtt.markdown b/source/_integrations/humidifier.mqtt.markdown
index e82c0821ec6..9af19500a69 100644
--- a/source/_integrations/humidifier.mqtt.markdown
+++ b/source/_integrations/humidifier.mqtt.markdown
@@ -195,7 +195,7 @@ name:
type: string
default: MQTT humidifier
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/husqvarna_automower.markdown b/source/_integrations/husqvarna_automower.markdown
index 6a1904636b5..36f1c50ed1a 100644
--- a/source/_integrations/husqvarna_automower.markdown
+++ b/source/_integrations/husqvarna_automower.markdown
@@ -149,6 +149,7 @@ The integration will create the following sensors:
- Cutting blade usage time (if available)
- Error. For example: *Mower tilted*, *outside geofence*.
- Downtime (if available)
+- Inactive reason (if available). For example: *Searching for satellites* or *planning*.
- Restricted reason. For example: *Week schedule*, *frost*, or *daily limit*.
- Mode
- Next start
diff --git a/source/_integrations/huum.markdown b/source/_integrations/huum.markdown
index aa61d470fe3..78cbc17fc35 100644
--- a/source/_integrations/huum.markdown
+++ b/source/_integrations/huum.markdown
@@ -2,15 +2,20 @@
title: Huum
description: Instructions on how to integrate a Huum saunas into Home Assistant.
ha_category:
+ - Binary sensor
- Climate
+ - Light
ha_release: 2024.2
ha_iot_class: Cloud Polling
ha_codeowners:
- '@frwickst'
+ - '@vincentwolsink'
ha_domain: huum
ha_config_flow: true
ha_platforms:
+ - binary_sensor
- climate
+ - light
ha_integration_type: integration
---
@@ -28,3 +33,20 @@ sauna by mistake.
{% endnote %}
{% include integrations/config_flow.md %}
+
+## Available platforms & entities
+
+### Binary sensors
+
+- **Door**: Sauna door state (open or closed).
+
+### Climate
+
+The climate entity controls the sauna heater and offers the following capabilities:
+
+- Adjust target temperature
+- Change operation mode (off or heat)
+
+### Light
+
+- **Light**: Sauna light control (on or off).
diff --git a/source/_integrations/hyperion.markdown b/source/_integrations/hyperion.markdown
index acf203addb5..ced92a47af6 100644
--- a/source/_integrations/hyperion.markdown
+++ b/source/_integrations/hyperion.markdown
@@ -91,6 +91,7 @@ Provided entities for controlling external sources:
- `switch.[instance]_component_platform_capture`: Toggles the `Screen Capture` source
- `switch.[instance]_component_usb_capture`: Toggles the `USB Capture` source
+- `switch.[instance]_component_audio_capture`: Toggles the `Audio Capture` source
### Control over Hyperion functionality
diff --git a/source/_integrations/image.mqtt.markdown b/source/_integrations/image.mqtt.markdown
index 7ff40d7cb14..45f793e3b70 100644
--- a/source/_integrations/image.mqtt.markdown
+++ b/source/_integrations/image.mqtt.markdown
@@ -165,7 +165,7 @@ name:
required: false
type: string
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
unique_id:
diff --git a/source/_integrations/imgw_pib.markdown b/source/_integrations/imgw_pib.markdown
index c9b8806eb18..e7ff8557d59 100644
--- a/source/_integrations/imgw_pib.markdown
+++ b/source/_integrations/imgw_pib.markdown
@@ -30,7 +30,9 @@ Hydrological station:
Sensor entities added to Home Assistant:
- Water level
+- Water flow (if a given hydrological station supports it)
- Water temperature (if a given hydrological station supports it)
+- Hydrological alert (provides information on hydrological alerts for a given river and area)
## Removing the integration
diff --git a/source/_integrations/immich.markdown b/source/_integrations/immich.markdown
index 31b25df1c47..62db398e47b 100644
--- a/source/_integrations/immich.markdown
+++ b/source/_integrations/immich.markdown
@@ -5,6 +5,7 @@ ha_category:
- Media source
- Multimedia
- Sensor
+ - Update
ha_release: 2025.6
ha_config_flow: true
ha_iot_class: Local Polling
@@ -12,9 +13,11 @@ ha_domain: immich
ha_platforms:
- diagnostics
- sensor
+ - update
ha_codeowners:
- '@mib1185'
-ha_integration_type: service
+ha_integration_type: integration
+ha_quality_scale: silver
---
This integration allows adding an [Immich](https://immich.app/) user account to Home Assistant.
@@ -57,6 +60,10 @@ The following {% term sensors %} are created. For some of those the API key need
| **Disk used by photos** | Used disk space by photos (_admin only_) | ❌ |
| **Disk used by videos** | Used disk space by videos (_admin only_) | ❌ |
+## Update entity
+
+An {% term update %} entity is created to inform about a new available Immich server version (_requires Immich server v1.134.0_).
+
## 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.
diff --git a/source/_integrations/ipp.md b/source/_integrations/ipp.markdown
similarity index 88%
rename from source/_integrations/ipp.md
rename to source/_integrations/ipp.markdown
index 6f0cb9a41c3..2527976e38f 100644
--- a/source/_integrations/ipp.md
+++ b/source/_integrations/ipp.markdown
@@ -9,6 +9,11 @@ ha_config_flow: true
ha_codeowners:
- '@ctalkington'
ha_domain: ipp
+ha_platforms:
+ - diagnostics
+ - sensor
+ha_zeroconf: true
+ha_integration_type: device
---
The `Internet Printing Protocol (IPP)` integration allows you to read current data from your networked printer that supports the [Internet Printing Protocol](https://www.pwg.org/ipp/everywhere.html).
diff --git a/source/_integrations/iron_os.markdown b/source/_integrations/iron_os.markdown
index 56b80f6ee6a..48187360a84 100644
--- a/source/_integrations/iron_os.markdown
+++ b/source/_integrations/iron_os.markdown
@@ -91,7 +91,8 @@ The following controls allow you to customize the settings and options for your
### Basic settings
-- **Boost temperature:** Sets the temperature for boost mode, which temporarily overrides the soldering temperature when the front button is held down.
+- **Boost:** Enables or disables the boost feature. When enabled, holding the front button temporarily raises the tip to the boost temperature.
+- **Boost temperature:** Defines the temporary temperature increase activated when holding the front button.
- **Sleep temperature:** The temperature the device drops to after a specified period of inactivity (no movement or button presses).
- **Sleep timeout:** The duration of inactivity required before the device enters sleep mode and drops to the sleep temperature.
diff --git a/source/_integrations/ista_ecotrend.markdown b/source/_integrations/ista_ecotrend.markdown
index a356a2239b4..a6f57c88558 100644
--- a/source/_integrations/ista_ecotrend.markdown
+++ b/source/_integrations/ista_ecotrend.markdown
@@ -13,6 +13,7 @@ ha_platforms:
- sensor
ha_config_flow: true
ha_integration_type: integration
+ha_quality_scale: gold
---
The **ista EcoTrend** {% term integration %} for Home Assistant allows you to import your monthly meter readings from the [ista EcoTrend](https://ecotrend.ista.de) service.
diff --git a/source/_integrations/itach.markdown b/source/_integrations/itach.markdown
index 1a276720bb6..dde985063d1 100644
--- a/source/_integrations/itach.markdown
+++ b/source/_integrations/itach.markdown
@@ -90,7 +90,7 @@ An example to call the integration from developer tools using the `remote.send_c
Note: Global Cache devices expect data in their own format of "sendir...". This integration converts hex code to Global Cache IR form.
-API Docs:
+API Documentation:
- [iTach](https://www.globalcache.com/files/docs/API-iTach.pdf)
- [GC-100](https://www.globalcache.com/files/docs/API-GC-100.pdf)
diff --git a/source/_integrations/jasco.markdown b/source/_integrations/jasco.markdown
index 474134d852c..d60a862a338 100644
--- a/source/_integrations/jasco.markdown
+++ b/source/_integrations/jasco.markdown
@@ -17,10 +17,4 @@ ha_iot_standard: zwave
ha_brand: true
---
-[Jasco](https://byjasco.com/) is a member of the Works with Home Assistant partner program for their Z-Wave products. Jasco is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Jasco Z-Wave devices work locally and integrate seamlessly with the Z-Wave integration in Home Assistant (Z-Wave stick required). As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
-
-{% my add_zwave_device badge domain=page.ha_domain %}
-
-[Learn more about Z-Wave in Home Assistant.](/integrations/zwave_js/)
\ No newline at end of file
+{% include integrations/wwha.md url="https://byjasco.com/" %}
diff --git a/source/_integrations/jellyfin.markdown b/source/_integrations/jellyfin.markdown
index 439852d6149..82324774c6b 100644
--- a/source/_integrations/jellyfin.markdown
+++ b/source/_integrations/jellyfin.markdown
@@ -65,3 +65,126 @@ Password:
Audio Codec:
description: Sets the audio encoding codec to a Jellyfin API supported codec (aac, mp3, vorbis, wma)
{% endconfiguration_basic %}
+
+## Actions
+
+### Action browse media
+
+You can use the `media_player.browse_media` action to step through your Jellyfin library to find media you want to play.
+
+| Data attribute | Description |
+| --------------------- | ----------------------------------------------------------------------- |
+| `entity_id` | `entity_id` of the media player |
+| `media_content_id` | **(optional)** Unique identifier of the content you want to browse into |
+
+To start your browsing you don't set `media_content_id` to browse the root node.
+
+#### Examples:
+```yaml
+action: media_player.browse_media
+target:
+ entity_id: media_player.jellyfin
+data:
+ media_content_id: a656b907eb3a73532e40e44b968d0225
+```
+
+#### Response
+```yaml
+media_player.jellyfin:
+ title: Series
+ media_class: directory
+ media_content_type: None
+ media_content_id: a656b907eb3a73532e40e44b968d0225
+ children_media_class: directory
+ can_play: false
+ can_expand: true
+ can_search: false
+ thumbnail: >-
+ https://jellyfin
+ not_shown: 0
+ children:
+ - title: "Tales of the Jedi"
+ media_class: directory
+ media_content_type: tvshow
+ media_content_id: 34361f3855c9c0ac39b0f7503fe86be0
+ children_media_class: null
+ can_play: false
+ can_expand: true
+ can_search: false
+ thumbnail: >-
+ https://jellyfin
+```
+
+### Action search media
+
+You can use the `media_player.search_media` action to find media you want to play.
+
+| Data attribute | Description |
+| --------------------- | ------------------------------------------------- |
+| `entity_id` | `entity_id` of the media player |
+| `search_query` | The search term |
+
+#### Examples:
+
+```yaml
+action: media_player.search_media
+target:
+ entity_id:
+ - media_player.jellyfin
+data:
+ search_query: star
+```
+#### Response
+```yaml
+media_player.jellyfin:
+ version: 1
+ result:
+ - title: Star Wars
+ media_class: directory
+ media_content_type: Video
+ media_content_id: 895dc4e1066da92847d48f9be28eb77c
+ children_media_class: null
+ can_play: false
+ can_expand: false
+ can_search: false
+ thumbnail: >-
+ https://jellyfin
+ not_shown: 0
+ children: []
+ - title: Star Trek
+ media_class: directory
+ media_content_type: Video
+ media_content_id: 5ae55567cae75c26671a0a6b027bdd5b
+ children_media_class: null
+ can_play: false
+ can_expand: false
+ can_search: false
+ thumbnail: >-
+ https://jellyfin
+ not_shown: 0
+ children: []
+```
+### Action play media
+
+To play media on any player you first need to find the `media_content_id` of the content you want to play, through either [browsing to the media](#action-browse-media) or [searching media](#action-search-media).
+
+| Data attribute | Description |
+| --------------------- | ------------------------------------------------- |
+| `entity_id` | `entity_id` of the media player |
+| `media_content_id` | Unique identifier of the content you want to play |
+| `media_content_type` | `movie` or `tvshow` |
+
+#### Examples:
+
+Play a movie on one of the Jellyfin clients that supports playback.
+
+```yaml
+action: media_player.play_media
+target:
+ entity_id:
+ - media_player.jellyfin
+data:
+ media_content_id: a982a31451450daeda02c89952e6d7cf
+ media_content_type: movie
+```
+
diff --git a/source/_integrations/jewish_calendar.markdown b/source/_integrations/jewish_calendar.markdown
index 1593fe0bc82..97f12db4f95 100644
--- a/source/_integrations/jewish_calendar.markdown
+++ b/source/_integrations/jewish_calendar.markdown
@@ -10,6 +10,7 @@ ha_codeowners:
ha_domain: jewish_calendar
ha_platforms:
- binary_sensor
+ - diagnostics
- sensor
ha_integration_type: integration
ha_config_flow: true
diff --git a/source/_integrations/juicenet.markdown b/source/_integrations/juicenet.markdown
deleted file mode 100644
index b32fd2a348d..00000000000
--- a/source/_integrations/juicenet.markdown
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: JuiceNet
-description: Instructions on how to setup WiFi-equipped JuiceNet/JuiceBox charging stations with Home Assistant.
-ha_category:
- - Car
- - Energy
- - Number
- - Sensor
- - Switch
-ha_iot_class: Cloud Polling
-ha_release: 0.47
-ha_codeowners:
- - '@jesserockz'
-ha_domain: juicenet
-ha_config_flow: true
-ha_platforms:
- - number
- - sensor
- - switch
-ha_integration_type: integration
----
-
-The `juicenet` platform pulls data from a [JuiceNet](https://evcharging.enelx.com/products/juicebox) charging station equipped with a Wi-Fi connection. It will access and make available all of the devices attached to your account. It also exposes a switch allowing you to charge your car now instead of waiting for the pre-set schedule.
-
-{% important %}
-This integration can no longer be set up as the required API token cannot be obtained. However, if you have it working, it may remain functional.
-{% endimportant %}
-
-{% include integrations/config_flow.md %}
-
-
-## Sensor
-
-The `juicenet` sensor platform allows you to get data from your [JuiceNet](https://evcharging.enelx.com/products/juicebox) charger.
-
-### Added sensors
-
-These sensors will be added for each JuiceNet device in your account:
-
-- Status
-- Temperature (inside the device)
-- Voltage
-- Amps
-- Watts
-- Charge time of session
-- Energy added this session
-
-## Switch
-
-The `juicenet` switch platform allows you to override the charging schedule for your JuiceNet device.
-
-## Number
-
-The `juicenet` number platform allows you to control the charging amperage limit.
diff --git a/source/_integrations/knocki.markdown b/source/_integrations/knocki.markdown
index a10add6610f..520f7074557 100644
--- a/source/_integrations/knocki.markdown
+++ b/source/_integrations/knocki.markdown
@@ -14,6 +14,7 @@ ha_domain: knocki
ha_platforms:
- event
ha_integration_type: hub
+ha_dhcp: true
---
The **Knocki** {% term integration %} allows you to trigger your favorite automations simply by tapping custom patterns (such as triple taps) on ordinary surfaces.
diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown
index 3842ebfbfaf..3fb38c57f4f 100644
--- a/source/_integrations/knx.markdown
+++ b/source/_integrations/knx.markdown
@@ -48,6 +48,7 @@ ha_platforms:
- weather
ha_config_flow: true
ha_integration_type: hub
+ha_quality_scale: silver
---
The [KNX](https://www.knx.org) integration connects Home Assistant to your KNX installation, allowing you to control KNX devices, act on telegrams and forward state changes from other integrations entities to your KNX bus.
@@ -125,13 +126,23 @@ Local IP interface:
See [Connection](#connection) on how to get the files or keys needed for this configuration step.
-{% include integrations/option_flow.md %}
+## Reconfiguration
+
+You can change your KNX connection configuration at any time through the integration settings. This is useful when you need to update the Keyring file or switch to a different connection type.
+
+1. Go to {% my integrations icon title="**Settings** > **Devices & services**" %}.
+2. Select **KNX**.
+3. Click the three-dot {% icon "mdi:dots-vertical" %} menu and then select **Reconfigure**.
### Configure KNX interface
Reconfigure your connection settings. See above for more information.
-### Communication settings
+### Import KNX Keyring
+
+Provide a new keyring file to be used by the integration. See [KNX Secure](#knx-secure) on how to get this file.
+
+{% include integrations/option_flow.md %}
{% configuration_basic %}
State updater:
@@ -142,10 +153,6 @@ Telegram history limit:
description: "Number of Telegrams to keep in memory for the KNX panels group monitor."
{% endconfiguration_basic %}
-### Import KNX Keyring
-
-Provide a (new) keyring file to be used by the integration. See [KNX Secure](#knx-secure) on how to get this file.
-
## Basic configuration
In order to make use of the various platforms offered by the KNX integration, you will need to set them up via the KNX panel or add the corresponding configuration yaml to your {% term "`configuration.yaml`" %}. See [Splitting up the configuration](/docs/configuration/splitting_configuration/) if you like to arrange YAML parts in dedicated files.
@@ -555,7 +562,7 @@ address:
required: true
type: [string, list]
remove:
- description: If `True` the group address will be removed.
+ description: If `true` the group address will be removed.
required: false
type: boolean
default: false
@@ -571,7 +578,7 @@ The `knx.exposure_register` action can be used to register (or unregister) expos
{% configuration %}
remove:
- description: In addition to the configuration variables of [expose](#exposing-entity-states-entity-attributes-or-time-to-knx-bus) `remove` set to `True` can be used to remove exposures. Only `address` is required for removal.
+ description: In addition to the configuration variables of [expose](#exposing-entity-states-entity-attributes-or-time-to-knx-bus) `remove` set to `true` can be used to remove exposures. Only `address` is required for removal.
required: false
type: boolean
default: false
@@ -1279,7 +1286,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1346,7 +1353,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1750,7 +1757,7 @@ type:
required: true
type: [string, integer]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1883,7 +1890,7 @@ options:
required: true
type: integer
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2219,7 +2226,7 @@ invert:
type: boolean
default: false
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2282,7 +2289,7 @@ type:
type: [string, integer]
default: latin_1
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2335,7 +2342,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
diff --git a/source/_integrations/kodi.markdown b/source/_integrations/kodi.markdown
index 6244048b0f1..3f60c994ef4 100644
--- a/source/_integrations/kodi.markdown
+++ b/source/_integrations/kodi.markdown
@@ -71,22 +71,22 @@ automation:
Add music to the default playlist (i.e., playlistid=0).
| Data attribute | Optional | Description |
-| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `entity_id` | no | Name(s) of the Kodi entities where to add the media. |
-| `media_type` | yes | Media type identifier. It must be one of SONG or ALBUM. |
-| `media_id` | no | Unique Id of the media entry to add (`songid` or `albumid`). If not defined, `media_name` and `artist_name` are needed to search the Kodi music library. |
-| `media_name` | no | Optional media name for filtering media. Can be 'ALL' when `media_type` is 'ALBUM' and `artist_name` is specified, to add all songs from one artist. |
-| `artist_name` | no | Optional artist name for filtering media. |
+| -------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `entity_id` | no | Name(s) of the Kodi entities where to add the media. |
+| `media_type` | yes | Media type identifier. It must be one of SONG or ALBUM. |
+| `media_id` | no | Unique Id of the media entry to add (`songid` or `albumid`). If not defined, `media_name` and `artist_name` are needed to search the Kodi music library. |
+| `media_name` | no | Optional media name for filtering media. Can be 'ALL' when `media_type` is 'ALBUM' and `artist_name` is specified, to add all songs from one artist. |
+| `artist_name` | no | Optional artist name for filtering media. |
#### Action `kodi.call_method`
Call a [Kodi JSON-RPC API](https://kodi.wiki/?title=JSON-RPC_API) method with optional parameters. Results of the Kodi API call will be redirected in a Home Assistant event: `kodi_call_method_result`.
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | --------------------------------------------------------- |
-| `entity_id` | no | Name(s) of the Kodi entities where to run the API method. |
-| `method` | yes | Name of the Kodi JSON-RPC API method to be called. |
-| any other parameter | no | Optional parameters for the Kodi API call. |
+| Data attribute | Optional | Description |
+| ------------------- | -------- | --------------------------------------------------------- |
+| `entity_id` | no | Name(s) of the Kodi entities where to run the API method. |
+| `method` | yes | Name of the Kodi JSON-RPC API method to be called. |
+| any other parameter | no | Optional parameters for the Kodi API call. |
### Event triggering
@@ -392,7 +392,7 @@ key presses of keyboards/remotes can be overwritten in Kodi and configured to se
A keypress can be overwritten in Kodi by using the [Kodi keymap XML](https://kodi.wiki/view/Keymap) or from within the Kodi GUI using the [Keymap Editor add-on](https://kodi.wiki/view/Add-on:Keymap_Editor).
-An example of the Kodi keymap configuration using XML, which will overwrite the volume_up/volume_down buttons and instead send an event to HomeAssistant:
+An example of the Kodi keymap configuration using XML, which will overwrite the volume_up/volume_down buttons and instead send an event to Home Assistant:
```xml
diff --git a/source/_integrations/kostal_plenticore.markdown b/source/_integrations/kostal_plenticore.markdown
index 6522c81a8be..77d03ec191f 100644
--- a/source/_integrations/kostal_plenticore.markdown
+++ b/source/_integrations/kostal_plenticore.markdown
@@ -30,14 +30,14 @@ The integration supports installer-level access using a Master key and Service C
Using installer credentials:
-- Should only be done if you fully understand the implications
-- May void your warranty
-- Could potentially damage your device if settings are incorrectly configured
-- Should be done with extreme caution
+- Should only be done if you fully understand the implications
+- May void your warranty
+- Could potentially damage your device if settings are incorrectly configured
+- Should be done with extreme caution
-{% endwarning %}
+{% endwarning %}
-To enable installer access, set your Master Key as the password and fill in the Service Code in the configuration when adding the integration.
+To enable installer access, set your Master Key as the password and fill in the Service Code in the configuration when adding the integration.
For information about obtaining installer credentials, please consult your device documentation or contact a certified installer.
@@ -170,6 +170,12 @@ The following sensors are available in the library:
| Battery Strategy | | RW | Battery strategy. |
| Shadow Management | | RW | PV string shadow management. |
+If you use installer access to connect, you also have access to the following sensors:
+
+| Name | Unit | RW | Description |
+|-------------------------|------|----|:--------------|
+| Battery Manual Charge | | RW | Force the battery to charge. |
+
{% note %}
Setting values change less often, therefore these sensors are only polled every 5 minutes.
{% endnote %}
@@ -188,6 +194,12 @@ The Battery Smart Control sensor appears as a select field labeled "Battery Char
- **Battery:SmartBatteryControl:Enable**: the battery loading optimizes grid feed-in and battery loading. This setting is recommended when the grid feed-in is limited to, for example, 70% of the Plenticore Plus peak power.
- **Battery:TimeControl:Enable**: battery charging/discharging can be configured flexibly at different times (tariff periods). Detailed settings must be done on the web frontend of the Kostal Plenticore Plus inverter. This option activates the time-controlled battery usage mode.
+#### Battery Manual Charge
+
+The Battery Manual Charge sensor allows you to force charge the battery to 100%, regardless of PV generation or home usage.
+This setting is available when using installer access and should therefore only be used with the same caution as using installer access.
+More on [Installer Access](#installer-access)
+
## Number
The following Number entities are available. The values could also be change from Home Assistant.
diff --git a/source/_integrations/lametric.markdown b/source/_integrations/lametric.markdown
index e7bc227dde9..97429665007 100644
--- a/source/_integrations/lametric.markdown
+++ b/source/_integrations/lametric.markdown
@@ -8,6 +8,7 @@ ha_category:
- Select
- Sensor
- Switch
+ - Update
ha_iot_class: Local Polling
ha_release: 0.49
ha_codeowners:
@@ -23,6 +24,7 @@ ha_platforms:
- select
- sensor
- switch
+ - update
ha_integration_type: device
ha_config_flow: true
ha_ssdp: true
diff --git a/source/_integrations/lawn_mower.mqtt.markdown b/source/_integrations/lawn_mower.mqtt.markdown
index e75bb881fcc..1f606973d08 100644
--- a/source/_integrations/lawn_mower.mqtt.markdown
+++ b/source/_integrations/lawn_mower.mqtt.markdown
@@ -163,7 +163,7 @@ name:
required: false
type: string
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/lcn.markdown b/source/_integrations/lcn.markdown
index 77ee7de26b6..3850726630d 100644
--- a/source/_integrations/lcn.markdown
+++ b/source/_integrations/lcn.markdown
@@ -25,6 +25,7 @@ ha_platforms:
- switch
ha_config_flow: true
ha_integration_type: integration
+ha_quality_scale: bronze
---
The **LCN** {% term integration %} for Home Assistant allows you to connect to [LCN](https://www.lcn.eu/) hardware devices.
@@ -39,6 +40,27 @@ The `lcn` integration allows connections to more than one hardware coupler. For
{% include integrations/config_flow.md %}
+To set up the integration, you need to provide the following information:
+
+{% configuration_basic %}
+Name:
+ description: "Name to identify the integration entry"
+IP address:
+ description: "IP address or hostname of the PCHK server"
+Port:
+ description: "Port used by the PCHK server"
+Username:
+ description: "Username for authorization on the PCHK server"
+Password:
+ description: "Password for authorization on the PCHK server"
+Segment coupler scan attempts:
+ description: "Number of attempts to find a segment coupler in your installation. Increase this number, if not all segment couplers are identified correctly. If no segment coupler is in your installation, leave this number at 0."
+Dimming mode:
+ description: "The number of steps used for dimming outputs of all LCN modules. This setting is system-specific and depends on the capabilities of the installed LCN modules."
+Request acknowledgement from modules:
+ description: "LCN modules can transmit a confirmation message for received commands. Commands are resent if this confirmation is not received. However, the activation of acknowledgements increases the bus traffic, which can lead to message losses if there are many modules in the installation."
+{% endconfiguration_basic %}
+
## Supported device types
There is currently support for the following device types within Home Assistant:
diff --git a/source/_integrations/lg_thinq.markdown b/source/_integrations/lg_thinq.markdown
index acdfe8b45e1..fb76e8a2eed 100644
--- a/source/_integrations/lg_thinq.markdown
+++ b/source/_integrations/lg_thinq.markdown
@@ -23,6 +23,7 @@ ha_platforms:
ha_integration_type: integration
ha_codeowners:
- '@LG-ThinQ-Integration'
+ha_dhcp: true
---
The **LG ThinQ** integration allows you to connect LG ThinQ devices to Home Assistant. The features of this integration include:
diff --git a/source/_integrations/light.mqtt.markdown b/source/_integrations/light.mqtt.markdown
index 46e87b11641..b0c19034522 100644
--- a/source/_integrations/light.mqtt.markdown
+++ b/source/_integrations/light.mqtt.markdown
@@ -286,7 +286,7 @@ name:
type: string
default: MQTT Light
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
on_command_type:
@@ -717,7 +717,7 @@ name:
type: string
default: MQTT JSON Light
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
@@ -1123,7 +1123,7 @@ name:
type: string
default: MQTT Template Light
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/light.template.markdown b/source/_integrations/light.template.markdown
deleted file mode 100644
index d19dfc5228f..00000000000
--- a/source/_integrations/light.template.markdown
+++ /dev/null
@@ -1,430 +0,0 @@
----
-title: "Template Light"
-description: "Instructions on how to integrate Template Lights into Home Assistant."
-ha_category:
- - Light
- - Helper
-ha_release: 0.46
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - light
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform creates lights that combine integrations and provides the
-ability to run scripts or invoke actions for each of the on, off, and
-brightness commands of a light.
-
-To enable Template Lights in your installation, add the following to your
-{% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-light:
- - platform: template
- lights:
- theater_lights:
- friendly_name: "Theater Lights"
- level_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int }}"
- value_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}"
- temperature_template: "{{states('input_number.temperature_input') | int}}"
- hs_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})"
- effect_list_template: "{{ state_attr('light.led_strip', 'effect_list') }}"
- turn_on:
- action: script.theater_lights_on
- turn_off:
- action: script.theater_lights_off
- set_level:
- action: script.theater_lights_level
- data:
- brightness: "{{ brightness }}"
- set_temperature:
- action: input_number.set_value
- data:
- value: "{{ color_temp }}"
- entity_id: input_number.temperature_input
- set_hs:
- - action: input_number.set_value
- data:
- value: "{{ h }}"
- entity_id: input_number.h_input
- - action: input_number.set_value
- data:
- value: "{{ s }}"
- entity_id: input_number.s_input
- - action: light.turn_on
- data:
- entity_id:
- - light.led_strip
- transition: "{{ transition | float }}"
- hs_color:
- - "{{ hs[0] }}"
- - "{{ hs[1] }}"
- set_effect:
- - action: light.turn_on
- data:
- entity_id:
- - light.led_strip
- effect: "{{ effect }}"
- supports_transition_template: "{{ true }}"
-```
-
-{% endraw %}
-
-{% configuration %}
- lights:
- description: List of your lights.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this light. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: Defines a template to get the state of the light.
- required: false
- type: template
- default: optimistic
- level_template:
- description: Defines a template to get the brightness of the light.
- required: false
- type: template
- default: optimistic
- temperature_template:
- description: Defines a template to get the color temperature of the light.
- required: false
- type: template
- default: optimistic
- hs_template:
- description: Defines a template to get the HS color of the light. Must render a tuple (hue, saturation).
- required: false
- type: template
- default: optimistic
- rgb_template:
- description: Defines a template to get the RGB color of the light. Must render a tuple or a list (red, green, blue).
- required: false
- type: template
- default: optimistic
- rgbw_template:
- description: Defines a template to get the RGBW color of the light. Must render a tuple or a list (red, green, blue, white).
- required: false
- type: template
- default: optimistic
- rgbww_template:
- description: Defines a template to get the RGBWW color of the light. Must render a tuple or a list (red, green, blue, cold white, warm white).
- required: false
- type: template
- default: optimistic
- supports_transition_template:
- description: Defines a template to get if light supports transition. Should return boolean value (True/False). If this value is `True` transition parameter in a turn on or turn off call will be passed as a named parameter `transition` to either of the scripts.
- required: false
- type: template
- default: false
- effect_list_template:
- description: Defines a template to get the list of supported effects. Must render a list
- required: inclusive
- type: template
- default: optimistic
- effect_template:
- description: Defines a template to get the effect of the light.
- required: inclusive
- type: template
- default: optimistic
- min_mireds_template:
- description: Defines a template to get the min mireds value of the light.
- required: false
- type: template
- default: optimistic
- max_mireds_template:
- description: Defines a template to get the max mireds value of the light.
- required: false
- type: template
- default: optimistic
- icon_template:
- description: Defines a template for an icon or picture, e.g., showing a different icon for different states.
- required: false
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- turn_on:
- description: Defines an action to run when the light is turned on. May receive variables `brightness` and/or `transition`.
- required: true
- type: action
- turn_off:
- description: Defines an action to run when the light is turned off. May receive variable `transition`.
- required: true
- type: action
- set_level:
- description: Defines an action to run when the light is given a brightness command. The script will only be called if the `turn_on` call only has brightness, and optionally transition. Receives variables `brightness` and optionally `transition`.
- required: false
- type: action
- set_temperature:
- description: Defines an action to run when the light is given a color temperature command. Receives variable `color_temp`. May also receive variables `brightness` and/or `transition`.
- required: false
- type: action
- set_hs:
- description: "Defines an action to run when the light is given a hs color command. Available variables: `hs` as a tuple, `h` and `s`"
- required: false
- type: action
- set_rgb:
- description: "Defines an action to run when the light is given an RGB color command. Available variables: `rgb` as a tuple, `r`, `g` and `b`."
- required: false
- type: action
- set_rgbw:
- description: "Defines an action to run when the light is given an RGBW color command. Available variables: `rgbw` as a tuple, `rgb` as a tuple, `r`, `g`, `b` and `w`."
- required: false
- type: action
- set_rgbww:
- description: "Defines an action to run when the light is given an RGBWW color command. Available variables: `rgbww` as a tuple, `rgb` as a tuple, `r`, `g`, `b`, `cw` and `ww`."
- required: false
- type: action
- set_effect:
- description: Defines an action to run when the light is given an effect command. Receives variable `effect`. May also receive variables `brightness` and/or `transition`.
- required: inclusive
- type: action
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of a platform that takes extra time to load, the
-Template Light may get an `unknown` state during startup. This results
-in error messages in your log file until that platform has completed loading.
-If you use `is_state()` function in your template, you can avoid this situation.
-For example, you would replace
-{% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %}
-with this equivalent that returns `true`/`false` and never gives an unknown
-result:
-{% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
-Transition doesn't have its own script, it will instead be passed as a named parameter `transition` to the `turn_on`, `turn_off`, `brightness`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts.
-Brightness will be passed as a named parameter `brightness` to either of `turn_on`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts if the corresponding parameter is also in the call. In this case, the brightness script (`set_level`) will not be called.
-If only brightness is passed to `light.turn_on` action, then `set_level` script is called.
-
-## Examples
-
-In this section you will find some real-life examples of how to use this light.
-
-### Theater Volume Control
-
-This example shows a light that is actually a home theater's volume. This
-integration gives you the flexibility to provide whatever you'd like to send as
-the payload to the consumer including any scale conversions you may need to
-make; the [media player integration](/integrations/media_player/) needs a floating
-point percentage value from `0.0` to `1.0`.
-
-{% raw %}
-
-```yaml
-light:
- - platform: template
- lights:
- theater_volume:
- friendly_name: "Receiver Volume"
- value_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- off
- {% else %}
- on
- {% endif %}
- {% else %}
- off
- {% endif %}
- turn_on:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: false
- turn_off:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: true
- set_level:
- action: media_player.volume_set
- target:
- entity_id: media_player.receiver
- data:
- volume_level: "{{ (brightness / 255 * 100)|int / 100 }}"
- level_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {{ (state_attr('media_player.receiver', 'volume_level')|float * 255)|int }}
- {% else %}
- 0
- {% endif %}
-```
-
-{% endraw %}
-
-### Change The Icon
-
-This example shows how to change the icon based on the light state.
-
-{% raw %}
-
-```yaml
-light:
- - platform: template
- lights:
- theater_volume:
- friendly_name: "Receiver Volume"
- value_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- off
- {% else %}
- on
- {% endif %}
- {% else %}
- off
- {% endif %}
- icon_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- mdi:lightbulb-off
- {% else %}
- mdi:lightbulb-on
- {% endif %}
- {% else %}
- mdi:lightbulb-off
- {% endif %}
- turn_on:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: false
- turn_off:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: true
-```
-
-{% endraw %}
-
-### Change The Entity Picture
-
-This example shows how to change the entity picture based on the light state.
-
-{% raw %}
-
-```yaml
-light:
- - platform: template
- lights:
- theater_volume:
- friendly_name: "Receiver Volume"
- value_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- off
- {% else %}
- on
- {% endif %}
- {% else %}
- off
- {% endif %}
- icon_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- /local/lightbulb-off.png
- {% else %}
- /local/lightbulb-on.png
- {% endif %}
- {% else %}
- /local/lightbulb-off.png
- {% endif %}
- turn_on:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: false
- turn_off:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: true
-```
-
-{% endraw %}
-
-### Make a global light entity for a multi-segment WLED light
-
-This example shows how to group together 2 RGBW segments from the same WLED controller into a single usable light
-
-{% raw %}
-
-```yaml
-light:
- - platform: template
- lights:
- wled_global:
- unique_id: 28208f257b54c44e50deb2d618d44710
- friendly_name: "Multi-segment Wled control"
- value_template: "{{ states('light.wled_master') }}"
- level_template: "{{ state_attr('light.wled_master', 'brightness')|d(0,true)|int }}"
- rgbw_template: (
- {{ (state_attr('light.wled_segment_0', 'rgbw_color')[0]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[0]|d(0))/2 }},
- {{ (state_attr('light.wled_segment_0', 'rgbw_color')[1]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[1]|d(0))/2 }},
- {{ (state_attr('light.wled_segment_0', 'rgbw_color')[2]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[2]|d(0))/2 }},
- {{ (state_attr('light.wled_segment_0', 'rgbw_color')[3]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[3]|d(0))/2 }}
- )
- effect_list_template: "{{ state_attr('light.wled_segment_0', 'effect_list') }}"
- effect_template: "{{ state_attr('light.wled_segment_0', 'effect') if state_attr('light.wled_segment_0', 'effect') == state_attr('light.wled_segment_1', 'effect') else none }}"
- availability_template: "{{ not is_state('light.wled_master', 'unknown') }}"
-
- turn_on:
- action: light.turn_on
- entity_id: light.wled_segment_0, light.wled_segment_1, light.wled_master
- turn_off:
- action: light.turn_off
- entity_id: light.wled_master
- set_level:
- action: light.turn_on
- entity_id: light.wled_master
- data:
- brightness: "{{ brightness }}"
- set_rgbw:
- action: light.turn_on
- entity_id: light.wled_segment_0, light.wled_segment_1
- data:
- rgbw_color:
- - "{{ r }}"
- - "{{ g }}"
- - "{{ b }}"
- - "{{ w }}"
- effect: "Solid"
- set_effect:
- action: light.turn_on
- entity_id: light.wled_segment_0, light.wled_segment_1
- data:
- effect: "{{ effect }}"
-```
-
-{% endraw %}
diff --git a/source/_integrations/linak.markdown b/source/_integrations/linak.markdown
index 516ca4beb38..bca1adff175 100644
--- a/source/_integrations/linak.markdown
+++ b/source/_integrations/linak.markdown
@@ -6,8 +6,9 @@ ha_category:
ha_domain: linak
ha_integration_type: virtual
ha_supporting_domain: idasen_desk
-ha_supporting_integration: IKEA Idåsen Desk
+ha_supporting_integration: IKEA Idasen Desk
ha_release: '2023.10'
+ha_bluetooth: true
ha_codeowners:
- '@abmantis'
ha_config_flow: true
@@ -16,7 +17,6 @@ ha_platforms:
- cover
- sensor
ha_iot_class: Local Push
-ha_bluetooth: true
---
{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/linkplay.md b/source/_integrations/linkplay.markdown
similarity index 97%
rename from source/_integrations/linkplay.md
rename to source/_integrations/linkplay.markdown
index 122541b531f..203ad8a1f27 100644
--- a/source/_integrations/linkplay.md
+++ b/source/_integrations/linkplay.markdown
@@ -5,14 +5,15 @@ ha_category:
- Media player
ha_domain: linkplay
ha_zeroconf: true
-ha_integration_type: integration
+ha_integration_type: hub
ha_release: 2024.8
ha_codeowners:
- '@Velleman'
ha_config_flow: true
ha_platforms:
- - media_player
- button
+ - diagnostics
+ - media_player
ha_iot_class: Local Polling
---
diff --git a/source/_integrations/litterrobot.markdown b/source/_integrations/litterrobot.markdown
index 497941341cf..244c03cbfe2 100644
--- a/source/_integrations/litterrobot.markdown
+++ b/source/_integrations/litterrobot.markdown
@@ -52,6 +52,7 @@ Before using this integration, you’ll need a Whisker account and a Wi-Fi-enabl
| Sleep mode start time | `sensor` | When sleep mode is enabled, displays the current or next sleep mode start time. |
| Sleep mode end time | `sensor` | When sleep mode is enabled, displays the current or last sleep mode end time. |
| Status code | `sensor` | Displays the status code (Clean Cycle in Progress, Ready, Drawer Full, etc.). |
+| Total cycles | `sensor` | Displays the total cycles. |
| Waste drawer | `sensor` | Displays the current waste drawer level. |
| Power status | `binary_sensor` | Indicates whether power is currently connected. |
| Sleep mode | `binary_sensor` | Indicates whether sleep mode is enabled. |
@@ -74,9 +75,10 @@ Before using this integration, you’ll need a Whisker account and a Wi-Fi-enabl
### Pet
-| Entity | Domain | Description |
-| ------ | -------- | ------------- |
-| Weight | `sensor` | Pet's weight. |
+| Entity | Domain | Description |
+| ------------ | -------- | ------------------------------------------------- |
+| Visits today | `sensor` | Pet's daily visits to the Litter-Robot. |
+| Weight | `sensor` | Pet's weight. |
## Actions
diff --git a/source/_integrations/locative.md b/source/_integrations/locative.markdown
similarity index 87%
rename from source/_integrations/locative.md
rename to source/_integrations/locative.markdown
index 3f28d27707d..15ea26dc512 100644
--- a/source/_integrations/locative.md
+++ b/source/_integrations/locative.markdown
@@ -1,11 +1,15 @@
---
-title: "Locative"
-description: "Instructions on how to use Locative to track devices in Home Assistant."
+title: Locative
+description: Instructions on how to use Locative to track devices in Home Assistant.
ha_category:
- Presence detection
ha_release: 0.86
-ha_iot_class: Cloud Push
+ha_iot_class: Local Push
ha_domain: locative
+ha_platforms:
+ - device_tracker
+ha_config_flow: true
+ha_integration_type: integration
---
This platform allows you to detect presence using [Locative](https://www.locative.app/). Locative is an open source app for [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4) that allows users to set up a `GET` or `POST` request when a geofence is entered or exited. This can be configured with Home Assistant to update your location.
diff --git a/source/_integrations/lock.mqtt.markdown b/source/_integrations/lock.mqtt.markdown
index 1611a73e3fe..1ca6f62cce9 100644
--- a/source/_integrations/lock.mqtt.markdown
+++ b/source/_integrations/lock.mqtt.markdown
@@ -168,7 +168,7 @@ name:
type: string
default: MQTT Lock
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/lock.template.markdown b/source/_integrations/lock.template.markdown
deleted file mode 100644
index ddfeaf7f367..00000000000
--- a/source/_integrations/lock.template.markdown
+++ /dev/null
@@ -1,213 +0,0 @@
----
-title: "Template Lock"
-description: "Instructions on how to integrate Template Locks into Home Assistant."
-ha_category:
- - Lock
- - Helper
-ha_release: 0.81
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - lock
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform creates locks that combines components.
-
-For example, if you have a garage door with a toggle switch that operates the motor and a sensor that allows you know whether the door is open or closed, you can combine these into a lock that knows whether the garage door is open or closed.
-
-This can simplify the GUI and make it easier to write automations.
-
-In optimistic mode, the lock will immediately change state after every command. Otherwise, the lock will wait for state confirmation from the template. Try to enable it, if experiencing incorrect lock operation.
-
-## Configuration
-
-To enable Template Locks in your installation, add the following to your {% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-lock:
- - platform: template
- name: Garage door
- value_template: "{{ is_state('sensor.door', 'on') }}"
- lock:
- action: switch.turn_on
- target:
- entity_id: switch.door
- unlock:
- action: switch.turn_off
- target:
- entity_id: switch.door
-```
-
-{% endraw %}
-
-{% configuration %}
- name:
- description: Name to use in the frontend.
- required: false
- type: string
- default: Template Lock
- unique_id:
- description: An ID that uniquely identifies this lock. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: Defines a template to set the state of the lock.
- required: true
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- code_format_template:
- description: Defines a template to get the `code_format` attribute of the entity. This template must evaluate to a valid [Python regular expression](https://docs.python.org/3/library/re.html#regular-expression-syntax) or `None`. If it evaluates to a not-`None` value, the user is prompted to enter a code when interacting with the lock. The code will be matched against the regular expression, and only if it matches, the lock/unlock actions will be executed. The actual _validity_ of the entered code must be verified within these actions. If there's a syntax error in the template, the entity will be unavailable. If the template fails to render for other reasons or if the regular expression is invalid, no code will be accepted and the lock/unlock actions will never be invoked.
- required: false
- type: template
- default: None
- lock:
- description: Defines an action to run when the lock is locked.
- required: true
- type: action
- unlock:
- description: Defines an action to run when the lock is unlocked.
- required: true
- type: action
- open:
- description: Defines an action to run when the lock is opened.
- required: false
- type: action
- optimistic:
- description: Flag that defines if lock works in optimistic mode.
- required: false
- type: boolean
- default: false
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of a platform that takes extra time to load, the Template Lock may get an `unknown` state during startup. This results in error messages in your log file until that platform has completed loading. If you use `is_state()` function in your template, you can avoid this situation. For example, you would replace {% raw %}`{{ state('switch.source') == 'on') }}`{% endraw %} with this equivalent that returns `true`/`false` and never gives an unknown result: {% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
-
-## Examples
-
-In this section, you find some real-life examples of how to use this lock.
-
-### Lock from Switch
-
-This example shows a lock that copies data from a switch.
-
-{% raw %}
-
-```yaml
-lock:
- - platform: template
- name: Garage Door
- value_template: "{{ is_state('switch.source', 'on') }}"
- lock:
- action: switch.turn_on
- target:
- entity_id: switch.source
- unlock:
- action: switch.turn_off
- target:
- entity_id: switch.source
-```
-
-{% endraw %}
-
-### Optimistic mode
-
-This example shows a lock in optimistic mode. This lock will immediately change state after command and will not wait for state update from the sensor.
-
-{% raw %}
-
-```yaml
-lock:
- - platform: template
- name: Garage Door
- value_template: "{{ is_state('sensor.skylight.state', 'on') }}"
- optimistic: true
- lock:
- action: switch.turn_on
- target:
- entity_id: switch.source
- unlock:
- action: switch.turn_off
- target:
- entity_id: switch.source
-```
-
-{% endraw %}
-
-### Sensor and Two Switches
-
-This example shows a lock that takes its state from a sensor, and uses two momentary switches to control a device.
-
-{% raw %}
-
-```yaml
-lock:
- - platform: template
- name: Garage Door
- value_template: "{{ is_state('sensor.skylight.state', 'on') }}"
- lock:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_open
- unlock:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_close
-```
-
-{% endraw %}
-
-### Lock from switch with dynamic code
-
-This example shows a lock that copies data from a switch. It needs a PIN code defined as a [secret](/docs/configuration/secrets) to unlock and no code to lock. Note that the actual validity check of the code is part of the `unlock` action and should always happen there or in scripts called from these actions. In this way, you can not only perform code checks against static values, but also dynamic ones (for instance, TOTPs).
-
-{% raw %}
-
-```yaml
-lock:
- - platform: template
- name: Garage Door
- value_template: "{{ is_state('switch.source', 'on') }}"
- code_format_template: "{{ '\\d{4}' if is_state('switch.source', 'on') else None }}"
- lock:
- - action: switch.turn_on
- target:
- entity_id: switch.source
- unlock:
- - variables:
- pin: !secret garage_door_pin
- - condition: "{{ code == pin }}"
- - action: switch.turn_off
- target:
- entity_id: switch.source
-```
-
-{% endraw %}
-
-In `secrets.yaml`:
-
-{% raw %}
-
-```yaml
-garage_door_pin: "1234"
-```
-
-{% endraw %}
diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown
index 3ed9312ef91..dc99f0c7fe8 100644
--- a/source/_integrations/matter.markdown
+++ b/source/_integrations/matter.markdown
@@ -386,7 +386,7 @@ NOTE for Android users: You need to follow the instructions at the bottom of the
### General recommendations
-- Using Thread-based Matter devices in Home Assistant requires Home Assistant OS version 10 and above. Not using Home Assistant OS is at your own risk. We do provide some [documentation](https://github.com/home-assistant-libs/python-matter-server/blob/main/README.md) on how to run the Matter Server as a Docker container. The documentation includes a description of the host and networking requirements.
+- Using Thread-based Matter devices in Home Assistant requires Home Assistant OS version 10 and above. Home Assistant OS with the Matter Server add-on is the supported path for using Matter with Home Assistant. Running Matter Server as a standalone Docker container is unsupported, but we provide [documentation](https://github.com/home-assistant-libs/python-matter-server/blob/main/README.md) including a description of the host and networking requirements.
- To use {% term Thread %} devices you will need a {% term Thread %} network with at least one Thread border router in your network nearby the {% term Thread %} device(s). Apple users, for example, need the Apple TV 4K or the HomePod Mini, while Google users need a Nest Hub (2nd Gen). Use the Thread integration in Home Assistant to diagnose your {% term Thread %} network(s).
diff --git a/source/_integrations/mealie.markdown b/source/_integrations/mealie.markdown
index 0e506e58a4a..592d9f703a0 100644
--- a/source/_integrations/mealie.markdown
+++ b/source/_integrations/mealie.markdown
@@ -17,6 +17,7 @@ ha_platforms:
- sensor
- todo
ha_integration_type: service
+ha_quality_scale: silver
---
[Mealie](https://mealie.io/) is an open source, self-hosted recipe manager, meal planner, and shopping list. The Mealie {% term integration %} will fetch and allow you to create and update data held in your Mealie instance.
diff --git a/source/_integrations/meater.markdown b/source/_integrations/meater.markdown
index 4c94f85c073..adfd60f114d 100644
--- a/source/_integrations/meater.markdown
+++ b/source/_integrations/meater.markdown
@@ -11,6 +11,7 @@ ha_codeowners:
- '@emontnemery'
ha_domain: meater
ha_platforms:
+ - diagnostics
- sensor
ha_integration_type: integration
---
diff --git a/source/_integrations/media_player.markdown b/source/_integrations/media_player.markdown
index 6e740a75d75..15de81a67b9 100644
--- a/source/_integrations/media_player.markdown
+++ b/source/_integrations/media_player.markdown
@@ -29,7 +29,6 @@ A media player can have the following states:
- **Idle**: The media player is turned on and accepting commands, but currently not playing any media. Possibly at some idle home screen.
- **Playing**: The media player is currently playing media.
- **Paused**: The media player has an active media and is currently paused
-- **Standby**: The media player is in a low power state, accepting commands.
- **Buffering**: The media player is preparing to start playback of media.
- **Unavailable**: The entity is currently unavailable.
- **Unknown**: The state is not yet known.
diff --git a/source/_integrations/met_eireann.markdown b/source/_integrations/met_eireann.markdown
index 29c317692d7..623f27c7d17 100644
--- a/source/_integrations/met_eireann.markdown
+++ b/source/_integrations/met_eireann.markdown
@@ -17,14 +17,14 @@ ha_integration_type: integration
The Met Éireann integration uses the [Met Éireann](https://met.ie) (The Irish Meteorological Service) Public Weather Forecast API to provide current and forecasted weather data for a given location. This integration is in no way affiliated with or endorsed by Met Éireann.
{% note %}
-The Met Éireann API will only provide data for Ireland, the UK and a small part of northern France. For specific coverage, please see the Notes on API document available [here](https://data.gov.ie/dataset/met-eireann-weather-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1).
+The Met Éireann API will only provide data for Ireland, the UK and a small part of northern France. For specific coverage, please see the Notes on API document available [here](https://data.gov.ie/dataset/met-eireann-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1).
{% endnote %}
{% include integrations/config_flow.md %}
## Data license
-The data provided by Met Éireann is licensed under the Met Éireann Open Data Custom License (similar to a Creative Commons CC BY 4.0 license). A license summary and the full license are available [here](https://data.gov.ie/dataset/met-eireann-weather-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1). In short, if you distribute, broadcast or make Met Éireann data available on the public internet you must give credit to Met Éireann and display their weather warnings.
+The data provided by Met Éireann is licensed under the Met Éireann Open Data Custom License (similar to a Creative Commons CC BY 4.0 license). A license summary and the full license are available [here](https://data.gov.ie/dataset/met-eireann-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1). In short, if you distribute, broadcast or make Met Éireann data available on the public internet you must give credit to Met Éireann and display their weather warnings.
## Data changes
diff --git a/source/_integrations/miele.markdown b/source/_integrations/miele.markdown
index 7c778df2227..a62e8256ac5 100644
--- a/source/_integrations/miele.markdown
+++ b/source/_integrations/miele.markdown
@@ -159,10 +159,10 @@ Climate entities are used to control target temperatures in refrigerators, freez
- **Energy forecast**: Shows the forecast percentage of the maximum energy the program will consume for a given cycle.
- **Water consumption**: Shows the water consumption during the current program cycle. The value will be reset after finishing the program.
- **Water forecast**: Shows the forecast percentage of the maximum water the program will consume for a given cycle.
- - **Temperature**: Represents the current temperature in refrigerators, freezers, and ovens. Entities are created for up to 3 zones depending on the device capabilities.
+ - **Temperature**: Represents the current temperature in refrigerators, freezers, and ovens. Entities are created for up to 3 zones depending on the device capabilities. For zones 2 and 3, the temperature sensor is dynamically created when the appliance is turned on and a valid value is reported.
- **Target temperature**: Shows the set target temperature for ovens and washing machines.
- - **Core temperature**: Shows the core temperature of the food in ovens with an appropriate temperature probe.
- - **Target core temperature**: Shows the set core target temperature for the food in ovens with an appropriate temperature probe.
+ - **Core temperature**: Shows the core temperature of the food in ovens with an appropriate temperature probe. This sensor is dynamically created when the appliance is turned on, a program is started and the temperature probe is connected to the appliance.
+ - **Target core temperature**: Shows the set core target temperature for the food in ovens with an appropriate temperature probe. This sensor is dynamically created when the appliance is turned on, a program is started and the core target temperature is set on the device.
- **Drying step**: Shows the selected drying step on tumble dryers.
- **Elapsed time**: Shows the number of minutes that the current program has been running.
- **Remaining time**: Shows the estimated number of minutes remaining in the current program cycle. This value can fluctuate during a program cycle based on load dirtiness or water‑heating time.
diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown
index f1895983b8b..155a9821b03 100644
--- a/source/_integrations/modbus.markdown
+++ b/source/_integrations/modbus.markdown
@@ -1733,7 +1733,7 @@ Description:
| Attribute | Description |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| hub | Hub name (defaults to 'modbus_hub' when omitted) |
-| slave | Slave address (0-255) |
+| slave | Slave address (0-255, defaults to 1 when omitted) |
| address | Address of the Register (e.g. 138) |
| value | (write_register) A single value or an array of 16-bit values. Single value will call modbus function code 0x06. Array will call modbus function code 0x10. Values might need reverse ordering. E.g., to set 0x0004 you might need to set `[4,0]`, this depend on the byte order of your CPU |
| state | (write_coil) A single boolean or an array of booleans. Single boolean will call modbus function code 0x05. Array will call modbus function code 0x0F |
diff --git a/source/_integrations/motionmount.md b/source/_integrations/motionmount.markdown
similarity index 98%
rename from source/_integrations/motionmount.md
rename to source/_integrations/motionmount.markdown
index 0ce8902df51..e8a8c915385 100644
--- a/source/_integrations/motionmount.md
+++ b/source/_integrations/motionmount.markdown
@@ -2,22 +2,24 @@
title: Vogel's MotionMount
description: Instructions on how to integrate Vogel's MotionMount into Home Assistant.
ha_category:
+ - Binary sensor
- Number
- Select
- - Binary sensor
- Sensor
ha_release: 2024.1
ha_iot_class: Local Push
ha_config_flow: true
ha_platforms:
+ - binary_sensor
- number
- select
- - binary_sensor
- sensor
ha_codeowners:
- - '@RJPoelstra'
+ - '@laiho-vogels'
ha_domain: motionmount
ha_zeroconf: true
+ha_quality_scale: bronze
+ha_integration_type: device
---
The `motionmount` {% term integration %} allows you to control the position of your [TVM 7675 Pro](https://www.vogels.com/p/tvm-7675-pro-motorized-tv-wall-mount-black) SIGNATURE MotionMount from Vogel's.
@@ -112,4 +114,3 @@ The following devices are *not* supported:
- In case of doubt, perform a network reset by holding the reset button for approx. 5 seconds.
- **Result**: The LED will start to blink slowly. This indicates that the network configuration is being reset to use DHCP.
- **Important**: Don't hold the reset button for too long (approx. 10 s). Holding the button for 10 s or longer starts a factory reset. A factory reset is indicated by the LED blinking fast.
-
diff --git a/source/_integrations/mqtt.markdown b/source/_integrations/mqtt.markdown
index 53c07829ee2..cbe562cff4c 100644
--- a/source/_integrations/mqtt.markdown
+++ b/source/_integrations/mqtt.markdown
@@ -370,7 +370,7 @@ Supported shared options are:
- `qos`
- `encoding`
-The component specific options are placed as mappings under the `components` key (abbreviated as `cmp`) like:
+The component specific options are placed as mappings under the `components` key (abbreviated as `cmps`) like:
```json
{
@@ -409,7 +409,7 @@ The component specific options are placed as mappings under the `components` key
}
```
-The components id's under the `components` (`cmp`) key, are used as part of the discovery identification. A `platform` (`p`) config option is required for each component config that is added to identify the component platform. Also required is a `unique_id` for entity-based components.
+The components id's under the `components` (`cmps`) key, are used as part of the discovery identification. A `platform` (`p`) config option is required for each component config that is added to identify the component platform. Also required is a `unique_id` for entity-based components.
To remove the components, publish an empty (retained) string payload to the discovery topic. This will remove the component and clear the published discovery payload. It will also remove the device entry if there are no further references to it.
@@ -569,7 +569,7 @@ Check the logs to ensure this step is executed correctly.
**Step 3: Publish the new device-based discovery configuration:**
Discovery topic device: `homeassistant/device/0AFFD2/config`
-Discovery id: `0AFFD2 bla` *(`0AFFD2`from discovery topic, `bla`: The key under `cmp` in the discovery payload)*
+Discovery id: `0AFFD2 bla` *(`0AFFD2`from discovery topic, `bla`: The key under `cmps` in the discovery payload)*
Discovery payload device:
```json
@@ -1082,7 +1082,7 @@ payload_not_available:
required: false
type: string
default: offline
-{% endconfiguration %}
+{% endconfiguration %}
{% enddetails %}
@@ -1225,7 +1225,7 @@ Setting up a light, switch etc. is similar but requires a `command_topic` as men
- Configuration topic: `homeassistant/switch/irrigation/config`
- State topic: `homeassistant/switch/irrigation/state`
- Command topic: `homeassistant/switch/irrigation/set`
-- Payload:
+- Payload:
```json
{
@@ -1371,7 +1371,7 @@ The following software has built-in support for MQTT discovery:
- [Tasmota](https://github.com/arendst/Tasmota) (starting with 5.11.1e, development halted)
- [TeddyCloud](https://github.com/toniebox-reverse-engineering/teddycloud)
- [Teleinfo MQTT](https://fmartinou.github.io/teleinfo2mqtt) (starting with 3.0.0)
-- [Tydom2MQTT](https://fmartinou.github.io/tydom2mqtt/)
+- [Tydom2MQTT](https://tydom2mqtt.github.io/tydom2mqtt/)
- [What's up Docker?](https://fmartinou.github.io/whats-up-docker/) (starting with 3.5.0)
- [WyzeSense2MQTT](https://github.com/raetha/wyzesense2mqtt)
- [Xiaomi DaFang Hacks](https://github.com/EliasKotlyar/Xiaomi-Dafang-Hacks)
@@ -1433,7 +1433,7 @@ Note that MQTT device payloads often contain information for updating multiple e
### 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.
+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.
diff --git a/source/_integrations/music_assistant.markdown b/source/_integrations/music_assistant.markdown
index a54f35becc1..0f6595d2bd4 100644
--- a/source/_integrations/music_assistant.markdown
+++ b/source/_integrations/music_assistant.markdown
@@ -10,6 +10,7 @@ ha_codeowners:
- '@music-assistant'
ha_domain: music_assistant
ha_platforms:
+ - button
- media_player
ha_zeroconf: true
ha_integration_type: integration
@@ -20,7 +21,7 @@ The **Music Assistant** (MA) {% term integration %} allows you to connect Home A
There is currently support for the following Home Assistant Platforms:
- [Media player](#media-player)
-
+- [Button](#favorite-current-song-button)
All of the Home Assistant [Media Player Control Actions](https://www.home-assistant.io/integrations/media_player/#media-control-actions) are supported.
The `media_content_id` payload for `media_player.play_media` can be any of the following:
@@ -28,11 +29,14 @@ The `media_content_id` payload for `media_player.play_media` can be any of the f
- The name of a track, artist, or album. For example, `Queen`.
- A track or album combined with the artist's name. For example, `Queen - Innuendo`.
- A streaming provider URI. For example, `spotify://artist/12345`.
+- A streaming provider URL. For example, `https://open.spotify.com/track/31cWPvM99ZHxMl3mdgiw4I`.
The `media_content_id` payload for `media_player.browse_media` must be a URI of the form `library://artist/1`, `library://album/20`, or `spotify://album/5zj4Ej0FrlJQaSo0d6cttH`. The type of item that the URI refers to must be an album or artist.
These URIs can be obtained from, for example, the output of the `get_library` or `search` actions described below or the `media_player.browse_media` action from Home Assistant.
+Streaming provider URLs can be obtained from the web interface of the provider.
+
{% include integrations/config_flow.md %}
### Manual configuration
@@ -45,6 +49,11 @@ Under normal circumstances, Home Assistant automatically discovers your running
The Music Assistant integration creates media player entities for all players and groups available in MA, including those imported from Home Assistant. This is needed to provide the full functionality Music Assistant has to offer. This full functionality includes transfer of the playing queue of music from one player to another, automatic pausing of playback during announcements, and richer options for selecting the media for playback. These entities will display media information, playback progress, and playback controls.
+### Favorite current song button
+
+The Music Assistant integration creates a button entity for each player to favorite the current song. Pressing this button (manually or by automation) adds the current song to your Music Assistant favorites. This works for local playing songs and tracks from streaming providers. It also works with remote content such as Spotify Connect, AirPlay, or a radio station, as long as the external source provides an artist and title combination (and optionally the album). Note that the button will be marked as unavailable if there is no content playable that could be favorited.
+
+
## Actions
### Action `music_assistant.play_media`
diff --git a/source/_integrations/nam.markdown b/source/_integrations/nam.markdown
index 3bbb420f726..4f30dd4be33 100644
--- a/source/_integrations/nam.markdown
+++ b/source/_integrations/nam.markdown
@@ -19,6 +19,10 @@ ha_integration_type: device
The Nettigo Air Monitor integration allows you to read temperature, humidity, pressure and air quality data from Nettigo Air Monitor devices. [Nettigo Air Monitor](https://air.nettigo.pl/?setlang=en) is a DIY air quality monitoring system with open source firmware, based on an open hardware project.
+{% note %}
+The integration supports devices running Nettigo Air Monitor and [Sensor.Community firmware](https://github.com/opendata-stuttgart/sensors-software).
+{% endnote %}
+
The integration currently has support for the following sensors:
- BH1750
diff --git a/source/_integrations/nasweb.markdown b/source/_integrations/nasweb.markdown
index 3b3c9f01bed..c06c375454f 100644
--- a/source/_integrations/nasweb.markdown
+++ b/source/_integrations/nasweb.markdown
@@ -2,6 +2,7 @@
title: NASweb
description: Integrate NASweb devices
ha_category:
+ - Sensor
- Switch
ha_release: '2024.12'
ha_codeowners:
@@ -10,6 +11,7 @@ ha_iot_class: Local Push
ha_domain: nasweb
ha_config_flow: true
ha_platforms:
+ - sensor
- switch
ha_integration_type: hub
---
diff --git a/source/_integrations/neff.markdown b/source/_integrations/neff.markdown
index 2b5f2da4ae7..82506976177 100644
--- a/source/_integrations/neff.markdown
+++ b/source/_integrations/neff.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/nextcloud.markdown b/source/_integrations/nextcloud.markdown
index f2c8edad40b..9be8ffc562b 100644
--- a/source/_integrations/nextcloud.markdown
+++ b/source/_integrations/nextcloud.markdown
@@ -35,3 +35,100 @@ This integration has the following Nextcloud Server prerequisites:
- (Recommended) A Nextcloud App password should be generated for use in Home Assistant (__*Nextcloud*__ > __*Settings*__ > __*Personal*__ > __*Security*__ > __*Devices & sessions*__ > __*Create new app password*__)
{% include integrations/config_flow.md %}
+
+## Sensors
+
+For each entry, the integration will create the following {% term sensors %}:
+
+| Sensor | Enabled by default |
+| ------ | ------------------ |
+| Amount of active users last 5 minutes | ✅ |
+| Amount of active users last day | ✅ |
+| Amount of active users last hour | ✅ |
+| Amount of files | ✅ |
+| Amount of group shares | ✅ |
+| Amount of link shares | ✅ |
+| Amount of local storages | ✅ |
+| Amount of mail shares | ✅ |
+| Amount of other storages | ✅ |
+| Amount of passwordless link shares | ✅ |
+| Amount of room shares | ✅ |
+| Amount of shares | ✅ |
+| Amount of shares received | ✅ |
+| Amount of shares sent | ✅ |
+| Amount of storages | ✅ |
+| Amount of storages at home | ✅ |
+| Amount of user | ✅ |
+| Amount of user shares | ✅ |
+| Apps installed | ✅ |
+| Avatars enabled | ✅ |
+| CPU load last 1 minute | ✅ |
+| CPU load last 15 minutes | ✅ |
+| CPU load last 5 minutes | ✅ |
+| Cache TTL | ❌ |
+| Cache expunges | ❌ |
+| Cache memory | ❌ |
+| Cache memory size | ✅ |
+| Cache number of entries | ❌ |
+| Cache number of hits | ❌ |
+| Cache number of inserts | ❌ |
+| Cache number of misses | ❌ |
+| Cache number of slots | ❌ |
+| Cache start time | ❌ |
+| Database size | ✅ |
+| Database type | ✅ |
+| Database version | ✅ |
+| Debug enabled | ✅ |
+| Filelocking enabled | ✅ |
+| Free memory | ✅ |
+| Free space | ✅ |
+| Free swap memory | ✅ |
+| Interned buffer size | ❌ |
+| Interned free memory | ❌ |
+| Interned number of strings | ❌ |
+| Interned used memory | ❌ |
+| JIT active | ❌ |
+| JIT buffer free | ❌ |
+| JIT buffer size | ❌ |
+| JIT enabled | ❌ |
+| JIT kind | ❌ |
+| JIT opt flags | ❌ |
+| JIT opt level | ❌ |
+| Opcache blacklist miss ratio | ❌ |
+| Opcache blacklist misses | ❌ |
+| Opcache cached keys | ❌ |
+| Opcache cached scripts | ❌ |
+| Opcache current wasted percentage | ❌ |
+| Opcache free memory | ❌ |
+| Opcache hash restarts | ❌ |
+| Opcache hit rate | ❌ |
+| Opcache hits | ❌ |
+| Opcache last restart time | ❌ |
+| Opcache manual restarts | ❌ |
+| Opcache max cached keys | ❌ |
+| Opcache misses | ❌ |
+| Opcache out of memory restarts | ❌ |
+| Opcache start time | ❌ |
+| Opcache used memory | ❌ |
+| Opcache wasted memory | ❌ |
+| PHP max execution time | ✅ |
+| PHP memory limit | ✅ |
+| PHP upload maximum filesize | ✅ |
+| PHP version | ✅ |
+| Previews enabled | ✅ |
+| SMA available memory | ❌ |
+| SMA number of segments | ❌ |
+| SMA segment size | ❌ |
+| System memcache distributed | ❌ |
+| System memcache local | ❌ |
+| System memcache locking | ❌ |
+| System theme | ✅ |
+| System version | ✅ |
+| Total memory | ✅ |
+| Total swap memory | ✅ |
+| Updates available | ✅ |
+| Webserver | ✅ |
+
+## Update entity
+
+An {% term update %} entity will be created for each entry.
diff --git a/source/_integrations/nina.markdown b/source/_integrations/nina.markdown
index c16fca961d9..062a6095f1d 100644
--- a/source/_integrations/nina.markdown
+++ b/source/_integrations/nina.markdown
@@ -72,3 +72,9 @@ Areas: `gemeinde oberreichenbach, gemeinde neuweiler, stadt nagold`
| `sent` | *(time)* Transmission time and date (UTC) of the issued warning. |
| `start` | *(time)* Starting time and date (UTC) of the issued warning. Can be empty. |
| `expires` | *(time)* Expiration time and date (UTC) of the issued warning. Can be empty. |
+
+## Removing the integration
+
+This integration follows standard integration removal. No extra steps are required.
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/nordpool.markdown b/source/_integrations/nordpool.markdown
index 067b90314b1..54424aaf9b5 100644
--- a/source/_integrations/nordpool.markdown
+++ b/source/_integrations/nordpool.markdown
@@ -164,6 +164,56 @@ data:
{% endraw %}
+### Get price indices for date
+
+The integration can also provide price indices for any date with published prices. Use the "Get price indices for date" action to retrieve pricing information with a custom resolution time.
+
+The areas, currency, and resolution parameters are optional. If omitted, the values configured in the integration will be used and for resolution it will default to 60 minutes.
+
+{% configuration_basic %}
+Nord Pool configuration entry:
+ description: Select the Nord Pool configuration entry to target.
+Date:
+ description: Pick the date to fetch prices for (see note about possible dates below).
+Areas:
+ description: Select one market area to create output for. If omitted it will use the areas from the configuration entry.
+Currency:
+ description: Currency to display prices in. EUR is the base currency in Nord Pool prices. If omitted, it will use the currency from the configuration entry.
+Resolution:
+ description: Resolution time for price indices.
+{% endconfiguration_basic %}
+
+{% note %}
+
+The public API only allows us to see past pricing information for up to 2 months.
+
+Although Nord Pool operates in the CET/CEST timezone, all data is returned in UTC. Depending on how the data is consumed or manipulated, you may need to consider this.
+
+Tomorrow's prices are typically released around 13:00 CET/CEST, and trying to get them before that time will generate an error that needs to be considered in such a case.
+
+{% endnote %}
+
+{% tip %}
+You can get your `config_entry` by using actions within the [developer tools](/docs/tools/dev-tools/): use one of the Nord Pool actions and view the YAML.
+{% endtip %}
+
+#### Example action with data
+
+{% raw %}
+
+```yaml
+action: nordpool.get_prices_for_date
+data:
+ config_entry: 1234567890a
+ date: "2024-11-10"
+ areas:
+ - SE3
+ - SE4
+ currency: SEK
+```
+
+{% endraw %}
+
## Examples
A template sensor to add VAT and fixed cost is useful to get the actual energy cost in the energy dashboard.
diff --git a/source/_integrations/notify.mqtt.markdown b/source/_integrations/notify.mqtt.markdown
index b13408aa52a..b9a6fe49f37 100644
--- a/source/_integrations/notify.mqtt.markdown
+++ b/source/_integrations/notify.mqtt.markdown
@@ -153,7 +153,7 @@ name:
type: string
default: MQTT notify
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
payload_available:
diff --git a/source/_integrations/ntfy.markdown b/source/_integrations/ntfy.markdown
index a57a0857a76..2f5ebcb4f9e 100644
--- a/source/_integrations/ntfy.markdown
+++ b/source/_integrations/ntfy.markdown
@@ -13,6 +13,7 @@ ha_integration_type: integration
ha_platforms:
- diagnostics
- notify
+ - sensor
ha_quality_scale: bronze
---
@@ -101,6 +102,48 @@ data:
{% enddetails %}
+## Sensors
+
+The **ntfy** integration adds a device representing the service, along with various sensors that display your usage statistics and current account limits.
+
+### 📊 Message stats
+
+- **Messages published**: The total number of messages sent today.
+- **Messages remaining**: The number of messages that can still be sent before the daily limit is reached.
+- **Messages usage limit**: The maximum number of messages allowed per day on the account.
+- **Messages expiry duration**: The duration for which published messages are cached before automatic deletion.
+
+### ✉️ Email stats
+
+- **Emails sent**: The number of email notifications sent today.
+- **Emails remaining**: The number of email notifications that can still be sent today.
+- **Email usage limit**: The daily limit for email notifications on the account.
+
+### 📞 Phone call stats
+
+- **Phone calls made**: The total phone call alerts made today.
+- **Phone calls remaining**: The number of phone call alerts that can still be made today.
+- **Phone calls usage limit**: The maximum number of phone call alerts allowed per day on the account.
+
+### 🔒 Reserved topics
+
+- **Reserved topics**: The number of reserved topics currently assigned to the account.
+- **Reserved topics remaining**: The number of topics that can still be reserved.
+- **Reserved topics limit**: The maximum number of reserved topics allowed for the account.
+
+### 📎 Attachment stats
+
+- **Attachment storage**: The amount of storage space currently used by file attachments.
+- **Attachment storage remaining**: The remaining storage capacity available for attachments.
+- **Attachment storage limit**: The total storage quota allocated for attachments.
+- **Attachment expiry duration**: The duration attachments are retained before being automatically deleted.
+- **Attachment file size limit**: The maximum allowed size for a single attachment file.
+- **Attachment bandwidth limit**: The daily bandwidth cap for uploading and downloading attachments.
+
+### ⭐ Account
+
+- **Subscription tier**: The subscription plan currently assigned to the ntfy account.
+
## Known limitations
**ntfy** imposes various rate and usage limits. The official [ntfy.sh](https://ntfy.sh/) service allows up to **60 messages in a burst**, with a **replenishment rate of one message every 5 seconds** (i.e., the full 60-message capacity refills in 5 minutes).
diff --git a/source/_integrations/number.markdown b/source/_integrations/number.markdown
index b0cfffc6d3e..4450b475058 100644
--- a/source/_integrations/number.markdown
+++ b/source/_integrations/number.markdown
@@ -39,6 +39,7 @@ In addition, the entity can have the following states:
The following device classes are supported for numbers:
- **None**: Generic number. This is the default and doesn't need to be set.
+- **absolute_humidity**: Absolute humidity in g/m³, mg/m³.
- **apparent_power**: Apparent power in VA.
- **aqi**: Air Quality Index (unitless).
- **area**: Area in m², cm², km², mm², in², ft², yd², mi², ac, ha
diff --git a/source/_integrations/number.mqtt.markdown b/source/_integrations/number.mqtt.markdown
index 8ae647a4b36..8ea4af3d968 100644
--- a/source/_integrations/number.mqtt.markdown
+++ b/source/_integrations/number.mqtt.markdown
@@ -165,7 +165,7 @@ name:
required: false
type: string
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/octoprint.markdown b/source/_integrations/octoprint.markdown
index 03893304c7c..96906f2c5dd 100644
--- a/source/_integrations/octoprint.markdown
+++ b/source/_integrations/octoprint.markdown
@@ -61,10 +61,16 @@ The OctoPrint integration lets you monitor various states of your 3D printer and
Supported sensors:
+- Actual Bed Temperature
+- Actual Tool (Nozzle) Temperature
- Current Printer State
-- Job Completed Percentage
- Estimated Finish Time
+- Job Completed Percentage
- Estimated Start Time
+- Target Bed Temperature
+- Target Tool (Nozzle) Temperature
+- Current File Name
+- Current File Size
## Camera
@@ -75,11 +81,11 @@ The OctoPrint integration provides a camera feed if one is configured in OctoPri
The OctoPrint integration provides the following buttons:
- Pause Job
-- Resume Job
-- Stop Job
-- Shutdown System
- Reboot System
- Restart Octoprint
+- Resume Job
+- Shutdown System
+- Stop Job
## Troubleshooting
diff --git a/source/_integrations/onkyo.markdown b/source/_integrations/onkyo.markdown
index 600cae4a25a..7726c370804 100644
--- a/source/_integrations/onkyo.markdown
+++ b/source/_integrations/onkyo.markdown
@@ -107,6 +107,12 @@ script:
Network receivers from Onkyo and Integra are supported starting with models from the year 2011. Pioneer network receivers are supported starting with models from 2016.
+## Troubleshooting
+
+### No entities created
+
+Restart your receiver (power cycle).
+
## Removing the integration
This integration follows standard integration removal. No extra steps are required.
diff --git a/source/_integrations/open_router.markdown b/source/_integrations/open_router.markdown
new file mode 100644
index 00000000000..612c89d4597
--- /dev/null
+++ b/source/_integrations/open_router.markdown
@@ -0,0 +1,37 @@
+---
+title: OpenRouter
+description: Instructions on how to integrate OpenRouter as a conversation agent
+ha_category:
+ - Voice
+ha_release: 2025.8
+ha_iot_class: Cloud Polling
+ha_config_flow: true
+ha_codeowners:
+ - '@joostlek'
+ha_domain: open_router
+ha_integration_type: service
+ha_platforms:
+ - conversation
+---
+
+The [OpenRouter](https://openrouter.ai/) {% term integration %} allows you to use the OpenRouter API as a conversation agent in Home Assistant.
+
+This integration provides a way to interact with a wide range of AI models available on OpenRouter, while billing is handled by OpenRouter.
+You can even use your own third-party (like OpenAI) API key.
+
+{% include integrations/config_flow.md %}
+
+## Generate an API Key
+
+The API key is used to authenticate requests to OpenRouter. To generate an API key take the following steps:
+
+- Log in to [OpenRouter](https://openrouter.ai/) or sign up for an account.
+- Go to the **API Keys** section in your account settings.
+- To generate a new key, select **Create API Key**.
+- Give the key a name, and be sure to set up billing limits.
+
+## Removing the integration
+
+This integration follows standard integration removal, no extra steps are required.
+
+{% include integrations/remove_device_service.md %}
\ No newline at end of file
diff --git a/source/_integrations/openweathermap.markdown b/source/_integrations/openweathermap.markdown
index c0601e360c3..3c200ef1497 100644
--- a/source/_integrations/openweathermap.markdown
+++ b/source/_integrations/openweathermap.markdown
@@ -11,6 +11,7 @@ ha_codeowners:
- '@fabaff'
- '@freekode'
- '@nzapponi'
+ - '@wittypluck'
ha_domain: openweathermap
ha_platforms:
- sensor
diff --git a/source/_integrations/opower.markdown b/source/_integrations/opower.markdown
index 88ad1f4c4c6..3f2a9779b7d 100644
--- a/source/_integrations/opower.markdown
+++ b/source/_integrations/opower.markdown
@@ -50,6 +50,7 @@ More than 175 utilities use Opower. Currently only the following utilities are s
- National Grid NY Metro
- National Grid NY Upstate
- Pacific Gas & Electric (PG&E)
+ > **Note:** Currently only works with PG&E accounts created **before June 2025** that do not require multi-factor authentication (MFA).
- Portland General Electric (PGE)
- Puget Sound Energy (PSE)
- Sacramento Municipal Utility District (SMUD)
diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown
index 321348d2695..8981d2bd3a9 100644
--- a/source/_integrations/overkiz.markdown
+++ b/source/_integrations/overkiz.markdown
@@ -105,7 +105,7 @@ Even though most Overkiz hubs support adding Zigbee, Z-Wave, Hue, and Sonos devi
### Stateless RTS covers
-RTS covers do not report their state back to the hub, so Home Assistant cannot track their state after they are controlled. If you only control your RTS cover from Home Assistant, you can use the [template cover](/integrations/cover.template/) to create a stateful cover entity. This will help you track the current state (open or closed) and use the cover in automations and scenes.
+RTS covers do not report their state back to the hub, so Home Assistant cannot track their state after they are controlled. If you only control your RTS cover from Home Assistant, you can use the [template cover](/integrations/template/#cover) to create a stateful cover entity. This will help you track the current state (open or closed) and use the cover in automations and scenes.
```yaml
cover:
diff --git a/source/_integrations/paperless_ngx.markdown b/source/_integrations/paperless_ngx.markdown
index bedd76f3d71..ab10ea8274c 100644
--- a/source/_integrations/paperless_ngx.markdown
+++ b/source/_integrations/paperless_ngx.markdown
@@ -15,6 +15,10 @@ ha_quality_scale: silver
related:
- url: https://docs.paperless-ngx.com/
title: Paperless-ngx
+ha_platforms:
+ - diagnostics
+ - sensor
+ - update
---
The **Paperless-ngx** {% term integration %} allows you to connect your [Paperless-ngx](https://docs.paperless-ngx.com/) instance to Home Assistant and monitor its status and activity.
@@ -46,6 +50,8 @@ URL:
description: "URL to connect to the Paperless-ngx instance."
API key:
description: "API key to connect to the Paperless-ngx API."
+Verify SSL certificate:
+ description: "Verify the SSL certificate of the Paperless-ngx instance. Disable this option if you're using a self-signed certificate."
{% endconfiguration_basic %}
## Sensors
diff --git a/source/_integrations/pi_hole.markdown b/source/_integrations/pi_hole.markdown
index 1c1df4dfbc3..2e20f676f72 100644
--- a/source/_integrations/pi_hole.markdown
+++ b/source/_integrations/pi_hole.markdown
@@ -30,14 +30,19 @@ During the setup, it will ask for the following:
| Item | Description | Example |
| ---- | ----------- | ------- |
-| `Host` | The IP or domain name to Pi-Hole | 192.168.1.1 |
-| `Port` | Port used to get to the admin page | 80 |
+| `Host` | The IP or domain name to Pi-Hole. | 192.168.1.1 |
+| `Port` | Port used to get to the admin page, typically `80` for `http` connections and `443` for `https` connections. | 80 |
| `Name` | Name to for this Pi-Hole. | Pi-Hole |
-| `Location` | the path to the admin page. | /admin |
+| `Location` | the path to the admin page. In the version 6 API this will be ignored. | /admin |
+| `API Key or App Password` | This can be found in your Pi-hole's **Settings** > **API (expert mode)**. | `585a2fe...` |
+| `Uses an SSL certificate` | Whether your Pi-hole has an Certificate, typically true for `https` connections and false for `http`. | {% icon "openmoji:check-mark" %} |
+| `Verify SSL certificate` | Whether to use verify your Pi-hole's certificate, ignored in Pi-hole API version 5. | {% icon "openmoji:check-mark" %} |
The combined host, port and location should take you to the login page of Pi-Hole. Using the example above, it would be `http://192.168.1.1:80/admin`.
-If your Pi-hole web interface is password protected, an API key will be requested by Home Assistant after submitting the initial details above. You can get the API key by logging into your Pi-Hole and going to _from Settings > API_ and then the **Show API token** button.
+To find your App Password, log into your Pi-Hole and go to **Settings** > **Web Interface/API**. Switch from **Basic** to **Expert** mode, then select **Configure app password**.
+
+Versions of Pi-hole before version 6 (released in Feb 2025) use an API Key if the Pi-hole was password protected, this can be found in _Settings > API Tab_ and clicking **Show API token**
## Actions
@@ -49,8 +54,8 @@ Disables configured Pi-hole(s) for the specified amount of time.
| Data attribute | Required | Type | Description |
| ---------------------- | -------- | -------- | ----------- |
-| `entity_id` | `False` | string | Target switch entity. Use `all` to target all Pi-hole services |
-| `duration` | `True` | timedelta | Time for which Pi-hole should be disabled |
+| `entity_id` | `False` | string | Target switch entity. Use `all` to target all Pi-hole services. |
+| `duration` | `True` | timedelta | Time for which Pi-hole should be disabled. `'0'` will enable blocking indefinitely. |
Example action:
diff --git a/source/_integrations/pitsos.markdown b/source/_integrations/pitsos.markdown
index dd984659c10..750f2eb91f6 100644
--- a/source/_integrations/pitsos.markdown
+++ b/source/_integrations/pitsos.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/playstation_network.markdown b/source/_integrations/playstation_network.markdown
new file mode 100644
index 00000000000..73ca4977ee1
--- /dev/null
+++ b/source/_integrations/playstation_network.markdown
@@ -0,0 +1,120 @@
+---
+title: PlayStation Network
+description: Instructions on enabling PlayStation Network support for your Home Assistant
+ha_category:
+ - Binary sensor
+ - Media player
+ - Sensor
+ha_release: 2025.7
+ha_iot_class: Cloud Polling
+ha_domain: playstation_network
+ha_platforms:
+ - binary_sensor
+ - diagnostics
+ - media_player
+ - sensor
+ha_codeowners:
+ - '@jackjpowell'
+ - '@tr4nt0r'
+ha_config_flow: true
+ha_quality_scale: bronze
+ha_integration_type: service
+related:
+ - url: https://playstation.com/
+ title: Playstation
+ha_dhcp: true
+---
+
+The **PlayStation Network** {% term integration %} enables you to seamlessly integrate information from your currently playing game in Home Assistant.
+
+## About PlayStation Network
+
+PlayStation Network (PSN) is a digital media entertainment service provided by [Sony Interactive Entertainment](https://en.wikipedia.org/wiki/Sony_Interactive_Entertainment). It allows users to enjoy a variety of gaming-related services such as purchasing games, downloading content, and connecting with other players.
+
+## How you can use this integration
+
+The **PlayStation Network** {% term integration %} lets you integrate information about your currently playing game into Home Assistant. You can display the game title and cover art in your Home Assistant dashboards.
+
+## Prerequisites
+
+- To set up the PlayStation Network integration, you must first have an active PlayStation Network account. You can register for an account at the [Official PlayStation® Site](https://playstation.com/).
+- During the setup process in Home Assistant, you will be asked to provide your NPSSO token. You will need to be logged into [playstation.com](https://playstation.com/) to access the token in your browser. You will find a link to retrieve the token in the config flow.
+
+{% include integrations/config_flow.md %}
+
+### Login to PlayStation Network
+
+{% configuration_basic %}
+"NPSSO Token":
+ description: "Supply your NPSSO token after successfully logging into the PlayStationNetwork in your browser."
+ required: true
+ type: string
+{% endconfiguration_basic %}
+
+## Supported functionality
+
+### Media players
+
+- **PlayStation Console**: One Media Player will be created for any [supported PlayStation console](#supported-devices) you have connected to the PlayStation Network. The artwork and title of the currently playing game will be populated.
+
+### Sensors
+
+- **Online-ID**: Shows your PlayStation Network ID and current profile picture.
+- **Trophy level**: Displays your current PlayStation trophy level.
+- **Next Level**: Shows your progress toward the next PlayStation trophy level as a percentage.
+- **Platinum trophies**: Shows the total number of Platinum trophies you’ve earned. These are awarded for unlocking all other trophies in a game.
+- **Gold trophies**: Displays your total count of Gold trophies, earned for major achievements within games.
+- **Silver trophies**: Indicates the number of Silver trophies you've collected, typically for mid-level accomplishments.
+- **Bronze trophies**: Shows how many Bronze trophies you've earned, usually for basic or early-game achievements.
+- **Last online**: Displays the time when you were last seen online.
+- **Online status**: Indicates your current availability on the PlayStation Network. Status options include *Online*, *Offline*, *Away*, and *Online on PS App*.
+
+### Binary sensors
+
+- **Subscribed to PlayStation Plus**: Indicates if you have an active PlayStation Plus membership.
+
+### Image
+
+- **Avatar**: Displays your current avatar.
+- **Share profile**: Generates a QR code with a shareable link to your profile.
+
+## Data updates
+
+This integration retrieves data from the PlayStation Network every 30 seconds to ensure timely updates.
+
+## Known limitations
+
+PlayStation Network imposes a rate limit of 300 requests per 15 minutes.
+
+This integration makes 3 requests per data update (every 30 seconds). This presently is well under the rate limit, but leaves room to add additional requests as the integration develops.
+
+Please keep these limits in mind to avoid exceeding the PlayStation Network request allowance.
+
+The Active state for each device is only reported via the API for the last used device. For example, if you start playing a game on your PS4 and without powering down, launch a game on your PS5, the API will only report your PS5 status.
+
+## Supported devices
+
+The following devices are known to be supported by the integration:
+
+- PlayStation 5
+- PlayStation 4
+- PlayStation 3
+- PlayStation Vita
+- PlayStation PC
+
+## Unsupported devices
+
+The following devices are not supported by the integration:
+
+- PlayStation Portable
+- Other PlayStation system variants (PlayStation TV) or older systems that do not support the PlayStation Network
+
+## Use cases
+
+You can display your currently playing game as artwork on your dashboard.
+
+## Remove integration
+
+This integration can be removed by following these steps:
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/powerfox.markdown b/source/_integrations/powerfox.markdown
index 5f3cbe96620..13a2e69d046 100644
--- a/source/_integrations/powerfox.markdown
+++ b/source/_integrations/powerfox.markdown
@@ -48,7 +48,7 @@ Not all Poweropti devices are supported currently. Check the list below to see i
## Data updates
The integration will update its information by polling Powerfox every
-minute. This ensures the data in Home Assistant is up to date.
+10 seconds. This ensures the data in Home Assistant is up to date.
## Actions
diff --git a/source/_integrations/probe_plus.markdown b/source/_integrations/probe_plus.markdown
index 784c811ff3f..ca3fec49afb 100644
--- a/source/_integrations/probe_plus.markdown
+++ b/source/_integrations/probe_plus.markdown
@@ -4,7 +4,7 @@ description: Instructions on how to integrate Probe Plus food temperature probes
ha_release: 2025.6
ha_category:
- Sensor
-ha_iot_class: local_push
+ha_iot_class: Local Push
ha_config_flow: true
ha_domain: probe_plus
ha_platforms:
diff --git a/source/_integrations/profilo.markdown b/source/_integrations/profilo.markdown
index 0caa7b2898c..478034af125 100644
--- a/source/_integrations/profilo.markdown
+++ b/source/_integrations/profilo.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/qbus.markdown b/source/_integrations/qbus.markdown
index 4fbd89608c7..e56314e01b1 100644
--- a/source/_integrations/qbus.markdown
+++ b/source/_integrations/qbus.markdown
@@ -3,11 +3,14 @@ title: Qbus
description: Instructions on how to integrate your Qbus installation with Home Assistant.
ha_category:
- Climate
+ - Cover
+ - Hub
- Light
- Scene
- Switch
ha_platforms:
- climate
+ - cover
- light
- scene
- switch
@@ -45,10 +48,11 @@ There is currently support for the following **Qbus** products within Home Assis
## Available entities
-- **Climate**: manages thermostats by setting temperature and choosing presets.
-- **Light**: controls dimmer lights, allowing both on/off functionality and brightness adjustment.
-- **Scene**: activates predefined scenes.
-- **Switch**: toggles on/off outputs.
+- **Climate**: manage thermostats by setting temperature and choosing presets.
+- **Cover**: operate covers with support for actions like open, close, stop, position adjustment, and tilt — depending on your setup.
+- **Light**: control dimmer lights, allowing both on/off functionality and brightness adjustment.
+- **Scene**: activate predefined scenes.
+- **Switch**: toggle on/off outputs.
## Removing the integration
diff --git a/source/_integrations/recorder.markdown b/source/_integrations/recorder.markdown
index 95dca003352..cd6700f640a 100644
--- a/source/_integrations/recorder.markdown
+++ b/source/_integrations/recorder.markdown
@@ -253,6 +253,43 @@ Perform the action `recorder.disable` to stop saving events and states to the da
Perform the action `recorder.enable` to start again saving events and states to the database. This is the opposite of `recorder.disable`.
+### Action `get_statistics`
+
+Perform the action `recorder.get_statistics` to retrieve statistics for one or more entities from the recorder database. This action is useful for automations or scripts that need to access historical statistics, such as mean, min, max, or sum values, for supported entities like sensors.
+
+{% note %}
+Statistics are only available for entities that store [Long-term Statistics](https://developers.home-assistant.io/docs/core/entity/sensor/#long-term-statistics). More details can be found in the [2021.8.0 release notes](/blog/2021/08/04/release-20218/#long-term-statistics).
+{% endnote %}
+
+| Data attribute | Optional | Description |
+| -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `statistic_ids`| no | The entity IDs or statistic IDs to get statistics for. |
+| `start_time` | no | The start time for the statistics query. |
+| `end_time` | yes | The end time for the statistics query. If omitted, returns all statistics from start time onward. |
+| `period` | no | The time period to group statistics by (`5minute`, `hour`, `day`, `week`, or `month`). |
+| `types` | no | The types of statistics values to return (`change`, `last_reset`, `max`, `mean`, `min`, `state`, or `sum`). |
+| `units` | yes | Optional unit conversion mapping. An object where keys are [device classes](https://www.home-assistant.io/integrations/sensor#device-class) and values are the desired target units. This allows retrieving statistics converted to different units than what's stored in the database. |
+
+#### Example using get_statistics
+
+```yaml
+action: recorder.get_statistics
+data:
+ statistic_ids:
+ - sensor.energy_meter
+ - sensor.water_usage
+ start_time: "2025-06-10 00:00:00"
+ end_time: "2025-06-11 23:00:00"
+ period: hour
+ types:
+ - sum
+ - mean
+ units:
+ energy: kWh
+ volume: L
+response_variable: consumption_stats
+```
+
## Handling disk corruption and hardware failures
When using SQLite, if the system encounters unrecoverable disk corruption, it will move the database aside and create a new database to keep the system online. In this case, having at least 2.5x the database size available in free disk space is essential. Starting a new database is the system's last resort recovery option and is usually caused by failing flash storage, an inadequate power supply, an unclean shutdown, or another hardware failure.
diff --git a/source/_integrations/rehlko.markdown b/source/_integrations/rehlko.markdown
index 4f57fccf127..f9fe3e427e0 100644
--- a/source/_integrations/rehlko.markdown
+++ b/source/_integrations/rehlko.markdown
@@ -12,6 +12,7 @@ ha_codeowners:
ha_dhcp: true
ha_domain: rehlko
ha_platforms:
+ - binary_sensor
- sensor
ha_integration_type: integration
ha_quality_scale: silver
@@ -104,6 +105,7 @@ These are the generator models that have been tested:
- [20RESA](https://resources.kohler.com/power/kohler/residential/pdf/tp6804.pdf)
- [20RCA](https://www.kohlerhomeenergy.rehlko.com/products/home+generators/20rca)
- [14RESA](https://www.kohler.com/content/dam/kohler-com-NA/Lifestyle/PDF/PDF-tp6803.pdf)
+- [30RCL](https://www.kohlerhomeenergy.rehlko.com/products/home+generators/30rcla)
## Removing the integration
diff --git a/source/_integrations/remote_calendar.markdown b/source/_integrations/remote_calendar.markdown
index ca1069d31fa..00c7fa9308a 100644
--- a/source/_integrations/remote_calendar.markdown
+++ b/source/_integrations/remote_calendar.markdown
@@ -12,6 +12,7 @@ ha_platforms:
- diagnostics
ha_codeowners:
- '@Thomas55555'
+ - '@allenporter'
ha_integration_type: service
ha_quality_scale: silver
---
@@ -20,7 +21,7 @@ The **Remote calendar** {% term integration %} allows you to read a calendar in
## Known limitations
-The integration does not provide the ability to connect to an resource that requires authentication or special headers.
+The integration does not provide the ability to connect to a resource that requires authentication or special headers.
## Installation instructions
diff --git a/source/_integrations/reolink.markdown b/source/_integrations/reolink.markdown
index b26b819bc99..8afca40e0e4 100644
--- a/source/_integrations/reolink.markdown
+++ b/source/_integrations/reolink.markdown
@@ -72,6 +72,13 @@ If an entity listed below has an asterisk (*) next to its name, it means it is d
If an entity listed below has a plus (+) next to its name, it means this entity supports push updates. These entities will have almost instant state changes.
For redundancy, the state of all entities is also polled every 60 seconds. For entities without a plus (+), this is the only update method. Therefore, a device's state change can take up to 60 seconds to be reflected in Home Assistant.
An exception is the firmware update entity, which is polled every 12 hours.
+Another exception are battery cameras, most {% term entities %} are still {% term polling polls %} every 60 seconds. However, the entities that would cause the camera to wake from sleep will only be polled during the following events:
+
+- The camera wakes by itself (PIR event) and the last update was more than 1 hour ago.
+- The camera did not wake for more than 6 hours.
+- All battery cameras have not been awake at the same time for more than 12 hours.
+
+A full update of all entities, which will wake all battery cameras connected to the same hub/NVR, can be performed by calling the `homeassistant.update_entity` action on a single Reolink entity of a camera (for example the motion detection binary sensor).
## Supported functionality
@@ -128,7 +135,8 @@ Depending on the supported features of the camera, number entities are added for
- Optical zoom control
- Focus control
-- Floodlight turn on brightness
+- Floodlight turn on brightness+
+- Infrared light brightness
- Volume (Camera)
- Alarm volume (Home Hub)
- Message volume (Home Hub)
@@ -157,6 +165,7 @@ Depending on the supported features of the camera, number entities are added for
- AI linger delay+ (up to 3 zones)
- AI item forgotten delay+ (up to 3 zones)
- AI item taken delay+ (up to 3 zones)
+- Baby cry sensitivity
- Auto quick reply time
- Auto track limit left
- Auto track limit right
@@ -233,6 +242,7 @@ Depending on the supported features of the camera, select entities are added for
- Hub visitor ringtone
- Hub scene mode (Off, Disarmed, Home, Away)
- Recording packing time
+- Post-recording time
**PTZ preset** positions can be set in the Reolink app/windows/web client, the names of the presets will be loaded into Home Assistant at the start of the integration. When adding new preset positions, please restart the Reolink integration.
@@ -271,6 +281,7 @@ Depending on the supported features of the camera, switch entities are added for
- Record
- Manual record+
- Privacy mode+
+- Privacy mask
- Push notifications
- Hub ringtone on event
- Email on event
@@ -282,6 +293,8 @@ Depending on the supported features of the camera, switch entities are added for
When the **Privacy mode** is ON, almost all other entities will be unavailable because the camera shuts down the API and camera streams. When turning OFF the **Privacy mode**, all entities will become available again. Take this into consideration when making automations; ensure the **Privacy mode** is OFF before changing camera settings using other entities.
+The **Privacy mask** switch will only be added when the privacy mask is configured in the Reolink app/client under **settings** (gear icon) > **Display** > **Privacy Mask**. After adding the privacy mask, the reolink integration in Home Assistant needs to be reloaded for the **Privacy mask** switch to show up.
+
When the **Infrared lights in night mode** entity is set to OFF, the infrared LEDs are always OFF. When the **Infrared lights in night mode** entity is set to ON, the infrared LEDs will be on when the camera is in night vision mode. For more information, see the **Day night mode** select entity.
For NVRs, a global switch for **Record**, **Push**, **Hub ringtone on event**, **Email**, and **FTP** will be available under the NVR device as well as a switch per channel of the NVR under the camera device. The respective feature will only be active for a given channel if both the global and that channel switch are enabled (as is also the case in the Reolink app/client).
@@ -389,6 +402,7 @@ The following models have been tested and confirmed to work with a direct link t
- [Reolink Duo 2 WiFi](https://reolink.com/product/reolink-duo-wifi/)
- **[Reolink Duo 3 PoE](https://reolink.com/product/reolink-duo-3-poe/)**
- Reolink Duo Floodlight ([PoE](https://reolink.com/product/reolink-duo-floodlight-poe/) and [Wi-Fi](https://reolink.com/product/reolink-duo-floodlight-wifi/))
+- [Reolink Floodlight PoE and Wi-Fi*](https://reolink.com/product/reolink-floodlight/)
- [Reolink Home Hub](https://reolink.com/product/reolink-home-hub/)
- [Reolink Home Hub Pro](https://reolink.com/product/reolink-home-hub-pro/)
- **[Reolink TrackMix PoE](https://reolink.com/product/reolink-trackmix-poe/)**
diff --git a/source/_integrations/rest_command.markdown b/source/_integrations/rest_command.markdown
index 7b9ba7bec03..ed207a711ff 100644
--- a/source/_integrations/rest_command.markdown
+++ b/source/_integrations/rest_command.markdown
@@ -100,7 +100,8 @@ rest_command:
### Using REST command Response in automations
-REST commands provide an action response in a dictionary containing `status` (containing the HTTP response code) and `content` containing the response body as text or JSON. This response can be accessed in automations using [`response_variable`](/docs/scripts/perform-actions#use-templates-to-handle-response-data).
+REST commands provide an action response in a dictionary containing `status` (containing the HTTP response code), `content` containing the response body as text or JSON and `headers` containing the response headers.
+This response can be accessed in automations using [`response_variable`](/docs/scripts/perform-actions#use-templates-to-handle-response-data).
The following example shows how the REST command response may be used in automations. In this case, checking the [Traefik API](https://doc.traefik.io/traefik/operations/api/) for errors.
diff --git a/source/_integrations/russound_rio.markdown b/source/_integrations/russound_rio.markdown
index dfe280966f8..1041f6f6db0 100644
--- a/source/_integrations/russound_rio.markdown
+++ b/source/_integrations/russound_rio.markdown
@@ -9,6 +9,8 @@ ha_domain: russound_rio
ha_platforms:
- diagnostics
- media_player
+ - number
+ - switch
ha_codeowners:
- '@noahhusby'
ha_config_flow: true
@@ -27,6 +29,7 @@ This integration allows you to connect the following controllers:
- Russound MBX-PRE
- Russound MBX-AMP
+- Russound ACA-E5
- Russound MCA-C3
- Russound MCA-C5
- Russound MCA-66
@@ -56,6 +59,54 @@ This integration follows standard integration removal. No extra steps are requir
{% include integrations/remove_device_service.md %}
+## Available configuration entities
+
+The integration provides a few entities to configure the device settings. The following entities are supported:
+
+- Bass and Treble
+- Balance
+- Loudness
+- Turn on volume
+
+## Playing media
+
+Russound RIO supports recalling AM/FM and Sirius XM presets using the `media_player.play_media` action.
+
+### Examples:
+
+Russound RIO can recall any stored presets saved on the device for a given source. The preset ID can be between 1-36. Some devices may display presets within banks of six presets total. The preset ID can be calculated by combining the current bank and preset. An example action using a preset for Bank 1, Preset 1:
+
+```yaml
+action: media_player.play_media
+target:
+ entity_id: media_player.russound_deck
+data:
+ media_content_type: "preset"
+ media_content_id: "1"
+```
+
+An example action using a preset for Bank 2, Preset 1:
+
+```yaml
+action: media_player.play_media
+target:
+ entity_id: media_player.russound_deck
+data:
+ media_content_type: "preset"
+ media_content_id: "7"
+```
+
+
+The action will only impact the current source for a zone. If you want to recall a preset on a specific source, you can use the format `source_id,preset_id`. For example, if you want to recall Bank 2, Preset 2 using Source 1:
+```yaml
+action: media_player.play_media
+target:
+ entity_id: media_player.russound_deck
+data:
+ media_content_type: "preset"
+ media_content_id: "1,8"
+```
+
## Troubleshooting
### There is a delay on getting the current status
diff --git a/source/_integrations/russound_rnet.markdown b/source/_integrations/russound_rnet.markdown
index 1030d639a95..4f7828622d0 100644
--- a/source/_integrations/russound_rnet.markdown
+++ b/source/_integrations/russound_rnet.markdown
@@ -27,7 +27,6 @@ Connecting to the Russound device is only possible by TCP, you can make use of a
This integration allows you to connect the following controllers:
-- Russound ACA-E5
- Russound CAS44
- Russound CAA66
- Russound CAM6.6
diff --git a/source/_integrations/samsungtv.markdown b/source/_integrations/samsungtv.markdown
index 4d6d794a9bc..ad0b54aa835 100644
--- a/source/_integrations/samsungtv.markdown
+++ b/source/_integrations/samsungtv.markdown
@@ -19,6 +19,7 @@ ha_platforms:
ha_zeroconf: true
ha_dhcp: true
ha_integration_type: device
+ha_quality_scale: bronze
---
The `samsungtv` platform allows you to control a [Samsung Smart TV](https://www.samsung.com/uk/tvs/all-tvs/).
diff --git a/source/_integrations/scene.mqtt.markdown b/source/_integrations/scene.mqtt.markdown
index ea0b9f5560f..994757ed404 100644
--- a/source/_integrations/scene.mqtt.markdown
+++ b/source/_integrations/scene.mqtt.markdown
@@ -151,7 +151,7 @@ name:
type: string
default: MQTT Scene
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
payload_available:
diff --git a/source/_integrations/scrape.markdown b/source/_integrations/scrape.markdown
index 3d19471847e..068341e29b0 100644
--- a/source/_integrations/scrape.markdown
+++ b/source/_integrations/scrape.markdown
@@ -18,12 +18,23 @@ related:
title: Configuration file
---
-The `scrape` sensor {% term integration %} scrapes information from websites. The sensor loads an HTML page, and allows you to search and extract specific values. As this is not a fully featured web scraper like [scrapy](https://scrapy.org/), it will work with simple web pages and it can be time-consuming to get the right section.
+The **Scrape** sensor {% term integration %} scrapes information from websites. The sensor loads an HTML page, and allows you to search and extract specific values. As this is not a fully featured web scraper like [scrapy](https://scrapy.org/), it will work with simple web pages and it can be time-consuming to get the right section.
-Both UI and YAML setup is supported while YAML provides additional configuration possibilities.
+Both UI and [YAML setup](#yaml-configuration) is supported while YAML provides additional configuration possibilities.
{% include integrations/config_flow.md %}
+{% note %}
+
+Scrape uses configuration subentries for configuring the sensors.
+
+1. Setup the resource configuration once per resource you want to scrape information from.
+2. Create one or multiple configuration subentries per sensor you want to create by scraping the website.
+
+{% endnote %}
+
+## YAML Configuration
+
To enable this {% term integration %} using YAML, add the following lines to your {% term "`configuration.yaml`" %} file.
{% include integrations/restart_ha_after_config_inclusion.md %}
@@ -54,6 +65,10 @@ payload:
description: The payload to send with a POST request. Depends on the service, but usually formed as JSON.
required: false
type: string
+payload_template:
+ description: The payload to send with a POST request with template support.
+ required: false
+ type: template
verify_ssl:
description: Verify the SSL certificate of the endpoint.
required: false
diff --git a/source/_integrations/select.mqtt.markdown b/source/_integrations/select.mqtt.markdown
index 68af312e19c..2a3e4efd676 100644
--- a/source/_integrations/select.mqtt.markdown
+++ b/source/_integrations/select.mqtt.markdown
@@ -158,7 +158,7 @@ name:
required: false
type: string
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/sensor.markdown b/source/_integrations/sensor.markdown
index 7719f165edd..45c41495169 100644
--- a/source/_integrations/sensor.markdown
+++ b/source/_integrations/sensor.markdown
@@ -48,6 +48,7 @@ Example of various device class icons for sensors.
The following device classes are supported for sensors:
- **None**: Generic sensor. This is the default and doesn't need to be set.
+- **absolute_humidity**: Absolute humidity in g/m³, mg/m³.
- **apparent_power**: Apparent power in VA.
- **aqi**: Air Quality Index (unitless).
- **area**: Area in m², cm², km², mm², in², ft², yd², mi², ac, ha
diff --git a/source/_integrations/sensor.mqtt.markdown b/source/_integrations/sensor.mqtt.markdown
index e2d4639f77d..d7408027c20 100644
--- a/source/_integrations/sensor.mqtt.markdown
+++ b/source/_integrations/sensor.mqtt.markdown
@@ -166,7 +166,7 @@ name:
type: string
default: MQTT Sensor
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
options:
diff --git a/source/_integrations/sensor.rest.markdown b/source/_integrations/sensor.rest.markdown
index 51b8b4fb04f..db1d6151b83 100644
--- a/source/_integrations/sensor.rest.markdown
+++ b/source/_integrations/sensor.rest.markdown
@@ -314,7 +314,7 @@ rest:
{% endraw %}
-[JSONPlaceholder](https://jsonplaceholder.typicode.com/) provides sample JSON data for testing. In the below example, JSONPath locates the attributes in the JSON document. [JSONPath Online Evaluator](https://jsonpath.com/) provides a tool to test your JSONPath. If the endpoint returns XML, it will be converted to JSON using `xmltodict` before searching for attributes. You may find the [XMLtoDict debug tool](https://xmltodict-debugger.glitch.me/) helpful for testing how your XML converts to JSON.
+[JSONPlaceholder](https://jsonplaceholder.typicode.com/) provides sample JSON data for testing. In the below example, JSONPath locates the attributes in the JSON document. [JSONPath Online Evaluator](https://jsonpath.com/) provides a tool to test your JSONPath. If the endpoint returns XML, it will be converted to JSON using `xmltodict` before searching for attributes. You may find this [XML to JSON Converter](https://www.freeformatter.com/xml-to-json-converter.html) helpful for testing how your XML converts to JSON.
{% raw %}
diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown
index 6fc908c3505..74ddcd28cc3 100644
--- a/source/_integrations/shelly.markdown
+++ b/source/_integrations/shelly.markdown
@@ -43,6 +43,7 @@ ha_platforms:
- update
- valve
ha_integration_type: device
+ha_quality_scale: silver
---
Integrate [Shelly devices](https://shelly.com) into Home Assistant.
diff --git a/source/_integrations/shelly_zwave.markdown b/source/_integrations/shelly_zwave.markdown
index 87014a9d4c8..041c35bec32 100644
--- a/source/_integrations/shelly_zwave.markdown
+++ b/source/_integrations/shelly_zwave.markdown
@@ -9,8 +9,6 @@ ha_category:
- Plug
ha_domain: shelly
ha_integration_type: brand
-works_with:
- - zwave
ha_platforms:
- binary_sensor
- sensor
@@ -19,9 +17,7 @@ ha_iot_standard: zwave
ha_brand: true
---
-[Shelly](https://shelly.com) is a member of the Works with Home Assistant partner program for their Z-Wave products. Shelly is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Shelly Z-Wave devices work locally and integrate seamlessly with the Z-Wave integration in Home Assistant (Z-Wave stick required). As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
+[Shelly](https://shelly.com) Z-Wave devices work locally and integrate seamlessly with the Z-Wave integration in Home Assistant (Z-Wave stick required). As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
{% my add_zwave_device badge domain=page.ha_domain %}
diff --git a/source/_integrations/siemens.markdown b/source/_integrations/siemens.markdown
index 99802d877c2..2d742d70e30 100644
--- a/source/_integrations/siemens.markdown
+++ b/source/_integrations/siemens.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/siren.mqtt.markdown b/source/_integrations/siren.mqtt.markdown
index 730e2b5dead..c03b92b604c 100644
--- a/source/_integrations/siren.mqtt.markdown
+++ b/source/_integrations/siren.mqtt.markdown
@@ -170,7 +170,7 @@ name:
type: string
default: MQTT Siren
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/sleepiq.markdown b/source/_integrations/sleepiq.markdown
index 9438b2cd7dc..ba1b52723fe 100644
--- a/source/_integrations/sleepiq.markdown
+++ b/source/_integrations/sleepiq.markdown
@@ -49,6 +49,7 @@ There is currently support available for the following platforms within Home Ass
- Number - View/Set firmness for each side
- Select - Choose a foundation preset position
- Select/Number - Set a foot warmer mode and timeout
+- Select/Number - Set core climate heat/cool modes and timeout
- Sensor - View pressure of each side
- Switch - Toggle Privacy mode
diff --git a/source/_integrations/smhi.markdown b/source/_integrations/smhi.markdown
index 7d2b23fd2ae..bdaf7e4d4ab 100644
--- a/source/_integrations/smhi.markdown
+++ b/source/_integrations/smhi.markdown
@@ -3,6 +3,7 @@ title: SMHI
description: Instructions on how to integrate SMHI forecasts within Home Assistant.
ha_category:
- Hub
+ - Sensor
- Weather
ha_release: 0.81
ha_iot_class: Cloud Polling
@@ -10,24 +11,46 @@ ha_config_flow: true
ha_domain: smhi
ha_platforms:
- weather
+ - sensor
ha_codeowners:
- '@gjohansson-ST'
ha_integration_type: integration
---
-The `smhi` integration adds support for the [SMHI.se](https://www.smhi.se/) web service as a source for meteorological data for your location.
+The **SMHI** {% term integration %} adds support for the [SMHI.se](https://www.smhi.se/) web service as a source for meteorological data for your location.
-There is currently support for the following device types within Home Assistant:
+{% important %}
-- Weather
+Only locations close to Sweden can be added. See [SMHI.se area](https://opendata.smhi.se/metfcst/pmp/geographic_area) for more details which locations are supported.
+
+{% endimportant %}
{% include integrations/config_flow.md %}
+## Weather
+
+The weather entity provides the current state of the weather as well as detailed forecasts for daily, hourly, and twice-daily weather.
+
+## Sensors
+
+The integration creates entities showing the current state of some additional weather metrics.
+
+| Sensor | Type | Description |
+| ------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------- |
+| Thunder probability | % | Probability of thunder. |
+| Total cloud coverage | % | Mean value of total cloud cover. |
+| Low cloud coverage | % | Mean value of low level cloud cover. |
+| Medium cloud coverage | % | Mean value of medium level cloud cover. |
+| High cloud coverage | % | Mean value of high level cloud cover. |
+| Precipitation category | None | Precipitation category can be any of: No precipitation, Snow, Snow and rain, Rain, Drizzle, Freezing rain, Freezing drizzle. |
+| Frozen precipitation | % | Percent of precipitation in frozen form. |
+
+The cloud sensors are not enabled by default.
The SMHI weather service is free under the Creative Commons Attribution 4.0, international license. Weather data will be pulled once every 30 minutes.
-{% important %}
-Only location close to Sweden can be added. See [SMHI.se area](https://opendata.smhi.se/apidocs/metfcst/geographic_area.html) for more details what locations are supported.
-{% endimportant %}
+Details about the API are available in the [SMHI API documentation](https://opendata.smhi.se/metfcst/pmp/introduction).
-Details about the API are available in the [SMHI API documentation](https://opendata.smhi.se/apidocs/metfcst/index.html).
+## Remove the integration
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/snmp.markdown b/source/_integrations/snmp.markdown
index 5a2c31b760f..bf01e4c53a6 100644
--- a/source/_integrations/snmp.markdown
+++ b/source/_integrations/snmp.markdown
@@ -38,24 +38,24 @@ This device tracker needs SNMP to be enabled on the router. It could be that you
The following OID examples pull the current MAC Address table from a router. This reflects all recent devices seen on the network. However, since devices are not removed until they time out, this is less effective for [device tracker integration page](/integrations/device_tracker/) than desirable. It is recommended to use [Ping](/integrations/ping) or [Nmap](/integrations/nmap_tracker) instead.
-| Brand | Device/Firmware | OID |
-| --- | --- | --- |
-| Aerohive | AP230 | `1.3.6.1.4.1.26928.1.1.1.2.1.2.1.1` |
-| Apple | Airport Express (2nd gen.) 7.6.9 | `1.3.6.1.2.1.3.1.1.2` or `1.3.6.1.2.1.4.22.1.2`|
-| Aruba | IAP325 on AOS 6.5.4.8 | `1.3.6.1.4.1.14823.2.3.3.1.2.4.1.1` |
-| BiPAC | 7800DXL Firmware 2.32e | `1.3.6.1.2.1.17.7.1.2.2.1.1` |
-| DD-WRT | unknown version/model | `1.3.6.1.2.1.4.22.1.2` |
-| IPFire | 2.25 | `1.3.6.1.2.1.4.22.1.2` |
-| MikroTik | unknown RouterOS version/model | `1.3.6.1.4.1.14988.1.1.1.2.1.1` |
-| MikroTik | RouterOS 6.x on RB2011 | `1.3.6.1.2.1.4.22.1.2` |
-| OpenWrt | Chaos Calmer 15.05 | `1.3.6.1.2.1.4.22.1.2` |
-| OPNSense | 19.1 | `1.3.6.1.2.1.4.22.1.2` |
-| pfSense | 2.2.4 | `1.3.6.1.2.1.4.22.1.2` |
-| Ruckus | ZoneDirector 9.13.3 | `1.3.6.1.4.1.25053.1.2.2.1.1.3.1.1.1.6` |
-| TP-Link | Archer VR1600v | `1.3.6.1.2.1.3.1.1.2.16.1` |
-| TP-Link | Archer VR2600v | `1.3.6.1.2.1.3.1.1.2.19.1` |
-| TP-Link | Archer VR600 | `1.3.6.1.2.1.3.1.1.2` |
-| Ubiquiti | Edgerouter Lite v1.9.0 | `1.3.6.1.2.1.4.22.1.2` |
+| Brand | Device/Firmware | OID |
+| -------- | -------------------------------- | ----------------------------------------------- |
+| Aerohive | AP230 | `1.3.6.1.4.1.26928.1.1.1.2.1.2.1.1` |
+| Apple | Airport Express (2nd gen.) 7.6.9 | `1.3.6.1.2.1.3.1.1.2` or `1.3.6.1.2.1.4.22.1.2` |
+| Aruba | IAP325 on AOS 6.5.4.8 | `1.3.6.1.4.1.14823.2.3.3.1.2.4.1.1` |
+| BiPAC | 7800DXL Firmware 2.32e | `1.3.6.1.2.1.17.7.1.2.2.1.1` |
+| DD-WRT | unknown version/model | `1.3.6.1.2.1.4.22.1.2` |
+| IPFire | 2.25 | `1.3.6.1.2.1.4.22.1.2` |
+| MikroTik | unknown RouterOS version/model | `1.3.6.1.4.1.14988.1.1.1.2.1.1` |
+| MikroTik | RouterOS 6.x on RB2011 | `1.3.6.1.2.1.4.22.1.2` |
+| OpenWrt | Chaos Calmer 15.05 | `1.3.6.1.2.1.4.22.1.2` |
+| OPNSense | 19.1 | `1.3.6.1.2.1.4.22.1.2` |
+| pfSense | 2.2.4 | `1.3.6.1.2.1.4.22.1.2` |
+| Ruckus | ZoneDirector 9.13.3 | `1.3.6.1.4.1.25053.1.2.2.1.1.3.1.1.1.6` |
+| TP-Link | Archer VR1600v | `1.3.6.1.2.1.3.1.1.2.16.1` |
+| TP-Link | Archer VR2600v | `1.3.6.1.2.1.3.1.1.2.19.1` |
+| TP-Link | Archer VR600 | `1.3.6.1.2.1.3.1.1.2` |
+| Ubiquiti | Edgerouter Lite v1.9.0 | `1.3.6.1.2.1.4.22.1.2` |
To use the SNMP version 1 or 2c platform in your installation, add the following to your `configuration.yaml` file:
@@ -434,7 +434,7 @@ switch:
payload_off: 0
- platform: snmp
- name: Enable PoE on Netgear switch port 2 using SNMP v3
+ name: Enable PoE on NETGEAR switch port 2 using SNMP v3
host: 192.168.0.4
version: "3"
username: "myusername"
diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown
index 2aa67094c4b..7cae6b2e9bc 100644
--- a/source/_integrations/sonos.markdown
+++ b/source/_integrations/sonos.markdown
@@ -464,3 +464,9 @@ sonos:
media_player:
advertise_addr: 192.0.2.1
```
+
+## Removing the integration
+
+This integration follows the standard integration removal process; no extra steps are required.
+
+{% include integrations/remove_device_service.md %}
\ No newline at end of file
diff --git a/source/_integrations/spotify.markdown b/source/_integrations/spotify.markdown
index 8ec0fdb380a..789b321c16e 100644
--- a/source/_integrations/spotify.markdown
+++ b/source/_integrations/spotify.markdown
@@ -10,7 +10,6 @@ ha_codeowners:
- '@frenck'
- '@joostlek'
ha_domain: spotify
-ha_zeroconf: true
ha_platforms:
- diagnostics
- media_player
@@ -29,7 +28,7 @@ library from Home Assistant.
- Spotify compatible playback [source](#selecting-output-source) device
- A Spotify Developer application. Instructions for that are in
the next step.
-
+
### Create a Spotify application
For Home Assistant to communicate with Spotify, we need to create
@@ -45,17 +44,17 @@ to allow you to log in with your Spotify account.
3. Select the [**Create app**](https://developer.spotify.com/dashboard/create) button in the top right.
- 
-
+ 
+
4. Enter a name and description; feel free to use any name and description you like.
- Set the _"Redirect URI"_ to the following:
-
- `https://my.home-assistant.io/redirect/oauth`
+ - Set the _"Redirect URI"_ to the following:
- Please copy and paste the exact URL above. You **do not** have to change it.
+ `https://my.home-assistant.io/redirect/oauth`
- 
+ - Please copy and paste the exact URL above. You **do not** have to change it.
+
+ 
5. Select Web API.
@@ -65,22 +64,22 @@ to allow you to log in with your Spotify account.
7. Spotify will now show the new application you have just created. Select
the **Settings** button in the top right to configure it.
- 
+ 
8. Before we can start configuring Home Assistant, we need to grab the application
credentials Home Assistant needs.
- Select on the **View client secret** button to reveal the client secret.
+ - Select on the **View client secret** button to reveal the client secret.
- 
+ 
9. The _"Client ID"_ and _"Client secret"_ are the two pieces of information
that Home Assistant needs to communicate with Spotify and is what we
call: Application credentials.
- 
+ 
- You will need the _"Client ID"_ and _"Client secret"_ during the Spotify
+ - You will need the _"Client ID"_ and _"Client secret"_ during the Spotify
integration setup process in Home Assistant.
You can now continue with the next chapter to configure the Spotify integration
@@ -103,7 +102,7 @@ Internal examples: `http://192.168.0.2:8123/auth/external/callback`, `http://hom
## Data updates
-The integration polls at least every 30 seconds.
+The integration {% term polling polls %} at least every 30 seconds.
If the track that is playing ends in less than 30 seconds, the integration will poll again after the track has ended to update the state again.
## Using multiple Spotify accounts
diff --git a/source/_integrations/sql.markdown b/source/_integrations/sql.markdown
index dc7daae9421..f2f8e0b7a2a 100644
--- a/source/_integrations/sql.markdown
+++ b/source/_integrations/sql.markdown
@@ -120,6 +120,17 @@ sql:
type: template
{% endconfiguration %}
+## Data updates
+
+By default, the integration executes the SQL query to update the sensor every 30 seconds.
+If you wish to update at a different interval, you can disable the automatic refresh in the integration’s system options (**Enable polling for updates**) and create your own automation with your desired frequency.
+
+For more detailed steps on how to define a custom interval, follow the procedure below.
+
+### Defining a custom polling interval
+
+{% include common-tasks/define_custom_polling.md %}
+
## Information
See [supported engines](/integrations/recorder/#custom-database-engines) for which you can connect with this integration.
diff --git a/source/_integrations/squeezebox.markdown b/source/_integrations/squeezebox.markdown
index c75fe02431b..01be6ee92a0 100644
--- a/source/_integrations/squeezebox.markdown
+++ b/source/_integrations/squeezebox.markdown
@@ -3,6 +3,7 @@ title: Squeezebox (Lyrion Music Server)
description: Instructions on how to integrate Squeezebox players and a Lyrion Music Server (LMS) into Home Assistant.
ha_category:
- Media player
+ - Update
ha_release: pre 0.7
ha_iot_class: Local Polling
ha_domain: squeezebox
diff --git a/source/_integrations/stookwijzer.markdown b/source/_integrations/stookwijzer.markdown
index e5198521c60..dba7e3c626a 100644
--- a/source/_integrations/stookwijzer.markdown
+++ b/source/_integrations/stookwijzer.markdown
@@ -30,3 +30,82 @@ Additionally, various sensor entities are provided:
- **Air Quality Index**: Sensor containing the air quality index at the selected location.
{% include integrations/config_flow.md %}
+
+## Action: Get Forecast
+
+The `stookwijzer.get_forecast` action populates [response data](/docs/scripts/perform-actions#use-templates-to-handle-response-data)
+with a mapping of the Stookwijzer advice forecast.
+
+```yaml
+action: stookwijzer.get_forecast
+target:
+ config_entry_id: 12345
+response_variable: stookwijzer_forecast
+```
+
+The response data field contains the `forecast` field.
+`forecast` is a list of forecast advice entries at a given time:
+
+| Response data | Description | Example |
+|--------------|-----------------------------------------------------------------------------|---------------------------|
+| `datetime` | The time of the forecasted advice. | 2025-01-14T14:00:00+00:00 |
+| `advice` | The forecasted advice code. | code_yellow |
+| `final` | Indicator whether the advice is final or can still change. | True |
+
+{% details "Example action response" %}
+
+```yaml
+forecast:
+ - datetime: "2025-02-12T17:00:00+01:00"
+ advice: code_yellow
+ final: True
+ - datetime: "2025-02-12T23:00:00+01:00"
+ advice: code_yellow
+ final: True
+ - datetime: "2025-02-13T05:00:00+01:00"
+ advice: code_orange
+ final: False
+ - datetime: "2025-02-13T11:00:00+01:00"
+ advice: code_red
+ final: False
+```
+
+{% enddetails %}
+
+## Examples
+
+{% details "Example template sensor using get_forecast" %}
+
+Example template sensors containing the Stookwijzer forecast for 6 and 12 hours from now.
+
+{% raw %}
+
+```yaml
+template:
+ - trigger:
+ - trigger: time_pattern
+ hours: /1
+ action:
+ - action: stookwijzer.get_forecast
+ target:
+ entity_id: sensor.stookwijzer_advice_code
+ response_variable: advice_forecast
+ sensor:
+ - name: Stookwijzer forecast 6 hours
+ unique_id: stookwijzer_forecast_6_hours
+ state: "{{ advice_forecast['forecast'][0]['advice'] }}"
+ attributes:
+ final: "{{ advice_forecast['forecast'][0]['final'] }}"
+ timestamp: "{{ advice_forecast['forecast'][0]['datetime'] }}"
+ - name: Stookwijzer forecast 12 hours
+ unique_id: stookwijzer_forecast_12_hours
+ state: "{{ advice_forecast['forecast'][1]['advice'] }}"
+ attributes:
+ final: "{{ advice_forecast['forecast'][1]['final'] }}"
+ timestamp: "{{ advice_forecast['forecast'][1]['datetime'] }}"
+```
+
+{% endraw %}
+
+{% enddetails %}
+
diff --git a/source/_integrations/sun.markdown b/source/_integrations/sun.markdown
index 26e5f270b2e..8958c285055 100644
--- a/source/_integrations/sun.markdown
+++ b/source/_integrations/sun.markdown
@@ -6,7 +6,7 @@ ha_category:
ha_release: pre 0.7
ha_quality_scale: internal
ha_codeowners:
- - '@Swamp-Ig'
+ - '@home-assistant/core'
ha_iot_class: Calculated
ha_domain: sun
ha_config_flow: true
diff --git a/source/_integrations/switch.mqtt.markdown b/source/_integrations/switch.mqtt.markdown
index c8b9b39fa22..9d8855cb340 100644
--- a/source/_integrations/switch.mqtt.markdown
+++ b/source/_integrations/switch.mqtt.markdown
@@ -165,7 +165,7 @@ name:
type: string
default: MQTT Switch
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/switch.template.markdown b/source/_integrations/switch.template.markdown
deleted file mode 100644
index a986dbde679..00000000000
--- a/source/_integrations/switch.template.markdown
+++ /dev/null
@@ -1,285 +0,0 @@
----
-title: "Template Switch"
-description: "Instructions on how to integrate Template Switches into Home Assistant."
-ha_category:
- - Switch
- - Helper
-ha_release: 0.13
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_config_flow: true
-ha_platforms:
- - switch
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform creates switches that combines components.
-
-For example, if you have a garage door with a toggle switch that operates the motor and a sensor that allows you know whether the door is open or closed, you can combine these into a switch that knows whether the garage door is open or closed.
-
-This can simplify the GUI and make it easier to write automations.
-
-{% include integrations/config_flow.md %}
-
-{% important %}
-To be able to add **{% my helpers title="Helpers" %}** via the user interface, you should have `default_config:` in your {% term "`configuration.yaml`" %}. It should already be there by default unless you removed it.
-{% endimportant %}
-
-{% note %}
-Configuration using our user interface provides a more limited subset of options, making this integration more accessible while covering most use cases.
-
-If you need more specific features for your use case, the manual [YAML-configuration section](#yaml-configuration) of this integration might provide them.
-{% endnote %}
-
-## YAML Configuration
-
-To enable Template Switches in your installation, add the following to your {% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-switch:
- - platform: template
- switches:
- skylight:
- value_template: "{{ is_state('sensor.skylight', 'on') }}"
- turn_on:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_open
- turn_off:
- action: switch.turn_off
- target:
- entity_id: switch.skylight_close
-```
-
-{% endraw %}
-
-{% configuration %}
- switches:
- description: List of your switches.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this switch. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: Defines a template to set the state of the switch. If not defined, the switch will optimistically assume all commands are successful.
- required: false
- type: template
- default: optimistic
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- turn_on:
- description: Defines an action or list of actions to run when the switch is turned on.
- required: true
- type: action
- turn_off:
- description: Defines an action or list of actions to run when the switch is turned off.
- required: true
- type: action
- icon_template:
- description: Defines a template for the icon of the switch.
- required: false
- type: template
- entity_picture_template:
- description: Defines a template for the picture of the switch.
- required: false
- type: template
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of a platform that takes extra time to load, the Template Switch may get an `unknown` state during startup. This results in error messages in your log file until that platform has completed loading. If you use `is_state()` function in your template, you can avoid this situation. For example, you would replace {% raw %}`{{ states.switch.source.state == 'on') }}`{% endraw %} with this equivalent that returns `true`/`false` and never gives an unknown result: {% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
-
-## Examples
-
-In this section you find some real-life examples of how to use this switch.
-
-### Invert a Switch
-
-This example shows a switch that is the inverse of another switch.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- invert:
- value_template: "{{ not is_state('switch.target', 'on') }}"
- availability_template: "{{ has_value('switch.target') }}"
- turn_on:
- action: switch.turn_off
- target:
- entity_id: switch.target
- turn_off:
- action: switch.turn_on
- target:
- entity_id: switch.target
-```
-
-{% endraw %}
-
-### Toggle Switch
-
-This example shows a switch that takes its state from a sensor and toggles a switch.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- blind:
- friendly_name: "Blind"
- value_template: "{{ is_state_attr('switch.blind_toggle', 'sensor_state', 'on') }}"
- turn_on:
- action: switch.toggle
- target:
- entity_id: switch.blind_toggle
- turn_off:
- action: switch.toggle
- target:
- entity_id: switch.blind_toggle
-```
-
-{% endraw %}
-
-### Multiple actions for turn_on or turn_off
-
-This example shows multiple actions for turn_on and turn_off.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- copy:
- value_template: "{{ is_state('switch.source', 'on') }}"
- turn_on:
- - action: switch.turn_on
- target:
- entity_id: switch.target
- - action: light.turn_on
- target:
- entity_id: light.target
- data:
- brightness_pct: 40
- turn_off:
- - action: switch.turn_off
- target:
- entity_id: switch.target
- - action: light.turn_off
- target:
- entity_id: light.target
-```
-
-{% endraw %}
-
-### Sensor and Two Switches
-
-This example shows a switch that takes its state from a sensor, and uses two
-momentary switches to control a device.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- skylight:
- friendly_name: "Skylight"
- value_template: "{{ is_state('sensor.skylight', 'on') }}"
- turn_on:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_open
- turn_off:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_close
-```
-
-{% endraw %}
-
-### Change The Icon
-
-This example shows how to change the icon based on the state of the garage door.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- garage:
- value_template: "{{ is_state('cover.garage_door', 'open') }}"
- turn_on:
- action: cover.open_cover
- target:
- entity_id: cover.garage_door
- turn_off:
- action: cover.close_cover
- target:
- entity_id: cover.garage_door
- icon_template: >-
- {% if is_state('cover.garage_door', 'open') %}
- mdi:garage-open
- {% else %}
- mdi:garage
- {% endif %}
-```
-
-{% endraw %}
-
-### Change The Entity Picture
-
-This example shows how to change the entity picture based on the state of the garage door.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- garage:
- value_template: "{{ is_state('cover.garage_door', 'open') }}"
- turn_on:
- action: cover.open_cover
- target:
- entity_id: cover.garage_door
- turn_off:
- action: cover.close_cover
- target:
- entity_id: cover.garage_door
- entity_picture_template: >-
- {% if is_state('cover.garage_door', 'open') %}
- /local/garage-open.png
- {% else %}
- /local/garage-closed.png
- {% endif %}
-```
-
-{% endraw %}
diff --git a/source/_integrations/switchbot.markdown b/source/_integrations/switchbot.markdown
index 486b6271200..c789159a057 100644
--- a/source/_integrations/switchbot.markdown
+++ b/source/_integrations/switchbot.markdown
@@ -4,12 +4,13 @@ description: Instructions on how to set up SwitchBot Devices.
ha_category:
- Binary sensor
- Cover
+ - Fan
+ - Humidifier
- Light
- Lock
- Sensor
- Switch
- Vacuum
- - Fan
ha_release: 0.78
ha_iot_class: Local Push
ha_codeowners:
@@ -18,7 +19,10 @@ ha_codeowners:
- '@murtas'
- '@Eloston'
- '@dsypniewski'
+ - '@zerzhang'
ha_domain: switchbot
+works_with:
+ - bluetooth
ha_bluetooth: true
ha_platforms:
- binary_sensor
@@ -33,6 +37,7 @@ ha_platforms:
- vacuum
ha_config_flow: true
ha_integration_type: integration
+ha_quality_scale: gold
---
The SwitchBot integration allows you to control SwitchBot [devices](https://www.switch-bot.com/) such as sensors, locks, shades, lights, plugs, robot vacuums, hubs and etc.
@@ -117,6 +122,8 @@ For instructions on how to obtain the encryption key, see README in [PySwitchbot
- [Color Bulb (WoBulb)](https://switch-bot.com/pages/switchbot-color-bulb)
- [Light Strip (WoStrip)](https://www.switchbot.jp/products/switchbot-strip-light)
- [Smart Ceiling Light (WoCeiling)](https://www.switchbot.jp/products/switchbot-ceiling-light)
+- [Strip Light 3](https://www.switch-bot.com/products/switchbot-led-strip-light-3)
+- [Floor Lamp](https://www.switch-bot.com/products/switchbot-floor-lamp)
### Locks
@@ -128,6 +135,7 @@ For instructions on how to obtain the encryption key, see README in [PySwitchbot
### Humidifiers
- [Humidifier (WoHumi)](https://www.switchbot.jp/products/switchbot-smart-humidifier)
+- [Evaporative Humidifier](https://www.switch-bot.com/products/switchbot-evaporative-humidifier-auto-refill)
### Sensors
@@ -163,6 +171,27 @@ For instructions on how to obtain the encryption key, see README in [PySwitchbot
- [Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
- [Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+## Works with Home Assistant
+
+SwitchBot is committed to making sure their products are up-to-date and ready to use in Home Assistant.
+Devices are certified for both Bluetooth and Matter.
+
+The following devices are certified for Bluetooth:
+- [SwitchBot Lock Ultra](https://www.switch-bot.com/products/switchbot-lock-ultra)
+- [SwitchBot Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
+- [SwitchBot Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+- [SwitchBot Leak Detector](https://www.switch-bot.com/products/switchbot-water-leak-detector)
+- [SwitchBot Meter](https://www.switch-bot.com/products/switchbot-meter)
+- [SwitchBot Meter Pro](https://www.switch-bot.com/products/switchbot-meter-pro)
+- [SwitchBot Meter Pro CO2](https://www.switch-bot.com/products/switchbot-meter-pro-co2-monitor)
+- [SwitchBot Indoor/Outdoor Thermo-Hygrometer](https://www.switch-bot.com/products/switchbot-indoor-outdoor-thermo-hygrometer)
+- [SwitchBot Curtain 3](https://www.switch-bot.com/products/switchbot-curtain-3)
+- [SwitchBot Contact Sensor](https://www.switch-bot.com/products/contact-sensor)
+- [SwitchBot Roller Shade](https://www.switch-bot.com/products/switchbot-roller-shade)
+- [SwitchBot Lock Pro](https://www.switch-bot.com/products/switchbot-lock-pro)
+
+To see the list of SwitchBot Matter certified devices, visit the [SwitchBot Matter](switchbot_matter.markdown) page.
+
## Supported functionality
### Common
@@ -182,6 +211,7 @@ Switch entities are added for Bot, Plug Mini, and Relay Switch.
Password protection: You can set a device password in the SwitchBot app to prevent people nearby take control of your device. When a password is set, you need to enter the correct password in order to add it to the integrations.
Features:
+
- turn on or off
- press
- get battery level
@@ -192,6 +222,7 @@ Attributes:
#### Plug Mini
Features:
+
- turn on or off
- get power consumption readings
@@ -200,6 +231,7 @@ Features:
This is an encrypted device.
Features:
+
- turn on or off
#### Relay Switch 1PM
@@ -207,6 +239,7 @@ Features:
This is an encrypted device.
Features:
+
- turn on or off
- get power
- get voltage
@@ -219,6 +252,7 @@ Cover entities are added for Curtain, Curtain 3, Blind Tilt, and Roller Shade.
#### Curtain
Features:
+
- open/close/pause
- set position
- get position
@@ -229,6 +263,7 @@ Features:
#### Curtain 3
Features:
+
- open/close/pause
- set position
- get position
@@ -239,6 +274,7 @@ Features:
#### Blind Tilt
Features:
+
- close up/close down/pause
- set position
- get position
@@ -258,7 +294,7 @@ The close button will close the blinds to the closest closed position (either 0%
##### Simple cover template entity
-Some integrations may expose your SwitchBot Blind Tilt to other actions which expect that 100% is open and 0% is fully closed. Using a [Cover Template](/integrations/cover.template), a proxy entity can be created which will be open at 100% and closed at 0%. This template entity is limited to closing in one direction.
+Some integrations may expose your SwitchBot Blind Tilt to other actions which expect that 100% is open and 0% is fully closed. Using a [Cover Template](/integrations/template/#cover), a proxy entity can be created which will be open at 100% and closed at 0%. This template entity is limited to closing in one direction.
{% raw %}
@@ -303,6 +339,7 @@ The Roller Shade is exposed as a cover entity with control of the position only:
| >20% | Close |
Features:
+
- open/close/pause
- set position
- get position
@@ -315,6 +352,7 @@ Sensor entiteis are added for thermometer and hygrometer devices, motion sensor,
#### Meter
Features:
+
- get temperature
- get humidity
- get battery level
@@ -322,6 +360,7 @@ Features:
#### Meter Plus
Features:
+
- get temperature
- get humidity
- get battery level
@@ -329,6 +368,7 @@ Features:
#### Indoor/Outdoor Meter
Features:
+
- get temperature
- get humidity
- get battery level
@@ -336,6 +376,7 @@ Features:
#### Meter Pro
Features:
+
- get temperature
- get humidity
- get battery level
@@ -343,6 +384,7 @@ Features:
#### Meter Pro CO2 Monitor
Features:
+
- get temperature
- get humidity
- get carbon dioxide
@@ -362,10 +404,13 @@ Features:
- motion detection state
- get battery level
+
#### Water Leak Detector
+
This is an encrypted device.
Features:
+
- leak or dry state
- get battery level
@@ -378,6 +423,14 @@ Features:
Light entities are added for Color Bulb, LED Strip Light, and Ceiling Light.
+#### Ceiling Light
+
+Features:
+
+- turn on or off
+- change brightness
+- change color temperature
+
#### Color Bulb
Features:
@@ -385,13 +438,40 @@ Features:
- change brightness
- change color temperature
- change color
+- set effect
#### LED Strip Light
Features:
+
- turn on or off
- change brightness
- change color
+- set effect
+
+#### Strip Light 3
+
+This is an encrypted device.
+
+Features:
+
+- turn on or off
+- change brightness
+- change color temperature
+- change color
+- set effect
+
+#### Floor Lamp
+
+This is an encrypted device.
+
+Features:
+
+- turn on or off
+- change brightness
+- change color temperature
+- change color
+- set effect
### Locks
@@ -402,12 +482,19 @@ Note: The integration currently only uses the primary lock state; in dual lock m
This is an encrypted device.
Features:
+
- Lock or unlock
- open or closed state
- auto-lock paused state
- calibration state
- get battery level
+Options:
+
+1. To enable nightlatch operation mode, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Under **Integration entries**, find the lock and select **Configure**.
+3. In the **Options** dialog, configure the nightlatch operation mode.
+
#### Lock Pro
This is an encrypted device.
@@ -420,6 +507,14 @@ Features:
- calibration state
- get battery level
+Options:
+
+1. To enable nightlatch operation mode, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Under **Integration entries**, find the lock and select **Configure**.
+3. In the **Options** dialog, configure the nightlatch operation mode.
+
+
+
#### Lock Ultra
This is an encrypted device.
@@ -432,6 +527,12 @@ Features:
- calibration state
- get battery level
+Options:
+
+1. To enable nightlatch operation mode, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Under **Integration entries**, find the lock and select **Configure**.
+3. In the **Options** dialog, configure the nightlatch operation mode.
+
#### Lock Lite
This is an encrypted device.
@@ -439,8 +540,6 @@ This is an encrypted device.
Features:
- Lock or unlock
-- open or closed state
-- auto-lock paused state
- calibration state
- get battery level
@@ -474,17 +573,17 @@ Features:
### Fans
-Fan entities are added for Circulator Fan, Air Purifier, and Air Purifier Table
+Fan entities are added for Battery Circulator Fan/Circulator Fan, Air Purifier, and Air Purifier Table
-#### Circulator Fan
+#### Battery Circulator Fan/Circulator Fan
Features:
-
- turn on
- turn off
- set speed
- set mode
- oscillate left and right
+- get battery level (Battery Circulator Fan only)
#### Air Purifier
@@ -511,11 +610,36 @@ Features:
Vacuum entities are added for K10+, K10+ Pro, K10+ Pro Combo, K20, S10.
Features:
-
+- get states, including `cleaning`, `docked`, `idle`, `paused`, `returning`, and `error`; refer to Known limitations for more details
- start
- return to base
- get battery
+### Humidifiers
+
+Humidifier entities are added for Humidifier and Evaporative Humidifier.
+
+#### Humidifier
+
+Features:
+
+- turn on
+- turn off
+- set mode
+- set humidity
+
+#### Evaporative Humidifier
+
+This is an encrypted device.
+Note: Not all modes support unless you bind the temperature and humidity sensor.
+
+Features:
+
+- turn on
+- turn off
+- set mode
+- set humidity
+
## Data updates
SwitchBot devices utilize a [local push](/blog/2016/02/12/classifying-the-internet-of-things/#classifiers) strategy to maintain real-time status updates. When devices detect state changes, they actively push updates to Home Assistant for immediate synchronization. For user-initiated actions through Home Assistant (for example, when turning a device on/off), the integration performs an additional proactive status fetch to ensure instant confirmation of the new state.
@@ -531,10 +655,25 @@ Move the device closer, or replace the Bluetooth adapter with a faster one. See
Device names configured in the SwitchBot app are not transferred into Home Assistant.
+### Battery level
+
+Due to firmware limitations, early models such as **Lock** and **Lock Lite** report the battery level in coarse ranges rather than an exact value:
+
+- < 10 % → 10
+- 10 % – 20 % → 20
+- 20 % – 60 % → 60
+- ≥ 60 % → 100
+
+Refer to the latest version of the [OpenAPI doc](https://github.com/OpenWonderLabs/SwitchBotAPI) for precise definitions.
+
### Lock state
The integration currently only uses the primary lock state; in dual lock mode, not all things might work properly.
+### Vacuum state
+
+For robot vacuum K10+ and K10+ Pro, due to firmware implementation, it only returns these states, `cleaning` and `docked`
+
## Troubleshooting
The SwitchBot integration will automatically discover devices once the [Bluetooth](/integrations/bluetooth) integration is enabled and functional.
@@ -547,8 +686,6 @@ Possible custom integration conflict, using a different version of PySwitchbot;
Make sure your devices are powered on and are in range.
{% enddetails %}
-
-
## Examples
### Automation ideas
diff --git a/source/_integrations/switchbot_cloud.markdown b/source/_integrations/switchbot_cloud.markdown
index dfa0d89a348..e612e972cb6 100644
--- a/source/_integrations/switchbot_cloud.markdown
+++ b/source/_integrations/switchbot_cloud.markdown
@@ -4,6 +4,7 @@ description: Instructions on how to set up SwitchBot Devices.
ha_category:
- Binary Sensor
- Button
+ - Fan
- Hub
- Lock
- Plug
@@ -22,6 +23,7 @@ ha_platforms:
- binary_sensor
- button
- climate
+ - fan
- lock
- sensor
- switch
@@ -40,25 +42,175 @@ Please note, device names configured in the SwitchBot app are transferred into H
{% include integrations/config_flow.md %}
+
## Supported devices
+### Plugs and switches
+
+- [Bot (WoHand)](https://switch-bot.com/pages/switchbot-bot)
+- [Relay Switch 1](https://www.switch-bot.com/products/switchbot-relay-switch-1)
+- [Relay Switch 1PM](https://www.switch-bot.com/products/switchbot-relay-switch-1pm)
+- [Plug Mini (WoPlug)](https://www.switch-bot.com/products/switchbot-plug-mini)
+- [Plug Mini (HomeKit Enabled)](https://www.switch-bot.com/products/switchbot-plug-mini-homekit-enabled)
- Plug (Wi-Fi only, only available in Japan)
-- Plug Mini, both the original and HomeKit-enabled
+
+### Locks
+
+- [Lock (WoLock)](https://switch-bot.com/pages/switchbot-lock)
+- [Lock Pro (WoLockPro)](https://www.switch-bot.com/pages/switchbot-lock-pro)
+
+### Sensors
+
+- [Meter](https://switch-bot.com/pages/switchbot-meter)
+- [Meter Plus](https://switch-bot.com/pages/switchbot-meter-plus)
+- [Indoor/Outdoor Meter (WoIOSensorTH)](https://switch-bot.com/pages/switchbot-indoor-outdoor-thermo-hygrometer)
+- [Meter Pro](https://www.switch-bot.com/products/switchbot-meter-pro)
+- [Meter Pro CO2 Monitor](https://www.switch-bot.com/products/switchbot-meter-pro-co2-monitor)
+
+### Hubs
+
+- [Hub 2 (WoHub2)](https://switch-bot.com/pages/switchbot-hub-2) (currently only supports retrieving sensor data, does not yet support device control)
- IR appliances exposed through the different hubs:
- - ON/OFF for all appliance types excepted "Others"
- - Air Conditioner
-- Lock
-- Lock Pro
-- Meter
-- MeterPlus
-- MeterPro
-- MeterPro (C02)
-- Outdoor Meter
-- Vacuum K10+, K10+ pro, S1, S1 Plus
-- Hub 2
-- Relay Switch 1
-- Relay Switch 1PM
-- Bot (as a Switch in `switchMode` and `customizeMode`, as a Button in `pressMode`)
+ - ON/OFF for all appliance types except for *Others*
+ - Change temperature and mode for *Air Conditioner*
+
+### Vacuums
+
+- [K10+](https://www.switch-bot.com/products/switchbot-mini-robot-vacuum-k10)
+- [K10+ Pro](https://www.switch-bot.com/products/switchbot-mini-robot-vacuum-k10-pro)
+- [S1](https://www.switchbot.jp/products/switchbot-robot-vacuum-cleaner?&variant=41850919420079)
+- [S1 Plus](https://www.switchbot.jp/products/switchbot-robot-vacuum-cleaner)
+
+### Fans
+
+- [Circulator Fan](https://www.switch-bot.com/products/switchbot-battery-circulator-fan)
+
+## Supported functionality
+
+### Plugs and switches
+
+#### Bot
+
+Features:
+- acted as a Switch in `switchMode` and `customizeMode`, as a Button in `pressMode`
+- turn on or off
+- press
+- get battery level
+
+#### Plug Mini
+
+Features:
+- turn on or off
+- get power consumption readings
+
+#### Relay Switch 1
+
+Features:
+- turn on or off
+
+#### Relay Switch 1PM
+
+Features:
+- turn on or off
+- get power
+- get voltage
+- get current
+
+#### Plug
+
+Features:
+- turn on or off
+
+
+### Sensors
+
+#### Meter
+
+Features:
+- get temperature
+- get humidity
+- get battery level
+
+#### Meter Plus
+
+Features:
+- get temperature
+- get humidity
+- get battery level
+
+#### Indoor/Outdoor Meter
+
+Features:
+- get temperature
+- get humidity
+- get battery level
+
+#### Meter Pro
+
+Features:
+- get temperature
+- get humidity
+- get battery level
+
+#### Meter Pro CO2 Monitor
+
+Features:
+- get temperature
+- get humidity
+- get carbon dioxide
+- get battery level
+
+### Locks
+
+#### Lock
+
+Features:
+- Lock or unlock
+- open or closed state
+- calibration state
+- get battery level
+
+#### Lock Pro
+
+Features:
+- Lock or unlock
+- open or closed state
+- calibration state
+- get battery level
+
+### Hubs
+
+Some of the hubs can be served as a bridge while the sensor data can be retrieved. Hub 2 displays temperature and humidity through a sensor cable. Without a digital display, Hub Mini Matter Enabled can also read from a sensor cable.
+
+#### Hub 2
+
+Features:
+- get temperature
+- get humidity
+
+### Fans
+
+#### Battery Circulator Fan/Circulator Fan
+
+Features:
+- turn on
+- turn off
+- set speed, only applicable for [direct mode]
+- set mode
+- get battery, only applicable for [Battery Circulator Fan]
+
+
+### Vacuums
+
+Vacuum entities are added for K10+, K10+ Pro, S1, S1 Plus.
+
+Features:
+- get states
+- start/clean
+- pause
+- set cleaning mode
+- return to base
+- get battery
## Important considerations
@@ -76,4 +228,4 @@ For vacuums, the states are updated from SwitchBot's cloud.
{% warning %}
Only ONE webhook URL seems to be accepted by the SwitchBot's cloud. So, if you want several applications notified, you need to use a “proxy” to re-dispatch the message to the other applications.
-{% endwarning %}
\ No newline at end of file
+{% endwarning %}
diff --git a/source/_integrations/switchbot_matter.markdown b/source/_integrations/switchbot_matter.markdown
new file mode 100644
index 00000000000..86219c6e1f5
--- /dev/null
+++ b/source/_integrations/switchbot_matter.markdown
@@ -0,0 +1,47 @@
+---
+title: SwitchBot Matter
+description: Connect and control your SwitchBot Matter devices using the Matter integration
+ha_release: '2025.6'
+ha_iot_class: Local Push
+ha_category:
+ - Cover
+ - Lock
+ - Sensor
+ - Switch
+ha_domain: switchbot
+ha_integration_type: brand
+works_with:
+ - matter
+ha_platforms:
+ - binary_sensor
+ - cover
+ - lock
+ - sensor
+ - switch
+ha_iot_standard: matter
+ha_brand: true
+---
+
+{% include integrations/wwha.md url="https://www.switchbot.com/" %}
+
+## Supported devices
+
+SwitchBot also has Matter devices that are certified for use via one of their Matter hubs: either the [SwitchBot Hub 2](https://www.switch-bot.com/products/switchbot-hub-2) or the [Hub 3](https://www.switch-bot.com/products/switchbot-hub-3). Some are also certified via Matter-over-WiFi as standalone devices.
+
+### Via a Matter Hub
+
+- [SwitchBot Lock Ultra](https://www.switch-bot.com/products/switchbot-lock_ultra)
+- [SwitchBot Meter](https://www.switch-bot.com/products/switchbot-meter)
+- [SwitchBot Meter Pro](https://www.switch-bot.com/products/switchbot-meter-pro)
+- [SwitchBot Meter Pro CO2](https://www.switch-bot.com/products/switchbot-meter-pro-co2-monitor)
+- [SwitchBot Indoor/Outdoor Thermo-Hygrometer](https://www.switch-bot.com/products/switchbot-indoor-outdoor-thermo-hygrometer)
+- [SwitchBot Curtain 3](https://www.switch-bot.com/products/switchbot-curtain-3)
+- [SwitchBot Contact Sensor](https://www.switch-bot.com/products/contact-sensor)
+- [SwitchBot Roller Shade](https://www.switch-bot.com/products/switchbot-roller-shade)
+- [SwitchBot Lock Pro](https://www.switch-bot.com/products/switchbot-lock-pro)
+
+### Matter-Over-WiFi (standalone, without requiring a hub)
+
+- [SwitchBot Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
+- [SwitchBot Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+- [SwitchBot Multitasking Robot K20 + Pro](https://www.switch-bot.com/products/switchbot-multitasking-household-robot-k20-pro)
diff --git a/source/_integrations/synology_dsm.markdown b/source/_integrations/synology_dsm.markdown
index ad8fa16a312..2cc531bb94d 100644
--- a/source/_integrations/synology_dsm.markdown
+++ b/source/_integrations/synology_dsm.markdown
@@ -173,6 +173,18 @@ To find the `` you need to go to the album in your photos instance, an
For performance reasons, a maximum of 1000 images will be shown in the Media Browser.
+## UPS support
+
+This integration does not directly support the UPS systems connected to the NAS, but it can be achieved with the [Network UPS Tools (NUT)](/integrations/nut) integration. You need to enable UPS support in your NAS settings, as described in the official Synology [UPS](https://kb.synology.com/en-me/DSM/help/DSM/AdminCenter/system_hardware_ups) documentation, and then integrate the NAS as a UPS server via the NUT integration. Here is a rough step-by-step guide:
+
+1. Activate **Enable UPS support** in the NAS settings under **Control Panel** > **Hardware & Power** > **UPS**.
+2. Activate **Enable network UPS server**.
+3. Select **Permitted Synology NAS Devices** and add the IP address of your Home Assistant instance.
+4. Set up the [Network UPS Tools (NUT)](/integrations/nut) integration.
+ - **Host**: the IP address or hostname of your NAS.
+ - **Port**: keep the default (_3493_).
+ - **Username** and **Password**: keep empty as the NAS doesn't support credentials for the NUT server.
+
## 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.
diff --git a/source/_integrations/tado.markdown b/source/_integrations/tado.markdown
index b1631351de0..3432bb963b0 100644
--- a/source/_integrations/tado.markdown
+++ b/source/_integrations/tado.markdown
@@ -6,6 +6,7 @@ ha_category:
- Climate
- Hub
- Presence detection
+ - Select
- Sensor
- Switch
- Water heater
@@ -22,6 +23,7 @@ ha_platforms:
- climate
- device_tracker
- diagnostics
+ - select
- sensor
- switch
- water_heater
@@ -37,9 +39,10 @@ There is currently support for the following device types within Home Assistant:
- Climate - for every Tado zone.
- Water heater - for water heater zones.
- [Presence detection](#presence-detection)
+- Select - for controlling the heating circuit of a zone.
- Sensor - for some additional information of the zones.
- Weather - for information about the current weather at the location of your Tado home.
-- Switch - for controlling child lock on supported devices
+- Switch - for controlling child lock on supported devices.
The Tado thermostats are internet connected thermostats. There exists an unofficial API at [my.tado.com](https://my.tado.com/), which is used by their website and now by this component.
diff --git a/source/_integrations/tailscale.markdown b/source/_integrations/tailscale.markdown
index ce1babde93d..a7a8f6125f2 100644
--- a/source/_integrations/tailscale.markdown
+++ b/source/_integrations/tailscale.markdown
@@ -18,26 +18,134 @@ ha_platforms:
ha_integration_type: hub
---
-The Tailscale integration integrates the [Tailscale](https://www.tailscale.com) API
-with Home Assistant; giving you the possibility to monitor and automate on
-the state of the devices in your Tailscale VPN network (Tailnet).
+The **Tailscale** {% term integration %} connects to the [Tailscale](https://www.tailscale.com) API to monitor devices in your Tailscale network (Tailnet). Use this integration to create automations based on device connectivity, track usage patterns, or receive notifications when devices go online or offline.
+
+Tailscale is a VPN service that creates secure point-to-point connections between your devices using WireGuard technology. This integration monitors your Tailnet but doesn't provide VPN connectivity itself.
{% important %}
-This integration **DOES NOT** make your Home Assistant accessible via
-Tailscale VPN remotely!
+This integration monitors your Tailscale network but **does not provide VPN access** to Home Assistant.
-If you want to access your Home Assistant instance remotely, you will
-need to install Tailscale itself on your own. For instructions on how to do
-this, please consult the [Tailscale documentation](https://tailscale.com/kb/).
+To access Home Assistant remotely via Tailscale:
+1. Install Tailscale directly on your Home Assistant device
+2. Follow the [Tailscale installation guide](https://tailscale.com/kb/)
+3. Configure port forwarding or use Tailscale's subnet routes if needed
{% endimportant %}
## Prerequisites
-To use the Tailscale integration, you will need to obtain an API access token,
-you can create one in the [Tailscale Admin Panel](https://login.tailscale.com/admin/settings/keys).
+**Required information:**
-Additionally, you will need to know the Tailnet name of your Tailscale network.
-You can find it in the top left corner in the [Tailscale Admin Panel](https://login.tailscale.com/admin/settings/keys)
-(beside the Tailscale logo).
+1. **API Access Token**: Create one in the [Tailscale Admin Panel](https://login.tailscale.com/admin/settings/keys)
+ - Navigate to **Settings** > **Keys**
+ - Click **Generate auth key** or **Generate API key**
+ - Select appropriate expiration and permissions
+
+2. **Tailnet Name**: Found in the top-left corner of the [Admin Panel](https://login.tailscale.com/admin/machines)
+ - Usually in the format: `user@domain.com` or `organization-name`
+ - Also visible in the URL when browsing your admin panel
{% include integrations/config_flow.md %}
+
+{% configuration_basic %}
+API Key:
+ description: "Your Tailscale API access token from the Admin Panel."
+Tailnet:
+ description: "Your Tailnet name (organization name or email address)."
+{% endconfiguration_basic %}
+
+## Supported functionality
+
+### Sensors
+
+The integration provides sensors for monitoring your Tailscale network:
+
+#### Device information sensors
+
+- **Device count**: Total number of devices in your Tailnet
+- **Connected devices**: Number of currently online devices
+- **Disconnected devices**: Number of currently offline devices
+
+#### Per-device sensors
+
+For each device in your Tailnet:
+
+- **Connection status**: Whether the device is online or offline
+- **Last seen**: Timestamp when the device was last active
+- **Operating system**: Device OS (Windows, macOS, Linux, iOS, Android)
+- **Tailscale version**: Version of Tailscale client running
+- **IP addresses**: Both Tailscale IP and external IP
+- **Location**: Approximate geographic location (if available)
+
+### Binary sensors
+
+The integration creates binary sensors for:
+
+#### Network status
+
+- **Tailnet health**: Overall network connectivity status
+- **Device reachability**: Per-device online/offline status
+
+#### Security monitoring
+
+- **Key expiration warnings**: Alerts when auth keys are approaching expiration
+- **Unauthorized access**: Notifications for new device connections (if configured)
+
+## Examples
+
+### Automated backups based on device availability
+
+Start backups when specific devices are online:
+
+```yaml
+automation:
+ - alias: "Start backup when work laptop connects"
+ triggers:
+ - trigger: state
+ entity_id: binary_sensor.work_laptop_tailscale
+ from: "off"
+ to: "on"
+ conditions:
+ - condition: time
+ after: "18:00:00" # Only after work hours
+ before: "23:00:00"
+ actions:
+ - action: script.start_network_backup
+ - action: notify.admin
+ data:
+ message: "Starting automated backup - work laptop detected"
+```
+
+
+## Data updates
+
+The Tailscale integration polls the Tailscale API every minute to check device status and network information.
+
+## Troubleshooting
+
+### Integration fails to connect
+
+#### Symptom: "Unable to connect to Tailscale API" error
+
+**Solutions:**
+
+1. **Verify API key**:
+
+ - Ensure the key is copied correctly (no extra spaces)
+ - Check key hasn't expired in the Tailscale admin panel
+ - Verify key has appropriate permissions
+
+2. **Network connectivity**:
+ - Ensure Home Assistant can reach Tailscale's API servers
+ - Check firewall rules if running in restricted environments
+
+## Removing the integration
+
+This integration follows standard integration removal.
+
+{% include integrations/remove_device_service.md %}
+
+After removal:
+
+1. Your Tailscale API key remains active
+2. Consider revoking the key in the Tailscale admin panel if no longer needed
+3. Your Tailscale network and devices continue operating normally
diff --git a/source/_integrations/tasmota.markdown b/source/_integrations/tasmota.markdown
index 185dcf63f94..78b10d153a7 100644
--- a/source/_integrations/tasmota.markdown
+++ b/source/_integrations/tasmota.markdown
@@ -31,7 +31,7 @@ This integration allows you to control [Tasmota](https://tasmota.github.io/docs/
- MQTT broker and the [MQTT integration](/integrations/mqtt/) set up in Home Assistant.
- Tasmota devices' MQTT setting configured to communicate with the MQTT broker.
- Tasmota devices flashed with version 9.2, or later (`tasmota-lite.bin` does not support this integration).
-- Tasmota devices configured for native discovery (`SetOption19 0`).
+- Tasmota devices configured for native discovery (`SetOption19 0`). Go to the web interface of your Tasmota device, select **Tools** and then **Console**. Where you can see the placeholder **Enter command** type or paste `SetOption19 0` and hit **Return**.
- Although the Tasmota integration supports custom fulltopic it is strongly suggested to leave fulltopic at its default, Tasmota does not prevent setting an invalid or non-unique fulltopic, for example a fulltopic without the `%prefix%` or `%topic%` tokens.
## Supported features
diff --git a/source/_integrations/tedee.markdown b/source/_integrations/tedee.markdown
index 0c254a7385b..a2f8e82af8c 100644
--- a/source/_integrations/tedee.markdown
+++ b/source/_integrations/tedee.markdown
@@ -58,6 +58,10 @@ This integration supports
- **Semi locked**: indicates whether the lock is in a "semi-locked" position. "Semi-locked" means the lock has been turned manually and is between its normal end positions. The lock itself will be unavailable in this position.
- **Lock uncalibrated** (disabled by default): Shows when the lock is in an "uncalibrated state".
+{% note %}
+The `lock.open` service will only pull the spring if the lock is configured with "**auto pull-spring enabled**" in the tedee app. That is due to a limitation in tedee's API.
+{% endnote %}
+
## Sensors
The integration currently offers two sensors: A **battery** sensor, indicating the charge of your lock, and a **"pull spring duration"** sensor, indicating how long (in seconds) your latch will stay pulled after a pull operation (if supported).
diff --git a/source/_integrations/telegram_bot.markdown b/source/_integrations/telegram_bot.markdown
index bfa1e3fdf11..e91a95ee78e 100644
--- a/source/_integrations/telegram_bot.markdown
+++ b/source/_integrations/telegram_bot.markdown
@@ -8,7 +8,9 @@ ha_iot_class: Cloud Push
ha_config_flow: true
ha_domain: telegram_bot
ha_integration_type: integration
-ha_quality_scale: legacy
+ha_quality_scale: bronze
+ha_codeowners:
+ - '@hanwg'
---
Use Telegram on your mobile or desktop device to send and receive messages or commands to/from your Home Assistant.
@@ -114,7 +116,7 @@ Chat ID:
## Notification actions
-Available actions: `send_message`, `send_photo`, `send_video`, `send_animation`, `send_voice`, `send_sticker`, `send_document`, `send_location`, `edit_message`, `edit_caption`, `edit_replymarkup`, `answer_callback_query`, `delete_message` and `leave_chat`.
+Available actions: `send_message`, `send_photo`, `send_video`, `send_animation`, `send_voice`, `send_sticker`, `send_document`, `send_location`, `edit_message`, `edit_caption`, `edit_replymarkup`, `answer_callback_query`, `delete_message`, `leave_chat` and `set_message_reaction`.
Actions that send contents (`send_*`) will return a list of `message_id`/`chat_id` for messages delivered (in a property called `chats`). This will populate [Response Data](/docs/scripts/perform-actions#use-templates-to-handle-response-data) that you can further utilize in your automations to edit/delete the message later based on the `message_id`. See the example later on this page for usage instructions.
@@ -149,9 +151,9 @@ Send a photo.
| `url` | no | Remote path to an image. |
| `file` | no | Local path to an image. |
| `caption` | yes | The title of the image. |
-| `username` | yes | Username for a URL which requires HTTP authentication. |
-| `password` | yes | Password (or bearer token) for a URL which require HTTP authentication. |
-| `authentication` | yes | Define which authentication method to use. Set to `digest` to use HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. Defaults to `basic`. |
+| `authentication` | yes | Define which authentication method to use. Set to `basic` for HTTP basic authentication, `digest` for HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. |
+| `username` | yes | Username for a URL which requires HTTP `basic` or `digest` authentication. |
+| `password` | yes | Password (or bearer token) for a URL that requires authentication. |
| `target` | yes | An array of pre-authorized chat_ids or user_ids to send the notification to. Defaults to the first allowed chat_id. |
| `parse_mode` | yes | Parser for the message text: `markdownv2`, `html`, `markdown` or `plain_text`. |
| `disable_notification` | yes | True/false for send the message silently. iOS users and web users will not receive a notification, Android users will receive a notification with no sound. Defaults to False. |
@@ -175,9 +177,9 @@ Send a video.
| `url` | no | Remote path to a video. |
| `file` | no | Local path to a video. |
| `caption` | yes | The title of the video. |
-| `username` | yes | Username for a URL which requires HTTP authentication. |
-| `password` | yes | Password (or bearer token) for a URL which require HTTP authentication. |
-| `authentication` | yes | Define which authentication method to use. Set to `digest` to use HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. Defaults to `basic`. |
+| `authentication` | yes | Define which authentication method to use. Set to `basic` for HTTP basic authentication, `digest` for HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. |
+| `username` | yes | Username for a URL which requires HTTP `basic` or `digest` authentication. |
+| `password` | yes | Password (or bearer token) for a URL that requires authentication. |
| `target` | yes | An array of pre-authorized chat_ids or user_ids to send the notification to. Defaults to the first allowed chat_id. |
| `parse_mode` | yes | Parser for the message text: `markdownv2`, `html`, `markdown` or `plain_text`. |
| `disable_notification` | yes | True/false to send the message silently. iOS users and web users will not receive a notification. Android users will receive a notification with no sound. Defaults to False. |
@@ -200,9 +202,9 @@ Send an animation.
| `url` | no | Remote path to a GIF or H.264/MPEG-4 AVC video without sound. |
| `file` | no | Local path to a GIF or H.264/MPEG-4 AVC video without sound. |
| `caption` | yes | The title of the animation. |
-| `username` | yes | Username for a URL which requires HTTP authentication. |
-| `password` | yes | Password (or bearer token) for a URL which require HTTP authentication. |
-| `authentication` | yes | Define which authentication method to use. Set to `digest` to use HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. Defaults to `basic`. |
+| `authentication` | yes | Define which authentication method to use. Set to `basic` for HTTP basic authentication, `digest` for HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. |
+| `username` | yes | Username for a URL which requires HTTP `basic` or `digest` authentication. |
+| `password` | yes | Password (or bearer token) for a URL that requires authentication. |
| `target` | yes | An array of pre-authorized chat_ids or user_ids to send the notification to. Defaults to the first allowed chat_id. |
| `parse_mode` | yes | Parser for the message text: `markdownv2`, `html`, `markdown` or `plain_text`. |
| `disable_notification` | yes | True/false to send the message silently. iOS users and web users will not receive a notification. Android users will receive a notification with no sound. Defaults to False. |
@@ -226,9 +228,9 @@ Send a voice message.
| `url` | no | Remote path to a voice message. |
| `file` | no | Local path to a voice message. |
| `caption` | yes | The title of the voice message. |
-| `username` | yes | Username for a URL which requires HTTP authentication. |
-| `password` | yes | Password (or bearer token) for a URL which require HTTP authentication. |
-| `authentication` | yes | Define which authentication method to use. Set to `digest` to use HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. Defaults to `basic`. |
+| `authentication` | yes | Define which authentication method to use. Set to `basic` for HTTP basic authentication, `digest` for HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. |
+| `username` | yes | Username for a URL which requires HTTP `basic` or `digest` authentication. |
+| `password` | yes | Password (or bearer token) for a URL that requires authentication. |
| `target` | yes | An array of pre-authorized chat_ids or user_ids to send the notification to. Defaults to the first allowed chat_id. |
| `disable_notification` | yes | True/false to send the message silently. iOS users and web users will not receive a notification. Android users will receive a notification with no sound. Defaults to False. |
| `verify_ssl` | yes | True/false for checking the SSL certificate of the server for HTTPS URLs. Defaults to True. |
@@ -251,9 +253,9 @@ Send a sticker.
| `url` | no | Remote path to a static .webp or animated .tgs sticker. |
| `file` | no | Local path to a static .webp or animated .tgs sticker. |
| `sticker_id` | no | ID of a sticker that exists on telegram servers. The ID can be found by sending a sticker to your bot and querying the telegram-api method [getUpdates](https://core.telegram.org/bots/api#getting-updates) or by using the [@idstickerbot](https://t.me/idstickerbot) |
-| `username` | yes | Username for a URL which requires HTTP authentication. |
-| `password` | yes | Password (or bearer token) for a URL which require HTTP authentication. |
-| `authentication` | yes | Define which authentication method to use. Set to `digest` to use HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. Defaults to `basic`. |
+| `authentication` | yes | Define which authentication method to use. Set to `basic` for HTTP basic authentication, `digest` for HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. |
+| `username` | yes | Username for a URL which requires HTTP `basic` or `digest` authentication. |
+| `password` | yes | Password (or bearer token) for a URL that requires authentication. |
| `target` | yes | An array of pre-authorized chat_ids or user_ids to send the notification to. Defaults to the first allowed chat_id. |
| `disable_notification` | yes | True/false for send the message silently. iOS users and web users will not receive a notification, Android users will receive a notification with no sound. Defaults to False. |
| `verify_ssl` | yes | True/false for checking the SSL certificate of the server for HTTPS URLs. Defaults to True. |
@@ -276,9 +278,9 @@ Send a document.
| `url` | no | Remote path to a document. |
| `file` | no | Local path to a document. |
| `caption` | yes | The title of the document. |
-| `username` | yes | Username for a URL which requires HTTP authentication. |
-| `password` | yes | Password (or bearer token) for a URL which require HTTP authentication. |
-| `authentication` | yes | Define which authentication method to use. Set to `digest` to use HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. Defaults to `basic`. |
+| `authentication` | yes | Define which authentication method to use. Set to `basic` for HTTP basic authentication, `digest` for HTTP digest authentication, or `bearer_token` for OAuth 2.0 bearer token authentication. |
+| `username` | yes | Username for a URL which requires HTTP `basic` or `digest` authentication. |
+| `password` | yes | Password (or bearer token) for a URL that requires authentication. |
| `target` | yes | An array of pre-authorized chat_ids or user_ids to send the notification to. Defaults to the first allowed chat_id. |
| `parse_mode` | yes | Parser for the message text: `markdownv2`, `html`, `markdown` or `plain_text`. |
| `disable_notification` | yes | True/false for send the message silently. iOS users and web users will not receive a notification, Android users will receive a notification with no sound. Defaults to False. |
@@ -399,6 +401,18 @@ Remove the bot from the chat group where it was added.
| `config_entry_id` | yes | The config entry representing the Telegram bot to leave the chat. Required if you have multiple Telegram bots.|
| `chat_id` | no | The chat_id from where to remove the bot. |
+### Action `telegram_bot.set_message_reaction`
+
+Sets the bot's reaction for a given message.
+
+| Data data attribute | Optional | Description |
+| ------------------- | -------- | ---------------------------------------------------------------- |
+| `config_entry_id` | yes | The config entry representing the Telegram bot to set the message reaction. Required if you have multiple Telegram bots. |
+| `message_id` | no | Id of the message to react to. |
+| `chat_id` | no | Id of the chat containing the message. |
+| `reaction` | no | Emoji to react to the message with. |
+| `is_big` | yes | Whether to use a large variant of the reaction animation. |
+
## Telegram notification platform
The [`telegram` notification platform](/integrations/telegram) requires the `telegram_bot` integration to work with, and it's designed to generate a customized shortcut (`notify.USERNAME`) to send notifications (messages, photos, documents, and locations) to a particular `chat_id` with the old syntax, allowing backward compatibility. The data attributes `parse_mode`, `disable_notification`, `message_tag`, `disable_web_page_preview`, and `message_thread_id` are also supported.
diff --git a/source/_integrations/template.markdown b/source/_integrations/template.markdown
index 6ad3510d90f..98698b7cfde 100644
--- a/source/_integrations/template.markdown
+++ b/source/_integrations/template.markdown
@@ -22,7 +22,6 @@ ha_iot_class: Local Push
ha_quality_scale: internal
ha_codeowners:
- '@Petro31'
- - '@PhracturedBlue'
- '@home-assistant/core'
ha_domain: template
ha_platforms:
@@ -51,18 +50,22 @@ related:
The `template` integration allows creating entities which derive their values from other data. This is done by specifying [templates](/docs/configuration/templating/) for properties of an entity, like the name or the state.
-Alarm control panels, binary sensors, buttons, covers, fans, images, lights, locks, numbers, selects, sensors, switches, vacuums, and weathers are covered on this page. They can be configured using [UI](#configuration) or [YAML](#yaml-configuration) file.
+There is currently support for the following device types within Home Assistant:
-For Legacy types, please see the specific pages:
-
-- [Alarm control panel](/integrations/alarm_control_panel.template/)
-- [Cover](/integrations/cover.template/)
-- [Fan](/integrations/fan.template/)
-- [Light](/integrations/light.template/)
-- [Lock](/integrations/lock.template/)
-- [Switch](/integrations/switch.template/)
-- [Vacuum](/integrations/vacuum.template/)
-- [Weather](/integrations/weather.template/)
+- [Alarm control panel](#alarm-control-panel)
+- [Binary sensor](#binary-sensor)
+- [Button](#button)
+- [Cover](#cover)
+- [Fan](#fan)
+- [Image](#image)
+- [Light](#light)
+- [Lock](#lock)
+- [Number](#number)
+- [Select](#select)
+- [Sensor](#sensor)
+- [Switch](#switch)
+- [Vacuum](#vacuum)
+- [Weather](#weather)
{% include integrations/config_flow.md %}
@@ -78,11 +81,9 @@ If you need more specific features for your use case, the manual [YAML-configura
## YAML configuration
-Entities (alarm control panels, binary sensors, buttons, covers, fans, images, lights, locks, numbers, selects, sensors, switches, vacuums, and weathers) are defined in your YAML configuration files under the `template:` key. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain optional update triggers.
+Entities are defined in your YAML configuration files under the `template:` key. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain optional update triggers.
-_For old sensor/binary sensor configuration format, [see below](#legacy-binary-sensor-configuration-format)._
-
-### State-based template alarm control panels, binary sensors, buttons, covers, fans, images, lights, numbers, selects, sensors, switches, vacuums, and weathers
+### State-based template entities
Template entities will by default update as soon as any of the referenced data in the template updates.
@@ -104,7 +105,7 @@ template:
{% endraw %}
-### Trigger-based template binary sensors, images, lights, numbers, selects, sensors, switches, and weathers
+### Trigger-based template entities
If you want more control over when an entity updates, you can define triggers. 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.
@@ -140,6 +141,14 @@ template:
### Configuration reference
{% configuration %}
+actions:
+ description: Define actions to be executed when the trigger fires (for trigger-based entities only). Optional. Variables set by the action script are available when evaluating entity templates. This can be used to interact with anything using actions, in particular actions with [response data](/docs/scripts/perform-actions#use-templates-to-handle-response-data). [See action documentation](/docs/automation/action).
+ required: false
+ type: list
+conditions:
+ description: Define conditions that have to be met after a trigger fires and before any actions are executed or sensor updates are performed (for trigger-based entities only). Optional. [See condition documentation](/docs/automation/condition).
+ required: false
+ type: list
triggers:
description: Define one or multiple automation triggers to update the entities. Optional. If omitted will update based on referenced entities. [See trigger documentation](/docs/automation/trigger).
required: false
@@ -148,16 +157,8 @@ unique_id:
description: The unique ID for this config block. This will be prefixed to all unique IDs of all entities in this block.
required: false
type: string
-conditions:
- description: Define conditions that have to be met after a trigger fires and before any actions are executed or sensor updates are performed (for trigger-based entities only). Optional. [See condition documentation](/docs/automation/condition).
- required: false
- type: list
-actions:
- description: Define actions to be executed when the trigger fires (for trigger-based entities only). Optional. Variables set by the action script are available when evaluating entity templates. This can be used to interact with anything using actions, in particular actions with [response data](/docs/scripts/perform-actions#use-templates-to-handle-response-data). [See action documentation](/docs/automation/action).
- required: false
- type: list
variables:
- description: Key-value pairs of variable definitions which can be referenced and used in the templates below (for trigger-based entities only). Mostly used by blueprints.
+ description: Key-value pairs of variable definitions which can be referenced and used in the templates below (for trigger-based entities only). Mostly used by blueprints. With State-based template entities, variables are only resolved when the configuration is loaded or reloaded. Trigger based template entities resolve variables between triggers and actions.
required: false
type: map
keys:
@@ -165,91 +166,122 @@ variables:
description: The variable name and corresponding value.
required: true
type: string
-sensor:
- description: List of sensors
- required: true
- type: list
- keys:
- state:
- description: "Defines a template to get the state of the sensor. If the sensor is numeric, i.e. it has a `state_class` or a `unit_of_measurement`, the state template must render to a number or to `none`. The state template must not render to a string, including `unknown` or `unavailable`. An `availability` template may be defined to suppress rendering of the state template."
- required: true
- type: template
- unit_of_measurement:
- description: "Defines the units of measurement of the sensor, if any. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value."
- required: false
- type: string
- default: None
- state_class:
- description: "The [state_class](https://developers.home-assistant.io/docs/core/entity/sensor#available-state-classes) of the sensor. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value. If you desire to include the sensor in long-term statistics, include this key and assign it the appropriate value"
- required: false
- type: string
- default: None
- last_reset:
- description: "Defines a template that describes when the state of the sensor was last reset. Must render to a valid `datetime`. Only available when `state_class` is set to `total`"
- required: false
- type: template
- default: None
-binary_sensor:
- description: List of binary sensors
- required: true
- type: list
- keys:
- state:
- description: The sensor is `on` if the template evaluates as `True`, `yes`, `on`, `enable` or a positive number. Any other value will render it as `off`. The actual appearance in the frontend (`Open`/`Closed`, `Detected`/`Clear` etc) depends on the sensor's device_class value
- required: true
- type: template
- delay_on:
- description: The amount of time (e.g. `0:00:05`) the template state must be ***met*** before this sensor will switch to `on`. This can also be a template.
- required: false
- type: time
- delay_off:
- description: The amount of time the template state must be ***not met*** before this sensor will switch to `off`. This can also be a template.
- required: false
- type: time
- auto_off:
- description: "**Requires a trigger.** After how much time the entity should turn off after it rendered 'on'."
- required: false
- type: time
-"[both sensor and binary_sensor entities]":
- description: Fields that can be used above for both sensors and binary sensors.
- required: false
- type: map
- keys:
- picture:
- description: Defines a template for the entity picture of the sensor.
- required: false
- type: template
- attributes:
- description: Defines templates for attributes of the sensor.
- required: false
- type: map
- keys:
- "attribute: template":
- description: The attribute and corresponding template.
- required: true
- type: template
- device_class:
- description: Sets the class of the device, changing the device state and icon that is displayed on the UI (see below). It does not set the `unit_of_measurement`.
- required: false
- type: device_class
- default: None
+
+{% endconfiguration %}
+
+## Common Device Configuration Options
+
+Each entity platform has its own set of configuration options, but there are some common options that can be used across all entity platforms.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - binary_sensor:
+ # Common configuration options
+ - unique_id: my_unique_sensor_id
+ variables:
+ my_entity: sensor.watts
+ availability: "{{ my_entity | has_value }}"
+ icon: "{{ 'mdi:flash-alert' if states(my_entity) | float > 100 else 'mdi:flash' }}"
+ name: "{{ states(my_entity) }} Alert"
+ # Entity specific configuration options
+ state: "{{ states(my_entity) | float > 100}}"
+ device_class: problem
+```
+
+{% endraw %}
+
+{% configuration %}
+ availability:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ icon:
+ description: Defines a template for the icon of the entity.
+ required: false
+ type: template
+ picture:
+ description: Defines a template for the entity picture of the sensor.
+ required: false
+ type: template
+ name:
+ description: Defines a template to get the name of the entity.
+ required: false
+ type: template
+ unique_id:
+ description: An ID that uniquely identifies this entity. Will be combined with the unique ID of the configuration block if available. This allows changing the `name`, `icon` and `entity_id` from the web interface.
+ required: false
+ type: string
+ variables:
+ description: Key-value pairs of variable definitions which can be referenced and used in the templates below (for trigger-based entities only). Mostly used by blueprints. With State-based template entities, variables are only resolved when the configuration is loaded or reloaded. Trigger based template entities resolve variables between triggers and actions.
+ required: false
+ type: map
+ keys:
+ "variable_name: value":
+ description: The variable name and corresponding value.
+ required: true
+ type: string
+
+{% endconfiguration %}
+
+## Alarm Control Panel
+
+The template alarm control panel platform allows you to create a alarm control panels with templates to define the state and scripts to define each actions.
+
+Alarm control panel entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - alarm_control_panel:
+ - name: "Alarm Control Panel 1"
+ state: "{{ states('input_select.panel_1_state') }}"
+ arm_away:
+ action: script.arm_panel_away
+ arm_home:
+ action: script.arm_panel_home
+ disarm:
+ action: script.disarm_panel
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: input_select.panel_1_state
+ alarm_control_panel:
+ - name: "Alarm Control Panel 1"
+ state: "{{ states('input_select.panel_1_state') }}"
+ arm_away:
+ action: script.arm_panel_away
+ arm_home:
+ action: script.arm_panel_home
+ disarm:
+ action: script.disarm_panel
+```
+
+{% endraw %}
+
+{% configuration %}
alarm_control_panel:
description: List of alarm control panels
required: true
type: map
keys:
- state:
- description: "Defines a template to set the state of the alarm panel. Only the states `armed_away`, `armed_home`, `armed_night`, `armed_vacation`, `arming`, `disarmed`, `pending`, `triggered` and `unavailable` are used."
- required: false
- type: template
- disarm:
- description: Defines an action to run when the alarm is disarmed.
- required: false
- type: action
arm_away:
description: Defines an action to run when the alarm is armed to away mode.
required: false
type: action
+ arm_custom_bypass:
+ description: Defines an action to run when the alarm is armed to custom bypass mode.
+ required: false
+ type: action
arm_home:
description: Defines an action to run when the alarm is armed to home mode.
required: false
@@ -262,14 +294,6 @@ alarm_control_panel:
description: Defines an action to run when the alarm is armed to vacation mode.
required: false
type: action
- arm_custom_bypass:
- description: Defines an action to run when the alarm is armed to custom bypass mode.
- required: false
- type: action
- trigger:
- description: Defines an action to run when the alarm is triggered.
- required: false
- type: action
code_arm_required:
description: If true, the code is required to arm the alarm.
required: false
@@ -280,65 +304,239 @@ alarm_control_panel:
required: false
type: string
default: number
-number:
- description: List of numbers
- required: true
- type: map
- keys:
- state:
- description: Template for the number's current value.
- required: true
- type: template
- unit_of_measurement:
- description: Defines the units of measurement of the number, if any.
+ disarm:
+ description: Defines an action to run when the alarm is disarmed.
required: false
- type: string
+ type: action
+ state:
+ description: "Defines a template to set the state of the alarm panel. Only the states `armed_away`, `armed_home`, `armed_night`, `armed_vacation`, `arming`, `disarmed`, `pending`, `triggered` and `unavailable` are used."
+ required: false
+ type: template
+ trigger:
+ description: Defines an action to run when the alarm is triggered.
+ required: false
+ type: action
+{% endconfiguration %}
+
+## Binary Sensor
+
+The template binary sensor platform allows you to create binary sensors with templates to define the state and attributes.
+
+Binary sensor entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - binary_sensor:
+ - name: Sun Up
+ state: >
+ {{ is_state("sun.sun", "above_horizon") }}
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sun.sun
+ binary_sensor:
+ - name: Sun Up
+ state: >
+ {{ is_state("sun.sun", "above_horizon") }}
+```
+
+{% endraw %}
+
+{% configuration %}
+binary_sensor:
+ description: List of binary sensors
+ required: true
+ type: list
+ keys:
+ attributes:
+ description: Defines templates for attributes of the entity.
+ required: false
+ type: map
+ keys:
+ "attribute: template":
+ description: The attribute and corresponding template.
+ required: true
+ type: template
+ auto_off:
+ description: "**Requires a trigger.** After how much time the entity should turn off after it rendered 'on'."
+ required: false
+ type: time
+ delay_off:
+ description: The amount of time the template state must be ***not met*** before this sensor will switch to `off`. This can also be a template.
+ required: false
+ type: time
+ delay_on:
+ description: The amount of time (e.g. `0:00:05`) the template state must be ***met*** before this sensor will switch to `on`. This can also be a template.
+ required: false
+ type: time
+ device_class:
+ description: Sets the class of the device, changing the device state and icon that is displayed on the UI (see below). It does not set the `unit_of_measurement`.
+ required: false
+ type: device_class
default: None
- set_value:
- description: Defines actions to run when the number value changes. The variable `value` will contain the number entered.
- required: true
- type: action
- step:
- description: Template for the number's increment/decrement step.
- required: true
- type: template
- min:
- description: Template for the number's minimum value.
- required: false
- type: template
- default: 0.0
- max:
- description: Template for the number's maximum value.
- required: false
- type: template
- default: 100.0
- optimistic:
- description: Flag that defines if number works in optimistic mode. When enabled, the number's state will update immediately when changed through the UI or service calls, without waiting for the template defined in `state` to update. When disabled (default), the number will only update when the `state` template returns a new value.
- required: false
- type: boolean
- default: false
-select:
- description: List of selects
- required: true
- type: map
- keys:
state:
- description: Template for the select's current value.
+ description: The sensor is `on` if the template evaluates as `True`, `yes`, `on`, `enable` or a positive number. The sensor is `unknown` if the template evaluates as `None`. Any other value will render it as `off`. The actual appearance in the frontend (`Open`/`Closed`, `Detected`/`Clear` etc) depends on the sensor's device_class value
required: true
type: template
- select_option:
- description: Defines actions to run to select an option from the `options` list. The variable `option` will contain the option selected.
- required: true
- type: action
- options:
- description: Template for the select's available options.
- required: true
- type: template
- optimistic:
- description: Flag that defines if select works in optimistic mode. When enabled, the select's state will update immediately when a new option is chosen through the UI or service calls, without waiting for the template defined in `state` to update. When disabled (default), the select will only update when the `state` template returns a new value.
- required: false
- type: boolean
- default: false
+
+{% endconfiguration %}
+
+### State based binary sensor - Washing Machine Running
+
+This example creates a washing machine "load running" sensor by monitoring an
+energy meter connected to the washer. During the washer's operation, the energy meter will fluctuate wildly, hitting zero frequently even before the load is finished. By utilizing `delay_off`, we can have this sensor only turn off if there has been no washer activity for 5 minutes.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+# Determine when the washing machine has a load running.
+template:
+ - binary_sensor:
+ - name: "Washing Machine"
+ delay_off:
+ minutes: 5
+ state: >
+ {{ states('sensor.washing_machine_power')|float > 0 }}
+```
+
+{% endraw %}
+
+### State based binary sensor - Is Anyone Home
+
+This example is determining if anyone is home based on the combination of device tracking and motion sensors. It's extremely useful if you have kids/baby sitter/grand parents who might still be in your house that aren't represented by a trackable device in Home Assistant. This is providing a composite of Wi-Fi based device tracking and Z-Wave multisensor presence sensors.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - binary_sensor:
+ - name: People home
+ state: >
+ {{ is_state('device_tracker.sean', 'home')
+ or is_state('device_tracker.susan', 'home')
+ or is_state('binary_sensor.office_124', 'on')
+ or is_state('binary_sensor.hallway_134', 'on')
+ or is_state('binary_sensor.living_room_139', 'on')
+ or is_state('binary_sensor.porch_ms6_1_129', 'on')
+ or is_state('binary_sensor.family_room_144', 'on') }}
+```
+
+{% endraw %}
+
+### State based binary sensor - device tracker sensor with latitude and longitude attributes
+
+This example shows how to combine a non-GPS (e.g., NMAP) and GPS device tracker while still including latitude and longitude attributes
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - binary_sensor:
+ - name: My Device
+ state: >
+ {{ is_state('device_tracker.my_device_nmap', 'home') or is_state('device_tracker.my_device_gps', 'home') }}
+ device_class: "presence"
+ attributes:
+ latitude: >
+ {% if is_state('device_tracker.my_device_nmap', 'home') %}
+ {{ state_attr('zone.home', 'latitude') }}
+ {% else %}
+ {{ state_attr('device_tracker.my_device_gps', 'latitude') }}
+ {% endif %}
+ longitude: >
+ {% if is_state('device_tracker.my_device_nmap', 'home') %}
+ {{ state_attr('zone.home', 'longitude') }}
+ {% else %}
+ {{ state_attr('device_tracker.my_device_gps', 'longitude') }}
+ {% endif %}
+```
+
+{% endraw %}
+
+### State based binary sensor - Change the icon when a state changes
+
+This example demonstrates how to use template to change the icon as its state changes. This icon is referencing its own state.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - binary_sensor:
+ - name: Sun Up
+ state: >
+ {{ is_state("sun.sun", "above_horizon") }}
+ icon: >
+ {% if is_state("binary_sensor.sun_up", "on") %}
+ mdi:weather-sunset-up
+ {% else %}
+ mdi:weather-sunset-down
+ {% endif %}
+```
+
+{% endraw %}
+
+### Trigger based binary sensor - Change state and icon when a custom event is received
+
+A more advanced use case could be to set the icon based on the sensor's own state like above, but when triggered by an event. This example demonstrates a binary sensor that turns on momentarily, such as when a doorbell button is pressed.
+
+The binary sensor turns on and sets the matching icon when the appropriate event is received. After 5 seconds, the binary sensor turns off automatically. To ensure the icon gets updated, there must be a trigger for when the state changes to off.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - triggers:
+ - trigger: event
+ event_type: YOUR_EVENT
+ - trigger: state
+ entity_id: binary_sensor.doorbell_rang
+ to: "off"
+ binary_sensor:
+ name: doorbell_rang
+ icon: "{{ (trigger.platform == 'event') | iif('mdi:bell-ring-outline', 'mdi:bell-outline') }}"
+ state: "{{ trigger.platform == 'event' }}"
+ auto_off:
+ seconds: 5
+```
+
+{% endraw %}
+
+## Button
+
+The template button platform allows you to create button entities with scripts to define each action.
+
+Button entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - button:
+ - name: Fast Forward
+ press:
+ action: remote.send_command
+ target:
+ entity_id: remote.living_room
+ data:
+ command: fast_forward
+```
+
+{% endraw %}
+
+{% configuration %}
button:
description: List of buttons
required: true
@@ -348,34 +546,77 @@ button:
description: Defines actions to run to press the button.
required: true
type: action
+{% endconfiguration %}
+
+## Cover
+
+The template cover platform allows you to create covers with templates to define the state and scripts to define each action.
+
+Cover entities can only be created from YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - cover:
+ - name: Garage Door
+ state: "{{ states('sensor.garage_door')|float > 0 }}"
+ device_class: garage
+ open_cover:
+ action: script.open_garage_door
+ close_cover:
+ action: script.close_garage_door
+ stop_cover:
+ action: script.stop_garage_door
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sensor.garage_door
+ cover:
+ - name: Garage Door
+ state: "{{ trigger.to_state.state|float(0) > 0 }}"
+ device_class: garage
+ open_cover:
+ action: script.open_garage_door
+ close_cover:
+ action: script.close_garage_door
+ stop_cover:
+ action: script.stop_garage_door
+```
+
+{% endraw %}
+
+{% configuration %}
cover:
description: Characteristics of a cover
type: map
keys:
- state:
- description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `value_template` and a `position_template`](#combining-value_template-and-position_template) are specified, only `opening` and `closing` are set from the `value_template`. If the template produces a `None` value the state will be set to `unknown`.
- required: false
- type: template
- position:
- description: Defines a template to get the position of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current position will be set to `unknown`.
- required: false
- type: template
+ close_cover:
+ description: Defines an action to close the cover.
+ required: inclusive
+ type: action
device_class:
description: Sets the [class of the device](/integrations/cover/), changing the device state and icon that is displayed on the frontend.
required: false
type: string
open_cover:
- description: Defines an action to open the cover. If [`open_cover`](#open_cover) is specified, [`close_cover`](#close_cover) must also be specified. At least one of [`open_cover`](#open_cover) and [`set_cover_position`](#set_cover_position) must be specified.
+ description: Defines an action to open the cover. If `open_cover` is specified, `close_cover` must also be specified. At least one of `open_cover` and `set_cover_position` must be specified.
required: inclusive
type: action
- close_cover:
- description: Defines an action to close the cover.
- required: inclusive
- type: action
- stop_cover:
- description: Defines an action to stop the cover.
+ optimistic:
+ description: Force cover position to use [optimistic mode](#cover-optimistic-mode).
required: false
- type: action
+ type: boolean
+ default: false
+ position:
+ description: Defines a template to get the position of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current position will be set to `unknown`.
+ required: false
+ type: template
set_cover_position:
description: Defines an action to set to a cover position (between `0` and `100`). The variable `position` will contain the entity's set position.
required: false
@@ -384,28 +625,216 @@ cover:
description: Defines an action to set the tilt of a cover (between `0` and `100`). The variable `tilt` will contain the entity's set tilt position.
required: false
type: action
- optimistic:
- description: Force cover position to use [optimistic mode](#optimistic-mode).
- required: false
- type: boolean
- default: false
- tilt_optimistic:
- description: Force cover tilt position to use [optimistic mode](#optimistic-mode).
- required: false
- type: boolean
- default: false
- tilt:
- description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value, the current tilt state will be set to `unknown`.
+ state:
+ description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `state` and a `position` template](#combining-state-and-position-templates) are specified, only `opening` and `closing` are set from the `state` template. If the template produces a `None` value the state will be set to `unknown`.
required: false
type: template
+ stop_cover:
+ description: Defines an action to stop the cover.
+ required: false
+ type: action
+ tilt:
+ description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value, the current tilt state will be set to `unknown`.
+ required: false
+ type: template
+ tilt_optimistic:
+ description: Force cover tilt position to use [optimistic mode](#cover-optimistic-mode).
+ required: false
+ type: boolean
+ default: false
+
+{% endconfiguration %}
+
+### Cover Optimistic Mode
+
+In optimistic mode, the cover position state is maintained internally. This mode is automatically enabled if neither `state` or `position` are specified. Note that this is unlikely to be very reliable without some feedback mechanism, since there is otherwise no way to know if the cover is moving properly. The cover can be forced into optimistic mode by using the `optimistic` attribute. There is an equivalent mode for `tilt_position` that is enabled when `tilt` is not specified or when the `tilt_optimistic` attribute is used.
+
+### Combining `state` and `position` templates
+
+If both a `state` and a `position` are specified only `opening` and `closing` states are set directly from the `state`, the `open` and `closed` states will instead be derived from the cover position.
+
+| value_template output | result |
+| --------------------- | ------------------------------------ |
+| open | state defined by `position_template` |
+| closed | state defined by `position_template` |
+| true | state defined by `position_template` |
+| false | state defined by `position_template` |
+| opening | state set to `opening` |
+| closing | state set to `closing` |
+| | No change of state or position |
+
+### State based cover - Garage Door
+
+This example converts a garage door with a controllable switch and position sensor into a cover. The condition check is optional, but suggested if you use the same switch to open and close the garage.
+
+{% raw %}
+
+```yaml
+template:
+ - cover:
+ - name: Garage Door
+ device_class: garage
+ position: "{{ states('sensor.garage_door') }}"
+ open_cover:
+ - condition: state
+ entity_id: sensor.garage_door
+ state: "off"
+ - action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+ close_cover:
+ - condition: state
+ entity_id: sensor.garage_door
+ state: "on"
+ - action: switch.turn_off
+ target:
+ entity_id: switch.garage_door
+ stop_cover:
+ action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+ icon: >-
+ {% if states('sensor.garage_door')|float > 0 %}
+ mdi:garage-open
+ {% else %}
+ mdi:garage
+ {% endif %}
+```
+
+{% endraw %}
+
+### State based cover - Optimistic Garage Door with Momentary Switch
+
+This example converts a garage door with a momentary switch.
+
+{% raw %}
+
+```yaml
+template:
+ - cover:
+ - name: Garage Door
+ device_class: garage
+ open_cover:
+ - action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+ close_cover:
+ - action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+ stop_cover:
+ - action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+```
+
+{% endraw %}
+
+## Fan
+
+The template fan platform allows you to create fans with templates to define the state and scripts to define each action.
+
+Fan entities can only be created from YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - fan:
+ - name: "Bedroom fan"
+ state: "{{ states('input_boolean.state') }}"
+ percentage: "{{ states('input_number.percentage') }}"
+ preset_mode: "{{ states('input_select.preset_mode') }}"
+ oscillating: "{{ states('input_select.osc') }}"
+ direction: "{{ states('input_select.direction') }}"
+ turn_on:
+ action: script.fan_on
+ turn_off:
+ action: script.fan_off
+ set_percentage:
+ action: script.fans_set_speed
+ data:
+ percentage: "{{ percentage }}"
+ set_preset_mode:
+ action: script.fans_set_preset_mode
+ data:
+ preset_mode: "{{ preset_mode }}"
+ set_oscillating:
+ action: script.fan_oscillating
+ data:
+ oscillating: "{{ oscillating }}"
+ set_direction:
+ action: script.fan_direction
+ data:
+ direction: "{{ direction }}"
+ speed_count: 6
+ preset_modes:
+ - 'auto'
+ - 'smart'
+ - 'whoosh'
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id:
+ - input_boolean.state
+ - input_number.percentage
+ - input_select.preset_mode
+ - input_select.osc
+ - input_select.direction
+ fan:
+ - name: "Bedroom fan"
+ state: "{{ states('input_boolean.state') }}"
+ percentage: "{{ states('input_number.percentage') }}"
+ preset_mode: "{{ states('input_select.preset_mode') }}"
+ oscillating: "{{ states('input_select.osc') }}"
+ direction: "{{ states('input_select.direction') }}"
+ turn_on:
+ action: script.fan_on
+ turn_off:
+ action: script.fan_off
+ set_percentage:
+ action: script.fans_set_speed
+ data:
+ percentage: "{{ percentage }}"
+ set_preset_mode:
+ action: script.fans_set_preset_mode
+ data:
+ preset_mode: "{{ preset_mode }}"
+ set_oscillating:
+ action: script.fan_oscillating
+ data:
+ oscillating: "{{ oscillating }}"
+ set_direction:
+ action: script.fan_direction
+ data:
+ direction: "{{ direction }}"
+ speed_count: 6
+ preset_modes:
+ - 'auto'
+ - 'smart'
+ - 'whoosh'
+```
+
+{% endraw %}
+
+{% configuration %}
fan:
description: List of fans
required: true
type: map
keys:
- state:
- description: "Defines a template to get the state of the fan. Valid values: `on`, `off`."
- required: true
+ oscillating:
+ description: "Defines a template to get the osc state of the fan. Valid values: `true`, `false`."
+ required: false
+ type: template
+ direction:
+ description: "Defines a template to get the direction of the fan. Valid values: `forward`, `reverse`."
+ required: false
type: template
percentage:
description: Defines a template to get the speed percentage of the fan.
@@ -415,22 +844,11 @@ fan:
description: Defines a template to get the preset mode of the fan.
required: false
type: template
- oscillating:
- description: "Defines a template to get the osc state of the fan. Valid values: `true`, `false`."
+ preset_modes:
+ description: List of preset modes the fan is capable of. This is an arbitrary list of strings and must not contain any speeds.
required: false
- type: template
- direction:
- description: "Defines a template to get the direction of the fan. Valid values: `forward`, `reverse`."
- required: false
- type: template
- turn_on:
- description: Defines an action to run when the fan is turned on.
- required: true
- type: action
- turn_off:
- description: Defines an action to run when the fan is turned off.
- required: true
- type: action
+ type: [string, list]
+ default: []
set_percentage:
description: Defines an action to run when the fan is given a speed percentage command.
required: false
@@ -447,16 +865,170 @@ fan:
description: Defines an action to run when the fan is given a direction command.
required: false
type: action
- preset_modes:
- description: List of preset modes the fan is capable of. This is an arbitrary list of strings and must not contain any speeds.
- required: false
- type: [string, list]
- default: []
speed_count:
description: The number of speeds the fan supports. Used to calculate the percentage step for the `fan.increase_speed` and `fan.decrease_speed` actions.
required: false
type: integer
default: 100
+ state:
+ description: "Defines a template to get the state of the fan. Valid values: `on`, `off`."
+ required: true
+ type: template
+ turn_on:
+ description: Defines an action to run when the fan is turned on.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action to run when the fan is turned off.
+ required: true
+ type: action
+
+{% endconfiguration %}
+
+### Converting from speeds to percentage
+
+When converting a fan with 3 speeds from the old fan entity model, the following percentages can be used:
+
+0 - `off`
+33 - `low`
+66 - `medium`
+100 - `high`
+
+### State based fan - Helper fan
+
+This example uses an input_boolean and an input_number to mimic a fan, and the example shows multiple actions for `set_percentage`.
+
+{% raw %}
+
+```yaml
+template:
+ - fan:
+ - name: "Helper Fan"
+ state: "{{ states('input_boolean.state') }}"
+ turn_on:
+ - action: input_boolean.turn_on
+ target:
+ entity_id: input_boolean.state
+ turn_off:
+ - action: input_boolean.turn_off
+ target:
+ entity_id: input_boolean.state
+ speed_count: 6
+ percentage: >
+ {{ states('input_number.percentage') if is_state('input_boolean.state', 'on') else 0 }}
+ set_percentage:
+ - action: input_boolean.turn_{{ 'on' if percentage > 0 else 'off' }}
+ target:
+ entity_id: input_boolean.state
+ - action: input_number.set_value
+ target:
+ entity_id: input_number.percentage
+ data:
+ value: "{{ percentage }}"
+```
+
+{% endraw %}
+
+### State based fan - Fan with preset modes
+
+This example uses an existing fan with only a percentage. It extends the percentage value into useable preset modes without a helper entity.
+
+{% raw %}
+
+```yaml
+template:
+ - fan:
+ - name: "Preset Mode Fan Example"
+ state: "{{ states('fan.percentage_fan') }}"
+ turn_on:
+ - action: fan.turn_on
+ target:
+ entity_id: fan.percentage_fan
+ turn_off:
+ - action: fan.turn_off
+ target:
+ entity_id: fan.percentage_fan
+ percentage: >
+ {{ state_attr('fan.percentage_fan', 'percentage') }}
+ speed_count: 3
+ set_percentage:
+ - action: fan.set_percentage
+ target:
+ entity_id: fan.percentage_fan
+ data:
+ percentage: "{{ percentage }}"
+ preset_modes:
+ - "off"
+ - "low"
+ - "medium"
+ - "high"
+ preset_mode: >
+ {% if is_state('fan.percentage_fan', 'on') %}
+ {% if state_attr('fan.percentage_fan', 'percentage') == 100 %}
+ high
+ {% elif state_attr('fan.percentage_fan', 'percentage') == 66 %}
+ medium
+ {% else %}
+ low
+ {% endif %}
+ {% else %}
+ off
+ {% endif %}
+ set_preset_mode:
+ - action: fan.set_percentage
+ target:
+ entity_id: fan.percentage_fan
+ data:
+ percentage: >-
+ {% if preset_mode == 'high' %}
+ 100
+ {% elif preset_mode == 'medium' %}
+ 66
+ {% elif preset_mode == 'low' %}
+ 33
+ {% else %}
+ 0
+ {% endif %}
+```
+
+{% endraw %}
+
+## Image
+
+The template image platform allows you to create image entities with templates to define the image URL.
+
+Image entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - image:
+ - name: "My Image"
+ url: "http://example.com/image.jpg"
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id:
+ - input_boolean.state
+ image:
+ - name: "My Image"
+ url: >
+ {% if is_state('input_boolean.state', 'on') %}
+ http://example.com/image_on.jpg
+ {% else %}
+ http://example.com/image_off.jpg
+ {% endif %}
+```
+
+{% endraw %}
+
+{% configuration %}
image:
description: List of images
required: true
@@ -471,13 +1043,142 @@ image:
required: false
type: boolean
default: true
+{% endconfiguration %}
+
+## Light
+
+The template light platform allows you to create lights with templates to define the state and scripts to define each action.
+
+Light entities can only be created from YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+light:
+ - light:
+ - name: "Theater Lights"
+ level: "{{ state_attr('sensor.theater_brightness', 'lux')|int }}"
+ state: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}"
+ temperature: "{{states('input_number.temperature_input') | int}}"
+ hs_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})"
+ effect_list: "{{ state_attr('light.led_strip', 'effect_list') }}"
+ turn_on:
+ action: script.theater_lights_on
+ turn_off:
+ action: script.theater_lights_off
+ set_level:
+ action: script.theater_lights_level
+ data:
+ brightness: "{{ brightness }}"
+ set_temperature:
+ action: input_number.set_value
+ data:
+ value: "{{ color_temp }}"
+ entity_id: input_number.temperature_input
+ set_hs:
+ - action: input_number.set_value
+ data:
+ value: "{{ h }}"
+ entity_id: input_number.h_input
+ - action: input_number.set_value
+ data:
+ value: "{{ s }}"
+ entity_id: input_number.s_input
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ transition: "{{ transition | float }}"
+ hs_color:
+ - "{{ hs[0] }}"
+ - "{{ hs[1] }}"
+ set_effect:
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ effect: "{{ effect }}"
+ supports_transition: "{{ true }}"
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id:
+ - sensor.theater_brightness
+ - input_number.temperature_input
+ - input_number.h_input
+ - input_number.s_input
+ - light.led_strip
+ light:
+ - name: "Theater Lights"
+ level: "{{ state_attr('sensor.theater_brightness', 'lux')|int }}"
+ state: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}"
+ temperature: "{{states('input_number.temperature_input') | int}}"
+ hs_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})"
+ effect_list: "{{ state_attr('light.led_strip', 'effect_list') }}"
+ turn_on:
+ action: script.theater_lights_on
+ turn_off:
+ action: script.theater_lights_off
+ set_level:
+ action: script.theater_lights_level
+ data:
+ brightness: "{{ brightness }}"
+ set_temperature:
+ action: input_number.set_value
+ data:
+ value: "{{ color_temp }}"
+ entity_id: input_number.temperature_input
+ set_hs:
+ - action: input_number.set_value
+ data:
+ value: "{{ h }}"
+ entity_id: input_number.h_input
+ - action: input_number.set_value
+ data:
+ value: "{{ s }}"
+ entity_id: input_number.s_input
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ transition: "{{ transition | float }}"
+ hs_color:
+ - "{{ hs[0] }}"
+ - "{{ hs[1] }}"
+ set_effect:
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ effect: "{{ effect }}"
+ supports_transition: "{{ true }}"
+```
+
+{% endraw %}
+
+{% configuration %}
light:
description: List of your lights.
required: true
type: map
keys:
- state:
- description: Defines a template to set the state of the light. If not defined, the switch will optimistically assume all commands are successful.
+ effect:
+ description: Defines a template to get the effect of the light.
+ required: inclusive
+ type: template
+ default: optimistic
+ effect_list:
+ description: Defines a template to get the list of supported effects. Must render a list.
+ required: inclusive
+ type: template
+ default: optimistic
+ hs:
+ description: Defines a template to get the HS color of the light. Must render a tuple (hue, saturation).
required: false
type: template
default: optimistic
@@ -486,13 +1187,13 @@ light:
required: false
type: template
default: optimistic
- temperature:
- description: Defines a template to get the color temperature of the light.
+ min_mireds:
+ description: Defines a template to get the minimum mired value of the light.
required: false
type: template
default: optimistic
- hs:
- description: Defines a template to get the HS color of the light. Must render a tuple (hue, saturation).
+ max_mireds:
+ description: Defines a template to get the maximum mired value of the light.
required: false
type: template
default: optimistic
@@ -511,38 +1212,9 @@ light:
required: false
type: template
default: optimistic
- supports_transition:
- description: Defines a template to get if the light supports transition. Should return a boolean value (True/False). If this value is `True`, the transition parameter in a `turn on` or `turn off` call will be passed as a named parameter `transition` in either of the scripts.
- required: false
- type: template
- default: false
- effect_list:
- description: Defines a template to get the list of supported effects. Must render a list.
+ set_effect:
+ description: Defines an action to run when the light is given an effect command. Receives the variable `effect`. May also receive the variables `brightness`, and/or `transition`.
required: inclusive
- type: template
- default: optimistic
- effect:
- description: Defines a template to get the effect of the light.
- required: inclusive
- type: template
- default: optimistic
- min_mireds:
- description: Defines a template to get the minimum mired value of the light.
- required: false
- type: template
- default: optimistic
- max_mireds:
- description: Defines a template to get the maximum mired value of the light.
- required: false
- type: template
- default: optimistic
- turn_on:
- description: Defines an action to run when the light is turned on. May receive the variables `brightness` and/or `transition`.
- required: true
- type: action
- turn_off:
- description: Defines an action to run when the light is turned off. May receive the variable `transition`.
- required: true
type: action
set_level:
description: Defines an action to run when the light is given a brightness command. The script will only be called if the `turn_on` call only ha brightness, and optionally transition. Receives variables `brightness` and, optionally, `transition`.
@@ -568,19 +1240,193 @@ light:
description: "Defines an action to run when the light is given an RGBWW color command. Available variables: `rgbww` as a tuple, `rgb` as a tuple, `r`, `g` `b`, `cw` and `ww`."
required: false
type: action
- set_effect:
- description: Defines an action to run when the light is given an effect command. Receives the variable `effect`. May also receive the variables `brightness`, and/or `transition`.
- required: inclusive
+ state:
+ description: Defines a template to set the state of the light. If not defined, the switch will optimistically assume all commands are successful.
+ required: false
+ type: template
+ default: optimistic
+ supports_transition:
+ description: Defines a template to get if the light supports transition. Should return a boolean value (True/False). If this value is `True`, the transition parameter in a `turn on` or `turn off` call will be passed as a named parameter `transition` in either of the scripts.
+ required: false
+ type: template
+ default: false
+ temperature:
+ description: Defines a template to get the color temperature of the light.
+ required: false
+ type: template
+ default: optimistic
+ turn_on:
+ description: Defines an action to run when the light is turned on. May receive the variables `brightness` and/or `transition`.
+ required: true
type: action
+ turn_off:
+ description: Defines an action to run when the light is turned off. May receive the variable `transition`.
+ required: true
+ type: action
+
+{% endconfiguration %}
+
+### Light Considerations
+
+Transition doesn't have its own script, it will instead be passed as a named parameter `transition` to the `turn_on`, `turn_off`, `brightness`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts. Brightness will be passed as a named parameter `brightness` to either of `turn_on`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts if the corresponding parameter is also in the call. In this case, the brightness script (`set_level`) will not be called. If only brightness is passed to `light.turn_on` action, then `set_level` script is called.
+
+### State based light - Theater Volume Control
+
+This example shows a light that is actually a home theater's volume. This
+integration gives you the flexibility to provide whatever you'd like to send as
+the payload to the consumer including any scale conversions you may need to
+make; the [media player integration](/integrations/media_player/) needs a floating
+point percentage value from `0.0` to `1.0`.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - light:
+ - name: Receiver Volume
+ state: >-
+ {% if is_state('media_player.receiver', 'on') %}
+ {% if state_attr('media_player.receiver', 'is_volume_muted') %}
+ off
+ {% else %}
+ on
+ {% endif %}
+ {% else %}
+ off
+ {% endif %}
+ turn_on:
+ action: media_player.volume_mute
+ target:
+ entity_id: media_player.receiver
+ data:
+ is_volume_muted: false
+ turn_off:
+ action: media_player.volume_mute
+ target:
+ entity_id: media_player.receiver
+ data:
+ is_volume_muted: true
+ set_level:
+ action: media_player.volume_set
+ target:
+ entity_id: media_player.receiver
+ data:
+ volume_level: "{{ (brightness / 255 * 100)|int / 100 }}"
+ level: >-
+ {% if is_state('media_player.receiver', 'on') %}
+ {{ (state_attr('media_player.receiver', 'volume_level')|float * 255)|int }}
+ {% else %}
+ 0
+ {% endif %}
+```
+
+{% endraw %}
+
+### State based light - Make a global light entity for a multi-segment WLED light
+
+This example shows how to group together 2 RGBW segments from the same WLED controller into a single usable light.
+
+{% raw %}
+
+```yaml
+template:
+ - light:
+ unique_id: 28208f257b54c44e50deb2d618d44710
+ name: Multi-segment Wled control
+ state: "{{ states('light.wled_master') }}"
+ level: "{{ state_attr('light.wled_master', 'brightness')|d(0,true)|int }}"
+ rgbw: (
+ {{ (state_attr('light.wled_segment_0', 'rgbw_color')[0]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[0]|d(0))/2 }},
+ {{ (state_attr('light.wled_segment_0', 'rgbw_color')[1]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[1]|d(0))/2 }},
+ {{ (state_attr('light.wled_segment_0', 'rgbw_color')[2]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[2]|d(0))/2 }},
+ {{ (state_attr('light.wled_segment_0', 'rgbw_color')[3]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[3]|d(0))/2 }}
+ )
+ effect_list: "{{ state_attr('light.wled_segment_0', 'effect_list') }}"
+ effect: "{{ state_attr('light.wled_segment_0', 'effect') if state_attr('light.wled_segment_0', 'effect') == state_attr('light.wled_segment_1', 'effect') else none }}"
+ availability: "{{ not is_state('light.wled_master', 'unknown') }}"
+
+ turn_on:
+ action: light.turn_on
+ entity_id: light.wled_segment_0, light.wled_segment_1, light.wled_master
+ turn_off:
+ action: light.turn_off
+ entity_id: light.wled_master
+ set_level:
+ action: light.turn_on
+ entity_id: light.wled_master
+ data:
+ brightness: "{{ brightness }}"
+ set_rgbw:
+ action: light.turn_on
+ entity_id: light.wled_segment_0, light.wled_segment_1
+ data:
+ rgbw_color:
+ - "{{ r }}"
+ - "{{ g }}"
+ - "{{ b }}"
+ - "{{ w }}"
+ effect: "Solid"
+ set_effect:
+ action: light.turn_on
+ entity_id: light.wled_segment_0, light.wled_segment_1
+ data:
+ effect: "{{ effect }}"
+```
+
+{% endraw %}
+
+## Lock
+
+The template lock platform allows you to create locks with templates to define the state and scripts to define each action.
+
+Lock entities can only be created from YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - lock:
+ - name: Garage door
+ state: "{{ is_state('sensor.door', 'on') }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.door
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.door
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sensor.door
+ lock:
+ - name: Garage door
+ state: "{{ trigger.to_state.state == 'on' }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.door
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.door
+```
+
+{% endraw %}
+
+{% configuration %}
lock:
description: List of locks
required: true
type: map
keys:
- state:
- description: Defines a template to set the state of the lock.
- required: true
- type: template
code_format:
description: Defines a template to get the `code_format` attribute of the entity. This template must evaluate to a valid [Python regular expression](https://docs.python.org/3/library/re.html#regular-expression-syntax) or `None`. If it evaluates to a not-`None` value, you are prompted to enter a code when interacting with the lock. The code will be matched against the regular expression, and the lock/unlock actions will be executed only if they match. The actual _validity_ of the entered code must be verified within these actions. If there's a syntax error in the template, the entity will be unavailable. If the template fails to render for other reasons or if the regular expression is invalid, no code will be accepted, and the lock/unlock actions will never be invoked.
required: false
@@ -590,10 +1436,6 @@ lock:
description: Defines an action to run when the lock is locked.
required: true
type: action
- unlock:
- description: Defines an action to run when the lock is unlocked.
- required: true
- type: action
open:
description: Defines an action to run when the lock is opened.
required: false
@@ -603,6 +1445,534 @@ lock:
required: false
type: boolean
default: false
+ state:
+ description: Defines a template to set the state of the lock. Valid output values from the template are `locked`, `unlocked`, `open`, `locking`, `unlocking`, `opening`, and `jammed`, which are directly mapped to the corresponding states. In addition, `true` and `on` are valid as synonyms to `locked` while `false` and `off` are valid as synonyms to `unlocked`.
+ required: true
+ type: template
+ unlock:
+ description: Defines an action to run when the lock is unlocked.
+ required: true
+ type: action
+{% endconfiguration %}
+
+### State based lock - Lock from a switch
+
+This example shows a lock that copies data from a switch.
+
+{% raw %}
+
+```yaml
+template:
+ - lock:
+ - name: Garage Door
+ state: "{{ is_state('switch.source', 'on') }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.source
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.source
+```
+
+{% endraw %}
+
+### State based lock - Optimistic mode
+
+This example shows a lock in optimistic mode. This lock will immediately change state after command and will not wait for state update from the sensor.
+
+{% raw %}
+
+```yaml
+template:
+ - lock:
+ - name: Garage Door
+ state: "{{ is_state('sensor.skylight.state', 'on') }}"
+ optimistic: true
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.source
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.source
+```
+
+{% endraw %}
+
+### State based lock - Sensor and Two Switches
+
+This example shows a lock that takes its state from a sensor, and uses two momentary switches to control a device.
+
+{% raw %}
+
+```yaml
+template:
+ - lock:
+ - name: Garage Door
+ state: "{{ is_state('sensor.skylight.state', 'on') }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ unlock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_close
+```
+
+{% endraw %}
+
+### State based lock - Secret code
+
+This example shows a lock that copies data from a switch. It needs a PIN code defined as a [secret](/docs/configuration/secrets) to unlock and no code to lock. Note that the actual validity check of the code is part of the `unlock` action and should always happen there or in scripts called from these actions. In this way, you can not only perform code checks against static values, but also dynamic ones (for instance, TOTPs).
+
+{% raw %}
+
+```yaml
+template:
+ - lock:
+ - name: Garage Door
+ state: "{{ is_state('switch.source', 'on') }}"
+ code_format: "{{ '\\d{4}' if is_state('switch.source', 'on') else None }}"
+ lock:
+ - action: switch.turn_on
+ target:
+ entity_id: switch.source
+ unlock:
+ - variables:
+ pin: !secret garage_door_pin
+ - condition: "{{ code == pin }}"
+ - action: switch.turn_off
+ target:
+ entity_id: switch.source
+```
+
+{% endraw %}
+
+In `secrets.yaml`:
+
+{% raw %}
+
+```yaml
+garage_door_pin: "1234"
+```
+
+{% endraw %}
+
+## Number
+
+The template number platform allows you to create number entities with templates to define the state and scripts to define each action.
+
+Number entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - number:
+ - name: Desk Height
+ unit_of_measurement: "in"
+ state: "{{ states('sensor.desk_height') }}"
+ set_value:
+ - action: script.set_desk_height
+ data:
+ value: "{{ value }}"
+ step: 0.5
+ min: 1
+ max: 24
+ icon: mdi:ruler
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sensor.desk_height
+ - number:
+ - name: Desk Height
+ unit_of_measurement: "in"
+ state: "{{ states('sensor.desk_height') }}"
+ set_value:
+ - action: script.set_desk_height
+ data:
+ value: "{{ value }}"
+ step: 0.5
+ min: 1
+ max: 24
+ icon: mdi:ruler
+```
+
+{% endraw %}
+
+{% configuration %}
+number:
+ description: List of numbers
+ required: true
+ type: map
+ keys:
+ max:
+ description: Template for the number's maximum value.
+ required: false
+ type: template
+ default: 100.0
+ min:
+ description: Template for the number's minimum value.
+ required: false
+ type: template
+ default: 0.0
+ optimistic:
+ description: Flag that defines if number works in optimistic mode. When enabled, the number's state will update immediately when changed through the UI or service calls, without waiting for the template defined in `state` to update. When disabled (default), the number will only update when the `state` template returns a new value.
+ required: false
+ type: boolean
+ default: false
+ set_value:
+ description: Defines actions to run when the number value changes. The variable `value` will contain the number entered.
+ required: true
+ type: action
+ state:
+ description: Template for the number's current value.
+ required: true
+ type: template
+ unit_of_measurement:
+ description: Defines the units of measurement of the number, if any.
+ required: false
+ type: string
+ default: None
+ step:
+ description: Template for the number's increment/decrement step.
+ required: true
+ type: template
+
+{% endconfiguration %}
+
+### State based number - Changing the unit of measurement of another number
+
+This example demonstrates the usage of a template number with a unit of measurement set to change a unit-less value of another number entity.
+
+{% raw %}
+
+```yaml
+template:
+ - number:
+ - name: "Cutting Height"
+ unit_of_measurement: "cm"
+ unique_id: automower_cutting_height
+ state: "{{ states('number.automower_cutting_height_raw')|int(0) * 0.5 + 1.5 }}"
+ set_value:
+ - service: number.set_value
+ target:
+ entity_id: number.automower_cutting_height_raw
+ data:
+ value: "{{ (value - 1.5) * 2 }}"
+ step: 0.5
+ min: 2
+ max: 6
+ icon: mdi:ruler
+```
+
+{% endraw %}
+
+## Select
+
+The template select platform allows you to create select entities with templates to define the state and scripts to define each action.
+
+Select entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - select:
+ - name: Camera Day-Night Mode
+ state: "{{ state_attr('camera.porch', 'day_night_mode') }}"
+ options: "{{ ['off', 'on', 'auto'] }}"
+ select_option:
+ - action: script.porch_camera_day_night_mode
+ data:
+ day_night_mode: "{{ option }}"
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: camera.porch
+ attribute: day_night_mode
+ select:
+ - name: Camera Day-Night Mode
+ state: "{{ state_attr('camera.porch', 'day_night_mode') }}"
+ options: "{{ ['off', 'on', 'auto'] }}"
+ select_option:
+ - action: script.porch_camera_day_night_mode
+ data:
+ day_night_mode: "{{ option }}"
+```
+
+{% endraw %}
+
+{% configuration %}
+select:
+ description: List of selects
+ required: true
+ type: map
+ keys:
+ optimistic:
+ description: Flag that defines if select works in optimistic mode. When enabled, the select's state will update immediately when a new option is chosen through the UI or service calls, without waiting for the template defined in `state` to update. When disabled (default), the select will only update when the `state` template returns a new value.
+ required: false
+ type: boolean
+ default: false
+ options:
+ description: Template for the select's available options.
+ required: true
+ type: template
+ select_option:
+ description: Defines actions to run to select an option from the `options` list. The variable `option` will contain the option selected.
+ required: true
+ type: action
+ state:
+ description: Template for the select's current value. When omitted, the state will be set to the `option` provided by the `select_option` action.
+ required: false
+ type: template
+ default: optimistic
+{% endconfiguration %}
+
+### State based select - Control Day/Night mode of a camera
+
+This show how a state based template select can be used to perform an action.
+
+{% raw %}
+
+```yaml
+template:
+ select:
+ - name: "Porch Camera Day-Night Mode"
+ unique_id: porch_camera_day_night_mode
+ state: "{{ state_attr('camera.porch_camera_sd', 'day_night_mode') }}"
+ options: "{{ ['off', 'on', 'auto'] }}"
+ select_option:
+ - action: tapo_control.set_day_night_mode
+ data:
+ day_night_mode: "{{ option }}"
+ target:
+ entity_id: camera.porch_camera_sd
+```
+
+{% endraw %}
+
+## Sensor
+
+The template sensor platform allows you to create sensors with templates to define the state and attributes.
+
+Sensor entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - sensor:
+ - name: "Kettle"
+ state: >
+ {% if is_state('switch.kettle', 'off') %}
+ off
+ {% elif state_attr('switch.kettle', 'W')|float < 1000 %}
+ standby
+ {% elif is_state('switch.kettle', 'on') %}
+ on
+ {% else %}
+ failed
+ {% endif %}
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sensor.outside_temperature
+ not_to:
+ - unknown
+ - unavailable
+ sensor:
+ - name: Outside Temperature
+ device_class: temperature
+ unit_of_measurement: °C
+ state: "{{ (states('sensor.outside_temperature') | float - 32) * 5/9 }}"
+```
+
+{% endraw %}
+
+{% configuration %}
+sensor:
+ description: List of sensors
+ required: true
+ type: list
+ keys:
+ attributes:
+ description: Defines templates for attributes of the entity.
+ required: false
+ type: map
+ keys:
+ "attribute: template":
+ description: The attribute and corresponding template.
+ required: true
+ type: template
+ last_reset:
+ description: "Defines a template that describes when the state of the sensor was last reset. Must render to a valid `datetime`. Only available when `state_class` is set to `total`"
+ required: false
+ type: template
+ default: None
+ state:
+ description: "Defines a template to get the state of the sensor. If the sensor is numeric, i.e. it has a `state_class` or a `unit_of_measurement`, the state template must render to a number or to `none`. The state template must not render to a string, including `unknown` or `unavailable`. An `availability` template may be defined to suppress rendering of the state template."
+ required: true
+ type: template
+ state_class:
+ description: "The [state_class](https://developers.home-assistant.io/docs/core/entity/sensor#available-state-classes) of the sensor. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value. If you desire to include the sensor in long-term statistics, include this key and assign it the appropriate value"
+ required: false
+ type: string
+ default: None
+ unit_of_measurement:
+ description: "Defines the units of measurement of the sensor, if any. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value."
+ required: false
+ type: string
+ default: None
+
+{% endconfiguration %}
+
+### State based sensor - Exposing sun angle
+
+This example shows the sun angle in the frontend.
+
+{% raw %}
+
+```yaml
+template:
+ - sensor:
+ - name: Sun Angle
+ unit_of_measurement: "°"
+ state: "{{ '%+.1f'|format(state_attr('sun.sun', 'elevation')) }}"
+```
+
+{% endraw %}
+
+### State based sensor - Modifying another sensor's output
+
+If you don't like the wording of a sensor output, then the Template Sensor can help too. Let's rename the output of the [Sun integration](/integrations/sun/) as a simple example:
+
+{% raw %}
+
+```yaml
+template:
+ - sensor:
+ - name: "Sun State"
+ state: >
+ {% if is_state('sun.sun', 'above_horizon') %}
+ up
+ {% else %}
+ down
+ {% endif %}
+```
+
+{% endraw %}
+
+### State based sensor - Changing the unit of measurement of another sensor
+
+With a Template Sensor, it's easy to convert given values into others if the unit of measurement doesn't fit your needs.
+Because the sensors do math on the source sensor's state and need to render to a numeric value, an availability template is used
+to suppress rendering of the state template if the source sensor does not have a valid numeric state.
+
+{% raw %}
+
+```yaml
+template:
+ - sensor:
+ - name: "Transmission Down Speed"
+ unit_of_measurement: "kB/s"
+ state: "{{ states('sensor.transmission_down_speed')|float * 1024 }}"
+ availability: "{{ is_number(states('sensor.transmission_down_speed')) }}"
+
+ - name: "Transmission Up Speed"
+ unit_of_measurement: "kB/s"
+ state: "{{ states('sensor.transmission_up_speed')|float * 1024 }}"
+ availability: "{{ is_number(states('sensor.transmission_up_speed')) }}"
+```
+
+{% endraw %}
+
+### Trigger based sensor - Using conditions to control updates
+
+This example shows how to store the last valid value of a temperature sensor. It will update as long as the source sensor has a valid (numeric) state. Otherwise, the template sensor's state will remain unchanged.
+
+{% raw %}
+
+```yaml
+template:
+ - triggers:
+ trigger: state
+ entity_id: sensor.outside_temperature
+ conditions:
+ - condition: template
+ value_template: "{{ is_number(states('sensor.outside_temperature')) }}"
+ sensor:
+ - name: Outside Temperature last known value
+ state: "{{ states('sensor.outside_temperature') }}"
+```
+
+{% endraw %}
+
+## Switch
+
+The template switch platform allows you to create switches with templates to define the state and scripts to define each action.
+
+Switch entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - switch:
+ - name: Skylight
+ state: "{{ is_state('binary_sensor.skylight', 'on') }}"
+ turn_on:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ turn_off:
+ action: switch.turn_off
+ target:
+ entity_id: switch.skylight_close
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: binary_sensor.skylight
+ switch:
+ - name: Skylight
+ state: "{{ is_state('binary_sensor.skylight', 'on') }}"
+ turn_on:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ turn_off:
+ action: switch.turn_off
+ target:
+ entity_id: switch.skylight_close
+```
+
+{% endraw %}
+
+{% configuration %}
switch:
description: List of switches
required: true
@@ -613,33 +1983,149 @@ switch:
required: false
type: template
default: optimistic
- turn_on:
- description: Defines an action or list of actions to run when the switch is turned on.
- required: true
- type: action
turn_off:
description: Defines an action or list of actions to run when the switch is turned off.
required: true
type: action
+ turn_on:
+ description: Defines an action or list of actions to run when the switch is turned on.
+ required: true
+ type: action
+
+{% endconfiguration %}
+
+### State based switch - Invert a Switch
+
+This example shows a switch that is the inverse of another switch.
+
+{% raw %}
+
+```yaml
+template:
+ - switch:
+ - state: "{{ not is_state('switch.target', 'on') }}"
+ availability: "{{ has_value('switch.target') }}"
+ turn_on:
+ action: switch.turn_off
+ target:
+ entity_id: switch.target
+ turn_off:
+ action: switch.turn_on
+ target:
+ entity_id: switch.target
+```
+
+{% endraw %}
+
+### State based switch - Toggle Switch
+
+This example shows a switch that takes its state from a sensor and toggles a switch.
+
+{% raw %}
+
+```yaml
+template:
+ - switch:
+ - name: "Blind"
+ state: "{{ is_state_attr('switch.blind_toggle', 'sensor_state', 'on') }}"
+ turn_on:
+ action: switch.toggle
+ target:
+ entity_id: switch.blind_toggle
+ turn_off:
+ action: switch.toggle
+ target:
+ entity_id: switch.blind_toggle
+```
+
+{% endraw %}
+
+### State based switch - Sensor and Two Switches
+
+This example shows a switch that takes its state from a sensor, and uses two
+momentary switches to control a device.
+
+{% raw %}
+
+```yaml
+template:
+ - switch:
+ - name: "Skylight"
+ value_template: "{{ is_state('sensor.skylight', 'on') }}"
+ turn_on:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ turn_off:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_close
+```
+
+{% endraw %}
+
+### State based switch - Optimistic Switch
+
+This example switch with an assumed state based on the actions performed. This switch will immediately change state after a `turn_on`/`turn_off` command.
+
+{% raw %}
+
+```yaml
+template:
+ - switch:
+ - name: "Blind"
+ turn_on:
+ action: switch.toggle
+ target:
+ entity_id: switch.blind_toggle
+ turn_off:
+ action: switch.toggle
+ target:
+ entity_id: switch.blind_toggle
+```
+
+{% endraw %}
+
+## Vacuum
+
+The template vacuum platform allows you to create vacuum entities with templates to define the state and scripts to define each action.
+
+Vacuum entities can only be created via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - vacuum:
+ - name: Living Room Vacuum
+ start:
+ action: script.vacuum_start
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sensor.living_room_vacuum_state
+ vacuum:
+ - name: Living Room Vacuum
+ state: "{{ states('sensor.living_room_vacuum_state') }}"
+ start:
+ action: script.vacuum_start
+```
+
+{% endraw %}
+
+{% configuration %}
vacuum:
description: List of vacuum entities
required: true
type: map
keys:
- state:
- description: "Defines a template to get the state of the vacuum. Valid value: `docked`/`cleaning`/`idle`/`paused`/`returning`/`error`"
- required: false
- type: template
- battery_level:
- description: "Defines a template to get the battery level of the vacuum. Legal values are numbers between `0` and `100`."
- required: false
- type: template
- fan_speed:
- description: Defines a template to get the fan speed of the vacuum.
- required: false
- type: template
attributes:
- description: Defines templates for attributes of the sensor.
+ description: Defines templates for attributes of the entity.
required: false
type: map
keys:
@@ -647,107 +2133,173 @@ vacuum:
description: The attribute and corresponding template.
required: true
type: template
- start:
- description: Defines an action to run when the vacuum is started.
- required: true
+ battery_level:
+ description: "Defines a template to get the battery level of the vacuum. Legal values are numbers between `0` and `100`."
+ required: false
+ type: template
+ clean_spot:
+ description: Defines an action to run when the vacuum is given a clean spot command.
+ required: false
+ type: action
+ fan_speed:
+ description: Defines a template to get the fan speed of the vacuum.
+ required: false
+ type: template
+ fan_speeds:
+ description: List of fan speeds supported by the vacuum.
+ required: false
+ type: [string, list]
+ locate:
+ description: Defines an action to run when the vacuum is given a locate command.
+ required: false
type: action
pause:
description: Defines an action to run when the vacuum is paused.
required: false
type: action
- stop:
- description: Defines an action to run when the vacuum is stopped.
- required: false
- type: action
return_to_base:
description: Defines an action to run when the vacuum is given a return to base command.
required: false
type: action
- clean_spot:
- description: Defines an action to run when the vacuum is given a clean spot command.
- required: false
- type: action
- locate:
- description: Defines an action to run when the vacuum is given a locate command.
- required: false
- type: action
set_fan_speed:
description: Defines an action to run when the vacuum is given a command to set the fan speed.
required: false
type: action
- fan_speeds:
- description: List of fan speeds supported by the vacuum.
+ start:
+ description: Defines an action to run when the vacuum is started.
+ required: true
+ type: action
+ state:
+ description: "Defines a template to get the state of the vacuum. Valid value: `docked`/`cleaning`/`idle`/`paused`/`returning`/`error`"
required: false
- type: [string, list]
+ type: template
+ stop:
+ description: Defines an action to run when the vacuum is stopped.
+ required: false
+ type: action
+{% endconfiguration %}
+
+### State based vacuum - Control vacuum with Harmony Hub
+
+This example shows how you can use a Template Vacuum to control an IR vacuum cleaner using the [Harmony Hub Remote integration](/integrations/harmony).
+
+```yaml
+vacuum:
+ - platform: template
+ vacuums:
+ living_room_vacuum:
+ start:
+ - action: remote.send_command
+ target:
+ entity_id: remote.harmony_hub
+ data:
+ command: Clean
+ device: 52840686
+ return_to_base:
+ - action: remote.send_command
+ target:
+ entity_id: remote.harmony_hub
+ data:
+ command: Home
+ device: 52840686
+ clean_spot:
+ - action: remote.send_command
+ target:
+ entity_id: remote.harmony_hub
+ data:
+ command: SpotCleaning
+ device: 52840686
+```
+
+### State based vacuum - Custom attributes
+
+This example shows how to add custom attributes.
+
+{% raw %}
+
+```yaml
+vacuum:
+ - platform: template
+ vacuums:
+ living_room_vacuum:
+ value_template: "{{ states('sensor.vacuum_state') }}"
+ battery_level_template: "{{ states('sensor.vacuum_battery_level')|int }}"
+ fan_speed_template: "{{ states('sensor.vacuum_fan_speed') }}"
+ attribute_templates:
+ status: >-
+ {% if (states('sensor.robot_vacuum_robot_cleaner_movement') == "after" and states('sensor.robot_vacuum_robot_cleaner_cleaning_mode') == "stop") %}
+ Charging to Resume
+ {% elif states('sensor.robot_vacuum_robot_cleaner_cleaning_mode') == "auto" %}
+ Cleaning
+ {% else %}
+ Charging
+ {% endif %}
+```
+
+{% endraw %}
+
+## Weather
+
+The template weather platform allows you to create weather entities with templates to define the state and attributes.
+
+Weather entities can only be created via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - weather:
+ - name: "My Weather Station"
+ condition_template: "{{ states('weather.my_region') }}"
+ temperature_template: "{{ states('sensor.temperature') | float }}"
+ temperature_unit: "°C"
+ humidity_template: "{{ states('sensor.humidity') | float }}"
+ forecast_daily_template: "{{ state_attr('weather.my_region', 'forecast_data') }}"
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id:
+ - weather.my_region
+ - sensor.temperature
+ - sensor.humidity
+ weather:
+ - name: "My Weather Station"
+ condition_template: "{{ states('weather.my_region') }}"
+ temperature_template: "{{ states('sensor.temperature') | float }}"
+ temperature_unit: "°C"
+ humidity_template: "{{ states('sensor.humidity') | float }}"
+ forecast_daily_template: "{{ state_attr('weather.my_region', 'forecast_data') }}"
+```
+
+{% endraw %}
+
+{% configuration %}
weather:
description: List of weather entities
required: true
type: map
keys:
- condition_template:
- description: The current weather condition.
- required: true
- type: template
- temperature_template:
- description: The current temperature.
- required: true
- type: template
- dew_point_template:
- description: The current dew point.
- required: false
- type: template
apparent_temperature_template:
description: The current apparent (feels-like) temperature.
required: false
type: template
- temperature_unit:
- description: Unit for temperature_template output. Valid options are °C, °F, and K.
- required: false
- type: string
- humidity_template:
- description: The current humidity.
- required: true
- type: template
- pressure_template:
- description: The current air pressure.
- required: false
- type: template
- pressure_unit:
- description: Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.
- required: false
- type: string
- wind_speed_template:
- description: The current wind speed.
- required: false
- type: template
- wind_gust_speed_template:
- description: The current wind gust speed.
- required: false
- type: template
- wind_speed_unit:
- description: Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.
- required: false
- type: string
- wind_bearing_template:
- description: The current wind bearing.
- required: false
- type: template
- ozone_template:
- description: The current ozone level.
- required: false
- type: template
cloud_coverage_template:
description: The current cloud coverage.
required: false
type: template
- visibility_template:
- description: The current visibility.
+ condition_template:
+ description: The current weather condition.
+ required: true
+ type: template
+ dew_point_template:
+ description: The current dew point.
required: false
type: template
- visibility_unit:
- description: Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.
- required: false
- type: string
forecast_daily_template:
description: Daily forecast data.
required: false
@@ -760,36 +2312,103 @@ weather:
description: Twice daily forecast data.
required: false
type: template
+ humidity_template:
+ description: The current humidity.
+ required: true
+ type: template
+ ozone_template:
+ description: The current ozone level.
+ required: false
+ type: template
precipitation_unit:
description: Unit for precipitation output. Valid options are km, mi, ft, m, cm, mm, in, yd.
required: false
type: string
-"[all sensor, binary sensor, button, image, light, number, select, switch, weather entities]":
- description: Fields that can be used above for sensors, binary sensors, buttons, numbers, and selects.
- required: false
- type: map
- keys:
- name:
- description: Defines a template to get the name of the entity.
+ pressure_template:
+ description: The current air pressure.
required: false
type: template
- unique_id:
- description: An ID that uniquely identifies this entity. Will be combined with the unique ID of the configuration block if available. This allows changing the `name`, `icon` and `entity_id` from the web interface.
+ pressure_unit:
+ description: Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.
required: false
type: string
- icon:
- description: Defines a template for the icon of the entity.
+ temperature_template:
+ description: The current temperature.
+ required: true
+ type: template
+ temperature_unit:
+ description: Unit for temperature_template output. Valid options are °C, °F, and K.
+ required: false
+ type: string
+ uv_index_template:
+ description: The current UV index.
required: false
type: template
- availability:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ visibility_template:
+ description: The current visibility.
+ required: false
+ type: template
+ visibility_unit:
+ description: Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.
+ required: false
+ type: string
+ wind_gust_speed_template:
+ description: The current wind gust speed.
+ required: false
+ type: template
+ wind_speed_template:
+ description: The current wind speed.
+ required: false
+ type: template
+ wind_speed_unit:
+ description: Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.
+ required: false
+ type: string
+ wind_bearing_template:
+ description: The current wind bearing.
required: false
type: template
- default: true
{% endconfiguration %}
-The above configuration variables describe a configuration section. The template integration allows defining multiple sections.
+### Trigger based weather - Weather Forecast from response data
+
+This example demonstrates how to use an `action` to call a [action with response data](/docs/scripts/perform-actions/#use-templates-to-handle-response-data)
+and use the response in a template.
+
+{% raw %}
+
+```yaml
+template:
+ - triggers:
+ - trigger: time_pattern
+ hours: /1
+ actions:
+ - action: weather.get_forecasts
+ data:
+ type: hourly
+ target:
+ entity_id: weather.home
+ response_variable: hourly
+ sensor:
+ - name: Weather Forecast Hourly
+ unique_id: weather_forecast_hourly
+ state: "{{ now().isoformat() }}"
+ attributes:
+ forecast: "{{ hourly['weather.home'].forecast }}"
+```
+
+{% endraw %}
+
+#### Video tutorial
+
+This video tutorial explains how to set up a trigger based template that makes use of an action to retrieve the weather forecast (precipitation).
+
+
+
+## Combining multiple template entities
+
+The template integration allows defining multiple sections.
```yaml
# Example configuration.yaml entry with two sections
@@ -811,13 +2430,44 @@ template:
[trigger-doc]: /docs/automation/trigger
-#### Video tutorial
+### Trigger based sensor and binary sensor storing webhook information
-This video tutorial explains how to set up a trigger based template that makes use of an action to retrieve the weather forecast (precipitation).
+Template entities can be triggered using any automation trigger, including webhook triggers. Use a trigger-based template entity to store this information in template entities.
-
+{% raw %}
-### Template and action variables
+```yaml
+template:
+ - triggers:
+ - trigger: webhook
+ webhook_id: my-super-secret-webhook-id
+ sensor:
+ - name: "Webhook Temperature"
+ state: "{{ trigger.json.temperature }}"
+ unit_of_measurement: °C
+
+ - name: "Webhook Humidity"
+ state: "{{ trigger.json.humidity }}"
+ unit_of_measurement: %
+
+ binary_sensor:
+ - name: "Motion"
+ state: "{{ trigger.json.motion }}"
+ device_class: motion
+```
+
+{% endraw %}
+
+You can test this trigger entity with the following CURL command:
+
+```bash
+curl --header "Content-Type: application/json" \
+ --request POST \
+ --data '{"temperature": 5, "humidity": 34, "motion": true}' \
+ http://homeassistant.local:8123/api/webhook/my-super-secret-webhook-id
+```
+
+## Template and action variables
State-based and trigger-based template entities have the special template variable `this` available in their templates and actions. The `this` variable is the current [state object](/docs/configuration/state_object) of the entity and aids [self-referencing](#self-referencing) of an entity's state and attributes in templates and actions. Trigger-based entities also provide [the trigger data](/docs/automation/templating/).
@@ -825,7 +2475,25 @@ State-based and trigger-based template entities have the special template variab
Self-referencing using `this` provides the state and attributes for the entity before rendering the templates to calculate a new state. In other words, it contains the previous state.
{% endnote %}
-### Optimistic mode
+### Self referencing
+
+This example demonstrates how the `this` variable can be used in templates for self-referencing.
+
+{% raw %}
+
+```yaml
+template:
+ - sensor:
+ - name: test
+ state: "{{ this.attributes.test | default('Value when missing') }}"
+ # not: "{{ state_attr('sensor.test', 'test') }}"
+ attributes:
+ test: "{{ now() }}"
+```
+
+{% endraw %}
+
+## Optimistic mode
For template entities that support interactivity (like `number` and `select`), you can enable optimistic mode by setting the `optimistic` parameter to `true`. This affects how the entity's state updates when you interact with it:
@@ -841,7 +2509,7 @@ Optimistic mode is particularly useful when:
When optimistic mode is disabled (default), you get more accuracy but potentially a less responsive UI, as the entity only updates after confirmation from the underlying system.
-### Rate limiting updates
+## Rate limiting updates
When there are entities present in the template and no triggers are defined, the template will be re-rendered when one of the entities changes states. To avoid this taking up too many resources in Home Assistant, rate limiting will be automatically applied if too many states are observed.
@@ -882,11 +2550,11 @@ template:
If the template accesses every state on the system, a rate limit of one update per minute is applied. If the template accesses all states under a specific domain, a rate limit of one update per second is applied. If the template only accesses specific states, receives update events for specifically referenced entities, or the `homeassistant.update_entity` action is used, no rate limit is applied.
-### Considerations
+## Considerations
-#### Startup
+### Startup
-If you are using the state of a platform that might not be available during startup, the Template Sensor may get an `unknown` state. To avoid this, use the `states()` function in your template. For example, you should replace {% raw %}`{{ states.sensor.moon.state }}`{% endraw %} with this equivalent that returns the state and never results in `unknown`: {% raw %}`{{ states('sensor.moon') }}` {% endraw %}.
+If you are using the state of a platform that might not be available during startup, the Template Sensor may get an `unknown` state. To avoid this, use the `states()` function in your template. For example, you should replace {% raw %}`{{ states.sensor.moon.state }}`{% endraw %} with this equivalent that returns the state and never results in `unknown`: {% raw %}`{{ states('sensor.moon') }}` {% endraw %}.
The same would apply to the `is_state()` function. You should replace {% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %} with this equivalent that returns `true`/`false` and never gives an `unknown` result:
@@ -938,387 +2606,119 @@ The blueprint can now be used for creating template entities.
[blueprint-forums]: /get-blueprints
-## Examples
+## Event `event_template_reloaded`
-In this section, you find some real-life examples of how to use template sensors.
+Event `event_template_reloaded` is fired when Template entities have been reloaded and entities thus might have changed.
-### Trigger based sensor and binary sensor storing webhook information
+This event has no additional data.
-Template entities can be triggered using any automation trigger, including webhook triggers. Use a trigger-based template entity to store this information in template entities.
+## Legacy Alarm Control Panel configuration format
+
+_These formats still work but are no longer recommended. [Use modern configuration](#alarm-control-panel)._
+
+This format is configured as a platform for the `alarm_control_panel` integration and not directly under the `template` integration.
{% raw %}
```yaml
-template:
- - triggers:
- - trigger: webhook
- webhook_id: my-super-secret-webhook-id
- sensor:
- - name: "Webhook Temperature"
- state: "{{ trigger.json.temperature }}"
- unit_of_measurement: °C
-
- - name: "Webhook Humidity"
- state: "{{ trigger.json.humidity }}"
- unit_of_measurement: %
-
- binary_sensor:
- - name: "Motion"
- state: "{{ trigger.json.motion }}"
- device_class: motion
-```
-
-{% endraw %}
-
-You can test this trigger entity with the following CURL command:
-
-```bash
-curl --header "Content-Type: application/json" \
- --request POST \
- --data '{"temperature": 5, "humidity": 34, "motion": true}' \
- http://homeassistant.local:8123/api/webhook/my-super-secret-webhook-id
-```
-
-### Turning an event into a trigger based binary sensor
-
-You can use a trigger-based template entity to convert any event or other automation trigger into a binary sensor. The below configuration will turn on a binary sensor for 5 seconds when the automation trigger triggers.
-
-```yaml
-template:
- - triggers:
- trigger: event
- event_type: my_event
- binary_sensor:
- - name: Event recently fired
- auto_off: 5
- state: "true"
-```
-
-### Using conditions with triggers to control status updates
-
-This example shows how to store the last valid value of a temperature sensor. It will update as long as the source sensor has a valid (numeric) state. Otherwise, the template sensor's state will remain unchanged.
-
-{% raw %}
-
-```yaml
-template:
- - triggers:
- trigger: state
- entity_id: sensor.outside_temperature
- conditions:
- - condition: template
- value_template: "{{ is_number(states('sensor.outside_temperature')) }}"
- sensor:
- - name: Outside Temperature last known value
- state: "{{ states('sensor.outside_temperature') }}"
-```
-
-{% endraw %}
-
-### State based sensor exposing sun angle
-
-This example shows the sun angle in the frontend.
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: Sun Angle
- unit_of_measurement: "°"
- state: "{{ '%+.1f'|format(state_attr('sun.sun', 'elevation')) }}"
-```
-
-{% endraw %}
-
-### State based sensor modifying another sensor's output
-
-If you don't like the wording of a sensor output, then the Template Sensor can help too. Let's rename the output of the [Sun integration](/integrations/sun/) as a simple example:
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: "Sun State"
- state: >
- {% if is_state('sun.sun', 'above_horizon') %}
- up
- {% else %}
- down
- {% endif %}
-```
-
-{% endraw %}
-
-### State based sensor with multiline template with an `if` test
-
-This example shows a multiple line template with an `if` test. It looks at a sensing switch and shows `on`/`off` in the frontend, and shows 'standby' if the power use is less than 1000 watts.
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: "Kettle"
- state: >
- {% if is_state('switch.kettle', 'off') %}
- off
- {% elif state_attr('switch.kettle', 'W')|float < 1000 %}
- standby
- {% elif is_state('switch.kettle', 'on') %}
- on
- {% else %}
- failed
- {% endif %}
-```
-
-{% endraw %}
-
-### State based sensor changing the unit of measurement of another sensor
-
-With a Template Sensor, it's easy to convert given values into others if the unit of measurement doesn't fit your needs.
-Because the sensors do math on the source sensor's state and need to render to a numeric value, an availability template is used
-to suppress rendering of the state template if the source sensor does not have a valid numeric state.
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: "Transmission Down Speed"
- unit_of_measurement: "kB/s"
- state: "{{ states('sensor.transmission_down_speed')|float * 1024 }}"
- availability: "{{ is_number(states('sensor.transmission_down_speed')) }}"
-
- - name: "Transmission Up Speed"
- unit_of_measurement: "kB/s"
- state: "{{ states('sensor.transmission_up_speed')|float * 1024 }}"
- availability: "{{ is_number(states('sensor.transmission_up_speed')) }}"
-```
-
-{% endraw %}
-
-### State based binary sensor - Washing Machine Running
-
-This example creates a washing machine "load running" sensor by monitoring an
-energy meter connected to the washer. During the washer's operation, the energy meter will fluctuate wildly, hitting zero frequently even before the load is finished. By utilizing `delay_off`, we can have this sensor only turn off if there has been no washer activity for 5 minutes.
-
-{% raw %}
-
-```yaml
-# Determine when the washing machine has a load running.
-template:
- - binary_sensor:
- - name: "Washing Machine"
- delay_off:
- minutes: 5
- state: >
- {{ states('sensor.washing_machine_power')|float > 0 }}
-```
-
-{% endraw %}
-
-### State based binary sensor - Is Anyone Home
-
-This example is determining if anyone is home based on the combination of device tracking and motion sensors. It's extremely useful if you have kids/baby sitter/grand parents who might still be in your house that aren't represented by a trackable device in Home Assistant. This is providing a composite of Wi-Fi based device tracking and Z-Wave multisensor presence sensors.
-
-{% raw %}
-
-```yaml
-template:
- - binary_sensor:
- - name: People home
- state: >
- {{ is_state('device_tracker.sean', 'home')
- or is_state('device_tracker.susan', 'home')
- or is_state('binary_sensor.office_124', 'on')
- or is_state('binary_sensor.hallway_134', 'on')
- or is_state('binary_sensor.living_room_139', 'on')
- or is_state('binary_sensor.porch_ms6_1_129', 'on')
- or is_state('binary_sensor.family_room_144', 'on') }}
-```
-
-{% endraw %}
-
-### State based binary sensor - device tracker sensor with latitude and longitude attributes
-
-This example shows how to combine a non-GPS (e.g., NMAP) and GPS device tracker while still including latitude and longitude attributes
-
-{% raw %}
-
-```yaml
-template:
- - binary_sensor:
- - name: My Device
- state: >
- {{ is_state('device_tracker.my_device_nmap', 'home') or is_state('device_tracker.my_device_gps', 'home') }}
- device_class: "presence"
- attributes:
- latitude: >
- {% if is_state('device_tracker.my_device_nmap', 'home') %}
- {{ state_attr('zone.home', 'latitude') }}
- {% else %}
- {{ state_attr('device_tracker.my_device_gps', 'latitude') }}
- {% endif %}
- longitude: >
- {% if is_state('device_tracker.my_device_nmap', 'home') %}
- {{ state_attr('zone.home', 'longitude') }}
- {% else %}
- {{ state_attr('device_tracker.my_device_gps', 'longitude') }}
- {% endif %}
-```
-
-{% endraw %}
-
-### State based binary sensor - Change the icon when a state changes
-
-This example demonstrates how to use template to change the icon as its state changes. This icon is referencing its own state.
-
-{% raw %}
-
-```yaml
-template:
- - binary_sensor:
- - name: Sun Up
- state: >
- {{ is_state("sun.sun", "above_horizon") }}
- icon: >
- {% if is_state("binary_sensor.sun_up", "on") %}
- mdi:weather-sunset-up
- {% else %}
- mdi:weather-sunset-down
- {% endif %}
-```
-
-{% endraw %}
-
-A more advanced use case could be to set the icon based on the sensor's own state like above, but when triggered by an event. This example demonstrates a binary sensor that turns on momentarily, such as when a doorbell button is pressed.
-
-The binary sensor turns on and sets the matching icon when the appropriate event is received. After 5 seconds, the binary sensor turns off automatically. To ensure the icon gets updated, there must be a trigger for when the state changes to off.
-
-{% raw %}
-
-```yaml
-template:
- - triggers:
- - trigger: event
- event_type: YOUR_EVENT
- - trigger: state
- entity_id: binary_sensor.doorbell_rang
- to: "off"
- binary_sensor:
- name: doorbell_rang
- icon: "{{ (trigger.platform == 'event') | iif('mdi:bell-ring-outline', 'mdi:bell-outline') }}"
- state: "{{ trigger.platform == 'event' }}"
- auto_off:
- seconds: 5
-```
-
-{% endraw %}
-
-### State based select - Control Day/Night mode of a camera
-
-This show how a state based template select can be used to perform an action.
-
-{% raw %}
-
-
-```yaml
-template:
- select:
- - name: "Porch Camera Day-Night Mode"
- unique_id: porch_camera_day_night_mode
- state: "{{ state_attr('camera.porch_camera_sd', 'day_night_mode') }}"
- options: "{{ ['off', 'on', 'auto'] }}"
- select_option:
- - action: tapo_control.set_day_night_mode
- data:
- day_night_mode: "{{ option }}"
+# Example configuration.yaml entry
+alarm_control_panel:
+ - platform: template
+ panels:
+ safe_alarm_panel:
+ value_template: "{{ states('alarm_control_panel.real_alarm') }}"
+ arm_away:
+ action: alarm_control_panel.alarm_arm_away
target:
- entity_id: camera.porch_camera_sd
-```
-
-{% endraw %}
-
-### Self referencing
-
-This example demonstrates how the `this` variable can be used in templates for self-referencing.
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: test
- state: "{{ this.attributes.test | default('Value when missing') }}"
- # not: "{{ state_attr('sensor.test', 'test') }}"
- attributes:
- test: "{{ now() }}"
-```
-
-{% endraw %}
-
-### Trigger based handling of action response data
-
-This example demonstrates how to use an `action` to call a [action with response data](/docs/scripts/perform-actions/#use-templates-to-handle-response-data)
-and use the response in a template.
-
-{% raw %}
-
-```yaml
-template:
- - triggers:
- - trigger: time_pattern
- hours: /1
- actions:
- - action: weather.get_forecasts
- data:
- type: hourly
- target:
- entity_id: weather.home
- response_variable: hourly
- sensor:
- - name: Weather Forecast Hourly
- unique_id: weather_forecast_hourly
- state: "{{ now().isoformat() }}"
- attributes:
- forecast: "{{ hourly['weather.home'].forecast }}"
-```
-
-{% endraw %}
-
-### Number entity changing the unit of measurement of another number
-
-This example demonstrates the usage of a template number with a unit of measurement set to change a unit-less value of another number entity.
-
-{% raw %}
-
-```yaml
-template:
- - number:
- - name: "Cutting Height"
- unit_of_measurement: "cm"
- unique_id: automower_cutting_height
- state: "{{ states('number.automower_cutting_height_raw')|int(0) * 0.5 + 1.5 }}"
- set_value:
- - service: number.set_value
+ entity_id: alarm_control_panel.real_alarm
+ data:
+ code: !secret alarm_code
+ arm_home:
+ action: alarm_control_panel.alarm_arm_home
+ target:
+ entity_id: alarm_control_panel.real_alarm
+ data:
+ code: !secret alarm_code
+ disarm:
+ - condition: state
+ entity_id: device_tracker.paulus
+ state: "home"
+ - action: alarm_control_panel.alarm_disarm
target:
- entity_id: number.automower_cutting_height_raw
+ entity_id: alarm_control_panel.real_alarm
data:
- value: "{{ (value - 1.5) * 2 }}"
- step: 0.5
- min: 2
- max: 6
- icon: mdi:ruler
+ code: !secret alarm_code
```
{% endraw %}
+{% configuration %}
+panels:
+ description: List of your panels.
+ required: true
+ type: map
+ keys:
+ alarm_control_panel_name:
+ description: The slug of the panel.
+ required: true
+ type: map
+ keys:
+ name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ default: Template Alarm Control Panel
+ unique_id:
+ description: An ID that uniquely identifies this alarm control panel. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: "Defines a template to set the state of the alarm panel. Only the states `armed_away`, `armed_home`, `armed_night`, `armed_vacation`, `arming`, `disarmed`, `pending`, `triggered` and `unavailable` are used."
+ required: false
+ type: template
+ disarm:
+ description: Defines an action to run when the alarm is disarmed.
+ required: false
+ type: action
+ arm_away:
+ description: Defines an action to run when the alarm is armed to away mode.
+ required: false
+ type: action
+ arm_home:
+ description: Defines an action to run when the alarm is armed to home mode.
+ required: false
+ type: action
+ arm_night:
+ description: Defines an action to run when the alarm is armed to night mode.
+ required: false
+ type: action
+ arm_vacation:
+ description: Defines an action to run when the alarm is armed to vacation mode.
+ required: false
+ type: action
+ arm_custom_bypass:
+ description: Defines an action to run when the alarm is armed to custom bypass mode.
+ required: false
+ type: action
+ trigger:
+ description: Defines an action to run when the alarm is triggered.
+ required: false
+ type: action
+ code_arm_required:
+ description: If true, the code is required to arm the alarm.
+ required: false
+ type: boolean
+ default: true
+ code_format:
+ description: One of `number`, `text` or `no_code`. Format for the code used to arm/disarm the alarm.
+ required: false
+ type: string
+ default: number
+{% endconfiguration %}
-## Legacy binary sensor configuration format
+## Legacy Binary Sensor configuration format
-_This format still works but is no longer recommended. [Use modern configuration](#configuration-variables)._
+_These formats still work but are no longer recommended. [Use modern configuration](#binary-sensor)._
This format is configured as a platform for the `binary_sensor` integration and not directly under the `template` integration.
@@ -1396,9 +2796,486 @@ sensors:
type: time
{% endconfiguration %}
+## Legacy Cover configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#cover)._
+
+This format is configured as a platform for the `cover` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+cover:
+ - platform: template
+ covers:
+ garage_door:
+ device_class: garage
+ friendly_name: "Garage Door"
+ value_template: "{{ states('sensor.garage_door')|float > 0 }}"
+ open_cover:
+ action: script.open_garage_door
+ close_cover:
+ action: script.close_garage_door
+ stop_cover:
+ action: script.stop_garage_door
+```
+
+{% endraw %}
+
+{% configuration %}
+ covers:
+ description: List of your covers.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this cover. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `value_template` and a `position_template`](#combining-state-and-position-templates) are specified, only `opening` and `closing` are set from the `value_template`. If the template produces a `None` value the state will be set to `unknown`.
+ required: false
+ type: template
+ position_template:
+ description: Defines a template to get the position of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current position will be set to `unknown`.
+ required: false
+ type: template
+ icon_template:
+ description: Defines a template to specify which icon to use.
+ required: false
+ type: template
+ entity_picture_template:
+ description: Defines a template for the entity picture of the cover.
+ required: false
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ device_class:
+ description: Sets the [class of the device](/integrations/cover/), changing the device state and icon that is displayed on the frontend.
+ required: false
+ type: string
+ open_cover:
+ description: Defines an action to open the cover. If `open_cover` is specified, `close_cover` must also be specified. At least one of `open_cover` and `set_cover_position` must be specified.
+ required: inclusive
+ type: action
+ close_cover:
+ description: Defines an action to close the cover.
+ required: inclusive
+ type: action
+ stop_cover:
+ description: Defines an action to stop the cover.
+ required: false
+ type: action
+ set_cover_position:
+ description: Defines an action to set to a cover position (between `0` and `100`). The variable `position` will contain the entity's set position.
+ required: false
+ type: action
+ set_cover_tilt_position:
+ description: Defines an action to set the tilt of a cover (between `0` and `100`). The variable `tilt` will contain the entity's set tilt position.
+ required: false
+ type: action
+ optimistic:
+ description: Force cover position to use [optimistic mode](#cover-optimistic-mode).
+ required: false
+ type: boolean
+ default: false
+ tilt_optimistic:
+ description: Force cover tilt position to use [optimistic mode](#cover-optimistic-mode).
+ required: false
+ type: boolean
+ default: false
+ tilt_template:
+ description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current tilt state will be set to `unknown`.
+ required: false
+ type: template
+{% endconfiguration %}
+
+## Legacy Fan configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#fan)._
+
+This format is configured as a platform for the `fan` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+fan:
+ - platform: template
+ fans:
+ bedroom_fan:
+ friendly_name: "Bedroom fan"
+ value_template: "{{ states('input_boolean.state') }}"
+ percentage_template: "{{ states('input_number.percentage') }}"
+ preset_mode_template: "{{ states('input_select.preset_mode') }}"
+ oscillating_template: "{{ states('input_select.osc') }}"
+ direction_template: "{{ states('input_select.direction') }}"
+ turn_on:
+ action: script.fan_on
+ turn_off:
+ action: script.fan_off
+ set_percentage:
+ action: script.fans_set_speed
+ data:
+ percentage: "{{ percentage }}"
+ set_preset_mode:
+ action: script.fans_set_preset_mode
+ data:
+ preset_mode: "{{ preset_mode }}"
+ set_oscillating:
+ action: script.fan_oscillating
+ data:
+ oscillating: "{{ oscillating }}"
+ set_direction:
+ action: script.fan_direction
+ data:
+ direction: "{{ direction }}"
+ speed_count: 6
+ preset_modes:
+ - 'auto'
+ - 'smart'
+ - 'whoosh'
+```
+
+{% endraw %}
+
+{% configuration %}
+ fans:
+ description: List of your fans.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this fan. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: "Defines a template to get the state of the fan. Valid values: `on`, `off`"
+ required: true
+ type: template
+ percentage_template:
+ description: Defines a template to get the speed percentage of the fan.
+ required: false
+ type: template
+ preset_mode_template:
+ description: Defines a template to get the preset mode of the fan.
+ required: false
+ type: template
+ oscillating_template:
+ description: "Defines a template to get the osc state of the fan. Valid values: `true`, `false`"
+ required: false
+ type: template
+ direction_template:
+ description: "Defines a template to get the direction of the fan. Valid values: `forward`, `reverse`"
+ required: false
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ turn_on:
+ description: Defines an action to run when the fan is turned on.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action to run when the fan is turned off.
+ required: true
+ type: action
+ set_percentage:
+ description: Defines an action to run when the fan is given a speed percentage command.
+ required: false
+ type: action
+ set_preset_mode:
+ description: Defines an action to run when the fan is given a preset command.
+ required: false
+ type: action
+ set_oscillating:
+ description: Defines an action to run when the fan is given an osc state command.
+ required: false
+ type: action
+ set_direction:
+ description: Defines an action to run when the fan is given a direction command.
+ required: false
+ type: action
+ preset_modes:
+ description: List of preset modes the fan is capable of. This is an arbitrary list of strings and must not contain any speeds.
+ required: false
+ type: [string, list]
+ default: []
+ speed_count:
+ description: The number of speeds the fan supports. Used to calculate the percentage step for the `fan.increase_speed` and `fan.decrease_speed` actions.
+ required: false
+ type: integer
+ default: 100
+{% endconfiguration %}
+
+## Legacy Light configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#light)._
+
+This format is configured as a platform for the `light` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+light:
+ - platform: template
+ lights:
+ theater_lights:
+ friendly_name: "Theater Lights"
+ level_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int }}"
+ value_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}"
+ temperature_template: "{{states('input_number.temperature_input') | int}}"
+ hs_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})"
+ effect_list_template: "{{ state_attr('light.led_strip', 'effect_list') }}"
+ turn_on:
+ action: script.theater_lights_on
+ turn_off:
+ action: script.theater_lights_off
+ set_level:
+ action: script.theater_lights_level
+ data:
+ brightness: "{{ brightness }}"
+ set_temperature:
+ action: input_number.set_value
+ data:
+ value: "{{ color_temp }}"
+ entity_id: input_number.temperature_input
+ set_hs:
+ - action: input_number.set_value
+ data:
+ value: "{{ h }}"
+ entity_id: input_number.h_input
+ - action: input_number.set_value
+ data:
+ value: "{{ s }}"
+ entity_id: input_number.s_input
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ transition: "{{ transition | float }}"
+ hs_color:
+ - "{{ hs[0] }}"
+ - "{{ hs[1] }}"
+ set_effect:
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ effect: "{{ effect }}"
+ supports_transition_template: "{{ true }}"
+```
+
+{% endraw %}
+
+{% configuration %}
+ lights:
+ description: List of your lights.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this light. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: Defines a template to get the state of the light.
+ required: false
+ type: template
+ default: optimistic
+ level_template:
+ description: Defines a template to get the brightness of the light.
+ required: false
+ type: template
+ default: optimistic
+ temperature_template:
+ description: Defines a template to get the color temperature of the light.
+ required: false
+ type: template
+ default: optimistic
+ hs_template:
+ description: Defines a template to get the HS color of the light. Must render a tuple (hue, saturation).
+ required: false
+ type: template
+ default: optimistic
+ rgb_template:
+ description: Defines a template to get the RGB color of the light. Must render a tuple or a list (red, green, blue).
+ required: false
+ type: template
+ default: optimistic
+ rgbw_template:
+ description: Defines a template to get the RGBW color of the light. Must render a tuple or a list (red, green, blue, white).
+ required: false
+ type: template
+ default: optimistic
+ rgbww_template:
+ description: Defines a template to get the RGBWW color of the light. Must render a tuple or a list (red, green, blue, cold white, warm white).
+ required: false
+ type: template
+ default: optimistic
+ supports_transition_template:
+ description: Defines a template to get if light supports transition. Should return boolean value (True/False). If this value is `True` transition parameter in a turn on or turn off call will be passed as a named parameter `transition` to either of the scripts.
+ required: false
+ type: template
+ default: false
+ effect_list_template:
+ description: Defines a template to get the list of supported effects. Must render a list
+ required: inclusive
+ type: template
+ default: optimistic
+ effect_template:
+ description: Defines a template to get the effect of the light.
+ required: inclusive
+ type: template
+ default: optimistic
+ min_mireds_template:
+ description: Defines a template to get the min mireds value of the light.
+ required: false
+ type: template
+ default: optimistic
+ max_mireds_template:
+ description: Defines a template to get the max mireds value of the light.
+ required: false
+ type: template
+ default: optimistic
+ icon_template:
+ description: Defines a template for an icon or picture, e.g., showing a different icon for different states.
+ required: false
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ turn_on:
+ description: Defines an action to run when the light is turned on. May receive variables `brightness` and/or `transition`.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action to run when the light is turned off. May receive variable `transition`.
+ required: true
+ type: action
+ set_level:
+ description: Defines an action to run when the light is given a brightness command. The script will only be called if the `turn_on` call only has brightness, and optionally transition. Receives variables `brightness` and optionally `transition`.
+ required: false
+ type: action
+ set_temperature:
+ description: Defines an action to run when the light is given a color temperature command. Receives variable `color_temp`. May also receive variables `brightness` and/or `transition`.
+ required: false
+ type: action
+ set_hs:
+ description: "Defines an action to run when the light is given a hs color command. Available variables: `hs` as a tuple, `h` and `s`"
+ required: false
+ type: action
+ set_rgb:
+ description: "Defines an action to run when the light is given an RGB color command. Available variables: `rgb` as a tuple, `r`, `g` and `b`."
+ required: false
+ type: action
+ set_rgbw:
+ description: "Defines an action to run when the light is given an RGBW color command. Available variables: `rgbw` as a tuple, `rgb` as a tuple, `r`, `g`, `b` and `w`."
+ required: false
+ type: action
+ set_rgbww:
+ description: "Defines an action to run when the light is given an RGBWW color command. Available variables: `rgbww` as a tuple, `rgb` as a tuple, `r`, `g`, `b`, `cw` and `ww`."
+ required: false
+ type: action
+ set_effect:
+ description: Defines an action to run when the light is given an effect command. Receives variable `effect`. May also receive variables `brightness` and/or `transition`.
+ required: inclusive
+ type: action
+{% endconfiguration %}
+
+## Legacy Lock configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#lock)._
+
+This format is configured as a platform for the `lock` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+lock:
+ - platform: template
+ name: Garage door
+ value_template: "{{ is_state('sensor.door', 'on') }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.door
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.door
+```
+
+{% endraw %}
+
+{% configuration %}
+ name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ default: Template Lock
+ unique_id:
+ description: An ID that uniquely identifies this lock. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: Defines a template to set the state of the lock.
+ required: true
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ code_format_template:
+ description: Defines a template to get the `code_format` attribute of the entity. This template must evaluate to a valid [Python regular expression](https://docs.python.org/3/library/re.html#regular-expression-syntax) or `None`. If it evaluates to a not-`None` value, the user is prompted to enter a code when interacting with the lock. The code will be matched against the regular expression, and only if it matches, the lock/unlock actions will be executed. The actual _validity_ of the entered code must be verified within these actions. If there's a syntax error in the template, the entity will be unavailable. If the template fails to render for other reasons or if the regular expression is invalid, no code will be accepted and the lock/unlock actions will never be invoked.
+ required: false
+ type: template
+ default: None
+ lock:
+ description: Defines an action to run when the lock is locked.
+ required: true
+ type: action
+ unlock:
+ description: Defines an action to run when the lock is unlocked.
+ required: true
+ type: action
+ open:
+ description: Defines an action to run when the lock is opened.
+ required: false
+ type: action
+ optimistic:
+ description: Flag that defines if lock works in optimistic mode.
+ required: false
+ type: boolean
+ default: false
+{% endconfiguration %}
+
## Legacy Sensor configuration format
-_This format still works but is no longer recommended. [Use modern configuration](#configuration-variables)._
+_This format still works but is no longer recommended. [Use modern configuration](#sensor)._
This format is configured as a platform for the `sensor` integration and not directly under the `template` integration.
@@ -1476,8 +3353,282 @@ sensor:
default: None
{% endconfiguration %}
-## Event `event_template_reloaded`
+## Legacy Switch configuration format
-Event `event_template_reloaded` is fired when Template entities have been reloaded and entities thus might have changed.
+_This format still works but is no longer recommended. [Use modern configuration](#switch)._
-This event has no additional data.
+This format is configured as a platform for the `switch` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+switch:
+ - platform: template
+ switches:
+ skylight:
+ value_template: "{{ is_state('sensor.skylight', 'on') }}"
+ turn_on:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ turn_off:
+ action: switch.turn_off
+ target:
+ entity_id: switch.skylight_close
+```
+
+{% endraw %}
+
+{% configuration %}
+ switches:
+ description: List of your switches.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this switch. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: Defines a template to set the state of the switch. If not defined, the switch will optimistically assume all commands are successful.
+ required: false
+ type: template
+ default: optimistic
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ turn_on:
+ description: Defines an action or list of actions to run when the switch is turned on.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action or list of actions to run when the switch is turned off.
+ required: true
+ type: action
+ icon_template:
+ description: Defines a template for the icon of the switch.
+ required: false
+ type: template
+ entity_picture_template:
+ description: Defines a template for the picture of the switch.
+ required: false
+ type: template
+{% endconfiguration %}
+
+## Legacy Vacuum configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#vacuum)._
+
+This format is configured as a platform for the `vacuum` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+vacuum:
+ - platform: template
+ vacuums:
+ living_room_vacuum:
+ start:
+ action: script.vacuum_start
+```
+
+{% endraw %}
+
+{% configuration %}
+ vacuums:
+ description: List of your vacuums.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this vacuum. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: "Defines a template to get the state of the vacuum. Valid value: `docked`/`cleaning`/`idle`/`paused`/`returning`/`error`"
+ required: false
+ type: template
+ battery_level_template:
+ description: "Defines a template to get the battery level of the vacuum. Legal values are numbers between `0` and `100`."
+ required: false
+ type: template
+ fan_speed_template:
+ description: Defines a template to get the fan speed of the vacuum.
+ required: false
+ type: template
+ attribute_templates:
+ description: Defines templates for attributes of the sensor.
+ required: false
+ type: map
+ keys:
+ "attribute: template":
+ description: The attribute and corresponding template.
+ required: true
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ start:
+ description: Defines an action to run when the vacuum is started.
+ required: true
+ type: action
+ pause:
+ description: Defines an action to run when the vacuum is paused.
+ required: false
+ type: action
+ stop:
+ description: Defines an action to run when the vacuum is stopped.
+ required: false
+ type: action
+ return_to_base:
+ description: Defines an action to run when the vacuum is given a return to base command.
+ required: false
+ type: action
+ clean_spot:
+ description: Defines an action to run when the vacuum is given a clean spot command.
+ required: false
+ type: action
+ locate:
+ description: Defines an action to run when the vacuum is given a locate command.
+ required: false
+ type: action
+ set_fan_speed:
+ description: Defines an action to run when the vacuum is given a command to set the fan speed.
+ required: false
+ type: action
+ fan_speeds:
+ description: List of fan speeds supported by the vacuum.
+ required: false
+ type: [string, list]
+{% endconfiguration %}
+
+## Legacy Weather configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#weather)._
+
+This format is configured as a platform for the `weather` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+weather:
+ - platform: template
+ name: "My Weather Station"
+ condition_template: "{{ states('weather.my_region') }}"
+ temperature_template: "{{ states('sensor.temperature') | float }}"
+ temperature_unit: "°C"
+ humidity_template: "{{ states('sensor.humidity') | float }}"
+ forecast_daily_template: "{{ state_attr('weather.my_region', 'forecast_data') }}"
+```
+
+{% endraw %}
+
+{% configuration %}
+name:
+ description: Name to use in the frontend.
+ required: true
+ type: template
+unique_id:
+ description: An ID that uniquely identifies this weather entity. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+condition_template:
+ description: The current weather condition.
+ required: true
+ type: template
+temperature_template:
+ description: The current temperature.
+ required: true
+ type: template
+dew_point_template:
+ description: The current dew point.
+ required: false
+ type: template
+apparent_temperature_template:
+ description: The current apparent (feels-like) temperature.
+ required: false
+ type: template
+temperature_unit:
+ description: Unit for temperature_template output. Valid options are °C, °F, and K.
+ required: false
+ type: string
+humidity_template:
+ description: The current humidity.
+ required: true
+ type: template
+attribution_template:
+ description: The attribution to be shown in the frontend.
+ required: false
+ type: string
+pressure_template:
+ description: The current air pressure.
+ required: false
+ type: template
+pressure_unit:
+ description: Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.
+ required: false
+ type: string
+wind_speed_template:
+ description: The current wind speed.
+ required: false
+ type: template
+wind_gust_speed_template:
+ description: The current wind gust speed.
+ required: false
+ type: template
+wind_speed_unit:
+ description: Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.
+ required: false
+ type: string
+wind_bearing_template:
+ description: The current wind bearing.
+ required: false
+ type: template
+ozone_template:
+ description: The current ozone level.
+ required: false
+ type: template
+cloud_coverage_template:
+ description: The current cloud coverage.
+ required: false
+ type: template
+visibility_template:
+ description: The current visibility.
+ required: false
+ type: template
+visibility_unit:
+ description: Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.
+ required: false
+ type: string
+forecast_daily_template:
+ description: Daily forecast data.
+ required: false
+ type: template
+forecast_hourly_template:
+ description: Hourly forecast data.
+ required: false
+ type: template
+forecast_twice_daily_template:
+ description: Twice daily forecast data.
+ required: false
+ type: template
+precipitation_unit:
+ description: Unit for precipitation output. Valid options are km, mi, ft, m, cm, mm, in, yd.
+ required: false
+ type: string
+{% endconfiguration %}
diff --git a/source/_integrations/tesla_fleet.markdown b/source/_integrations/tesla_fleet.markdown
index f72272cce2b..58878ea0b5b 100644
--- a/source/_integrations/tesla_fleet.markdown
+++ b/source/_integrations/tesla_fleet.markdown
@@ -36,181 +36,119 @@ ha_platforms:
ha_integration_type: integration
---
-The Tesla Fleet API {% term integration %} exposes various sensors from Tesla vehicles and energy sites using the [Tesla Fleet API](https://developer.tesla.com/).
+The **Tesla Fleet** {% term integration %} lets you control Tesla vehicles and energy sites using the [Tesla Fleet API](https://developer.tesla.com/).
## Prerequisites
-You must have:
+You need to configure developer credentials and host a public key file to allow Home Assistant to communicate with your Tesla account.
-- A [Tesla](https://tesla.com) account
-- A [Developer Application](https://developer.tesla.com/en_US/dashboard)
-- A web domain and host that you can serve your public key file from. Either locally (see [NGINX Home Assistant SSL proxy Add-on](https://github.com/home-assistant/addons/blob/master/nginx_proxy/DOCS.md) instructions below), or alternatively, with some free web-options (ordered from easier to more complex):
- - [FleetKey.cc](https://fleetkey.cc)
- - [MyTeslamate.com](https://app.myteslamate.com/fleet)
- - [AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html)
- - [Cloudflare Pages](https://pages.cloudflare.com/)
- - [Firebase Hosting](https://firebase.google.com/docs/hosting)
+- A [Tesla](https://tesla.com) account with verified email
+- A web domain to host your public key file:
+ - [NGINX Home Assistant SSL proxy Add-on](https://github.com/home-assistant/addons/blob/master/nginx_proxy/DOCS.md) (recommended)
+ - External hosting service ([FleetKey.cc](https://fleetkey.cc), [MyTeslamate.com](https://app.myteslamate.com/fleet), etc.)
+{% warning %}
+The China region is currently not supported by this {% term integration %}.
+{% endwarning %}
+
+## Tesla Developer Application
+
+Create a Tesla Developer Application to connect Home Assistant with the Tesla Fleet API.
+
+1. Create a developer application:
+ - Go to [developer.tesla.com/request](https://developer.tesla.com/request)
+ - Select your Tesla account from the dropdown
+
+2. Enter application details:
+ - Application name: A name to identify the application
+ - Description: Enter a brief description of your integration
+ - Purpose of Usage: Explain how you'll use the API (e.g., "Home Assistant")
+
+3. Configure client details:
+ - OAuth Grant Type: Select **Authorization Code and Machine-to-Machine**
+ - Allowed Origin URL(s): Enter your domain's URL, for example `https://yourdomain.com/`
+ - Allowed Redirect URI: Enter `https://my.home-assistant.io/redirect/oauth`
+ - Allowed Returned URL(s): Leave this field empty (not required)
+
+4. Select desired API scopes:
+ - Vehicle Information (mandatory for vehicles)
+ - Vehicle Location (recommended)
+ - Vehicle Commands (recommended)
+ - Energy Product Information (mandatory for energy products)
+ - Energy Product Settings (recommended)
+
+5. Set up billing (optional):
+ - Tesla provides $10 monthly credit for personal use
+ - You can add billing details later if needed
+
+6. Save your credentials:
+ - After creating the application, go to **View Details** > **Credentials & APIs**
+ - Note your **Client ID** and **Client Secret** - you'll need these to configure Home Assistant.
{% include integrations/config_flow.md %}
-{% details "Hosting a Public/Private Key Pair with the NGINX Home Assistant SSL proxy Add-on" %}
+1. Add application credentials
+ - Enter your application Client ID and Client Secret from your Tesla Developer Application
+ - This step will be skipped if you already have exactly one Tesla Fleet [application credential](/integrations/application_credentials/) already configured
-While the [Tesla Fleet API documentation Step 3](https://developer.tesla.com/docs/fleet-api/getting-started/what-is-fleet-api#step-3-generate-a-public-private-key-pair) mentions this as a later step, it is recommended that you do this first to ensure key reachability before the rest of the integration.
-With this method, it is assumed that the [NGINX Home Assistant SSL proxy Add-on](https://github.com/home-assistant/addons/blob/master/nginx_proxy/DOCS.md) is running as a reverse proxy for external access to your Home Assistant installation.
+2. Authenticate with Tesla:
+ - You'll be redirected to Tesla's login page
+ - Enter your Tesla account credentials
+ - On the authorization page, select **Select All** and then **Allow** to allow all the scopes you previously selected
-1. **Open an SSH Terminal** on your Home Assistant installation using the [Terminal & SSH Add-on](https://www.home-assistant.io/common-tasks/os#installing-and-using-the-ssh-add-on).
-2. Run this command to **create a private key**: `openssl ecparam -name prime256v1 -genkey -noout -out private-key.pem`
-3. Run this command to **create and associate a public key** with it: `openssl ec -in private-key.pem -pubout -out public-key.pem`
-4. **Backup both these files** somewhere safe and private for access later.
-5. **Copy the public key** file `public-key.pem` to `/share/tesla/.well-known/appspecific/com.tesla.3p.public-key.pem`. It needs to be exactly this location for Tesla's API to partner with your account correctly.
-6. Create a **NGINX configuration file** `nginx_proxy_default_tesla.conf` in `/share` with: `echo 'location /.well-known/appspecific/com.tesla.3p.public-key.pem {\n root /share/tesla;\n}' > /share/nginx_proxy_default_tesla.conf`
-7. Close the Terminal and go to Settings->Add-Ons->**NGINX Home Assistant SSL proxy**->Configuration page. Change the `customize.active` option from the default `false` to `true`. Leave the `config.default` option at its default value: `nginx_proxy_default*.conf`.
-8. **Restart the NGINX Home Assistant SSL proxy Add-on** on the Settings->Add-Ons->NGINX Home Assistant SSL proxy->Info page and test if the public key file is accessible at `https://my.domain.com/.well-known/appspecific/com.tesla.3p.public-key.pem`
+3. Redirect to Home Assistant:
+ - Confirm you want to **Link account to Home Assistant**
-{% enddetails %}
+4. Enter domain
+ - Enter the domain name you intend to host your public key on
+ - This domain should be the same or a subdomain of your origin domain, and must use a valid SSL certificate.
-{% details "Hosting a Public/Private Key Pair" %}
+5. Register public key
+ - Upload the public key shown to the domain you entered in step 4 at `.well-known/appspecific/com.tesla.3p.public-key.pem`
-While the [Tesla Fleet API documentation Step 3](https://developer.tesla.com/docs/fleet-api/getting-started/what-is-fleet-api#step-3-generate-a-public-private-key-pair) mentions this as a later step, it is recommended that you do this first to ensure key reachability before the rest of the integration.
+6. Install Virtual Key
+ - Use your smartphone to scan the QR code or enter the address to install your public key on your vehicles with the Tesla app.
+ - This process needs to be repeated for each vehicle, excluding Model S and Model X vehicles manufactured before 2021.
-1. Open a new terminal on your computer.
-2. Run this command to create a private key: `openssl ecparam -name prime256v1 -genkey -noout -out private-key.pem`
-3. Run this command to create and associate a public key with it: `openssl ec -in private-key.pem -pubout -out public-key.pem`
-4. Rename the public key file to `com.tesla.3p.public-key.pem`. This needs to be exactly this for Tesla's API to partner with your account correctly.
-5. Backup both these files somewhere safe and private for access later.
-6. Upload the public key file to your domain at the path `/.well-known/appspecific/com.tesla.3p.public-key.pem`. For example, if your domain is `https://my.domain.com`, the public key file must be accessible at `https://my.domain.com/.well-known/appspecific/com.tesla.3p.public-key.pem`. Do not use redirection logic to handle this, or the Tesla API will not recognize your app later in the process.
+## Hosting with NGINX Add-on (optional)
-{% enddetails %}
-
-{% details "Setting up the Developer Application" %}
-
-These steps are also summarized in the [Tesla Fleet API documentation Step 2](https://developer.tesla.com/docs/fleet-api/getting-started/what-is-fleet-api#step-2-create-an-application), but it is recommended to follow the steps below to cover specific details.
-
-1. If you have not already set up your [Tesla Developer account](https://developer.tesla.com/teslaaccount): Confirm that you have a verified email and multi-factor authentication set up.
-2. Navigate to the [Developer dashboard](https://developer.tesla.com/en_US/dashboard). Change your locale if needed to wherever your account is based, using the globe icon at the top-right corner.
-3. Select **Create New Application**. This should launch a new page with the header **Create Fleet API Application**.
-4. For simple integrations, under **Registration Type**, select **Just for me**. If you're confident about your situation being a business setup instead, select **For my business**. Select **Next**.
-5. At the **Application Details** step, use a name that is easy to refer to later, such as `ha-integration`. This will be needed later while configuring the integration. Select **Next**.
-6. At the **Client Details** step, under **Oauth Grant Type**, select **Authorization Code and Machine-to-Machine**.
- - Under **Allowed Origin URL(s)**, enter your domain where you hosted your public key earlier. Using the example above, this would be `https://my.domain.com/`.
- - Under **Allowed Redirect URI(s)**, enter `https://my.home-assistant.io/redirect/oauth`.
- - Select **Next**.
-7. At the **API & Scopes** step, select the configurations you'd like to access.
- - At least one of `Vehicle Information` or `Energy Product Information` **must** be selected for the integration to function. It is recommended you select all scopes for full functionality.
- - If you're unsure, you can select only one of these two required scopes for now and update the scopes later from the Developer Dashboard. However, note that if the scopes are updated, you will need to reconfigure the integration fully (refer to the **Integration is broken and needs to be reconfigured** troubleshooting steps below).
- - Select **Next**.
-8. At the **Billing Details (Optional)** step, enter your billing details if needed, then select **Submit**. Tesla does not support billing in all countries yet. **Developers in countries that do not yet support payments will not see this step**.
- - Tesla provides a $10 monthly credit for personal API usage, so your level of usage may be covered for free. Detailed pricing info for commands, data polling, and wake signals can be found at [developer.tesla.com](https://developer.tesla.com). Use these details to calculate your usage estimate if you rely heavily on this integration.
- - If unsure, you can select **Skip & Submit** for now and add the billing details later when your usage is close to the free threshold.
-9. Your developer application is ready for use!
-
-{% enddetails %}
-
-{% details "Register your application as a Fleet API partner" %}
-
-These steps are also summarized in the [Tesla Fleet API documentation Step 4](https://developer.tesla.com/docs/fleet-api/getting-started/what-is-fleet-api#step-4-call-the-register-endpoint), but the steps below provide easier copy-pasteable code and additional checks.
-
-{% warning %}
-The following steps involve sensitive credentials. Never share your `Client Secret` or access token with anyone directly, and ensure you're working in a secure environment.
-{% endwarning %}
-
-1. Get your OAuth details by going to your [Developer dashboard](https://developer.tesla.com/en_US/dashboard). Under the app you set up for Home Assistant integration select **View Details**. Then, select the **Credentials & APIs** tab. Note the `Client ID` and `Client Secret` strings.
-
-2. Run this CURL request, replacing the variable values as specified in the notes below:
+1. Create the NGINX configuration:
```shell
- CLIENT_ID=REPLACE_THIS_WITH_YOUR_CLIENT_ID
- CLIENT_SECRET=REPLACE_THIS_WITH_YOUR_CLIENT_SECRET
- AUDIENCE="https://fleet-api.prd.na.vn.cloud.tesla.com"
- curl --request POST \
- --header 'Content-Type: application/x-www-form-urlencoded' \
- --data-urlencode 'grant_type=client_credentials' \
- --data-urlencode "client_id=$CLIENT_ID" \
- --data-urlencode "client_secret=$CLIENT_SECRET" \
- --data-urlencode 'scope=openid vehicle_device_data vehicle_cmds vehicle_charging_cmds' \
- --data-urlencode "audience=$AUDIENCE" \
- 'https://fleet-auth.prd.vn.cloud.tesla.com/oauth2/v3/token'
+ echo 'location /.well-known/appspecific/com.tesla.3p.public-key.pem {
+ root /share/tesla;
+ }' > /share/nginx_proxy_default_tesla.conf
```
- Notes about the variable values:
- - For the `CLIENT_SECRET` value, depending on your terminal environment, you may need to escape any `!` and `$` characters in the string, or the curl request will fail.
- - Replace the `AUDIENCE` value with your region-specific URL. The URL in the example is for users in North America and Asia-Pacific (excluding China). Refer to the [Base URLs documentation](https://developer.tesla.com/docs/fleet-api/getting-started/base-urls) for the URLs for other regions.
- - For the `scope=...` line, replace the values with a space-delimited list of [the official scope keywords](https://developer.tesla.com/docs/fleet-api/authentication/overview#scopes), as you defined them earlier in your app.
-3. The CURL request should return a response that looks something like:
+2. Copy the public key shown during setup to `/share/tesla`
- ```json
- {"access_token":"ACCESS_TOKEN","expires_in":28800,"token_type":"Bearer"}
- ```
+3. Configure the NGINX Add-on:
+ - Go to **Settings** > **Add-ons** > **NGINX Home Assistant SSL proxy** > **Configuration**
+ - Change `customize.active` from `false` to `true`
+ - Leave `config.default` at its default value: `nginx_proxy_default*.conf`
- This is your access token. Copy everything between the double-quotes to be used next.
-4. Run this CURL request, replacing the variable values as specified in the notes below:
+4. Restart the NGINX Add-on and verify your public key is accessible at:
+ `https://yourdomain.com/.well-known/appspecific/com.tesla.3p.public-key.pem`
- ```shell
- curl --location 'https://fleet-api.prd.na.vn.cloud.tesla.com/api/1/partner_accounts' \
- --header 'Content-Type: application/json' \
- --header 'Authorization: Bearer ACCESS_TOKEN' \
- --data '{
- "domain": "my.domain.com"
- }'
- ```
+## Data updates
- - If you had to change the `AUDIENCE` URL for your region in step 2, update the main domain of the `--location` arg.
- - Replace `ACCESS_TOKEN` with the access token that you copied in the previous step.
- - In the `domain:` line, enter your domain without the leading `https://` and the trailing `/`.
-5. You should see a response that contains information about your Tesla Fleet developer app, pricing info, and such. This confirms that the Tesla Fleet API has successfully registered your developer application as a partner. The hard part is over.
+The {% term integration %} {% term polling polls %} each vehicle every 10 minutes while it's awake. This is designed to stay within Tesla's $10 monthly credit for most users, which you can monitor usage in the [Tesla Developer Dashboard](https://developer.tesla.com/en_US/dashboard). Energy product APIs are free to use.
-{% enddetails %}
-
-{% details "Linking the Developer Application with Home Assistant" %}
-
-1. Get your OAuth details by going to your [Developer dashboard](https://developer.tesla.com/en_US/dashboard). Select **View Details** under the app you set up for Home Assistant integration. Then, select the **Credentials & APIs** tab. Note the `Client ID` and `Client Secret` strings, these will be needed later.
-2. In Home Assistant, the integration wizard should walk you through the default steps. If not already started, scroll above and select the **ADD INTEGRATION TO MY** button to start the integration wizard. The integration will ask you for all of the necessary integration configurations.
-3. In the **Add credentials** step in the wizard, enter your Tesla Fleet developer application name (from step 5 in the **Setting up the Developer Application** section above), and the Oauth Client ID and Client Secret (from step 1 above). Select **Submit**.
-4. At this step, you should be taken to the Tesla authentication page. You will need to re-enter your Tesla account login credentials.
-5. At the confirmation page with the header **Allow ha-integration access to your Tesla Account** (the specific application name will be whatever you set earlier), select the **Select All** button. This list of scopes is already limited to the specific scopes you chose for the application information earlier, so it is not necessary to review them again. Select **Allow**.
-6. You should now see a Home Assistant page asking if you would like to **Link account to Home Assistant?**. Select **Link account**.
-7. You're all set! The integration should fetch your device details into Home Assistant.
-
-{% enddetails %}
-
-## Vehicle data polling interval
-
-The integration is configured to {% term polling poll %} each vehicle every 10 minutes while it's awake.
-This is long enough that a single vehicle can be polled 24/7 without exceeding the USD$10 credit Tesla provides.
-It is expected that most vehicles are asleep over 50% of the day, so the defaults should also suit users with multiple vehicles or that want to run automated commands.
-
-If the default polling interval does not suit your needs, you can [define a custom polling interval](https://www.home-assistant.io/common-tasks/general/#defining-a-custom-polling-interval).
-
-## Scopes
-
-When connecting your Tesla account to Home Assistant, you **must** select at least one of the `Vehicle Information` or `Energy Product Information` scopes. It is recommended you select all scopes for full functionality. The `Vehicle Location` scope was added in Home Assistant 2024.1, so any authorizations performed on previous releases that want this scope will need to be [modified](https://accounts.tesla.com/en_au/account-settings/security?tab=tpty-apps).
-
-## Pay per use
-
-Previously, Tesla restricted this integration to a very modest rate limit. However, from January 2025, accounts in eligible countries will be charged for every API call. Here's what you need to know:
-
-- Tesla provides a USD$10 credit per developer account per calendar month
-- Every vehicle coordinator refresh, vehicle command, and wake up has a cost
-- This credit only allows for a maximum of 5000 coordinator refreshes
-- Energy product APIs are free to use at this time
-- To go beyond the free credit, you must provide payment details to Tesla
-
-For more details, please see [developer.tesla.com](https://developer.tesla.com).
-
-Note that Tesla does not support billing in all countries yet. **Developers in countries that do not yet support payments will not be able to review their billing or usage**. For countries that do support billing, the current billing usage can be viewed at any time by going to your [Developer Dashboard](https://developer.tesla.com/en_US/dashboard), select **View Details** under the app you set up for Home Assistant integration. Then, select the **Application Usage** tab.
+If you need different polling intervals, you can [define a custom polling interval](https://www.home-assistant.io/common-tasks/general/#defining-a-custom-polling-interval).
## Command signing
-Certain vehicles, including all vehicles manufactured since late 2023, require vehicle commands to be signed with a private key. All actions on vehicle entities will fail with an error if this is required and the key has not been setup correctly.
+Certain vehicles, including all vehicles manufactured since late 2023, require vehicle commands to be signed with a private key. All {% term actions %} on vehicle {% term entities %} will fail with an error if this is required and the key has not been setup correctly.
-The integration expects your private key to be located at `config/tesla_fleet.key`.
-
-Your public key must be added to each of your vehicles by visiting https://tesla.com/_ak/YOUR.DOMAIN and following the instructions in the Tesla app.
-If you're using an iPhone, you may need to use Safari to open the webpage and finish the setup.
+Your public key must be added to each of these vehicles by visiting `https://tesla.com/_ak/YOUR_DOMAIN` and following the instructions in the Tesla app.
+If you're using an iPhone, you may need to use Safari to open the webpage and finish the setup.
For more details see [Tesla Fleet API vehicle commands documentation](https://developer.tesla.com/docs/fleet-api/endpoints/vehicle-commands#key-pairing).
+## Generating your own key pair
+
+The {% term integration %} generates a private key automatically at `config/tesla_fleet.key`. You can replace it with your own key (such as one from another Home Assistant instance) before configuring the integration. You can generate your own key pair following [Tesla's documentation](https://developer.tesla.com/docs/fleet-api/getting-started/what-is-fleet-api#step-3-generate-a-public-private-key-pair).
+
## Entities
These are the entities available in the Tesla Fleet integration. Not all entities are enabled by default, and not all values are always available.
@@ -360,22 +298,19 @@ These are the entities available in the Tesla Fleet integration. Not all entitie
## Vehicle sleep
-Constant API polling will prevent most Model S and Model X vehicles manufactured before 2021 from sleeping, so the integration will stop polling these vehicles for 15 minutes, after 15 minutes of inactivity. You can call the `homeassistant.update_entity` service to force polling the API, which will reset the timer.
+Constant API {% term polling %} will prevent most Model S and Model X vehicles manufactured before 2021 from sleeping. The {% term integration %} automatically stops {% term polling %} these vehicles for 15 minutes after inactivity. You can call the `homeassistant.update_entity` {% term action %} to force {% term polling %}, which will reset the timer.
+
+## Removing the integration
+
+{% include integrations/remove_device_service.md %}
+
+- Removing the {% term integration %} does not delete your Tesla Developer Application - you can remove it manually from the [Tesla Developer Dashboard](https://developer.tesla.com/en_US/dashboard) if no longer needed.
## Troubleshooting
-- **General troubleshooting steps**
- 1. Confirm that your vehicle or energy product can be accessed and updates within the official Tesla app. This rules out any issues that are outside the control of Home Assistant or this integration.
- 2. For some errors in the integration, waking the vehicle or energy product through the official app, then restarting Home Assistant will sometimes help re-authenticate the connection with Tesla's API. You may be asked to re-authenticate through the Tesla website.
+- **Setup errors**: Verify your public key is accessible at the correct URL and you've completed all registration steps with Tesla
+- **Command failures**: Ensure `tesla_fleet.key` exists in your Home Assistant config directory and add your public key to vehicles via `https://tesla.com/_ak/YOUR_DOMAIN`
+- **{% term Integration %} stopped working**: Use the reconfigure option in {% my integrations title="**Settings** > **Devices & services**" %} > **Tesla Fleet**
+- **Billing errors**: Check your Tesla Developer Dashboard for usage limits and add billing information if needed
-- **Integration is broken or needs to be reconfigured**
- 1. Ensure that you have a Tesla developer application ready for usage (refer to the instructions in the **Setting up the Developer Application** section above).
- 2. Go to your Tesla Fleet integration page in Home Assistant, then select the **Reconfigure** button to bring the integration wizard up.
- - If the **Reconfigure** button is not visible, clear any Application Credentials related to Tesla Fleet from your Application Credentials page (can be found at `http://homeassistant.local:PORT/config/application_credentials`), then restart Home Assistant. After the restart, navigate to the Tesla Fleet integration page, and the **Reconfigure ** button should be visible.
- 3. Follow the steps in the **Linking the Developer Application with Home Assistant** section above.
-
-- **Integration no longer works after the January 2025 API pricing updates**
- 1. Refer to the **Integration is broken** troubleshooting steps above.
-
-- **Integration shows `a condition has not been met to process the request`**
- 1. Confirm that you've run all the steps from both the **Hosting a Public/Private Key Pair** and **Register your application as a Fleet API partner** sections above.
+If you have an error with your credentials, you can delete them in the {% my application_credentials title="Application Credentials" %} user interface.
diff --git a/source/_integrations/text.mqtt.markdown b/source/_integrations/text.mqtt.markdown
index 496f067c8e6..777e50140ea 100644
--- a/source/_integrations/text.mqtt.markdown
+++ b/source/_integrations/text.mqtt.markdown
@@ -166,7 +166,7 @@ name:
type: string
default: "MQTT Text"
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
pattern:
diff --git a/source/_integrations/thermador.markdown b/source/_integrations/thermador.markdown
index cebeedf5072..972e25e9872 100644
--- a/source/_integrations/thermador.markdown
+++ b/source/_integrations/thermador.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/third_reality.markdown b/source/_integrations/third_reality.markdown
index 46039115399..70960ec6fe2 100644
--- a/source/_integrations/third_reality.markdown
+++ b/source/_integrations/third_reality.markdown
@@ -28,18 +28,4 @@ ha_iot_standard:
ha_brand: true
---
-[Third Reality](https://3reality.com) is a member of the Works with Home Assistant partner program for their Zigbee and Matter products. Third Reality is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Third Reality Zigbee devices work locally and integrate seamlessly with the Zigbee integration in Home Assistant (Zigbee stick required).
-
-To add Third Reality products, pair them as Zigbee or Matter devices, depending on which you have purchased:
-
-{% my add_zigbee_device badge brand=page.ha_domain %}
-
-[Learn more about Zigbee in Home Assistant.](/integrations/zha/)
-
-Third Reality Matter devices work locally and integrate seamlessly with the Matter integration in Home Assistant. As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
-
-{% my add_matter_device badge domain=page.ha_domain %}
-
-[Learn more about Matter in Home Assistant.](/integrations/matter/)
+{% include integrations/wwha.md url="https://3reality.com/" %}
diff --git a/source/_integrations/tilt_pi.markdown b/source/_integrations/tilt_pi.markdown
new file mode 100644
index 00000000000..304b6c21d5a
--- /dev/null
+++ b/source/_integrations/tilt_pi.markdown
@@ -0,0 +1,88 @@
+---
+title: Tilt Pi
+description: Instructions on how to configure a Tilt Pi.
+ha_category:
+ - Sensor
+ha_release: '2025.7'
+ha_iot_class: Local Polling
+ha_quality_scale: bronze
+ha_config_flow: true
+ha_codeowners:
+ - '@michaelheyman'
+ha_domain: tilt_pi
+ha_platforms:
+ - sensor
+related:
+ - url: https://tilthydrometer.com/collections/tilt-pi
+ title: Tilt Pi product page
+ha_integration_type: integration
+---
+
+The **Tilt Pi** {% term integration %} allows you to connect a Tilt Pi to Home Assistant to
+automatically discover Tilt Hydrometer devices.
+
+The Tilt Pi is a Raspberry Pi-based device that can read data from Tilt
+Hydrometers and broadcast it over the network. The Tilt Pi can be used to
+monitor the fermentation of beer, wine, cider, and other beverages.
+
+The benefit of the Tilt Pi is that it can be placed in a location with better
+reception than the Tilt Hydrometer itself, allowing for more reliable data
+collection.
+
+{% note %}
+For instances where you only have a Tilt Hydrometer and not a Tilt Pi, consider
+using the [Tilt Hydrometer integration](/integrations/tilt_ble).
+{% endnote %}
+
+## Prerequisites
+
+1. Have a Raspberry Pi with the Tilt Pi software installed.
+2. Have a Tilt Hydrometer in range of the Tilt Pi.
+3. Have the IP address or hostname of the Tilt Pi.
+
+{% include integrations/config_flow.md %}
+{% configuration_basic %}
+Host:
+ description: "The hostname or IP address of the Tilt Pi."
+Port:
+ description: "The port of the Tilt Pi. The default port is 1880."
+{% endconfiguration_basic %}
+
+## Supported functionality
+
+### Entities
+
+After adding the integration, you can add the Tilt Pi device to your Home
+Assistant. If the Tilt Pi was found and there are Tilt Hydrometers in its range,
+then entities will be created for each Tilt Hydrometer.
+
+You may then use these entities in automations, scripts, dashboards, and other
+integrations.
+
+#### Sensors
+
+- **Tilt Hydrometer temperature**
+ - **Description**: Current temperature of the Tilt Hydrometer.
+ - **Entity name**: `tilt__temperature`
+
+- **Tilt Hydrometer gravity**
+ - **Description**: Current specific gravity of the Tilt Hydrometer.
+ - **Entity name**: `tilt__gravity`
+
+## Data updates
+
+The Tilt Pi integration {% term polling polls %} the Tilt Pi for data every 60 seconds. This
+interval is currently not configurable.
+
+## Supported devices
+
+The following devices are known to be supported by the integration:
+
+- [Tilt™ Pi v2 Bookworm May24](https://tilthydrometer.com/collections/tilt-pi/products/tilt-pi-v2-bookworm-may24-raspberry-pi-sd-card-image-download)
+
+## Removing the integration
+
+This integration follows standard integration removal. No extra steps are
+required.
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/torque.markdown b/source/_integrations/torque.markdown
index 5b0458cd855..1d73adaa902 100644
--- a/source/_integrations/torque.markdown
+++ b/source/_integrations/torque.markdown
@@ -31,7 +31,7 @@ Under the **Realtime Web Upload** header:
- Check **Upload to web-server**.
- Enter `https://HOST/api/torque` or `https://@/HOST:PORT/api/torque` as the **Web-server URL**, where `HOST` and `PORT` are your externally accessible Home Assistant HTTP host. To use a Bearer Token, this has to be [SSL/TLS](/docs/ecosystem/certificates/).
-- Enable **Send https: Bearer Token** (available since Torque Pro 1.12.46)
+- Enable **Send HTTPS: Bearer Token** (available since Torque Pro 1.12.46)
- Paste a Long-Lived Access Token from any Home Assistant user in **Set Bearer Token** field.
- Enter an email address in **User Email Address** (this can be any non empty string you like).
- Optionally set the **Web Logging Interval**. The 2-second default may quickly fill up the Home Assistant history database.
diff --git a/source/_integrations/trend.markdown b/source/_integrations/trend.markdown
index 9a942f0c78b..8fd4ee08def 100644
--- a/source/_integrations/trend.markdown
+++ b/source/_integrations/trend.markdown
@@ -106,6 +106,12 @@ sensors:
required: false
type: integer
default: 0
+ unique_id:
+ description: >
+ An ID that uniquely identifies this sensor. Set this to a unique value to allow
+ customization through the UI and to enable the sensor to be placed in areas.
+ required: false
+ type: string
{% endconfiguration %}
## Using Multiple Samples
@@ -148,6 +154,7 @@ binary_sensor:
sensors:
temp_falling:
entity_id: sensor.outside_temperature
+ unique_id: outside_temp_falling_trend
sample_duration: 7200
max_samples: 120
min_samples: 20
@@ -156,6 +163,7 @@ binary_sensor:
temp_rising:
entity_id: sensor.outside_temperature
+ unique_id: outside_temp_rising_trend
sample_duration: 7200
max_samples: 120
min_samples: 20
diff --git a/source/_integrations/tts.markdown b/source/_integrations/tts.markdown
index dbf10248b44..6298268cf9f 100644
--- a/source/_integrations/tts.markdown
+++ b/source/_integrations/tts.markdown
@@ -46,7 +46,7 @@ Screenshot showing the state of a text-to-speech entity in the developer tools.
Modern platforms will create entities under the `tts` domain, where each entity represents one text-to-speech service provider. These entities may be used as targets for the `tts.speak` action.
-the `tts.speak` action supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`, and the media player that should output the sound is selected with `media_player_entity_id`.
+The `tts.speak` action supports `message`, `language`, `cache`, `media_player_entity_id` and `options` options. The text that should be spoken is set with `message`, and the media player that should output the sound is selected with `media_player_entity_id`. The language can be set with `language`, using the format required by the target entity platform (refer to specific platform documentation). See [cache section](#cache) for information on `cache` option. Additional settings can be specified with the `options` option, which include preferred audio settings (see [preferred audio settings](#preferred-audio-settings) section for more info) and further settings of the target entity platform, e.g., _voice, motion, speed, etc._ (refer to specific platform documentation for any supported settings).
```yaml
action: tts.speak
@@ -59,7 +59,7 @@ data:
### Action say (legacy)
-The `say` action supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`. Since release 0.92, action name can be defined in configuration `service_name` option.
+The `say` action supports `message`, `language`, `cache` and `options` options. The text that should be spoken is set with `message`. The language can be set with `language`, using the format required by the platform (refer to specific platform documentation). See [cache section](#cache) for information on `cache` option. Additional settings can be specified with the `options` option, which include preferred audio settings (see [preferred audio settings](#preferred-audio-settings) section for more info) and further settings of the target platform, e.g., _voice, motion, speed, etc._ (refer to specific platform documentation for any supported settings). Since release 0.92, action name can be defined in configuration `service_name` option.
Say to all `media_player` entities:
@@ -105,13 +105,40 @@ data:
## Cache
-The integration cache can be controlled with the `cache` option in the action to `speak` or `say`. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period.
+The integration cache can be controlled with the `cache` option in the action to `speak` or `say`, setting it to `True` to enable it (default), or `False` to disable it. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period.
+
+## Preferred audio settings
+
+Each TTS platform produces audio samples in different formats, not always compatible with every media player. TTS integration building block supports a way to configure preferred target audio format through `options` option of `speak` or `say` actions.
+
+TTS integration building block uses [FFmpeg integration](/integrations/ffmpeg) to perform audio transcoding when target entity platform does not support one or all the specified preferred audio format settings (refer to specific platform documentation for any supported setting with related supported values).
+
+Available preferred audio settings, all optional, are:
+
+- `preferred_format`: Set the audio format. When not supported by the target entity platform, the value is a file extension like `wav`, `mp3`, `ogg`, etc., among ones supported by FFmpeg tool for output files.
+- `preferred_sample_rate`: Set the sample rate. When not supported by the target entity platform, the value is in Hz as a number, among ones supported by the `-ar` parameter of FFmpeg tool.
+- `preferred_sample_channels`: Set the number of audio channels. When not supported by the target entity platform, the value is a number among ones supported by the `-ac` parameter of FFmpeg tool.
+- `preferred_sample_bytes`: Set the audio bit sampling. When not supported by the target entity platform, can only be set to `2` to use 16-bit audio sampling (any other value is ignored).
+
+Example to produce an MP3 audio at 22050Hz:
+
+```yaml
+action: tts.speak
+target:
+ entity_id: tts.example
+data:
+ media_player_entity_id: media_player.kitchen
+ message: "May the force be with you."
+ options:
+ preferred_format: mp3
+ preferred_sample_rate: 22050
+```
## REST API
### POST `/api/tts_get_url`
-Returns a URL to the generated TTS file. The `engine_id` or `platform` parameter together with `message` are required.
+Returns a URL to the generated TTS file. The `engine_id` (which is the entity id) or `platform` parameter together with `message` are required. Additional parameters `cache`, `language` and `options` are supported, as JSON attributes, as described for `speak` action.
```json
{
@@ -166,3 +193,9 @@ These requirements present the following problems, all of which create problems
- 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.
+
+### Partial, corrupted or no audio
+
+Some media players could reproduce only partial, corrupted or no audio at all when the audio format is not fully supported. In such cases it is required to experiment with different combinations of audio formats, channels, sample rates and bits using [preferred audio settings](#preferred-audio-settings) options.
+
+For example, some Google Cast devices skip initial audio part when the audio is sampled at 22050Hz, and to fix the problem it is required to set the `preferred_sample_rate` setting in the `options` option to `44100`.
diff --git a/source/_integrations/tuya.markdown b/source/_integrations/tuya.markdown
index a02185a9346..635a8276d1b 100644
--- a/source/_integrations/tuya.markdown
+++ b/source/_integrations/tuya.markdown
@@ -56,6 +56,10 @@ All Home Assistant platforms are supported by the Tuya integration, except the l
You need to have the Tuya Smart or Smart Life app installed, with an account created and
at least one device added to that account.
+During the setup process, you will need:
+- A second screen (such as a phone, tablet, or another computer) to display the QR code that appears during configuration
+- The Smart Life or Tuya Smart app installed on your mobile device to scan the QR code
+
### Obtaining User Code for sign-in
To sign-in, you will need to get your **User Code** from the Smart Life /
@@ -68,6 +72,21 @@ Tuya Smart app. You can find it by opening the app and:
{% include integrations/config_flow.md %}
+### Scanning the QR code
+
+To scan the QR code in the Smart Life app:
+1. Open the Smart Life app
+2. Tap the **+** button or **Add Device**
+3. Select **Scan** or look for the QR code scanner option
+4. Scan the QR code displayed on your Home Assistant screen
+
+After adding new devices to your Tuya account through the Smart Life or Tuya Smart app, you need to reload the Tuya integration in Home Assistant for the new devices to appear:
+
+1. Go to **{% my integrations title="Settings > Devices & Services" %}**
+2. Find the Tuya integration
+3. Click the three dots menu
+4. Select **Reload**
+
## Scenes
Tuya supports scenes in their app. These allow triggering some of the more complex modes of various devices such as light changing effects. Scenes created in the Tuya app will automatically appear in the Scenes list in Home Assistant the next time the integration updates.
diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown
index f2c8ba628e5..0a264f648fa 100644
--- a/source/_integrations/unifiprotect.markdown
+++ b/source/_integrations/unifiprotect.markdown
@@ -57,7 +57,7 @@ UCKP with Firmware v1.x **do NOT run UniFi OS**, you must upgrade to firmware [`
### Software support
-The absolute **minimal** software version is [`v1.20.0`](https://community.ui.com/releases/UniFi-Protect-Application-1-20-0/d43c0905-3fb4-456b-a7ca-73aa830cb011) for UniFi Protect. If you have an older version, you will get errors trying to set up the integration. However, the general advice is the latest 2 minor versions of UniFi Protect and hardware supported by those are supported.
+The **absolute minimum** software version is [`v1.20.0`](https://community.ui.com/releases/UniFi-Protect-Application-1-20-0/d43c0905-3fb4-456b-a7ca-73aa830cb011) for UniFi Protect. If you have an older version, you will get errors trying to set up the integration. However, the general advice is the latest 2 minor versions of UniFi Protect are supported.
{% important %}
**Early Access and Release Candidate versions are not supported by Home Assistant.**
@@ -420,9 +420,9 @@ actions:
You can obtain the `nfc_id` using the [Action unifiprotect.get_user_keyring_info](#action-unifiprotectget_user_keyring_info).
-**Warning:**
-
+{% warning %}
When processing NFC scans, always validate the scanned ID. Unknown NFC cards also trigger the scan event. Additionally, this event was developed using third-party cards, as the developer did not have access to official UniFi cards at the time. With third-party cards, the scan relies on the card's serial number. While this approach is not uncommon, it is essential to note that the card's serial number is generally not considered a secure identifier and can be duplicated relatively easily. When the device becomes unavailable and becomes available again in Home Assistant, repeated event processing can occur. The state change is not an issue with the integration but should be considered, mainly if the device is used for actions such as unlocking doors.
+{% endwarning %}
### Fingerprint Identified Event
@@ -463,39 +463,9 @@ action:
title: "Fingerprint Scan Notification"
```
-**Warning:**
-
+{% warning %}
Similar to NFC, an event is triggered when a fingerprint is recognized and not recognized. However, unlike NFC, at the time of implementation, no fingerprint ID is included in the event if the fingerprint is unknown. When the device becomes unavailable and becomes available again in Home Assistant, repeated event processing can occur. The state change is not an issue with the integration but should be considered, mainly if the device is used for actions such as unlocking doors.
-
-#### Example G4 Doorbell Fingerprint Identified Automation
-
-```yaml
-alias: G4 Doorbell Fingerprint Identified Automation
-description: Automation that triggers when a fingerprint is successfully identified on the G4 Doorbell Pro
-trigger:
- - platform: event
- event_type: state_changed
- event_data:
- entity_id: event.g4_doorbell_pro_poe_fingerprint # Replace with your doorbell entity
-condition:
- - condition: template
- value_template: >
- {% raw %}{{
- trigger.event.data.new_state is not none and
- trigger.event.data.new_state.attributes.event_type == 'identified' and
- (trigger.event.data.new_state.attributes.ulp_id|default('')) != '' and
- trigger.event.data.new_state.attributes.ulp_id in ['ALLOWED_ID1', 'ALLOWED_ID2']
- }}{% endraw %}
-action:
- - service: notify.mobile_app_your_device # Replace with your notification target
- data:
- {% raw %}message: "Fingerprint identified with ID: {{ trigger.event.data.new_state.attributes.ulp_id }}"{% endraw %}
- title: "Fingerprint Scan Notification"
-```
-
-**Warning:**
-
-Similar to NFC, an event is triggered when a fingerprint is recognized and not recognized. However, unlike NFC, at the time of implementation, no fingerprint ID is included in the event if the fingerprint is unknown.
+{% endwarning %}
## Troubleshooting
diff --git a/source/_integrations/update.mqtt.markdown b/source/_integrations/update.mqtt.markdown
index 17cdfdbbf53..da07600780a 100644
--- a/source/_integrations/update.mqtt.markdown
+++ b/source/_integrations/update.mqtt.markdown
@@ -168,7 +168,7 @@ name:
required: false
type: string
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
payload_install:
diff --git a/source/_integrations/uptime_kuma.markdown b/source/_integrations/uptime_kuma.markdown
new file mode 100644
index 00000000000..8142a1ca624
--- /dev/null
+++ b/source/_integrations/uptime_kuma.markdown
@@ -0,0 +1,136 @@
+---
+title: Uptime Kuma
+description: Instructions on how to integrate Uptime Kuma with Home Assistant.
+ha_category:
+ - Sensor
+ha_iot_class: Cloud polling
+ha_release: 2025.8
+ha_config_flow: true
+ha_codeowners:
+ - '@tr4nt0r'
+ha_domain: uptime_kuma
+ha_integration_type: integration
+ha_platforms:
+ - sensor
+---
+
+The **Uptime Kuma** {% term integration %} connects Home Assistant with your Uptime Kuma monitoring tool.
+
+## About Uptime Kuma
+
+Uptime Kuma is an open-source, free, and easy-to-use self-hosted monitoring tool used to track the uptime and performance of websites, applications, and other services.
+
+## How you can use this integration
+
+This integration allows you to track the status of your **Uptime Kuma** monitors directly in Home Assistant. You can use these entities in dashboards, automations, and scripts to react to service outages or monitor uptime trends within your smart home setup.
+
+## Prerequisites
+
+To set up the **Uptime Kuma** integration, you need an **API key** and the **URL** of your Uptime Kuma instance (for example: `https://uptime.example.org`).
+
+You can create an API key by logging into your Uptime Kuma instance, navigating to **{% icon "mdi:cog" %} Settings → API Keys** and selecting **{% icon "mdi:plus" %}Add API Key**.
+
+{% include integrations/config_flow.md %}
+
+{% configuration_basic %}
+"URL":
+ description: "Address of your Uptime Kuma instance. Example: `https://uptime.example.com`."
+"Verify SSL certificate":
+ description: "Enable SSL certificate verification for secure connections."
+"API key":
+ description: "An API key to authenticate with your Uptime Kuma instance."
+{% endconfiguration_basic %}
+
+## Sensors
+
+- **Status**: The current status of the monitor. Possible states: *up*, *down*, *pending*, or *maintenance*.
+- **Response time**: Time in milliseconds taken for the last status check.
+- **Certificate expiry**: Number of days remaining before the SSL certificate expires.
+- **Monitor type**: The type of check being performed (e.g., HTTP(s), TCP, ping).
+- **Monitored hostname**: The hostname or IP address being monitored (if applicable).
+- **Monitored port**: The port number used by the monitored service (if applicable).
+- **Monitored URL**: The full URL of the monitored service (if applicable).
+
+## Automations
+
+Get started with this automation example to create an Uptime Kuma warning light that changes color based on the monitor's status.
+
+{% details "Example YAML configuration" %}
+
+{% raw %}
+
+```yaml
+actions:
+ - choose:
+ - conditions:
+ - condition: state
+ entity_id: sensor.uptime_kuma_my_service
+ state: down
+ sequence:
+ - action: light.turn_on
+ data:
+ color_name: red
+ target:
+ entity_id: light.warning_light
+ - conditions:
+ - condition: state
+ entity_id: sensor.uptime_kuma_my_service
+ state: pending
+ sequence:
+ - action: light.turn_on
+ data:
+ color_name: yellow
+ target:
+ entity_id: light.warning_light
+ - conditions:
+ - condition: state
+ entity_id: sensor.uptime_kuma_my_service
+ state: maintenance
+ sequence:
+ - action: light.turn_on
+ data:
+ color_name: blue
+ target:
+ entity_id: light.warning_light
+ - conditions:
+ - condition: state
+ entity_id: sensor.uptime_kuma_my_service
+ state: up
+ sequence:
+ - action: light.turn_on
+ data:
+ color_name: green
+ target:
+ entity_id:
+ - light.warning_light
+triggers:
+ - trigger: state
+ entity_id:
+ - sensor.uptime_kuma_my_service
+```
+
+{% endraw %}
+
+{% enddetails %}
+
+## Data updates
+
+This integration retrieves data from your Uptime Kuma instance every 30 seconds.
+
+## Known limitations
+
+- Uptime Kuma's API does not expose unique identifiers for monitors. Because of this, using the same name for multiple monitors will cause only one of them to appear in Home Assistant. Renaming a monitor will result in new entities being created, while the old (stale) entities will remain unless manually removed.
+
+## Troubleshooting
+
+The **Uptime Kuma** integration relies on an active internet connection to communicate with your Uptime Kuma instance, unless it's running locally. If you encounter issues, verify that your network connection is stable and your Uptime Kuma instance is accessible.
+
+In any case, when reporting an issue, please enable [debug logging](/docs/configuration/troubleshooting/#debug-logs-and-diagnostics), restart the integration, and as soon as the issue reoccurs, stop the debug logging again (*download of debug log file will start automatically*). Further, if still possible, please also download the [diagnostics](/integrations/diagnostics) data. If you have collected the debug log and the diagnostics data, provide them with the issue report.
+
+## Removing the integration
+
+This integration can be removed by following these steps:
+
+{% include integrations/remove_device_service.md %}
+
+4. You can now remove the API key used for Home Assistant from Uptime Kuma, unless it is also used by other integrations or applications.
diff --git a/source/_integrations/vacuum.mqtt.markdown b/source/_integrations/vacuum.mqtt.markdown
index fc336fac5b8..5136a8d5bb3 100644
--- a/source/_integrations/vacuum.mqtt.markdown
+++ b/source/_integrations/vacuum.mqtt.markdown
@@ -131,7 +131,7 @@ name:
type: string
default: MQTT Vacuum
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
payload_available:
diff --git a/source/_integrations/vacuum.template.markdown b/source/_integrations/vacuum.template.markdown
deleted file mode 100644
index 4fedbb92c83..00000000000
--- a/source/_integrations/vacuum.template.markdown
+++ /dev/null
@@ -1,217 +0,0 @@
----
-title: "Template vacuum"
-description: "Instructions how to setup template vacuums within Home Assistant."
-ha_category:
- - Vacuum
- - Helper
-ha_release: 0.96
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - vacuum
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform creates vacuums that combine integrations and provides the
-ability to run scripts or invoke actions for each of the start, pause, stop,
-return_to_base, clean_spot, locate and set_fan_speed commands of a vacuum.
-
-To enable Template Vacuums in your installation, add the following to your
-`configuration.yaml` file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-vacuum:
- - platform: template
- vacuums:
- living_room_vacuum:
- start:
- action: script.vacuum_start
-```
-
-{% endraw %}
-
-{% configuration %}
- vacuums:
- description: List of your vacuums.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this vacuum. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: "Defines a template to get the state of the vacuum. Valid value: `docked`/`cleaning`/`idle`/`paused`/`returning`/`error`"
- required: false
- type: template
- battery_level_template:
- description: "Defines a template to get the battery level of the vacuum. Legal values are numbers between `0` and `100`."
- required: false
- type: template
- fan_speed_template:
- description: Defines a template to get the fan speed of the vacuum.
- required: false
- type: template
- attribute_templates:
- description: Defines templates for attributes of the sensor.
- required: false
- type: map
- keys:
- "attribute: template":
- description: The attribute and corresponding template.
- required: true
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- start:
- description: Defines an action to run when the vacuum is started.
- required: true
- type: action
- pause:
- description: Defines an action to run when the vacuum is paused.
- required: false
- type: action
- stop:
- description: Defines an action to run when the vacuum is stopped.
- required: false
- type: action
- return_to_base:
- description: Defines an action to run when the vacuum is given a return to base command.
- required: false
- type: action
- clean_spot:
- description: Defines an action to run when the vacuum is given a clean spot command.
- required: false
- type: action
- locate:
- description: Defines an action to run when the vacuum is given a locate command.
- required: false
- type: action
- set_fan_speed:
- description: Defines an action to run when the vacuum is given a command to set the fan speed.
- required: false
- type: action
- fan_speeds:
- description: List of fan speeds supported by the vacuum.
- required: false
- type: [string, list]
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an {% term entity %}'s state and attribute in templates and actions.
-
-## Examples
-
-### Control vacuum with Harmony Hub
-
-This example shows how you can use a Template Vacuum to control an IR vacuum cleaner using the [Harmony Hub Remote integration](/integrations/harmony).
-
-```yaml
-vacuum:
- - platform: template
- vacuums:
- living_room_vacuum:
- start:
- - action: remote.send_command
- target:
- entity_id: remote.harmony_hub
- data:
- command: Clean
- device: 52840686
- return_to_base:
- - action: remote.send_command
- target:
- entity_id: remote.harmony_hub
- data:
- command: Home
- device: 52840686
- clean_spot:
- - action: remote.send_command
- target:
- entity_id: remote.harmony_hub
- data:
- command: SpotCleaning
- device: 52840686
-```
-
-### Vacuum with state
-
-This example shows how to use templates to specify the state of the vacuum.
-
-{% raw %}
-
-```yaml
-vacuum:
- - platform: template
- vacuums:
- living_room_vacuum:
- value_template: "{{ states('sensor.vacuum_state') }}"
- battery_level_template: "{{ states('sensor.vacuum_battery_level')|int }}"
- fan_speed_template: "{{ states('sensor.vacuum_fan_speed') }}"
- start:
- action: script.vacuum_start
- pause:
- action: script.vacuum_pause
- stop:
- action: script.vacuum_stop
- return_to_base:
- action: script.vacuum_return_to_base
- clean_spot:
- action: script.vacuum_clean_spot
- locate:
- action: script.vacuum_locate_vacuum
- set_fan_speed:
- action: script.vacuum_set_fan_speed
- data:
- speed: "{{ fan_speed }}"
- fan_speeds:
- - Low
- - Medium
- - High
-```
-
-{% endraw %}
-
-### Add custom attributes
-
-This example shows how to add custom attributes.
-
-{% raw %}
-
-```yaml
-vacuum:
- - platform: template
- vacuums:
- living_room_vacuum:
- value_template: "{{ states('sensor.vacuum_state') }}"
- battery_level_template: "{{ states('sensor.vacuum_battery_level')|int }}"
- fan_speed_template: "{{ states('sensor.vacuum_fan_speed') }}"
- attribute_templates:
- status: >-
- {% if (states('sensor.robot_vacuum_robot_cleaner_movement') == "after" and states('sensor.robot_vacuum_robot_cleaner_cleaning_mode') == "stop") %}
- Charging to Resume
- {% elif states('sensor.robot_vacuum_robot_cleaner_cleaning_mode') == "auto" %}
- Cleaning
- {% else %}
- Charging
- {% endif %}
-```
-
-{% endraw %}
diff --git a/source/_integrations/vegehub.markdown b/source/_integrations/vegehub.markdown
new file mode 100644
index 00000000000..40d2dc4f854
--- /dev/null
+++ b/source/_integrations/vegehub.markdown
@@ -0,0 +1,94 @@
+---
+title: Vegetronix VegeHub
+description: Instructions on how to integrate a VegeHub device with Home Assistant.
+ha_category:
+ - Sensor
+ - Switch
+ha_config_flow: true
+ha_release: 2025.7
+ha_iot_class: Local Push
+ha_codeowners:
+ - '@ghowevege'
+ha_domain: vegehub
+ha_platforms:
+ - sensor
+ - switch
+ha_integration_type: integration
+related:
+ - url: https://www.vegetronix.com/Products/VG-HUB-RELAY/
+ title: VegeHub product page
+ - url: https://www.vegetronix.com/Products/VG-HUB-GEN2/QuickStart
+ title: VegeHub Quick Start Guide
+ - url: https://vegetronix.com/Products/VG-HUB-GEN2/Manual
+ title: VegeHub Manual
+---
+
+The **Vegetronix VegeHub** {% term integration %} allows you to control your [VegeHub](https://www.vegetronix.com/Products/VG-HUB-RELAY/) and gather data from its attached sensors.
+
+There is currently support for the following platforms within Home Assistant:
+
+- Sensor - Gathers data from sensor channels on a VegeHub and stores the values in Home Assistant
+- Switch - Allows you to view the status of relays on a VegeHub, and control them.
+
+{% include integrations/config_flow.md %}
+
+## Supported devices
+
+- [Vegetronix VegeHub](https://www.vegetronix.com/Products/VG-HUB-RELAY/) - Firmware **4.0 or later** - All variants
+
+## Prerequisites
+
+The VegeHub can be connected to Wi-Fi *without* the need for additional apps or cloud accounts. When powered on, the VegeHub creates a Wi-Fi access point called "Vege_XX_XX" where the XX are different for each device. Connect to this network from a phone, tablet, or other similar device. The default passphrase to connect to the access point is `vegetronix`. This can (and should) be changed in the Wi-Fi settings.
+
+Once connected to the network, you should automatically be directed by your device to log in to the network. Follow the prompt to be directed to the VegeHub's Wi-Fi setup page, where you can scan for available networks, enter your Wi-Fi network's credentials, change the device's name, and change the access point password.
+
+{% important %}
+It is crucial to change the default access point password. If you don't, anyone can easily access your VegeHub and potentially compromise your Wi-Fi network credentials.
+{% endimportant %}
+
+Select **Apply** and your VegeHub will reset the network connection and try to connect to the credentials you put in.
+
+{% include integrations/config_flow.md %}
+
+### Device settings
+
+To open the VegeHub's device settings interface on their website, go to {% my integrations title="Settings > Devices & services" %}, and on the integration card, select 1 device to open the device page. Under Device info, select Visit to open the website with the settings.
+
+## Power management
+
+The VegeHub has two power modes:
+
+- Battery mode (default): Device sleeps after five minutes of inactivity
+- Power adapter mode: Device remains always active
+
+When in Power Adapter mode, the device will use significantly more power, so this mode should not be used when powering from batteries, as they will quickly be drained.
+
+To change the power mode, visit the [Hub's settings interface](#device-settings), go to the **Settings** page, and change the **Power source** to **Power adapter**.
+
+## Troubleshooting
+
+### Device is unresponsive
+
+If the device is unresponsive, wake it up using one of these methods:
+
+- Press the button on the board.
+- Disconnect and reconnect power.
+
+### Setup is failing
+
+ - Ensure the VegeHub is awake (see Device Wake-Up section)
+
+### [Hub's settings interface](#device-settings) is not accessible
+
+ - Ensure the VegeHub is awake (see Device Wake-Up section).
+
+### Actuators are not responding
+
+ - Ensure the VegeHub is awake (see Device Wake-Up section).
+ - Consider switching to [power adapter mode](#power-management) for consistent response.
+
+## Removing the integration
+
+This integration follows standard integration removal.
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/velbus.markdown b/source/_integrations/velbus.markdown
index bb611270b1c..002c8761c7f 100644
--- a/source/_integrations/velbus.markdown
+++ b/source/_integrations/velbus.markdown
@@ -103,7 +103,6 @@ You can use the `velbus.sync_clock` action to synchronize the clock of the Velbu
| Data attribute | Optional | Description |
| ---------------------- | -------- | ---------------------------------------- |
-| `interface` | no | The port used to connect to the bus (the same one as used during configuration). |
| `config_entry` | no | The config_entry to send the command to. |
### Action `velbus.scan`
@@ -112,7 +111,6 @@ You can use the `velbus.scan` action to synchronize the modules between the bus
| Data attribute | Optional | Description |
| ---------------------- | -------- | ---------------------------------------- |
-| `interface` | no | The port used to connect to the bus (the same one as used during configuration). |
| `config_entry` | no | The config_entry to send the command to. |
@@ -122,7 +120,6 @@ You can use the `velbus.set_memo_text` action to provide the memo text to be dis
| Data attribute | Optional | Description |
| ---------------------- | -------- | ---------------------------------------- |
-| `interface` | no | The port used to connect to the bus (the same one as used during configuration). |
| `config_entry` | no | The config_entry to send the command to. |
| `address` | no | The module address in decimal format, which is displayed at the device list at the integration page. |
| `memo_text` | yes | Text to be displayed on module. When no memo text is supplied the memo text will be cleared. |
@@ -148,7 +145,6 @@ Use this action when you make changes to your configuration via velbuslink.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ---------------------------------------- |
-| `interface` | no | The port used to connect to the bus (the same one as used during configuration). |
| `config_entry` | no | The config_entry to send the command to. |
| `address` | no | The module address in decimal format, which is displayed on the device list on the integration page, if provided the service will only clear the cache for this model, without an address, the full velbuscache will be cleared. |
diff --git a/source/_integrations/voip.markdown b/source/_integrations/voip.markdown
index aeb38fe6693..228e77bc829 100644
--- a/source/_integrations/voip.markdown
+++ b/source/_integrations/voip.markdown
@@ -8,6 +8,7 @@ ha_release: '2023.5'
ha_codeowners:
- '@balloob'
- '@synesthesiam'
+ - '@jaminh'
ha_domain: voip
ha_integration_type: integration
ha_quality_scale: internal
diff --git a/source/_integrations/water_heater.mqtt.markdown b/source/_integrations/water_heater.mqtt.markdown
index 0919a7c6c33..e0ef4c4e65a 100644
--- a/source/_integrations/water_heater.mqtt.markdown
+++ b/source/_integrations/water_heater.mqtt.markdown
@@ -189,7 +189,7 @@ name:
type: string
default: MQTT water heater
object_id:
- description: Used instead of `name` for automatic generation of `entity_id`
+ description: Used `object_id` instead of `name` for automatic generation of `entity_id`. This only works when the entity is added for the first time. When set, this overrides a user-customized Entity ID in case the entity was deleted and added again.
required: false
type: string
optimistic:
diff --git a/source/_integrations/weather.markdown b/source/_integrations/weather.markdown
index b42df01bff5..aaa003e2711 100644
--- a/source/_integrations/weather.markdown
+++ b/source/_integrations/weather.markdown
@@ -115,7 +115,7 @@ The response data field is a mapping of called target entities, each containing
{% details "Example template sensor using get_forecasts" %}
-Example template sensor that contains the hourly forecast
+Example [template sensor](/integrations/template#yaml-configuration) that contains the hourly forecast
{% raw %}
diff --git a/source/_integrations/weather.template.markdown b/source/_integrations/weather.template.markdown
deleted file mode 100644
index f5ded2771be..00000000000
--- a/source/_integrations/weather.template.markdown
+++ /dev/null
@@ -1,148 +0,0 @@
----
-title: "Template Weather Provider"
-description: "Instructions on how to integrate Template Weather provider into Home Assistant."
-ha_category:
- - Weather
- - Helper
-ha_release: 2021.3
-ha_iot_class: "Local Push"
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - weather
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` integrations creates weather provider that combines integrations and an existing weather provider into a fused weather provider.
-
-There are several powerful ways to use this {% term integration %}, including localizing your weather provider information with local information from temperature, humidity, pressure sensors that you own.
-
-Another use case could be using temperature and humidity from one weather platform, with forecasts from a different one.
-
-Output will be converted according to the user's unit system or {% term entity %} override, see [documentation](https://developers.home-assistant.io/docs/core/entity/weather/#unit-conversion).
-
-## Configuration
-
-To enable a Template Weather provider in your installation, add the following to your {% term "`configuration.yaml`" %} file:
-
-(Note, be sure to update my_region in the condition and forecast templates to an appropriate value for your setup).
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-weather:
- - platform: template
- name: "My Weather Station"
- condition_template: "{{ states('weather.my_region') }}"
- temperature_template: "{{ states('sensor.temperature') | float }}"
- temperature_unit: "°C"
- humidity_template: "{{ states('sensor.humidity') | float }}"
- forecast_daily_template: "{{ state_attr('weather.my_region', 'forecast_data') }}"
-```
-
-{% endraw %}
-
-{% configuration %}
-name:
- description: Name to use in the frontend.
- required: true
- type: template
-unique_id:
- description: An ID that uniquely identifies this weather entity. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
-condition_template:
- description: The current weather condition.
- required: true
- type: template
-temperature_template:
- description: The current temperature.
- required: true
- type: template
-dew_point_template:
- description: The current dew point.
- required: false
- type: template
-apparent_temperature_template:
- description: The current apparent (feels-like) temperature.
- required: false
- type: template
-temperature_unit:
- description: Unit for temperature_template output. Valid options are °C, °F, and K.
- required: false
- type: string
-humidity_template:
- description: The current humidity.
- required: true
- type: template
-attribution_template:
- description: The attribution to be shown in the frontend.
- required: false
- type: string
-pressure_template:
- description: The current air pressure.
- required: false
- type: template
-pressure_unit:
- description: Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.
- required: false
- type: string
-wind_speed_template:
- description: The current wind speed.
- required: false
- type: template
-wind_gust_speed_template:
- description: The current wind gust speed.
- required: false
- type: template
-wind_speed_unit:
- description: Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.
- required: false
- type: string
-wind_bearing_template:
- description: The current wind bearing.
- required: false
- type: template
-ozone_template:
- description: The current ozone level.
- required: false
- type: template
-cloud_coverage_template:
- description: The current cloud coverage.
- required: false
- type: template
-visibility_template:
- description: The current visibility.
- required: false
- type: template
-visibility_unit:
- description: Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.
- required: false
- type: string
-forecast_daily_template:
- description: Daily forecast data.
- required: false
- type: template
-forecast_hourly_template:
- description: Hourly forecast data.
- required: false
- type: template
-forecast_twice_daily_template:
- description: Twice daily forecast data.
- required: false
- type: template
-precipitation_unit:
- description: Unit for precipitation output. Valid options are km, mi, ft, m, cm, mm, in, yd.
- required: false
- type: string
-{% endconfiguration %}
-
-### Template variables
-
-State-based template entities have the special template variable `this` available in their templates. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an {% term entity %}'s state and attribute in templates.
diff --git a/source/_integrations/wiz.markdown b/source/_integrations/wiz.markdown
index be2eece66f3..fa0dbf9a8a4 100644
--- a/source/_integrations/wiz.markdown
+++ b/source/_integrations/wiz.markdown
@@ -3,6 +3,7 @@ title: WiZ
description: Instructions on setting up WiZ within Home Assistant.
ha_category:
- Binary sensor
+ - Fan
- Light
- Number
- Sensor
@@ -13,10 +14,12 @@ ha_dhcp: true
ha_config_flow: true
ha_codeowners:
- '@sbidy'
+ - '@arturpragacz'
ha_domain: wiz
ha_platforms:
- binary_sensor
- diagnostics
+ - fan
- light
- number
- sensor
diff --git a/source/_integrations/xiaomi_miio.markdown b/source/_integrations/xiaomi_miio.markdown
index 0126f3b30fa..cb39f1b09af 100644
--- a/source/_integrations/xiaomi_miio.markdown
+++ b/source/_integrations/xiaomi_miio.markdown
@@ -1,6 +1,6 @@
---
-title: Xiaomi Miio
-description: Instructions on how to integrate Xiaomi devices using the Xiaomi Miio integration within Home Assistant.
+title: Xiaomi Home
+description: Instructions on how to integrate Xiaomi devices using the Xiaomi Home integration within Home Assistant.
ha_category:
- Alarm
- Fan
@@ -38,7 +38,7 @@ ha_platforms:
ha_integration_type: integration
---
-The **Xiaomi Miio** {% term integration %} supports the following devices:
+The **Xiaomi Home** {% term integration %} supports the following devices:
- [Xiaomi Gateway](#xiaomi-gateway)
- [Xiaomi device tracker (Xiaomi Mi WiFi Repeater 2)](#xiaomi-device-tracker-xiaomi-mi-wifi-repeater-2)
@@ -51,7 +51,7 @@ The **Xiaomi Miio** {% term integration %} supports the following devices:
## Prerequisites
-Most Xiaomi Miio devices support configuration using the Home Assistant UI,
+Most Xiaomi Home devices support configuration using the Home Assistant UI,
except for the [Xiaomi device tracker](#xiaomi-device-tracker-xiaomi-mi-wifi-repeater-2)
and [Xiaomi IR Remote](#xiaomi-ir-remote). Please read the linked sections for those devices for more information.
@@ -63,8 +63,8 @@ For more complex network setups (e.g. VLANs), reference the [following documenta
{% include integrations/config_flow.md %}
-It is recommend to supply your Xiaomi cloud credentials during configuration
-to automatically connect to your devices. You need to specify the cloud server
+It is recommended to supply your Xiaomi Home credentials during configuration
+to automatically connect to your devices. You need to specify the server region
you used in the Xiaomi Home App (where you initially setup the device). There are
6 servers: `cn`, `de`, `i2`, `ru`, `sg` and `us`; please see
[this page](https://www.openhab.org/addons/bindings/miio/#country-servers) for
@@ -74,13 +74,13 @@ the server to use for each country.
The most common problems are:
-- Xiaomi Miio devices do not communicate across subnets/VLANs due to the source address of the UDP packet not belonging to the subnet of the device itself, [more information and solutions](https://python-miio.readthedocs.io/en/latest/troubleshooting.html#discover-devices-across-subnets).
+- Xiaomi Home devices do not communicate across subnets/VLANs due to the source address of the UDP packet not belonging to the subnet of the device itself, [more information and solutions](https://python-miio.readthedocs.io/en/latest/troubleshooting.html#discover-devices-across-subnets).
- Roborock vacuums need to be connected to the Xiaomi Home app, not the Roborock app, [more information](https://python-miio.readthedocs.io/en/latest/troubleshooting.html#roborock-vacuum-not-detected).
- Blocking the network access to the device is known to cause intermittent connection issues due to the device's internal software hanging and a watchdog restarting the internal software, [more information](https://python-miio.readthedocs.io/en/latest/troubleshooting.html#intermittent-connection-issues-timeouts-xiaomi-vacuum).
## Xiaomi Gateway
-The `xiaomi_miio` gateway {% term integration %} allows you to control the gateway and its connected subdevices.
+The Xiaomi Home {% term integration %} allows you to control the gateway and its connected subdevices.
### Supported Xiaomi gateway models
@@ -94,7 +94,7 @@ The following list shows the Gateway name, the model number, the Zigbee ID, and
- **European version**
- Model: ZHWG11LM-763 / DGNWQ05LM
- Zigbee ID: lumi.gateway.mieu01
- - Supported: Yes (cloud credentials needed)
+ - Supported: Yes (Xiaomi Home credentials needed)
- **Aqara hub**
- Model: ZHWG11LM
@@ -121,7 +121,7 @@ The following list shows the Gateway name, the model number, the Zigbee ID, and
- Zigbee ID: lumi.acpartner.v3
- Supported: Yes
-Some gateways (lumi.gateway.mieu01) do not support getting the connected subdevices locally. For those gateways, cloud credentials can be specified during the config flow and the "Use cloud to get connected subdevices" can be enabled in the options flow (after setting up the {% term integration %}, click Configuration in the sidebar, then click Integrations and then click Options on the already set up Xiaomi Miio Gateway {% term integration %}). The connected subdevices will then be retrieved from the Xiaomi Miio cloud (internet), control and status updates of those subdevices will then further take place over local network connection. A re-authentication flow may be triggered when no cloud credentials are provided yet and are needed for that particular gateway model.
+Some gateways (lumi.gateway.mieu01) do not support getting the connected subdevices locally. For those gateways, Xiaomi Home credentials can be specified during the config flow and the "Use Xiaomi Home service to get connected subdevices" can be enabled in the options flow (after setting up the {% term integration %}, click Configuration in the sidebar, then click Integrations and then click Options on the already set up Xiaomi Home {% term integration %}). The connected subdevices will then be retrieved from Xiaomi Home (internet), control and status updates of those subdevices will then further take place over local network connection. A re-authentication flow may be triggered when no account credentials are provided yet and are needed for that particular gateway model.
### Gateway features
@@ -136,7 +136,7 @@ Not yet implemented features (but possible):
### Supported subdevices
-These subdevices are fully implemented in HomeAssistant:
+These subdevices are fully implemented in Home Assistant:
- **Weather sensor (WSDCGQ01LM)**
- Zigbee ID: `lumi.sensor_ht`
@@ -242,7 +242,7 @@ The list shows the device name, the model number, and the Zigbee ID.
## Xiaomi device tracker (Xiaomi Mi WiFi Repeater 2)
-The `xiaomi_miio` device tracker platform is observing your Xiaomi Mi WiFi Repeater 2 and reporting all associated WiFi clients.
+The device tracker platform is observing your Xiaomi Mi WiFi Repeater 2 and reporting all associated WiFi clients.
Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token.
@@ -257,11 +257,11 @@ device_tracker:
{% configuration %}
host:
- description: The IP address of your miio device.
+ description: The IP address of your Xiaomi device.
required: true
type: string
token:
- description: The API token of your miio device.
+ description: The API token of your Xiaomi device.
required: true
type: string
{% endconfiguration %}
@@ -1206,7 +1206,7 @@ Set the target humidity.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ----------------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO humidifier entity. |
+| `entity_id` | no | Only act on a specific Xiaomi humidifier entity. |
| `humidity` | no | Target humidity |
### Action `humidifier.set_mode`
@@ -1215,16 +1215,11 @@ Set the humidifier operation mode.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ----------------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO humidifier entity. |
-| `mode` | no | The Xiaomi miIO operation mode |
+| `entity_id` | no | Only act on a specific Xiaomi humidifier entity. |
+| `mode` | no | The humidifier operation mode |
-### Action `fan.set_percentage`
-
-Set the fan speed percentage.
-
-| Data attribute | Optional | Description |
| ---------------------- | -------- | ---------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. |
+| `entity_id` | no | Only act on a specific Xiaomi fan entity. |
| `percentage` | no | Fan speed. Percentage speed setting |
### Action `fan.set_preset_mode`
@@ -1233,8 +1228,8 @@ Set the fan operation mode.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ---------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. |
-| `preset_mode` | no | The Xiaomi miIO operation mode |
+| `entity_id` | no | Only act on a specific Xiaomi fan entity. |
+| `preset_mode` | no | The fan operation mode |
### Action `xiaomi_miio.fan_reset_filter` (Air Purifier 2 only)
@@ -1242,7 +1237,7 @@ Reset the filter lifetime and usage.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ---------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. |
+| `entity_id` | no | Only act on a specific Xiaomi fan entity. |
### Action `xiaomi_miio.fan_set_extra_features` (Air Purifier only)
@@ -1250,7 +1245,7 @@ Set the extra features.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ---------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. |
+| `entity_id` | no | Only act on a specific Xiaomi fan entity. |
| `features` | no | Integer, known values are 0 and 1. |
## Xiaomi Air Quality Monitor
@@ -1273,7 +1268,7 @@ Currently, the supported features are:
## Xiaomi IR Remote
-The `xiaomi miio` remote platform allows you to send IR commands from your Xiaomi IR Remote (ChuangmiIr).
+The remote platform allows you to send IR commands from your Xiaomi IR Remote (ChuangmiIr).
### Setup
@@ -1654,16 +1649,16 @@ Note: If your vacuum is in motion and does not respond to the `xiaomi_miio.vacuu
Start the remote control mode of the robot. You can then move it with `remote_control_move`; when done, call `remote_control_stop`.
| Data attribute | Optional | Description |
-| ---------------------- | -------- | ---------------------------- |
-| `entity_id` | no | Only act on a specific robot |
+| -------------- | -------- | ---------------------------- |
+| `entity_id` | no | Only act on a specific robot |
### Action `xiaomi_miio.vacuum_remote_control_stop`
Exit the remote control mode of the robot.
| Data attribute | Optional | Description |
-| ---------------------- | -------- | ---------------------------- |
-| `entity_id` | no | Only act on a specific robot |
+| -------------- | -------- | ---------------------------- |
+| `entity_id` | no | Only act on a specific robot |
### Action `xiaomi_miio.vacuuNm_remote_control_move`
@@ -1830,7 +1825,7 @@ It seems to be the case that Numbers 1..15 are used to number the initial segmen
## Xiaomi Philips Light
-The `xiaomi_miio` platform allows you to control the state of your Xiaomi Philips LED Ball Lamp, Xiaomi Philips Zhirui LED Bulb E14 Candle Lamp, Xiaomi Philips Zhirui Downlight, Xiaomi Philips LED Ceiling Lamp, Xiaomi Philips Eyecare Lamp 2, Xiaomi Philips Moonlight Bedside Lamp and Philips Zhirui Desk Lamp.
+The Xiaomi Home light platform allows you to control the state of your Xiaomi Philips LED Ball Lamp, Xiaomi Philips Zhirui LED Bulb E14 Candle Lamp, Xiaomi Philips Zhirui Downlight, Xiaomi Philips LED Ceiling Lamp, Xiaomi Philips Eyecare Lamp 2, Xiaomi Philips Moonlight Bedside Lamp and Philips Zhirui Desk Lamp.
### Features
@@ -1924,7 +1919,7 @@ Set one of the 4 available fixed scenes.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------ |
-| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. |
+| `entity_id` | no | Only act on a specific Xiaomi light entity. |
| `scene` | no | Scene, between 1 and 4. |
### Action `xiaomi_miio.light_set_delayed_turn_off`
@@ -1933,7 +1928,7 @@ Delayed turn off.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------ |
-| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. |
+| `entity_id` | no | Only act on a specific Xiaomi light entity. |
| `time_period` | no | Time period for the delayed turn off. |
### Action `xiaomi_miio.light_reminder_on` (Eyecare Smart Lamp 2 only)
@@ -1942,7 +1937,7 @@ Enable the eye fatigue reminder/notification.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------ |
-| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. |
+| `entity_id` | no | Only act on a specific Xiaomi light entity. |
### Action `xiaomi_miio.light_reminder_off` (Eyecare Smart Lamp 2 only)
@@ -1950,7 +1945,7 @@ Disable the eye fatigue reminder/notification.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------ |
-| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. |
+| `entity_id` | no | Only act on a specific Xiaomi light entity. |
### Action `xiaomi_miio.light_night_light_mode_on` (Eyecare Smart Lamp 2 only)
@@ -1958,7 +1953,7 @@ Turn the smart night light mode on.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------ |
-| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. |
+| `entity_id` | no | Only act on a specific Xiaomi light entity. |
### Action `xiaomi_miio.light_night_light_mode_off` (Eyecare Smart Lamp 2 only)
@@ -1966,7 +1961,7 @@ Turn the smart night light mode off.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------ |
-| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. |
+| `entity_id` | no | Only act on a specific Xiaomi light entity. |
### Action `xiaomi_miio.light_eyecare_mode_on` (Eyecare Smart Lamp 2 only)
@@ -1974,7 +1969,7 @@ Turn the eyecare mode on.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------ |
-| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. |
+| `entity_id` | no | Only act on a specific Xiaomi light entity. |
### Action `xiaomi_miio.light_eyecare_mode_off` (Eyecare Smart Lamp 2 only)
@@ -1982,11 +1977,11 @@ Turn the eyecare mode off.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------ |
-| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. |
+| `entity_id` | no | Only act on a specific Xiaomi light entity. |
## Xiaomi Smart WiFi Socket and Smart Power Strip
-The `xiaomi_miio` switch platform allows you to control the state of your Xiaomi Smart WiFi Socket aka Plug, Xiaomi Smart Power Strip and Xiaomi Chuangmi Plug V1.
+The Xiaomi Home switch platform allows you to control the state of your Xiaomi Smart WiFi Socket aka Plug, Xiaomi Smart Power Strip and Xiaomi Chuangmi Plug V1.
### Features
@@ -2038,7 +2033,7 @@ Turn the wifi LED on.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. |
+| `entity_id` | no | Only act on a specific Xiaomi switch entity. |
### Action `xiaomi_miio.switch_set_wifi_led_off` (Power Strip only)
@@ -2046,15 +2041,11 @@ Turn the wifi LED off.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. |
-
-### Action `xiaomi_miio.switch_set_power_price` (Power Strip)
-
-Set the power price.
+| `entity_id` | no | Only act on a specific Xiaomi switch entity. |
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. |
+| `entity_id` | no | Only act on a specific Xiaomi switch entity. |
| `price` | no | Power price, between 0 and 999. |
### Action `xiaomi_miio.switch_set_power_mode` (Power Strip V1 only)
@@ -2063,12 +2054,12 @@ Set the power mode.
| Data attribute | Optional | Description |
| ---------------------- | -------- | ------------------------------------------------- |
-| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. |
+| `entity_id` | no | Only act on a specific Xiaomi switch entity. |
| `mode` | no | Power mode, valid values are 'normal' and 'green' |
## Retrieving the Access Token
-Not recommended, please specify the cloud credentials during the config flow for easier setup.
+Not recommended, please specify the Xiaomi account credentials during the config flow for easier setup.
However when setting up a device manually the token can be retrieved in one of the following ways.
### Xiaomi Cloud Tokens Extractor
@@ -2192,7 +2183,7 @@ This token (32 hexadecimal characters) is required for the Xiaomi Mi Robot Vacuu
### Miio command line tool
-Use of Miio should be done before the Vacuum is connected to Mi Home. If you already connected to the app you will need to delete it and then join the ad-hoc Wi-Fi network the Vacuum creates. If the vacuum is already paired it's likely this method will only return `???` as your token.
+Use of Miio should be done before the Vacuum is connected to Xiaomi Home. If you already connected to the app you will need to delete it and then join the ad-hoc Wi-Fi network the Vacuum creates. If the vacuum is already paired it's likely this method will only return `???` as your token.
Discovering devices on the current network:
diff --git a/source/_integrations/yalexs_ble.markdown b/source/_integrations/yalexs_ble.markdown
index 6921773cd80..09b19d574b9 100644
--- a/source/_integrations/yalexs_ble.markdown
+++ b/source/_integrations/yalexs_ble.markdown
@@ -36,8 +36,8 @@ Devices must have a Yale Access module installed to function with this {% term i
- YRD256 (Yale Assure Lock Keypad)
- YRD420 (Yale Assure Lock 2)
- YRD450 (Yale Assure Lock 2 Key Free)
-- YUR/SSDL/1/SIL (Yale Unity Screen Door Lock - Australia)
-- YUR/DEL/1/SIL (Yale Unity Entrance Lock - Australia)
+- YUR/SSDL/1/SIL and MBK (Yale Unity Screen Door Lock - Australia)
+- YUR/DEL/1/SIL and MBK (Yale Unity Entrance Lock - Australia)
- IES-D210W-G0 (Yale Smart Safe)
- YRSM-1 (Yale Smart Safe)
- ASL-05 (August WiFi Smart Lock - Gen 4)
@@ -51,6 +51,10 @@ These devices do not send updates, but can be locked and unlocked.
- MD-04I (Yale Conexis L1 (requires yale access module), Yale Conexis L2)
- YRCB-490 (Yale Smart Cabinet Lock)
+## Deadlock support
+
+Some Yale locks support a deadlock function (secure mode) for locking both the inside and outside. A secure mode lock entity (initially disabled) is exposed for all locks and can be enabled where the lock is known to support this capability.
+
## Troubleshooting
Lock operation requires setting up an encrypted connection highly sensitive to latency. It is recommended to use a [High-Performance Bluetooth adapter](/integrations/bluetooth/#known-working-high-performance-adapters) or [ESPHome Bluetooth proxy](/integrations/bluetooth/#remote-adapters-bluetooth-proxies) for stable operation.
@@ -77,11 +81,11 @@ The offline key and slot number are required to operate the lock. These credenti
### Yale Access, Yale Home, or August Cloud
-The [August](/integrations/august) {% term integration %} can automatically provision the offline key if the configured account has the key loaded. You may need to create or use a non-primary existing account with owner-level access to the lock, as not all accounts will have the key loaded. If the lock was not discovered by Home Assistant when the cloud {% term integration %} was loaded, reload the cloud {% term integration %} once the lock has been discovered.
+The [Yale](/integrations/yale) or [August](/integrations/august) cloud {% term integration %} can automatically provision the offline key if the configured account has the key loaded. You may need to create or use a non-primary existing account with owner-level access to the lock, as not all accounts will have the key loaded. If the lock was not discovered by Home Assistant when the cloud {% term integration %} was loaded, reload the cloud {% term integration %} once the lock has been discovered.
If the offline key can automatically be provisioned, you will not be asked to enter it and the {% term integration %} should be automatically added, configured and running.
-Most Yale branded locks can use the August cloud to obtain the keys. Accessing the August cloud to receive the key may not work unless the lock was purchased in a market that sells under both brands.
+Most Yale branded locks can use the cloud {% term integration %} to obtain the offline key. Accessing the August cloud to receive the key may only work if the lock was purchased in a market that sells under both brands and the Yale cloud should be tried for other markets.
### iOS - Yale Access App or August App
@@ -106,6 +110,6 @@ Root access is required to copy the `ModelDatabase.sql` from `/data/data/com.ass
### Lock frequently requires re-authentication
-If you use the key from an iOS or Android device that you also frequently use to operate the lock, you may find that the key is rotated, and the integration can no longer authenticate. If you are using the [August](/integrations/august) integration to keep the key up to date, it may need to be reloaded to update the key.
+If you use the key from an iOS or Android device that you also frequently use to operate the lock, you may find that the key is rotated, and the integration can no longer authenticate. If you are using the [Yale](/integrations/yale) or [August](/integrations/august) integration to keep the key up to date, it may need to be reloaded to update the key.
-To avoid the problem, create a second owner account in the August app, log in to it once on your iOS or Android device, operate the locks, log out of the account, remove the August integration, and set up the August integration with the secondary owner account. This method avoids the problem because there is no longer an iOS or Android device logged into the secondary owner account that can rotate the key unexpectedly.
+To avoid the problem, create a second owner account in the Yale Home or August app, log in to it once on your iOS or Android device, operate the locks, log out of the account, remove the Yale or August integration from Home Assistant, and set up the integration again with the secondary owner account. This method avoids the problem because there is no longer an iOS or Android device logged into the secondary owner account that can rotate the key unexpectedly.
diff --git a/source/_integrations/zabbix.markdown b/source/_integrations/zabbix.markdown
index 361d481c770..ac212bc2ccf 100644
--- a/source/_integrations/zabbix.markdown
+++ b/source/_integrations/zabbix.markdown
@@ -64,6 +64,11 @@ publish_states_host:
description: The host that will receive the state changes from Home Assistant. It needs to be manually created in Zabbix first and have the template associated with it (see above).
required: false
type: string
+publish_string_states:
+ description: Also publish string states, i.e. states which cannot be cast to a numeric value.
+ required: false
+ type: boolean
+ default: false
exclude:
type: list
description: Configure which integrations should be excluded from being published to Zabbix. ([Configure Filter](#configure-filter))
@@ -111,6 +116,7 @@ zabbix:
username: USERNAME
password: PASSWORD
publish_states_host: homeassistant
+ publish_string_states: true
exclude:
domains:
- device_tracker
diff --git a/source/_integrations/zerproc.markdown b/source/_integrations/zerproc.markdown
index 3282011277f..4bf6ca6bc4a 100644
--- a/source/_integrations/zerproc.markdown
+++ b/source/_integrations/zerproc.markdown
@@ -19,4 +19,3 @@ This {% term integration %} discovers nearby Zerproc lights and adds them to Hom
{% include integrations/config_flow.md %}
The {% term integration %} will scan for nearby devices, and is completed if any are found. No additional configuration is required. The integration will perform a BLE scan every 60 seconds to search for new devices.
-
diff --git a/source/_integrations/zimi.markdown b/source/_integrations/zimi.markdown
index a378fbfce32..60e23a09b74 100644
--- a/source/_integrations/zimi.markdown
+++ b/source/_integrations/zimi.markdown
@@ -1,12 +1,11 @@
---
-title: Zimi Cloud Controller
+title: zimi
description: Access and control your Zimi Cloud Controller and its connected Zimi-based devices.
featured: false
ha_iot_class: Local Push
ha_release: 2025.6
ha_codeowners:
- '@markhannon'
- - '@mhannon11'
ha_category:
- Cover
- Fan
@@ -25,6 +24,8 @@ quality_scale: bronze
integration_type: hub
related:
- url: https://zimi.life/
+ha_quality_scale: bronze
+ha_integration_type: integration
---
The **Zimi Cloud Controller** {% term integration %} allows you to connect your Zimi Cloud Controller to Home Assistant and, via this integration, control local devices connected to the Zimi mesh.
diff --git a/source/_integrations/zooz.markdown b/source/_integrations/zooz.markdown
new file mode 100644
index 00000000000..0df6f0daae9
--- /dev/null
+++ b/source/_integrations/zooz.markdown
@@ -0,0 +1,20 @@
+---
+title: Zooz
+description: Connect and control your Zooz Z-Wave series devices using the Z-Wave integration
+ha_release: '2025.7'
+ha_iot_class: Local Push
+ha_category:
+ - Lock
+ha_domain: zooz
+ha_integration_type: brand
+ha_platforms:
+ - lock
+ha_iot_standard: zwave
+ha_brand: true
+---
+
+Zooz Z-Wave devices work locally and integrate seamlessly with the Z-Wave integration in Home Assistant (Z-Wave stick required). As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
+
+{% my add_zwave_device badge domain=page.ha_domain %}
+
+[Learn more about Z-Wave in Home Assistant.](/integrations/zwave_js/)
diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown
index 803f6f0c602..484bcf57d11 100644
--- a/source/_integrations/zwave_js.markdown
+++ b/source/_integrations/zwave_js.markdown
@@ -82,7 +82,7 @@ For more Z-Wave term definitions, refer to the [terminology section](#z-wave-ter
To run a Z-Wave network, you need the following elements:
- A [supported Z-Wave controller](/docs/z-wave/controllers/#supported-z-wave-usb-sticks--hardware-modules). First-time user? For recommendations on what to buy, go [here](#which-z-wave-controller-should-i-buy).
-- A running Z-Wave JS server.
+- A running [Z-Wave JS server](#setting-up-a-z-wave-js-server).
- An installed Z-Wave integration in Home Assistant.
### Setting up a Z-Wave JS server
@@ -95,8 +95,11 @@ Follow these steps:
1. Open the Home Assistant user interface.
2. Plug the Z-Wave dongle into the device running Home Assistant.
- - Most likely, your dongle will be recognized automatically. On the user interface, you will be asked if you want to set up this device with the Z-Wave JS add-on. Select **Submit**.
- - If your dongle is not recognized, follow these steps:
+ - Most likely, your dongle will be recognized automatically.
+ - In the dialog, select **Recommended installation**.
+ - This will install the Z-Wave JS add-on on the Home Assistant server.
+ - Add the device to an {% term area %} and select **Finish**.
+ - **Troubleshooting**: If your dongle is not recognized, follow these steps:
{% details "Manual setup steps" %}
Use this My button:
@@ -113,7 +116,7 @@ Use this My button:
{% enddetails %}
3. Wait for the installation to complete.
-4. You are prompted for network security keys.
+4. Depending on your Home Assistant version, you may be prompted for network security keys.
- If you are using Z-Wave for the first time, leave all the fields empty and select **Submit**. The system will generate network security keys for you.
- If this Z-Wave dongle has already been paired with secure devices, you need to enter the previously used network key as the S0 network key. S2 security keys will be automatically generated for you.
- Make sure that you keep a backup of these keys in a safe place in case you need to move your Z-Wave dongle to another device. Copy and paste them somewhere safe.
@@ -129,7 +132,8 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta
### Adding a new device to the Z-Wave network
1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
-2. Select the Z-Wave integration. Then select **Configure**.
+2. Select the Z-Wave integration.
+ - Then, on the entry of the hub, select {% icon "ic:baseline-arrow-forward-ios" %} to open the device info page.
3. Select **Add device**.
- The Z-Wave controller is now in inclusion mode.
4. Check, if your device supports SmartStart:
@@ -155,13 +159,138 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta
### Removing a device from the Z-Wave network
+Do this before using the device with another controller, or when you don't use the device anymore. It removes the device from the Z-Wave network stored on the controller. It also removes the device and all its entities from Home Assistant. You can not join a device to a new network if it is still paired with a controller.
+
1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
-2. Select the **Z-Wave** integration. Then, select **Configure**.
-3. Select **Remove device**, then **Start exclusion**.
+2. Select the **Z-Wave** integration.
+ - Then, select the cogwheel {% icon "mdi:cog-outline" %}.
+3. Select **Remove a device**, then **Start exclusion**.
- The Z-Wave controller is now in exclusion mode.
4. Put the device you want to remove in exclusion mode. Refer to its manual how this is done.
5. The UI should confirm that the device was removed and the device and entities will be removed from Home Assistant.
+## Migrating a Z-Wave network to a new controller
+
+Do this if you have an existing Z-Wave network and want to use a new controller. This will reset your current controller (remove all network information from it) and remove the controller from Home Assistant. The Z-Wave integration with all its entities will stay in Home Assistant. The new controller is added to Home Assistant and paired with the existing network.
+
+### Prerequisites
+
+- Administrator rights in Home Assistant
+- If you want to migrate from a 500 series controller, before starting migration, update the controller to SDK 6.61+
+ - Check the documentation of your device to see if and how they can be updated.
+ - [Steps to update Aeotec Z-Stick 5](https://aeotec.freshdesk.com/support/solutions/articles/6000252294-z-stick-gen5-v1-02-firmware-update).
+
+### To migrate a Z-Wave network to a new controller
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration.
+ - Then, select the cogwheel {% icon "mdi:cog-outline" %}.
+3. Under **Backup and restore**, select **Migrate controller**.
+4. Select **Migrate to a new controller**.
+ - To confirm device reset, select **Submit**.
+ - **Info**: This will initiate a backup of the network information and factory reset the controller. All the stored network information will be removed.
+5. When the **Unplug your controller** dialog shows up, unplug your old controller.
+ - Connect the new controller.
+ - Confirm that you connected the new controller by selecting **Submit**.
+6. Follow the steps on screen.
+
+## Overriding the radio frequency region of the controller in the Z-Wave JS add-on
+
+The frequency used by Z-Wave devices depends on your region. For 700 and 800 series controllers, this frequency can be changed. The frequency of end devices cannot, so you need to make sure to buy devices specific to your region.
+
+If you are using the Z-Wave JS add-on, Home Assistant automatically changes the radio frequency region to match the region/country you're in. If needed, you can override this setting.
+
+### Prerequisites
+
+- Administrator rights in Home Assistant
+- All your Z-Wave devices must be specified for that region
+- Note: this procedure only applies if your controller is [set up using the Z-Wave JS add-on](#setting-up-a-z-wave-js-server)
+
+### To override the radio frequency region of your Z-Wave controller
+
+1. Go to {% my supervisor_addon addon="core_zwave_js" title="**Settings** > **Add-ons** > **Z-Wave JS**" %}.
+2. Open the **Configuration** tab.
+3. In the **Options** section, select the **Radio Frequency Region**.
+4. To apply your changes, select **Save**.
+ - Your Z-Wave controller is now ready to communicate with devices that were specified for your chosen region.
+5. To return to the default setting and use the region defined by Home Assistant, under **Radio Frequency Region** choose **Automatic**.
+
+## Backing up your Z-Wave network
+
+It's recommended to create a backup before making any major changes to your Z-Wave network. For example, before migrating from one controller to another, or before resetting your controller. The backup stores your Z-Wave controller's non-volatile memory (NVM), which contains your network information including paired devices. It is stored in a binary file that you can download.
+
+### Prerequisites
+
+- Administrator rights in Home Assistant
+
+### To backup your Z-Wave network
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration.
+ - Then, select the cogwheel {% icon "mdi:cog-outline" %}.
+3. Under **Backup and restore**, select **Download backup**.
+ - **Result**: The backup file is downloaded to the device from which you initiated the download.
+4. Done! Store the backup file somewhere safe in case you need it later to restore your Z-Wave network.
+
+## Updating the firmware of your Z-Wave device
+
+Controllers and devices with the Firmware Update Metadata Command Class allow you to update the firmware by uploading a firmware file. In those cases, you can start the firmware update from the device page in Home Assistant. Refer to the documentation of the device manufacturer to find the corresponding firmware file. An example is the [firmware page by Zooz](https://www.support.getzooz.com/kb/article/1158-zooz-ota-firmware-files/).
+
+{% note %}
+**Risk of damage to the device due to firmware update**
+
+A firmware update can damage your Z-Wave device.
+
+- Before updating your Z-Wave device, make sure an update is necessary, and that you have the correct firmware file matching your device.
+- Once you have started the update process, you must not interrupt the update process but let it complete.
+
+The Home Assistant and Z-Wave JS teams do not take any responsibility for any damages to your device as a result of the firmware update and will not be able to help you if you render your device useless due to firmware update.
+{% endnote %}
+
+### Prerequisites
+
+- Administrator rights in Home Assistant
+- Downloaded the firmware file from the manufacturer website
+
+### To update firmware of a Z-Wave device
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration.
+ - Then, on the entry of the hub, select {% icon "ic:baseline-arrow-forward-ios" %} to open the device info page.
+3. Under **Device info**, select **Update**.
+4. Select the firmware file that you previously downloaded to your computer.
+ - **Notice: Risk of damage to the device**
+ - Make sure you select the correct firmware file.
+ - An incorrect firmware file can damage your device.
+ - Once you start the update process, you must wait for the update to complete.
+ - An interrupted update can damage your device.
+5. Select **Begin firmware update** and wait for it to complete.
+
+## Resetting a Z-Wave controller
+
+It is recommended to back up your Z-Wave network before resetting the device.
+
+- The controller will forget all devices it is paired with.
+- All Z-Wave devices for this network will be removed from Home Assistant.
+- If there are any devices still paired with the controller when it is reset, they will have to be removed from their old network before they can be re-paired.
+- The device firmware will remain on the device.
+
+### Prerequisites
+
+- Administrator rights on Home Assistant
+- [Backup your Z-Wave network](#backing-up-your-z-wave-network)
+- [Remove all devices that are paired with your controller from the network](#removing-a-device-from-the-z-wave-network).
+ - Removing can be done by any controller, not just the one that originally managed the network. In theory, this could also be done later.
+
+### To reset a Z-Wave controller
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration. Then, select the controller.
+3. Under **Device info**, select the three-dot {% icon "mdi:dots-vertical" %} menu, then select **Factory reset**.
+
+ 
+4. Once the process is finished, you can use this controller to start a new network, or pass it on to someone else.
+
## Special Z-Wave entities
The Z-Wave integration provides several special entities, some of which are available for every Z-Wave device, and some of which are conditional based on the device.
@@ -201,19 +330,6 @@ Some features can be accessed from the menu of integration itself. As they are n
- **[Download diagnostics](/docs/configuration/troubleshooting/#download-diagnostics):** Exports a JSON file describing the entities of all devices registered with this integration.
-### Device panel
-
-#### Controller
-
-The following features can be accessed from the device panel of a Z-Wave controller:
-
-- **Factory reset:** Exercise extreme caution when using this action! Once initiated, your controller will be reset to factory settings, it will forget all devices it is paired with, it will establish a new network ID that will prevent any recovery of your old network, and all Z-Wave devices for this network will be removed from Home Assistant. If there are any devices still paired with the controller when it is reset, they will have to go through the exclusion process before they can be re-paired.
-
-
-
-Screenshot showing the device panel of a Z-Wave controller.
-
-
#### Network devices
The following features can be accessed from the device panel of any Z-Wave device on your network aside from the controller:
@@ -819,7 +935,7 @@ You can also keep track of the road map for the Z-Wave integration [here](https:
### Which Z-Wave controller should I buy?
-Z-Wave supports all known 500 and 700 series Z-Wave controllers. If you are just starting out, we recommend that you purchase a 700 series controller (with firmware updated to >=7.17.2).
+Z-Wave supports all known 500-, 700-, and 800-series Z-Wave controllers. If you are just starting out, we recommend that you purchase a 800-series controller (with firmware updated to >=7.23.2).
For more information, see [Supported Z-Wave dongles](/docs/z-wave/controllers/#supported-z-wave-usb-sticks--hardware-modules)
@@ -946,7 +1062,7 @@ If the interview is complete, then the device does not yet have a device file fo
When trying to determine why something isn't working as you expect, or when reporting an issue with the integration, it is helpful to know what Z-Wave JS sees as the current state of your Z-Wave network. To get a dump of your current network state, follow these steps:
1. Go to {% my integrations title="**Settings** > **Devices & services**" %}.
-2. Select the **Z-Wave** integration. Then, select the three dots.
+2. Select the **Z-Wave** integration. Then, select the three-dot {% icon "mdi:dots-vertical" %} menu.
3. From the dropdown menu, select **Download diagnostics**.
### How do I address interference issues?
@@ -960,16 +1076,16 @@ Many users have reported issues with interference when the USB stick was directl
##### Enable Z-Wave JS logging
1. Go to the Z-Wave integration panel: {% my integration badge domain="zwave_js" %}
-2. Select `Enable debug logging` on the left-hand side of the screen.
-
-The log level will be set to `debug` for the integration, library, and optionally the driver (if the driver log level is not already set to `verbose`, `debug`, or `silly`), and all Z-Wave JS logs will be added to the Home Assistant logs.
+2. In the top-right corner, select the three-dot {% icon "mdi:dots-vertical" %} menu and select **Enable debug logging**.
+ - **Result**: The log level will be set to `debug` for the integration, library, and optionally the driver (if the driver log level is not already set to `verbose`, `debug`, or `silly`), and all Z-Wave JS logs will be added to the Home Assistant logs.
+3. If you want to change the log level, on the Z-Wave integration panel: {% my integration badge domain="zwave_js" %}, select the cogwheel {% icon "mdi:cog-outline" %}.
+ - Select the **Logs** tab, then select the log level.
##### Disable Z-Wave JS logging
1. Go to the Z-Wave integration panel: {% my integration badge domain="zwave_js" %}
-2. Select `Disable debug logging` on the left-hand side of the screen.
-
-The log level will be reset to its previous value for the integration, library, and driver, and the Home Assistant frontend will automatically send you the Z-Wave logs generated during that time period for download.
+2. In the top-right corner, select the three-dot {% icon "mdi:dots-vertical" %} menu and select **Disable debug logging**.
+ - **Result**: The log level will be reset to its previous value for the integration, library, and driver, and the Home Assistant frontend will automatically send you the Z-Wave logs generated during that time period for download.
#### The advanced way
@@ -1062,3 +1178,25 @@ No further action is required and the SmartStart product will be added automatic
### Terminology mapping table
For some of the concepts, the terminology used in Home Assistant does not correspond to the terminology used in Z-Wave documentation. Refer to the [terminology mapping table](#z-wave-terminology-and-home-assistant) for a list of term equivalents.
+
+## Removing Z-Wave JS from Home Assistant
+
+This removes all paired Z-Wave devices and their entities, the Z-Wave JS add-on, and the Z-Wave integration from Home Assistant.
+
+### To remove Z-Wave JS from Home Assistant
+
+1. [Remove the device from your Z-Wave network](/integrations/zwave_js/#removing-a-device-from-the-z-wave-network).
+ - Do this for each device that is joined to your network so that it is no longer paired to the controller.
+ - You cannot add a device to a new controller while it is still paired with an old one.
+ - Alternatively, you can factory reset each device. Refer to the device manual to see how this is done.
+ - This usually involves finding the device in your household and pressing a button.
+2. Remove the Z-Wave integration.
+ - Go to {% my integrations title="**Settings** > **Devices & services**" %} and select the integration card.
+ - Next to the integration entry, select the three-dot {% icon "mdi:dots-vertical" %} menu.
+ - Select **Delete**.
+3. If it hasn't been deleted automatically, remove the Z-Wave JS add-on.
+ - Go to {% my supervisor_addon addon="core_zwave_js" title="**Settings** > **Add-ons** > **Z-Wave JS**" %}.
+ - Select **Uninstall**.
+ - Decide whether to also delete the data related to the add-on or whether to keep it.
+4. Done. Z-Wave JS is now completely removed from your Home Assistant server.
+ - You can now use your Z-Wave devices and controller on a new server.
diff --git a/source/_posts/2016-02-13-speedtest-bloomsky-splunk-and-garage-doors.markdown b/source/_posts/2016-02-13-speedtest-bloomsky-splunk-and-garage-doors.markdown
index c2c2984d575..c1a4f7c7b19 100644
--- a/source/_posts/2016-02-13-speedtest-bloomsky-splunk-and-garage-doors.markdown
+++ b/source/_posts/2016-02-13-speedtest-bloomsky-splunk-and-garage-doors.markdown
@@ -108,7 +108,7 @@ Not only did we gain a lot of test coverage, we also attracted a lot of new deve
[Snapcast]: /integrations/snapcast
[mqtt-publish]: /integrations/mqtt/#publish-service
[REST]: /integrations/notify.rest/
-[template]: /integrations/switch.template/
+[template]: /integrations/template/#switch
[Honeywell]: /integrations/honeywell/
[zwave-polling]: /integrations/zwave/#configuration
[zwave-scene]: /integrations/zwave/#events
diff --git a/source/_posts/2023-01-04-release-20231.markdown b/source/_posts/2023-01-04-release-20231.markdown
index b0626a93511..f284d0c8a01 100644
--- a/source/_posts/2023-01-04-release-20231.markdown
+++ b/source/_posts/2023-01-04-release-20231.markdown
@@ -83,7 +83,7 @@ repository, and [we are looking for contributions](https://github.com/home-assis
So, feel free to jump in and help out!
An overview of the current status of all intents and languages can be found on
-[this page](https://home-assistant.github.io/intents/). The page gives insight
+[this page](https://ohf-voice.github.io/intents/). The page gives insight
into the parts we need help with.
Lastly, we are also looking for language leaders! Each language is maintained
diff --git a/source/_posts/2023-01-26-year-of-the-voice-chapter-1.markdown b/source/_posts/2023-01-26-year-of-the-voice-chapter-1.markdown
index 67fb3bf7159..6e5a3f83d59 100644
--- a/source/_posts/2023-01-26-year-of-the-voice-chapter-1.markdown
+++ b/source/_posts/2023-01-26-year-of-the-voice-chapter-1.markdown
@@ -20,7 +20,7 @@ _To watch the video presentation of this blog post, including live demos, check
The core of a voice assistant is to be able to understand the intention of a spoken sentence. What is it the user wants to do? To extract these intentions we created our own template sentence matching format and intent recognizer named [Hassil](https://github.com/home-assistant/hassil).
-This new format is used by our new [Home Assistant Intents](https://github.com/home-assistant/intents) project. The goal of this project is to collect home automation sentences in every possible language. Since it's start a month ago, we have had 112 people contribute. The project now supports [22 languages and 14 more are in progress](https://home-assistant.github.io/intents/).
+This new format is used by our new [Home Assistant Intents](https://github.com/home-assistant/intents) project. The goal of this project is to collect home automation sentences in every possible language. Since it's start a month ago, we have had 112 people contribute. The project now supports [22 languages and 14 more are in progress](https://ohf-voice.github.io/intents/).
## Assist
diff --git a/source/_posts/2023-02-01-release-20232.markdown b/source/_posts/2023-02-01-release-20232.markdown
index db5e7606d37..a3a0f58319c 100644
--- a/source/_posts/2023-02-01-release-20232.markdown
+++ b/source/_posts/2023-02-01-release-20232.markdown
@@ -77,7 +77,7 @@ Today we like you to meet:
allows you to use natural language to control Home Assistant. It is powered by
[Hassil](https://github.com/home-assistant/hassil) and the sentences
(contributed by 112! people) from the
-[Home Assistant Intents](https://home-assistant.github.io/intents/) project.
+[Home Assistant Intents](https://ohf-voice.github.io/intents/) project.
We believe technology is meant to be played with, and projects should be
usable as soon as possible. Together with the community, we can then iterate
diff --git a/source/_posts/2023-04-27-year-of-the-voice-chapter-2.markdown b/source/_posts/2023-04-27-year-of-the-voice-chapter-2.markdown
index bf39238eca8..db28363160f 100644
--- a/source/_posts/2023-04-27-year-of-the-voice-chapter-2.markdown
+++ b/source/_posts/2023-04-27-year-of-the-voice-chapter-2.markdown
@@ -25,7 +25,7 @@ _To watch the video presentation of this blog post, including live demos, check
[Year of the Voice]: https://www.home-assistant.io/blog/2022/12/20/year-of-voice/
[Chapter 1]: https://www.home-assistant.io/blog/2023/01/26/year-of-the-voice-chapter-1/
-[45 languages]: https://home-assistant.github.io/intents/
+[45 languages]: https://ohf-voice.github.io/intents/
[live-stream]: https://youtube.com/live/Tk-pnm7FY7c?feature=share
[assist]: /voice_control/
diff --git a/source/_posts/2023-07-20-year-of-the-voice-chapter-3.markdown b/source/_posts/2023-07-20-year-of-the-voice-chapter-3.markdown
index f8795a1fe89..cad73925c50 100644
--- a/source/_posts/2023-07-20-year-of-the-voice-chapter-3.markdown
+++ b/source/_posts/2023-07-20-year-of-the-voice-chapter-3.markdown
@@ -29,7 +29,7 @@ _To watch the video presentation of this blog post, including live demos, check
[Year of the Voice]: https://www.home-assistant.io/blog/2022/12/20/year-of-voice/
[Chapter 1]: https://www.home-assistant.io/blog/2023/01/26/year-of-the-voice-chapter-1/
[Chapter 2]: https://www.home-assistant.io/blog/2023/04/27/year-of-the-voice-chapter-2/
-[50 languages]: https://home-assistant.github.io/intents/
+[50 languages]: https://ohf-voice.github.io/intents/
[live-stream]: https://youtube.com/live/sXzItFksYFA?feature=share
[Assist]: /voice_control/
[ESPHome]: /voice_control/thirteen-usd-voice-remote/
diff --git a/source/_posts/2023-10-12-year-of-the-voice-chapter-4-wakewords.markdown b/source/_posts/2023-10-12-year-of-the-voice-chapter-4-wakewords.markdown
index 7eb244eb19b..58c259cd9f6 100644
--- a/source/_posts/2023-10-12-year-of-the-voice-chapter-4-wakewords.markdown
+++ b/source/_posts/2023-10-12-year-of-the-voice-chapter-4-wakewords.markdown
@@ -16,7 +16,7 @@ This year is Home Assistant’s [Year of the Voice](https://www.home-assistant.i
We’ve got great news: wake words are finally here! After 4 chapters, we now have the final building block for voice in Home Assistant.
-In [Chapter 1](https://www.home-assistant.io/blog/2023/01/26/year-of-the-voice-chapter-1/), we started with text commands such as “turn on the kitchen light” and “open garage door”. We now [support 56 languages](https://home-assistant.github.io/intents/) and have 188 contributors helping to translate common smart home commands for everyone.
+In [Chapter 1](https://www.home-assistant.io/blog/2023/01/26/year-of-the-voice-chapter-1/), we started with text commands such as “turn on the kitchen light” and “open garage door”. We now [support 56 languages](https://ohf-voice.github.io/intents/) and have 188 contributors helping to translate common smart home commands for everyone.
[Chapter 2](https://www.home-assistant.io/blog/2023/04/27/year-of-the-voice-chapter-2/) introduced audio for voice commands: both speech-to-text and text-to-speech. This included local options for maximum privacy as well as support for Home Assistant Cloud for incredible speed and language coverage. Lastly in [Chapter 3](https://www.home-assistant.io/blog/2023/07/20/year-of-the-voice-chapter-3/), we added the ability to set Home Assistant as your default assistant on Android phones and watches.
diff --git a/source/_posts/2024-12-04-release-202412.markdown b/source/_posts/2024-12-04-release-202412.markdown
index c2cba5d6a15..359409caa34 100644
--- a/source/_posts/2024-12-04-release-202412.markdown
+++ b/source/_posts/2024-12-04-release-202412.markdown
@@ -99,7 +99,7 @@ it is currently set up, but it will not apply it. You can then switch to the
actual scenery and snapshot it again once you are happy with the changes.
Additionally, if you prefer {% term YAML %}, you can edit scenes directly from
-the scene editor by selecting **“Edit in YAML”** from the three-dotted
+the scene editor by selecting **“Edit in YAML”** from the three-dotted
{% icon "mdi:dots-vertical" %} overflow menu in the top right corner.
[@karwosts]: https://github.com/karwosts
@@ -169,7 +169,7 @@ extremely hard to polish support for their language.
The number of contributions to our [intents repository] (where we store the
supported sentences) skyrocketed during the last month, which we all truly
appreciate. More and more languages are becoming usable or even complete!
-You can follow the progress [here](https://home-assistant.github.io/intents/).
+You can follow the progress [here](https://ohf-voice.github.io/intents/).
We won’t list them all, but rest assured, someone is likely working hard to
ensure your native language works seamlessly, so you can use it comfortably
@@ -230,7 +230,7 @@ We now have a total of 4 scaled tiers:
- **🏆 [Platinum](/docs/quality_scale/#-platinum)**:
The epitome of quality, supreme code quality, and optimal performance.
-We also have four additional (non-scaled) special tiers:
+We also have four additional (non-scaled) special tiers:
- **❓ [No score](/docs/quality_scale/#-no-score)**:
For integrations that are not yet scored against the new scale.
@@ -253,7 +253,7 @@ developer documentation].
[each integration documentation page]: /integrations/homewizard
[Integration Quality Scale page]: /docs/quality_scale/
-[extensively documented every rule and requirement for each tier in our developer documentation]: https://developers.home-assistant.io/docs/core/integration-quality-scale/#integration-quality-scale-rules
+[extensively documented every rule and requirement for each tier in our developer documentation]: https://developers.home-assistant.io/docs/core/integration-quality-scale/#integration-quality-scale-rules
## Integrations
@@ -264,16 +264,16 @@ and improvements to existing ones! You’re all awesome. 🥰
We welcome the following new integrations in this release:
-- **[Acaia]**, added by [@zweckj]
+- **[Acaia]**, added by [@zweckj]
Adds support for [Acaia coffee scales] to Home Assistant.
-- **[Music Assistant]**, added by [@jozefKruszynski]
+- **[Music Assistant]**, added by [@jozefKruszynski]
The integration for [Music Assistant](https://music-assistant.io/) is making
its way into Home Assistant! 🎉
-- **[NASweb]**, added by [@nasWebio]
+- **[NASweb]**, added by [@nasWebio]
Brings in support for the NASweb automation system to Home Assistant.
-- **[Nord Pool]**, added by [@gjohansson-ST]
+- **[Nord Pool]**, added by [@gjohansson-ST]
Pulls in latest energy prices from the Nord Pool energy market as sensors.
-- **[Sky Remote]**, added by [@dunnmj]
+- **[Sky Remote]**, added by [@dunnmj]
Control your [Sky] box using automations or from your Home Assistant
dashboards.
diff --git a/source/_posts/2024-12-19-voice-chapter-8-assist-in-the-home.markdown b/source/_posts/2024-12-19-voice-chapter-8-assist-in-the-home.markdown
index 7404e0d1d9e..21dc8018a2e 100644
--- a/source/_posts/2024-12-19-voice-chapter-8-assist-in-the-home.markdown
+++ b/source/_posts/2024-12-19-voice-chapter-8-assist-in-the-home.markdown
@@ -83,7 +83,7 @@ Assist can't understand spoken words and needs something to take that audio and
See if your language is supported with our checker.
-Assist aims to support more languages than other voice assistants, and this has been a massive undertaking for our community - We need more help. The first step for language support is getting the commands (intents) right, and we have [over 25 major languages](https://home-assistant.github.io/intents/) that are ready to use today. Our wake words are also getting better at understanding different accents thanks to our [Wake Word Collective tool](https://ohf-voice.github.io/wake-word-collective/).
+Assist aims to support more languages than other voice assistants, and this has been a massive undertaking for our community - We need more help. The first step for language support is getting the commands (intents) right, and we have [over 25 major languages](https://ohf-voice.github.io/intents/) that are ready to use today. Our wake words are also getting better at understanding different accents thanks to our [Wake Word Collective tool](https://ohf-voice.github.io/wake-word-collective/).
### Text-to-speech
diff --git a/source/_posts/2025-02-05-release-20252.markdown b/source/_posts/2025-02-05-release-20252.markdown
index 91e12fbec1e..3206f78a4c5 100644
--- a/source/_posts/2025-02-05-release-20252.markdown
+++ b/source/_posts/2025-02-05-release-20252.markdown
@@ -252,7 +252,7 @@ and did not make it this release)._
You can now broadcast messages to every other voice assistant in your home.
Try it by saying _"Broadcast it is time for dinner"_.
As always with new intents, support may vary
-[depending on your language](https://home-assistant.github.io/intents/),
+[depending on your language](https://ohf-voice.github.io/intents/),
but our language leaders are working hard on making sure it will be supported
soon in your language!
diff --git a/source/_posts/2025-06-11-release-20256.markdown b/source/_posts/2025-06-11-release-20256.markdown
new file mode 100644
index 00000000000..e342bfee7be
--- /dev/null
+++ b/source/_posts/2025-06-11-release-20256.markdown
@@ -0,0 +1,607 @@
+---
+layout: post
+title: "2025.6: Getting picky about Bluetooth"
+description: "Great new Bluetooth connection graphs, all pickers have been revamped, sidebar management improvements, (un)group media players straight from your dashboards, and more!"
+date: 2025-06-11 00:00:00
+date_formatted: "June 11, 2025"
+author: Franck Nijhof
+author_twitter: frenck
+comments: true
+categories:
+ - Release-Notes
+ - Core
+og_image: /images/blog/2025-06/social.png
+---
+
+
+
+Home Assistant 2025.6! 🎉
+
+We are already half way through 2025, can you believe it? I personally can't, as it feels like we just started the year. Not just that, there are so many exciting things to still come this year, and I can't wait to share them with you!
+
+Anyway, the June release is here! A week later than usual, but it also means we had an extra week to polish and beta test this release. Like the [previous release](/blog/2025/05/07/release-20255/), this release is packed with quality-of-life improvements!
+
+Last release my favorite feature was the new entity picker; this release, we improved ALL other pickers! No surprise that this, again, makes it to my top favorite this release. Although the ability to group media players directly from the media player card is a close second. It is so nice to see how Home Assistant keeps getting better and better, and how our community keeps contributing to it. 😍
+
+If you are leveraging Bluetooth in your Home Assistant setup, you will also love the new Bluetooth connection graph that shows how your Bluetooth devices are connected, including Bluetooth proxies. Troubleshooting Bluetooth has become so much easier now!
+
+Enjoy the release!
+
+../Frenck
+
+_PS: We will pick up the regular release schedule again now, so expect the next release on the first Wednesday of July (July 2nd)._
+
+
+
+- [Improving all the "pickers"](#improving-all-the-pickers)
+- [Making sense of Bluetooth](#making-sense-of-bluetooth)
+- [Iterations of the experimental area dashboard](#iterations-of-the-experimental-area-dashboard)
+- [Deprecating installation methods and 32-bit architectures](#deprecating-installation-methods-and-32-bit-architectures)
+- [Integrations](#integrations)
+ - [New integrations](#new-integrations)
+ - [Noteworthy improvements to existing integrations](#noteworthy-improvements-to-existing-integrations)
+ - [Integration quality scale achievements](#integration-quality-scale-achievements)
+ - [Farewell to the following](#farewell-to-the-following)
+- [Other noteworthy changes](#other-noteworthy-changes)
+- [Sidebar improvements](#sidebar-improvements)
+- [Join/unjoin groups of media players](#joinunjoin-groups-of-media-players)
+- [Reset/restore entity IDs](#resetrestore-entity-ids)
+- [Patch releases](#patch-releases)
+ - [2025.6.1 - June 13](#202561---june-13)
+ - [2025.6.2 - June 23](#202562---june-23)
+ - [2025.6.3 - June 24](#202563---june-24)
+- [Need help? Join the community!](#need-help-join-the-community)
+- [Backward-incompatible changes](#backward-incompatible-changes)
+- [All changes](#all-changes)
+
+## Improving all the "pickers"
+
+Pickers are those dropdowns you use to select entities, devices, areas, and more. Pickers are *everywhere* in Home Assistant, being used in automations, scripts, and configuration options.
+
+Last release, we [introduced a new entity picker](/blog/2025/05/07/release-20255/#picking-entities), which was a big hit! This release takes things further by refining the search experience based on your feedback.
+
+Even better, that same improved search experience now comes to the area, category, floor, label, user, and device pickers too! They are consistent, fast, and easy to use, no matter what you're selecting.
+
+And the device picker? It now has a fresh look to match, complete with manufacturer logos and styling inspired by the entity picker.
+
+
+
+## Making sense of Bluetooth
+
+Home Assistant has powerful [Bluetooth capabilities], and with the use of something like [ESPHome Bluetooth proxies], you can extend your Bluetooth network to cover your entire home. This release brings some improvements to the Bluetooth integration that will help you understand your Bluetooth network better.
+
+The Bluetooth integration now provides a visualization that shows how your Bluetooth devices are connected to your Home Assistant instance, whether that's directly to your system or through a Bluetooth proxy.
+
+
+
+It not only shows the actively connected devices, but also the devices that are in range, but not yet known to Home Assistant. This is a great way to see what devices are around you and where they can be potentially connected.
+
+Oh! And now that the Bluetooth integration has a sleek new visualization, the [Zigbee integration], which already has a similar feature, has been given a visual update. This makes visualizations consistent across Home Assistant.
+
+[Bluetooth capabilities]: /integrations/bluetooth
+[ESPHome Bluetooth proxies]: https://esphome.io/projects/?type=bluetooth
+[Zigbee integration]: /integrations/zha
+
+## Iterations of the experimental area dashboard
+
+In the April release, we introduced a [new experimental Areas dashboard](/blog/2025/04/02/release-20254/#a-new-experimental-areas-dashboard), which automatically generates a ready-to-use dashboard based on the areas you’ve set up in your home. It uses sections and tile cards for a modern, clean, and intuitive look --- all built for you in a couple of clicks.
+
+As this is experimental, it is being continuously iterated on. This release brings some nice changes, based on your feedback, to subtly refine the experience.
+
+We added a new "Actions" section that includes scripts, automations, and scenes. We also added number entities (and number helpers), button entities (and button helpers), counters, and timer helpers to the "Others" section. This makes it easier to find and manage your automations and scenes in the context of your areas.
+
+Finally, we renamed the "Entertainment" section to "Media players". This makes it clearer that this section is specifically for your players, and may not include your DIY arcade machine 👾.
+
+
+
+## Deprecating installation methods and 32-bit architectures
+
+This release introduces important deprecation announcements, and though they only affect a small percentage of users, it is important that they understand the impacts. We've written [a detailed blog](/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/) that explains the rationale, timeline, and tips on how to migrate --- which I highly suggest reading if you think you're affected.
+
+- **Installation Methods**: The **Core** and **Supervised** installation methods are now officially deprecated. These are advanced setups that are only used by a small portion of users, as they involve running Home Assistant in a Python environment or installing the Supervisor on top of your own operating system. Moving forward, we are focusing our support on the more streamlined and maintainable installation methods: **Home Assistant OS** and **Home Assistant Container**.
+
+- **32-bit Architectures**: Support for legacy 32-bit CPU architectures (**i386**, **armhf**, and **armv7**) is also being deprecated. These architectures are increasingly uncommon and pose challenges for maintaining compatibility and performance.
+
+To assist you during this transition, Home Assistant will now raise a **repair issue** after upgrading if your system is affected by these deprecations. This notification will appear in the repair dashboard, providing information about the deprecation along with guidance on how to migrate to a supported setup.
+
+It's important to note that while these methods and architectures are deprecated, they will continue to receive support for the next six months, until the release of Home Assistant 2025.12. You can continue to use them after this point, but we would highly recommend migrating. After this 6-month period, they will become unsupported, meaning they will no longer receive updates or official assistance.
+
+If you don't receive this repair message, you're not affected. However, you can double-check using [our guide](/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/#what-does-deprecated-and-unsupported-mean) if you'd like. We also have specific information on what becoming deprecated and unsupported [means for your installation](/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/#what-does-deprecated-and-unsupported-mean). Lastly, we have detailed information on [how best to migrate](/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/#how-to-migrate) to a supported system.
+
+## Integrations
+
+Thanks to our community for keeping pace with the new {% term integrations %}
+and improvements to existing ones! You’re all awesome 🥰
+
+### New integrations
+
+We welcome the following new integrations in this release:
+
+- **[Alexa Devices]**, added by [@chemelli74]
+ Connect to and control your Amazon devices like Echo, Fire TV, and Alexa-enabled devices.
+- **[Immich]**, added by [@mib1185]
+ Integrates with [Immich App], a self-hosted photo and video backup solution that puts you in control of your personal media.
+- **[Paperless-ngx]**, added by [@fvgarrel]
+ Connect to your [Paperless-ngx system] to track and manage your digital documents from Home Assistant.
+- **[Probe Plus]**, added by [@pantherale0]
+ Integrate wireless Bluetooth meat thermometers compatible with the PROBE PLUS app, bringing real-time temperature monitoring during cooking into Home Assistant.
+- **[Zimi Cloud Connect]**, added by [@mhannon11]
+ Connect to [Zimi Cloud] devices to monitor and control your Zimi smart home products.
+
+[@chemelli74]: https://github.com/chemelli74
+[@fvgarrel]: https://github.com/fvgarrel
+[@mhannon11]: https://github.com/mhannon11
+[@mib1185]: https://github.com/mib1185
+[@pantherale0]: https://github.com/pantherale0
+[@starkillerOG]: https://github.com/starkillerOG
+[Alexa Devices]: /integrations/alexa_devices
+[Immich App]: https://immich.app/
+[Immich]: /integrations/immich
+[Paperless-ngx system]: https://docs.paperless-ngx.com/
+[Paperless-ngx]: /integrations/paperless_ngx
+[Probe Plus]: /integrations/probe_plus
+[Zimi Cloud Connect]: /integrations/zimi
+[Zimi Cloud]: https://www.zimi.com.au/
+
+This release also has new virtual integrations. Virtual integrations are stubs that are handled by other (existing) integrations to help with findability. These ones are new:
+
+- **[Kaiser Nienhaus]**, provided by [Motionblinds], added by [@starkillerOG]
+
+[@starkillerOG]: https://github.com/starkillerOG
+[Kaiser Nienhaus]: /integrations/kaiser_nienhaus
+[Motionblinds]: /integrations/motionblinds
+
+### Noteworthy improvements to existing integrations
+
+It is not just new {% term integrations %} that have been added; existing
+integrations are also being constantly improved. Here are some of the noteworthy
+changes to existing integrations:
+
+- [@bdraco] added support for updating [ESPHome] devices that are in deep sleep.
+ A very welcome improvement for battery-powered devices!
+- The [Homee] integration now supports fans and provides alarm control panels.
+ Thanks for expanding its capabilities, [@Taraman17]!
+- [Teslemetry] keeps getting better—[@Bre77] added a hazard lights binary sensor,
+ a valet mode switch, and a credit balance sensor. Nice!
+- [@bieniu] improved the [Shelly] integration to use sub-devices for multi-channel devices.
+ A notable change for complex setups!
+- The [SmartThings] integration saw a huge round of improvements by [@joostlek], including:
+ support for cooktops, hobs, water heaters, hood fan speeds, Steam closet modes,
+ freezer and cooler temperatures, washer spin and soil levels, valve positions,
+ heat pump zone climates, and atmospheric pressure. Amazing!
+- [Miele] keeps on shining with new features from [@astrandb], like vacuum support,
+ drying step sensors, washer-dryer program phases, and hob plate sensors.
+ [@generically-named] added energy and water forecasts too—very cool!
+- [@agorecki] added a Lux sensor to the [Airthings Cloud] integration—bright idea!
+- The [Squeezebox] integration now includes service update entities, thanks to [@pssc]!
+- [@tedvdb] added a status sensor to the [Whois] integration. Simple, but effective.
+- [@zerzhang] added support for [SwitchBot]
+ [vacuums](https://www.switch-bot.com/products/switchbot-robot-vacuum-k10-plus),
+ and new lock models: the [Lock Ultra](https://www.switch-bot.com/products/switchbot-lock-ultra)
+ and [Lock Lite](https://www.switch-bot.com/products/switchbot-lock-lite)!
+- [@danielvandenberg95] updated the [Sonos] integration to show playlists under favorites.
+ A great UX win!
+- The [Kostal Plenticore] integration now supports installer login.
+ Thanks for that improvement, [@Schlauer-Hax]!
+- [@Shulyaka] added support for [Anthropic] Claude 4. Welcome to the future!
+- And finally, [@chemelli74] added preset mode support to the [Comelit] climate integration.
+ Another nice quality-of-life addition!
+
+[@agorecki]: https://github.com/agorecki
+[@astrandb]: https://github.com/astrandb
+[@bdraco]: https://github.com/bdraco
+[@bieniu]: https://github.com/bieniu
+[@Bre77]: https://github.com/Bre77
+[@chemelli74]: https://github.com/chemelli74
+[@danielvandenberg95]: https://github.com/danielvandenberg95
+[@generically-named]: https://github.com/generically-named
+[@joostlek]: https://github.com/joostlek
+[@pssc]: https://github.com/pssc
+[@Schlauer-Hax]: https://github.com/Schlauer-Hax
+[@Shulyaka]: https://github.com/Shulyaka
+[@Taraman17]: https://github.com/Taraman17
+[@tedvdb]: https://github.com/tedvdb
+[@zerzhang]: https://github.com/zerzhang
+[Airthings Cloud]: /integrations/airthings
+[Anthropic]: /integrations/anthropic
+[Comelit]: /integrations/comelit
+[ESPHome]: /integrations/esphome
+[Homee]: /integrations/homee
+[Kostal Plenticore]: /integrations/kostal_plenticore
+[Miele]: /integrations/miele
+[Shelly]: /integrations/shelly
+[SmartThings]: /integrations/smartthings
+[Sonos]: /integrations/sonos
+[Squeezebox]: /integrations/squeezebox
+[SwitchBot]: /integrations/switchbot
+[Teslemetry]: /integrations/teslemetry
+[Whois]: /integrations/whois
+
+### Integration quality scale achievements
+
+One thing we are incredibly proud of in Home Assistant is our
+[integration quality scale]. This scale helps us and our contributors to ensure
+integrations are of high quality, maintainable, and provide the best possible
+user experience.
+
+This release, we celebrate several {% term integrations %} that have improved
+their quality scale:
+
+- **1 integration reached gold** 🥇
+ - [SwitchBot], thanks to [@zerzhang]
+
+- **1 integration reached silver** 🥈
+ - [Shelly], thanks to [@bieniu]
+
+This is a huge achievement for these integrations and their maintainers. The
+effort and dedication required to reach these quality levels is significant,
+as it involves extensive testing, documentation, error handling, and often
+complete rewrites of parts of the integration.
+
+A big thank you to all the contributors involved! 👏
+
+[integration quality scale]: https://www.home-assistant.io/docs/quality_scale/
+[@astrandb]: https://github.com/astrandb
+[@bieniu]: https://github.com/bieniu
+[@zerzhang]: https://github.com/zerzhang
+[Miele]: /integrations/miele
+[Shelly]: /integrations/shelly
+[SwitchBot]: /integrations/switchbot
+
+### Farewell to the following
+
+The following {% term integrations %} are also no longer available as
+of this release:
+
+- **RTSPtoWebRTC** has been removed as it has been replaced by the [go2rtc] integration.
+
+[go2rtc]: /integrations/go2rtc
+
+## Other noteworthy changes
+
+There are many more improvements in this release; here are some of the other noteworthy changes:
+
+- A small but neat one: [@balloob] made it so discoveries shown on an integration page are now sorted by title. Helpful!
+- The [Home Assistant Cloud] integration will now raise a repair issue when your subscription has expired, helping make sure you’re aware and not caught off guard. Nice one, [@ludeeus]!
+- More backup improvements! 🎉
+ - Home Assistant will now raise a repair issue if not all add-ons or folders were successfully backed up. Thanks, [@emontnemery]!
+ - [@agners] made it so that when an add-on is auto-updated, a backup is now correctly created as an "add-on"-backup. Great!
+ - A new automatic backup [event entity] has been added to track automatic backups made by the system. Great addition by [@mib1185]!
+- [@lboue] added support for the [Matter] pump device type. Another one
+ added to the list—awesome!
+- The Template integration got a big boost!
+ - [@Petro31] added modern-style YAML support for template fans, locks, alarm control panels, vacuums, and covers. So clean!
+ - You can now create **trigger-based template covers**. Yep, also by [@Petro31]!
+ - The `trigger_variables` option is now supported when using `for` in a trigger. A small but powerful feature. Thanks, [@Petro31]!
+ - New template filters! You can now use `from_hex`, and `base64_encode` now supports both bytes and strings. Handy additions from [@Petro31]!
+- New sensor capabilities:
+ - [@Passific] added a new device class and units for **reactive energy**. Nice!
+ - A new unit for **energy distance (Wh/km)** has been added. Thanks, [@frenck]!
+ - Sensors now support **mg/m³** as a concentration unit—another nice addition by [@frenck]!
+ - [@Arnie97] added support for **liters** as a unit for gas sensors. Much appreciated!
+- The new `recorder.get_statistics` action lets you query statistics directly
+ from the recorder. Powerful stuff, [@Hypfer]!
+
+[@agners]: https://github.com/agners
+[@Arnie97]: https://github.com/Arnie97
+[@balloob]: https://github.com/balloob
+[@emontnemery]: https://github.com/emontnemery
+[@frenck]: https://github.com/frenck
+[@Hypfer]: https://github.com/Hypfer
+[@lboue]: https://github.com/lboue
+[@ludeeus]: https://github.com/ludeeus
+[@mib1185]: https://github.com/mib1185
+[@Passific]: https://github.com/Passific
+[@Petro31]: https://github.com/Petro31
+[event entity]: /integrations/event
+[Home Assistant Cloud]: /integrations/cloud
+[Matter]: /integrations/matter
+[template entities]: /integrations/template/
+
+## Sidebar improvements
+
+If you didn't know yet, you can actually adjust the contents of your Home Assistant sidebar. You can change the order and show/hide items by pressing and holding the "Home Assistant" text at the top of the sidebar, or by going to your user profile page and selecting "Change the order and hide items from the sidebar".
+
+This release brings a couple of much-needed improvements to this feature. When you customize the sidebar, it will now bring up a nice and clean dialog that allows you to drag and drop items to change their order, or hide them by clicking the eye icon next to them.
+
+
+
+The biggest improvement is actually found somewhere else! Previously, the customization of the sidebar was only applied to the device you made the changes on; and even more annoying, sometimes it would lose the changes, or it would magically forget your settings on our [mobile companion apps] when you switched between your home network (and thus the internal URL). 🥲
+
+In this release, this annoyance has been fixed! The sidebar customization is now stored in your user profile, so your personalized layout follows you across all devices you use with Home Assistant!
+
+## Join/unjoin groups of media players
+
+Media players in Home Assistant can provide actions for media players to join or unjoin a group of media players. This is a great way to dynamically control your media players and the groups they are in. However, this feature was somewhat limited, as it could only be used as actions within things like automations or scripts.
+
+Now, [@AlexGustafsson] changed that! 🎉
+
+You can now use the media player card to join or unjoin groups of media players. This is a great way to control your media players and their groups directly from the UI.
+
+
+
+Please note that, you can only join or unjoin groups of media players that support this feature. Unfortunately, not all media players support this, so it might not be available for all your media players.
+
+Anyhow, amazing contribution Alex! 👏
+
+[@AlexGustafsson]: https://github.com/AlexGustafsson
+
+## Reset/restore entity IDs
+
+You can now restore the ID of an entity to its original value. This is useful if you have renamed an entity and want to revert it back to its original entity ID.
+
+This feature is available in the entity configuration dialog, where you can now find a "Reset" icon on the entity ID field. When clicked, it will restore the entity ID to its original value. Additionally, there is the option called "Recreate entity IDs" in the top right three-dotted menu on the device page, to reset all entity IDs of a device to their original values.
+
+
+
+## Patch releases
+
+We will also release patch releases for Home Assistant 2025.6 in June.
+These patch releases only contain bug fixes. Our goal is to release a patch
+release every Friday.
+
+### 2025.6.1 - June 13
+
+- Fix palette handling for LIFX Ceiling SKY effect ([@Djelibeybi] - [#146582])
+- Fix fan is_on status in xiaomi_miio ([@epenet] - [#146592])
+- Drop HostKeyAlgorithms in aruba ([@aethrvmn] - [#146619])
+- Update frontend to 20250531.3 ([@piitaya] - [#146638])
+- Fix cookies with aiohttp >= 3.12.7 for Vodafone Station ([@chemelli74] - [#146647])
+- Bump wakeonlan to 3.1.0 ([@epenet] - [#146655])
+- Bump hdate to 1.1.2 ([@tsvi] - [#146659])
+- Bump linkplay to v0.2.12 ([@silamon] - [#146669])
+- Filter speak notify entity for WHA devices in Alexa Devices ([@chemelli74] - [#146688])
+- Bump aioamazondevices to 3.1.2 ([@chemelli74] - [#146690])
+- Fix opower to work with aiohttp>=3.12.7 by disabling cookie quoting ([@tronikos] - [#146697])
+- Revert scan interval change in local calendar ([@allenporter] - [#146700])
+- Partial revert of update to remote calendar to fix issue where calendar does not update ([@allenporter] - [#146702])
+- Ignore lingering pycares shutdown thread ([@cdce8p] - [#146733])
+- Bump aiodns to 3.5.0 ([@bdraco] - [#146758])
+- Fix throttling issue in HomematicIP Cloud ([@hahn-th] - [#146683])
+
+[#145650]: https://github.com/home-assistant/core/pull/145650
+[#146582]: https://github.com/home-assistant/core/pull/146582
+[#146592]: https://github.com/home-assistant/core/pull/146592
+[#146619]: https://github.com/home-assistant/core/pull/146619
+[#146638]: https://github.com/home-assistant/core/pull/146638
+[#146647]: https://github.com/home-assistant/core/pull/146647
+[#146655]: https://github.com/home-assistant/core/pull/146655
+[#146659]: https://github.com/home-assistant/core/pull/146659
+[#146669]: https://github.com/home-assistant/core/pull/146669
+[#146683]: https://github.com/home-assistant/core/pull/146683
+[#146688]: https://github.com/home-assistant/core/pull/146688
+[#146690]: https://github.com/home-assistant/core/pull/146690
+[#146697]: https://github.com/home-assistant/core/pull/146697
+[#146700]: https://github.com/home-assistant/core/pull/146700
+[#146702]: https://github.com/home-assistant/core/pull/146702
+[#146733]: https://github.com/home-assistant/core/pull/146733
+[#146758]: https://github.com/home-assistant/core/pull/146758
+[@Djelibeybi]: https://github.com/Djelibeybi
+[@aethrvmn]: https://github.com/aethrvmn
+[@allenporter]: https://github.com/allenporter
+[@bdraco]: https://github.com/bdraco
+[@cdce8p]: https://github.com/cdce8p
+[@chemelli74]: https://github.com/chemelli74
+[@epenet]: https://github.com/epenet
+[@frenck]: https://github.com/frenck
+[@hahn-th]: https://github.com/hahn-th
+[@piitaya]: https://github.com/piitaya
+[@silamon]: https://github.com/silamon
+[@tronikos]: https://github.com/tronikos
+[@tsvi]: https://github.com/tsvi
+
+### 2025.6.2 - June 23
+
+- Remove address info from Rachio calendar events ([@brg468] - [#145896])
+- Bump uiprotect to 7.12.0 ([@RaHehl] - [#146337])
+- Bump uiprotect to 7.13.0 ([@RaHehl] - [#146410])
+- Bump reolink-aio to 0.14.0 ([@starkillerOG] - [#146566])
+- Bump pypck to 0.8.7 ([@alengwenus] - [#146657])
+- Update rokuecp to 0.19.5 ([@ctalkington] - [#146788])
+- Use Shelly main device area as suggested area for sub-devices ([@bieniu] - [#146810])
+- Fix blocking open in Minecraft Server ([@elmurato] - [#146820])
+- Bump aioamazondevices to 3.1.3 ([@chemelli74] - [#146828])
+- Bump aiohttp to 3.12.13 ([@bdraco] - [#146830])
+- Bump motion blinds to 0.6.28 ([@starkillerOG] - [#146831])
+- Bump pypck to 0.8.8 ([@alengwenus] - [#146841])
+- Fix missing key for ecosmart in older Wallbox models ([@hesselonline] - [#146847])
+- Bump bthome-ble to 3.13.1 ([@Ernst79] - [#146871])
+- Bump reolink-aio to 0.14.1 ([@starkillerOG] - [#146903])
+- Add debug log for update in onedrive ([@zweckj] - [#146907])
+- Switchbot Cloud: Fix device type filtering in sensor ([@SeraphicRav] - [#146945])
+- Bump pySmartThings to 3.2.5 ([@joostlek] - [#146983])
+- Bump ical to 10.0.4 ([@allenporter] - [#147005])
+- Fix incorrect use of zip in service.async_get_all_descriptions ([@emontnemery] - [#147013])
+- Disable Z-Wave indidator CC entities by default ([@MartinHjelmare] - [#147018])
+- Fix Shelly entity names for gen1 sleeping devices ([@bieniu] - [#147019])
+- Disable Z-Wave idle notification button ([@MartinHjelmare] - [#147026])
+- Fix log in onedrive ([@zweckj] - [#147029])
+- Bump holidays lib to 0.75 ([@gjohansson-ST] - [#147043])
+- Bump aiohomeconnect to 0.18.0 ([@Diegorro98] - [#147044])
+- Bump ZHA to 0.0.60 ([@puddly] - [#147045])
+- Bump pylamarzocco to 2.0.9 ([@zweckj] - [#147046])
+- Handle missing widget in lamarzocco ([@zweckj] - [#147047])
+- Bump aioamazondevices to 3.1.4 ([@chemelli74] - [#146883])
+- Bump aioamazondevices to 3.1.12 ([@chemelli74] - [#147055])
+- Bump uiprotect to version 7.14.0 ([@RaHehl] - [#147102])
+- Improve advanced Z-Wave battery discovery ([@MartinHjelmare] - [#147127])
+- Fix Charge Cable binary sensor in Teslemetry ([@Bre77] - [#147136])
+- [ci] Bump cache key version ([@cdce8p] - [#147148])
+- Bump homematicip to 2.0.6 ([@hahn-th] - [#147151])
+- Wallbox fix too many requests by API ([@hesselonline] - [#147197])
+- Bump deebot-client to 13.4.0 ([@edenhaus] - [#147221])
+- Handle the new JSON payload from traccar clients ([@ludeeus] - [#147254])
+- Bump aioamazondevices to 3.1.14 ([@chemelli74] - [#147257])
+- Bump uiprotect to version 7.14.1 ([@RaHehl] - [#147280])
+- Bump aioesphomeapi to 32.2.4 ([@synesthesiam] - [#147100])
+- Bump aioesphomeapi to 33.0.0 ([@bdraco] - [#147296])
+- Fix reload for Shelly devices with no script support ([@chemelli74] - [#147344])
+- Add Matter protocol to Switchbot ([@joostlek] - [#147356])
+
+[#145650]: https://github.com/home-assistant/core/pull/145650
+[#145896]: https://github.com/home-assistant/core/pull/145896
+[#146337]: https://github.com/home-assistant/core/pull/146337
+[#146410]: https://github.com/home-assistant/core/pull/146410
+[#146566]: https://github.com/home-assistant/core/pull/146566
+[#146657]: https://github.com/home-assistant/core/pull/146657
+[#146764]: https://github.com/home-assistant/core/pull/146764
+[#146788]: https://github.com/home-assistant/core/pull/146788
+[#146810]: https://github.com/home-assistant/core/pull/146810
+[#146820]: https://github.com/home-assistant/core/pull/146820
+[#146828]: https://github.com/home-assistant/core/pull/146828
+[#146830]: https://github.com/home-assistant/core/pull/146830
+[#146831]: https://github.com/home-assistant/core/pull/146831
+[#146841]: https://github.com/home-assistant/core/pull/146841
+[#146847]: https://github.com/home-assistant/core/pull/146847
+[#146871]: https://github.com/home-assistant/core/pull/146871
+[#146883]: https://github.com/home-assistant/core/pull/146883
+[#146903]: https://github.com/home-assistant/core/pull/146903
+[#146907]: https://github.com/home-assistant/core/pull/146907
+[#146945]: https://github.com/home-assistant/core/pull/146945
+[#146983]: https://github.com/home-assistant/core/pull/146983
+[#147005]: https://github.com/home-assistant/core/pull/147005
+[#147013]: https://github.com/home-assistant/core/pull/147013
+[#147018]: https://github.com/home-assistant/core/pull/147018
+[#147019]: https://github.com/home-assistant/core/pull/147019
+[#147026]: https://github.com/home-assistant/core/pull/147026
+[#147029]: https://github.com/home-assistant/core/pull/147029
+[#147043]: https://github.com/home-assistant/core/pull/147043
+[#147044]: https://github.com/home-assistant/core/pull/147044
+[#147045]: https://github.com/home-assistant/core/pull/147045
+[#147046]: https://github.com/home-assistant/core/pull/147046
+[#147047]: https://github.com/home-assistant/core/pull/147047
+[#147055]: https://github.com/home-assistant/core/pull/147055
+[#147100]: https://github.com/home-assistant/core/pull/147100
+[#147102]: https://github.com/home-assistant/core/pull/147102
+[#147127]: https://github.com/home-assistant/core/pull/147127
+[#147136]: https://github.com/home-assistant/core/pull/147136
+[#147148]: https://github.com/home-assistant/core/pull/147148
+[#147151]: https://github.com/home-assistant/core/pull/147151
+[#147197]: https://github.com/home-assistant/core/pull/147197
+[#147221]: https://github.com/home-assistant/core/pull/147221
+[#147254]: https://github.com/home-assistant/core/pull/147254
+[#147257]: https://github.com/home-assistant/core/pull/147257
+[#147280]: https://github.com/home-assistant/core/pull/147280
+[#147296]: https://github.com/home-assistant/core/pull/147296
+[#147344]: https://github.com/home-assistant/core/pull/147344
+[#147356]: https://github.com/home-assistant/core/pull/147356
+[@Bre77]: https://github.com/Bre77
+[@Diegorro98]: https://github.com/Diegorro98
+[@Ernst79]: https://github.com/Ernst79
+[@MartinHjelmare]: https://github.com/MartinHjelmare
+[@RaHehl]: https://github.com/RaHehl
+[@SeraphicRav]: https://github.com/SeraphicRav
+[@alengwenus]: https://github.com/alengwenus
+[@allenporter]: https://github.com/allenporter
+[@bdraco]: https://github.com/bdraco
+[@bieniu]: https://github.com/bieniu
+[@brg468]: https://github.com/brg468
+[@cdce8p]: https://github.com/cdce8p
+[@chemelli74]: https://github.com/chemelli74
+[@ctalkington]: https://github.com/ctalkington
+[@edenhaus]: https://github.com/edenhaus
+[@elmurato]: https://github.com/elmurato
+[@emontnemery]: https://github.com/emontnemery
+[@frenck]: https://github.com/frenck
+[@gjohansson-ST]: https://github.com/gjohansson-ST
+[@hahn-th]: https://github.com/hahn-th
+[@hesselonline]: https://github.com/hesselonline
+[@joostlek]: https://github.com/joostlek
+[@ludeeus]: https://github.com/ludeeus
+[@puddly]: https://github.com/puddly
+[@starkillerOG]: https://github.com/starkillerOG
+[@synesthesiam]: https://github.com/synesthesiam
+[@zweckj]: https://github.com/zweckj
+[alexa_devices docs]: /integrations/alexa_devices/
+[bthome docs]: /integrations/bthome/
+[ecovacs docs]: /integrations/ecovacs/
+[esphome docs]: /integrations/esphome/
+[holiday docs]: /integrations/holiday/
+[home_connect docs]: /integrations/home_connect/
+[homematicip_cloud docs]: /integrations/homematicip_cloud/
+[lamarzocco docs]: /integrations/lamarzocco/
+[lcn docs]: /integrations/lcn/
+[local_calendar docs]: /integrations/local_calendar/
+[local_todo docs]: /integrations/local_todo/
+[minecraft_server docs]: /integrations/minecraft_server/
+[motion_blinds docs]: /integrations/motion_blinds/
+[onedrive docs]: /integrations/onedrive/
+[rachio docs]: /integrations/rachio/
+[remote_calendar docs]: /integrations/remote_calendar/
+[reolink docs]: /integrations/reolink/
+[roku docs]: /integrations/roku/
+[shelly docs]: /integrations/shelly/
+[smartthings docs]: /integrations/smartthings/
+[switchbot_cloud docs]: /integrations/switchbot_cloud/
+[teslemetry docs]: /integrations/teslemetry/
+[traccar docs]: /integrations/traccar/
+[unifiprotect docs]: /integrations/unifiprotect/
+[wallbox docs]: /integrations/wallbox/
+[workday docs]: /integrations/workday/
+[zha docs]: /integrations/zha/
+[zwave_js docs]: /integrations/zwave_js
+
+### 2025.6.3 - June 24
+
+- Update frontend to 20250531.4 ([@bramkragten] - [#147414])
+
+[#147414]: https://github.com/home-assistant/core/pull/147414
+[@bramkragten]: https://github.com/bramkragten
+
+## Need help? Join the community!
+
+Home Assistant has a great community of users who are all more than willing
+to help each other out. So, join us!
+
+Our very active [Discord chat server](/join-chat) is an excellent place to be
+at, and don't forget to join our amazing [forums](https://community.home-assistant.io/).
+
+Found a bug or issue? Please report it in our [issue tracker](https://github.com/home-assistant/core/issues),
+to get it fixed! Or, check [our help page](/help) for guidance for more
+places you can go.
+
+Are you more into email? [Sign-up for our Building the Open Home Newsletter](/newsletter)
+to get the latest news about features, things happening in our community and
+other news about building an Open Home; straight into your inbox.
+
+## Backward-incompatible changes
+
+We do our best to avoid making changes to existing functionality that might
+unexpectedly impact your Home Assistant installation. Unfortunately, sometimes,
+it is inevitable.
+
+We always make sure to document these changes to make the transition as easy as
+possible for you. This release has the following backward-incompatible changes:
+
+{% details "Met Office" %}
+
+Met Office [deprecated the Datapoint API](https://www.metoffice.gov.uk/services/data/datapoint/datapoint-retirement-faqs) used by this integration, causing it to stop working. To address this, it is now migrated to [DataHub API](https://www.metoffice.gov.uk/services/data/met-office-weather-datahub).
+
+To keep using this integration, you will need to provide a new API key, which can be obtained by signing up for [DataHub](https://datahub.metoffice.gov.uk/) and subscribing to [Global spot dataset](https://datahub.metoffice.gov.uk/pricing/site-specific). The free subscription provides 360 calls per day, which is enough for this integration to work.
+
+Some sensors have changed due to the new data source:
+
+- Hourly forecast provided by the weather entity now has actual hourly entries as opposed to 3-hourly in the old version
+- Instead of `visibility` and `visibility_distance` sensors showing a range and qualitative description (such as "1-4 km" and "Poor"), the integration now exposes a single `visibility` sensor with precise visibility distance in meters
+- The integration no longer exposes "daily" and "3-hourly" sensors; there is a single set of them now
+- The integration sensors no longer expose `Site ID`, `Site name` and `Sensor ID` attributes as these don't provide any additional value
+
+([@avee87] - [#131425]) ([documentation](/integrations/metoffice))
+
+[@avee87]: https://github.com/avee87
+[#131425]: https://github.com/home-assistant/core/pull/131425
+
+{% enddetails %}
+
+If you are a custom integration developer and want to learn about changes and
+new features available for your integration: Be sure to follow our
+[developer blog][devblog]. The following changes are the most notable for this release:
+
+- [Icon translations now support ranges](https://developers.home-assistant.io/blog/2025/05/22/range-based-icons/)
+- [Sensor device classes now have default display precision](https://developers.home-assistant.io/blog/2025/05/26/sensor-default-display-precision/)
+
+[devblog]: https://developers.home-assistant.io/blog/
+
+## All changes
+
+Of course, there is a lot more in this release. You can find a list of all changes made here: [Full changelog for Home Assistant Core 2025.6](/changelogs/core-2025.6)
diff --git a/source/_posts/2025-06-24-community-day-2025-wrap-up.markdown b/source/_posts/2025-06-24-community-day-2025-wrap-up.markdown
new file mode 100644
index 00000000000..55e85e97d30
--- /dev/null
+++ b/source/_posts/2025-06-24-community-day-2025-wrap-up.markdown
@@ -0,0 +1,53 @@
+---
+layout: post
+title: "Community Day 2025 Wrap-up"
+description: "We highlight the best moments, what we learned, and how we will keep supporting meetups worldwide."
+date: 2025-06-24 00:00:01
+date_formatted: "June 24, 2025"
+author: Missy Quarry
+comments: true
+categories: Announcements
+og_image: /images/blog/2025-06-community-day-wrap-up/art.jpg
+---
+
+
+
+Our first Home Assistant Community Day was a humbling success --- we knew that the community had a desire to have something coordinated like this, but we really did not expect just how widely this would spread. 💖
+
+So much happened in such a short window of time, so let's talk about how this year's event went and what the future looks like for Home Assistant meetups.
+
+## It started with a question...
+
+Home Assistant Community Day was born from a conversation last year where we asked, "Would the community even *want* this?" We dropped hints here and there to test how y'all would react to a worldwide event, and after weeks of planning, the response to the event announcement was overwhelmingly positive. 🤩
+
+First, **THANK YOU** 🙏🏻 to all **the hosts** for their local coordination, **community members** who showed up, and **the venues** that made all this possible. I learned so much with your help, and it will make next year's Community Day one to remember.
+
+## ...that turned into a movement...
+
+When I announced Home Assistant Community Day, I didn't give hosts a lot to work with. I didn't want the community to think they had to fit into a specific format, and wanted it to be unique to their region. It became clear pretty quickly what information was missing and what people wanted guidance on. For example, some asked for suggestions on what types of venues to book or which activities could make the event more interactive, such as quizzes or presentations. Your questions helped us make it easier for hosts to build cool events, thank you for those!
+
+All around the world, everyone came together to talk about Home Assistant (and its related projects). You swapped hardware, you showed off your automations or dashboards, you participated in quizzes, and you formed new bonds with people in your area who share your passion for Home Assistant. Some people had custom swag printed, others received hardware from a couple of our [Works With Home Assistant](https://works-with.home-assistant.io/) partners, and one group had a Hackathon event the day before! So many great photos were shared from the events that we can't possibly include them all here! You can find plenty more by searching #HADay2025 on social media or by checking the [Discord meetup thread](https://discord.com/channels/330944238910963714/1364989531069091920/1375786903324070042) for this event. It was seriously one of the most uplifting things I've had the pleasure to not only facilitate, but also witness. 🥰
+
+## ...but not without complications
+
+Swag was an unexpected complication. When I first announced the day, we planned to have me order the merch and then send it off to the hosts. This would require collecting addresses and sending packages to people around the world, and we realized quickly that the logistics of that would end up a mess. Instead, we made the sticker designs (along with the Luma calendar invite graphic) publicly available for the hosts to print something locally.
+
+When we did this, we (as the Open Home Foundation) committed to reimbursing the hosts for these swag purchases, along with venue fees or other reasonable expenses they might have on the day. The idea being that no host should be out of pocket for supporting their local Home Assistant community. You support us (by contributing time or by being [Home Assistant Cloud](/cloud/) subscribers), and we want to give back to the community in any way we can.
+
+I'm excited to share that we plan on using those same guidelines for any community meetup, not just the ones that happen on Community Day! 👏🏻 We're building a new community page where all of these details will be available, so stay tuned for more information.
+
+## Some stats for the nerds
+
+We had [82 events](https://lu.ma/haday2025) with over 1,600 registered guests, spanning nearly every corner of the globe. The events started in New Zealand and ended on the West Coast of North America. This meant we had meetups held from 10 pm May 23 to midnight May 25 (UTC time), that's over 26 hours of constant partying! 🥳
+
+We had events in every major region except Australia! Most meetups were in Europe and North America --- probably not too surprising for most. The smallest events had 2 registered guests, and the event that had the largest number of registered guests was Utrecht, with 200!
+
+With an average of 20 people attending a meetup, we know that we can advise a lower capacity limit for future events. This will be included as part of the guidelines we'll have on that new community page I mentioned above.
+
+## Keep the fun going!
+
+Many hosts told me that they've created a new space for the attendees to chat or that they were going to start doing some regular meetups (some have done both!). Since Luma worked so well for us for Community Day, I've created [a general calendar for meetups](https://lu.ma/homeassistant)! I also have [graphic assets](https://drive.google.com/drive/folders/1i7Ta0910ozc66jKqhib5fCrOpYyt9b_J?usp=share_link) publicly available for your Luma event and any social media you'd like to post your event on --- use the 1:1 ratio image for the invite image on Luma. There are two events live there now, way to go Chile (Santiago) and Belgium (Hasselt)! 🤩
+
+While we don't have a solid date for next year's Home Assistant Community Day, I can at least let you know that it will not be in May and instead later in the year. I'm aiming to give you at least a two-month heads-up for when it will be this time. We're planning on doing something bigger and I can't wait to do it all again with y'all next year. 😌
+
+P.S. - Did you spot our [refreshed Creator Network](https://creators.home-assistant.io) page yet? 👀
diff --git a/source/_posts/2025-06-25-voice-chapter-10.markdown b/source/_posts/2025-06-25-voice-chapter-10.markdown
new file mode 100644
index 00000000000..a5e0d4a9cba
--- /dev/null
+++ b/source/_posts/2025-06-25-voice-chapter-10.markdown
@@ -0,0 +1,167 @@
+---
+layout: post
+title: "Next iteration of our Voice Assistant is here - Voice chapter 10"
+description: "This new tool brings fast, local speech processing to low-end hardware, along with some useful new voice and AI features"
+date: 2025-06-25 00:00:01
+date_formatted: "June 25, 2025"
+author: Mike Hansen
+comments: true
+categories: Assist
+og_image: /images/blog/2025-06-voice-chapter-10/art.png
+---
+
+
+
+Welcome to Voice chapter 10 🎉, [a series](/blog/categories/assist/) where we share all the key developments in Open Voice. This chapter includes improvements across every element of Open Voice. Improvements that allow it to support more languages, be used on more hardware, make it easier to contribute to, all while making it faster and more reliable.
+
+## Help steer Open Voice
+
+Before we get going, we just want to say that Voice Chapter 10 isn't just a broadcast; **it's an invitation** ✉️. Our **public Voice project board** lives on GitHub, and it shows what we're fixing, currently building, and what we'll work on next. Every card is open for comments, so please feel free to have a look and participate in the discussion.
+
+👉 **Project board**: [https://github.com/orgs/OHF-Voice/projects/2](https://github.com/orgs/OHF-Voice/projects/2)
+
+## ESPHome gains a voice
+
+When we began designing and building the firmware for our open voice assistant hardware, the [Home Assistant Voice Preview Edition](/voice-pe/), we had several specific features in mind:
+
+1. Run wake words on the device.
+2. Use a fully open-sourced media player platform that can decode music from high-quality sources.
+3. Wake words can be enabled and disabled on the fly; for example, "stop" is only activated when a long-running announcement is playing or when a timer is ringing.
+4. Mix voice assistant announcements on top of reduced volume (a.k.a. "ducked") music.
+
+These features needed to run within ESPHome, the software that powers the device. In the beginning, ESPHome could only do 1 and 2, but not even at the same time!
+
+To include all these features, we initially built them as external components, allowing us to iterate fast (and of course break many things along the way). We always intended to bring these components into ESPHome, and the process of bringing them in is called *upstreaming*. This would allow anyone to easily build a voice assistant that includes all the features of Voice Preview Edition, and that's what we've been working on since its launch last December.
+
+
No device left behind!
+
+ESPHome version 2025.5.0 has all these components included! We didn't just spend this time copying the code over, but we also worked hard to improve it by making it more generalizable, easier to configure, and much faster.
+
+As an example of these speed improvements, the highest CPU load on the Voice Preview Edition happens when music is being mixed with a long announcement. In this situation, it is decoding two different FLAC audio streams while also running three microWakeWord models (a Voice Activity Detector, "Okay Nabu", and "Stop"). With the original December firmware, this used 72% of the CPU 😅. With the new optimizations, which are all now available in ESPHome, the current Voice Preview Edition firmware only uses 35%❗ These improvements even allow the extremely resource-constrained ATOM Echo to support many of these features, including media playback and continuing conversations.
+
+## Make your own Voice Preview Edition
+
+
I'll just pretend I understand all this
+
+Speaking of voice hardware becoming more like Voice Preview Edition, why not use that class-leading hardware as the basis for your own creations? We've now got the KiCad project files, which include the electrical schematic and circuit board layout, along with other helpful documents [available for download on GitHub](https://github.com/NabuCasa/home-assistant-voice-pe). Combined with our open source firmware files, this will allow anyone to build on the work we've done and make the open voice assistant of their dreams. Bigger speaker, built-in presence sensor, a display featuring a smiling Nabu mascot --- the options are nearly endless. Building Voice Preview Edition was always meant to bootstrap an entire ecosystem of voice hardware, and we're already seeing some amazing creations with this open technology.
+
+## Now you're speaking my language
+
+### Speech-to-Phrase gets more fluent
+
+[In case you missed it](/blog/2025/02/13/voice-chapter-9-speech-to-phrase/#voice-for-the-masses), we built our own locally run speech-to-text (STT) tool that can run fast even on hardware-constrained devices. [Speech-to-Phrase](https://github.com/OHF-Voice/speech-to-phrase) works slightly differently from other STT tools, as it only accepts specific predetermined phrases, hence the name. We have been making large strides in making this the best option for local and private voice control in the home.
+
+The sentence format for Speech-to-Phrase is getting an upgrade! Besides making it simpler for community members to contribute, it now allows for more thorough testing to ensure compatibility with existing Home Assistant commands.
+
+We have also begun experimenting with more precise sentence generation, restricting sentences like "set the {light} to red" only to lights that support setting color. Another improvement is making Speech-to-Phrase more careful about combining names and articles in certain languages. For instance, in French, a device or entity that starts with a vowel or an "h" will have an "l" apostrophe at its beginning, such as l'humidificateur or l'entrée. Allowing Speech-to-Phrase to understand this avoids it guessing pronunciations for nonsensical combinations.
+
+Speech-to-Phrase currently supports **six languages**, namely English, French, German, Dutch, Spanish, and Italian. We are now engaging with language leaders to add support for Russian, Czech, Catalan, Greek, Romanian, Portuguese, Polish, Hindi, Basque, Finnish, Mongolian, Slovenian, Swahili, Thai, and Turkish --- this takes our language support to **21 languages** 🥳!
+
+These new models were originally trained by community members from the [Coqui STT](https://github.com/coqui-ai/STT-models) project (which is now defunct, but luckily their work was open source --- *another example of FOSS saving the day*), and we are very grateful for the chance to use them! Performance and accuracy vary heavily by language, and we may need to train our own models based on feedback from our community.
+
+### Piper is growing in volume
+
+[Piper](https://github.com/OHF-Voice/piper1-gpl) is another tool we built for local and private voice in the home, and it quickly turns text into natural-sounding speech. Piper is becoming one of the most comprehensive open source text-to-speech options available and has really been building momentum. Recently, we have added support for new languages and provided additional voices for existing ones, including,
+
+- **Dutch** - Pim and Ronnie - *new voices*
+- **Portuguese (Brazilian)** - Cadu and Jeff - *new voices*
+- **Persian/Farsi** - Reza_ibrahim and Ganji - *new language*
+- **Welsh** - Bu_tts - *new voices*
+- **Swedish** - Lisa - *new voices*
+- **Malayalam** - Arjun and Meera - *new language*
+- **Nepali** - Chitwan - *new voices*
+- **Latvian** - aivar- *new voices*
+- **Slovenian** - artur - *new voices*
+- **Slovak** - lili - *new voices*
+- **English** - Sam (non-binary) and Reza_ibrahim - *new voices*
+
+This brings Piper's supported languages and dialects from 34 to now 39 🙌! This allows a nice majority of the world's population (give or take 3 billion people) the ability to generate speech in their native tongue 😎!
+
+### Scoring language support
+
+
This is the score sheet for just intents... it can get complicated
+
+Home Assistant users, when starting their voice journey, typically ask one question first: "Is my language supported?" Due to how flexible voice assistants in Home Assistant are, this seemingly simple question is quite complicated to answer! At a high level, a voice assistant needs to convert your spoken audio into text (speech-to-text), figure out what you want it to do (intent recognition), and then respond back to you (text-to-speech). Each part of this pipeline can be mixed and matched, and intent recognition can even be augmented with a fallback to a large language model (LLM), which is great at untangling misunderstood words or complex queries.
+
+Considering the whole pipeline, the question "Is my language supported?" becomes "How well does each part support my language?" For Home Assistant Cloud, which uses Microsoft Azure for voice services, we can be confident that all supported languages work well.
+
+Local options like [Whisper](https://github.com/openai/whisper) (speech-to-text) and, to a lesser extent, Piper (text-to-speech), may technically support a language but perform poorly in practice or within the limits of a user's hardware. Whisper, for example, has models with different sizes that require more powerful hardware to run as they get larger. A language like French may work well enough with the largest Whisper model (which requires a GPU), but is unusable on a Raspberry Pi or even an N100-class PC.
+
+Our own Speech-to-Phrase system supports French well and runs well on a Raspberry Pi 4 or [Home Assistant Green](/green/). The trade-off is that only a limited set of pre-defined voice commands are supported, so you can't use an LLM as a fallback (because unexpected commands can't be converted into text for the LLM to process).
+
+Finally, of course, not everyone wants to (or can) be reliant on the cloud, and they need a fully local voice assistant. This means that language support depends as much on the user's preferences as their hardware and the available voice services. For these reasons, we have split out language support into three categories based on specific combinations of services:
+
+- ***Cloud*** - Home Assistant Cloud
+- ***Focused Local*** - Speech-to-Phrase and Piper
+- ***Full Local*** - Whisper and Piper
+
+Each category is given a score from 0 to 3, with 0 meaning it is unsupported and 3 meaning it is fully supported. Users who choose Home Assistant Cloud can look at the Cloud score to determine the level of language support. For users wanting a local voice assistant, they will need to decide between Focused Local (limited commands for low-powered hardware) and Fully Local (open-ended commands for high-powered hardware). Importantly, these scores take into account the availability of voice commands translated by our language leaders. A language's score in every category will be lowered if it has minimal coverage of useful voice commands.
+
+With these language scores, we hope users will be able to make informed decisions when starting on their voice journeys in Home Assistant. They're currently featured in our voice setup wizard in Home Assistant, and on our [language support page](/voice_control/#supported-languages-and-sentences).
+
+## What's in a name
+
+Voice commands in Home Assistant trigger *intents*, which are flexible actions that use names instead of IDs. Intents handle things like turning devices on or off, or adjusting the color of lights. Until now, sentence translations focused on whether a language supported an intent (like turning devices on/off) but didn't clearly show whether the command supported device names, areas names, or both. This can change from language to language, which made gaps hard to spot. We're switching to a new format that highlights these combinations, making it easier for contributors to see what names are supported, which should make for simpler translations.
+
+## Continued conversation updates
+
+Since the last voice chapter, the voice team has worked on making Assist more conversational for LLM-based agents. We started with LLM-based agents because it was simpler to iterate on. If the LLM returns with a question, we will detect that and keep the conversation going, without the need for you to say "Ok Nabu" again.
+
+On top of that, you can now initiate a conversation with a new action called `start_conversation` directly from an automation, or a dashboard. This provides the full spectrum of conversation to LLM-based agents.
+
+Here is a quick demonstration of two features working hand-in-hand:
+
+
+
+## Media Search and Play intent
+
+What's great about Home Assistant and open source is that sometimes the best ideas come from other projects in the community. Early on, many people were interested in driving Music Assistant with voice, but central pieces were missing on Home Assistant, such as the ability to search a media library.
+
+We worked hard on bringing this functionality to the core experience of Home Assistant and created a new intent, the **Search and Play** intent. You can now speak to your voice assistant and ask it to play music in any room in your home.
+
+
+
+The intent can be used by an LLM-based conversation agent, but we also have sentences that work without any LLM magic. You can find the [English sentences here](https://github.com/OHF-Voice/intents/tree/main/sentences/en/HassMediaSearchAndPlay). As it's a new feature, support may vary based on your language, and please be patient while our amazing language leaders make these translations.
+
+## Future work - Assist will have something to say
+
+Talking to your home should feel as natural as chatting with a friend across the kitchen counter. Large-language models (LLMs) already prove how smooth that back-and-forth can be, now we want every Home Assistant installation to enjoy the same experience. We're therefore zeroing in on three key use-cases for the default conversation agent, which include critical confirmations, follow-ups, and custom conversations. Just note these are still at the early stages of development and it may be some time before you see some of these features.
+
+### Critical confirmations
+
+Some actions are too important to execute without a quick double-check. Unlocking the front door, closing shutters, or running a "leaving home" script. We want you to be able to mark those entities as **protected**. Whenever you speak a command that touches one of those entities, Assist will ask for verbal confirmation before acting:
+
+
+ Ok Nabu, unlock the front door
+ Are you sure?
+ Yes
+ Unlocked
+
+
+Because every household is different, we are thinking about managing these confirmations **per entity** and making them fully user-configurable.
+
+### Follow-up on missing parameters
+
+Sometimes Assist grasps what you want, but needs more detail to carry it out. Instead of failing, we want Assist to ask for the missing piece proactively. Here is an example to illustrate.
+
+
+ Ok Nabu, set a timer
+ For how long?
+ 15 minutes
+ Timer started
+
+
+For now, we are still assessing the relevant sentences for that use case. We're implementing follow-ups with timers, though finding more is not currently our top priority. We are, however, open to suggestions.
+
+### Custom conversations
+
+As with any other part of Home Assistant, we want the conversation aspect of Assist to be personalized. Simple voice transactions can already be created with our automation engine using the `conversation` trigger and the `set_conversation_response` action.
+
+We want to bring the same level of customization to conversations, allowing you to create fully local, predefined conversations to be triggered whenever you need them, such as when you enter a room, start your bedtime routine, etc.
+
+We are focusing first on making custom conversations possible, so that you can show us what you are building with this new powerful tool. We will then tackle the critical confirmations use case, and finally, the follow-ups when parameters are missing.
+
+## Let's keep moving Open Voice forward
+
+Only a couple of years ago, voice control was the domain of data-hungry corporations, and basically none of this open technology existed. Now, as a community, we've built all the parts needed to have a highly functional voice assistant, which is completely open and free for anyone to use (or even build on top of).\
+Every chapter, we make steady progress, which is only possible with your support. Whether from those who fund its development by supporting the Open Home Foundation (by subscribing to [Home Assistant Cloud](/cloud/), and buying [official Home Assistant hardware](/voice-pe/)) or those who contribute their time to improving it. As always, we want to support every language possible, and if you don't see your native tongue on our supported list, please consider [contributing to this project](/voice_control/contribute-voice).
diff --git a/source/_posts/2025-06-26-switchbot-joins-works-with-home-assistant.markdown b/source/_posts/2025-06-26-switchbot-joins-works-with-home-assistant.markdown
new file mode 100644
index 00000000000..e958869dd99
--- /dev/null
+++ b/source/_posts/2025-06-26-switchbot-joins-works-with-home-assistant.markdown
@@ -0,0 +1,85 @@
+---
+layout: post
+title: "SwitchBot joins Works with Home Assistant"
+description: "The first air purifiers and cleaning robots join the program, with options for Matter and Bluetooth connectivity."
+date: 2025-06-26 00:00:01
+date_formatted: "June 26, 2025"
+author: Miranda Bishop
+comments: true
+categories: Works-with-Home-Assistant
+og_image: /images/blog/2025-06-switchbot/art.jpg
+---
+
+
+
+Please welcome the latest addition to the [Works with Home Assistant](https://works-with.home-assistant.io/) program, [SwitchBot!](https://www.switch-bot.com/) This year has seen a lot of 'firsts' within the program, and this launch certainly keeps up this trend. Read on to see the first *Air Purifiers* and *Vacuums / Cleaning Robots*! What's more, SwitchBot is bringing this first set of devices into the program with multiple connectivity options. Pick from their [Bluetooth integration](/integrations/switchbot/), Matter via a hub, or standalone Matter devices as well. All this gives you even more choice in how you set up your smart home, while providing the best experience with Home Assistant.
+
+## Making the Switch...Bot
+
+SwitchBot quickly gained traction in the smart home industry with their original finger bots, which sit over non-smart switches and physically press them down on your behalf. Since then, they've expanded to include many other smart home devices like curtain robots, hubs, air purifiers, and cleaning robots. We were excited to see these new products in person at CES earlier this year and meet up with their team.
+
+SwitchBot even got involved with [Community Day](/blog/2025/06/24/community-day-2025-wrap-up/), hosting a meet-up in Shenzhen, China. We love that the 'Works with' partners show that they're passionate about engaging with our community, taking the partnership much further than just a label on a box.
+
+
+
"At SwitchBot, we're committed to empowering users with seamless and intelligent home automation. By collaborating with Home Assistant's passionate, tech-savvy community, we're able to push boundaries and deliver more integrated, intuitive experiences. Together, we aim to expand what's possible, offering users greater flexibility to connect, control, optimize their homes, and to make it simple."
+- Richard Mou - Co-Founder, SwitchBot
+
+
+## Devices
+
+In case you didn't know, Works with Home Assistant differs from other certification programs as products are rigorously tested in-house to ensure they work seamlessly out of the box with Home Assistant. Any company joining also commits to providing long-term support and firmware updates while being a positive force in the Home Assistant community. Works with Home Assistant is operated by the [Open Home Foundation](https://www.openhomefoundation.org/), and the support of [Home Assistant Cloud](/cloud/) subscribers funds this work.
+
+The SwitchBot team have put special focus on integrating specifically for Home Assistant and have been working hard on their [Bluetooth integration](/integrations/switchbot/). Though the community played a central role in the development of the integration, and SwitchBot is very thankful for this work, they took a more active role in its development.
+
+One of the terms of the 'Works with' program is that Bluetooth devices must connect over an integration that is kept up to a certain code quality (we call this our ['Gold tier'](/docs/quality_scale/) on our quality scale). It also must be maintained by the manufacturers themselves, rather than overly relying on community members to do the hard work. This puts the responsibility on the shoulders of the manufacturers to make sure they're responding to bugs and keeping the integration up long term. If you’re interested in SwitchBot’s Bluetooth products but your Home Assistant system doesn’t have built-in Bluetooth, the easiest way to connect them is by using a [Bluetooth Proxy](/integrations/bluetooth/#remote-adapters-bluetooth-proxies).
+
+If you prefer Matter, SwitchBot also has devices that are certified for use with one of their Matter hubs: either the [SwitchBot Hub 2](https://www.switch-bot.com/products/switchbot-hub-2) or the [Hub 3](https://www.switch-bot.com/products/switchbot-hub-3). There are also some that can work via Matter-over-WiFi as standalone devices. We are currently testing even more of SwitchBot’s Matter devices for the program.
+
+**Bluetooth**
+- [SwitchBot Lock Ultra](https://www.switch-bot.com/products/switchbot-lock-ultra)
+- [SwitchBot Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
+- [SwitchBot Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+- [SwitchBot Leak Detector](https://www.switch-bot.com/products/switchbot-water-leak-detector) - also works using Matter via a hub
+- [SwitchBot Meter](https://www.switch-bot.com/products/switchbot-meter) - also works using Matter via a hub
+- [SwitchBot Meter Pro](https://www.switch-bot.com/products/switchbot-meter-pro) - also works using Matter via a hub
+- [SwitchBot Meter Pro CO2](https://www.switch-bot.com/products/switchbot-meter-pro-co2-monitor) - also works using Matter via a hub
+- [SwitchBot Indoor/Outdoor Thermo-Hygrometer](https://www.switch-bot.com/products/switchbot-indoor-outdoor-thermo-hygrometer) - also works using Matter via a hub
+- [SwitchBot Curtain 3](https://www.switch-bot.com/products/switchbot-curtain-3) - also works using Matter via a hub
+- [SwitchBot Contact Sensor](https://www.switch-bot.com/products/contact-sensor) - also works using Matter via a hub
+- [SwitchBot Roller Shade](https://www.switch-bot.com/products/switchbot-roller-shade) - also works using Matter via a hub
+- [SwitchBot Lock Pro](https://www.switch-bot.com/products/switchbot-lock-pro) - also works using Matter via a hub
+
+**Matter-Over-WiFi (standalone, without requiring a hub)**
+- [SwitchBot Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
+- [SwitchBot Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+- [SwitchBot Multitasking Robot K20 + Pro](https://www.switch-bot.com/products/switchbot-multitasking-household-robot-k20-pro)
+
+***Note:*** *Home Assistant Container does not support Matter, and requires Home Assistant OS.*
+
+## A smart home is a clean home
+
+
Eat your heart out Wall-E
+
+SwitchBot's K20 is the first cleaning robot in the Works with Home Assistant program as well as the world's first multi-tasking household robot. This wacky robot can be paired with lots of other items in the range, including the certified air purifiers, to make some really cool Home Assistant use cases. Just imagine, you're making some delicious dinner, but oh no, you've left a pan alone for too long and it starts to smell and burn. You could summon the K20 with an air purifier on top using the Home Assistant Voice Preview Edition. A few moments later, it's found its way to you and gets started on clearing the air in your kitchen. Plus, as these can both work via Matter, there's no need for cloud involvement. Some of the items also come with a table top so this device has some great applications for anyone with limited mobility.
+
+## Bot to the future
+
+These devices are the first certified items, but SwitchBot is working to get many more tested and fully feature-rich with Home Assistant. We're excited to keep expanding this list over time, but if you can't wait (and this work is only possible with the support of our [Home Assistant Cloud](/cloud/) subscribers), you can see the list of the other devices they are working on [here](https://www.switch-bot.com/pages/home-assistant).
+
+## FAQs
+
+***Q: If I have a device that is not listed under 'Works with Home Assistant' does this mean it's not supported?***
+
+A: No! It just means that it hasn't gone through a testing schedule with our team or doesn't fit the requirements of the program. It might work fine and be added to our testing later down the road. Though it might only have limited functions that are being worked on, or use a connectivity type we don't currently test for in the program.
+
+***Q: Ok, so what's the point of the Works with program?***
+
+A: It highlights the devices we know work well with Home Assistant and the brands that make a long-term commitment to keeping support for these devices going. The certification agreement specifies that the devices must have full functionality within Home Assistant, operate locally without the need for cloud, and will continue to do so long-term.
+
+***Q: How were these devices tested?***
+
+A: The Bluetooth devices in this list were tested using a standard Home Assistant Green Hub, the SwitchBot Bluetooth Integration, a USB Bluetooth adapter, and an ESPHome Bluetooth Proxy. The Matter-over-WiFi devices were also tested with Home Assistant Green and our [certified Matter Integration](/integrations/matter/). If you have another hardware setup or integration, that is often not a problem, but we test against these as they are the most effective way for our team to certify within our ecosystem.
+
+***Q: Will you be adding more SwitchBot devices to the program?***
+
+A: Absolutely! SwitchBot has a quickly growing set of product lines that we're working to certify together, subject to the integrations fully covering all the functions.
diff --git a/source/_posts/2025-07-02-release-20257.markdown b/source/_posts/2025-07-02-release-20257.markdown
new file mode 100644
index 00000000000..ee9977a34c8
--- /dev/null
+++ b/source/_posts/2025-07-02-release-20257.markdown
@@ -0,0 +1,471 @@
+---
+layout: post
+title: "2025.7: That's the question"
+description: "Assist can now ask you questions! Enjoy the completely redesigned Area card with flexible layouts, the birth of integration sub-entries, full-screen code editors for better YAML and template editing, an overhauled integration page, and the improved Areas dashboard overview. Of course, tons of quality-of-life improvements!"
+date: 2025-07-02 00:00:00
+date_formatted: "July 2, 2025"
+author: Franck Nijhof
+author_twitter: frenck
+comments: true
+categories:
+ - Release-Notes
+ - Core
+og_image: /images/blog/2025-07/social.png
+---
+
+
+
+Home Assistant 2025.7! 🎉
+
+Whew! It's hot out there! 🌡️ While most of Europe is dealing with a heat wave right now, we're here to cool things down with an exciting July release that's packed with features I'm genuinely excited about.
+
+Before we dive in, if you missed it, we recently published [Voice Chapter 10](/blog/2025/06/25/voice-chapter-10/) where we explored moving beyond reactive voice assistants that only respond when you talk to them. Instead, we envisioned a future where your voice assistant can be conversational and initiate conversations. Speaking of that, this release delivers on that vision in a big way!
+
+I'm absolutely stoked about the new Ask Question action for Assist! 🗣️ This is something that sets Home Assistant apart from every other voice assistant out there. Finally, your voice assistant can take the initiative and ask *you* what your smart home should do. No more waiting for wake words, your assistant can start the conversation when it makes sense. It's the kind of feature that gets me really excited thinking about all the possibilities.
+
+The redesigned Area card is another winner! 🏠 I'll probably be replacing a few tile cards I've been using to navigate to my area dashboards with this new, more flexible version. It integrates beautifully with the Sections dashboard and gives you so many more options for controlling your spaces.
+
+And that's just the beginning! We've got integration sub-entries making integrations even more extensible, full-screen code editors for those lengthy YAML and template edits, and tons of quality-of-life improvements throughout.
+
+Stay cool, and enjoy the release!
+
+../Frenck
+
+
+
+- [Let Assist ask the questions!](#let-assist-ask-the-questions)
+- [Redesigned Area card](#redesigned-area-card)
+- [Improving the Areas dashboard overview](#improving-the-areas-dashboard-overview)
+- [Integration sub-entries](#integration-sub-entries)
+- [Integration page gets an overhaul](#integration-page-gets-an-overhaul)
+- [Integrations](#integrations)
+ - [New integrations](#new-integrations)
+ - [Noteworthy improvements to existing integrations](#noteworthy-improvements-to-existing-integrations)
+ - [Integration quality scale achievements](#integration-quality-scale-achievements)
+ - [Now available to set up from the UI](#now-available-to-set-up-from-the-ui)
+ - [Farewell to the following](#farewell-to-the-following)
+- [Other noteworthy changes](#other-noteworthy-changes)
+- [Full-screen code editors](#full-screen-code-editors)
+- [Improved dashboard creation experience](#improved-dashboard-creation-experience)
+- [Need help? Join the community!](#need-help-join-the-community)
+- [Backward-incompatible changes](#backward-incompatible-changes)
+- [All changes](#all-changes)
+
+## Let Assist ask the questions!
+
+In our latest [roadmap](/blog/2025/05/09/roadmap-2025h1/), we shared our goal to make Assist more conversational. Until now, Assist was mostly transactional, meaning when you would say something, you would get a response or it would perform an action, and that would be the end of it (unless some LLM magic jumped in). With this release, we're taking a big step forward: meet the new Ask Question action.
+
+This lets you build custom conversations from the comfort of our automation engine. Ask a question, handle the answer, and keep the interaction going.
+
+
+
+This action even allows you to define expected answers so that our extremely fast speech engine, Speech-to-Phrase, can train on them. Yes, fully local, custom conversations!
+
+To help you get started, we have provided a blueprint that covers the most common use case --- Asking a closed Yes/No question:
+
+{% my blueprint_import badge blueprint_url="https://www.home-assistant.io/blueprints/blog/2025-07/ask_yes_no_question.yaml" %}
+
+This blueprint allows you to focus on what you want to do if you answer positively or negatively to any question that your voice assistant will ask. The blueprint supports 50 different ways of saying “Yes” and “No” (including phrases like “Make it so” and “Let’s not”). Here it is in action!
+
+
+
+In case you want to dive deeper into conversation building, here is an example on how to ask a question and process the different answers:
+
+{% details "Example YAML automation actions" %}
+
+This example asks the user what kind of music they want to listen to, and then plays the selected genre or artist on a media player.
+
+{% raw %}
+
+```yaml
+actions:
+ - action: assist_satellite.ask_question
+ data:
+ entity_id: assist_satellite.living_room_voice_assistant
+ preannounce: true # optional
+ preannounce_media_id: media-source://... # optional
+ question: "What kind of music do you want to listen to?"
+ answers:
+ - id: genre
+ sentences:
+ - "genre {genre}"
+ - id: artist
+ sentences:
+ - "artist {artist}"
+ response_variable: answer
+ - choose:
+ - conditions: "{{ answer.id == 'genre' }}"
+ sequence:
+ - action: music_assistant.play_media
+ data:
+ media_id: "My {{ answer.slots.genre }} playlist"
+ media_type: playlist
+ target:
+ entity_id: media_player.living_room_speakers
+ - conditions: "{{ answer.id == 'artist' }}"
+ sequence:
+ - action: music_assistant.play_media
+ data:
+ media_id: "{{ answer.slots.artist }}"
+ media_type: artist
+ target:
+ entity_id: media_player.living_room_speakers
+```
+
+{% endraw %}
+
+{% enddetails %}
+
+## Redesigned Area card
+
+Originally introduced a few years ago, the [Area card](/dashboards/area/) offered a way to display an {% term area %} overview within the dashboard. However, it wasn't fully compatible with the [Sections](/dashboards/sections/) dashboard, which limited its practical use in that context.
+
+The card has now been completely redesigned with a look and feel similar to the [Tile card](/dashboards/tile/). It integrates seamlessly into the Sections dashboard thanks to its flexible layouts. You can choose between a compact version that shows only an icon and the area name, or a more detailed view featuring elements like your camera feed and buttons to toggle your lights or fans.
+
+
+
+The control section itself has also been revamped, allowing you to choose which controls to include and rearrange them as you want. As a result of these changes, if you’re currently using the area cards, you’ll need to reconfigure the controls on them.
+
+Additionally, the card now supports controlling [cover](/integrations/cover/) {% term entities %}.
+
+## Improving the Areas dashboard overview
+
+The April release introduced an experimental [Areas dashboard](/dashboards/dashboards/#areas-dashboard), designed to automatically generate a ready-to-use interface based on the configured areas within the home. However, the preview could become cluttered if you had a lot of devices in a room.
+
+This release introduces an all-new overview that leverages the redesigned Area card, making it easy to view and control your main devices by room with a single click. It also acts as a navigation hub, giving you quick access to detailed views of each area.
+
+
+
+## Integration sub-entries
+
+Ever wondered why you had to enter your API keys for every AI agent you created, even though they all used the same key? Or why you had to authenticate for every calendar you added, regardless of the fact that they all shared the same account? Or why you couldn’t add MQTT devices from the UI?
+
+This release solves that with the introduction of integration sub-entries. This allows you to add a sub-entry to an existing {% term integration %} entry. In practice, this means that your {% term integration %} entry has your credentials, and all the sub-entries use these credentials. In the sub-entry, you can then configure what should be done with these credentials, such as fetching a specific calendar, adding three AI agents with different prompts using the same OpenAI account, or in the case of MQTT, configuring devices that are connected to your MQTT broker.
+
+
+
+The following {% term integrations %} now support sub-entries as of this release: [Anthropic], [Google Generative AI], [MQTT], [Ollama], [OpenAI Conversation], and [Telegram Bot].
+
+[Anthropic]: /integrations/anthropic
+[Google Generative AI]: /integrations/google_generative_ai_conversation
+[MQTT]: /integrations/mqtt
+[Ollama]: /integrations/ollama
+[OpenAI Conversation]: /integrations/openai_conversation
+[Telegram Bot]: /integrations/telegram_bot
+
+## Integration page gets an overhaul
+
+The {% term integration %} page got a big overhaul! It now has support for sub-entries, allowing you to easily add a sub-entry to an {% term integration %} entry along with being able to see which devices and services belong to which sub-entry.
+
+But we took the opportunity to do more. Instead of just showing your {% term integration %} entries, it now also shows the devices and services provided by that configuration entry. This makes it much easier to manage your devices and see the relationship between your devices and their {% term integrations %} at a glance.
+
+
+
+## Integrations
+
+Thanks to our community for keeping pace with the new {% term integrations %}
+and improvements to existing ones! You’re all awesome 🥰
+
+### New integrations
+
+We welcome the following new integrations in this release:
+
+- **[Altruist]**, added by [@LoSk-p]
+ Monitor air quality and environmental conditions with the Altruist sensor, providing local data for temperature, humidity, PM2.5/PM10, CO2, noise levels, and more.
+- **[PlayStation Network]**, added by [@JackJPowell]
+ Integrate with the PlayStation Network to track your currently playing games and display game information on your dashboard.
+- **[Tilt Pi]**, added by [@michaelheyman]
+ Monitor your Tilt Pi hydrometer for brewing temperature and specific gravity measurements during your brewing process.
+- **[VegeHub]**, added by [@Thulrus]
+ Monitor and control your garden with the Vegetronix VegeHub, gathering sensor data and controlling irrigation relays for automated plant care.
+
+[@JackJPowell]: https://github.com/JackJPowell
+[@LoSk-p]: https://github.com/LoSk-p
+[@michaelheyman]: https://github.com/michaelheyman
+[@Thulrus]: https://github.com/Thulrus
+[Altruist]: /integrations/altruist
+[PlayStation Network]: /integrations/playstation_network
+[Tilt Pi]: /integrations/tilt_pi
+[VegeHub]: /integrations/vegehub
+
+### Noteworthy improvements to existing integrations
+
+It is not just new {% term integrations %} that have been added; existing
+integrations are also being constantly improved. Here are some of the noteworthy
+changes to existing integrations:
+
+- Love that song? [@marcelveldt] added a button {% term entity %} to [Music Assistant] that lets you add the currently playing item to your favorites with a single click. It works with queues, external sources, and even radio stations!
+- [ESPHome] now supports sub-devices! Thanks to [@bdraco], you can now represent multiple logical devices with a single ESP device in Home Assistant. This is particularly useful for RF bridges, Modbus gateways, and other devices that can control multiple devices. This feature requires the soon-to-be-released ESPHome 2025.7. Awesome addition!
+- [Paperless-ngx] now includes an update {% term entity %} to keep your document management system up to date. Thanks, [@fvgarrel]!
+- Battery management control has been added to [HomeWizard] with [@DCSBL] implementing battery group mode, allowing you to modify the charging and discharging behavior of your HomeWizard batteries!
+- [Reolink] cameras received a ton of love (again) from [@starkillerOG]! New features include IR brightness control, baby cry sensitivity adjustment, privacy mask switches, and full support for both PoE and WiFi floodlights with multiple command ID pushes. Impressive!
+- [@mib1185] added an update {% term entity %} to the [Immich] {% term integration %}. Nice!
+- The [Homee] {% term integration %} expanded significantly! [@Taraman17] added a siren platform for security alerts and support for the HeatIt Thermostat TF056. Nice!
+- Energy monitoring got better in [Adax] with [@parholmdahl] adding energy sensors, so you can track your heating consumption!
+- [@ViViDboarder] made [Ollama] more flexible by adding a config option for controlling the think parameter. More control over your local AI!
+- Samsung refrigerator owners! [@mswilson] added ice bites control and water filter replacement/usage sensors to the [SmartThings] {% term integration %}.
+- [Russound RIO] got a major upgrade from [@noahhusby], adding sub-device support plus new number and switch {% term entities %} for enhanced zone control.
+- [@chemelli74] expanded [Alexa Devices] with sensor platforms and additional binary sensors. Now you can get more data from your Echo devices!
+- [Matter] keeps growing! [@lboue] added dishwasher alarm support and battery storage capabilities. Thanks!
+- YAML fans will appreciate [@frenck] adding unique ID support to [Trend] {% term integration %} configuration.
+- The [LaMetric] Time got an update {% term entity %} as well, thanks [@joostlek]!
+- [Google Generative AI] now defaults to the newer, faster Gemini 2.5 Flash model. A noteworthy performance boost by [@tronikos]!
+- [Google Generative AI] now supports text-to-speech (TTS) with 30 voices and 24 languages. It supports fine-grained control over style and sound, for example, "Say cheerfully: Have a wonderful day!". Thanks [@lanthaler]!
+- [Enphase Envoy] users get detailed DC voltage and current readings from their solar panels thanks to [@Bidski]. This is perfect for monitoring individual panel health and optimizing production!
+- [@zerzhang] brought evaporative humidifier support to [SwitchBot], expanding your climate control options.
+
+[@bdraco]: https://github.com/bdraco
+[@Bidski]: https://github.com/Bidski
+[@chemelli74]: https://github.com/chemelli74
+[@DCSBL]: https://github.com/DCSBL
+[@frenck]: https://github.com/frenck
+[@fvgarrel]: https://github.com/fvgarrel
+[@joostlek]: https://github.com/joostlek
+[@lanthaler]: https://github.com/lanthaler
+[@lboue]: https://github.com/lboue
+[@marcelveldt]: https://github.com/marcelveldt
+[@mib1185]: https://github.com/mib1185
+[@mswilson]: https://github.com/mswilson
+[@noahhusby]: https://github.com/noahhusby
+[@parholmdahl]: https://github.com/parholmdahl
+[@starkillerOG]: https://github.com/starkillerOG
+[@Taraman17]: https://github.com/Taraman17
+[@tronikos]: https://github.com/tronikos
+[@ViViDboarder]: https://github.com/ViViDboarder
+[@zerzhang]: https://github.com/zerzhang
+[Adax]: /integrations/adax
+[Alexa Devices]: /integrations/alexa_devices
+[Enphase Envoy]: /integrations/enphase_envoy
+[ESPHome]: /integrations/esphome
+[Google Generative AI]: /integrations/google_generative_ai_conversation
+[Homee]: /integrations/homee
+[HomeWizard]: /integrations/homewizard
+[Immich]: /integrations/immich
+[LaMetric]: /integrations/lametric
+[Matter]: /integrations/matter
+[Music Assistant]: /integrations/music_assistant
+[Ollama]: /integrations/ollama
+[Paperless-ngx]: /integrations/paperless_ngx
+[Reolink]: /integrations/reolink
+[Russound RIO]: /integrations/russound_rio
+[SmartThings]: /integrations/smartthings
+[SwitchBot]: /integrations/switchbot
+[Trend]: /integrations/trend
+
+### Integration quality scale achievements
+
+One thing we are incredibly proud of in Home Assistant is our
+[integration quality scale]. This scale helps us and our contributors to ensure
+integrations are of high quality, maintainable, and provide the best possible
+user experience.
+
+This release, we celebrate several {% term integrations %} that have improved
+their quality scale:
+
+- **2 integrations reached platinum** 🏆
+ - [Bosch Alarm], thanks to [@sanjay900]
+ - [Home Connect], thanks to [@Diegorro98]
+
+- **1 integration reached gold** 🥇
+ - [ista EcoTrend], thanks to [@tr4nt0r]
+
+- **1 integration reached silver** 🥈
+ - [KNX], thanks to [@farmio]
+
+- **2 integrations reached bronze** 🥉
+ - [Samsung TV], thanks to [@chemelli74]
+ - [Telegram Bot], thanks to [@hanwg]
+
+This is a huge achievement for these integrations and their maintainers. The
+effort and dedication required to reach these quality levels is significant,
+as it involves extensive testing, documentation, error handling, and often
+complete rewrites of parts of the integration.
+
+A big thank you to all the contributors involved! 👏
+
+[integration quality scale]: https://www.home-assistant.io/docs/quality_scale/
+[@chemelli74]: https://github.com/chemelli74
+[@Diegorro98]: https://github.com/Diegorro98
+[@farmio]: https://github.com/farmio
+[@hanwg]: https://github.com/hanwg
+[@sanjay900]: https://github.com/sanjay900
+[@tr4nt0r]: https://github.com/tr4nt0r
+[Bosch Alarm]: /integrations/bosch_alarm
+[Home Connect]: /integrations/home_connect
+[ista EcoTrend]: /integrations/ista_ecotrend
+[KNX]: /integrations/knx
+[Samsung TV]: /integrations/samsungtv
+[Telegram Bot]: /integrations/telegram_bot
+
+### Now available to set up from the UI
+
+While most {% term integrations %} can be set up directly from the Home Assistant
+user interface, some were only available using YAML configuration. We keep moving
+more integrations to the UI, making them more accessible for everyone
+to set up and use.
+
+The following integration is now available via the Home Assistant UI:
+
+- **[Telegram Bot]**, done by [@hanwg]
+
+### Farewell to the following
+
+The following {% term integrations %} are also no longer available as
+of this release:
+
+- **JuiceNet** has been removed as they shut down their API services.
+
+## Other noteworthy changes
+
+There are many more improvements in this release; here are some of the other noteworthy changes:
+
+- [Shopping list] now has a complete intent function that allows you to check off or mark items on your shopping list as completed, making it easier to interact with your shopping lists using voice commands. Thanks, [@Lesekater]!
+- Device and {% term entity %} management got better! [@emontnemery] made it so Home Assistant now restores user customizations when you re-add deleted devices or {% term entities %}. No more losing your carefully crafted names and settings!
+- The [Template] {% term integration %} received a major boost from [@Petro31]! You can now use variables, icons, and pictures across all compatible template platforms, create trigger-based template alarm control panels, locks, vacuum {% term entities %}, and fans. Plus, there's a new `label_description` template method that allows you to dynamically fetch the description you've added to a label from your templates. This is a noteworthy enhancement for better template organization.
+- Camera snapshots just got better! [@edenhaus] added support for taking snapshots via [go2rtc]. There is nothing for you to do on this one, it works out of the box, but it is nice to know snapshots are now faster and take fewer resources from your system.
+- [Object selectors] now support fields and multiple selections, thanks to [@piitaya]. These additions are particularly interesting for {% term integration %} and blueprint developers, as they provide much more flexibility in your UI representations.
+- Wind direction sensors got a visual upgrade with [@edenhaus] adding range icons for the `wind_direction` sensor device class. Different icons are now shown depending on the state of wind direction sensors, which is indeed a nice visual upgrade!
+
+[@Lesekater]: https://github.com/Lesekater
+[@emontnemery]: https://github.com/emontnemery
+[@Petro31]: https://github.com/Petro31
+[@edenhaus]: https://github.com/edenhaus
+[@piitaya]: https://github.com/piitaya
+[Shopping list]: /integrations/shopping_list
+[Template]: /integrations/template
+[go2rtc]: /integrations/go2rtc
+[Object selectors]: /docs/blueprint/selectors/#object-selector
+
+## Full-screen code editors
+
+Working with snippets of YAML or templates in Home Assistant just got a BIG improvement! We've added a new full-screen mode for all code editors throughout the interface.
+
+
+
+Whether you're editing automations, scripts, templates, or any other YAML configuration, you can now expand the code editor to take up your entire screen. This is especially helpful when working with longer configurations or when you need more space to see your code clearly.
+
+Simply click the maximize button in the top-right corner of any code editor to enter full screen mode. Press the button again to return to the normal view.
+
+This makes building a more complex and advanced smart home more comfortable and productive, especially on smaller mobile or tablet screens where every pixel of editing space counts!
+
+## Improved dashboard creation experience
+
+The dialog for adding a new dashboard has been redesigned with a cleaner interface that matches recent redesigns we've seen to other dialogs. This improvement was designed by [@marcinbauer85] and implemented by [@quinnter]. Great teamwork!
+
+
+
+[@marcinbauer85]: https://github.com/marcinbauer85
+[@quinnter]: https://github.com/quinnter
+
+## Need help? Join the community!
+
+Home Assistant has a great community of users who are all more than willing
+to help each other out. So, join us!
+
+Our very active [Discord chat server](/join-chat) is an excellent place to be,
+and don't forget to join our amazing [forums](https://community.home-assistant.io/).
+
+Found a bug or issue? Please report it in our [issue tracker](https://github.com/home-assistant/core/issues)
+to get it fixed! Or check [our help page](/help) for guidance on more
+places you can go.
+
+Are you more into email? [Sign up for the Open Home Foundation Newsletter](/newsletter)
+to get the latest news about features, things happening in our community, and other projects that support the Open Home straight into your inbox.
+
+## Backward-incompatible changes
+
+We do our best to avoid making changes to existing functionality that might unexpectedly impact your Home Assistant installation. Unfortunately, sometimes, it is inevitable.
+
+We always make sure to document these changes to make the transition as easy as
+possible for you. This release has the following backward-incompatible changes:
+
+{% details "Google Calendar" %}
+
+The previously deprecated Google Calendar `add_event` {% term action %} has been removed and replaced by the `create_event` entity-based {% term action %}.
+
+If you use the `add_event` {% term action %} in your automations or scripts, you will need to update them to use the new `create_event` {% term action %} instead.
+
+([@epenet] - [#146432]) ([google docs])
+
+[@epenet]: https://github.com/epenet
+[#146432]: https://github.com/home-assistant/core/pull/146432
+[google docs]: /integrations/google
+
+{% enddetails %}
+
+{% details "Meater" %}
+
+The states of the Meater probe cook state have been changed to
+support translations and make them more consistent with other integrations.
+
+The following states have been changed:
+
+- `Not Started` -> `not_started`
+- `Configured` -> `configured`
+- `Started` -> `started`
+- `Ready For Resting` -> `ready_for_resting`
+- `Resting` -> `resting`
+- `Slightly Underdone` -> `slightly_underdone`
+- `Finished` -> `finished`
+- `Slightly Overdone` -> `slightly_overdone`
+- `OVERCOOK!` -> `overcooked`
+
+If you use these states in your automations or scripts, you will need to update them to use the new state values.
+
+([@joostlek] - [#146958]) ([meater docs])
+
+[@joostlek]: https://github.com/joostlek
+[#146958]: https://github.com/home-assistant/core/pull/146958
+[meater docs]: /integrations/meater
+
+{% enddetails %}
+
+{% details "Miele" %}
+
+The internal representation of states for hob plates has changed. This is a breaking change when these states are used in automations or templates.
+
+No user action is needed if these hob state sensors are used for visual display only.
+
+Please review and update applicable automations and templates according to the following state changes:
+
+- `0` -> `plate_step_0`
+- `1` -> `plate_step_1`
+- ...
+- `18` -> `plate_step_18`
+- `110` -> `plate_step_warm`
+- `117` -> `plate_step_boost`
+- `118` -> `plate_step_boost`
+- `217` -> `plate_step_boost`
+- `220` -> `plate_step_warm`
+
+If you use these states in your automations or scripts, you will need to update them to use the new state values.
+
+([@astrandb] - [#144992]) ([miele docs])
+
+[@astrandb]: https://github.com/astrandb
+[#144992]: https://github.com/home-assistant/core/pull/144992
+[miele docs]: /integrations/miele
+
+{% enddetails %}
+
+{% details "Plex Media Server" %}
+
+The previously deprecated `plex.scan_for_clients` {% term action %} has been removed in favor of the "Scan Clients" `button` {% term entity %}. If you use this {% term action %} in your automations or scripts, you will need to update them to use the new {% term entity %} instead.
+
+([@epenet] - [#146608]) ([plex docs])
+
+[@epenet]: https://github.com/epenet
+[#146608]: https://github.com/home-assistant/core/pull/146608
+[plex docs]: /integrations/plex
+
+{% enddetails %}
+
+If you are a custom integration developer and want to learn about changes and
+new features available for your integration: Be sure to follow our
+[developer blog][devblog].
+
+[devblog]: https://developers.home-assistant.io/blog/
+
+## All changes
+
+Of course, there is a lot more in this release. You can find a list of all changes made here: [Full changelog for Home Assistant Core 2025.7](/changelogs/core-2025.7)
diff --git a/source/_redirects b/source/_redirects
index 7f336c2fc73..3954492584e 100644
--- a/source/_redirects
+++ b/source/_redirects
@@ -127,18 +127,22 @@ layout: null
/components/cover.group /integrations/cover.group
/components/cover.mqtt /integrations/cover.mqtt
/components/cover.mysensors /integrations/mysensors#cover
-/components/cover.template /integrations/cover.template
+/components/cover.template /integrations/template/#cover
+/integrations/cover.template /integrations/template/#cover
/components/device_tracker.mqtt /integrations/device_tracker.mqtt
/components/device_tracker.mysensors /integrations/mysensors#device-tracker
/components/fan.mqtt /integrations/fan.mqtt
-/components/fan.template /integrations/fan.template
+/components/fan.template /integrations/cover.template
+/integrations/fan.template /integrations/template/#fan
/components/light.group /integrations/light.group
/components/light.mqtt /integrations/light.mqtt
/components/light.mysensors /integrations/mysensors#light
/components/light.switch /integrations/light.switch
/components/light.template /integrations/light.template
+/integrations/light.template /integrations/template/#light
/components/lock.mqtt /integrations/lock.mqtt
/components/lock.template /integrations/lock.template
+/integrations/lock.template /integrations/template/#lock
/components/notify.command_line /integrations/notify.command_line
/components/notify.group /integrations/notify.group
/components/notify.mysensors /integrations/mysensors#notify
@@ -152,11 +156,13 @@ layout: null
/components/switch.mysensors /integrations/mysensors#switch
/components/switch.rest /integrations/switch.rest
/components/switch.template /integrations/switch.template
-/components/telegram_bot.broadcast /integrations/telegram_bot
-/components/telegram_bot.polling /integrations/telegram_bot
-/components/telegram_bot.webhooks /integrations/telegram_bot
+/integrations/switch.template /integrations/template/#switch
+/components/telegram_bot.broadcast /integrations/telegram_broadcast
+/components/telegram_bot.polling /integrations/telegram_polling
+/components/telegram_bot.webhooks /integrations/telegram_webhooks
/components/vacuum.mqtt /integrations/vacuum.mqtt
/components/vacuum.template /integrations/vacuum.template
+/integrations/vacuum.template /integrations/template/#vacuum
/integrations/binary_sensor.group /integrations/group
/integrations/binary_sensor.knx /integrations/knx#binary-sensor
/integrations/binary_sensor.modbus /integrations/modbus/#configuring-binary-sensor-entities
@@ -545,6 +551,7 @@ layout: null
/integrations/dlib_face_identify /more-info/removed-integration 301
/integrations/dte_energy_bridge /more-info/removed-integration 301
/integrations/duke_energy /more-info/removed-integration 301
+/integrations/dweet /more-info/removed-integration 301
/integrations/dyson /more-info/removed-integration 301
/integrations/eddystone_temperature /more-info/removed-integration 301
/integrations/edp_redy /more-info/removed-integration 301
@@ -574,6 +581,7 @@ layout: null
/integrations/hydroquebec /more-info/removed-integration 301
/integrations/ialarm_xr /more-info/removed-integration 301
/integrations/iota /more-info/removed-integration 301
+/integrations/juicenet /more-info/removed-integration 301
/integrations/keyboard /more-info/removed-integration 301
/integrations/lirc /more-info/removed-integration 301
/integrations/life360 /more-info/removed-integration 301
diff --git a/source/blueprints/blog/2025-07/ask_yes_no_question.yaml b/source/blueprints/blog/2025-07/ask_yes_no_question.yaml
new file mode 100644
index 00000000000..b3ea73717be
--- /dev/null
+++ b/source/blueprints/blog/2025-07/ask_yes_no_question.yaml
@@ -0,0 +1,257 @@
+blueprint:
+ name: Ask a Yes/No question
+ description: |
+ Ask a simple Yes/No question. Supports 50 different ways of confirming or rejecting the question. Supports retries.
+ domain: script
+ author: JLo
+ homeassistant:
+ min_version: 2025.6.99
+ input:
+ question:
+ name: Question
+ description: The question that will be asked by the voice assistant.
+ selector:
+ text:
+
+ yes_section:
+ name: Confirmation ('Yes', 'Of course', ...)
+ description: Define what should happen if you reply positively to the question asked.
+ icon: mdi:play
+ input:
+ yes_actions:
+ name: Actions
+ description: Actions to perform if you reply positively to the question asked.
+ default: []
+ selector:
+ action:
+ yes_answer:
+ name: Answer
+ description: Answer of the voice assistant if you reply positively to the question asked.
+ default: "Done"
+ selector:
+ text:
+
+ no_section:
+ name: Rejection ('No', 'Negative', ...)
+ description: Define what should happen if you reply negatively to the question asked.
+ icon: mdi:stop
+ input:
+ no_actions:
+ name: Actions
+ description: Actions to perform if you reply negatively to the question asked.
+ default: []
+ selector:
+ action:
+ no_answer:
+ name: Answer
+ description: Answer of the voice assistant if you reply negatively to the question asked.
+ default: "Action cancelled"
+ selector:
+ text:
+
+ other_section:
+ name: Other responses
+ description: Define what should happen if the response is not understood.
+ icon: mdi:help
+ collapsed: true
+ input:
+ other_actions:
+ name: Actions
+ description: Actions to perform if the response is not understood.
+ default: []
+ selector:
+ action:
+ other_answer:
+ name: Answer
+ description: Answer of the voice assistant if the response is not understood.
+ default: "Sorry, I couldn't understand that"
+ selector:
+ text:
+
+ repeat_section:
+ name: Advanced parameters (Retries)
+ description: Define how many times the question should be asked if the answer is not understood.
+ icon: mdi:cog
+ collapsed: true
+ input:
+ number_of_retries:
+ name: Number of retries
+ description: Number of times the question should be re-asked if the answer is not understood.
+ default: 0
+ selector:
+ number:
+ min: 0
+ max: 10
+ mode: slider
+
+fields:
+ voice_assistant:
+ name: Voice assistant
+ description: The voice assistant that will be used for that conversation.
+ required: true
+ selector:
+ entity:
+ multiple: false
+ filter:
+ - domain: assist_satellite
+ preannounce:
+ name: Preannounce
+ description: Play a sound before the question is asked.
+ required: true
+ default: true
+ selector:
+ boolean:
+
+sequence:
+ - variables:
+ number_of_retries: !input number_of_retries
+ - repeat:
+ sequence:
+ - action: assist_satellite.ask_question
+ continue_on_error: true
+ data:
+ question: !input question
+ preannounce: "{{preannounce}}"
+ entity_id: "{{voice_assistant}}"
+ answers:
+ - id: "yes"
+ sentences:
+ - "Yes"
+ - Sure
+ - Absolutely
+ - Go ahead
+ - Please do
+ - Of course
+ - That's fine
+ - Do it
+ - Yep
+ - Yeah
+ - Ok
+ - Okay
+ - Affirmative
+ - I agree
+ - Sounds good
+ - You got it
+ - Definitely
+ - By all means
+ - Why not
+ - Indeed
+ - Confirmed
+ - Let's do it
+ - Certainly
+ - Right
+ - Fine
+ - All good
+ - Make it so
+ - I approve
+ - That's right
+ - I'm okay with that
+ - No problem
+ - Go for it
+ - Sounds fine
+ - I'm on board
+ - Proceed
+ - It's a yes
+ - I'm in
+ - Okay yes
+ - That's a yes
+ - Yeah go ahead
+ - I'm good with that
+ - Positive
+ - Do that
+ - It's okay
+ - Works for me
+ - I'm fine with that
+ - Yep do it
+ - Please go ahead
+ - That's what I want
+ - Exactly
+ - id: "no"
+ sentences:
+ - "No"
+ - Nope
+ - Don't
+ - Please don't
+ - No thank you
+ - I don't think so
+ - Not now
+ - That's a no
+ - I'd rather not
+ - No way
+ - Not really
+ - Cancel that
+ - Negative
+ - Stop
+ - Don't do it
+ - I said no
+ - No need
+ - Never mind
+ - Not necessary
+ - No that's not right
+ - I disagree
+ - Skip it
+ - Don't proceed
+ - I don't want that
+ - Don't go ahead
+ - Leave it
+ - That's incorrect
+ - I prefer not to
+ - No thanks
+ - I'm not okay with that
+ - I'm saying no
+ - Let's not
+ - Not this time
+ - I'm not in
+ - Please don't do that
+ - Don't take action
+ - I'd say no
+ - No action needed
+ - I'm against that
+ - I'd skip it
+ - Rather not
+ - Not today
+ - I'm not sure better not
+ - That's not what I want
+ - That won't be necessary
+ - I don't agree
+ - No that's wrong
+ - Let's skip that
+ - I'm not comfortable with that
+ response_variable: response
+ - choose:
+ - conditions:
+ - condition: template
+ value_template: "{{response.id == 'yes'}}"
+ sequence:
+ - sequence: !input yes_actions
+ - action: assist_satellite.announce
+ metadata: {}
+ data:
+ message: !input yes_answer
+ preannounce: false
+ target:
+ entity_id: "{{voice_assistant}}"
+ - conditions:
+ - condition: template
+ value_template: "{{response.id == 'no'}}"
+ sequence:
+ - sequence: !input no_actions
+ - action: assist_satellite.announce
+ metadata: {}
+ data:
+ message: !input no_answer
+ preannounce: false
+ target:
+ entity_id: "{{voice_assistant}}"
+ default:
+ - sequence: !input other_actions
+ - action: assist_satellite.announce
+ metadata: {}
+ data:
+ message: !input other_answer
+ preannounce: false
+ target:
+ entity_id: "{{voice_assistant}}"
+ until:
+ - condition: template
+ value_template: "{{ (response is defined and response.id in ['yes','no']) or repeat.index > number_of_retries}}"
diff --git a/source/changelogs/core-2025.6.markdown b/source/changelogs/core-2025.6.markdown
new file mode 100644
index 00000000000..41e57012be1
--- /dev/null
+++ b/source/changelogs/core-2025.6.markdown
@@ -0,0 +1,1705 @@
+---
+title: Full changelog for Home Assistant Core 2025.6
+description: Detailed changelog for the Home Assistant Core 2025.6 release
+replace_regex: \s\(\[?[a-z0-9\-\s_]+\]?\)$
+---
+
+These are all the changes included in the Home Assistant Core 2025.6 release.
+
+For a summary in a more readable format:
+[Release notes blog for this release](/blog/2025/06/11/release-20256/).
+
+## All changes
+
+- Bump version to 2025.6.0dev0 ([@frenck] - [#143983])
+- Matter Cooktop fixture ([@lboue] - [#143984])
+- Move huawei_lte sensor icons to icons.json where applicable ([@scop] - [#143999])
+- Remove deprecated action `api_call` from Habitica integration ([@tr4nt0r] - [#143978])
+- Remove unused client param at Home Connect diagnostics ([@Diegorro98] - [#144017])
+- Remove `_attr_should_poll` from Home Connect base entity ([@Diegorro98] - [#144016])
+- Remove default brightness values from Home Connect light entities ([@Diegorro98] - [#144019])
+- Remove translation key for battery level in Home Connect sensor ([@Diegorro98] - [#144020])
+- Use common percentage const at Home Connect ([@Diegorro98] - [#144021])
+- Remove non required Home Connect tests ([@Diegorro98] - [#144024])
+- Set `autouse` to `setup_credentials` Home Connect fixture ([@Diegorro98] - [#144028])
+- Listen for an event just once at Home Connect test ([@Diegorro98] - [#144031])
+- Sort Home Connect test params ([@Diegorro98] - [#144035])
+- Matter Laundry Dryer fixture ([@lboue] - [#144043])
+- Update miele program codes and strings ([@astrandb] - [#144049])
+- Matter Solar power fixture ([@lboue] - [#144058])
+- Remove deprecated binary sensor in Husqvarna Automower ([@Thomas55555] - [#144064])
+- Flag strict typing for miele ([@astrandb] - [#144060])
+- Set Shelly PARALLEL_UPDATES ([@thecode] - [#144070])
+- Move Home Connect entry state assertion at tests ([@Diegorro98] - [#144027])
+- Move SamsungTV test constants to fixture files ([@epenet] - [#144086])
+- Use `is` instead of `==` on check against enum value at Home Connect ([@Diegorro98] - [#144083])
+- Mark exception-translations done in Shelly ([@thecode] - [#144073])
+- Handle missing action exceptions in SamsungTV ([@chemelli74] - [#143630])
+- Avoid working out suggested id in entity_platform when already registered ([@bdraco] - [#144079])
+- Improve handling of missing miele program codes ([@astrandb] - [#144093])
+- Add DHCP discovery to Knocki ([@joostlek] - [#144048])
+- Fix fritz coordinator typing ([@cdce8p] - [#144146])
+- Fix litterrobot entity typing ([@cdce8p] - [#144147])
+- Improve select platform in Husqvarna Automower ([@Thomas55555] - [#144117])
+- Mark Shelly icon-translations as done ([@thecode] - [#144148])
+- Mark Shelly docs-data-update as done ([@thecode] - [#144151])
+- Add DHCP discovery to Home Connect ([@Diegorro98] - [#144095])
+- Improve supported color modes description ([@jbouwh] - [#144144])
+- Make the network device tracking feature optional in AVM Fritz!Tools ([@mib1185] - [#144149])
+- Pass requestor_uuid to bond API calls ([@bdraco] - [#144128])
+- Add support for updating ESPHome deep sleep devices ([@bdraco] - [#144161])
+- Fix spelling of "comma-separated (list)" in `fritzbox_callmonitor` ([@NoRi2909] - [#144191])
+- Fix spelling of "comma-separated" and "IP address" in `cast` ([@NoRi2909] - [#144188])
+- Fix spelling of "comma-separated (list)" in `huawei_lte` ([@NoRi2909] - [#144189])
+- Fix spelling of "comma-separated (list / event name)" in `doorbird` ([@NoRi2909] - [#144190])
+- Add hazard lights binary sensor to Teslemetry ([@Bre77] - [#144166])
+- Add better typing to Teslemetry switch platform ([@Bre77] - [#144168])
+- Improve typing of binary sensors in Teslemetry ([@Bre77] - [#144169])
+- Update models const in Teslemetry ([@Bre77] - [#144175])
+- Rename classes in Teslemetry ([@Bre77] - [#144179])
+- Fix spelling of "comma-separated (network addresses)" in `nmap_tracker` ([@NoRi2909] - [#144197])
+- Add Zimi Cloud Connect Integration ([@mhannon11] - [#129876])
+- Update `denonavr` to `1.1.0` ([@ol-iver] - [#144199])
+- Fix sentence-casing of "Phone number" in `peco` ([@NoRi2909] - [#144208])
+- Make spelling of "Auto-charge" switch consistent in TechnoVE ([@NoRi2909] - [#144206])
+- Remove unnecessary intermediate functions in `entry_data` for ESPHome ([@bdraco] - [#144173])
+- Improve the user-facing strings of `heos` ([@NoRi2909] - [#144218])
+- Fix sentence-casing in user-facing strings of `tami4` ([@NoRi2909] - [#144212])
+- Fix spelling of "sign in" and "setup" in `verisure` ([@NoRi2909] - [#144214])
+- Improve user-facing strings of `blink` ([@NoRi2909] - [#144219])
+- Replace "Sign-in …" with "Sign in …" in `ring` ([@NoRi2909] - [#144222])
+- Replace "log-in" with "log in" in `zwave_me` ([@NoRi2909] - [#144223])
+- Change roborock to use home_data_v3 ([@Lash-L] - [#144238])
+- Increase the local calendar update interval to avoid re-parsing the calendar state unnecessarily ([@allenporter] - [#144234])
+- Add valet switch to Teslemetry ([@Bre77] - [#144167])
+- Set api type more specifically in Teslemetry ([@Bre77] - [#144178])
+- Change some strings to international English in `fronius` ([@NoRi2909] - [#144244])
+- Remove unused huawei_lte YAML schemas, error out on YAML config ([@scop] - [#144217])
+- Add last attempted automatic backup sensor ([@mib1185] - [#144194])
+- Move more SamsungTV test constants to fixture files ([@epenet] - [#144249])
+- Bump nexia to 2.9.0 ([@jrhillery] - [#144153])
+- Bump github/codeql-action from 3.28.16 to 3.28.17 (@dependabot - [#144245])
+- Cleanup invalid CONF_ID from samsungtv tests ([@epenet] - [#144252])
+- Fix hassfest expecting strings file for custom components ([@mj23000] - [#135789])
+- Fix balboa mocks ([@emontnemery] - [#144264])
+- Fix deako mocks ([@emontnemery] - [#144265])
+- Fix imeon_inverter mocks ([@emontnemery] - [#144266])
+- Fix velbus mocks ([@emontnemery] - [#144267])
+- Fix palazzetti mocks ([@emontnemery] - [#144268])
+- Fix fibaro mocks ([@emontnemery] - [#144270])
+- Fix matter mocks ([@emontnemery] - [#144271])
+- Fail tests which JSON serialize mocks ([@emontnemery] - [#144261])
+- Change "recognized" to international English spelling in `hive` ([@NoRi2909] - [#144284])
+- Use international English spelling for "authorization" in `reolink` ([@NoRi2909] - [#144305])
+- Drop alias from local DOMAIN import ([@epenet] - [#144311])
+- Invert DOMAIN alias in telegram ([@epenet] - [#144313])
+- Add MQTT binary_sensor as entity platform on MQTT subentries ([@jbouwh] - [#144142])
+- Use runtime_data in geocaching ([@epenet] - [#144310])
+- Use runtime_data in gdacs ([@epenet] - [#144309])
+- Add async_delete_repair_issue method to CloudClient ([@ludeeus] - [#144302])
+- Allow liter for gas sensor device class ([@Arnie97] - [#141518])
+- Improve type hints in gc100 ([@epenet] - [#144308])
+- Remove ThingTalk server configuration and related websocket command from cloud integration ([@ludeeus] - [#144301])
+- Use runtime_data in geonetnz_quakes ([@epenet] - [#144319])
+- Use runtime_data in geonetnz_volcano ([@epenet] - [#144320])
+- Use runtime_data in gogogate2 ([@epenet] - [#144322])
+- Manage unsupported sources on Samsung TV ([@chemelli74] - [#144221])
+- Remove deprecated freebox reboot service ([@epenet] - [#144303])
+- Use runtime_data in freebox ([@epenet] - [#144326])
+- Drop alias from local const DOMAIN import ([@epenet] - [#144312])
+- Add MQTT button as entity platform on MQTT subentries ([@jbouwh] - [#144204])
+- Use runtime_data in google_assistant ([@epenet] - [#144332])
+- Move service definitions to separate module in guardian ([@epenet] - [#144306])
+- Use runtime_data in google_assistant_sdk ([@epenet] - [#144335])
+- Use config entry title to name SamsungTV entities ([@epenet] - [#144254])
+- Use runtime_data in goodwe ([@epenet] - [#144325])
+- Use runtime_data in guardian ([@epenet] - [#144344])
+- Use runtime_data in google ([@epenet] - [#144331])
+- Bump aioesphomeapi to 30.2.0 ([@bdraco] - [#144348])
+- Use runtime_data in here_travel_time ([@epenet] - [#144340])
+- Use config location for Homelink in Teslemetry ([@Bre77] - [#144171])
+- Bump nexia to 2.10.0 ([@jrhillery] - [#144363])
+- Add switch entity to Zimi integration ([@markhannon] - [#144236])
+- Remove entity name input from Samsung TV config flow ([@epenet] - [#144372])
+- Modify require_admin decorator to take parameters for Unauthorized ([@emontnemery] - [#144346])
+- Use runtime_data in hko ([@epenet] - [#144368])
+- Allow no_subscription repair issue in cloud ([@ludeeus] - [#144380])
+- Cleanup old config flow IMPORT constants in samsungtv tests ([@epenet] - [#144394])
+- Bump hass-nabucasa from 0.96.0 to 0.100.0 ([@ludeeus] - [#144341])
+- Add typing to smartthings climate target_temperature_low ([@wilbiev] - [#143713])
+- Improve SamsungTV ssdp test fixtures ([@epenet] - [#144376])
+- Do not duplicate model and model_id in SamsungTV device info ([@epenet] - [#144402])
+- Add discovery schema for Matter CumulativeEnergyExported ([@lboue] - [#144061])
+- Fix spelling in user-facing strings of `auth` component ([@NoRi2909] - [#144412])
+- Add missing hyphen to "eight-digit HomeKit pairing code" ([@NoRi2909] - [#144416])
+- Fix spelling of "HomeKit" and "Gateway" in `tradfri` ([@NoRi2909] - [#144420])
+- Add missing hyphen to "6-digit … codes" in `opower` ([@NoRi2909] - [#144417])
+- Fix user-facing strings in `totalconnect` ([@NoRi2909] - [#144411])
+- Add sensor for brew start time to lamarzocco ([@zweckj] - [#144423])
+- Fix sentence-casing in user-facing strings of `isy994` ([@NoRi2909] - [#144428])
+- Matter Mounted dimmable load control fixture ([@lboue] - [#144097])
+- Include runner arch in CI cache key ([@cdce8p] - [#144038])
+- Sentence-case "multi-factor authentication" in `sense` ([@NoRi2909] - [#144450])
+- Add missing hyphen to "two-factor authentication" in `nextcloud` ([@NoRi2909] - [#144448])
+- Add missing hyphen to "two-factor authentication" in `august` ([@NoRi2909] - [#144447])
+- Add missing hyphen to "two-factor authentication" in `subaru` ([@NoRi2909] - [#144446])
+- Add test coverage for inkbird IBS-P02B ([@bdraco] - [#144433])
+- Fix sentence-casing and missing hyphen in `electrasmart` ([@NoRi2909] - [#144443])
+- Include channel in Reolink device URL ([@starkillerOG] - [#144456])
+- Small fixes in user-facing strings of `nest` ([@NoRi2909] - [#144444])
+- Set Z-Wave platforms fixture in light tests ([@MartinHjelmare] - [#144473])
+- Set Z-Wave platforms fixture in helpers tests ([@MartinHjelmare] - [#144472])
+- Set Z-Wave platforms fixture in config flow tests ([@MartinHjelmare] - [#144470])
+- Remove RTSPtoWebRTC ([@edenhaus] - [#144328])
+- Fix capitalization and grammar in `simplefin` ([@NoRi2909] - [#144246])
+- Remove deprecated services in SABnzbd ([@joostlek] - [#144405])
+- Add cooktop operating state to SmartThings ([@joostlek] - [#144500])
+- Add hob support to SmartThings ([@joostlek] - [#144493])
+- Add miele devices dynamically ([@astrandb] - [#144216])
+- Add missing hyphen to "single-board computers" in `homekit` ([@NoRi2909] - [#144505])
+- Remove unused OpenWeatherMap const values ([@wittypluck] - [#144510])
+- Show warning message for Z-Wave devices in interview stage ([@MindFreeze] - [#144483])
+- Bump pynina to 0.3.6 ([@DeerMaximum] - [#144494])
+- Improve Husqvarna Automower tests ([@Thomas55555] - [#143113])
+- Cleanup unused CONF_IP_ADDRESS from SamsungTV tests ([@epenet] - [#144379])
+- Use runtime_data in hlk_sw16 ([@epenet] - [#144370])
+- Use runtime_data in hive ([@epenet] - [#144367])
+- Use async_release_notes in ESPHome update entity ([@jesserockz] - [#144440])
+- Jewish calendar entity translations ([@tsvi] - [#144414])
+- Fix voip test RuntimeWarning ([@cdce8p] - [#144519])
+- Update test fixture for Miele dishwasher ([@astrandb] - [#144537])
+- Bump actions/dependency-review-action from 4.6.0 to 4.7.0 (@dependabot - [#144532])
+- Catch and log unexpected backup ciphering errors ([@emontnemery] - [#144531])
+- Add backup tests showing that unknown files are not ciphered ([@emontnemery] - [#144529])
+- Use HassKey in hardware ([@epenet] - [#144337])
+- Add common translation section to Teslemetry ([@Bre77] - [#144361])
+- Move hardware initialisation to package module ([@epenet] - [#144540])
+- Add support to create KNX Cover entities from UI ([@farmio] - [#141944])
+- Bump PySwitchbot to 0.62.0 ([@zerzhang] - [#144527])
+- Matter refrigerator fixture ([@lboue] - [#144491])
+- Update knx-frontend to 2025.4.1.91934 - Enable UI to create KNX Cover entities ([@farmio] - [#141993])
+- Add drying step sensor for Miele tumble dryers ([@astrandb] - [#144515])
+- SMA add re-authentication flow ([@erwindouna] - [#144538])
+- Remove redundant coordinator reference in OpenWeatherMap sensor ([@wittypluck] - [#144548])
+- Add snapshot tests for OpenWeatherMap sensors ([@wittypluck] - [#139657])
+- Remove deprecated camera frontend_stream_type ([@edenhaus] - [#144539])
+- Add exception-translations for switchbot integration ([@zerzhang] - [#143444])
+- Add fan entity to Zimi integration ([@markhannon] - [#144327])
+- Exempt entity categories for Comelit ([@chemelli74] - [#142858])
+- Add left & right temp request entities to Teslemetry ([@Bre77] - [#144364])
+- Add vacuum platform to miele ([@astrandb] - [#143757])
+- Remove deprecated legacy WebRTC provider ([@edenhaus] - [#144547])
+- Remove deprecated async_forward_entry_setup function ([@edenhaus] - [#144560])
+- Remove deprecated core set_time_zone function ([@edenhaus] - [#144559])
+- Add Lux sensor to Airthings Cloud ([@agorecki] - [#141035])
+- Remove deprecated address argument in all lcn services ([@edenhaus] - [#144557])
+- Make all devolo Home Network conflig flow tests end correctly ([@Shutgun] - [#144378])
+- Add Squeezebox service update entities ([@pssc] - [#125764])
+- Deprecate Homee valve sensor ([@Taraman17] - [#139578])
+- Switch to PyEzvizApi ([@RenierM26] - [#135926])
+- Add control bus mode selector to Cambridge Audio ([@ichbinsteffen] - [#139131])
+- Skip check for entry updated by current flow in _async_abort_entries_match ([@alengwenus] - [#141003])
+- Replace custom actions for sleep timer with buttons in bluesound integration ([@LouisChrist] - [#133604])
+- Refactor Bring! integration to poll activity data at a slower interval ([@tr4nt0r] - [#142621])
+- Avoid split of unique id to build OpenWeatherMap sensors ([@wittypluck] - [#144546])
+- Add switch platform to bosch alarm ([@sanjay900] - [#142157])
+- Add status to whois ([@tedvdb] - [#141051])
+- Matter pump fixture ([@lboue] - [#144572])
+- Add water flowing status for YoLink water meter(YS5018). ([@matrixd2] - [#144535])
+- Use device and entity name for OpenWeather map entities ([@wittypluck] - [#144513])
+- Airthings DHCP discovery ([@LaStrada] - [#144280])
+- Add homee fan platform ([@Taraman17] - [#143524])
+- Fix sensor setup during dynamic addition of Miele devices ([@astrandb] - [#144551])
+- Fix sentence-casing in config fields of `aurora_abb_powerone` ([@NoRi2909] - [#144577])
+- Sentence-case names and remove "True/False" in `emulated_roku` setup ([@NoRi2909] - [#144579])
+- SMA add snapshots & tests ([@erwindouna] - [#144555])
+- Use strict typing for ConfigEntry on remove in NUT ([@tdfountain] - [#144588])
+- Add codeowner to Adax ([@LazyTarget] - [#144587])
+- Add switchbot vacuum support ([@zerzhang] - [#144550])
+- Matter Oven fixture ([@lboue] - [#144603])
+- Fix squeezebox test serializing mocks ([@emontnemery] - [#144600])
+- Delete deprecated program switches from Home Connect ([@Diegorro98] - [#144606])
+- Add Codeowner to OpenWeatherMap ([@wittypluck] - [#144605])
+- Fix licenses check for jaraco.itertools ([@cdce8p] - [#144631])
+- Update pylint to 3.3.7 + astroid to 3.3.10 ([@cdce8p] - [#144630])
+- Fix sentence-casing and spelling of "SIA-based" in `sia` ([@NoRi2909] - [#144659])
+- Fix typo in ntfy integration ([@tr4nt0r] - [#144650])
+- Add missing hyphen to "file-based" in `file` ([@NoRi2909] - [#144640])
+- Add missing hyphen to "time-based" in `filter` ([@NoRi2909] - [#144639])
+- Add missing hyphen to "time-based" in `integration` ([@NoRi2909] - [#144638])
+- Add missing hyphen to "time-weighted" in `derivative` ([@NoRi2909] - [#144637])
+- Add missing hyphen to "volume-weighted" in `kraken` ([@NoRi2909] - [#144636])
+- Improve user-facing strings of `plaato` ([@NoRi2909] - [#144633])
+- Fix grammar in description of `unifi.remove_clients` action ([@NoRi2909] - [#144632])
+- Add PARALLEL_UPDATES to Squeezebox ([@peteS-UK] - [#144618])
+- Fix typos in Miele device names to match enum ([@aturri] - [#144609])
+- Remove unused constant from entity_platform tests ([@emontnemery] - [#144601])
+- Add missing hyphens to "condition-based" and "pre-entry" in `bmw_connected_drive` ([@NoRi2909] - [#144685])
+- Take into account coordinator availability for SamsungTV ([@chemelli74] - [#144545])
+- Add missing hyphen to "WebSocket-based" in `mqtt` ([@NoRi2909] - [#144686])
+- Fix missing sentence-casing in `alarmdecoder` ([@NoRi2909] - [#144690])
+- Bump dependency pymiele to 0.5.1 ([@astrandb] - [#144688])
+- Add program phases for Miele washer-dryer ([@astrandb] - [#144664])
+- Override available property in button platform for Squeezebox ([@peteS-UK] - [#144693])
+- Move Assist Pipeline tests to right file ([@balloob] - [#144696])
+- Sort list items alphabetically in Bring integration ([@tr4nt0r] - [#144700])
+- Increase test coverage for ntfy integration ([@tr4nt0r] - [#144701])
+- Rename samsung legacy test fixtures and constants ([@epenet] - [#144715])
+- Improve SamsungTV test coverage ([@epenet] - [#144717])
+- Add target temp sensor to Miele washing machines ([@astrandb] - [#144507])
+- Rename samsung websocket test fixtures and constants ([@epenet] - [#144719])
+- Rename samsung encrypted websocket test fixtures and constants ([@epenet] - [#144726])
+- Refactor frontend user store ([@emontnemery] - [#144723])
+- Remove obsolete tests in SamsungTV ([@epenet] - [#144735])
+- Remove deprecated camera async_handle_web_rtc_offer function ([@edenhaus] - [#144561])
+- Improve user-facing strings of `velbus` ([@NoRi2909] - [#144716])
+- Deduplicate condition schemas ([@emontnemery] - [#144739])
+- Merge websocket test constants in samsungtv tests ([@epenet] - [#144741])
+- Make it possible to subscribe to frontend user store ([@emontnemery] - [#144724])
+- Add missing hyphen to "password-protected" in `Shelly` ([@NoRi2909] - [#144746])
+- Spelling fixes in user-facing strings of `fronius` ([@NoRi2909] - [#144744])
+- Add a test for Assist Pipeline streaming deltas to TTS ([@balloob] - [#144711])
+- Log instead of ValueError for missing cloud translation key ([@ludeeus] - [#144732])
+- Fix outdated help center URL in `plaato` ([@NoRi2909] - [#144748])
+- Improve config flow description in ntfy integration ([@tr4nt0r] - [#144581])
+- Simplify unique config_entry check for LCN ([@alengwenus] - [#135756])
+- Track if TTS entity supports streaming input ([@balloob] - [#144697])
+- Update xknx to 3.8.0 ([@farmio] - [#144753])
+- Allow subscription_expired repair issue in cloud ([@ludeeus] - [#144316])
+- Add MAC connection through DHCP discovery to Home Connect devices ([@Diegorro98] - [#144611])
+- Assert resulting data in devolo Home Network test_form_reauth ([@Shutgun] - [#144760])
+- Rework platform setup tests for devolo Home Network ([@Shutgun] - [#143114])
+- Update pipdeptree to 2.26.1 ([@frenck] - [#144775])
+- Set PARALLEL_UPDATES and update quality_scale for Miele integration ([@astrandb] - [#144770])
+- Bump aiodhcpwatcher to 1.2.0 ([@davidrapan] - [#144769])
+- Move sun conditions to the sun integration ([@emontnemery] - [#144742])
+- Link Shelly device entry with Shelly BT scanner entry ([@bieniu] - [#144626])
+- Add comments to samsungtv config flow tests ([@epenet] - [#144787])
+- Create stream on demand in Teslemetry ([@Bre77] - [#144777])
+- Update debugpy to v1.8.14 ([@frenck] - [#144755])
+- Remove obsolete compatibility code from SamsungTV ([@epenet] - [#144800])
+- Refactor config flow tests to improve result variable usage in Overkiz ([@iMicknl] - [#143374])
+- Add typing to wsdot ([@ucodery] - [#143117])
+- Do not abort on invalid host in SamsungTV user flow ([@epenet] - [#144794])
+- Improve SamsungTV config flow type hints ([@epenet] - [#144820])
+- Bump automower-ble to 0.2.1 ([@alistair23] - [#144817])
+- Update codeowner for switchbot Integration ([@zerzhang] - [#144829])
+- Bump dependency pymiele -> 0.5.2 ([@astrandb] - [#144758])
+- Add device registry snapshots to samsungtv tests ([@epenet] - [#144804])
+- Remove support for condition platforms defining only a CONDITION_SCHEMA ([@emontnemery] - [#144832])
+- Improve user-facing strings of `incomfort` ([@NoRi2909] - [#144844])
+- Add service response support to admin services ([@abmantis] - [#144837])
+- Bump aioesphomeapi to 31.0.0 ([@bdraco] - [#144778])
+- Jewish calendar - Fix Parasha values ([@tsvi] - [#144646])
+- Add config flow data descriptions to Squeezebox ([@peteS-UK] - [#144619])
+- Provide ability to select nexia RoomIQ sensors ([@jrhillery] - [#144278])
+- Adjust handling of SamsungTV misaligned MAC ([@epenet] - [#144810])
+- Make DHCP discovery aware of the network integration ([@davidrapan] - [#144767])
+- Change unknown to unknown_code for missing Miele codes to avoid confusion ([@astrandb] - [#144699])
+- Remove myself as code owner of sun component ([@Swamp-Ig] - [#144854])
+- Fix spelling of "IP address" in `plugwise` ([@NoRi2909] - [#144861])
+- Bump actions/dependency-review-action from 4.7.0 to 4.7.1 (@dependabot - [#144856])
+- Use HassKey in ps4 ([@epenet] - [#144868])
+- Finish cleaning up SamsungTV init tests ([@epenet] - [#144865])
+- Add parallel_updates to new updates platform for Squeezebox ([@peteS-UK] - [#144864])
+- Move ps4 services to separate module ([@epenet] - [#144870])
+- Show Sonos playlists under favorites ([@danielvandenberg95] - [#142357])
+- Bump influxdb-client to 1.48.0 ([@RobBie1221] - [#144845])
+- Add credit balance sensor to Teslemetry ([@Bre77] - [#144365])
+- Drop alias from local DOMAIN import ([@epenet] - [#144867])
+- Introduce recorder.get_statistics service ([@Hypfer] - [#142602])
+- Fix pandora.media_player to not sleep during event loop ([@ucodery] - [#141957])
+- Add plate sensors for Miele hobs ([@astrandb] - [#144400])
+- Add modbus light brightness and color temperature ([@DioSWolF] - [#139703])
+- Add Fronius current and voltage for up to 4 MPP trackers ([@farmio] - [#140120])
+- Add mac address to airgradient devices ([@edenhaus] - [#144876])
+- Add Kostal plenticore Installer login support ([@Schlauer-Hax] - [#133773])
+- Use runtime_data in gree ([@epenet] - [#144880])
+- Fix substitutions in strings.json in Miele integration ([@astrandb] - [#144881])
+- Use entry.async_on_unload in geofency ([@epenet] - [#144882])
+- Use HassKey in greeneye_monitor ([@epenet] - [#144878])
+- Fix pin strings in Teslemetry ([@Bre77] - [#144873])
+- Use entry.async_on_unload in gpslogger ([@epenet] - [#144883])
+- Use runtime_data in gpslogger ([@epenet] - [#144884])
+- Add flow detection to Rachio hose timer ([@brg468] - [#144075])
+- Refactor template optional configuration attributes ([@Petro31] - [#144887])
+- Use snapshot testing for APCUPSD integration ([@yuxincs] - [#130770])
+- Use runtime_data in rachio ([@epenet] - [#144896])
+- Positioning for LCN covers ([@alengwenus] - [#143588])
+- Fix "tunneling" spelling in KNX ([@farmio] - [#144895])
+- Handle unit conversion in lib for niko_home_control ([@VandeurenGlenn] - [#141837])
+- Fix snapshots in APC ([@joostlek] - [#144901])
+- Refactor DeviceAutomationTriggerProtocol ([@emontnemery] - [#144888])
+- Add fan for ventilator ([@LG-ThinQ-Integration] - [#142444])
+- Add support for identify buttons to WMS WebControl pro ([@mback2k] - [#143339])
+- Add buttons to Blue current integration ([@NickKoepr] - [#143964])
+- Add system LED brightness to eheimdigital ([@autinerd] - [#144915])
+- Add binary sensors to bosch_alarm ([@sanjay900] - [#142147])
+- Add sensor for alarm status in bosch_alarm ([@sanjay900] - [#142564])
+- Add media search and play intent ([@balloob] - [#144269])
+- Remove duplicated code in unit conversion util ([@abmantis] - [#144912])
+- Use runtime_data and HassKey in geofency ([@epenet] - [#144886])
+- Use runtime_data in homematicip_cloud ([@epenet] - [#144892])
+- Add another EHS SmartThings fixture ([@joostlek] - [#144920])
+- Translate raised exceptions for Squeezebox ([@peteS-UK] - [#144842])
+- Bump aioesphomeapi to 31.0.1 ([@bdraco] - [#144939])
+- Add modern style configuration for template fan ([@Petro31] - [#144751])
+- Emoncms remove useless var in tests ([@alexandrecuer] - [#144942])
+- Add sensor entity to Zimi integration ([@markhannon] - [#144329])
+- Add modern style template lock ([@Petro31] - [#144756])
+- Add modern configuration for template alarm control panel ([@Petro31] - [#144834])
+- Add reactive energy device class and units ([@Passific] - [#143941])
+- Use runtime_data in iotawatt ([@epenet] - [#144977])
+- Use runtime_data in ipma ([@epenet] - [#144972])
+- Use runtime_data in intellifire ([@epenet] - [#144979])
+- Add template vacuum modern style ([@Petro31] - [#144843])
+- Move iqvia coordinator to separate module ([@epenet] - [#144969])
+- Add water heater support to SmartThings ([@joostlek] - [#144927])
+- Use runtime_data in iqvia ([@epenet] - [#144984])
+- Fix wrong UNIT_CLASS for reactive energy converter ([@Passific] - [#144982])
+- Fix missing mock in hue v2 bridge tests ([@epenet] - [#144947])
+- Use runtime_data in isy994 ([@epenet] - [#144961])
+- Mark Reolink doorbell visitor sensor as always available ([@starkillerOG] - [#145002])
+- Bump codecov/codecov-action from 5.4.2 to 5.4.3 (@dependabot - [#145023])
+- Bump docker/build-push-action from 6.16.0 to 6.17.0 (@dependabot - [#145022])
+- Add DHCP discovery flow to bosch_alarm ([@sanjay900] - [#142250])
+- Initialize select _attr_current_option with None ([@autinerd] - [#145026])
+- Bump plugwise to v1.7.4 ([@bouwew] - [#145021])
+- Bump PySwitchbot to 0.62.2 ([@zerzhang] - [#145018])
+- Add lamp capability to SmartThings ([@joostlek] - [#144918])
+- Cleanup huisbaasje tests ([@epenet] - [#144954])
+- Deprecate DHW switch for SmartThings ([@joostlek] - [#145011])
+- Use generic in iaqualink entity ([@epenet] - [#144989])
+- Set parallel_updates for bosch_alarm ([@sanjay900] - [#145028])
+- Use runtime_data in iaqualink ([@epenet] - [#144988])
+- Update bosch_alarm door switch strings so they are more user friendly ([@sanjay900] - [#144607])
+- Move icloud services to separate module ([@epenet] - [#144980])
+- Use typed config entry in Habitica coordinator ([@epenet] - [#144956])
+- Move huisbaasje coordinator to separate module ([@epenet] - [#144955])
+- Fix non-DHW heat pump in SmartThings ([@joostlek] - [#145008])
+- Fix errors in strings in SmartThings ([@joostlek] - [#145030])
+- Small code optimization for Plugwise ([@bouwew] - [#145037])
+- Add hood fan speed capability to SmartThings ([@joostlek] - [#144919])
+- Use runtime_data in hue ([@epenet] - [#144946])
+- Sync SmartThings EHS fixture ([@joostlek] - [#145042])
+- Update Matter MicrowaveOven fixture ([@lboue] - [#145057])
+- Use runtime_data in hydrawise ([@epenet] - [#144950])
+- Use runtime_data in homeworks ([@epenet] - [#144944])
+- Deprecate SmartThings water heater sensors ([@joostlek] - [#145060])
+- Add additional explanation for Reolink password requirements ([@starkillerOG] - [#145000])
+- OpenAI prompt is optional ([@balloob] - [#145065])
+- Remove address parameter from services.yaml ([@alengwenus] - [#145052])
+- Add number entities for freezer setpoint in SmartThings ([@joostlek] - [#145069])
+- Bump pysuezV2 to 2.0.5 ([@jb101010-2] - [#145047])
+- Bump motionblinds to 0.6.27 ([@starkillerOG] - [#145094])
+- Refactor fan in vesync ([@cdnninja] - [#135744])
+- Ensure that OpenAI tool call deltas have a role ([@balloob] - [#145085])
+- Fix mapping from program_phase to vacuum_activity for Miele integration ([@astrandb] - [#145115])
+- Add Steam closet keep fresh mode to SmartThings ([@joostlek] - [#145107])
+- Add Steam closet auto cycle link to SmartThings ([@joostlek] - [#145111])
+- Add Steam closet sanitize to SmartThings ([@joostlek] - [#145110])
+- Bump cryptography to 45.0.1 and pyopenssl to 25.1.0 ([@bdraco] - [#145121])
+- Set the default upgrade icon for the MQTT device to the default icon for Home Assistant instead of the icon for the MQTT integration ([@XiaoXianNv-boot] - [#144295])
+- OpenAI Conversation split out chat log processing ([@balloob] - [#145129])
+- Bump zcc-helper to 3.5.2 ([@markhannon] - [#144926])
+- Bump google-maps-routing to 0.6.15 ([@bdraco] - [#145130])
+- Fix enum values for program phases by appliance type on Miele appliances ([@aturri] - [#144916])
+- Add Pterodactyl binary sensor tests ([@elmurato] - [#142401])
+- Add has_entity_name attribute to LCN entities ([@alengwenus] - [#145045])
+- Add select platform to eheimdigital ([@autinerd] - [#145031])
+- Add Homee alarm-control-panel platform ([@Taraman17] - [#140041])
+- Add YoLink new device types support 5009 & 5029 ([@matrixd2] - [#144323])
+- Remove deprecated aux heat from elkm1 ([@gjohansson-ST] - [#145148])
+- Add Immich integration ([@mib1185] - [#145125])
+- Update `denonavr` to `1.1.1` ([@ol-iver] - [#145155])
+- Remove deprecated aux heat from Nexia ([@gjohansson-ST] - [#145147])
+- Fix Nanoleaf light state propagation after change from home asisstant ([@tyriis] - [#144291])
+- Add energy/water forecast for Miele integration ([@generically-named] - [#144822])
+- Enable RFDEBUG on RFLink "Enable debug logging" ([@javicalle] - [#138571])
+- Add Kaiser Nienhaus virtual motionblinds integration ([@starkillerOG] - [#145096])
+- Remove deprecated aux heat from econet ([@gjohansson-ST] - [#145149])
+- Bump grpcio to 1.72.0 and protobuf to 6.30.2 ([@bdraco] - [#143633])
+- Sort and simplify DeletedDeviceEntry ([@emontnemery] - [#145171])
+- Cleanup unused string in samsungtv ([@epenet] - [#145174])
+- Jewish calendar: use const in action code ([@tsvi] - [#145007])
+- Bump github/codeql-action from 3.28.17 to 3.28.18 (@dependabot - [#145173])
+- Bump aioesphomeapi to 31.1.0 ([@bdraco] - [#145170])
+- Bump hass-nabucasa from 0.100.0 to 0.101.0 ([@ludeeus] - [#145172])
+- Add ability to mark type hints as compulsory on specific functions ([@epenet] - [#139730])
+- Fix test results parsing error ([@edenhaus] - [#145077])
+- Add athmospheric pressure capability to SmartThings ([@joostlek] - [#145103])
+- Use runtime_data in huisbaasje ([@epenet] - [#144953])
+- Use runtime_data in hvv_departures ([@epenet] - [#144951])
+- Use runtime_data in ialarm ([@epenet] - [#145178])
+- Use runtime_data in icloud ([@epenet] - [#145179])
+- Fix runtime_data in iqvia ([@epenet] - [#145181])
+- Add battery entity for LockV2 in yolink ([@matrixd2] - [#145169])
+- Improve device registry restore tests ([@emontnemery] - [#145186])
+- Mark type hint as compulsory for entity.available property ([@epenet] - [#145189])
+- Mark all _FUNCTION_MATCH as mandatory in pylint plugin ([@epenet] - [#145194])
+- Mark type hint as compulsory for entity.assumed_state property ([@epenet] - [#145187])
+- Remove deprecated aux heat from ephember ([@gjohansson-ST] - [#145152])
+- Minor cleanup for pipeline tts stream test ([@balloob] - [#145146])
+- Revert "Link Shelly device entry with Shelly BT scanner entry (#144626)" ([@bieniu] - [#145177])
+- Move downloader service to separate module ([@epenet] - [#145183])
+- Add lamp capability for hood component in SmartThings ([@joostlek] - [#145036])
+- Add diagnostics platform to Immich integration ([@mib1185] - [#145162])
+- [ci] Skip step if coverage is skipped ([@cdce8p] - [#145202])
+- Bump go2rtc-client to 0.1.3b0 ([@edenhaus] - [#145192])
+- Mark all _CLASS_MATCH as mandatory in pylint plugin ([@epenet] - [#145200])
+- update pyatmo to version 9.2.0 ([@wuede] - [#145203])
+- Fix pylance warning on SnapshotAssertion import ([@chemelli74] - [#145206])
+- Update quality_scale rules status for Comelit ([@chemelli74] - [#143592])
+- Sort and simplify DeletedRegistryEntry ([@emontnemery] - [#145207])
+- Prevent import from syrupy.SnapshotAssertion ([@epenet] - [#145208])
+- Add exception translation for switchbot device initialization ([@zerzhang] - [#144828])
+- Add cover entity to Zimi integration ([@markhannon] - [#144330])
+- Fix typo in Ecovacs get_supported_entities ([@edenhaus] - [#145215])
+- Add missing type hint in zestimate ([@epenet] - [#145218])
+- Add full test coverage for Comelit cover ([@chemelli74] - [#144761])
+- Remove pylance warnings for Comelit tests ([@chemelli74] - [#145199])
+- Add missing type hint in vlc ([@epenet] - [#145223])
+- Improve type hints in rtorrent ([@epenet] - [#145222])
+- Use _attr_native_value in repetier ([@epenet] - [#145219])
+- Use shorthand attributes in yandex transport sensor ([@epenet] - [#145225])
+- Improve entity registry restore test ([@emontnemery] - [#145220])
+- Add device reconfigure to Comelit config flow ([@chemelli74] - [#142866])
+- Finish reconfigure test for Vodafone Station ([@chemelli74] - [#145230])
+- Add trigger_variables to template trigger 'for' field ([@Petro31] - [#136672])
+- Add action exceptions to Comelit integration ([@chemelli74] - [#143581])
+- Split update method in pioneer media player ([@epenet] - [#145212])
+- Fix invalid type hints in netgear switch ([@epenet] - [#145226])
+- Add missing type hint in homematic ([@epenet] - [#145214])
+- Allow TTS streams to generate temporary media source IDs ([@balloob] - [#145080])
+- Add missing type hint in plex ([@epenet] - [#145217])
+- Add support_streaming to ConversationEntity ([@balloob] - [#144998])
+- Fix wording of "Estimated power production" sensors in `forecast_solar` ([@NoRi2909] - [#145201])
+- Jewish Calendar: Implement diagnostics ([@tsvi] - [#145180])
+- TTS to only use stream entity method when streaming request comes in ([@balloob] - [#145167])
+- Add missing Miele tumble dryer program codes ([@astrandb] - [#145236])
+- Jewish calendar - quality scale - fix missing translations ([@tsvi] - [#144410])
+- Jewish calendar: set parallel updates to 0 ([@tsvi] - [#144986])
+- Jewish Calendar - quality scale - use specific config flow ([@tsvi] - [#144408])
+- Only pass serializable data to media player intent ([@balloob] - [#145244])
+- Fix streaming window cover entity in Teslemetry ([@Bre77] - [#145012])
+- Updated code owners for the blue current integration. ([@NickKoepr] - [#144962])
+- Add media_source platform to Immich integration ([@mib1185] - [#145159])
+- Mark entity methods and properties as mandatory in pylint plugin ([@epenet] - [#145210])
+- Add new Probe Plus integration ([@pantherale0] - [#143424])
+- Improve type hints in xiaomi_aqara light turn_on ([@epenet] - [#145257])
+- Use shorthand attributes in raspyrfm ([@epenet] - [#145250])
+- Improve type hints in omnilogic ([@epenet] - [#145259])
+- Sort usb ports in Z-Wave flow so unknown devices are last ([@MindFreeze] - [#145211])
+- Use runtime_data in smarttub ([@epenet] - [#145279])
+- Improve type hints in blebox climate ([@epenet] - [#145282])
+- Use shorthand attributes in yi camera ([@epenet] - [#145276])
+- Bump aiontfy to 0.5.3 ([@tr4nt0r] - [#145263])
+- Use shorthand attributes in tfiac climate ([@epenet] - [#145289])
+- Drop useless unit conversion in smarttub ([@epenet] - [#145287])
+- Use shorthand attributes in melissa climate ([@epenet] - [#145286])
+- Use shorthand attributes in intesishome climate ([@epenet] - [#145285])
+- Use shorthand attributes in push camera ([@epenet] - [#145273])
+- Improve type hints in homematic climate ([@epenet] - [#145283])
+- Use shorthand attributes in touchline climate ([@epenet] - [#145292])
+- Use shorthand attributes in vivotek camera ([@epenet] - [#145275])
+- Use shorthand attributes in venstar climate ([@epenet] - [#145294])
+- Use shorthand attributes in xs1 climate ([@epenet] - [#145298])
+- Improve type hints in xs1 entities ([@epenet] - [#145299])
+- add date and time service to bosch_alarm ([@sanjay900] - [#142243])
+- Refactor set_temperature in venstar climate ([@epenet] - [#145297])
+- Use shorthand attributes in xiaomi_aqara ([@epenet] - [#145253])
+- Use shorthand attributes in rpi_camera camera ([@epenet] - [#145274])
+- Mark button methods and properties as mandatory in pylint plugin ([@epenet] - [#145269])
+- Fix typos in user-facing strings of `zha` ([@NoRi2909] - [#145305])
+- Mark alarm_control_panel methods and properties as mandatory in pylint plugin ([@epenet] - [#145270])
+- Mark calendar methods and properties as mandatory in pylint plugin ([@epenet] - [#145271])
+- Add class init type hint to xiaomi_aqara ([@epenet] - [#145255])
+- Tidy up service call for bosch_alarm ([@sanjay900] - [#145306])
+- Mark turn_on/turn_off/toggle as mandatory in pylint plugin ([@epenet] - [#145249])
+- Fix issues with bosch alarm dhcp discovery ([@sanjay900] - [#145034])
+- Bump teslemetry_stream to 0.7.9 in Teslemetry ([@Bre77] - [#145303])
+- Add Wh/km unit for energy distance ([@frenck] - [#145243])
+- Mark camera methods and properties as mandatory in pylint plugin ([@epenet] - [#145272])
+- Mark climate methods and properties as mandatory in pylint plugin ([@epenet] - [#145280])
+- Make spelling of "setpoint" consistent in `opentherm_gw` ([@NoRi2909] - [#145318])
+- Update binary sensor translations for bosch_alarm ([@sanjay900] - [#145315])
+- Use preferred spelling of "setpoint" in `smartthings` ([@NoRi2909] - [#145319])
+- Remove deprecated aux heat from Climate Entity component ([@gjohansson-ST] - [#145151])
+- Add solar charging options to Wallbox integration ([@jorisdrenth] - [#139286])
+- Create repair issue if not all add-ons or folders were backed up ([@emontnemery] - [#144999])
+- Add Albanian (Shqip) language ([@bramkragten] - [#145324])
+- Suez water: fetch historical data in statistics ([@jb101010-2] - [#131166])
+- Jewish calendar : icon translations ([@tsvi] - [#145329])
+- bump aioimmich to 0.6.0 ([@mib1185] - [#145334])
+- Jewish calendar: move value calculation to entity description (1/3) ([@tsvi] - [#144272])
+- bump aiokem to 0.5.11 ([@PeteRager] - [#145332])
+- Assist Pipeline stream TTS when supported and long response ([@balloob] - [#145264])
+- Add support for videos in Immich media source ([@mib1185] - [#145254])
+- Added support for shared spaces in Synology DSM (Photo Station) ([@lodesmets] - [#144044])
+- Add date sensors to Rehlko ([@PeteRager] - [#145314])
+- Add support for music library folder to Sonos ([@PeteRager] - [#139554])
+- Remove the old ZWave controller from the list of migration targets ([@MindFreeze] - [#145281])
+- Bump xiaomi-ble to 0.39.0 ([@Ernst79] - [#145348])
+- Add sensors to Wallbox ([@jorisdrenth] - [#145247])
+- Bump pyswitchbot to 0.64.1 ([@zerzhang] - [#145360])
+- Minor code deduplication in backup manager ([@emontnemery] - [#145366])
+- Add hub3 support for switchbot integration ([@zerzhang] - [#145371])
+- Update links to user docs: Connect-ZBT-1, Green, Yellow ([@c0ffeeca7] - [#145374])
+- Bump eheimdigital to 1.2.0 ([@autinerd] - [#145372])
+- Add lock ultra and lock lite for switchbot integration ([@zerzhang] - [#145373])
+- Improve comment explaining planned backup store version bump ([@emontnemery] - [#145368])
+- Recommended installation option for Z-Wave ([@MindFreeze] - [#145327])
+- Bump lcn-frontend to 0.2.5 ([@alengwenus] - [#144983])
+- Improve failing backup repair messages ([@emontnemery] - [#145388])
+- Prevent types-*/setuptools/wheel runtime requirements in dependencies ([@epenet] - [#145381])
+- Fix Z-Wave installation type string ([@MartinHjelmare] - [#145390])
+- Improve Z-Wave config flow test fixtures ([@MartinHjelmare] - [#145378])
+- Jewish Calendar: Make exception translatable ([@tsvi] - [#145376])
+- Enable B009 ([@joostlek] - [#144192])
+- Update bluetooth-auto-recovery to 1.5.2 ([@cdce8p] - [#145395])
+- Update inkbird-ble to 0.16.2 ([@cdce8p] - [#145396])
+- Update sensorpro-ble to 0.7.1 ([@cdce8p] - [#145397])
+- Update igloohome-api to 0.1.1 ([@cdce8p] - [#145401])
+- Add SmartThings capability for Washer spin level ([@joostlek] - [#145039])
+- Add power cool and power freeze to SmartThings ([@joostlek] - [#145102])
+- wsdot component adopts wsdot package ([@ucodery] - [#144914])
+- Reword sunset event exception ([@tsvi] - [#145400])
+- ZHA repairs: remove links to obsolete docs ([@c0ffeeca7] - [#145398])
+- Add SmartThings capability for Washer soil level ([@joostlek] - [#145041])
+- Add thermostat fixture to SmartThings ([@joostlek] - [#145407])
+- Update metoffice to use DataHub API ([@avee87] - [#131425])
+- Update exception handling for initialization for Squeezebox ([@peteS-UK] - [#144674])
+- Bump lektricowifi to 0.1 ([@Lektrico] - [#145393])
+- Mark cover methods and properties as mandatory in pylint plugin ([@epenet] - [#145308])
+- Mark fan methods and properties as mandatory in pylint plugin ([@epenet] - [#145311])
+- Mark LLMs that support streaming as such ([@balloob] - [#145405])
+- Mark geo_location methods and properties as mandatory in pylint plugin ([@epenet] - [#145313])
+- Bump habiticalib to v.0.4.0 ([@tr4nt0r] - [#145414])
+- Clean up AbstractTemplateEntity ([@Petro31] - [#145409])
+- Catch blocking version pinning in dependencies early ([@epenet] - [#145364])
+- Add CancelBoost for Matter Water heater ([@lboue] - [#145316])
+- Remove unneeded parenthesis in comparison for Sonos ([@PeteRager] - [#145413])
+- Centralise MockStreamReaderChunked helper ([@mib1185] - [#145404])
+- Add valve position capability to SmartThings ([@joostlek] - [#144923])
+- Add climate entity for heatpump zones in SmartThings ([@joostlek] - [#144991])
+- Add binary_sensor platform to Rehlko ([@PeteRager] - [#145391])
+- Improve type hints in doods ([@epenet] - [#145426])
+- Hotfix for incorrect bracket in messages for Squeezebox ([@peteS-UK] - [#145418])
+- Add new button to the Lektrico integration ([@Lektrico] - [#145420])
+- Improve type hints in microsoft_face_identify ([@epenet] - [#145419])
+- Improve type hints in dlib_face_detect ([@epenet] - [#145422])
+- Improve type hints in dlib_face_identify ([@epenet] - [#145423])
+- Move to explicit exports in test helpers ([@joostlek] - [#145392])
+- Improve Z-Wave config flow test typing ([@MartinHjelmare] - [#145438])
+- Improve type hints in microsoft_face ([@epenet] - [#145417])
+- Catch invalid settings error in geocaching ([@marc7s] - [#139944])
+- Improve type hints in tensorflow ([@epenet] - [#145433])
+- Improve type hints in qrcode ([@epenet] - [#145430])
+- Improve type hints in openalpr_cloud ([@epenet] - [#145429])
+- Improve type hints in seven_segments ([@epenet] - [#145431])
+- Add range support to icon translations ([@frenck] - [#145340])
+- Improve type hints in sighthound ([@epenet] - [#145432])
+- switchbot_cloud: Add Smart Lock door and calibration state ([@mrueg] - [#143695])
+- Improve type hints in microsoft_face_detect ([@epenet] - [#145421])
+- Add paperless integration ([@fvgarrel] - [#145239])
+- Quantum Gateway device tracker tests ([@tamwahba] - [#145161])
+- Add webhook in switchbot cloud integration ([@Gigatrappeur] - [#132882])
+- Mark image_processing methods and properties as mandatory in pylint plugin ([@epenet] - [#145435])
+- Add Matter test to select attribute ([@joostlek] - [#145440])
+- Add matter attributes ([@jvmahon] - [#140843])
+- Matter Device Energy Management cluster ESAState attribute ([@lboue] - [#144430])
+- Don't add dynamically Home Connect event sensors and disable them by default ([@Diegorro98] - [#144757])
+- Add SMLIGHT button entities for second radio ([@tl-sl] - [#141463])
+- HomeKit Bridge integration: Adding `h264_qsv` as valid VIDEO_CODEC option ([@dalanmiller] - [#145448])
+- Add AbstractTemplateFan class in preparation for trigger based entity ([@Petro31] - [#144968])
+- Add AbstractTemplateLock to prepare for trigger based template locks ([@Petro31] - [#144978])
+- Add AbstractTemplate cover to prepare for trigger based template covers ([@Petro31] - [#144907])
+- Add AbstractTempleAlarmControlPanel class to prepare for trigger based template alarm control panels ([@Petro31] - [#144974])
+- Add AbstractTemplateVacuum to prepare for trigger based template vacuums ([@Petro31] - [#144990])
+- Add HomeKit thermostat fan state mapping for preheating, defrosting ([@jz-v] - [#145353])
+- Mark device_tracker methods and properties as mandatory in pylint plugin ([@epenet] - [#145309])
+- Add configuration url to Immich device info ([@mib1185] - [#145456])
+- Fix typo in reauth_confirm description of `metoffice` ([@NoRi2909] - [#145458])
+- Add default sensor data for Tesla Wall Connector tests ([@abmantis] - [#145462])
+- Replace empty mock in GoalZero tests ([@abmantis] - [#145463])
+- Make Powerwall energy sensors TOTAL_INCREASING to fix hardware swaps ([@exciton] - [#145165])
+- Add pending damage and pending quest items sensors ([@tr4nt0r] - [#145449])
+- Add pytest/codecov to forbidden runtime dependencies ([@epenet] - [#145447])
+- Prefer to create backups in local storage if selected ([@emontnemery] - [#145331])
+- Add paperless-ngx to strict typing ([@joostlek] - [#145466])
+- Add diagnostics to Paperless-ngx ([@joostlek] - [#145465])
+- Add support for Tuya Wireless Switch entity ([@lanthaler] - [#123284])
+- Improve mqtt subentry selector validation and remove redundant validators ([@jbouwh] - [#145499])
+- Add MQTT cover as entity platform on MQTT subentries ([@jbouwh] - [#144381])
+- Bump aiohttp to 3.12.0b3 ([@bdraco] - [#145358])
+- Bump Anthropic library to 0.52.0 ([@Shulyaka] - [#145494])
+- Improve type hints in xiaomi_miio humidifier ([@epenet] - [#145506])
+- Add concentration conversion support for mg/m³ ([@frenck] - [#145325])
+- Mark light methods and properties as mandatory in pylint plugin ([@epenet] - [#145510])
+- Don't manipulate hvac modes based on device active mode in AVM Fritz!SmartHome ([@mib1185] - [#145513])
+- Mark humidifier methods and properties as mandatory in pylint plugin ([@epenet] - [#145507])
+- Add Anthropic Claude 4 support ([@Shulyaka] - [#145505])
+- Add trigger based template cover ([@Petro31] - [#145455])
+- Add automatic backup event entity to Home Assistant Backup system ([@mib1185] - [#145350])
+- Use runtime_data in xiaomi_miio ([@epenet] - [#145517])
+- Support readonly selectors in config_flows ([@karwosts] - [#129456])
+- Bump py-sucks to 0.9.11 ([@mib1185] - [#145518])
+- Add Matter Pump device type ([@lboue] - [#145335])
+- Add MQTT fan as entity platform on MQTT subentries ([@jbouwh] - [#144698])
+- Remove repoze.lru from license exceptions ([@epenet] - [#145519])
+- Add read_only selectors to Statistics Options Flow ([@karwosts] - [#145522])
+- Use _handle_coordinator_update() instead of own callback in Feedreader event entity ([@mib1185] - [#145520])
+- Remove inactive codeowner from template integration ([@Petro31] - [#145535])
+- Bump aiohttp to 3.12.0rc0 ([@bdraco] - [#145540])
+- Bump incomfort-client to v0.6.9 ([@jbouwh] - [#145546])
+- Simplify ZBT-1 setup string ([@abmantis] - [#145532])
+- Bump androidtvremote2 to 0.2.2 ([@tronikos] - [#145542])
+- Add data descriptions in the Android TV Remote Configure Android apps ([@tronikos] - [#145537])
+- Fix translation strings for MQTT subentries ([@jbouwh] - [#145529])
+- Bump python-linkplay to v0.2.8 ([@silamon] - [#145550])
+- Bump aiohttp to 3.12.0rc1 ([@bdraco] - [#145562])
+- Add preset mode to Comelit climate ([@chemelli74] - [#145195])
+- Bump pylamarzocco to 2.0.5 ([@zweckj] - [#145560])
+- Bump aiokem to 0.5.12 ([@PeteRager] - [#145565])
+- Bump aiohttp to 3.12.0 ([@bdraco] - [#145570])
+- Remove global registry reference in coordinator for UptimeRobot ([@chemelli74] - [#142938])
+- Bump opower to 0.12.2 ([@tronikos] - [#145573])
+- Add SmartThings freezer and cooler temperatures ([@joostlek] - [#145468])
+- Safe get for backflush status in lamarzocco ([@zweckj] - [#145559])
+- Add reauth and reconfigure to paperless ([@fvgarrel] - [#145469])
+- Fix aiohttp MockPayloadWriter ([@cdce8p] - [#145579])
+- Add `returned energy` sensor for Shelly RPC switch component ([@bieniu] - [#145490])
+- New integration Amazon Devices ([@chemelli74] - [#144422])
+- Add DHCP discovery to Amazon Devices ([@joostlek] - [#145587])
+- Change cooler name to fridge in SmartThings ([@joostlek] - [#145590])
+- Bump uiprotect to version 7.9.2 ([@RaHehl] - [#145583])
+- Pipeline to stream TTS on tool call ([@balloob] - [#145477])
+- Bump uiprotect to version 7.10.0 ([@RaHehl] - [#145596])
+- Bump pylamarzocco to 2.0.6 ([@zweckj] - [#145595])
+- Enable message Streaming in the Gemini integration. ([@IvanLH] - [#144937])
+- Bump ZHA to 0.0.59 ([@TheJulianJES] - [#145597])
+- Add issue trackers to requirements script exceptions ([@epenet] - [#145608])
+- Use sub-devices for Shelly multi-channel devices ([@bieniu] - [#144100])
+- Add more mac-addresses for Amazon Devices autodiscovery ([@chemelli74] - [#145598])
+- Improve Bluetooth binary_sensor for Amazon Devices ([@chemelli74] - [#145600])
+- Add payload ON and OFF options to MQTT switch subentry component ([@jbouwh] - [#144627])
+- Disable last cleaning sensor for gs3mp model in lamarzocco ([@zweckj] - [#145576])
+- Fix reference to "tilt command topic" in MQTT translation strings ([@jbouwh] - [#145563])
+- Bump aiolifx to 1.1.5 to improve the identification of LIFX Luna ([@Djelibeybi] - [#145416])
+- Mark Shelly quality as silver ([@bieniu] - [#145610])
+- Fulfilled quality rules - gold and platinum tiers for Miele integration ([@astrandb] - [#144773])
+- Add from_hex filter ([@Petro31] - [#145229])
+- Improve type hints in XiaomiGatewayDevice derived entities ([@epenet] - [#145605])
+- Allow base64_encode to support bytes and strings ([@Petro31] - [#145227])
+- Download backup if restore fails in Z-Wave migration ([@MindFreeze] - [#145434])
+- Add Homee event platform ([@Taraman17] - [#145569])
+- Empty response returns empty list in Nord Pool ([@gjohansson-ST] - [#145514])
+
+## Release 2025.6.1 - June 13
+
+- Fix palette handling for LIFX Ceiling SKY effect ([@Djelibeybi] - [#146582])
+- Fix fan is_on status in xiaomi_miio ([@epenet] - [#146592])
+- Drop HostKeyAlgorithms in aruba ([@aethrvmn] - [#146619])
+- Update frontend to 20250531.3 ([@piitaya] - [#146638])
+- Fix cookies with aiohttp >= 3.12.7 for Vodafone Station ([@chemelli74] - [#146647])
+- Bump wakeonlan to 3.1.0 ([@epenet] - [#146655])
+- Bump hdate to 1.1.2 ([@tsvi] - [#146659])
+- Bump linkplay to v0.2.12 ([@silamon] - [#146669])
+- Filter speak notify entity for WHA devices in Alexa Devices ([@chemelli74] - [#146688])
+- Bump aioamazondevices to 3.1.2 ([@chemelli74] - [#146690])
+- Fix opower to work with aiohttp>=3.12.7 by disabling cookie quoting ([@tronikos] - [#146697])
+- Revert scan interval change in local calendar ([@allenporter] - [#146700])
+- Partial revert of update to remote calendar to fix issue where calendar does not update ([@allenporter] - [#146702])
+- Ignore lingering pycares shutdown thread ([@cdce8p] - [#146733])
+- Bump aiodns to 3.5.0 ([@bdraco] - [#146758])
+- Fix throttling issue in HomematicIP Cloud ([@hahn-th] - [#146683])
+
+[#145650]: https://github.com/home-assistant/core/pull/145650
+[#146582]: https://github.com/home-assistant/core/pull/146582
+[#146592]: https://github.com/home-assistant/core/pull/146592
+[#146619]: https://github.com/home-assistant/core/pull/146619
+[#146638]: https://github.com/home-assistant/core/pull/146638
+[#146647]: https://github.com/home-assistant/core/pull/146647
+[#146655]: https://github.com/home-assistant/core/pull/146655
+[#146659]: https://github.com/home-assistant/core/pull/146659
+[#146669]: https://github.com/home-assistant/core/pull/146669
+[#146683]: https://github.com/home-assistant/core/pull/146683
+[#146688]: https://github.com/home-assistant/core/pull/146688
+[#146690]: https://github.com/home-assistant/core/pull/146690
+[#146697]: https://github.com/home-assistant/core/pull/146697
+[#146700]: https://github.com/home-assistant/core/pull/146700
+[#146702]: https://github.com/home-assistant/core/pull/146702
+[#146733]: https://github.com/home-assistant/core/pull/146733
+[#146758]: https://github.com/home-assistant/core/pull/146758
+[@Djelibeybi]: https://github.com/Djelibeybi
+[@aethrvmn]: https://github.com/aethrvmn
+[@allenporter]: https://github.com/allenporter
+[@bdraco]: https://github.com/bdraco
+[@cdce8p]: https://github.com/cdce8p
+[@chemelli74]: https://github.com/chemelli74
+[@epenet]: https://github.com/epenet
+[@frenck]: https://github.com/frenck
+[@hahn-th]: https://github.com/hahn-th
+[@piitaya]: https://github.com/piitaya
+[@silamon]: https://github.com/silamon
+[@tronikos]: https://github.com/tronikos
+[@tsvi]: https://github.com/tsvi
+
+## Release 2025.6.2 - June 23
+
+- Remove address info from Rachio calendar events ([@brg468] - [#145896])
+- Bump uiprotect to 7.12.0 ([@RaHehl] - [#146337])
+- Bump uiprotect to 7.13.0 ([@RaHehl] - [#146410])
+- Bump reolink-aio to 0.14.0 ([@starkillerOG] - [#146566])
+- Bump pypck to 0.8.7 ([@alengwenus] - [#146657])
+- Update rokuecp to 0.19.5 ([@ctalkington] - [#146788])
+- Use Shelly main device area as suggested area for sub-devices ([@bieniu] - [#146810])
+- Fix blocking open in Minecraft Server ([@elmurato] - [#146820])
+- Bump aioamazondevices to 3.1.3 ([@chemelli74] - [#146828])
+- Bump aiohttp to 3.12.13 ([@bdraco] - [#146830])
+- Bump motion blinds to 0.6.28 ([@starkillerOG] - [#146831])
+- Bump pypck to 0.8.8 ([@alengwenus] - [#146841])
+- Fix missing key for ecosmart in older Wallbox models ([@hesselonline] - [#146847])
+- Bump bthome-ble to 3.13.1 ([@Ernst79] - [#146871])
+- Bump reolink-aio to 0.14.1 ([@starkillerOG] - [#146903])
+- Add debug log for update in onedrive ([@zweckj] - [#146907])
+- Switchbot Cloud: Fix device type filtering in sensor ([@SeraphicRav] - [#146945])
+- Bump pySmartThings to 3.2.5 ([@joostlek] - [#146983])
+- Bump ical to 10.0.4 ([@allenporter] - [#147005])
+- Fix incorrect use of zip in service.async_get_all_descriptions ([@emontnemery] - [#147013])
+- Disable Z-Wave indidator CC entities by default ([@MartinHjelmare] - [#147018])
+- Fix Shelly entity names for gen1 sleeping devices ([@bieniu] - [#147019])
+- Disable Z-Wave idle notification button ([@MartinHjelmare] - [#147026])
+- Fix log in onedrive ([@zweckj] - [#147029])
+- Bump holidays lib to 0.75 ([@gjohansson-ST] - [#147043])
+- Bump aiohomeconnect to 0.18.0 ([@Diegorro98] - [#147044])
+- Bump ZHA to 0.0.60 ([@puddly] - [#147045])
+- Bump pylamarzocco to 2.0.9 ([@zweckj] - [#147046])
+- Handle missing widget in lamarzocco ([@zweckj] - [#147047])
+- Bump aioamazondevices to 3.1.4 ([@chemelli74] - [#146883])
+- Bump aioamazondevices to 3.1.12 ([@chemelli74] - [#147055])
+- Bump uiprotect to version 7.14.0 ([@RaHehl] - [#147102])
+- Improve advanced Z-Wave battery discovery ([@MartinHjelmare] - [#147127])
+- Fix Charge Cable binary sensor in Teslemetry ([@Bre77] - [#147136])
+- [ci] Bump cache key version ([@cdce8p] - [#147148])
+- Bump homematicip to 2.0.6 ([@hahn-th] - [#147151])
+- Wallbox fix too many requests by API ([@hesselonline] - [#147197])
+- Bump deebot-client to 13.4.0 ([@edenhaus] - [#147221])
+- Handle the new JSON payload from traccar clients ([@ludeeus] - [#147254])
+- Bump aioamazondevices to 3.1.14 ([@chemelli74] - [#147257])
+- Bump uiprotect to version 7.14.1 ([@RaHehl] - [#147280])
+- Bump aioesphomeapi to 32.2.4 ([@synesthesiam] - [#147100])
+- Bump aioesphomeapi to 33.0.0 ([@bdraco] - [#147296])
+- Fix reload for Shelly devices with no script support ([@chemelli74] - [#147344])
+- Add Matter protocol to Switchbot ([@joostlek] - [#147356])
+
+[#145650]: https://github.com/home-assistant/core/pull/145650
+[#145896]: https://github.com/home-assistant/core/pull/145896
+[#146337]: https://github.com/home-assistant/core/pull/146337
+[#146410]: https://github.com/home-assistant/core/pull/146410
+[#146566]: https://github.com/home-assistant/core/pull/146566
+[#146657]: https://github.com/home-assistant/core/pull/146657
+[#146764]: https://github.com/home-assistant/core/pull/146764
+[#146788]: https://github.com/home-assistant/core/pull/146788
+[#146810]: https://github.com/home-assistant/core/pull/146810
+[#146820]: https://github.com/home-assistant/core/pull/146820
+[#146828]: https://github.com/home-assistant/core/pull/146828
+[#146830]: https://github.com/home-assistant/core/pull/146830
+[#146831]: https://github.com/home-assistant/core/pull/146831
+[#146841]: https://github.com/home-assistant/core/pull/146841
+[#146847]: https://github.com/home-assistant/core/pull/146847
+[#146871]: https://github.com/home-assistant/core/pull/146871
+[#146883]: https://github.com/home-assistant/core/pull/146883
+[#146903]: https://github.com/home-assistant/core/pull/146903
+[#146907]: https://github.com/home-assistant/core/pull/146907
+[#146945]: https://github.com/home-assistant/core/pull/146945
+[#146983]: https://github.com/home-assistant/core/pull/146983
+[#147005]: https://github.com/home-assistant/core/pull/147005
+[#147013]: https://github.com/home-assistant/core/pull/147013
+[#147018]: https://github.com/home-assistant/core/pull/147018
+[#147019]: https://github.com/home-assistant/core/pull/147019
+[#147026]: https://github.com/home-assistant/core/pull/147026
+[#147029]: https://github.com/home-assistant/core/pull/147029
+[#147043]: https://github.com/home-assistant/core/pull/147043
+[#147044]: https://github.com/home-assistant/core/pull/147044
+[#147045]: https://github.com/home-assistant/core/pull/147045
+[#147046]: https://github.com/home-assistant/core/pull/147046
+[#147047]: https://github.com/home-assistant/core/pull/147047
+[#147055]: https://github.com/home-assistant/core/pull/147055
+[#147100]: https://github.com/home-assistant/core/pull/147100
+[#147102]: https://github.com/home-assistant/core/pull/147102
+[#147127]: https://github.com/home-assistant/core/pull/147127
+[#147136]: https://github.com/home-assistant/core/pull/147136
+[#147148]: https://github.com/home-assistant/core/pull/147148
+[#147151]: https://github.com/home-assistant/core/pull/147151
+[#147197]: https://github.com/home-assistant/core/pull/147197
+[#147221]: https://github.com/home-assistant/core/pull/147221
+[#147254]: https://github.com/home-assistant/core/pull/147254
+[#147257]: https://github.com/home-assistant/core/pull/147257
+[#147280]: https://github.com/home-assistant/core/pull/147280
+[#147296]: https://github.com/home-assistant/core/pull/147296
+[#147344]: https://github.com/home-assistant/core/pull/147344
+[#147356]: https://github.com/home-assistant/core/pull/147356
+[@Bre77]: https://github.com/Bre77
+[@Diegorro98]: https://github.com/Diegorro98
+[@Ernst79]: https://github.com/Ernst79
+[@MartinHjelmare]: https://github.com/MartinHjelmare
+[@RaHehl]: https://github.com/RaHehl
+[@SeraphicRav]: https://github.com/SeraphicRav
+[@alengwenus]: https://github.com/alengwenus
+[@allenporter]: https://github.com/allenporter
+[@bdraco]: https://github.com/bdraco
+[@bieniu]: https://github.com/bieniu
+[@brg468]: https://github.com/brg468
+[@cdce8p]: https://github.com/cdce8p
+[@chemelli74]: https://github.com/chemelli74
+[@ctalkington]: https://github.com/ctalkington
+[@edenhaus]: https://github.com/edenhaus
+[@elmurato]: https://github.com/elmurato
+[@emontnemery]: https://github.com/emontnemery
+[@frenck]: https://github.com/frenck
+[@gjohansson-ST]: https://github.com/gjohansson-ST
+[@hahn-th]: https://github.com/hahn-th
+[@hesselonline]: https://github.com/hesselonline
+[@joostlek]: https://github.com/joostlek
+[@ludeeus]: https://github.com/ludeeus
+[@puddly]: https://github.com/puddly
+[@starkillerOG]: https://github.com/starkillerOG
+[@synesthesiam]: https://github.com/synesthesiam
+[@zweckj]: https://github.com/zweckj
+[alexa_devices docs]: /integrations/alexa_devices/
+[bthome docs]: /integrations/bthome/
+[ecovacs docs]: /integrations/ecovacs/
+[esphome docs]: /integrations/esphome/
+[holiday docs]: /integrations/holiday/
+[home_connect docs]: /integrations/home_connect/
+[homematicip_cloud docs]: /integrations/homematicip_cloud/
+[lamarzocco docs]: /integrations/lamarzocco/
+[lcn docs]: /integrations/lcn/
+[local_calendar docs]: /integrations/local_calendar/
+[local_todo docs]: /integrations/local_todo/
+[minecraft_server docs]: /integrations/minecraft_server/
+[motion_blinds docs]: /integrations/motion_blinds/
+[onedrive docs]: /integrations/onedrive/
+[rachio docs]: /integrations/rachio/
+[remote_calendar docs]: /integrations/remote_calendar/
+[reolink docs]: /integrations/reolink/
+[roku docs]: /integrations/roku/
+[shelly docs]: /integrations/shelly/
+[smartthings docs]: /integrations/smartthings/
+[switchbot_cloud docs]: /integrations/switchbot_cloud/
+[teslemetry docs]: /integrations/teslemetry/
+[traccar docs]: /integrations/traccar/
+[unifiprotect docs]: /integrations/unifiprotect/
+[wallbox docs]: /integrations/wallbox/
+[workday docs]: /integrations/workday/
+[zha docs]: /integrations/zha/
+[zwave_js docs]: /integrations/zwave_js
+
+## Release 2025.6.3 - June 24
+
+- Update frontend to 20250531.4 ([@bramkragten] - [#147414])
+
+[#147414]: https://github.com/home-assistant/core/pull/147414
+[@bramkragten]: https://github.com/bramkragten
+
+[#123284]: https://github.com/home-assistant/core/pull/123284
+[#125764]: https://github.com/home-assistant/core/pull/125764
+[#129456]: https://github.com/home-assistant/core/pull/129456
+[#129876]: https://github.com/home-assistant/core/pull/129876
+[#130770]: https://github.com/home-assistant/core/pull/130770
+[#131166]: https://github.com/home-assistant/core/pull/131166
+[#131425]: https://github.com/home-assistant/core/pull/131425
+[#132882]: https://github.com/home-assistant/core/pull/132882
+[#133604]: https://github.com/home-assistant/core/pull/133604
+[#133773]: https://github.com/home-assistant/core/pull/133773
+[#135744]: https://github.com/home-assistant/core/pull/135744
+[#135756]: https://github.com/home-assistant/core/pull/135756
+[#135789]: https://github.com/home-assistant/core/pull/135789
+[#135926]: https://github.com/home-assistant/core/pull/135926
+[#136672]: https://github.com/home-assistant/core/pull/136672
+[#138571]: https://github.com/home-assistant/core/pull/138571
+[#139131]: https://github.com/home-assistant/core/pull/139131
+[#139286]: https://github.com/home-assistant/core/pull/139286
+[#139554]: https://github.com/home-assistant/core/pull/139554
+[#139578]: https://github.com/home-assistant/core/pull/139578
+[#139657]: https://github.com/home-assistant/core/pull/139657
+[#139703]: https://github.com/home-assistant/core/pull/139703
+[#139730]: https://github.com/home-assistant/core/pull/139730
+[#139944]: https://github.com/home-assistant/core/pull/139944
+[#140041]: https://github.com/home-assistant/core/pull/140041
+[#140120]: https://github.com/home-assistant/core/pull/140120
+[#140843]: https://github.com/home-assistant/core/pull/140843
+[#141003]: https://github.com/home-assistant/core/pull/141003
+[#141035]: https://github.com/home-assistant/core/pull/141035
+[#141051]: https://github.com/home-assistant/core/pull/141051
+[#141463]: https://github.com/home-assistant/core/pull/141463
+[#141518]: https://github.com/home-assistant/core/pull/141518
+[#141837]: https://github.com/home-assistant/core/pull/141837
+[#141944]: https://github.com/home-assistant/core/pull/141944
+[#141957]: https://github.com/home-assistant/core/pull/141957
+[#141993]: https://github.com/home-assistant/core/pull/141993
+[#142147]: https://github.com/home-assistant/core/pull/142147
+[#142157]: https://github.com/home-assistant/core/pull/142157
+[#142243]: https://github.com/home-assistant/core/pull/142243
+[#142250]: https://github.com/home-assistant/core/pull/142250
+[#142357]: https://github.com/home-assistant/core/pull/142357
+[#142401]: https://github.com/home-assistant/core/pull/142401
+[#142444]: https://github.com/home-assistant/core/pull/142444
+[#142564]: https://github.com/home-assistant/core/pull/142564
+[#142602]: https://github.com/home-assistant/core/pull/142602
+[#142621]: https://github.com/home-assistant/core/pull/142621
+[#142858]: https://github.com/home-assistant/core/pull/142858
+[#142866]: https://github.com/home-assistant/core/pull/142866
+[#142938]: https://github.com/home-assistant/core/pull/142938
+[#143113]: https://github.com/home-assistant/core/pull/143113
+[#143114]: https://github.com/home-assistant/core/pull/143114
+[#143117]: https://github.com/home-assistant/core/pull/143117
+[#143339]: https://github.com/home-assistant/core/pull/143339
+[#143374]: https://github.com/home-assistant/core/pull/143374
+[#143424]: https://github.com/home-assistant/core/pull/143424
+[#143444]: https://github.com/home-assistant/core/pull/143444
+[#143524]: https://github.com/home-assistant/core/pull/143524
+[#143581]: https://github.com/home-assistant/core/pull/143581
+[#143588]: https://github.com/home-assistant/core/pull/143588
+[#143592]: https://github.com/home-assistant/core/pull/143592
+[#143630]: https://github.com/home-assistant/core/pull/143630
+[#143633]: https://github.com/home-assistant/core/pull/143633
+[#143695]: https://github.com/home-assistant/core/pull/143695
+[#143713]: https://github.com/home-assistant/core/pull/143713
+[#143757]: https://github.com/home-assistant/core/pull/143757
+[#143941]: https://github.com/home-assistant/core/pull/143941
+[#143964]: https://github.com/home-assistant/core/pull/143964
+[#143978]: https://github.com/home-assistant/core/pull/143978
+[#143983]: https://github.com/home-assistant/core/pull/143983
+[#143984]: https://github.com/home-assistant/core/pull/143984
+[#143999]: https://github.com/home-assistant/core/pull/143999
+[#144016]: https://github.com/home-assistant/core/pull/144016
+[#144017]: https://github.com/home-assistant/core/pull/144017
+[#144019]: https://github.com/home-assistant/core/pull/144019
+[#144020]: https://github.com/home-assistant/core/pull/144020
+[#144021]: https://github.com/home-assistant/core/pull/144021
+[#144024]: https://github.com/home-assistant/core/pull/144024
+[#144027]: https://github.com/home-assistant/core/pull/144027
+[#144028]: https://github.com/home-assistant/core/pull/144028
+[#144031]: https://github.com/home-assistant/core/pull/144031
+[#144035]: https://github.com/home-assistant/core/pull/144035
+[#144038]: https://github.com/home-assistant/core/pull/144038
+[#144043]: https://github.com/home-assistant/core/pull/144043
+[#144044]: https://github.com/home-assistant/core/pull/144044
+[#144048]: https://github.com/home-assistant/core/pull/144048
+[#144049]: https://github.com/home-assistant/core/pull/144049
+[#144058]: https://github.com/home-assistant/core/pull/144058
+[#144060]: https://github.com/home-assistant/core/pull/144060
+[#144061]: https://github.com/home-assistant/core/pull/144061
+[#144064]: https://github.com/home-assistant/core/pull/144064
+[#144070]: https://github.com/home-assistant/core/pull/144070
+[#144073]: https://github.com/home-assistant/core/pull/144073
+[#144075]: https://github.com/home-assistant/core/pull/144075
+[#144079]: https://github.com/home-assistant/core/pull/144079
+[#144083]: https://github.com/home-assistant/core/pull/144083
+[#144086]: https://github.com/home-assistant/core/pull/144086
+[#144093]: https://github.com/home-assistant/core/pull/144093
+[#144095]: https://github.com/home-assistant/core/pull/144095
+[#144097]: https://github.com/home-assistant/core/pull/144097
+[#144100]: https://github.com/home-assistant/core/pull/144100
+[#144117]: https://github.com/home-assistant/core/pull/144117
+[#144128]: https://github.com/home-assistant/core/pull/144128
+[#144142]: https://github.com/home-assistant/core/pull/144142
+[#144144]: https://github.com/home-assistant/core/pull/144144
+[#144146]: https://github.com/home-assistant/core/pull/144146
+[#144147]: https://github.com/home-assistant/core/pull/144147
+[#144148]: https://github.com/home-assistant/core/pull/144148
+[#144149]: https://github.com/home-assistant/core/pull/144149
+[#144151]: https://github.com/home-assistant/core/pull/144151
+[#144153]: https://github.com/home-assistant/core/pull/144153
+[#144161]: https://github.com/home-assistant/core/pull/144161
+[#144166]: https://github.com/home-assistant/core/pull/144166
+[#144167]: https://github.com/home-assistant/core/pull/144167
+[#144168]: https://github.com/home-assistant/core/pull/144168
+[#144169]: https://github.com/home-assistant/core/pull/144169
+[#144171]: https://github.com/home-assistant/core/pull/144171
+[#144173]: https://github.com/home-assistant/core/pull/144173
+[#144175]: https://github.com/home-assistant/core/pull/144175
+[#144178]: https://github.com/home-assistant/core/pull/144178
+[#144179]: https://github.com/home-assistant/core/pull/144179
+[#144188]: https://github.com/home-assistant/core/pull/144188
+[#144189]: https://github.com/home-assistant/core/pull/144189
+[#144190]: https://github.com/home-assistant/core/pull/144190
+[#144191]: https://github.com/home-assistant/core/pull/144191
+[#144192]: https://github.com/home-assistant/core/pull/144192
+[#144194]: https://github.com/home-assistant/core/pull/144194
+[#144197]: https://github.com/home-assistant/core/pull/144197
+[#144199]: https://github.com/home-assistant/core/pull/144199
+[#144204]: https://github.com/home-assistant/core/pull/144204
+[#144206]: https://github.com/home-assistant/core/pull/144206
+[#144208]: https://github.com/home-assistant/core/pull/144208
+[#144212]: https://github.com/home-assistant/core/pull/144212
+[#144214]: https://github.com/home-assistant/core/pull/144214
+[#144216]: https://github.com/home-assistant/core/pull/144216
+[#144217]: https://github.com/home-assistant/core/pull/144217
+[#144218]: https://github.com/home-assistant/core/pull/144218
+[#144219]: https://github.com/home-assistant/core/pull/144219
+[#144221]: https://github.com/home-assistant/core/pull/144221
+[#144222]: https://github.com/home-assistant/core/pull/144222
+[#144223]: https://github.com/home-assistant/core/pull/144223
+[#144234]: https://github.com/home-assistant/core/pull/144234
+[#144236]: https://github.com/home-assistant/core/pull/144236
+[#144238]: https://github.com/home-assistant/core/pull/144238
+[#144244]: https://github.com/home-assistant/core/pull/144244
+[#144245]: https://github.com/home-assistant/core/pull/144245
+[#144246]: https://github.com/home-assistant/core/pull/144246
+[#144249]: https://github.com/home-assistant/core/pull/144249
+[#144252]: https://github.com/home-assistant/core/pull/144252
+[#144254]: https://github.com/home-assistant/core/pull/144254
+[#144261]: https://github.com/home-assistant/core/pull/144261
+[#144264]: https://github.com/home-assistant/core/pull/144264
+[#144265]: https://github.com/home-assistant/core/pull/144265
+[#144266]: https://github.com/home-assistant/core/pull/144266
+[#144267]: https://github.com/home-assistant/core/pull/144267
+[#144268]: https://github.com/home-assistant/core/pull/144268
+[#144269]: https://github.com/home-assistant/core/pull/144269
+[#144270]: https://github.com/home-assistant/core/pull/144270
+[#144271]: https://github.com/home-assistant/core/pull/144271
+[#144272]: https://github.com/home-assistant/core/pull/144272
+[#144278]: https://github.com/home-assistant/core/pull/144278
+[#144280]: https://github.com/home-assistant/core/pull/144280
+[#144284]: https://github.com/home-assistant/core/pull/144284
+[#144291]: https://github.com/home-assistant/core/pull/144291
+[#144295]: https://github.com/home-assistant/core/pull/144295
+[#144301]: https://github.com/home-assistant/core/pull/144301
+[#144302]: https://github.com/home-assistant/core/pull/144302
+[#144303]: https://github.com/home-assistant/core/pull/144303
+[#144305]: https://github.com/home-assistant/core/pull/144305
+[#144306]: https://github.com/home-assistant/core/pull/144306
+[#144308]: https://github.com/home-assistant/core/pull/144308
+[#144309]: https://github.com/home-assistant/core/pull/144309
+[#144310]: https://github.com/home-assistant/core/pull/144310
+[#144311]: https://github.com/home-assistant/core/pull/144311
+[#144312]: https://github.com/home-assistant/core/pull/144312
+[#144313]: https://github.com/home-assistant/core/pull/144313
+[#144316]: https://github.com/home-assistant/core/pull/144316
+[#144319]: https://github.com/home-assistant/core/pull/144319
+[#144320]: https://github.com/home-assistant/core/pull/144320
+[#144322]: https://github.com/home-assistant/core/pull/144322
+[#144323]: https://github.com/home-assistant/core/pull/144323
+[#144325]: https://github.com/home-assistant/core/pull/144325
+[#144326]: https://github.com/home-assistant/core/pull/144326
+[#144327]: https://github.com/home-assistant/core/pull/144327
+[#144328]: https://github.com/home-assistant/core/pull/144328
+[#144329]: https://github.com/home-assistant/core/pull/144329
+[#144330]: https://github.com/home-assistant/core/pull/144330
+[#144331]: https://github.com/home-assistant/core/pull/144331
+[#144332]: https://github.com/home-assistant/core/pull/144332
+[#144335]: https://github.com/home-assistant/core/pull/144335
+[#144337]: https://github.com/home-assistant/core/pull/144337
+[#144340]: https://github.com/home-assistant/core/pull/144340
+[#144341]: https://github.com/home-assistant/core/pull/144341
+[#144344]: https://github.com/home-assistant/core/pull/144344
+[#144346]: https://github.com/home-assistant/core/pull/144346
+[#144348]: https://github.com/home-assistant/core/pull/144348
+[#144361]: https://github.com/home-assistant/core/pull/144361
+[#144363]: https://github.com/home-assistant/core/pull/144363
+[#144364]: https://github.com/home-assistant/core/pull/144364
+[#144365]: https://github.com/home-assistant/core/pull/144365
+[#144367]: https://github.com/home-assistant/core/pull/144367
+[#144368]: https://github.com/home-assistant/core/pull/144368
+[#144370]: https://github.com/home-assistant/core/pull/144370
+[#144372]: https://github.com/home-assistant/core/pull/144372
+[#144376]: https://github.com/home-assistant/core/pull/144376
+[#144378]: https://github.com/home-assistant/core/pull/144378
+[#144379]: https://github.com/home-assistant/core/pull/144379
+[#144380]: https://github.com/home-assistant/core/pull/144380
+[#144381]: https://github.com/home-assistant/core/pull/144381
+[#144394]: https://github.com/home-assistant/core/pull/144394
+[#144400]: https://github.com/home-assistant/core/pull/144400
+[#144402]: https://github.com/home-assistant/core/pull/144402
+[#144405]: https://github.com/home-assistant/core/pull/144405
+[#144408]: https://github.com/home-assistant/core/pull/144408
+[#144410]: https://github.com/home-assistant/core/pull/144410
+[#144411]: https://github.com/home-assistant/core/pull/144411
+[#144412]: https://github.com/home-assistant/core/pull/144412
+[#144414]: https://github.com/home-assistant/core/pull/144414
+[#144416]: https://github.com/home-assistant/core/pull/144416
+[#144417]: https://github.com/home-assistant/core/pull/144417
+[#144420]: https://github.com/home-assistant/core/pull/144420
+[#144422]: https://github.com/home-assistant/core/pull/144422
+[#144423]: https://github.com/home-assistant/core/pull/144423
+[#144428]: https://github.com/home-assistant/core/pull/144428
+[#144430]: https://github.com/home-assistant/core/pull/144430
+[#144433]: https://github.com/home-assistant/core/pull/144433
+[#144440]: https://github.com/home-assistant/core/pull/144440
+[#144443]: https://github.com/home-assistant/core/pull/144443
+[#144444]: https://github.com/home-assistant/core/pull/144444
+[#144446]: https://github.com/home-assistant/core/pull/144446
+[#144447]: https://github.com/home-assistant/core/pull/144447
+[#144448]: https://github.com/home-assistant/core/pull/144448
+[#144450]: https://github.com/home-assistant/core/pull/144450
+[#144456]: https://github.com/home-assistant/core/pull/144456
+[#144470]: https://github.com/home-assistant/core/pull/144470
+[#144472]: https://github.com/home-assistant/core/pull/144472
+[#144473]: https://github.com/home-assistant/core/pull/144473
+[#144483]: https://github.com/home-assistant/core/pull/144483
+[#144491]: https://github.com/home-assistant/core/pull/144491
+[#144493]: https://github.com/home-assistant/core/pull/144493
+[#144494]: https://github.com/home-assistant/core/pull/144494
+[#144500]: https://github.com/home-assistant/core/pull/144500
+[#144505]: https://github.com/home-assistant/core/pull/144505
+[#144507]: https://github.com/home-assistant/core/pull/144507
+[#144510]: https://github.com/home-assistant/core/pull/144510
+[#144513]: https://github.com/home-assistant/core/pull/144513
+[#144515]: https://github.com/home-assistant/core/pull/144515
+[#144519]: https://github.com/home-assistant/core/pull/144519
+[#144527]: https://github.com/home-assistant/core/pull/144527
+[#144529]: https://github.com/home-assistant/core/pull/144529
+[#144531]: https://github.com/home-assistant/core/pull/144531
+[#144532]: https://github.com/home-assistant/core/pull/144532
+[#144535]: https://github.com/home-assistant/core/pull/144535
+[#144537]: https://github.com/home-assistant/core/pull/144537
+[#144538]: https://github.com/home-assistant/core/pull/144538
+[#144539]: https://github.com/home-assistant/core/pull/144539
+[#144540]: https://github.com/home-assistant/core/pull/144540
+[#144545]: https://github.com/home-assistant/core/pull/144545
+[#144546]: https://github.com/home-assistant/core/pull/144546
+[#144547]: https://github.com/home-assistant/core/pull/144547
+[#144548]: https://github.com/home-assistant/core/pull/144548
+[#144550]: https://github.com/home-assistant/core/pull/144550
+[#144551]: https://github.com/home-assistant/core/pull/144551
+[#144555]: https://github.com/home-assistant/core/pull/144555
+[#144557]: https://github.com/home-assistant/core/pull/144557
+[#144559]: https://github.com/home-assistant/core/pull/144559
+[#144560]: https://github.com/home-assistant/core/pull/144560
+[#144561]: https://github.com/home-assistant/core/pull/144561
+[#144572]: https://github.com/home-assistant/core/pull/144572
+[#144577]: https://github.com/home-assistant/core/pull/144577
+[#144579]: https://github.com/home-assistant/core/pull/144579
+[#144581]: https://github.com/home-assistant/core/pull/144581
+[#144587]: https://github.com/home-assistant/core/pull/144587
+[#144588]: https://github.com/home-assistant/core/pull/144588
+[#144600]: https://github.com/home-assistant/core/pull/144600
+[#144601]: https://github.com/home-assistant/core/pull/144601
+[#144603]: https://github.com/home-assistant/core/pull/144603
+[#144605]: https://github.com/home-assistant/core/pull/144605
+[#144606]: https://github.com/home-assistant/core/pull/144606
+[#144607]: https://github.com/home-assistant/core/pull/144607
+[#144609]: https://github.com/home-assistant/core/pull/144609
+[#144611]: https://github.com/home-assistant/core/pull/144611
+[#144618]: https://github.com/home-assistant/core/pull/144618
+[#144619]: https://github.com/home-assistant/core/pull/144619
+[#144626]: https://github.com/home-assistant/core/pull/144626
+[#144627]: https://github.com/home-assistant/core/pull/144627
+[#144630]: https://github.com/home-assistant/core/pull/144630
+[#144631]: https://github.com/home-assistant/core/pull/144631
+[#144632]: https://github.com/home-assistant/core/pull/144632
+[#144633]: https://github.com/home-assistant/core/pull/144633
+[#144636]: https://github.com/home-assistant/core/pull/144636
+[#144637]: https://github.com/home-assistant/core/pull/144637
+[#144638]: https://github.com/home-assistant/core/pull/144638
+[#144639]: https://github.com/home-assistant/core/pull/144639
+[#144640]: https://github.com/home-assistant/core/pull/144640
+[#144646]: https://github.com/home-assistant/core/pull/144646
+[#144650]: https://github.com/home-assistant/core/pull/144650
+[#144659]: https://github.com/home-assistant/core/pull/144659
+[#144664]: https://github.com/home-assistant/core/pull/144664
+[#144674]: https://github.com/home-assistant/core/pull/144674
+[#144685]: https://github.com/home-assistant/core/pull/144685
+[#144686]: https://github.com/home-assistant/core/pull/144686
+[#144688]: https://github.com/home-assistant/core/pull/144688
+[#144690]: https://github.com/home-assistant/core/pull/144690
+[#144693]: https://github.com/home-assistant/core/pull/144693
+[#144696]: https://github.com/home-assistant/core/pull/144696
+[#144697]: https://github.com/home-assistant/core/pull/144697
+[#144698]: https://github.com/home-assistant/core/pull/144698
+[#144699]: https://github.com/home-assistant/core/pull/144699
+[#144700]: https://github.com/home-assistant/core/pull/144700
+[#144701]: https://github.com/home-assistant/core/pull/144701
+[#144711]: https://github.com/home-assistant/core/pull/144711
+[#144715]: https://github.com/home-assistant/core/pull/144715
+[#144716]: https://github.com/home-assistant/core/pull/144716
+[#144717]: https://github.com/home-assistant/core/pull/144717
+[#144719]: https://github.com/home-assistant/core/pull/144719
+[#144723]: https://github.com/home-assistant/core/pull/144723
+[#144724]: https://github.com/home-assistant/core/pull/144724
+[#144726]: https://github.com/home-assistant/core/pull/144726
+[#144732]: https://github.com/home-assistant/core/pull/144732
+[#144735]: https://github.com/home-assistant/core/pull/144735
+[#144739]: https://github.com/home-assistant/core/pull/144739
+[#144741]: https://github.com/home-assistant/core/pull/144741
+[#144742]: https://github.com/home-assistant/core/pull/144742
+[#144744]: https://github.com/home-assistant/core/pull/144744
+[#144746]: https://github.com/home-assistant/core/pull/144746
+[#144748]: https://github.com/home-assistant/core/pull/144748
+[#144751]: https://github.com/home-assistant/core/pull/144751
+[#144753]: https://github.com/home-assistant/core/pull/144753
+[#144755]: https://github.com/home-assistant/core/pull/144755
+[#144756]: https://github.com/home-assistant/core/pull/144756
+[#144757]: https://github.com/home-assistant/core/pull/144757
+[#144758]: https://github.com/home-assistant/core/pull/144758
+[#144760]: https://github.com/home-assistant/core/pull/144760
+[#144761]: https://github.com/home-assistant/core/pull/144761
+[#144767]: https://github.com/home-assistant/core/pull/144767
+[#144769]: https://github.com/home-assistant/core/pull/144769
+[#144770]: https://github.com/home-assistant/core/pull/144770
+[#144773]: https://github.com/home-assistant/core/pull/144773
+[#144775]: https://github.com/home-assistant/core/pull/144775
+[#144777]: https://github.com/home-assistant/core/pull/144777
+[#144778]: https://github.com/home-assistant/core/pull/144778
+[#144787]: https://github.com/home-assistant/core/pull/144787
+[#144794]: https://github.com/home-assistant/core/pull/144794
+[#144800]: https://github.com/home-assistant/core/pull/144800
+[#144804]: https://github.com/home-assistant/core/pull/144804
+[#144810]: https://github.com/home-assistant/core/pull/144810
+[#144817]: https://github.com/home-assistant/core/pull/144817
+[#144820]: https://github.com/home-assistant/core/pull/144820
+[#144822]: https://github.com/home-assistant/core/pull/144822
+[#144828]: https://github.com/home-assistant/core/pull/144828
+[#144829]: https://github.com/home-assistant/core/pull/144829
+[#144832]: https://github.com/home-assistant/core/pull/144832
+[#144834]: https://github.com/home-assistant/core/pull/144834
+[#144837]: https://github.com/home-assistant/core/pull/144837
+[#144842]: https://github.com/home-assistant/core/pull/144842
+[#144843]: https://github.com/home-assistant/core/pull/144843
+[#144844]: https://github.com/home-assistant/core/pull/144844
+[#144845]: https://github.com/home-assistant/core/pull/144845
+[#144854]: https://github.com/home-assistant/core/pull/144854
+[#144856]: https://github.com/home-assistant/core/pull/144856
+[#144861]: https://github.com/home-assistant/core/pull/144861
+[#144864]: https://github.com/home-assistant/core/pull/144864
+[#144865]: https://github.com/home-assistant/core/pull/144865
+[#144867]: https://github.com/home-assistant/core/pull/144867
+[#144868]: https://github.com/home-assistant/core/pull/144868
+[#144870]: https://github.com/home-assistant/core/pull/144870
+[#144873]: https://github.com/home-assistant/core/pull/144873
+[#144876]: https://github.com/home-assistant/core/pull/144876
+[#144878]: https://github.com/home-assistant/core/pull/144878
+[#144880]: https://github.com/home-assistant/core/pull/144880
+[#144881]: https://github.com/home-assistant/core/pull/144881
+[#144882]: https://github.com/home-assistant/core/pull/144882
+[#144883]: https://github.com/home-assistant/core/pull/144883
+[#144884]: https://github.com/home-assistant/core/pull/144884
+[#144886]: https://github.com/home-assistant/core/pull/144886
+[#144887]: https://github.com/home-assistant/core/pull/144887
+[#144888]: https://github.com/home-assistant/core/pull/144888
+[#144892]: https://github.com/home-assistant/core/pull/144892
+[#144895]: https://github.com/home-assistant/core/pull/144895
+[#144896]: https://github.com/home-assistant/core/pull/144896
+[#144901]: https://github.com/home-assistant/core/pull/144901
+[#144907]: https://github.com/home-assistant/core/pull/144907
+[#144912]: https://github.com/home-assistant/core/pull/144912
+[#144914]: https://github.com/home-assistant/core/pull/144914
+[#144915]: https://github.com/home-assistant/core/pull/144915
+[#144916]: https://github.com/home-assistant/core/pull/144916
+[#144918]: https://github.com/home-assistant/core/pull/144918
+[#144919]: https://github.com/home-assistant/core/pull/144919
+[#144920]: https://github.com/home-assistant/core/pull/144920
+[#144923]: https://github.com/home-assistant/core/pull/144923
+[#144926]: https://github.com/home-assistant/core/pull/144926
+[#144927]: https://github.com/home-assistant/core/pull/144927
+[#144937]: https://github.com/home-assistant/core/pull/144937
+[#144939]: https://github.com/home-assistant/core/pull/144939
+[#144942]: https://github.com/home-assistant/core/pull/144942
+[#144944]: https://github.com/home-assistant/core/pull/144944
+[#144946]: https://github.com/home-assistant/core/pull/144946
+[#144947]: https://github.com/home-assistant/core/pull/144947
+[#144950]: https://github.com/home-assistant/core/pull/144950
+[#144951]: https://github.com/home-assistant/core/pull/144951
+[#144953]: https://github.com/home-assistant/core/pull/144953
+[#144954]: https://github.com/home-assistant/core/pull/144954
+[#144955]: https://github.com/home-assistant/core/pull/144955
+[#144956]: https://github.com/home-assistant/core/pull/144956
+[#144961]: https://github.com/home-assistant/core/pull/144961
+[#144962]: https://github.com/home-assistant/core/pull/144962
+[#144968]: https://github.com/home-assistant/core/pull/144968
+[#144969]: https://github.com/home-assistant/core/pull/144969
+[#144972]: https://github.com/home-assistant/core/pull/144972
+[#144974]: https://github.com/home-assistant/core/pull/144974
+[#144977]: https://github.com/home-assistant/core/pull/144977
+[#144978]: https://github.com/home-assistant/core/pull/144978
+[#144979]: https://github.com/home-assistant/core/pull/144979
+[#144980]: https://github.com/home-assistant/core/pull/144980
+[#144982]: https://github.com/home-assistant/core/pull/144982
+[#144983]: https://github.com/home-assistant/core/pull/144983
+[#144984]: https://github.com/home-assistant/core/pull/144984
+[#144986]: https://github.com/home-assistant/core/pull/144986
+[#144988]: https://github.com/home-assistant/core/pull/144988
+[#144989]: https://github.com/home-assistant/core/pull/144989
+[#144990]: https://github.com/home-assistant/core/pull/144990
+[#144991]: https://github.com/home-assistant/core/pull/144991
+[#144998]: https://github.com/home-assistant/core/pull/144998
+[#144999]: https://github.com/home-assistant/core/pull/144999
+[#145000]: https://github.com/home-assistant/core/pull/145000
+[#145002]: https://github.com/home-assistant/core/pull/145002
+[#145007]: https://github.com/home-assistant/core/pull/145007
+[#145008]: https://github.com/home-assistant/core/pull/145008
+[#145011]: https://github.com/home-assistant/core/pull/145011
+[#145012]: https://github.com/home-assistant/core/pull/145012
+[#145018]: https://github.com/home-assistant/core/pull/145018
+[#145021]: https://github.com/home-assistant/core/pull/145021
+[#145022]: https://github.com/home-assistant/core/pull/145022
+[#145023]: https://github.com/home-assistant/core/pull/145023
+[#145026]: https://github.com/home-assistant/core/pull/145026
+[#145028]: https://github.com/home-assistant/core/pull/145028
+[#145030]: https://github.com/home-assistant/core/pull/145030
+[#145031]: https://github.com/home-assistant/core/pull/145031
+[#145034]: https://github.com/home-assistant/core/pull/145034
+[#145036]: https://github.com/home-assistant/core/pull/145036
+[#145037]: https://github.com/home-assistant/core/pull/145037
+[#145039]: https://github.com/home-assistant/core/pull/145039
+[#145041]: https://github.com/home-assistant/core/pull/145041
+[#145042]: https://github.com/home-assistant/core/pull/145042
+[#145045]: https://github.com/home-assistant/core/pull/145045
+[#145047]: https://github.com/home-assistant/core/pull/145047
+[#145052]: https://github.com/home-assistant/core/pull/145052
+[#145057]: https://github.com/home-assistant/core/pull/145057
+[#145060]: https://github.com/home-assistant/core/pull/145060
+[#145065]: https://github.com/home-assistant/core/pull/145065
+[#145069]: https://github.com/home-assistant/core/pull/145069
+[#145077]: https://github.com/home-assistant/core/pull/145077
+[#145080]: https://github.com/home-assistant/core/pull/145080
+[#145085]: https://github.com/home-assistant/core/pull/145085
+[#145094]: https://github.com/home-assistant/core/pull/145094
+[#145096]: https://github.com/home-assistant/core/pull/145096
+[#145102]: https://github.com/home-assistant/core/pull/145102
+[#145103]: https://github.com/home-assistant/core/pull/145103
+[#145107]: https://github.com/home-assistant/core/pull/145107
+[#145110]: https://github.com/home-assistant/core/pull/145110
+[#145111]: https://github.com/home-assistant/core/pull/145111
+[#145115]: https://github.com/home-assistant/core/pull/145115
+[#145121]: https://github.com/home-assistant/core/pull/145121
+[#145125]: https://github.com/home-assistant/core/pull/145125
+[#145129]: https://github.com/home-assistant/core/pull/145129
+[#145130]: https://github.com/home-assistant/core/pull/145130
+[#145146]: https://github.com/home-assistant/core/pull/145146
+[#145147]: https://github.com/home-assistant/core/pull/145147
+[#145148]: https://github.com/home-assistant/core/pull/145148
+[#145149]: https://github.com/home-assistant/core/pull/145149
+[#145151]: https://github.com/home-assistant/core/pull/145151
+[#145152]: https://github.com/home-assistant/core/pull/145152
+[#145155]: https://github.com/home-assistant/core/pull/145155
+[#145159]: https://github.com/home-assistant/core/pull/145159
+[#145161]: https://github.com/home-assistant/core/pull/145161
+[#145162]: https://github.com/home-assistant/core/pull/145162
+[#145165]: https://github.com/home-assistant/core/pull/145165
+[#145167]: https://github.com/home-assistant/core/pull/145167
+[#145169]: https://github.com/home-assistant/core/pull/145169
+[#145170]: https://github.com/home-assistant/core/pull/145170
+[#145171]: https://github.com/home-assistant/core/pull/145171
+[#145172]: https://github.com/home-assistant/core/pull/145172
+[#145173]: https://github.com/home-assistant/core/pull/145173
+[#145174]: https://github.com/home-assistant/core/pull/145174
+[#145177]: https://github.com/home-assistant/core/pull/145177
+[#145178]: https://github.com/home-assistant/core/pull/145178
+[#145179]: https://github.com/home-assistant/core/pull/145179
+[#145180]: https://github.com/home-assistant/core/pull/145180
+[#145181]: https://github.com/home-assistant/core/pull/145181
+[#145183]: https://github.com/home-assistant/core/pull/145183
+[#145186]: https://github.com/home-assistant/core/pull/145186
+[#145187]: https://github.com/home-assistant/core/pull/145187
+[#145189]: https://github.com/home-assistant/core/pull/145189
+[#145192]: https://github.com/home-assistant/core/pull/145192
+[#145194]: https://github.com/home-assistant/core/pull/145194
+[#145195]: https://github.com/home-assistant/core/pull/145195
+[#145199]: https://github.com/home-assistant/core/pull/145199
+[#145200]: https://github.com/home-assistant/core/pull/145200
+[#145201]: https://github.com/home-assistant/core/pull/145201
+[#145202]: https://github.com/home-assistant/core/pull/145202
+[#145203]: https://github.com/home-assistant/core/pull/145203
+[#145206]: https://github.com/home-assistant/core/pull/145206
+[#145207]: https://github.com/home-assistant/core/pull/145207
+[#145208]: https://github.com/home-assistant/core/pull/145208
+[#145210]: https://github.com/home-assistant/core/pull/145210
+[#145211]: https://github.com/home-assistant/core/pull/145211
+[#145212]: https://github.com/home-assistant/core/pull/145212
+[#145214]: https://github.com/home-assistant/core/pull/145214
+[#145215]: https://github.com/home-assistant/core/pull/145215
+[#145217]: https://github.com/home-assistant/core/pull/145217
+[#145218]: https://github.com/home-assistant/core/pull/145218
+[#145219]: https://github.com/home-assistant/core/pull/145219
+[#145220]: https://github.com/home-assistant/core/pull/145220
+[#145222]: https://github.com/home-assistant/core/pull/145222
+[#145223]: https://github.com/home-assistant/core/pull/145223
+[#145225]: https://github.com/home-assistant/core/pull/145225
+[#145226]: https://github.com/home-assistant/core/pull/145226
+[#145227]: https://github.com/home-assistant/core/pull/145227
+[#145229]: https://github.com/home-assistant/core/pull/145229
+[#145230]: https://github.com/home-assistant/core/pull/145230
+[#145236]: https://github.com/home-assistant/core/pull/145236
+[#145239]: https://github.com/home-assistant/core/pull/145239
+[#145243]: https://github.com/home-assistant/core/pull/145243
+[#145244]: https://github.com/home-assistant/core/pull/145244
+[#145247]: https://github.com/home-assistant/core/pull/145247
+[#145249]: https://github.com/home-assistant/core/pull/145249
+[#145250]: https://github.com/home-assistant/core/pull/145250
+[#145253]: https://github.com/home-assistant/core/pull/145253
+[#145254]: https://github.com/home-assistant/core/pull/145254
+[#145255]: https://github.com/home-assistant/core/pull/145255
+[#145257]: https://github.com/home-assistant/core/pull/145257
+[#145259]: https://github.com/home-assistant/core/pull/145259
+[#145263]: https://github.com/home-assistant/core/pull/145263
+[#145264]: https://github.com/home-assistant/core/pull/145264
+[#145269]: https://github.com/home-assistant/core/pull/145269
+[#145270]: https://github.com/home-assistant/core/pull/145270
+[#145271]: https://github.com/home-assistant/core/pull/145271
+[#145272]: https://github.com/home-assistant/core/pull/145272
+[#145273]: https://github.com/home-assistant/core/pull/145273
+[#145274]: https://github.com/home-assistant/core/pull/145274
+[#145275]: https://github.com/home-assistant/core/pull/145275
+[#145276]: https://github.com/home-assistant/core/pull/145276
+[#145279]: https://github.com/home-assistant/core/pull/145279
+[#145280]: https://github.com/home-assistant/core/pull/145280
+[#145281]: https://github.com/home-assistant/core/pull/145281
+[#145282]: https://github.com/home-assistant/core/pull/145282
+[#145283]: https://github.com/home-assistant/core/pull/145283
+[#145285]: https://github.com/home-assistant/core/pull/145285
+[#145286]: https://github.com/home-assistant/core/pull/145286
+[#145287]: https://github.com/home-assistant/core/pull/145287
+[#145289]: https://github.com/home-assistant/core/pull/145289
+[#145292]: https://github.com/home-assistant/core/pull/145292
+[#145294]: https://github.com/home-assistant/core/pull/145294
+[#145297]: https://github.com/home-assistant/core/pull/145297
+[#145298]: https://github.com/home-assistant/core/pull/145298
+[#145299]: https://github.com/home-assistant/core/pull/145299
+[#145303]: https://github.com/home-assistant/core/pull/145303
+[#145305]: https://github.com/home-assistant/core/pull/145305
+[#145306]: https://github.com/home-assistant/core/pull/145306
+[#145308]: https://github.com/home-assistant/core/pull/145308
+[#145309]: https://github.com/home-assistant/core/pull/145309
+[#145311]: https://github.com/home-assistant/core/pull/145311
+[#145313]: https://github.com/home-assistant/core/pull/145313
+[#145314]: https://github.com/home-assistant/core/pull/145314
+[#145315]: https://github.com/home-assistant/core/pull/145315
+[#145316]: https://github.com/home-assistant/core/pull/145316
+[#145318]: https://github.com/home-assistant/core/pull/145318
+[#145319]: https://github.com/home-assistant/core/pull/145319
+[#145324]: https://github.com/home-assistant/core/pull/145324
+[#145325]: https://github.com/home-assistant/core/pull/145325
+[#145327]: https://github.com/home-assistant/core/pull/145327
+[#145329]: https://github.com/home-assistant/core/pull/145329
+[#145331]: https://github.com/home-assistant/core/pull/145331
+[#145332]: https://github.com/home-assistant/core/pull/145332
+[#145334]: https://github.com/home-assistant/core/pull/145334
+[#145335]: https://github.com/home-assistant/core/pull/145335
+[#145340]: https://github.com/home-assistant/core/pull/145340
+[#145348]: https://github.com/home-assistant/core/pull/145348
+[#145350]: https://github.com/home-assistant/core/pull/145350
+[#145353]: https://github.com/home-assistant/core/pull/145353
+[#145358]: https://github.com/home-assistant/core/pull/145358
+[#145360]: https://github.com/home-assistant/core/pull/145360
+[#145364]: https://github.com/home-assistant/core/pull/145364
+[#145366]: https://github.com/home-assistant/core/pull/145366
+[#145368]: https://github.com/home-assistant/core/pull/145368
+[#145371]: https://github.com/home-assistant/core/pull/145371
+[#145372]: https://github.com/home-assistant/core/pull/145372
+[#145373]: https://github.com/home-assistant/core/pull/145373
+[#145374]: https://github.com/home-assistant/core/pull/145374
+[#145376]: https://github.com/home-assistant/core/pull/145376
+[#145378]: https://github.com/home-assistant/core/pull/145378
+[#145381]: https://github.com/home-assistant/core/pull/145381
+[#145388]: https://github.com/home-assistant/core/pull/145388
+[#145390]: https://github.com/home-assistant/core/pull/145390
+[#145391]: https://github.com/home-assistant/core/pull/145391
+[#145392]: https://github.com/home-assistant/core/pull/145392
+[#145393]: https://github.com/home-assistant/core/pull/145393
+[#145395]: https://github.com/home-assistant/core/pull/145395
+[#145396]: https://github.com/home-assistant/core/pull/145396
+[#145397]: https://github.com/home-assistant/core/pull/145397
+[#145398]: https://github.com/home-assistant/core/pull/145398
+[#145400]: https://github.com/home-assistant/core/pull/145400
+[#145401]: https://github.com/home-assistant/core/pull/145401
+[#145404]: https://github.com/home-assistant/core/pull/145404
+[#145405]: https://github.com/home-assistant/core/pull/145405
+[#145407]: https://github.com/home-assistant/core/pull/145407
+[#145409]: https://github.com/home-assistant/core/pull/145409
+[#145413]: https://github.com/home-assistant/core/pull/145413
+[#145414]: https://github.com/home-assistant/core/pull/145414
+[#145416]: https://github.com/home-assistant/core/pull/145416
+[#145417]: https://github.com/home-assistant/core/pull/145417
+[#145418]: https://github.com/home-assistant/core/pull/145418
+[#145419]: https://github.com/home-assistant/core/pull/145419
+[#145420]: https://github.com/home-assistant/core/pull/145420
+[#145421]: https://github.com/home-assistant/core/pull/145421
+[#145422]: https://github.com/home-assistant/core/pull/145422
+[#145423]: https://github.com/home-assistant/core/pull/145423
+[#145426]: https://github.com/home-assistant/core/pull/145426
+[#145429]: https://github.com/home-assistant/core/pull/145429
+[#145430]: https://github.com/home-assistant/core/pull/145430
+[#145431]: https://github.com/home-assistant/core/pull/145431
+[#145432]: https://github.com/home-assistant/core/pull/145432
+[#145433]: https://github.com/home-assistant/core/pull/145433
+[#145434]: https://github.com/home-assistant/core/pull/145434
+[#145435]: https://github.com/home-assistant/core/pull/145435
+[#145438]: https://github.com/home-assistant/core/pull/145438
+[#145440]: https://github.com/home-assistant/core/pull/145440
+[#145447]: https://github.com/home-assistant/core/pull/145447
+[#145448]: https://github.com/home-assistant/core/pull/145448
+[#145449]: https://github.com/home-assistant/core/pull/145449
+[#145455]: https://github.com/home-assistant/core/pull/145455
+[#145456]: https://github.com/home-assistant/core/pull/145456
+[#145458]: https://github.com/home-assistant/core/pull/145458
+[#145462]: https://github.com/home-assistant/core/pull/145462
+[#145463]: https://github.com/home-assistant/core/pull/145463
+[#145465]: https://github.com/home-assistant/core/pull/145465
+[#145466]: https://github.com/home-assistant/core/pull/145466
+[#145468]: https://github.com/home-assistant/core/pull/145468
+[#145469]: https://github.com/home-assistant/core/pull/145469
+[#145477]: https://github.com/home-assistant/core/pull/145477
+[#145490]: https://github.com/home-assistant/core/pull/145490
+[#145494]: https://github.com/home-assistant/core/pull/145494
+[#145499]: https://github.com/home-assistant/core/pull/145499
+[#145505]: https://github.com/home-assistant/core/pull/145505
+[#145506]: https://github.com/home-assistant/core/pull/145506
+[#145507]: https://github.com/home-assistant/core/pull/145507
+[#145510]: https://github.com/home-assistant/core/pull/145510
+[#145513]: https://github.com/home-assistant/core/pull/145513
+[#145514]: https://github.com/home-assistant/core/pull/145514
+[#145517]: https://github.com/home-assistant/core/pull/145517
+[#145518]: https://github.com/home-assistant/core/pull/145518
+[#145519]: https://github.com/home-assistant/core/pull/145519
+[#145520]: https://github.com/home-assistant/core/pull/145520
+[#145522]: https://github.com/home-assistant/core/pull/145522
+[#145529]: https://github.com/home-assistant/core/pull/145529
+[#145532]: https://github.com/home-assistant/core/pull/145532
+[#145535]: https://github.com/home-assistant/core/pull/145535
+[#145537]: https://github.com/home-assistant/core/pull/145537
+[#145540]: https://github.com/home-assistant/core/pull/145540
+[#145542]: https://github.com/home-assistant/core/pull/145542
+[#145546]: https://github.com/home-assistant/core/pull/145546
+[#145550]: https://github.com/home-assistant/core/pull/145550
+[#145559]: https://github.com/home-assistant/core/pull/145559
+[#145560]: https://github.com/home-assistant/core/pull/145560
+[#145562]: https://github.com/home-assistant/core/pull/145562
+[#145563]: https://github.com/home-assistant/core/pull/145563
+[#145565]: https://github.com/home-assistant/core/pull/145565
+[#145569]: https://github.com/home-assistant/core/pull/145569
+[#145570]: https://github.com/home-assistant/core/pull/145570
+[#145573]: https://github.com/home-assistant/core/pull/145573
+[#145576]: https://github.com/home-assistant/core/pull/145576
+[#145579]: https://github.com/home-assistant/core/pull/145579
+[#145583]: https://github.com/home-assistant/core/pull/145583
+[#145587]: https://github.com/home-assistant/core/pull/145587
+[#145590]: https://github.com/home-assistant/core/pull/145590
+[#145595]: https://github.com/home-assistant/core/pull/145595
+[#145596]: https://github.com/home-assistant/core/pull/145596
+[#145597]: https://github.com/home-assistant/core/pull/145597
+[#145598]: https://github.com/home-assistant/core/pull/145598
+[#145600]: https://github.com/home-assistant/core/pull/145600
+[#145605]: https://github.com/home-assistant/core/pull/145605
+[#145608]: https://github.com/home-assistant/core/pull/145608
+[#145610]: https://github.com/home-assistant/core/pull/145610
+[@Arnie97]: https://github.com/Arnie97
+[@Bre77]: https://github.com/Bre77
+[@DeerMaximum]: https://github.com/DeerMaximum
+[@Diegorro98]: https://github.com/Diegorro98
+[@DioSWolF]: https://github.com/DioSWolF
+[@Djelibeybi]: https://github.com/Djelibeybi
+[@Ernst79]: https://github.com/Ernst79
+[@Gigatrappeur]: https://github.com/Gigatrappeur
+[@Hypfer]: https://github.com/Hypfer
+[@IvanLH]: https://github.com/IvanLH
+[@LG-ThinQ-Integration]: https://github.com/LG-ThinQ-Integration
+[@LaStrada]: https://github.com/LaStrada
+[@Lash-L]: https://github.com/Lash-L
+[@LazyTarget]: https://github.com/LazyTarget
+[@Lektrico]: https://github.com/Lektrico
+[@LouisChrist]: https://github.com/LouisChrist
+[@MartinHjelmare]: https://github.com/MartinHjelmare
+[@MindFreeze]: https://github.com/MindFreeze
+[@NickKoepr]: https://github.com/NickKoepr
+[@NoRi2909]: https://github.com/NoRi2909
+[@Passific]: https://github.com/Passific
+[@PeteRager]: https://github.com/PeteRager
+[@Petro31]: https://github.com/Petro31
+[@RaHehl]: https://github.com/RaHehl
+[@RenierM26]: https://github.com/RenierM26
+[@RobBie1221]: https://github.com/RobBie1221
+[@Schlauer-Hax]: https://github.com/Schlauer-Hax
+[@Shulyaka]: https://github.com/Shulyaka
+[@Shutgun]: https://github.com/Shutgun
+[@Swamp-Ig]: https://github.com/Swamp-Ig
+[@Taraman17]: https://github.com/Taraman17
+[@TheJulianJES]: https://github.com/TheJulianJES
+[@Thomas55555]: https://github.com/Thomas55555
+[@VandeurenGlenn]: https://github.com/VandeurenGlenn
+[@XiaoXianNv-boot]: https://github.com/XiaoXianNv-boot
+[@abmantis]: https://github.com/abmantis
+[@agorecki]: https://github.com/agorecki
+[@alengwenus]: https://github.com/alengwenus
+[@alexandrecuer]: https://github.com/alexandrecuer
+[@alistair23]: https://github.com/alistair23
+[@allenporter]: https://github.com/allenporter
+[@astrandb]: https://github.com/astrandb
+[@aturri]: https://github.com/aturri
+[@autinerd]: https://github.com/autinerd
+[@avee87]: https://github.com/avee87
+[@balloob]: https://github.com/balloob
+[@bdraco]: https://github.com/bdraco
+[@bieniu]: https://github.com/bieniu
+[@bouwew]: https://github.com/bouwew
+[@bramkragten]: https://github.com/bramkragten
+[@brg468]: https://github.com/brg468
+[@c0ffeeca7]: https://github.com/c0ffeeca7
+[@cdce8p]: https://github.com/cdce8p
+[@cdnninja]: https://github.com/cdnninja
+[@chemelli74]: https://github.com/chemelli74
+[@dalanmiller]: https://github.com/dalanmiller
+[@danielvandenberg95]: https://github.com/danielvandenberg95
+[@davidrapan]: https://github.com/davidrapan
+[@edenhaus]: https://github.com/edenhaus
+[@elmurato]: https://github.com/elmurato
+[@emontnemery]: https://github.com/emontnemery
+[@epenet]: https://github.com/epenet
+[@erwindouna]: https://github.com/erwindouna
+[@exciton]: https://github.com/exciton
+[@farmio]: https://github.com/farmio
+[@frenck]: https://github.com/frenck
+[@fvgarrel]: https://github.com/fvgarrel
+[@generically-named]: https://github.com/generically-named
+[@gjohansson-ST]: https://github.com/gjohansson-ST
+[@iMicknl]: https://github.com/iMicknl
+[@ichbinsteffen]: https://github.com/ichbinsteffen
+[@javicalle]: https://github.com/javicalle
+[@jb101010-2]: https://github.com/jb101010-2
+[@jbouwh]: https://github.com/jbouwh
+[@jesserockz]: https://github.com/jesserockz
+[@joostlek]: https://github.com/joostlek
+[@jorisdrenth]: https://github.com/jorisdrenth
+[@jrhillery]: https://github.com/jrhillery
+[@jvmahon]: https://github.com/jvmahon
+[@jz-v]: https://github.com/jz-v
+[@karwosts]: https://github.com/karwosts
+[@lanthaler]: https://github.com/lanthaler
+[@lboue]: https://github.com/lboue
+[@lodesmets]: https://github.com/lodesmets
+[@ludeeus]: https://github.com/ludeeus
+[@marc7s]: https://github.com/marc7s
+[@markhannon]: https://github.com/markhannon
+[@matrixd2]: https://github.com/matrixd2
+[@mback2k]: https://github.com/mback2k
+[@mhannon11]: https://github.com/mhannon11
+[@mib1185]: https://github.com/mib1185
+[@mj23000]: https://github.com/mj23000
+[@mrueg]: https://github.com/mrueg
+[@ol-iver]: https://github.com/ol-iver
+[@pantherale0]: https://github.com/pantherale0
+[@peteS-UK]: https://github.com/peteS-UK
+[@pssc]: https://github.com/pssc
+[@sanjay900]: https://github.com/sanjay900
+[@scop]: https://github.com/scop
+[@silamon]: https://github.com/silamon
+[@starkillerOG]: https://github.com/starkillerOG
+[@tamwahba]: https://github.com/tamwahba
+[@tdfountain]: https://github.com/tdfountain
+[@tedvdb]: https://github.com/tedvdb
+[@thecode]: https://github.com/thecode
+[@tl-sl]: https://github.com/tl-sl
+[@tr4nt0r]: https://github.com/tr4nt0r
+[@tronikos]: https://github.com/tronikos
+[@tsvi]: https://github.com/tsvi
+[@tyriis]: https://github.com/tyriis
+[@ucodery]: https://github.com/ucodery
+[@wilbiev]: https://github.com/wilbiev
+[@wittypluck]: https://github.com/wittypluck
+[@wuede]: https://github.com/wuede
+[@yuxincs]: https://github.com/yuxincs
+[@zerzhang]: https://github.com/zerzhang
+[@zweckj]: https://github.com/zweckj
diff --git a/source/changelogs/core-2025.7.markdown b/source/changelogs/core-2025.7.markdown
new file mode 100644
index 00000000000..ef2faabf63f
--- /dev/null
+++ b/source/changelogs/core-2025.7.markdown
@@ -0,0 +1,1195 @@
+---
+title: Full changelog for Home Assistant 2025.7
+description: Detailed changelog for the Home Assistant 2025.7 release
+replace_regex: \s\(\[?[a-z0-9\-\s_]+\]?\)$
+---
+
+These are all the changes included in the Home Assistant 2025.7 release.
+
+For a summary in a more readable format:
+[Release notes blog for this release](/blog/2025/07/02/release-20257/).
+
+## All changes
+
+- Add update platform to paperless integration ([@fvgarrel] - [#145638])
+- Improve error message for global timeout ([@arturpragacz] - [#141563])
+- Test that recorder is not promoted to earlier stage in bootstrap ([@arturpragacz] - [#142695])
+- Add read_only entity_id to Trend options flow ([@karwosts] - [#145657])
+- Add async-timeout to forbidden packages ([@epenet] - [#145679])
+- Add homee siren platform ([@Taraman17] - [#145675])
+- Replace "Invalid API key" with common string in `overseerr` ([@NoRi2909] - [#145689])
+- Add check for packages restricting Python version ([@epenet] - [#145690])
+- Bump version to 2025.7.0dev0 ([@frenck] - [#145647])
+- Simplify boolean check in onewire ([@epenet] - [#145700])
+- Change text of installing and starting Z-WaveJs add-on steps ([@MindFreeze] - [#145702])
+- Improve smarla base entity ([@rlint-explicatis] - [#145710])
+- Add check for transient packages restricting Python version ([@epenet] - [#145695])
+- MELCloud remove deprecated YAML import strings ([@erwindouna] - [#145731])
+- Remove niko_home_control YAML import ([@joostlek] - [#145732])
+- Add complete intent function for shopping list component ([@Lesekater] - [#128565])
+- Revert "squeezebox Better result for testing (#144622)" ([@jbouwh] - [#145739])
+- Add DHCP discovery to LG ThinQ ([@joostlek] - [#145746])
+- Bump docker/build-push-action from 6.17.0 to 6.18.0 (@dependabot - [#145764])
+- Modernize tests for smhi ([@gjohansson-ST] - [#139334])
+- Use async_load_json_(array/object)_fixture in async test functions ([@epenet] - [#145773])
+- Remove unnecessary DOMAIN alias in components ([@epenet] - [#145791])
+- Use Platform constant in hue tests ([@epenet] - [#145798])
+- Use Platform constant in tests ([@epenet] - [#145801])
+- Use async_load_fixture in async test functions (a) ([@epenet] - [#145718])
+- Update httpcore to 1.0.9 and h11 to 0.16.0 ([@cdce8p] - [#145789])
+- Update sqlalchemy to 2.0.41 ([@cdce8p] - [#145790])
+- Add hardwired chime toggle to Reolink Battery Doorbell ([@lennartnederstigt] - [#145779])
+- Remove unnecessary DOMAIN alias in tests (a-d) ([@epenet] - [#145817])
+- Remove unnecessary DOMAIN alias in tests (e-k) ([@epenet] - [#145818])
+- Move Airthings coordinator to separate module ([@LaStrada] - [#145827])
+- Remove decora-wifi from excluded requirements ([@edenhaus] - [#145832])
+- Remove default args to ESPHome test fixture calls ([@bdraco] - [#145840])
+- Ensure Reolink host device is setup first ([@starkillerOG] - [#145843])
+- Minor cleanup of Zimi Integration ([@markhannon] - [#144293])
+- Add sound pressure to Airthings ([@LaStrada] - [#145946])
+- Use async_load_fixture in async test functions (l-z) ([@epenet] - [#145717])
+- Use async_load_fixture in async test functions (b-i) ([@epenet] - [#145714])
+- Update mypy-dev to 1.17.0a2 ([@cdce8p] - [#146002])
+- Update pytest-asyncio to 1.0.0 ([@cdce8p] - [#145988])
+- Update types packages ([@cdce8p] - [#145993])
+- Update syrupy to 4.9.1 ([@cdce8p] - [#145992])
+- Update pytest-xdist to 3.7.0 ([@cdce8p] - [#145991])
+- Update pytest-timeout to 2.4.0 ([@cdce8p] - [#145990])
+- Update numpy to 2.2.6 ([@cdce8p] - [#145981])
+- Update pytest-cov to 6.1.1 ([@cdce8p] - [#145989])
+- Update coverage to 7.8.2 ([@cdce8p] - [#145983])
+- Update aiohttp-cors to 0.8.1 ([@cdce8p] - [#145976])
+- Update cryptography to 45.0.3 ([@cdce8p] - [#145979])
+- Update bcrypt to 4.3.0 ([@cdce8p] - [#145978])
+- Update attrs to 25.3.0 ([@cdce8p] - [#145977])
+- Update PyTurboJPEG to 1.8.0 ([@cdce8p] - [#145984])
+- Update pydantic to 2.11.5 ([@cdce8p] - [#145985])
+- Remove unnecessary DOMAIN alias in tests (s-z) ([@epenet] - [#146010])
+- Add config flow for telegram bot integration ([@hanwg] - [#144617])
+- Remove unnecessary DOMAIN alias in tests (l-r) ([@epenet] - [#146009])
+- Use async_load_fixture in netatmo tests ([@epenet] - [#146013])
+- Use async_load_fixture in moehlenhoff_alpha2 tests ([@epenet] - [#146012])
+- Bump dawidd6/action-download-artifact from 9 to 10 (@dependabot - [#146015])
+- Use async_load_fixture in twitch tests ([@epenet] - [#146016])
+- Update freezegun to 1.5.2 ([@cdce8p] - [#145982])
+- Update pre-commit to 4.2.0 ([@cdce8p] - [#145986])
+- Submit legacy integrations for analytics ([@ludeeus] - [#145787])
+- Make sun `solar_rising` a binary_sensor ([@karwosts] - [#140956])
+- Avoid constant alias for integration DOMAIN ([@epenet] - [#145788])
+- Bump pysmlight to 0.2.6 ([@tl-sl] - [#146039])
+- Remove NMBS YAML import ([@joostlek] - [#145733])
+- Add diagnostics tests for Sonos ([@PeteRager] - [#146040])
+- Small nmbs sensor attributes refactoring ([@silamon] - [#145956])
+- Update ruff to 0.11.12 ([@cdce8p] - [#146037])
+- Update pytest warnings filter ([@cdce8p] - [#146024])
+- Move async_setup_services to async_setup ([@chemelli74] - [#146048])
+- Update yamllint to 1.37.1 ([@cdce8p] - [#146038])
+- Add awesomeversion to dependency version checks ([@epenet] - [#146047])
+- Update pyoverkiz to 1.17.2 ([@cdce8p] - [#146056])
+- Update aiohomekit to 3.2.15 ([@cdce8p] - [#146059])
+- Rename mispelled services python files ([@chemelli74] - [#146049])
+- Avoid services unload for Isy994 ([@chemelli74] - [#146069])
+- Bump aiohttp to 3.12.7 ([@bdraco] - [#146028])
+- Bump ollama to 0.5.1 ([@ViViDboarder] - [#146063])
+- Update typing-extensions to 4.14.0 ([@cdce8p] - [#146054])
+- Update python-homewizard-energy to 8.3.3 ([@cdce8p] - [#146076])
+- Update pyatmo to 9.2.1 ([@cdce8p] - [#146077])
+- Move async_register_services to async_setup ([@epenet] - [#146092])
+- Bump aiokem to 1.0.1 ([@PeteRager] - [#146085])
+- Add energy sensor to adax ([@parholmdahl] - [#145995])
+- Move service registration to async_setup in icloud ([@epenet] - [#146095])
+- Move services to separate module in insteon ([@epenet] - [#146094])
+- Move services to separate module in nzbget ([@epenet] - [#146093])
+- Use async_load_fixture in skybell tests ([@epenet] - [#146017])
+- Use async_load_fixture in remaining tests ([@epenet] - [#146021])
+- Use async_load_fixture in tplink_omada tests ([@epenet] - [#146014])
+- Avoid services unload for Homematicip Cloud ([@chemelli74] - [#146050])
+- Use async_load_fixture in youtube tests ([@epenet] - [#146018])
+- Add exception translations for KNX services ([@farmio] - [#146104])
+- Smarla integration improve tests ([@rlint-explicatis] - [#145803])
+- Add `required_features` to WaterHeater entity service registrations ([@zxdavb] - [#141873])
+- Replace "numbers" with "digits" in `invalid_backbone_key` message of `knx` ([@NoRi2909] - [#146124])
+- Add config option for controlling Ollama think parameter ([@ViViDboarder] - [#146000])
+- Update pytest to 8.4.0 ([@cdce8p] - [#146114])
+- Bump github/codeql-action from 3.28.18 to 3.28.19 (@dependabot - [#146131])
+- Bump pyvera to 0.3.16 ([@maximvelichko] - [#146089])
+- Bump pymodbus to 3.9.2 ([@crug80] - [#145948])
+- Add homee reconfiguration flow ([@Taraman17] - [#146065])
+- Matter Extractor hood fixture ([@lboue] - [#146174])
+- Move matrix services to separate module ([@epenet] - [#146161])
+- Move zoneminder services to separate module ([@epenet] - [#146151])
+- Bump python-bsblan to version 2.0.1 ([@liudger] - [#146198])
+- Move ffmpeg services to separate module ([@epenet] - [#146149])
+- Update pandas to 2.3.0 ([@cdce8p] - [#146206])
+- Move amcrest services to separate module ([@epenet] - [#146144])
+- Move google_sheets services to separate module ([@epenet] - [#146160])
+- Bump switchbot-api to 2.5.0 ([@XiaoLing-git] - [#146205])
+- Matter add Service Area Cluster to vacuum_cleaner fixture ([@lboue] - [#145743])
+- Move services to separate module in opentherm_gw ([@epenet] - [#146098])
+- Bump pyswitchbot to 0.65.0 ([@zerzhang] - [#146133])
+- Move elkm1 services to separate module ([@epenet] - [#146147])
+- Bump aioairq to v0.4.6 ([@Sibgatulin] - [#146169])
+- Rename service registration method ([@epenet] - [#146236])
+- Tweak zwave_js service registration ([@epenet] - [#146244])
+- Move abode services to separate module ([@epenet] - [#146142])
+- Fix unit test for switchbot integration ([@zerzhang] - [#146247])
+- Smarla integration number platform ([@rlint-explicatis] - [#145747])
+- Handle error in setup_entry for Telegram Bot ([@hanwg] - [#146242])
+- Update python-bsblan requirement to version 2.1.0 ([@liudger] - [#146253])
+- Change default range sensors in Teslemetry ([@Bre77] - [#146268])
+- Add bronze quality scale for Telegram bot integration ([@hanwg] - [#146148])
+- Update airtouch5py to 0.3.0 ([@cdce8p] - [#146278])
+- Migrate Enphase envoy from httpx to aiohttp ([@catsmanac] - [#146283])
+- Update numpy to 2.3.0 ([@cdce8p] - [#146296])
+- Migrate onvif to use onvif-zeep-async 4.0.1 with aiohttp ([@bdraco] - [#146297])
+- Migrate rest to use aiohttp ([@bdraco] - [#146306])
+- Add additional package version range checks ([@cdce8p] - [#146299])
+- Fix typo in Utility Meter always_available ([@tronikos] - [#146320])
+- Add tests for sonos switch alarms on and off ([@PeteRager] - [#146314])
+- DNSIP: Add literal to querytype ([@mikey0000] - [#146367])
+- Add Homee diagnostics platform ([@Taraman17] - [#146340])
+- Test all device classes in Sensor device condition/trigger tests ([@abmantis] - [#146366])
+- Bug fix for Telegram bot integration: handle last message id ([@hanwg] - [#146378])
+- Basic entity class for Imeon inverter integration ([@Imeon-Energy] - [#145778])
+- Fix minor docstring typos in jellyfin component media_source.py ([@willschlitzer] - [#146398])
+- Move google assistant sdk services to separate module ([@epenet] - [#146434])
+- Migrate cloudflare to use runtime data ([@epenet] - [#146429])
+- Bump pyswitchbot to 0.66.0 ([@zerzhang] - [#146430])
+- Restore user customizations of deleted devices ([@emontnemery] - [#145191])
+- Restore entity ID and user customizations of deleted entities ([@emontnemery] - [#145278])
+- Use async_load_fixture in modern_forms tests ([@epenet] - [#146011])
+- Remove `__all__` from switch_as_x ([@joostlek] - [#146331])
+- Update aiomealie to 0.9.6 ([@cdce8p] - [#146447])
+- Add requests to hassfest requirements check ([@cdce8p] - [#146446])
+- Fix RuntimeWarning in rest tests ([@cdce8p] - [#146452])
+- Update awesomeversion to 25.5.0 ([@cdce8p] - [#146032])
+- Fix typo in overseerr component docstring ([@willschlitzer] - [#146457])
+- Bug fix for Telegram bot integration: fix async_unload_entry error for polling bot ([@hanwg] - [#146277])
+- Assist Pipeline: Intent progress event when we start streaming ([@balloob] - [#146388])
+- Fix Telegram bot leave_chat service action ([@hanwg] - [#146139])
+- Add tests for initial state of OpenUV sensors ([@wbyoung] - [#146464])
+- Add support for HeatIt Thermostat TF056 to homee ([@Taraman17] - [#145515])
+- Add Telegram bot webhooks tests ([@hanwg] - [#146436])
+- Improve support for trigger platforms with multiple triggers ([@emontnemery] - [#144827])
+- Fix typo in hassio ([@joostlek] - [#146474])
+- Drop deprecated add_event service in google ([@epenet] - [#146432])
+- Update pywizlight to 0.6.3 ([@arturpragacz] - [#146490])
+- Add service validation for send file for Telegram bot integration ([@hanwg] - [#146192])
+- Create a deprecation/repair for `sensor.sun_solar_rising` ([@karwosts] - [#146462])
+- Bump sensorpush-api to 2.1.3 ([@epenet] - [#146514])
+- Bump weheat to 2025.6.10 ([@epenet] - [#146515])
+- Bump pybotvac to 0.0.28 ([@epenet] - [#146513])
+- Correct misleading comment for const.ATTR_RESTORED ([@emontnemery] - [#146528])
+- Adjust urllib3 constraint ([@epenet] - [#145485])
+- Add duplicate issue detection using GitHub AI models ([@frenck] - [#146487])
+- Update pytest-unordered to 0.7.0 ([@cdce8p] - [#146545])
+- Update types packages ([@cdce8p] - [#146546])
+- Bug fix for Telegram bot integration: Handle plain text parse_mode ([@hanwg] - [#146535])
+- Simplify blink service actions ([@epenet] - [#146508])
+- Move available property to entity.py for Squeezebox ([@peteS-UK] - [#146531])
+- Simplify fully_kiosk service actions ([@epenet] - [#146509])
+- Remove previously deprecated StrEnum backport ([@gjohansson-ST] - [#146477])
+- Add non-English issue detection using GitHub AI models ([@frenck] - [#146547])
+- Remove unused attribute EntityInfo.custom_component ([@emontnemery] - [#146550])
+- Simplify google_mail service actions ([@epenet] - [#146511])
+- Remove previously deprecated cached_property ([@gjohansson-ST] - [#146478])
+- Add support for more cover devices in Fibaro ([@rappenze] - [#146486])
+- New helper for templating args in command_line ([@gjohansson-ST] - [#145899])
+- Simplify service registration in recorder ([@epenet] - [#146237])
+- Set suggested precision for Airthings sensors ([@LaStrada] - [#145966])
+- Bump hyperion-py to 0.7.6 and add switch for Audio Capture to Hyperion Integration ([@ToniCipriani] - [#145952])
+- Separate steps for openai_conversation options flow ([@Shulyaka] - [#141533])
+- Add 'AdvancedToggle' to list of supported Lutron button types ([@christopherboyd] - [#145676])
+- Support more dimmer devices in fibaro ([@rappenze] - [#145864])
+- Add strings for pick implementation ([@Thomas55555] - [#146557])
+- Not valid hvac modes now fails in Climate ([@gjohansson-ST] - [#145242])
+- Simplify synology_dsm service actions ([@epenet] - [#146612])
+- Remove deprecated service in plex ([@epenet] - [#146608])
+- Mark async_setup_services as callback ([@epenet] - [#146617])
+- Simplify overseerr service actions ([@epenet] - [#146607])
+- Simplify mealie service actions ([@epenet] - [#146601])
+- Improve type hints in xiaomi_miio fan ([@epenet] - [#146596])
+- Make duplicate issue detection more strict ([@frenck] - [#146633])
+- Simplify tado service actions ([@epenet] - [#146614])
+- Simplify seventeentrack service actions ([@epenet] - [#146610])
+- Simplify screenlogic service actions ([@epenet] - [#146609])
+- Simplify netgear_lte service actions ([@epenet] - [#146606])
+- Update Sonos to use SonosConfigEntry and runtime data ([@PeteRager] - [#145512])
+- Bump github/codeql-action from 3.28.19 to 3.29.0 (@dependabot - [#146595])
+- Bump actions/attest-build-provenance from 2.3.0 to 2.4.0 (@dependabot - [#146594])
+- Simplify swiss public transport service actions ([@epenet] - [#146611])
+- Add basic xiaomi_miio fan tests ([@epenet] - [#146593])
+- Reolink add diagnostics for baichuan ([@starkillerOG] - [#146667])
+- Tweak non-English issue detection ([@frenck] - [#146636])
+- Add model_id to Reolink IPC camera ([@starkillerOG] - [#146664])
+- Reolink check if camera and motion supported ([@starkillerOG] - [#146666])
+- Add missing mock value to Reolink test ([@abmantis] - [#146689])
+- Replace unnecessary pydantic import in matrix tests ([@cdce8p] - [#146693])
+- Remove unnecessary patch from panel_custom tests ([@cdce8p] - [#146695])
+- Add myself as a remote calendar code owner ([@allenporter] - [#146703])
+- Add Reolink IR brightness entity ([@starkillerOG] - [#146717])
+- Fix asuswrt test patch ([@cdce8p] - [#146692])
+- Remove unnecessary patch from toon tests ([@cdce8p] - [#146691])
+- Adjust core create_task tests with event_loop patch ([@cdce8p] - [#146699])
+- Add callback decorator to async_setup_services ([@epenet] - [#146729])
+- Fix androidtv isfile patcher in tests ([@cdce8p] - [#146696])
+- Clean up Ollama conversation entity ([@balloob] - [#146738])
+- Clean up Anthropic conversation entity ([@balloob] - [#146737])
+- Clean up Google conversation entity ([@balloob] - [#146736])
+- Simplify reolink service actions ([@epenet] - [#146751])
+- Use ConfigEntry.runtime_data to store runtime data in NINA ([@DeerMaximum] - [#146754])
+- Update pydantic to 2.11.6 ([@cdce8p] - [#146745])
+- Bumb python-homewizard-energy to 9.1.1 ([@DCSBL] - [#146723])
+- Remove unnecessary string formatting. ([@balloob] - [#146762])
+- Bump nextbus client to 2.3.0 ([@ViViDboarder] - [#146780])
+- Add Reolink baby cry sensitivity ([@starkillerOG] - [#146773])
+- Adjust scripts for compatibility with Python 3.14 ([@cdce8p] - [#146774])
+- Simplify google_photos service actions ([@epenet] - [#146744])
+- Drop user prompt from LLMContext ([@balloob] - [#146787])
+- Bump tesla-fleet-api to 1.1.3 ([@Bre77] - [#146793])
+- Add polling to LetPot coordinator ([@jpelgrom] - [#146823])
+- Improve code quality in async_setup_entry of switches in homematicip_cloud ([@hahn-th] - [#146816])
+- Update pydantic to 2.11.7 ([@cdce8p] - [#146835])
+- Extract Google LLM base entity class ([@balloob] - [#146817])
+- Add support for Gemini's new TTS capabilities ([@lanthaler] - [#145872])
+- Update eq3btsmart to 2.1.0 ([@cdce8p] - [#146335])
+- Fix telegram_bot RuntimeWarning in tests ([@cdce8p] - [#146781])
+- Homee add button_state to event entities ([@Taraman17] - [#146860])
+- Bump pylitterbot to 2024.2.0 ([@natekspencer] - [#146901])
+- Simplify ChatLog dependencies ([@balloob] - [#146351])
+- Move Google Gen AI fixture to allow reuse ([@balloob] - [#146921])
+- Add sensor categorizations for APCUPSD ([@yuxincs] - [#146863])
+- Bump tesla-fleet-api to match Protobuf compatibility ([@Bre77] - [#146918])
+- Bump python-rflink to 0.0.67 ([@mbo18] - [#146908])
+- Bump dawidd6/action-download-artifact from 10 to 11 (@dependabot - [#146928])
+- Bump nessclient to 1.2.0 ([@epenet] - [#146937])
+- Significantly improve Tesla Fleet config flow ([@Bre77] - [#146794])
+- Bump pymysensors to 0.25.0 ([@epenet] - [#146941])
+- Bump pyosoenergyapi to 1.1.5 ([@epenet] - [#146942])
+- Bump pysml to 0.1.5 ([@epenet] - [#146935])
+- Re-enable v2 API support for HomeWizard P1 Meter ([@DCSBL] - [#146927])
+- Change `PARALLEL_UPDATES` to `0` for read-only NextDNS platforms ([@bieniu] - [#146939])
+- Add verify ssl option to paperless-ngx integration ([@fvgarrel] - [#146802])
+- Set goalzero total run time sensor device class to duration ([@natekspencer] - [#146897])
+- Simplify habitica service actions ([@epenet] - [#146746])
+- Add Reolink privacy mask switch ([@starkillerOG] - [#146906])
+- Move Meater coordinator to module ([@joostlek] - [#146946])
+- Add duration device class in Here Travel Time sensors ([@etiennec78] - [#146804])
+- Add config flow data description for NextDNS ([@bieniu] - [#146938])
+- Improve Meater config flow tests ([@joostlek] - [#146951])
+- Add Telegram Bot message reactions ([@aviadlevy] - [#146354])
+- Add Meater sensor tests ([@joostlek] - [#146952])
+- Use entity base class for NextDNS entities ([@bieniu] - [#146934])
+- Use runtime data in Meater ([@joostlek] - [#146961])
+- Create entities directly on setup in Meater ([@joostlek] - [#146953])
+- Add switch for Samsung ice bites (and rename ice maker) ([@mswilson] - [#146925])
+- Make Meater cook state an enum ([@joostlek] - [#146958])
+- Add diagnostics support to Meater ([@joostlek] - [#146967])
+- Use non-autospec mock for Reolink's button tests ([@abmantis] - [#146969])
+- Record current IQS state for Home Connect ([@Diegorro98] - [#131703])
+- Fix translation key in NextDNS integration ([@bieniu] - [#146976])
+- Removed rounding of durations in Here Travel Time sensors ([@etiennec78] - [#146838])
+- Set Matter SolarPower tagList in fixture ([@lboue] - [#146837])
+- Rename Xiaomi Miio integration to Xiaomi Home ([@tr4nt0r] - [#146555])
+- Bump aioautomower to 2025.6.0 ([@Thomas55555] - [#146979])
+- Improve bootstrap file logging test ([@abmantis] - [#146670])
+- Remove deprecated support feature values in vacuum ([@gjohansson-ST] - [#146982])
+- Remove deprecated support feature values in media_player ([@gjohansson-ST] - [#146986])
+- Remove deprecated support feature values in cover ([@gjohansson-ST] - [#146987])
+- Address late review for NextDNS integration ([@bieniu] - [#146980])
+- Bump pysmarlaapi version to 0.9.0 ([@rlint-explicatis] - [#146629])
+- Bump nextcord to 3.1.0 ([@joostlek] - [#147020])
+- Bump aiorussound to 4.6.0 ([@noahhusby] - [#147023])
+- Add TTS response timeout for idle state ([@synesthesiam] - [#146984])
+- Fix flaky Reolink webhook test ([@abmantis] - [#147036])
+- Remove not used constant in climate ([@gjohansson-ST] - [#147041])
+- Add _attr_has_entity_name to devolo Home Network device tracker platform ([@Shutgun] - [#146978])
+- Set quality scale at Home Connect manifest ([@Diegorro98] - [#147050])
+- Capitalize "Ice Bites" and switch to "Cubed ice" (#147060) ([@mswilson] - [#147061])
+- Bump aiowebdav2 to 0.4.6 ([@jpbede] - [#147054])
+- If no Reolink HTTP api available, do not set configuration_url ([@starkillerOG] - [#146684])
+- Remove internals from Sonos test_init.py ([@PeteRager] - [#147063])
+- Use missed typed ConfigEntry in devolo Home Control ([@Shutgun] - [#147049])
+- Fix typo in state name references of `homee` ([@NoRi2909] - [#146905])
+- Cleanup devolo Home Control tests ([@Shutgun] - [#147051])
+- Bump hass-nabucasa from 0.101.0 to 0.102.0 ([@ludeeus] - [#147087])
+- Ensure mqtt sensor has a valid native unit of measurement ([@jbouwh] - [#146722])
+- Support variables, icon, and picture for all compatible template platforms ([@Petro31] - [#145893])
+- tts_output is optional in run-start ([@synesthesiam] - [#147092])
+- Use non-autospec mock for Reolink's init tests ([@abmantis] - [#146991])
+- Minor improvements of service helper ([@emontnemery] - [#147079])
+- Send intent progress events to ESPHome ([@synesthesiam] - [#146966])
+- Use non-autospec mock for Reolink's binary_sensor, camera and diag tests ([@abmantis] - [#147095])
+- Fix nightly build ([@silamon] - [#147110])
+- Bump ovoenergy to 2.0.1 ([@epenet] - [#147112])
+- update pyHomee to v1.2.9 ([@Taraman17] - [#147094])
+- Adjust feature request links in issue reporting ([@frenck] - [#147130])
+- Fix pylint plugin for vacuum entity ([@gjohansson-ST] - [#146467])
+- Re-raise annotated_yaml.YAMLException as HomeAssistantError ([@emontnemery] - [#147129])
+- Add comment in helpers.llm.ActionTool explaining limitations ([@emontnemery] - [#147116])
+- Update pytest warnings filter ([@cdce8p] - [#147132])
+- Deprecated hass.http.register_static_path now raises error ([@gjohansson-ST] - [#147039])
+- Add missing hyphen to "mains-powered" and "battery-powered" in `zha` ([@NoRi2909] - [#147128])
+- Expose statistics selector, use for `recorder.get_statistics` ([@karwosts] - [#147056])
+- Use PEP 695 TypeVar syntax for paperless_ngx ([@cdce8p] - [#147156])
+- Use PEP 695 TypeVar syntax for eheimdigital ([@cdce8p] - [#147154])
+- Use PEP 695 TypeVar syntax for nextdns ([@cdce8p] - [#147155])
+- Update ruff to 0.12.0 ([@cdce8p] - [#147106])
+- Add ask_question action to Assist satellite ([@synesthesiam] - [#145233])
+- Fix Z-Wave device class endpoint discovery ([@MartinHjelmare] - [#142171])
+- Migrate justnimbus to use runtime_data ([@epenet] - [#147170])
+- fix and improve cover tests for homee ([@Taraman17] - [#147164])
+- remove unwanted attribute in homee sensor tests ([@Taraman17] - [#147158])
+- Bump hass-nabucasa from 0.102.0 to 0.103.0 ([@klejejs] - [#147186])
+- Move kmtronic coordinator to separate module ([@epenet] - [#147182])
+- Simplify remove listener in kodi ([@epenet] - [#147183])
+- Migrate keymitt_ble to use runtime_data ([@epenet] - [#147179])
+- Migrate kostal_plenticore to use runtime_data ([@epenet] - [#147188])
+- Migrate kegtron to use runtime_data ([@epenet] - [#147177])
+- Simplify update_listener in kmtronic ([@epenet] - [#147184])
+- Simplify update_listener in keenetic_ndms2 ([@epenet] - [#147173])
+- Bump pypck to 0.8.9 ([@alengwenus] - [#147174])
+- Simplify update_listener in konnected ([@epenet] - [#147172])
+- Move juicenet coordinator to separate module ([@epenet] - [#147168])
+- Add support of taking a camera snapshot via go2rtc ([@edenhaus] - [#145205])
+- Migrate kodi to use runtime_data ([@epenet] - [#147191])
+- Use PEP 695 TypeVar syntax for ecovacs ([@cdce8p] - [#147153])
+- Migrate kmtronic to use runtime_data ([@epenet] - [#147193])
+- Migrate lacrosse_view to use runtime_data ([@epenet] - [#147202])
+- Migrate keenetic_ndms2 to use runtime_data ([@epenet] - [#147194])
+- Migrate kaleidescape to use runtime_data ([@epenet] - [#147171])
+- Migrate lutron to use runtime_data ([@epenet] - [#147198])
+- Improve test-coverage for homee locks ([@Taraman17] - [#147160])
+- Implement battery group mode in HomeWizard ([@DCSBL] - [#146770])
+- Bump here-routing to 1.2.0 ([@eifinger] - [#147204])
+- Add translations for devolo Home Control exceptions ([@Shutgun] - [#147099])
+- Add sub-device support to Russound RIO ([@noahhusby] - [#146763])
+- AI Task integration ([@balloob] - [#145128])
+- Bump zwave-js-server-python to 0.64.0 ([@MindFreeze] - [#147176])
+- Use entity name in homee ([@Taraman17] - [#147142])
+- Minor clean up missed in previous PR ([@synesthesiam] - [#147229])
+- Add reconfigure flow to ntfy integration ([@tr4nt0r] - [#143743])
+- Bump aiohomeconnect to 0.18.1 ([@Diegorro98] - [#147236])
+- Use string instead of boolean for voice event ([@synesthesiam] - [#147244])
+- Bump aiorussound to 4.6.1 ([@noahhusby] - [#147233])
+- Change async_supports_streaming_input to an instance method ([@synesthesiam] - [#147245])
+- Bump pyHomee to version 1.2.10 ([@Taraman17] - [#147248])
+- Fix Telegram bot parsing of inline keyboard ([@hanwg] - [#146376])
+- Bump pyseventeentrack to 1.1.1 ([@shaiu] - [#147253])
+- Battery voltage translation key ([@lboue] - [#147238])
+- Remove deprecated support feature values in camera ([@gjohansson-ST] - [#146988])
+- Bump aioimmich to 0.10.1 ([@mib1185] - [#147293])
+- Add update entity to immich integration ([@mib1185] - [#147273])
+- Fix regex patterns in foobot sensor tests ([@mib1185] - [#147306])
+- fix reconfig in case of no connection. ([@Taraman17] - [#147275])
+- Combine executor calls in devolo Home Control ([@Shutgun] - [#147216])
+- Add water filter replacement and usage sensors to SmartThings ([@mswilson] - [#147279])
+- Use has_entity_name in NINA ([@DeerMaximum] - [#146755])
+- Add sensor platform to Alexa Devices ([@chemelli74] - [#146469])
+- Add number entity to Russound RIO ([@noahhusby] - [#147228])
+- Use PEP 695 TypeVar syntax for unifi ([@cdce8p] - [#147157])
+- Migrate lastfm to use runtime_data ([@epenet] - [#147330])
+- Add switch entity to Russound RIO ([@noahhusby] - [#147323])
+- Migrate lg_netcast to use runtime_data ([@epenet] - [#147338])
+- Migrate led_ble to use runtime_data ([@epenet] - [#147337])
+- Migrate leaone to use runtime_data ([@epenet] - [#147336])
+- Migrate ld2410_ble to use runtime_data ([@epenet] - [#147335])
+- Matter dishwasher alarm ([@lboue] - [#146842])
+- Migrate laundrify to use runtime_data ([@epenet] - [#147331])
+- Fixed YoLink incorrect valve status ([@matrixd2] - [#147021])
+- Migrate landisgyr_heat_meter to use runtime_data ([@epenet] - [#147329])
+- Clean superfluous cloud deps from pyproject ([@arturpragacz] - [#147223])
+- Migrate lametric to use runtime_data ([@epenet] - [#147328])
+- Remove config flow unique_id migration from devolo Home Control ([@Shutgun] - [#147327])
+- Improve test of WS command get_services cache handling ([@emontnemery] - [#147134])
+- Migrate lcn to use runtime_data ([@epenet] - [#147333])
+- Bump IMGW-PIB backend library to version 1.1.0 ([@bieniu] - [#147341])
+- Lametric add configuration url ([@rrooggiieerr] - [#147118])
+- Add unique ID support to Trend integration YAML configuration ([@frenck] - [#147346])
+- Move lyric coordinator to separate module ([@epenet] - [#147357])
+- Bump demetriek to 1.3.0 ([@joostlek] - [#147350])
+- Matter battery storage ([@lboue] - [#147235])
+- Tilt Pi integration ([@michaelheyman] - [#139726])
+- Add trigger template alarm control panels ([@Petro31] - [#145461])
+- Add trigger based locks to template integration ([@Petro31] - [#145528])
+- Bump thinqconnect to 1.0.7 ([@LG-ThinQ-Integration] - [#147073])
+- Update bosch_alarm to platinum quality scale ([@sanjay900] - [#145027])
+- Add Altruist integration to Core ([@LoSk-p] - [#146158])
+- Address AI Task late comments ([@balloob] - [#147313])
+- Matter energy optimization opt-out attribute ([@lboue] - [#147096])
+- Bump aioesphomeapi to 3.1.1 ([@bdraco] - [#147345])
+- Replace foscam dependency ([@Foscam-wangzhengyu] - [#145766])
+- Add trigger vacuum entities to template integration ([@Petro31] - [#145534])
+- Add PARALLEL_UPDATES constant to binary_sensor and sensor for LCN ([@alengwenus] - [#147369])
+- Migrate linear_garage_door to use runtime_data ([@epenet] - [#147351])
+- Bump aiotedee to 0.2.25 ([@zweckj] - [#147349])
+- Migrate livisi to use runtime_data ([@epenet] - [#147352])
+- Add vacuum activity to pylint type hints check ([@gjohansson-ST] - [#147162])
+- Migrate lifx to use runtime_data and HassKey ([@epenet] - [#147348])
+- Add update platform to LaMetric ([@joostlek] - [#147354])
+- Default to gemini-2.5-flash ([@tronikos] - [#147334])
+- Add label_description to template engine ([@Petro31] - [#147138])
+- Add button entity to Music Assistant to add currently playing item to favorites ([@marcelveldt] - [#145626])
+- Set KNX to quality scale "silver" ([@farmio] - [#144879])
+- Add support for Reolink Floodlight PoE/WiFi ([@starkillerOG] - [#146778])
+- Add multiple cmd_id pushes for Reolink floodlight ([@starkillerOG] - [#146685])
+- Rename second Reolink lens from "autotrack" to "telephoto" ([@starkillerOG] - [#146898])
+- Add Reolink Telephoto main stream ([@starkillerOG] - [#146975])
+- Add sensors for detailed Enphase inverter readings ([@Bidski] - [#146916])
+- Add Bluetooth connection to LaMetric ([@joostlek] - [#147342])
+- Refactor DeviceAutomationConditionProtocol ([@emontnemery] - [#147377])
+- Add trigger based fan entities to template integration ([@Petro31] - [#145497])
+- Clean up start_subentry_reconfigure_flow API for tests ([@balloob] - [#147381])
+- Remove JuiceNet integration ([@epenet] - [#147206])
+- Add strict typing for Telegram bot integration ([@hanwg] - [#147262])
+- Refactor states and strings for Miele plate power steps ([@astrandb] - [#144992])
+- Optimize Enphase envoy translation strings. ([@catsmanac] - [#147389])
+- Add media class to media player search and play intent ([@balloob] - [#147097])
+- Add sensors to ntfy integration ([@tr4nt0r] - [#145262])
+- Add PlayStation Network Integration ([@JackJPowell] - [#133901])
+- Handle router initialization, connection errors, and missing interfaces in options flow ([@foxel] - [#143475])
+- Migrate Google Gen AI to use subentries ([@balloob] - [#147281])
+- Remove duplicated subentry device update in Google Gen AI + add merge test ([@balloob] - [#147396])
+- New core integration for VegeHub ([@Thulrus] - [#129598])
+- Fix unbound var and tests in PlayStation Network integration ([@tr4nt0r] - [#147398])
+- Add container arch to system info ([@agners] - [#147372])
+- Bump universal-silabs-flasher to 0.0.31 ([@puddly] - [#147393])
+- Bump intents to 2025.6.23 ([@synesthesiam] - [#147391])
+- Fix trigger config validation ([@emontnemery] - [#147408])
+- Add support for v2 API for HomeWizard kWh Meter ([@DCSBL] - [#147214])
+- Add full device snapshot tests for Shelly ([@bieniu] - [#145620])
+- Added auto-discovery configuration for SONOFF Dongle Max in zha. ([@CubeZ2mDeveloper] - [#140574])
+- Bump sigstore/cosign-installer from 3.8.2 to 3.9.0 (@dependabot - [#147072])
+- Add reauth flow to PlayStation Network integration ([@tr4nt0r] - [#147397])
+- AI task generate_text -> generate_data ([@balloob] - [#147370])
+- Add door state sensors to tedee ([@zweckj] - [#147386])
+- Add streaming support w/ audio to Android IP Webcam integration ([@regulad] - [#126009])
+- Add default to from_json ([@Petro31] - [#146211])
+- Add accept keyword to Media selector ([@balloob] - [#145527])
+- Add 'max_sub_interval' option to derivative sensor ([@karwosts] - [#125870])
+- Log LCN connection established with log level info ([@alengwenus] - [#147424])
+- Update ZwaveJS config flow strings ([@MindFreeze] - [#147421])
+- Convert Claude to use subentries ([@balloob] - [#147285])
+- Add fields and multiple support to object selector ([@piitaya] - [#147215])
+- Add range icons for wind_direction sensor device class ([@edenhaus] - [#147090])
+- Bump wyoming to 1.7.1 ([@synesthesiam] - [#147385])
+- Remove deprecated proxy params from Telegram bot integration ([@hanwg] - [#147288])
+- Update Shelly test snapshots ([@abmantis] - [#147429])
+- Add DHCP discovery to PlayStation Network integration ([@tr4nt0r] - [#147422])
+- Add device class to wind direction sensors for AEMET ([@luca-angemi] - [#147430])
+- Cleanup some duplicated code ([@karwosts] - [#147439])
+- Add total cycles sensor for Litter-Robot ([@natekspencer] - [#147435])
+- Use non-autospec mock for Reolink service tests ([@abmantis] - [#147440])
+- Add TTS streaming to Wyoming satellites ([@synesthesiam] - [#147438])
+- Support streaming TTS in wyoming ([@synesthesiam] - [#147392])
+- Use non-autospec mock for Reolink switch tests ([@abmantis] - [#147441])
+- Bump pylitterbot to 2024.2.1 ([@natekspencer] - [#147443])
+- Use newer mock in recent Reolink test ([@abmantis] - [#147448])
+- Add missing method mock to Reolink chime test ([@abmantis] - [#147447])
+- Fix nfandroidtv service notify disappears when restarting home assistant ([@sVnsation] - [#128958])
+- Migrate OpenAI to config subentries ([@balloob] - [#147282])
+- Define fields for assist ask_question action ([@piitaya] - [#147219])
+- Add type for wiz ([@balloob] - [#147454])
+- Custom sentence triggers should be marked as processed locally ([@HarvsG] - [#145704])
+- Set quality scale to 🥇 gold for ista EcoTrend integration ([@tr4nt0r] - [#143462])
+- Add quality scale bronze to SamsungTV ([@chemelli74] - [#142288])
+- Bump aioshelly to version 13.7.0 ([@bieniu] - [#147453])
+- Convert Ollama to subentries ([@balloob] - [#147286])
+- Flash ZBT-1 and Yellow firmwares from Core instead of using addons ([@puddly] - [#145019])
+- Only send ESPHome intent progress when necessary ([@synesthesiam] - [#147458])
+- Add missing config entry type for Husqvarna ([@balloob] - [#147455])
+- Fix media accept config type ([@balloob] - [#147445])
+- Move DevoloMultiLevelSwitchDeviceEntity in devolo Home Control ([@Shutgun] - [#147450])
+- Bump pyairnow to 1.3.1 ([@natepugh] - [#147388])
+- Fix errors in legacy platform in PlayStation Network integration ([@tr4nt0r] - [#147471])
+- Migrate lyric to use runtime_data ([@epenet] - [#147475])
+- Migrate lupusec to use runtime_data ([@epenet] - [#147476])
+- Move luftdaten coordinator to separate module ([@epenet] - [#147477])
+- Migrate loqed to use runtime_data ([@epenet] - [#147478])
+- Migrate luftdaten to use runtime_data ([@epenet] - [#147480])
+- Migrate local_calendar to use runtime_data ([@epenet] - [#147481])
+- Set has entity name to True in Meater ([@joostlek] - [#146954])
+- Migrate lookin to use runtime_data ([@epenet] - [#147479])
+- Refactor Meater availability ([@joostlek] - [#146956])
+- Add entity category option to entities set up via an MQTT subentry ([@jbouwh] - [#146776])
+- Add evaporative humidifier for switchbot integration ([@zerzhang] - [#146235])
+- Add more binary sensors to Alexa Devices ([@chemelli74] - [#146402])
+- Ezviz battery camera work mode ([@srescio] - [#130478])
+- Migrate Meater to use HassKey ([@joostlek] - [#147485])
+- Bump hass-nabucasa from 0.103.0 to 0.104.0 ([@ludeeus] - [#147488])
+- Add subdevices support to ESPHome ([@bdraco] - [#147343])
+- Add Home Connect DHCP information ([@Diegorro98] - [#147494])
+- Fix Google AI not using correct config options after subentries migration ([@tronikos] - [#147493])
+- Add tests for join and unjoin service calls in Sonos ([@PeteRager] - [#145602])
+- Improve Home Connect diagnostics exposing more data ([@Diegorro98] - [#147492])
+- Add quality scale for LCN ([@alengwenus] - [#147367])
+- Fix ESPHome entity_id generation if name contains unicode characters ([@g-kiss] - [#146796])
+- Bump ZHA to 0.0.61 ([@puddly] - [#147472])
+- Bump py-dormakaba-dkey to 1.0.6 ([@emontnemery] - [#147499])
+- Bump PySwitchbot to 0.67.0 ([@bdraco] - [#147503])
+- Split setup tests in devolo Home Network ([@Shutgun] - [#147498])
+- Add sensor platform to PlayStation Network ([@tr4nt0r] - [#147469])
+- Add missing reauth_confirm strings to devolo Home Control ([@Shutgun] - [#147496])
+- Fix sensor state class for fuel sensor in StarLine integration ([@Chupaka] - [#146769])
+- Add effect mode support for switchbot light ([@zerzhang] - [#147326])
+- Split models and helpers from coordinator module in AVM Fritz!Box tools ([@mib1185] - [#147412])
+- Fix operational state and vacuum state for matter vacuum ([@ocrease] - [#147466])
+- Add cover platform to Qbus integration ([@thomasddn] - [#147420])
+- Fix API POST endpoints json parsing error-handling ([@GrandMoff100] - [#134326])
+- Add floor lamp and strip light 3 for switchbot integration ([@zerzhang] - [#147517])
+- Remove mapping of entity_ids to speakers in Sonos ([@PeteRager] - [#147506])
+- Allow core integrations to describe their triggers ([@emontnemery] - [#147075])
+- Update codeowners of PlayStation Network integration ([@tr4nt0r] - [#147510])
+- Update frontend to 20250625.0 ([@bramkragten] - [#147521])
+- Fix typo's in MQTT translation strings ([@jbouwh] - [#147489])
+- Remove force latch mode for locklite in switchbot integration ([@zerzhang] - [#147474])
+- Bump aioamazondevices to 3.1.19 ([@chemelli74] - [#147462])
+- Bump plugwise to v1.7.6 ([@bouwew] - [#147508])
+- Add support for condition platforms to provide multiple conditions ([@emontnemery] - [#147376])
+
+[#125870]: https://github.com/home-assistant/core/pull/125870
+[#126009]: https://github.com/home-assistant/core/pull/126009
+[#128565]: https://github.com/home-assistant/core/pull/128565
+[#128958]: https://github.com/home-assistant/core/pull/128958
+[#129598]: https://github.com/home-assistant/core/pull/129598
+[#130478]: https://github.com/home-assistant/core/pull/130478
+[#131703]: https://github.com/home-assistant/core/pull/131703
+[#133901]: https://github.com/home-assistant/core/pull/133901
+[#134326]: https://github.com/home-assistant/core/pull/134326
+[#139334]: https://github.com/home-assistant/core/pull/139334
+[#139726]: https://github.com/home-assistant/core/pull/139726
+[#140574]: https://github.com/home-assistant/core/pull/140574
+[#140956]: https://github.com/home-assistant/core/pull/140956
+[#141533]: https://github.com/home-assistant/core/pull/141533
+[#141563]: https://github.com/home-assistant/core/pull/141563
+[#141873]: https://github.com/home-assistant/core/pull/141873
+[#142171]: https://github.com/home-assistant/core/pull/142171
+[#142288]: https://github.com/home-assistant/core/pull/142288
+[#142695]: https://github.com/home-assistant/core/pull/142695
+[#143462]: https://github.com/home-assistant/core/pull/143462
+[#143475]: https://github.com/home-assistant/core/pull/143475
+[#143743]: https://github.com/home-assistant/core/pull/143743
+[#144293]: https://github.com/home-assistant/core/pull/144293
+[#144617]: https://github.com/home-assistant/core/pull/144617
+[#144827]: https://github.com/home-assistant/core/pull/144827
+[#144879]: https://github.com/home-assistant/core/pull/144879
+[#144992]: https://github.com/home-assistant/core/pull/144992
+[#145019]: https://github.com/home-assistant/core/pull/145019
+[#145027]: https://github.com/home-assistant/core/pull/145027
+[#145128]: https://github.com/home-assistant/core/pull/145128
+[#145191]: https://github.com/home-assistant/core/pull/145191
+[#145205]: https://github.com/home-assistant/core/pull/145205
+[#145233]: https://github.com/home-assistant/core/pull/145233
+[#145242]: https://github.com/home-assistant/core/pull/145242
+[#145262]: https://github.com/home-assistant/core/pull/145262
+[#145278]: https://github.com/home-assistant/core/pull/145278
+[#145461]: https://github.com/home-assistant/core/pull/145461
+[#145485]: https://github.com/home-assistant/core/pull/145485
+[#145497]: https://github.com/home-assistant/core/pull/145497
+[#145512]: https://github.com/home-assistant/core/pull/145512
+[#145515]: https://github.com/home-assistant/core/pull/145515
+[#145527]: https://github.com/home-assistant/core/pull/145527
+[#145528]: https://github.com/home-assistant/core/pull/145528
+[#145534]: https://github.com/home-assistant/core/pull/145534
+[#145602]: https://github.com/home-assistant/core/pull/145602
+[#145620]: https://github.com/home-assistant/core/pull/145620
+[#145626]: https://github.com/home-assistant/core/pull/145626
+[#145638]: https://github.com/home-assistant/core/pull/145638
+[#145647]: https://github.com/home-assistant/core/pull/145647
+[#145657]: https://github.com/home-assistant/core/pull/145657
+[#145675]: https://github.com/home-assistant/core/pull/145675
+[#145676]: https://github.com/home-assistant/core/pull/145676
+[#145679]: https://github.com/home-assistant/core/pull/145679
+[#145689]: https://github.com/home-assistant/core/pull/145689
+[#145690]: https://github.com/home-assistant/core/pull/145690
+[#145695]: https://github.com/home-assistant/core/pull/145695
+[#145700]: https://github.com/home-assistant/core/pull/145700
+[#145702]: https://github.com/home-assistant/core/pull/145702
+[#145704]: https://github.com/home-assistant/core/pull/145704
+[#145710]: https://github.com/home-assistant/core/pull/145710
+[#145714]: https://github.com/home-assistant/core/pull/145714
+[#145717]: https://github.com/home-assistant/core/pull/145717
+[#145718]: https://github.com/home-assistant/core/pull/145718
+[#145731]: https://github.com/home-assistant/core/pull/145731
+[#145732]: https://github.com/home-assistant/core/pull/145732
+[#145733]: https://github.com/home-assistant/core/pull/145733
+[#145739]: https://github.com/home-assistant/core/pull/145739
+[#145743]: https://github.com/home-assistant/core/pull/145743
+[#145746]: https://github.com/home-assistant/core/pull/145746
+[#145747]: https://github.com/home-assistant/core/pull/145747
+[#145764]: https://github.com/home-assistant/core/pull/145764
+[#145766]: https://github.com/home-assistant/core/pull/145766
+[#145773]: https://github.com/home-assistant/core/pull/145773
+[#145778]: https://github.com/home-assistant/core/pull/145778
+[#145779]: https://github.com/home-assistant/core/pull/145779
+[#145787]: https://github.com/home-assistant/core/pull/145787
+[#145788]: https://github.com/home-assistant/core/pull/145788
+[#145789]: https://github.com/home-assistant/core/pull/145789
+[#145790]: https://github.com/home-assistant/core/pull/145790
+[#145791]: https://github.com/home-assistant/core/pull/145791
+[#145798]: https://github.com/home-assistant/core/pull/145798
+[#145801]: https://github.com/home-assistant/core/pull/145801
+[#145803]: https://github.com/home-assistant/core/pull/145803
+[#145817]: https://github.com/home-assistant/core/pull/145817
+[#145818]: https://github.com/home-assistant/core/pull/145818
+[#145827]: https://github.com/home-assistant/core/pull/145827
+[#145832]: https://github.com/home-assistant/core/pull/145832
+[#145840]: https://github.com/home-assistant/core/pull/145840
+[#145843]: https://github.com/home-assistant/core/pull/145843
+[#145864]: https://github.com/home-assistant/core/pull/145864
+[#145872]: https://github.com/home-assistant/core/pull/145872
+[#145893]: https://github.com/home-assistant/core/pull/145893
+[#145899]: https://github.com/home-assistant/core/pull/145899
+[#145946]: https://github.com/home-assistant/core/pull/145946
+[#145948]: https://github.com/home-assistant/core/pull/145948
+[#145952]: https://github.com/home-assistant/core/pull/145952
+[#145956]: https://github.com/home-assistant/core/pull/145956
+[#145966]: https://github.com/home-assistant/core/pull/145966
+[#145976]: https://github.com/home-assistant/core/pull/145976
+[#145977]: https://github.com/home-assistant/core/pull/145977
+[#145978]: https://github.com/home-assistant/core/pull/145978
+[#145979]: https://github.com/home-assistant/core/pull/145979
+[#145981]: https://github.com/home-assistant/core/pull/145981
+[#145982]: https://github.com/home-assistant/core/pull/145982
+[#145983]: https://github.com/home-assistant/core/pull/145983
+[#145984]: https://github.com/home-assistant/core/pull/145984
+[#145985]: https://github.com/home-assistant/core/pull/145985
+[#145986]: https://github.com/home-assistant/core/pull/145986
+[#145988]: https://github.com/home-assistant/core/pull/145988
+[#145989]: https://github.com/home-assistant/core/pull/145989
+[#145990]: https://github.com/home-assistant/core/pull/145990
+[#145991]: https://github.com/home-assistant/core/pull/145991
+[#145992]: https://github.com/home-assistant/core/pull/145992
+[#145993]: https://github.com/home-assistant/core/pull/145993
+[#145995]: https://github.com/home-assistant/core/pull/145995
+[#146000]: https://github.com/home-assistant/core/pull/146000
+[#146002]: https://github.com/home-assistant/core/pull/146002
+[#146009]: https://github.com/home-assistant/core/pull/146009
+[#146010]: https://github.com/home-assistant/core/pull/146010
+[#146011]: https://github.com/home-assistant/core/pull/146011
+[#146012]: https://github.com/home-assistant/core/pull/146012
+[#146013]: https://github.com/home-assistant/core/pull/146013
+[#146014]: https://github.com/home-assistant/core/pull/146014
+[#146015]: https://github.com/home-assistant/core/pull/146015
+[#146016]: https://github.com/home-assistant/core/pull/146016
+[#146017]: https://github.com/home-assistant/core/pull/146017
+[#146018]: https://github.com/home-assistant/core/pull/146018
+[#146021]: https://github.com/home-assistant/core/pull/146021
+[#146024]: https://github.com/home-assistant/core/pull/146024
+[#146028]: https://github.com/home-assistant/core/pull/146028
+[#146032]: https://github.com/home-assistant/core/pull/146032
+[#146037]: https://github.com/home-assistant/core/pull/146037
+[#146038]: https://github.com/home-assistant/core/pull/146038
+[#146039]: https://github.com/home-assistant/core/pull/146039
+[#146040]: https://github.com/home-assistant/core/pull/146040
+[#146047]: https://github.com/home-assistant/core/pull/146047
+[#146048]: https://github.com/home-assistant/core/pull/146048
+[#146049]: https://github.com/home-assistant/core/pull/146049
+[#146050]: https://github.com/home-assistant/core/pull/146050
+[#146054]: https://github.com/home-assistant/core/pull/146054
+[#146056]: https://github.com/home-assistant/core/pull/146056
+[#146059]: https://github.com/home-assistant/core/pull/146059
+[#146063]: https://github.com/home-assistant/core/pull/146063
+[#146065]: https://github.com/home-assistant/core/pull/146065
+[#146069]: https://github.com/home-assistant/core/pull/146069
+[#146076]: https://github.com/home-assistant/core/pull/146076
+[#146077]: https://github.com/home-assistant/core/pull/146077
+[#146085]: https://github.com/home-assistant/core/pull/146085
+[#146089]: https://github.com/home-assistant/core/pull/146089
+[#146092]: https://github.com/home-assistant/core/pull/146092
+[#146093]: https://github.com/home-assistant/core/pull/146093
+[#146094]: https://github.com/home-assistant/core/pull/146094
+[#146095]: https://github.com/home-assistant/core/pull/146095
+[#146098]: https://github.com/home-assistant/core/pull/146098
+[#146104]: https://github.com/home-assistant/core/pull/146104
+[#146114]: https://github.com/home-assistant/core/pull/146114
+[#146124]: https://github.com/home-assistant/core/pull/146124
+[#146131]: https://github.com/home-assistant/core/pull/146131
+[#146133]: https://github.com/home-assistant/core/pull/146133
+[#146139]: https://github.com/home-assistant/core/pull/146139
+[#146142]: https://github.com/home-assistant/core/pull/146142
+[#146144]: https://github.com/home-assistant/core/pull/146144
+[#146147]: https://github.com/home-assistant/core/pull/146147
+[#146148]: https://github.com/home-assistant/core/pull/146148
+[#146149]: https://github.com/home-assistant/core/pull/146149
+[#146151]: https://github.com/home-assistant/core/pull/146151
+[#146158]: https://github.com/home-assistant/core/pull/146158
+[#146160]: https://github.com/home-assistant/core/pull/146160
+[#146161]: https://github.com/home-assistant/core/pull/146161
+[#146169]: https://github.com/home-assistant/core/pull/146169
+[#146174]: https://github.com/home-assistant/core/pull/146174
+[#146192]: https://github.com/home-assistant/core/pull/146192
+[#146198]: https://github.com/home-assistant/core/pull/146198
+[#146205]: https://github.com/home-assistant/core/pull/146205
+[#146206]: https://github.com/home-assistant/core/pull/146206
+[#146211]: https://github.com/home-assistant/core/pull/146211
+[#146235]: https://github.com/home-assistant/core/pull/146235
+[#146236]: https://github.com/home-assistant/core/pull/146236
+[#146237]: https://github.com/home-assistant/core/pull/146237
+[#146242]: https://github.com/home-assistant/core/pull/146242
+[#146244]: https://github.com/home-assistant/core/pull/146244
+[#146247]: https://github.com/home-assistant/core/pull/146247
+[#146253]: https://github.com/home-assistant/core/pull/146253
+[#146268]: https://github.com/home-assistant/core/pull/146268
+[#146277]: https://github.com/home-assistant/core/pull/146277
+[#146278]: https://github.com/home-assistant/core/pull/146278
+[#146283]: https://github.com/home-assistant/core/pull/146283
+[#146296]: https://github.com/home-assistant/core/pull/146296
+[#146297]: https://github.com/home-assistant/core/pull/146297
+[#146299]: https://github.com/home-assistant/core/pull/146299
+[#146306]: https://github.com/home-assistant/core/pull/146306
+[#146314]: https://github.com/home-assistant/core/pull/146314
+[#146320]: https://github.com/home-assistant/core/pull/146320
+[#146331]: https://github.com/home-assistant/core/pull/146331
+[#146335]: https://github.com/home-assistant/core/pull/146335
+[#146340]: https://github.com/home-assistant/core/pull/146340
+[#146351]: https://github.com/home-assistant/core/pull/146351
+[#146354]: https://github.com/home-assistant/core/pull/146354
+[#146366]: https://github.com/home-assistant/core/pull/146366
+[#146367]: https://github.com/home-assistant/core/pull/146367
+[#146376]: https://github.com/home-assistant/core/pull/146376
+[#146378]: https://github.com/home-assistant/core/pull/146378
+[#146388]: https://github.com/home-assistant/core/pull/146388
+[#146398]: https://github.com/home-assistant/core/pull/146398
+[#146402]: https://github.com/home-assistant/core/pull/146402
+[#146429]: https://github.com/home-assistant/core/pull/146429
+[#146430]: https://github.com/home-assistant/core/pull/146430
+[#146432]: https://github.com/home-assistant/core/pull/146432
+[#146434]: https://github.com/home-assistant/core/pull/146434
+[#146436]: https://github.com/home-assistant/core/pull/146436
+[#146446]: https://github.com/home-assistant/core/pull/146446
+[#146447]: https://github.com/home-assistant/core/pull/146447
+[#146452]: https://github.com/home-assistant/core/pull/146452
+[#146457]: https://github.com/home-assistant/core/pull/146457
+[#146462]: https://github.com/home-assistant/core/pull/146462
+[#146464]: https://github.com/home-assistant/core/pull/146464
+[#146467]: https://github.com/home-assistant/core/pull/146467
+[#146469]: https://github.com/home-assistant/core/pull/146469
+[#146474]: https://github.com/home-assistant/core/pull/146474
+[#146477]: https://github.com/home-assistant/core/pull/146477
+[#146478]: https://github.com/home-assistant/core/pull/146478
+[#146486]: https://github.com/home-assistant/core/pull/146486
+[#146487]: https://github.com/home-assistant/core/pull/146487
+[#146490]: https://github.com/home-assistant/core/pull/146490
+[#146508]: https://github.com/home-assistant/core/pull/146508
+[#146509]: https://github.com/home-assistant/core/pull/146509
+[#146511]: https://github.com/home-assistant/core/pull/146511
+[#146513]: https://github.com/home-assistant/core/pull/146513
+[#146514]: https://github.com/home-assistant/core/pull/146514
+[#146515]: https://github.com/home-assistant/core/pull/146515
+[#146528]: https://github.com/home-assistant/core/pull/146528
+[#146531]: https://github.com/home-assistant/core/pull/146531
+[#146535]: https://github.com/home-assistant/core/pull/146535
+[#146545]: https://github.com/home-assistant/core/pull/146545
+[#146546]: https://github.com/home-assistant/core/pull/146546
+[#146547]: https://github.com/home-assistant/core/pull/146547
+[#146550]: https://github.com/home-assistant/core/pull/146550
+[#146555]: https://github.com/home-assistant/core/pull/146555
+[#146557]: https://github.com/home-assistant/core/pull/146557
+[#146593]: https://github.com/home-assistant/core/pull/146593
+[#146594]: https://github.com/home-assistant/core/pull/146594
+[#146595]: https://github.com/home-assistant/core/pull/146595
+[#146596]: https://github.com/home-assistant/core/pull/146596
+[#146601]: https://github.com/home-assistant/core/pull/146601
+[#146606]: https://github.com/home-assistant/core/pull/146606
+[#146607]: https://github.com/home-assistant/core/pull/146607
+[#146608]: https://github.com/home-assistant/core/pull/146608
+[#146609]: https://github.com/home-assistant/core/pull/146609
+[#146610]: https://github.com/home-assistant/core/pull/146610
+[#146611]: https://github.com/home-assistant/core/pull/146611
+[#146612]: https://github.com/home-assistant/core/pull/146612
+[#146614]: https://github.com/home-assistant/core/pull/146614
+[#146617]: https://github.com/home-assistant/core/pull/146617
+[#146629]: https://github.com/home-assistant/core/pull/146629
+[#146633]: https://github.com/home-assistant/core/pull/146633
+[#146636]: https://github.com/home-assistant/core/pull/146636
+[#146664]: https://github.com/home-assistant/core/pull/146664
+[#146666]: https://github.com/home-assistant/core/pull/146666
+[#146667]: https://github.com/home-assistant/core/pull/146667
+[#146670]: https://github.com/home-assistant/core/pull/146670
+[#146684]: https://github.com/home-assistant/core/pull/146684
+[#146685]: https://github.com/home-assistant/core/pull/146685
+[#146689]: https://github.com/home-assistant/core/pull/146689
+[#146691]: https://github.com/home-assistant/core/pull/146691
+[#146692]: https://github.com/home-assistant/core/pull/146692
+[#146693]: https://github.com/home-assistant/core/pull/146693
+[#146695]: https://github.com/home-assistant/core/pull/146695
+[#146696]: https://github.com/home-assistant/core/pull/146696
+[#146699]: https://github.com/home-assistant/core/pull/146699
+[#146703]: https://github.com/home-assistant/core/pull/146703
+[#146717]: https://github.com/home-assistant/core/pull/146717
+[#146722]: https://github.com/home-assistant/core/pull/146722
+[#146723]: https://github.com/home-assistant/core/pull/146723
+[#146729]: https://github.com/home-assistant/core/pull/146729
+[#146736]: https://github.com/home-assistant/core/pull/146736
+[#146737]: https://github.com/home-assistant/core/pull/146737
+[#146738]: https://github.com/home-assistant/core/pull/146738
+[#146744]: https://github.com/home-assistant/core/pull/146744
+[#146745]: https://github.com/home-assistant/core/pull/146745
+[#146746]: https://github.com/home-assistant/core/pull/146746
+[#146751]: https://github.com/home-assistant/core/pull/146751
+[#146754]: https://github.com/home-assistant/core/pull/146754
+[#146755]: https://github.com/home-assistant/core/pull/146755
+[#146762]: https://github.com/home-assistant/core/pull/146762
+[#146763]: https://github.com/home-assistant/core/pull/146763
+[#146769]: https://github.com/home-assistant/core/pull/146769
+[#146770]: https://github.com/home-assistant/core/pull/146770
+[#146773]: https://github.com/home-assistant/core/pull/146773
+[#146774]: https://github.com/home-assistant/core/pull/146774
+[#146776]: https://github.com/home-assistant/core/pull/146776
+[#146778]: https://github.com/home-assistant/core/pull/146778
+[#146780]: https://github.com/home-assistant/core/pull/146780
+[#146781]: https://github.com/home-assistant/core/pull/146781
+[#146787]: https://github.com/home-assistant/core/pull/146787
+[#146793]: https://github.com/home-assistant/core/pull/146793
+[#146794]: https://github.com/home-assistant/core/pull/146794
+[#146796]: https://github.com/home-assistant/core/pull/146796
+[#146802]: https://github.com/home-assistant/core/pull/146802
+[#146804]: https://github.com/home-assistant/core/pull/146804
+[#146816]: https://github.com/home-assistant/core/pull/146816
+[#146817]: https://github.com/home-assistant/core/pull/146817
+[#146823]: https://github.com/home-assistant/core/pull/146823
+[#146835]: https://github.com/home-assistant/core/pull/146835
+[#146837]: https://github.com/home-assistant/core/pull/146837
+[#146838]: https://github.com/home-assistant/core/pull/146838
+[#146842]: https://github.com/home-assistant/core/pull/146842
+[#146860]: https://github.com/home-assistant/core/pull/146860
+[#146863]: https://github.com/home-assistant/core/pull/146863
+[#146897]: https://github.com/home-assistant/core/pull/146897
+[#146898]: https://github.com/home-assistant/core/pull/146898
+[#146901]: https://github.com/home-assistant/core/pull/146901
+[#146905]: https://github.com/home-assistant/core/pull/146905
+[#146906]: https://github.com/home-assistant/core/pull/146906
+[#146908]: https://github.com/home-assistant/core/pull/146908
+[#146916]: https://github.com/home-assistant/core/pull/146916
+[#146918]: https://github.com/home-assistant/core/pull/146918
+[#146921]: https://github.com/home-assistant/core/pull/146921
+[#146925]: https://github.com/home-assistant/core/pull/146925
+[#146927]: https://github.com/home-assistant/core/pull/146927
+[#146928]: https://github.com/home-assistant/core/pull/146928
+[#146934]: https://github.com/home-assistant/core/pull/146934
+[#146935]: https://github.com/home-assistant/core/pull/146935
+[#146937]: https://github.com/home-assistant/core/pull/146937
+[#146938]: https://github.com/home-assistant/core/pull/146938
+[#146939]: https://github.com/home-assistant/core/pull/146939
+[#146941]: https://github.com/home-assistant/core/pull/146941
+[#146942]: https://github.com/home-assistant/core/pull/146942
+[#146946]: https://github.com/home-assistant/core/pull/146946
+[#146951]: https://github.com/home-assistant/core/pull/146951
+[#146952]: https://github.com/home-assistant/core/pull/146952
+[#146953]: https://github.com/home-assistant/core/pull/146953
+[#146954]: https://github.com/home-assistant/core/pull/146954
+[#146956]: https://github.com/home-assistant/core/pull/146956
+[#146958]: https://github.com/home-assistant/core/pull/146958
+[#146961]: https://github.com/home-assistant/core/pull/146961
+[#146966]: https://github.com/home-assistant/core/pull/146966
+[#146967]: https://github.com/home-assistant/core/pull/146967
+[#146969]: https://github.com/home-assistant/core/pull/146969
+[#146975]: https://github.com/home-assistant/core/pull/146975
+[#146976]: https://github.com/home-assistant/core/pull/146976
+[#146978]: https://github.com/home-assistant/core/pull/146978
+[#146979]: https://github.com/home-assistant/core/pull/146979
+[#146980]: https://github.com/home-assistant/core/pull/146980
+[#146982]: https://github.com/home-assistant/core/pull/146982
+[#146984]: https://github.com/home-assistant/core/pull/146984
+[#146986]: https://github.com/home-assistant/core/pull/146986
+[#146987]: https://github.com/home-assistant/core/pull/146987
+[#146988]: https://github.com/home-assistant/core/pull/146988
+[#146991]: https://github.com/home-assistant/core/pull/146991
+[#147020]: https://github.com/home-assistant/core/pull/147020
+[#147021]: https://github.com/home-assistant/core/pull/147021
+[#147023]: https://github.com/home-assistant/core/pull/147023
+[#147036]: https://github.com/home-assistant/core/pull/147036
+[#147039]: https://github.com/home-assistant/core/pull/147039
+[#147041]: https://github.com/home-assistant/core/pull/147041
+[#147049]: https://github.com/home-assistant/core/pull/147049
+[#147050]: https://github.com/home-assistant/core/pull/147050
+[#147051]: https://github.com/home-assistant/core/pull/147051
+[#147054]: https://github.com/home-assistant/core/pull/147054
+[#147056]: https://github.com/home-assistant/core/pull/147056
+[#147061]: https://github.com/home-assistant/core/pull/147061
+[#147063]: https://github.com/home-assistant/core/pull/147063
+[#147072]: https://github.com/home-assistant/core/pull/147072
+[#147073]: https://github.com/home-assistant/core/pull/147073
+[#147075]: https://github.com/home-assistant/core/pull/147075
+[#147079]: https://github.com/home-assistant/core/pull/147079
+[#147087]: https://github.com/home-assistant/core/pull/147087
+[#147090]: https://github.com/home-assistant/core/pull/147090
+[#147092]: https://github.com/home-assistant/core/pull/147092
+[#147094]: https://github.com/home-assistant/core/pull/147094
+[#147095]: https://github.com/home-assistant/core/pull/147095
+[#147096]: https://github.com/home-assistant/core/pull/147096
+[#147097]: https://github.com/home-assistant/core/pull/147097
+[#147099]: https://github.com/home-assistant/core/pull/147099
+[#147106]: https://github.com/home-assistant/core/pull/147106
+[#147110]: https://github.com/home-assistant/core/pull/147110
+[#147112]: https://github.com/home-assistant/core/pull/147112
+[#147116]: https://github.com/home-assistant/core/pull/147116
+[#147118]: https://github.com/home-assistant/core/pull/147118
+[#147128]: https://github.com/home-assistant/core/pull/147128
+[#147129]: https://github.com/home-assistant/core/pull/147129
+[#147130]: https://github.com/home-assistant/core/pull/147130
+[#147132]: https://github.com/home-assistant/core/pull/147132
+[#147134]: https://github.com/home-assistant/core/pull/147134
+[#147138]: https://github.com/home-assistant/core/pull/147138
+[#147142]: https://github.com/home-assistant/core/pull/147142
+[#147153]: https://github.com/home-assistant/core/pull/147153
+[#147154]: https://github.com/home-assistant/core/pull/147154
+[#147155]: https://github.com/home-assistant/core/pull/147155
+[#147156]: https://github.com/home-assistant/core/pull/147156
+[#147157]: https://github.com/home-assistant/core/pull/147157
+[#147158]: https://github.com/home-assistant/core/pull/147158
+[#147160]: https://github.com/home-assistant/core/pull/147160
+[#147162]: https://github.com/home-assistant/core/pull/147162
+[#147164]: https://github.com/home-assistant/core/pull/147164
+[#147168]: https://github.com/home-assistant/core/pull/147168
+[#147170]: https://github.com/home-assistant/core/pull/147170
+[#147171]: https://github.com/home-assistant/core/pull/147171
+[#147172]: https://github.com/home-assistant/core/pull/147172
+[#147173]: https://github.com/home-assistant/core/pull/147173
+[#147174]: https://github.com/home-assistant/core/pull/147174
+[#147176]: https://github.com/home-assistant/core/pull/147176
+[#147177]: https://github.com/home-assistant/core/pull/147177
+[#147179]: https://github.com/home-assistant/core/pull/147179
+[#147182]: https://github.com/home-assistant/core/pull/147182
+[#147183]: https://github.com/home-assistant/core/pull/147183
+[#147184]: https://github.com/home-assistant/core/pull/147184
+[#147186]: https://github.com/home-assistant/core/pull/147186
+[#147188]: https://github.com/home-assistant/core/pull/147188
+[#147191]: https://github.com/home-assistant/core/pull/147191
+[#147193]: https://github.com/home-assistant/core/pull/147193
+[#147194]: https://github.com/home-assistant/core/pull/147194
+[#147198]: https://github.com/home-assistant/core/pull/147198
+[#147202]: https://github.com/home-assistant/core/pull/147202
+[#147204]: https://github.com/home-assistant/core/pull/147204
+[#147206]: https://github.com/home-assistant/core/pull/147206
+[#147214]: https://github.com/home-assistant/core/pull/147214
+[#147215]: https://github.com/home-assistant/core/pull/147215
+[#147216]: https://github.com/home-assistant/core/pull/147216
+[#147219]: https://github.com/home-assistant/core/pull/147219
+[#147223]: https://github.com/home-assistant/core/pull/147223
+[#147228]: https://github.com/home-assistant/core/pull/147228
+[#147229]: https://github.com/home-assistant/core/pull/147229
+[#147233]: https://github.com/home-assistant/core/pull/147233
+[#147235]: https://github.com/home-assistant/core/pull/147235
+[#147236]: https://github.com/home-assistant/core/pull/147236
+[#147238]: https://github.com/home-assistant/core/pull/147238
+[#147244]: https://github.com/home-assistant/core/pull/147244
+[#147245]: https://github.com/home-assistant/core/pull/147245
+[#147248]: https://github.com/home-assistant/core/pull/147248
+[#147253]: https://github.com/home-assistant/core/pull/147253
+[#147262]: https://github.com/home-assistant/core/pull/147262
+[#147273]: https://github.com/home-assistant/core/pull/147273
+[#147275]: https://github.com/home-assistant/core/pull/147275
+[#147279]: https://github.com/home-assistant/core/pull/147279
+[#147281]: https://github.com/home-assistant/core/pull/147281
+[#147282]: https://github.com/home-assistant/core/pull/147282
+[#147285]: https://github.com/home-assistant/core/pull/147285
+[#147286]: https://github.com/home-assistant/core/pull/147286
+[#147288]: https://github.com/home-assistant/core/pull/147288
+[#147293]: https://github.com/home-assistant/core/pull/147293
+[#147306]: https://github.com/home-assistant/core/pull/147306
+[#147313]: https://github.com/home-assistant/core/pull/147313
+[#147323]: https://github.com/home-assistant/core/pull/147323
+[#147326]: https://github.com/home-assistant/core/pull/147326
+[#147327]: https://github.com/home-assistant/core/pull/147327
+[#147328]: https://github.com/home-assistant/core/pull/147328
+[#147329]: https://github.com/home-assistant/core/pull/147329
+[#147330]: https://github.com/home-assistant/core/pull/147330
+[#147331]: https://github.com/home-assistant/core/pull/147331
+[#147333]: https://github.com/home-assistant/core/pull/147333
+[#147334]: https://github.com/home-assistant/core/pull/147334
+[#147335]: https://github.com/home-assistant/core/pull/147335
+[#147336]: https://github.com/home-assistant/core/pull/147336
+[#147337]: https://github.com/home-assistant/core/pull/147337
+[#147338]: https://github.com/home-assistant/core/pull/147338
+[#147341]: https://github.com/home-assistant/core/pull/147341
+[#147342]: https://github.com/home-assistant/core/pull/147342
+[#147343]: https://github.com/home-assistant/core/pull/147343
+[#147345]: https://github.com/home-assistant/core/pull/147345
+[#147346]: https://github.com/home-assistant/core/pull/147346
+[#147348]: https://github.com/home-assistant/core/pull/147348
+[#147349]: https://github.com/home-assistant/core/pull/147349
+[#147350]: https://github.com/home-assistant/core/pull/147350
+[#147351]: https://github.com/home-assistant/core/pull/147351
+[#147352]: https://github.com/home-assistant/core/pull/147352
+[#147354]: https://github.com/home-assistant/core/pull/147354
+[#147357]: https://github.com/home-assistant/core/pull/147357
+[#147367]: https://github.com/home-assistant/core/pull/147367
+[#147369]: https://github.com/home-assistant/core/pull/147369
+[#147370]: https://github.com/home-assistant/core/pull/147370
+[#147372]: https://github.com/home-assistant/core/pull/147372
+[#147376]: https://github.com/home-assistant/core/pull/147376
+[#147377]: https://github.com/home-assistant/core/pull/147377
+[#147381]: https://github.com/home-assistant/core/pull/147381
+[#147385]: https://github.com/home-assistant/core/pull/147385
+[#147386]: https://github.com/home-assistant/core/pull/147386
+[#147388]: https://github.com/home-assistant/core/pull/147388
+[#147389]: https://github.com/home-assistant/core/pull/147389
+[#147391]: https://github.com/home-assistant/core/pull/147391
+[#147392]: https://github.com/home-assistant/core/pull/147392
+[#147393]: https://github.com/home-assistant/core/pull/147393
+[#147396]: https://github.com/home-assistant/core/pull/147396
+[#147397]: https://github.com/home-assistant/core/pull/147397
+[#147398]: https://github.com/home-assistant/core/pull/147398
+[#147408]: https://github.com/home-assistant/core/pull/147408
+[#147412]: https://github.com/home-assistant/core/pull/147412
+[#147420]: https://github.com/home-assistant/core/pull/147420
+[#147421]: https://github.com/home-assistant/core/pull/147421
+[#147422]: https://github.com/home-assistant/core/pull/147422
+[#147424]: https://github.com/home-assistant/core/pull/147424
+[#147429]: https://github.com/home-assistant/core/pull/147429
+[#147430]: https://github.com/home-assistant/core/pull/147430
+[#147435]: https://github.com/home-assistant/core/pull/147435
+[#147438]: https://github.com/home-assistant/core/pull/147438
+[#147439]: https://github.com/home-assistant/core/pull/147439
+[#147440]: https://github.com/home-assistant/core/pull/147440
+[#147441]: https://github.com/home-assistant/core/pull/147441
+[#147443]: https://github.com/home-assistant/core/pull/147443
+[#147445]: https://github.com/home-assistant/core/pull/147445
+[#147447]: https://github.com/home-assistant/core/pull/147447
+[#147448]: https://github.com/home-assistant/core/pull/147448
+[#147450]: https://github.com/home-assistant/core/pull/147450
+[#147453]: https://github.com/home-assistant/core/pull/147453
+[#147454]: https://github.com/home-assistant/core/pull/147454
+[#147455]: https://github.com/home-assistant/core/pull/147455
+[#147458]: https://github.com/home-assistant/core/pull/147458
+[#147462]: https://github.com/home-assistant/core/pull/147462
+[#147466]: https://github.com/home-assistant/core/pull/147466
+[#147469]: https://github.com/home-assistant/core/pull/147469
+[#147471]: https://github.com/home-assistant/core/pull/147471
+[#147472]: https://github.com/home-assistant/core/pull/147472
+[#147474]: https://github.com/home-assistant/core/pull/147474
+[#147475]: https://github.com/home-assistant/core/pull/147475
+[#147476]: https://github.com/home-assistant/core/pull/147476
+[#147477]: https://github.com/home-assistant/core/pull/147477
+[#147478]: https://github.com/home-assistant/core/pull/147478
+[#147479]: https://github.com/home-assistant/core/pull/147479
+[#147480]: https://github.com/home-assistant/core/pull/147480
+[#147481]: https://github.com/home-assistant/core/pull/147481
+[#147485]: https://github.com/home-assistant/core/pull/147485
+[#147488]: https://github.com/home-assistant/core/pull/147488
+[#147489]: https://github.com/home-assistant/core/pull/147489
+[#147492]: https://github.com/home-assistant/core/pull/147492
+[#147493]: https://github.com/home-assistant/core/pull/147493
+[#147494]: https://github.com/home-assistant/core/pull/147494
+[#147496]: https://github.com/home-assistant/core/pull/147496
+[#147498]: https://github.com/home-assistant/core/pull/147498
+[#147499]: https://github.com/home-assistant/core/pull/147499
+[#147503]: https://github.com/home-assistant/core/pull/147503
+[#147506]: https://github.com/home-assistant/core/pull/147506
+[#147508]: https://github.com/home-assistant/core/pull/147508
+[#147510]: https://github.com/home-assistant/core/pull/147510
+[#147517]: https://github.com/home-assistant/core/pull/147517
+[#147521]: https://github.com/home-assistant/core/pull/147521
+[@Bidski]: https://github.com/Bidski
+[@Bre77]: https://github.com/Bre77
+[@Chupaka]: https://github.com/Chupaka
+[@CubeZ2mDeveloper]: https://github.com/CubeZ2mDeveloper
+[@DCSBL]: https://github.com/DCSBL
+[@DeerMaximum]: https://github.com/DeerMaximum
+[@Diegorro98]: https://github.com/Diegorro98
+[@Foscam-wangzhengyu]: https://github.com/Foscam-wangzhengyu
+[@GrandMoff100]: https://github.com/GrandMoff100
+[@HarvsG]: https://github.com/HarvsG
+[@Imeon-Energy]: https://github.com/Imeon-Energy
+[@JackJPowell]: https://github.com/JackJPowell
+[@LG-ThinQ-Integration]: https://github.com/LG-ThinQ-Integration
+[@LaStrada]: https://github.com/LaStrada
+[@Lesekater]: https://github.com/Lesekater
+[@LoSk-p]: https://github.com/LoSk-p
+[@MartinHjelmare]: https://github.com/MartinHjelmare
+[@MindFreeze]: https://github.com/MindFreeze
+[@NoRi2909]: https://github.com/NoRi2909
+[@PeteRager]: https://github.com/PeteRager
+[@Petro31]: https://github.com/Petro31
+[@Shulyaka]: https://github.com/Shulyaka
+[@Shutgun]: https://github.com/Shutgun
+[@Sibgatulin]: https://github.com/Sibgatulin
+[@Taraman17]: https://github.com/Taraman17
+[@Thomas55555]: https://github.com/Thomas55555
+[@Thulrus]: https://github.com/Thulrus
+[@ToniCipriani]: https://github.com/ToniCipriani
+[@ViViDboarder]: https://github.com/ViViDboarder
+[@XiaoLing-git]: https://github.com/XiaoLing-git
+[@abmantis]: https://github.com/abmantis
+[@agners]: https://github.com/agners
+[@alengwenus]: https://github.com/alengwenus
+[@allenporter]: https://github.com/allenporter
+[@arturpragacz]: https://github.com/arturpragacz
+[@astrandb]: https://github.com/astrandb
+[@aviadlevy]: https://github.com/aviadlevy
+[@balloob]: https://github.com/balloob
+[@bdraco]: https://github.com/bdraco
+[@bieniu]: https://github.com/bieniu
+[@bouwew]: https://github.com/bouwew
+[@bramkragten]: https://github.com/bramkragten
+[@catsmanac]: https://github.com/catsmanac
+[@cdce8p]: https://github.com/cdce8p
+[@chemelli74]: https://github.com/chemelli74
+[@christopherboyd]: https://github.com/christopherboyd
+[@crug80]: https://github.com/crug80
+[@edenhaus]: https://github.com/edenhaus
+[@eifinger]: https://github.com/eifinger
+[@emontnemery]: https://github.com/emontnemery
+[@epenet]: https://github.com/epenet
+[@erwindouna]: https://github.com/erwindouna
+[@etiennec78]: https://github.com/etiennec78
+[@farmio]: https://github.com/farmio
+[@foxel]: https://github.com/foxel
+[@frenck]: https://github.com/frenck
+[@fvgarrel]: https://github.com/fvgarrel
+[@g-kiss]: https://github.com/g-kiss
+[@gjohansson-ST]: https://github.com/gjohansson-ST
+[@hahn-th]: https://github.com/hahn-th
+[@hanwg]: https://github.com/hanwg
+[@jbouwh]: https://github.com/jbouwh
+[@joostlek]: https://github.com/joostlek
+[@jpbede]: https://github.com/jpbede
+[@jpelgrom]: https://github.com/jpelgrom
+[@karwosts]: https://github.com/karwosts
+[@klejejs]: https://github.com/klejejs
+[@lanthaler]: https://github.com/lanthaler
+[@lboue]: https://github.com/lboue
+[@lennartnederstigt]: https://github.com/lennartnederstigt
+[@liudger]: https://github.com/liudger
+[@luca-angemi]: https://github.com/luca-angemi
+[@ludeeus]: https://github.com/ludeeus
+[@marcelveldt]: https://github.com/marcelveldt
+[@markhannon]: https://github.com/markhannon
+[@matrixd2]: https://github.com/matrixd2
+[@maximvelichko]: https://github.com/maximvelichko
+[@mbo18]: https://github.com/mbo18
+[@mib1185]: https://github.com/mib1185
+[@michaelheyman]: https://github.com/michaelheyman
+[@mikey0000]: https://github.com/mikey0000
+[@mswilson]: https://github.com/mswilson
+[@natekspencer]: https://github.com/natekspencer
+[@natepugh]: https://github.com/natepugh
+[@noahhusby]: https://github.com/noahhusby
+[@ocrease]: https://github.com/ocrease
+[@parholmdahl]: https://github.com/parholmdahl
+[@peteS-UK]: https://github.com/peteS-UK
+[@piitaya]: https://github.com/piitaya
+[@puddly]: https://github.com/puddly
+[@rappenze]: https://github.com/rappenze
+[@regulad]: https://github.com/regulad
+[@rlint-explicatis]: https://github.com/rlint-explicatis
+[@rrooggiieerr]: https://github.com/rrooggiieerr
+[@sVnsation]: https://github.com/sVnsation
+[@sanjay900]: https://github.com/sanjay900
+[@shaiu]: https://github.com/shaiu
+[@silamon]: https://github.com/silamon
+[@srescio]: https://github.com/srescio
+[@starkillerOG]: https://github.com/starkillerOG
+[@synesthesiam]: https://github.com/synesthesiam
+[@thomasddn]: https://github.com/thomasddn
+[@tl-sl]: https://github.com/tl-sl
+[@tr4nt0r]: https://github.com/tr4nt0r
+[@tronikos]: https://github.com/tronikos
+[@wbyoung]: https://github.com/wbyoung
+[@willschlitzer]: https://github.com/willschlitzer
+[@yuxincs]: https://github.com/yuxincs
+[@zerzhang]: https://github.com/zerzhang
+[@zweckj]: https://github.com/zweckj
+[@zxdavb]: https://github.com/zxdavb
diff --git a/source/common-tasks/general.markdown b/source/common-tasks/general.markdown
index aa6bd725dbb..13a39e928d6 100644
--- a/source/common-tasks/general.markdown
+++ b/source/common-tasks/general.markdown
@@ -13,11 +13,11 @@ This section provides tasks that do not depend on a specific Home Assistant inst
If you want to define a specific interval at which your device is being polled for data, you can disable the default polling interval and create your own polling automation.
-## What is data polling?
+### What is data polling?
Data polling is the process of querying a device or service at regular intervals to check for updates or retrieve data. By defining a custom polling interval, you can control how frequently your system checks for new data, which can help optimize performance and reduce unnecessary network traffic.
-## Why use an automation instead of changing the integration's polling configuration?
+### Why use an automation instead of changing the integration's polling configuration?
Creating an automation for polling gives you more flexibility on when to poll:
diff --git a/source/common-tasks/os.markdown b/source/common-tasks/os.markdown
index 833a4e851ae..e49b4b6a7be 100644
--- a/source/common-tasks/os.markdown
+++ b/source/common-tasks/os.markdown
@@ -31,7 +31,9 @@ If you have the {% term "Home Assistant Operating System" %} installed, you rece
- {% term "Home Assistant Operating System" %}
- {% term "Home Assistant Supervisor" %}
- {% term "Home Assistant Core" %}
-- Add-ons, if you have any installed
+- {% term "Add-ons" %}, if you have any installed
+
+Each of these components needs to be updated separately.
### Updating the Home Assistant Operating System
@@ -39,8 +41,9 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
#### Prerequisites
-- [Backup](/common-tasks/general/#backups) your installation.
- - Make sure the backup is downloaded and stored outside of the system.
+- [Backup your installation](/common-tasks/general/#backups).
+ - Make sure the backup is stored on a [backup location](/common-tasks/general/#defining-backup-locations) outside of the device where Home Assistant is installed.
+ - For example, if Home Assistant is installed on [Home Assistant Green](https://www.home-assistant.io/green), make sure it is stored on [Home Assistant Cloud](/common-tasks/general/#about-the-backup-storage-on-home-assistant-cloud) or another location.
- So that you can [restore from that backup](/common-tasks/general/#restoring-a-backup) in case there is an issue with the system.
#### To update the Home Assistant Operating System
@@ -52,9 +55,16 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
1. Open the **Settings** panel.
2. On the top you will be presented with an update notification.
-
- _If you do not see that notification, in the top right, select the three dots menu and select **Check for updates**"._
-
+ - **Troubleshooting**: If you do not see that notification:
+ - In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Check for updates**.
+ - Go to {% my updates title="**System** > **Updates**" %}.
+ - Select the update notification.
+ - Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active.
+ 3. Open the notification for the component you want to update.
+ 4. If you want to update the system first (recommended), enable the backup toggle.
+ 5. Select **Update**.
+ 6. Check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
+
- title: Using the CLI
content: |
@@ -66,6 +76,8 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
{% endtabbed_block %}
+{% details "Advanced: changing the boot slot used during the update" %}
+
#### About boot slots used during the update
The {% term "Home Assistant Operating System" %} uses two boot slots. On first installation, boot slot A is used. After that, on each Operating System update, the other boot slot is updated and reboot is triggered. On that reboot, the system boots from the other boot slot (A ➝ B ➝ A,...). When booting fails, the system automatically uses the previous boot slot, so that it boots from the last working operating system.
@@ -89,6 +101,8 @@ You can manually define that the previous boot slot is used. This can be useful
Alternatively, if the Operating Systems runs on a platform that uses the GRUB bootloader, a boot menu is presented early in the boot. The alternative boot slot can be selected here, marking it active for future boots if the following boot attempt is successful.
+{% enddetails %}
+
### Updating Home Assistant Core
{% include common-tasks/update.md %}
diff --git a/source/dashboards/features.markdown b/source/dashboards/features.markdown
index 46af70a75c1..fd2461d1246 100644
--- a/source/dashboards/features.markdown
+++ b/source/dashboards/features.markdown
@@ -21,6 +21,7 @@ Features can be enabled on the following cards:
- [Humidifier](/dashboards/humidifier/)
- [Thermostat](/dashboards/thermostat/)
- [Tile](/dashboards/tile/)
+- [Area](/dashboards/area/)
## Customizing features
@@ -720,3 +721,31 @@ operation_modes:
type: list
{% endconfiguration %}
+## Area control
+
+Widget that displays buttons to control different types of entity in your area.
+
+
+
+ Screenshot of the area card with the area controls feature
+
+
+```yaml
+features:
+ - type: "area-controls"
+ controls:
+ - light
+ - fan
+ - switch
+```
+
+{% configuration features %}
+type:
+ required: true
+ description: "`area-controls`"
+ type: string
+controls:
+ required: true
+ description: List of controls to show on the card. The list can contain `light`, `fan`, and `switch`.
+ type: list
+{% endconfiguration %}
diff --git a/source/green/index.html b/source/green/index.html
index 794deaf24c8..542d3575c21 100644
--- a/source/green/index.html
+++ b/source/green/index.html
@@ -485,8 +485,7 @@ dark_header: true
- Home Assistant Green is the easiest way to run Home Assistant for the
- low price of $99. Try out Home Assistant for your smart home or share
+ Home Assistant Green is the easiest way to run Home Assistant. Try out Home Assistant for your smart home or share
the love with family and friends.
diff --git a/source/help/index.markdown b/source/help/index.markdown
index b40f41bac77..20e18481d54 100644
--- a/source/help/index.markdown
+++ b/source/help/index.markdown
@@ -18,7 +18,7 @@ There are various ways to get in touch with the Home Assistant community. It doe
Have you found an issue in your Home Assistant installation? Please report it. Reporting it makes it easy to track and ensures that it gets fixed. For more details please refer to [Reporting issues](/help/reporting_issues/) page.
-- [Feature requests](https://community.home-assistant.io/c/feature-requests) (Don't post feature requests in the issue trackers. Thanks!)
+- [Feature requests](https://github.com/orgs/home-assistant/discussions) (Don't post feature requests in the issue trackers. Thanks!)
- [Issue tracker Home Assistant Core](https://github.com/home-assistant/core/issues)
- [Issue tracker Home Assistant Frontend](https://github.com/home-assistant/frontend/issues)
- [Issue tracker Home Assistant Supervisor](https://github.com/home-assistant/supervisor/issues)
diff --git a/source/images/assist/esp32-atom_silence_detection_01.png b/source/images/assist/esp32-atom_silence_detection_01.png
index 1821369c6f8..bcccc6a1fd5 100644
Binary files a/source/images/assist/esp32-atom_silence_detection_01.png and b/source/images/assist/esp32-atom_silence_detection_01.png differ
diff --git a/source/images/blog/2025-06-community-day-wrap-up/art.jpg b/source/images/blog/2025-06-community-day-wrap-up/art.jpg
new file mode 100644
index 00000000000..f10144ccd7c
Binary files /dev/null and b/source/images/blog/2025-06-community-day-wrap-up/art.jpg differ
diff --git a/source/images/blog/2025-06-switchbot/art.jpg b/source/images/blog/2025-06-switchbot/art.jpg
new file mode 100644
index 00000000000..0b481293ff1
Binary files /dev/null and b/source/images/blog/2025-06-switchbot/art.jpg differ
diff --git a/source/images/blog/2025-06-switchbot/vacuum.jpg b/source/images/blog/2025-06-switchbot/vacuum.jpg
new file mode 100644
index 00000000000..96bdaaa0d14
Binary files /dev/null and b/source/images/blog/2025-06-switchbot/vacuum.jpg differ
diff --git a/source/images/blog/2025-06-voice-chapter-10/art.png b/source/images/blog/2025-06-voice-chapter-10/art.png
new file mode 100644
index 00000000000..468c14af0f1
Binary files /dev/null and b/source/images/blog/2025-06-voice-chapter-10/art.png differ
diff --git a/source/images/blog/2025-06-voice-chapter-10/circuits.png b/source/images/blog/2025-06-voice-chapter-10/circuits.png
new file mode 100644
index 00000000000..5ada1e3bf53
Binary files /dev/null and b/source/images/blog/2025-06-voice-chapter-10/circuits.png differ
diff --git a/source/images/blog/2025-06-voice-chapter-10/devices.jpg b/source/images/blog/2025-06-voice-chapter-10/devices.jpg
new file mode 100644
index 00000000000..0f0cbd11ee9
Binary files /dev/null and b/source/images/blog/2025-06-voice-chapter-10/devices.jpg differ
diff --git a/source/images/blog/2025-06-voice-chapter-10/intents.png b/source/images/blog/2025-06-voice-chapter-10/intents.png
new file mode 100644
index 00000000000..f689fa7aa6b
Binary files /dev/null and b/source/images/blog/2025-06-voice-chapter-10/intents.png differ
diff --git a/source/images/blog/2025-06/areas-dashboard.png b/source/images/blog/2025-06/areas-dashboard.png
new file mode 100644
index 00000000000..3931f784bdc
Binary files /dev/null and b/source/images/blog/2025-06/areas-dashboard.png differ
diff --git a/source/images/blog/2025-06/bluetooth-connection-graph.png b/source/images/blog/2025-06/bluetooth-connection-graph.png
new file mode 100644
index 00000000000..b70fe32b920
Binary files /dev/null and b/source/images/blog/2025-06/bluetooth-connection-graph.png differ
diff --git a/source/images/blog/2025-06/group-media-players-from-media-player-card.png b/source/images/blog/2025-06/group-media-players-from-media-player-card.png
new file mode 100644
index 00000000000..542de423566
Binary files /dev/null and b/source/images/blog/2025-06/group-media-players-from-media-player-card.png differ
diff --git a/source/images/blog/2025-06/new-device-picker.png b/source/images/blog/2025-06/new-device-picker.png
new file mode 100644
index 00000000000..70588d96c41
Binary files /dev/null and b/source/images/blog/2025-06/new-device-picker.png differ
diff --git a/source/images/blog/2025-06/reset-entity-id.png b/source/images/blog/2025-06/reset-entity-id.png
new file mode 100644
index 00000000000..ef1417dcc0d
Binary files /dev/null and b/source/images/blog/2025-06/reset-entity-id.png differ
diff --git a/source/images/blog/2025-06/sidebar-customization.png b/source/images/blog/2025-06/sidebar-customization.png
new file mode 100644
index 00000000000..a5d4f978dfc
Binary files /dev/null and b/source/images/blog/2025-06/sidebar-customization.png differ
diff --git a/source/images/blog/2025-06/social.png b/source/images/blog/2025-06/social.png
new file mode 100644
index 00000000000..697d588a3b8
Binary files /dev/null and b/source/images/blog/2025-06/social.png differ
diff --git a/source/images/blog/2025-07/add-mqtt-device-using-sub-entry.png b/source/images/blog/2025-07/add-mqtt-device-using-sub-entry.png
new file mode 100644
index 00000000000..52d5bd57e87
Binary files /dev/null and b/source/images/blog/2025-07/add-mqtt-device-using-sub-entry.png differ
diff --git a/source/images/blog/2025-07/area-card.png b/source/images/blog/2025-07/area-card.png
new file mode 100644
index 00000000000..3d1d4a5b33e
Binary files /dev/null and b/source/images/blog/2025-07/area-card.png differ
diff --git a/source/images/blog/2025-07/areas-dashboard.png b/source/images/blog/2025-07/areas-dashboard.png
new file mode 100644
index 00000000000..52285281040
Binary files /dev/null and b/source/images/blog/2025-07/areas-dashboard.png differ
diff --git a/source/images/blog/2025-07/ask_question.png b/source/images/blog/2025-07/ask_question.png
new file mode 100644
index 00000000000..f2a27641202
Binary files /dev/null and b/source/images/blog/2025-07/ask_question.png differ
diff --git a/source/images/blog/2025-07/improved-add-dashboard-dialog.png b/source/images/blog/2025-07/improved-add-dashboard-dialog.png
new file mode 100644
index 00000000000..e99c5dbcb5f
Binary files /dev/null and b/source/images/blog/2025-07/improved-add-dashboard-dialog.png differ
diff --git a/source/images/blog/2025-07/new-integrations-page.png b/source/images/blog/2025-07/new-integrations-page.png
new file mode 100644
index 00000000000..eb89c08c3e9
Binary files /dev/null and b/source/images/blog/2025-07/new-integrations-page.png differ
diff --git a/source/images/blog/2025-07/social.png b/source/images/blog/2025-07/social.png
new file mode 100644
index 00000000000..150a2267a84
Binary files /dev/null and b/source/images/blog/2025-07/social.png differ
diff --git a/source/images/blueprints/selector-object-schema.png b/source/images/blueprints/selector-object-schema.png
new file mode 100644
index 00000000000..01a49da66e3
Binary files /dev/null and b/source/images/blueprints/selector-object-schema.png differ
diff --git a/source/images/blueprints/selector-object.png b/source/images/blueprints/selector-object.png
index aa947d1e472..e762e20be5c 100644
Binary files a/source/images/blueprints/selector-object.png and b/source/images/blueprints/selector-object.png differ
diff --git a/source/images/blueprints/selector-statistic.png b/source/images/blueprints/selector-statistic.png
new file mode 100644
index 00000000000..ddbeee812fe
Binary files /dev/null and b/source/images/blueprints/selector-statistic.png differ
diff --git a/source/images/dashboards/area-card.png b/source/images/dashboards/area-card.png
deleted file mode 100644
index be3c0358b3e..00000000000
Binary files a/source/images/dashboards/area-card.png and /dev/null differ
diff --git a/source/images/dashboards/area-cards.png b/source/images/dashboards/area-cards.png
new file mode 100644
index 00000000000..c01e602650d
Binary files /dev/null and b/source/images/dashboards/area-cards.png differ
diff --git a/source/images/dashboards/features/area_controls.png b/source/images/dashboards/features/area_controls.png
new file mode 100644
index 00000000000..30033276ac0
Binary files /dev/null and b/source/images/dashboards/features/area_controls.png differ
diff --git a/source/images/docs/configuration/customizing-entity-dialog.png b/source/images/docs/configuration/customizing-entity-dialog.png
index d6076b446a9..9188d665115 100644
Binary files a/source/images/docs/configuration/customizing-entity-dialog.png and b/source/images/docs/configuration/customizing-entity-dialog.png differ
diff --git a/source/images/docs/configuration/customizing-entity.png b/source/images/docs/configuration/customizing-entity.png
index 63e8760af07..71b67832312 100644
Binary files a/source/images/docs/configuration/customizing-entity.png and b/source/images/docs/configuration/customizing-entity.png differ
diff --git a/source/images/frontpage/community-day-2025.webp b/source/images/frontpage/community-day-2025.webp
deleted file mode 100644
index 9b70ed29e4e..00000000000
Binary files a/source/images/frontpage/community-day-2025.webp and /dev/null differ
diff --git a/source/images/frontpage/community-meetup.webp b/source/images/frontpage/community-meetup.webp
new file mode 100644
index 00000000000..dd4d039c31c
Binary files /dev/null and b/source/images/frontpage/community-meetup.webp differ
diff --git a/source/installation/index.html b/source/installation/index.html
index f3aada16274..e57baa69b8e 100644
--- a/source/installation/index.html
+++ b/source/installation/index.html
@@ -13,7 +13,80 @@ toc: true
kinds of skill levels.
+
About installation methods
+
+ Home Assistant offers two different installation methods. Home Assistant Operating System is the recommended installation method.
+
+
+
Home Assistant Operating System: An embedded,
+ minimalistic operating system designed to run the Home Assistant ecosystem
+ on single board computers (like the Home Assistant Green or a Raspberry Pi) or Virtual Machines. It
+ is the most convenient option in terms of installation and maintenance and it supports
+ {% term "add-ons" %}. Home Assistant Operating System is
+ the recommended installation method for most users.
+
+ Home Assistant Container: Container-based installation of Home Assistant. You need to bring your own system (such as Linux) with container orchestration (like Docker), and manually handle updates. Home Assistant Container installations don’t have access to {% term "add-ons" %}.
+
+ 1: Names are abbreviated. The full names of the installation methods are:
+
+
Home Assistant Operating System
+
Home Assistant Container
+
+
Easiest
@@ -254,90 +327,6 @@ toc: true
Expert
-
About installation methods
-
- Home Assistant offers two different installation methods:
-
-
-
Home Assistant Operating System: An embedded,
- minimalistic operating system designed to run the Home Assistant ecosystem
- on single board computers (like the Home Assistant Green or a Raspberry Pi) or Virtual Machines. It
- is the most convenient option in terms of installation and maintenance and it supports
- {% term "add-ons" %}. Home Assistant Operating System is
- the recommended installation method for most users.
-
- Home Assistant Container:Container-based installation of Home Assistant. You need to bring your own system (such as Linux) with container orchestration (like Docker), and manually handle updates. Home Assistant Container installations don’t have access to {% term "add-ons" %}.
-
-
- 1: Names are abbreviated. The full names of the installation methods are:
-
-
Home Assistant Operating System
-
Home Assistant Container
-
-
-
-
Deprecated installation methods
-
- Home Assistant used to offer two additional installation methods for advanced users: {% term "Home Assistant Core" %} and {% term "Home Assistant Supervised" %}. These two methods are now deprecated and no longer recommended for new users.
-
-
-
- Home Assistant Supervised: Manual installation of the Supervisor.
-
-
- Home Assistant Core: Manual installation using Python virtual
- environment.
-
-
-
@@ -521,3 +510,18 @@ toc: true
+
+
Deprecated installation methods
+
+ Home Assistant used to offer two additional installation methods for advanced users: {% term "Home Assistant Core" %} and {% term "Home Assistant Supervised" %}. These two methods are now deprecated and no longer recommended for new users.
+
+
+
+ Home Assistant Supervised: Manual installation of the Supervisor.
+
+
+ Home Assistant Core: Manual installation using Python virtual
+ environment.
+
+
+
\ No newline at end of file
diff --git a/source/installation/troubleshooting.markdown b/source/installation/troubleshooting.markdown
index d857dd4c224..e480fd0c72e 100644
--- a/source/installation/troubleshooting.markdown
+++ b/source/installation/troubleshooting.markdown
@@ -72,7 +72,7 @@ You are in the onboarding procedure, but the process seems stuck at the step **P
### Resolution
-1. Select the pulsing blue dot to view the log files.
+1. Select **Show details** to view the log files.
- The log files might provide more information on the current status.
2. Make sure your network has internet access.
- During first startup, time will be synchronized. Ensure NTP is allowed in your network.
diff --git a/source/more-info/unsupported/lxc.markdown b/source/more-info/unsupported/lxc.markdown
index 4e2c24ea615..e5385dbc0f6 100644
--- a/source/more-info/unsupported/lxc.markdown
+++ b/source/more-info/unsupported/lxc.markdown
@@ -12,4 +12,4 @@ with the Supervisor is not supported.
## The solution
You need to reinstall the host operating system that runs the Supervisor,
-for instructions on how to prosed with that [have a look here](/more-info/unsupported/os).
+for instructions on how to proceed with that [have a look here](/more-info/unsupported/os).
diff --git a/source/voice-pe/index.html b/source/voice-pe/index.html
index d16b2fd2f7f..8f8e9ebd249 100644
--- a/source/voice-pe/index.html
+++ b/source/voice-pe/index.html
@@ -208,7 +208,7 @@ frontpage_image: /images/frontpage/voice-pe-frontpage.jpg
Preview the future of voice for just
-
$59*
+
$69 / €59 *
@@ -217,7 +217,7 @@ frontpage_image: /images/frontpage/voice-pe-frontpage.jpg
alt="Front view of the Voice Preview Edition showing the speaker holes">
Buy now
- * Recommended MSRP. Pricing subject to individual retailers.
+ * Recommended MSRP. Prices differ between regions due to varying local market costs and conditions, and subject to individual retailers.
diff --git a/source/voice-pe/styles.css b/source/voice-pe/styles.css
index 4f7e836a838..f591f1e456a 100644
--- a/source/voice-pe/styles.css
+++ b/source/voice-pe/styles.css
@@ -174,14 +174,19 @@ article.page h3 {
--subtitle-medium-mobile: 24;
--price: 170;
- --price-mobile: 120;
-
+ --price-mobile: 60;
+
--wrapper-radius: 0px;
-
+
isolation: isolate;
position: relative;
}
+@media only screen and (min-width: 875px) {
+ :root{
+ --price-mobile: 120;
+ }
+}
@media only screen and (min-width: 2180px) {
.vpe-main {
--wrapper-radius: 40px;
@@ -2881,7 +2886,7 @@ section#hero .bg-gradient {
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
- margin-bottom: -20px;
+ margin-bottom: -10px;
display: flex;
margin-top: 8px;
}
@@ -4894,6 +4899,11 @@ section#hero .bg-gradient {
}
}
+@media (min-width: 940px) {
+ .vpe-main #pricing .fs-price {
+ margin-bottom: -10px;
+ }
+}
@media (min-width: 940px) {
.vpe-main {
--columns: 11;
@@ -5190,7 +5200,7 @@ section#hero .bg-gradient {
}
.vpe-main #pricing .fs-price {
- margin-bottom: -26px;
+ margin-bottom: -20px;
margin-top: 20px;
}
diff --git a/source/voice_control/index.markdown b/source/voice_control/index.markdown
index cbdc67b036f..92fd1d894f3 100644
--- a/source/voice_control/index.markdown
+++ b/source/voice_control/index.markdown
@@ -30,7 +30,7 @@ As for the rest of Home Assistant core functionalities, Assist can be personaliz
-## Getting Started
+## Getting started
When you configure voice assistant hardware made for Home Assistant, it will use a wizard to help you configure your system and get started to use voice.
@@ -41,7 +41,7 @@ In case your hardware does not support our wizard, do not worry. Here are two de
- [I plan to process my voice locally](/voice_control/voice_remote_local_assistant/)
- [I plan to use Home Assistant Cloud](/voice_control/voice_remote_cloud_assistant/) (recommended as it is the simplest)
-## Expand and Experiment
+## Expand and experiment
Once your setup is up and running and you follow the [best practices](/voice_control/best_practices), check all the possibilities we found for [Expanding your Assist setup](/voice_control/expanding_assist), and further experiment with different setups like [wake words](/voice_control/about_wake_word/). Do you want to talk to Super Mario? Or another figure? If you want Assist to respond in a fun way, you can create an assistant with an [AI personality](/voice_control/assist_create_open_ai_personality/).
diff --git a/source/voice_control/thirteen-usd-voice-remote.markdown b/source/voice_control/thirteen-usd-voice-remote.markdown
index 6bb74278405..079419eeed9 100644
--- a/source/voice_control/thirteen-usd-voice-remote.markdown
+++ b/source/voice_control/thirteen-usd-voice-remote.markdown
@@ -70,18 +70,15 @@ Before you can use this device with Home Assistant, you need to install a bit of

-6. To add the newly discovered device, select the ATOM Echo from the list.
- - Add your ATOM Echo to a room and select **Finish**.
-7. You should now see the **ESPHome** integration.
- 
-8. Select the **ESPHome** integration. Under **Devices**, you should see the **M5Stack Atom Echo** listed.
- 
- - Your ATOM Echo is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply.
-9. Congratulations! You can now voice control Home Assistant. Now give some commands.
+6. This starts the a wizard to customize the your voice assistant.
+ - Follow the wizard steps to define the wake word and choose the voice.
+ - When you are finished, select **Done**.
+7. Your ATOM Echo is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply.
+8. Congratulations! You can now voice control Home Assistant. Now give some commands.
## Controlling Home Assistant over the ATOM Echo
-1. Say your wake word. For this tutorial, use "OK, Nabu".
+1. Say the wake word you configured. For example, use "OK, Nabu".
- Wait for the LED to start blinking in blue.
2. Say a [supported voice command](/voice_control/builtin_sentences/). For example, *Turn off the light in the kitchen*.
- While you are speaking, the blue LED keeps pulsing.
@@ -93,8 +90,8 @@ Before you can use this device with Home Assistant, you need to install a bit of
3. Your command is not supported? Add your own commands using [a sentence trigger](/voice_control/custom_sentences/).
4. You find ATOM Echo takes too long to start processing your command?
- Adjust the silence detection settings.
- - Go to {% my integrations title="**Settings** > **Devices & Services**" %} and select the **ESPHome** integration.
- - Under **M5Stack ATOM Echo**, select **1 device**. Under **Configuration**, change the **Finish speaking detection**.
+ - Go to {% my integrations title="**Settings** > **Devices & services**" %} and select the **ESPHome** integration.
+ - Under **M5Stack ATOM Echo**, select **1 device**. Under **Configuration**, change the **Finished speaking detection**.
- This setting defines how much silence is needed for Assist to find you're done speaking and it can start processing your command.

@@ -104,3 +101,21 @@ Before you can use this device with Home Assistant, you need to install a bit of
Are things not working as expected?
- Checkout the [general troubleshooting section for Assist](/voice_control/troubleshooting/).
+
+## Removing the Wi-Fi credentials from the ATOM Echo
+
+If you no longer use the device or want to pass it on to someone else, you can remove the Wi-Fi credentials that are stored on the device.
+
+1. Make sure this page is opened in a Chromium-based browser on a desktop. It does not work on a tablet or phone.
+ - Select the **Connect** button below. If your browser does not support web serial, you will see a warning instead of a button.
+
+
+
+
+2. To connect the ATOM Echo to your computer, follow these steps:
+ - In the pop-up window, view the available ports.
+ - Plug the USB-C cable into the ATOM Echo and connect it to your computer.
+ - In the pop-up window, there should now appear a new entry. Select this USB serial port and select **Connect**.
+3. In the dialog, select **Erase user data**.
+ - **Result**: Your Wi-Fi credentials are deleted from the device.
+ - The firmware stays on the device.