Upgrade Path

Home Assistant Core 2026.3.0 → 2026.9.4

33 versions, 56 breaking changes in 6 versions, 0 required stops

Version by version, oldest first

2026.3.1 – 2026.3.4: no action items (4 versions)

2026.4.0 2026-04-01

Quoted from www.home-assistant.io/blog/2026/04/01/release-20264/#backward-incompatible-changes

Breaking

JVC Projector

The Picture Mode and HDR Processing entities have been migrated from the sensor domain to the select domain, because they represent selectable settings rather than read-only values.

New entities:

  • select.jvc_projector_picture_mode
  • select.jvc_projector_hdr_processing

The legacy sensor entities are now deprecated. If a deprecated sensor is disabled and not referenced by automations or scripts, Home Assistant will remove it from the entity registry. If usage is detected, Home Assistant keeps it and shows a repair issue to help you migrate. Update your automations, scripts, dashboards, and templates to use the new select entities.

(@SteveEasley - #165194) (JVC Projector documentation)

Breaking

Litter-Robot

The deprecated night light mode switch entity for Litter-Robot 4 devices has been removed. This switch was replaced by a select entity in Home Assistant 2025.10. If you still use the old switch entity in your automations or scripts, update them to use the select entity instead.

(@natekspencer - #165636) (Litter-Robot documentation)

Breaking

Motion Blinds

On devices that support tilt but do not report a tilt position, the tilt open and tilt close operations now send jog up and jog down commands instead of setting the tilt angle to 0° or 180°. Setting an absolute tilt position usually didn't work on these devices anyway, and jog commands provide a meaningful small step in the intended direction.

If you have automations that rely on the previous tilt behavior for these devices, you may need to adjust them.

(@tobiaswaldvogel - #164694) (Motion Blinds documentation)

Breaking

MQTT

Support for the object_id option has been removed after 6 months of deprecation. This option was used to suggest the entity ID for an MQTT entity and has been replaced by the default_entity_id configuration option.

If you used object_id in your MQTT YAML configuration, you were previously asked via a repair flow to update your configuration. If object_id is still part of a discovery message, the option will simply be ignored and will not break discovery.

(@jbouwh - #164460) (MQTT documentation)

Breaking

pyLoad

pyLoad 0.4.x is now deprecated, and you should switch to pyLoad-ng 0.5.0. pyLoad-ng introduced a new API, and support for the old API has been dropped.

(@tr4nt0r - #164495) (pyLoad documentation)

Breaking

Roth Touchline

The preset mode names for the Roth Touchline climate entities have been updated to use standard Home Assistant preset names, making them translatable. If you have automations or scripts that reference the old preset mode names, update them to use the new names:

  • Normal → none
  • Night → sleep
  • Holiday → away
  • Pro 1 → program_1
  • Pro 2 → program_2
  • Pro 3 → program_3

(@joostlek - #166390) (Roth Touchline documentation)

Breaking

Tuya

Previously deprecated switch entities used to control valves have been removed. Use the valve entities instead. If you have automations or scripts that reference these switch entities, update them to use the corresponding valve entities.

(@epenet - #164657) (Tuya documentation)

Breaking

Z-Wave

The Z-Wave Installer panel has been removed. This panel was hidden and required an undocumented YAML configuration to enable. The same functionality is now natively available through Z-Wave JS UI in the Z-Wave app.

(@AlCalzone - #165388) (Z-Wave documentation)

Full release notes for 2026.4.0

2026.4.1 – 2026.4.4: no action items (4 versions)

2026.5.0 2026-05-06

Quoted from www.home-assistant.io/blog/2026/05/06/release-20265/#backward-incompatible-changes

Breaking

Purpose-specific triggers and conditions

When we first introduced purpose-specific triggers and conditions, we added separate ones for Person entities and Device Tracker entities. Since then, we've decided to take a more ergonomic, cross-domain approach instead.

As a result, the entered home and left home triggers, and the is home and is not home conditions, have been removed from Person and Device Tracker. Replacements that work across both will land in an upcoming release.

If you have automations that use these triggers or conditions on a person or device tracker, switch them back to a regular state trigger or state condition (for example, state changed to home) until the cross-domain replacements arrive.

(@emontnemery - #168406)

Breaking

Gardena Bluetooth

The "finish watering" value in the Gardena Bluetooth integration has been moved from a binary sensor to a regular sensor that exposes the timestamp of when watering is expected to finish. This makes the value far more useful in dashboards and automations.

If you have automations, scripts, or dashboards that reference the previous binary sensor entity, update them to use the new sensor entity instead.

(@elupus - #169476) (Gardena Bluetooth documentation)

Breaking

pilight

The pilight integration has been disabled because the underlying pilight library relies on setuptools.pkg_resources, which is no longer available in setuptools 82.0.0 and later.

If the library is updated to remove the setuptools.pkg_resources dependency, or replaced with a maintained alternative that does so, the integration can be activated again. Community contributions to make this happen are very welcome.

(@epenet - #167760) (pilight documentation)

Breaking

Ring

The Ring doorbell event entity now emits the standardized ring event type instead of the legacy ding. This change aligns Ring with the new doorbell event standard, so the entity can be used seamlessly with the new purpose-specific automation triggers and conditions.

If you have automations that listen for the ding event type from your Ring doorbell, update them to use ring instead.

(@abmantis - #167728) (Ring documentation)

Breaking

Supervisor

Previously, all actions registered by the Supervisor integration (such as hassio.addon_start, hassio.backup_partial, and hassio.host_reboot) only logged an error on failure, and your script or automation would continue running regardless of whether the action succeeded.

These actions now properly raise on failure, which means your automation or script will stop unless continue_on_error is set to true. If you rely on the previous behavior, add continue_on_error: true to those action steps.

(@mdegat01 - #166558) (Supervisor documentation)

Breaking

Webhook

The local_only option on webhooks must now be a proper boolean (true or false). Previously, other truthy values like 1 or "yes" were silently accepted. This brings the option in line with the rest of Home Assistant.

If you have webhooks configured in YAML with non-boolean local_only values, update them to use true or false.

(@edenhaus - #169296) (Webhook documentation)

Full release notes for 2026.5.0

2026.5.1 – 2026.5.4: no action items (4 versions)

2026.6.0 2026-06-03

Quoted from www.home-assistant.io/blog/2026/06/03/release-20266/#backward-incompatible-changes

Breaking

Purpose-specific triggers (Labs)

The behavior options for the Labs purpose-specific triggers have been renamed to better match what they do: any is now each, and last is now all. The default is now each.

If you have automations that use these triggers from the Labs preview at Settings > System > Labs, open them in the automation editor and re-pick the behavior option. Any YAML you wrote against the old keys needs to be updated to the new names.

(@emontnemery - #172348)

Breaking

Bluetooth

The default Bluetooth scanning mode has changed to Auto, which dynamically switches between active and passive scanning depending on what is happening. This saves around 95-96% of the battery used for Bluetooth scanning while keeping the same functionality for most setups.

If you run into issues after the upgrade, you can switch your Bluetooth adapter back to Active scanning. Go to Settings > Devices & services, open the Bluetooth integration, and select Configure on your adapter to change the scanning mode.

(@bdraco - #171985) (Bluetooth documentation)

Breaking

Certificate Expiry

The error attribute on the certificate expiry sensor now returns a proper None value instead of the string "None" when there is no error.

If you use this attribute in templates, update your comparisons from == "None" to is none.

(@TomFilsell - #170878) (Certificate Expiry documentation)

Breaking

ESPHome

The default Bluetooth proxy scanning mode for ESPHome devices is now Auto. Devices that were previously set to Active are automatically migrated to Auto, while devices set to Passive keep their setting.

If you need Active scanning for a specific device, change it back in the device options under Settings > Devices & services.

(@bdraco - #171996) (ESPHome documentation)

Breaking

HDMI-CEC

Calling the turn_off action on HDMI-CEC switch or media player entities now sends the standard CEC standby command instead of a vendor-specific power-off command. This works more reliably across devices from different manufacturers.

If you relied on the previous behavior, you can send the original command using the hdmi_cec.send_command action with keypress 0x44 followed by 0x6c.

(@pattyland - #170206) (HDMI-CEC documentation)

Breaking

IronOS

The uptime sensor for IronOS soldering irons has changed from a duration sensor (reporting seconds) to a timestamp sensor that reports when the device was started.

Update any automations or dashboards that read this sensor to work with the new timestamp format.

(@tr4nt0r - #169699) (IronOS documentation)

Breaking

ONVIF

When you call the onvif.ptz action with continuous_duration: 0, the integration no longer sends a Stop command after the ContinuousMove. This lets you start a continuous movement and stop it later with a separate call.

If your automations rely on the camera stopping automatically, set continuous_duration to the desired duration in seconds.

(@yoxcu - #163173) (ONVIF documentation)

Breaking

Shelly

Shelly devices used as Bluetooth scanners now support the new Auto scanning mode. Existing devices set to Active are automatically migrated to Auto for better battery and performance.

You can change the scanning mode back in the device options under Settings > Devices & services.

(@bdraco - #172008) (Shelly documentation)

Breaking

SmartThings

The source attribute on SmartThings media players is now normalized to standard Home Assistant values. For example, D.IN is now reported as digital_input and BT as bluetooth.

If you use the source attribute in automations, dashboards, or templates, update them to match the new values.

(@felipecrs - #160034) (SmartThings documentation)

Breaking

Template entities

The legacy template platform syntax under the individual platform keys has been removed. This syntax was deprecated in Home Assistant 2025.12 and has now reached the end of its 6-month deprecation period.

This affects the following platforms:

  • alarm_control_panel
  • binary_sensor
  • cover
  • fan
  • light
  • lock
  • sensor
  • switch
  • vacuum
  • weather

Move your template entities to the modern template: syntax. A step-by-step migration guide is available in the Removal of legacy template entities forum thread.

(@Petro31 - #169608, #169610, #169611, #169613, #169615, #169725, #169728, #169730, #169732, #169734) (Template documentation)

Breaking

Tuya

The unit of measurement provided by the Tuya API now takes precedence over the default unit assigned by Home Assistant. This makes the reported value match what the Tuya app shows.

If your device reports an invalid or unexpected unit, please submit a bug report with the device details and the unit it reports and adjust it accordingly.

(@epenet - #170338) (Tuya documentation)

Breaking

Velux

The deprecated velux.reboot_gateway action has been removed. Use the reboot button entity on your Velux gateway instead.

(@wollew - #169796) (Velux documentation)

Full release notes for 2026.6.0

2026.6.1 – 2026.6.4: no action items (4 versions)

2026.7.0 2026-07-01

Quoted from www.home-assistant.io/blog/2026/07/01/release-20267/#backward-incompatible-changes

Breaking

Purpose-specific triggers and conditions

Several entity triggers and conditions, part of the new purpose-specific triggers and conditions, have been renamed so their keys are consistent across all domains. The old keys no longer work.

The following triggers changed:

  • battery.low is now battery.became_low
  • battery.not_low is now battery.no_longer_low
  • lawn_mower.docked is now lawn_mower.returned_to_dock
  • schedule.turned_off is now schedule.block_ended
  • schedule.turned_on is now schedule.block_started
  • timer.time_remaining is now timer.remaining_time_reached
  • update.update_became_available is now update.became_available
  • vacuum.docked is now vacuum.returned_to_dock

The following conditions changed:

  • climate.target_humidity is now climate.is_target_humidity
  • climate.target_temperature is now climate.is_target_temperature

If an automation or script uses one of these, it will stop working until updated. To fix it, open the affected automation or script, re-select the trigger or condition (it now appears under its new name), and save. If you edit in YAML, replace the old key with the new one from the list above.

(@frenck - #174463)

Breaking

BSB-LAN

The BSB-LAN integration has reduced its support for the older version 1 JSON API. If your BSB-LAN device runs very old firmware that only speaks the version 1 API, update it to firmware that supports the version 2 API to keep everything working.

A repair notification will let you know if your device is affected.

(@liudger - #172843) (BSB-LAN documentation)

Breaking

iCloud

The battery_level attribute has been removed from iCloud device tracker entities. Use the dedicated battery sensor in your automations and scripts instead.

(@some-random-climber - #174117) (iCloud documentation)

Breaking

Person

Person entities no longer report the latitude and longitude of the home zone when their location comes from a presence scanner associated with the home zone.

If you have automations or scripts that check the coordinates of a person, adjust them. To check whether a person is in a specific zone, use the new in_zones state attribute instead.

(@emontnemery - #173042) (Person documentation)

Breaking

Rabbit Air

The Rabbit Air fan preset mode values changed from title case to lowercase to match Home Assistant's state convention: Auto is now auto, Manual is now manual, and Pollen is now pollen. The user-facing labels stay the same through translations.

Update any automations, scripts, templates, or action calls that reference the old title-case preset values.

(@MagikalUnicorn - #172931) (Rabbit Air documentation)

Breaking

Reolink

Reolink Duo PoE and Duo WiFi dual-lens cameras now expose a sub-device per lens. The camera and motion/AI sensor entities that previously had a "lens 0" or "lens 1" suffix in their name are moved to the new lens sub-devices and lose that suffix. Entity IDs and custom names stay the same, so most automations keep working.

If you target these entities through the camera device, update them to use the new lens sub-devices.

(@Markus98 - #173037) (Reolink documentation)

Breaking

StarLine

The battery_level attribute has been removed from StarLine device tracker entities. Use the dedicated battery sensor in your automations and scripts instead.

(@some-random-climber - #174118) (StarLine documentation)

Breaking

Tesla Fleet

The route device tracker (device_tracker.<vehicle>_route) no longer reports the active route's destination name as its state. Its state is now derived from your zones like a normal device tracker (home, not_home, or a zone name), based on the route's coordinates.

The destination name is still available through the new destination sensor (sensor.<vehicle>_destination), which is disabled by default. Enable it from the entity settings if you have automations that relied on the destination name, and update any automations that matched the old route tracker state.

(@Bre77 - #172513) (Tesla Fleet documentation)

Breaking

Teslemetry

The route device tracker no longer reports the active route's destination as its state or through a location_name attribute. Its state is now derived purely from the route's coordinates (zone-aware, like home or not_home).

If you relied on the destination name, enable the new Destination sensor (sensor.*_destination), which is disabled by default and reports the destination name as Tesla provides it.

(@Bre77 - #172514) (Teslemetry documentation)

Breaking

Tractive

The battery_level attribute has been removed from Tractive device tracker entities. Use the dedicated battery sensor in your automations and scripts instead.

(@bieniu - #172756) (Tractive documentation)

Breaking

Zeroconf

The legacy requires_api_password field has been removed from the Home Assistant zeroconf/mDNS discovery announcement (_home-assistant._tcp). It had been hardcoded to true since the http.api_password authentication mechanism was removed in Home Assistant 2024.7, so it no longer carried any meaning. The official companion apps already ignore it.

Third-party discovery clients that still read this field need to tolerate its absence.

(@agners - #173090) (Zeroconf documentation) (API documentation)

Breaking

Zone

The state (person count) and persons attribute of zone entities are now calculated from the in_zones attribute of person entities. As a result, a person can now be counted in more than one zone at the same time. For example, a person who is home with in_zones: ["home", "near_home"] now counts toward both zone.home and zone.near_home, where previously they only counted toward zone.home.

In addition, the state of position-aware device trackers is now the smallest zone the device is in, instead of the zone whose center it is closest to.

Automations, scripts, or templates that depend on zone person counts or on device tracker zone states may need to be adjusted.

(@emontnemery - #172942, #173106) (Zone documentation)

Breaking

Z-Wave JS

This release requires an updated Z-Wave JS server. You need zwave-js-server 3.9.0 or newer (schema 49):

  • If you use the Z-Wave JS app, update it to at least version 1.4.0.
  • If you use the Z-Wave JS UI Docker container, update it to at least version 11.19.1.
  • If you run your own zwave-js-server, update it to at least version 3.9.0.

(@AlCalzone - #173309) (Z-Wave JS documentation)

Full release notes for 2026.7.0

2026.7.1 – 2026.7.4: no action items (4 versions)

2026.8.0 2026-08-05

Quoted from www.home-assistant.io/blog/2026/08/05/release-20268/#backward-incompatible-changes

Breaking

AirNow

The station radius option has been removed. The 2026 AirNow API no longer uses a distance parameter, so the radius had no effect on which reporting station was used. Existing entries are updated automatically, and any radius you had set is discarded. No action is needed.

(@derekcentrico - #176740) (AirNow documentation)

Breaking

Gardena Bluetooth

The valve's activation_reason sensor now reports a fixed set of values instead of free-form text. If you have automations, scripts, or templates that match on the old text values, update them to match the new ones.

(@elupus - #177187)

Breaking

Edifier Infrared

If you set up the Edifier Infrared integration for the R2000DB or R2730DB speakers, some buttons were mapped to the wrong infrared codes (on the R2730DB, power and mute were swapped). The mappings are now corrected and migrated automatically. If you built automations or scripts around the old, incorrect buttons, update them to match.

(@abmantis - #177472) (Edifier Infrared documentation)

Breaking

Ohme

The Ohme energy sensor has been removed. It reported an estimate of the energy stored in the car's battery rather than the energy delivered by the charger, which caused confusing jumps in the energy dashboard, and the vendor's API no longer provides a useful value.

If you tracked this sensor, use an Integration - Riemann sum helper on a power sensor to estimate the energy instead.

(@dan-r - #174664) (Ohme documentation)

Breaking

Paperless-ngx

Paperless-ngx now requires a newer version of your Paperless-ngx server. The minimum supported server version is raised to 2.19, which also restores compatibility with Paperless-ngx 3.0. If your Paperless-ngx server is on version 2.18 or older, update it before you update Home Assistant.

(@IngmarStein - #176889) (Paperless-ngx documentation)

Breaking

Robot vacuums

The deprecated battery_level property has been removed from the vacuum entities of several integrations. If you use a robot vacuum's battery level in an automation, script, or on a dashboard, use the vacuum's battery sensor instead.

This affects the following integrations:

(@gjohansson-ST - #175681, #175684, #175685, #175686, #175687, #175688, #175691, #175764)

Breaking

ScreenLogic

The option to configure the polling interval has been removed from ScreenLogic. Home Assistant now polls the integration at a fixed interval. If you need a different update frequency, you can set your own polling interval or trigger an update with the homeassistant.update_entity action.

(@Pinball3D - #175576) (ScreenLogic documentation)

Breaking

UniFi Protect

Support for UniFi Protect AI Port devices has been removed. These devices only ever exposed diagnostic sensors, all disabled by default, and are not part of the UniFi Protect public API the integration is moving to. The AI Port device and its sensors are removed automatically when you update. You can still configure the AI Port directly in UniFi Protect.

(@RaHehl - #174378) (UniFi Protect documentation)

Detection scores are no longer available. The detection binary sensors (motion, person, vehicle, animal, and the smart-audio alarm sensors) now take their state from the UniFi Protect public API, which carries no per-event score, so their event_score attribute is gone and automations that filter on it need another condition. The event id and the detected types moved to the new Motion detection, Smart detection, and Sound detection event entities.

(@RaHehl - #174948) (UniFi Protect documentation)

UniFi Protect 7.1 or newer is now required. On an older console the integration reports that the version is too old instead of setting up. Update UniFi Protect to 7.1 or newer to keep using it.

(@RaHehl - #177620) (UniFi Protect documentation)

Breaking

Volvo On Call

The Volvo On Call integration has been removed. If you have a supported Volvo, set up the newer Volvo integration instead.

(@gjohansson-ST - #175677)

Full release notes for 2026.8.0

2026.8.1 – 2026.8.3: no action items (3 versions)

2026.9.0 2026-09-02

Quoted from www.home-assistant.io/blog/2026/09/02/release-20269/#backward-incompatible-changes

Breaking

Flexit Nordic (BACnet)

The deprecated fireplace mode switch entity has been removed. If you have automations or scripts that use switch.<device>_fireplace_mode, use the climate.set_preset_mode action on the Flexit climate entity with preset_mode: fireplace instead.

(@magnusoverli - #179272) (Flexit Nordic (BACnet) documentation)

Breaking

KNX

KNX exposes no longer send an entity's first value to the KNX bus. Previously, this depended on timing: if the entity already had a value when the expose was set up, nothing was sent, but if the value arrived later, it was sent to the bus right away.

Now, both cases behave the same way. The first value is adopted locally without sending a telegram, but stays available for read requests and periodic sending. Later value changes are still sent as before.

To send the first value right away, turn on Send on initialization for the expose in the KNX panel, or set send_on_init: true in your YAML configuration.

(@Kolbi - #178793) (KNX documentation)

Breaking

LLM APIs

LLM tool names are now prefixed with the domain of the integration that offers them. For example, GetLiveContext becomes homeassistant__GetLiveContext and HassTurnOn becomes intent__HassTurnOn. If you have a custom prompt that names a tool directly, update it to use the new prefixed name.

(@balloob - #179938)

Breaking

Persistent Notification

Updating a persistent notification that already exists now triggers an update_type of updated instead of added. If you have an automation that triggers on an update_type of added to catch every new or changed notification, add updated to the list of types it triggers on.

(@davidlang42 - #171067) (Persistent Notification documentation)

Breaking

UniFi Protect

The smart detection switches (for example Detections: Person, Detections: Vehicle, and the audio alarm toggles) are no longer hidden while recording is disabled. They now stay available and follow the same public API as the other camera configuration switches. Their entity IDs and what happens when you toggle them are unchanged.

(@RaHehl - #174963) (UniFi Protect documentation)

UniFi Protect 7.2.105 or newer is now required. On an older version, the integration stops setting up and tells you to update. Update UniFi Protect, then reload the integration.

(@RaHehl - #179954) (UniFi Protect documentation)

Breaking

Update

Installing an update, skipping an update, and clearing a skipped update now require an administrator account. These are configuration-level actions, so they are now restricted to admins, like other sensitive actions in Home Assistant.

Automations are not affected, because they run without a user context. A script runs in the context of the user who started it, so a script that installs or skips an update now fails when a non-admin user starts it. Trigger it from an automation instead, or start it as an admin.

(@balloob - #178232) (Update documentation)

Breaking

Vacuum

The deprecated battery_level property has been removed from the base vacuum entity. All core vacuum integrations were already migrated in Home Assistant 2026.8. If a custom integration still sets this property, it no longer reports a battery level; add a separate battery sensor instead.

(@gjohansson-ST - #175682) (Vacuum documentation)

Breaking

Z-Wave JS

The Z-Wave actions to manage lock users and credentials (set_user, delete_user, delete_all_users, set_credential, delete_credential, and delete_all_credentials) now require an administrator account.

(@balloob - #177300) (Z-Wave JS documentation)

Full release notes for 2026.9.0

2026.9.1 – 2026.9.4: no action items (4 versions)

Release notes from github.com/home-assistant/core/releases, and the official release blog, checked 17 hours ago. Only text the vendor marks as breaking, or puts in a warning/caution/important note, is shown; read the full notes for anything else. Home Assistant lists its breaking changes in the “Backward-incompatible changes” section of each monthly release post on home-assistant.io (2020.12 onward). Each entry of that section is quoted as “Breaking” on the x.y.0 release, under the integration name the post gives it. The post’s “Farewell to the following” section (integrations removed in that release, 2020.12–2024.5) is quoted whole as “Note”. The post's separate section for custom integration developers is not quoted. Patch releases are listed but their notes (lists of fixes) are not quoted. Versions come from PyPI (package homeassistant).