2022.2: Let’s start streamlining!

I’m not sure if this is really fitting; it is February already… but since
this is the first release of the year, I’m going to say it anyway:

Happy New Year 🥂

And, since we have skipped the January release, this release became a big one.
Over 2,500 contributions make this release the largest one we have ever
shipped! Including 15 brand-new integrations and 13 existing integrations,
which are now available to set up via the user interface.

Now don’t be scared when you look at the breaking changes section. It is a lot,
however, most of those are cleanup of old deprecations, or caused by things
moving to the UI. No better way to start a fresh year, than by cleaning up 🧹

By the way, in case you’ve missed it, @balloob published a blog post last
week about the focus for Home Assistant in 2022: Streamlining Experiences.
I’m stoked about it, and am really looking forward to what this year will do
for Home Assistant! Go 2022!

What is your new years’ resolution for your smart home this year?

Enjoy the release!

../Frenck

Updates from Nabu Casa

Before we dive into this release, we have some news and updates from
Nabu Casa to share with you.

Annual subscriptions now available for the United States

The ability to subscribe to Home Assistant Cloud
anually, was one of the most requested features since Nabu Casa was founded and has been
announced at the State of the Open Home in December.

As of today, annual subscriptions to Home Assistant Cloud are available
for the United States. 🎉

Read more about the announcement on the Nabu Casa website

Improved infrastructure

Nabu Casa’s new payment system is part of revamped cloud system that they are
rolling out, and this will bring more improvements to the Home Assistant Cloud
services.

They already improved our remote access infrastructure to make sure it’s routing
as close to you as possible. Last week they rolled out improvements
to the infrastructure that significantly improved the speed of the
Google Assistant and Amazon Alexa integrations.

Zack Barett and Mike Degatano join Nabu Casa

We are also happy to announce Zack Barett and
Mike Degatano will be joining Nabu Casa to work
on Home Assistant.

Zack will be helping out on different aspects of Home Assistant, including the
Home Assistant YouTube channel,
and the Home Assistant Frontend.

Mike is going to be focusing on extending and improving the Home Assistant
Supervisor and the eco system around it (like its internal plugins and add-ons).

Welcome! Excited to have you on board! 🎉

Media improvements

The media browser has been renamed to: “Media”. Nice, simple, and clean.

And, it now has a nice media bar in the bottom to control the media you
are playing:

Screenshot showing media with the new media bar

The experience of browsing the media has been improved and extended with new
capabilities. The URL in your browser will change when browsing media, so you
can now bookmark these pages. An integration can now browse media of supported
sources provided by other integrations.

For example, if you have set up the Spotify and Sonos integration, you can now
browse your Spotify to play it on your Sonos devices; and Cast now has support
for playing Plex media straight from the browser.

Sonos, VLC (via Telnet), and Roku added support for playing local media! Combining
this with the VLC add-on can turn your Home Assistant device into a
media player for your local media. In the video below, Zack will demonstrate how
that works:

Check for updates

A common question, directly seen after a Home Assistant Core, Operating System,
or add-on release announcement: “I don’t see the update yet? How do I update?”

Checking for updates is done by your system – every few hours – automatically.
However, you sometimes want to check for updates without waiting for
this to happen.

This made us realize that doing that was scattered and hidden in several places
depending on which part you wanted to check updates for. Therefore, we
have added a nice and simple “Check for updates” button in the main
configuration screen.

Screenshot showing the new Check for Updates button in the configuration screen
Checking for any update is now just a single click.

This feature is currently available for the Home Assistant OS,
and Home Assistant Supervised installation methods.

Diagnostics for integrations and devices

To make debugging and reporting issues with integrations or devices easier,
both in terms of reporting it, and for developers to fix them, we introduce:
Diagnostics.

Diagnostics can be provided by integrations and allow you to download diagnostic
information about an integration or device you have set up.

Screenshot showing the Download Diagnostics button on a Sonos device page
Screenshot of the Download Diagnostics button on the device page

The downloadable diagnostics file can be viewed as a text file,
and can be shared when reporting an issue in our issue tracker.

Diagnostics data can be extremely helpful in finding the root causes of
an issue and getting them fixed. As a matter of fact, it helped us pinpointing
and fixing issues during the beta of this release.

The good news is that 61! integrations already added support for this new
diagnostics feature, including Z-Wave JS, ESPHome, Sonos, Shelly, WLED,
Unifi, Nest, deCONZ, KNX, Tuya, Roku, Samsung TV, and many more!

Finding known issues and where to report new ones

Are you experiencing an issue with an integration? Want to know if your issue
is already known and reported? Or, maybe you are not sure where our
issue tracker can be found?

We added a small menu option to each integration, helping with that.

Screenshot showing the known issues menu item an integration card
Clicking the “Known issues” item will open up our issue tracker for this integration.

This button will bring you to our issue tracker, showing all currently known
and open issues for this integration.

Is your issue not listed? Well, if this integration provides diagnostics,
download those. Next, go back to issue tracker, using the new known issues link,
and click the “New issue” button in the top right corner to report your issue.
Fill out the form and attach the diagnostics file by dragging and
dropping it into the form.

Improved handling of device tracker entities

If you run an integration that provides device trackers from your router or
something like the UniFi Network integration, you are probably aware those
can create many entities!

This has been improved now. As of today, by default, only device tracker
entities that match up with an existing – known by Home Assistant – device
will be enabled by default. This keeps Home Assistant nice and tidy.

If Home Assistant does not know the device, but you still would like to track
a specific one, that is still possible. In that case, you can enable the
particular device tracker entities you’d like to have.

Scenes now have a state

Scenes never had a state, well that is not entirely true, it would always
say: “scening”.

To make the state of a scene more valuable, it will now have the last timestamp
of when the scene was activated. This has a couple of advantages:

  • You can see when a scene was last activated.
  • History of when a scene was activated in the logbook, and who did that.
  • You can now automate on a scene being activated.

The last one is pretty useful as a scene can now be used to trigger even more
actions via automations. For example, you could start playing media or send
a TTS announcement when a scene activated.

Screenshot of the logbook of a scene
Now the scene has a state; it also got logbook entries.

Search in the configuration panel

There is now a search in the top right of the configuration dashboard, which
opens the Quick Bar. This also works on mobile devices.

It allows you to access and search for just about anything within
Home Assistant. From accessing add-ons, configuration panels,
and even entities and devices.

Screenshot showing the new search in the configuration screen

Tip: Did you know you can press c (for command) and e (for entity) on you
keyboard from anywhere in Home Assistant to bring up that same Quick Bar?

Button helper and template

In the previous release, we introduced
the button entity. One of the most asked questions about the button has been:
“How can I create my own button entity?”

This release introduces the button helper, and those can be created via
the UI and using YAML ( as the input_button).

These button helpers can be used to trigger automations and we have ensured they
work with Alexa, Google Assistant, and HomeKit.

Additionally, there is now a template entity for buttons available as well.
Here is an example:

# Example configuration.yaml
template:
  button:
    - name: "Send message"
      press:
        - service: notify.frenck
          data:
            message: "My button has been pressed!"

Templating enhancements

There are a couple of nice enhancements to this release for the more advanced
use cases that stand out.

Shorthand condition notations in actions

Shorthand condition notations are pretty helpful and are now supported in
conditions actions; For use in automations and scripts.

For example:

sequence:
  - condition: "{{ is_state('device_tracker.iphone', 'away') }}"

Immediate if (iif)

We now have an immediate if (iif)
template function and filter that can be used as a short alternative version
to an if/else statement.

These can help shortening a lot of if/else constructs that for example, return
a “Yes” or “No” (or similar) value in templates. Some examples:

{{ iif(is_state('light.kitchen', 'on'), 'Yes', 'No') }}
{{ is_state('light.kitchen', 'on') | iif('Yes', 'No') }}
{{ (state('light.kitchen') == 'on') | iif('Yes', 'No') }}

Other noteworthy changes

There is much more juice in this release; here are some of the other
noteworthy changes this release:

  • When an integration has a single device, clicking on the “1 device” link will
    now navigate to that device directly and skip the addition page with a table
    showing 1 item. This makes navigating those cases quicker, thanks @balloob!

  • There is now a tiny menu on discovered devices and services, which allows
    you to visit the device/service and find the documentation that belongs to
    this discovered item.

    Screenshot showing the new menu on a discovered item

  • Editing trigger IDs in automations has moved into the trigger menu, making
    the automation editor a little more compact.

    Screenshot showing the moved trigger ID feature

  • When viewing backups, it will now display the size of each backup in the
    table. Thanks, @ludeeus!

  • Thanks to @bramkragten, you can now select the period in the options of
    the statistics card.

  • The Apple TV integration has been updated to support tvOS 15 and can now
    launch apps too! Thanks, @postlund!

  • Thanks to @bdraco, a device can now also display its hardware version in
    Home Assistant. The HomeKit, Xiaomi Miio, Bond, Roku, and WLED integrations
    have already adopted this.

  • The Google Assistant integration can now be set up to use local
    fulfillment, thanks to @LoekSangers! Please note that this only applies to
    manual setups. This is already handled automatically when using the Home
    Assistant Cloud.

  • ZHA devices now have identify buttons, so you know which light you are
    dealing with, thanks @dmulcahey! (Tip: also nice for visual notifications)

  • We now enable Low Latency HLS (LL-HLS) by default to lower stream latency.
    Also, stream can now generate still images from a video feed. Generic Camera
    can now use this and can be set up without the still_image_url option. FFmpeg
    Camera users can consider using this as an alternative as it does not require
    multiple simultaneous camera connections. Thanks @uvjustin and @allenporter!

  • Magic Home (also known as FluxLED) had lots of improvements of love from @bdraco!

  • @Danielhiversen added support for local access to Adax and Mill heaters. Nice!

  • Tuya now supports Pet Feeders (thanks @vauriga), Circuit Breakers (thanks @slydiman),
    and Alarms (thanks @leeyuentuen). Additionally, support for Fans has been improved.

  • The generic thermostat integration now supports presets, thanks @brianegge!

  • Home Connect added support for refrigerators and cook processors,
    thanks @BraveChicken1 and @noxhirsch

  • @Shutgun added support for sirens to devolo Home Control.

  • Tibber added sensors for estimated hourly and monthly consumption, costs, and
    more! Thanks, @Danielhiversen!

  • We now have a slugify template filter, thanks to @ZephireNZ!

  • @Petro31 make is_number available as tests in templates.

  • Volumio has now repeat, repeat, repeat, … support. Thanks, @m4rkireland!

  • @marcelveldt added a service to the Hue integration for setting more
    advanced scene options. Thanks!

  • Sonos now has a binary sensor that can tell you if the microphone is on or off.
    Helpful for a notification in case it shouldn’t be on or off. Thanks, @jjlawren!

  • @sebfortier2288 add support for tilt devices to Soma. Nice!

  • Google Assistant now supports the curtain device classes, thanks @emontnemery!

  • If you are using Synology DSM connected cameras, you can now select the
    quality of the snapshots taken. Thanks, @mib1185!

  • A whole bunch of entities have been added to configure Yamaha MusicCast,
    really nice @micha91!

  • Environment Canada now has an AQHI sensor. Thanks, @gwww!

  • And honestly, this list is far from complete! There is so much this release.
    Feel free to check and search the “All Changes” section to find more!

    This release adds support for long-term statistics to the following integrations:

    And the following integrations now have entity categories:

    New Integrations

    We welcome the following new integrations this release:

    Integrations now available to set up from the UI

    The following integrations are now available via the Home Assistant UI:

    Release 2022.2.1 – February 3

    Release 2022.2.2 – February 4

    Release 2022.2.3 – February 6

    Release 2022.2.4 – February 8

    Release 2022.2.5 – February 9

    If you need help…

    …don’t hesitate to use our very active forums or join us for a little chat.

    Experiencing issues introduced by this release? Please report them in our issue tracker. Make sure to fill in all fields of the issue template.

    Breaking Changes

    Below is a listing of the breaking change for this release, per subject or
    integration. Click on one of those to read more about the breaking change
    for that specific item.

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Energy Dashboard

    The configuration of the Energy Dashboard has moved.

    Previously this was found as a menu item in the configuration screen,
    but has now been moved into the “Dashboard” menu item.

    This keeps the configuration of all dashboards in a single place.

    (@zsarnett#11386)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Python 3.8 support dropped

    Python 3.8 support has previously been deprecated and now has been removed.
    Home Assistant now requires Python 3.9 to run.

    If you are using Home Assistant OS, Home Assistant Container, or Home Assistant
    Supervised installation method, you don’t have to do anything. In those cases,
    we handle this all for you. Your system has been using Python 3.9 for quite
    some time already.

    (@frenck#63883)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    GPIO Integrations

    As of this release, all integrations interfacing with GPIO directly, have been
    deprecated.

    There are multiple reasons for this, which includes a general low usage of
    these integrations. For most Home Assistant installations, GPIO isn’t easily
    usable and more often the integrations are unmaintained.

    More information can be found in
    Architectural Decision Record 0019.

    Additionally, there are many projects around that handle these purposes of GPIO
    better than Home Assistant. For example, our sister project ESPHome, or
    the MQTT IO project, and many more.

    We do not forbid the use of GPIO, but we are merely deprecating and removing
    built-in integrations, providing GPIO functionality from Core. We welcome
    custom integrations (existing or new ones) to provide alternatives. However,
    for most cases we recommend on using dedicated hardware, like an ESP device,
    instead.

    The following integrations have been deprecated and will be removed in
    Home Assistant Core 2022.4:

    • BeagleBone Black GPIO
    • BH1750
    • Blinkt!
    • Bosch BME280 Environmental Sensor
    • Bosch BME680 Environmental Sensor
    • Bosch BMP280 Environmental Sensor
    • DHT Sensor
    • Enviro pHAT
    • HTU21D(F) Sensor
    • mcp23017
    • MH-Z19 CO2 Sensor
    • Orange Pi GPIO
    • pcal9535a
    • pi4ioe5v9xxxx
    • PiFace Digital I/O (PFIO)
    • Piglow
    • pigpio Daemon PWM LED
    • Raspberry Pi RF
    • Rasphihats
    • Sense HAT
    • Sensirion SHT31
    • Time of Flight

    The following integration have been deprecated and will be removed in
    Home Assistant Core 2022.6:

    • 1-Wire (SysBus only!)
    • Raspberry Pi GPIO

    Note: 1-Wire is a special case, as it supports both the SysBus and connecting
    to a remote owfs server. The use of the SysBus is deprecated, however,
    connecting to a remote owfs server is not.

    Update: We’ve been notified by a developer that the Raspberry Pi GPIO integration will be made available via HACS.

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Binary Sensors

    Previously, binary_sensor entities could have the state on, off, and
    in case the device was unreachable: unavailable.

    However, compared to other entities, it wasn’t able to have the unknown state,
    which has been added this release.

    So, a binary_sensor entity can now have the on, off, unavailable, or unknown state.

    You might need to adapt your automations or scripts to take this new
    unknown state into account.

    (@frenck#60193) (binary_sensor docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Groups: Locks

    The behavior of grouped locks has been reversed such that “unlocked” is
    mapped to on and “locked” to off.

    This means that:

    • A group with mixed domains will be considered on if any lock included in
      the group is unlocked.
    • A group of locks will be considered “unlocked” if any lock included in the
    • group is unlocked.

    (@emontnemery#62580) (lock docs) (group docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Fan/Humidifer/Light/Remote/Siren/Switch/Vacuum

    Previously, toggle-based entities (like fan, light, switch, remote, siren, vacuum, humidifier) could have the state on or off, and in case the device was unreachable: unavailable. However, compared to other entities, toggle entities weren’t able to have an unknown state, this now has changed.

    As of now, toggle-based entities can have the on, off, unavailable, or unknown state.

    You might need to adapt your automations or scripts to take this new unknown state into account.

    (@frenck#64621)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Command-line arguments and OS check

    Home Assistant no longer supports managing a PID file or creation of a daemon process. Users who use a customized core or container installation may need to update their startup scripts.

    The --runner option is no longer supported by the hass command. Requesting a restart from the UI will now always exit with exit code 100. You will need to update your startup scripts to handle the restart, like our Systemd service example.

    Home Assistant will exit immediately if not started from a supported operating system according to ADR-0016: Linux (including WSL) or OSX. A new command line parameter --ignore-os-check has been added to allow overriding this check.

    (@emontnemery#64345) #64347) #64352)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Advantage Air

    The advantage_air.set_myzone service has been deprecated and will be removed
    in a future version of Home Assistant.

    Please use the select.select_option service on the MyZone select entity to change this value on supported systems instead.

    (@Bre77#58777) (advantage_air docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Android TV

    The Android TV integration migrated to configuration via the
    UI. Configuring Android TV via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    API

    The /api/discovery_info endpoint was deprecated in 2021.10, and has since only
    returned blank values. From this version, the /api/discovery_info endpoint has
    been removed completely.

    (@ludeeus#64534) (api docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Apple iCloud

    The Apple iCloud integration migrated to configuration via the
    UI in a previous release already. Configuring Apple iCloud via YAML configuration
    has now been deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is already automatically imported; and thus
    can be safely removed from your YAML configuration.

    (@epenet#63875) (icloud docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Apple Push Notification Service (APNS)

    The Apple Push Notification Service (APNS) integration has been deprecated and
    will be removed in Home Assistant 2022.4. Please note, this does not affect
    our mobile companion apps; as they do not use this integration for their
    notifications.

    (@frenck#64629) (apns docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Aurora ABB PowerOne Solar PV

    The previously deprecated YAML configuration of the Aurora ABB PowerOne Solar PV
    integration has been removed.

    Aurora ABB PowerOne Solar PV is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62317) (aurora_abb_powerone docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    AVM FRITZ!Box Tools

    The previously deprecated YAML configuration of the AVM FRITZ!Box Tools
    integration has been removed.

    AVM FRITZ!Box Tools is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    @epenet#63857) (fritz docs)


    The reboot and reconnect services are deprecated and will be removed in future release. Please use the newly provided button entities instead.

    (@chemelli74#61483) (fritz docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    AVM FRITZ!SmartHome

    The lock and devicelock attributes are removed from all entities and now exposed as own sensors.

    (@mib1185#60426) (fritzbox docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Azure Event Hub

    The Azure Event Hub integration migrated to configuration via the
    UI. Configuring Azure Event Hub via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    (@eavanvalkenburg#61155) (azure_event_hub docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    BMW Connected Drive

    The charging_time_remaining (in hours) has been replaced with
    charging_end_time (timestamp) to not clutter the Home Assistant state machine.

    You might need to adapt your automations or scripts for this change.

    (@rikroe#60942) (bmw_connected_drive docs)


    All “bmw_connected_drive.*services are deprecated. Please use the new button entities with thebutton.press` service instead.

    (@rikroe#63136) (bmw_connected_drive docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Bond

    The custom start_increasing_brightness, start_decreasing_brightness and stop services are now deprecated and will be removed in a future release.

    Please use the new button entities, that replace those, instead.

    (@bdraco#64725) (bond docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Broadlink

    The previously deprecated YAML configuration of the Broadlink
    integration has been removed.

    Broadlink is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    (@tkdrob#62341) (broadlink docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    CO2 Signal

    The previously deprecated YAML configuration of the CO2 Signal
    integration has been removed.

    CO2 Signal is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    (@tkdrob#62343) (co2signal docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    CPU Speed

    The CPU Speed integration migrated to configuration via the
    UI. Configuring CPU Speed via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    (@frenck#62929) (cpuspeed docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    DLNA Digital Media Renderer

    The previously deprecated YAML configuration of the DLNA Digital Media Renderer
    integration has been removed.

    DLNA Digital Media Renderer is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62344) (dlna_dmr docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    DNS IP

    The DNS IP integration migrated to configuration via the
    UI. Configuring DNS IP via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    (@gjohansson-ST#62843) (dnsip docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    DoorBird

    The relays and IR light switches are removed and replaced with corresponding
    buttons entities. Any scripts or automations which reference these switches to
    turn them on should change to instead press the button instead.

    (@flacjacket#63995) (doorbird docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    DSMR

    The sensor.energy_consumption_total sensor for DSMR versions 2.2 and 4 has
    been removed. Meters with these versions do not provide this data,
    so this sensor can be safely removed. You might need to clean up
    the orphaned entity in your setup.

    (@rhpijnacker#63436) (dsmr docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Efergy

    The previously deprecated YAML configuration of the Efergy
    integration has been removed.

    Efergy is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    (@tkdrob#61520) (efergy docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Enphase Envoy

    The previously deprecated YAML configuration of the Enphase Envoy integration
    has been removed.

    Enphase Envoy is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    (@tkdrob#61840) (enphase_envoy docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Environment Canada

    The previously deprecated YAML configuration of the Environment Canada
    integration has been removed.

    Environment Canada is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    (@tkdrob#61839) (environment_canada docs)


    The sensors no longer have Timestamp as an extra state attribute, instead,
    use the new timestamp sensor that can be used in automations that track state changes.

    The alert sensors (advisories, endings, statements, warnings, and watches) state is now a count of the number of active alerts for the sensor type
    and the extra state attributes contain the alert text and alert timestamp.

    The attributes are named alert_ and alert_time_ where is 1 for alert 1, 2 for alert 2, etc.

    (@gwww#58615) (environment_canada docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Fan

    This is more a breaking change for custom integration developers.

    Now that all core fans are using the new fan entity model, the compatibility shim
    has been removed. Custom integrations that have not yet switched to the new
    fan model may be affected. For more information see:

    https://developers.home-assistant.io/docs/core/entity/fan/#deprecated-properties

    Preset modes and percentages will continue to be translated back to legacy speeds
    until 2022.3 in order to give users a bit more time to update automations.

    (@bdraco#59781) (fan docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Fibaro

    The energy values are exposed now as separate sensor entities and therefore the
    state attribute current_energy_kwh was removed from all other entities.

    If you use the state attribute current_energy_kwh you need to change
    that to use the new energy sensors instead.

    (@rappenze#63697) (fibaro docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Flume

    The previously deprecated YAML configuration of the Flume integration has been removed.

    Flume is now configured via the UI, any existing YAML configuration has been imported
    in previous releases and can now be safely removed from your YAML configuration files.

    (@tkdrob#61517) (flume docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    FortiOS

    The integration now requires FortiOS 6.4.3 and newer.

    (@kimfrellsen#61970) (fortios docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Foscam

    The previously deprecated YAML configuration of the Foscam integration
    has been removed.

    Foscam is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    (@tkdrob#61761) (foscam docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Foursquare

    The data associated with foursquare.checkin event is now available as a
    dictionary item with key “text”.

    If you use this event in your automation or scripts, you’d need to adjust to
    match this change.

    (@epenet#63982) (foursquare docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    GitHub

    The YAML configuration for the github sensor platform has been removed.

    There was no viable automatic migration of the configuration, so you need to
    manually remove the configuration from your configuration file and set it up
    again in the integration panel.

    Previously this integration created 1 sensor for each repository, now this
    is split out to multiple entities which are mostly disabled by default
    (you can enable the entities you want this integration to provide).

    Support for GitHub enterprise has been removed.

    (@ludeeus#64190) (github docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Google Maps Travel Time

    The previously deprecated YAML configuration of the Google Maps Travel Time
    integration has been removed.

    Google Maps Travel Time is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62468) (google_travel_time docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    HomeKit

    HomeKit will now automatically exclude entities with an entity category such as
    a configuration or diagnostic entity unless they have been explicitly included.

    To explicitly include an entity:

    • YAML: Add the entity to the filter in either the include_entities or include_entity_globs fields.
    • UI: Select the entity in the UI in include mode. If you are using exclude mode, a second bridge can be created in include mode.

    (@bdraco#64492) (homekit docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Honeywell Total Connect Comfort (US)

    The previously deprecated YAML configuration of the Honeywell Total Connect Comfort
    integration has been removed.

    Honeywell Total Connect Comfort is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62469) (honeywell docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    iOS

    The Home Assistant iOS/macOS app supports notification actions defined in the notification itself; the old method of defining push categories in the iOS integration is now deprecated and will be removed in 2022.4.

    (@zacwest#61078) (ios docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Keenetic NDMS2 Router

    The previously deprecated YAML configuration of the Keenetic NDMS2 Router
    integration has been removed.

    Keenetic NDMS2 Router is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@epenet#63860) (keenetic_ndms2 docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Launch Library

    The Launch Library integration migrated to configuration via the
    UI. Configuring Launch Library via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    (@DurgNomis-drol#62416) (launch_library docs)


    Attributes on the current sensor is changed. Names of these attributes are
    changed to better describe what information they provide. (Ex. agency changed
    name to provider as this is the more correct terminology.) New attributes are
    added to give more information about where it takes place.

    The stream attribute ios moved to the new sensor, and changed its name to stream_live as it represents if the stream is live and not if a stream is
    available.

    And finally, the attribute launch_time moved into its own sensor. This made
    it possible to add some information about the launch window start and end as attributes for the new sensor. This sensor will also contain the stream_live attribute.

    (@DurgNomis-drol#64203) (launch_library docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    LG webOS Smart TV

    The LG webOS Smart TV integration migrated to configuration via the
    UI. Configuring LG webOS Smart TV via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    The turn on action for turning on the
    TV via WakeOnLan or HDMI-CEC was using a service call via YAML, and the turn on action is changed to use a custom automation trigger webostv.turn_on or a device trigger automation that can be setup from the UI.

    Example trigger automation:

    automation:
      trigger:
        - platform: webostv.turn_on
          entity_id: media_player.lg_webos_smart_tv
      action:
        - service: wake_on_lan.send_magic_packet
          data:
            mac: AA-BB-CC-DD-EE-FF
    

    (@thecode#64117) (webostv docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Logitech Squeezebox

    The previously deprecated YAML configuration of the Logitech Squeezebox
    integration has been removed.

    Logitech Squeezebox is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62537) (squeezebox docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Magic Home

    The previously deprecated YAML configuration of the Magic Home
    integration has been removed.

    Magic Home is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    (@tkdrob#61844) (flux_led docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Media Player Classic Home Cinema (MPC-HC)

    The Media Player Classic Home Cinema (MPC-HC) integration has been deprecated
    and will be removed in Home Assistant Core 2022.4.

    This integration is removed under Architectural Decision Record 0004.

    (@frenck#63598) (mpchc docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    MQTT

    The MQTT lights no longer support, the previously deprecated, value_template;state_value_template should be used instead.

    (@emontnemery#62682) (mqtt docs)


    Previouysly MQTT climate would only publish to hold_command_topic or away_mode_command_topic if the new mode is not the same as the current state.

    As of this release MQTT always publishes on both command topics (hold_command_topic and away_mode_command_topic) (if defined) which makes it more predictable
    what update the MQTT device will receive.

    (@jbouwh#63463) (mqtt docs)


    The send_if_off config parameter of the climate platform, which limits
    publishing if the current operation mode is HVAC_MODE_OFF, is now
    deprecated.

    This will break applications that depend on this feature.

    (@jbouwh#63814) (mqtt docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Nanoleaf

    The Nanoleaf integration migrated to configuration via the
    UI in a previous release already. Configuring Nanoleaf via YAML configuration
    has now been deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is already automatically imported; and thus
    can be safely removed from your YAML configuration.

    (@milanmeu#63404) (nanoleaf docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Nest

    The Legacy “Works With Nest API” is deprecated and support will be removed
    in Home Assistant Core 2022.5; See our documentation for using the Smart Device
    Management API
    instead.

    Read why and about potential alternatives.

    (@allenporter#63027) (nest docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    NETGEAR

    The previously deprecated YAML configuration of the NETGEAR
    integration has been removed.

    NETGEAR is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@epenet#63862) (netgear docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Nissan Leaf

    The service to start a charge has been deprecated; it is replaced with a button.

    Replace the nissan_leaf.start_charge service in any existing automations with button.press for the new button.start_NICKNAME_charging entity.

    The nissan_leaf.start_charge service is now deprecated and will be removed
    in a future release.

    (@filcole#62948) (nissan_leaf docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Nmap Tracker

    The previously deprecated YAML configuration of the Nmap Tracker
    integration has been removed.

    Nmap Tracker is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@epenet#63863) (nmap_tracker docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Nuki

    The previously deprecated YAML configuration of the Nuki
    integration has been removed.

    Nuki is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62470) (nuki docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    OpenGarage

    The previously deprecated YAML configuration of the OpenGarage
    integration has been removed.

    OpenGarage is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Philips TV

    The previously deprecated YAML configuration of the Philips TV
    integration has been removed.

    Philips TV is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62471) (philips_js docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    PVOutput

    The PVOutput integration migrated to configuration via the
    UI. Configuring PVOutput via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    Additionally, all sensor attributes of the PVOutput sensor,
    have been extracted in their own dedicated sensors.

    This applies to the following PVOutput attributes:

    • energy_generation
    • power_generation
    • energy_consumption
    • power_consumption
    • efficiency
    • temperature
    • voltage

    If you relied on these in your automation or scripts, you need to adapt those to use the new separate sensors instead. The attributes are currently available, however, deprecated and will be removed in Home Assistant Core 2022.4.

    (@frenck#62667 #62894) (pvoutput docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    ReCollect Waste

    ReCollect Waste no longer stories “next pickup” information as attributes of the “current pickup” sensor; instead, both pickups are now their own sensors.

    (@bachya#62558) (recollect_waste docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    RIVM Stookalert

    The previously deprecated YAML configuration of the Stookalert
    integration has been removed.

    Stookalert is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@frenck#61007) (stookalert docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Samsung SyncThru Printer

    The previously deprecated YAML configuration of the Samsung SyncThru Printer
    integration has been removed.

    Samsung SyncThru Printer is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62541) (syncthru docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Sensibo

    The Sensibo integration migrated to configuration via the
    UI. Configuring Sensibo via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    (@gjohansson-ST#60900) (sensibo docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Sensor.Community (previously: Luftdaten)

    The Luftdaten integration has been renamed to Sensor.Community; which is
    the new name of the Luftdaten project.

    The previously deprecated YAML configuration of this integration
    has been removed.

    Sensor.Community is now configured via the UI, any existing YAML configuration
    has been imported in previous releases and can now be safely removed from your
    YAML configuration files.

    (@frenck#61748 #62865) (luftdaten docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    SMA Solar

    The previously deprecated YAML configuration of the SMA Solar
    integration has been removed.

    SMA Solar is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62472) (sma docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    SolaX Power

    The SolaX Power integration migrated to configuration via the
    UI. Configuring SolaX Power via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    (@tokenize47#56620) (solax docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    SwitchBot

    The SwitchBot integration migrated to configuration via the
    UI in a previous release already. Configuring SwitchBot via YAML configuration
    has now been deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is already automatically imported; and thus
    can be safely removed from your YAML configuration.

    (@tkdrob#62583) (switchbot docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Synology DSM

    The reboot and shutdown services are deprecated and will be removed in a future release. Please use the new button entities instead.

    (@mib1185#57352) (synology_dsm docs) (breaking-change)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Templates: Binary Sensors

    Template trigger binary sensor should start with unknown value rather than always starting with false/off. This matches the template binary sensor behavior
    with other sensors.

    (@amosyuen#62769) (template docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    TP-Link Kasa Smart

    The previously deprecated YAML configuration of the TP-Link Kasa Smart
    integration has been removed.

    TP-Link Kasa Smart is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@bdraco#62457) (tplink docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Trafikverket Train

    The planned time, estimated time and actual time sensor attributes have
    been corrected to be UTC isoformatted strings which is standard in Home Assistant.

    Previously displayed as 2021-12-23T09:07:00 and now correctly set as 2021-12-23T09:07:00+00:00.

    This may affect templates or automations based on these attributes.

    (@gjohansson-ST#62636) (trafikverket_train docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Twinkly

    Key host is removed from the (extra) state attribute of the light entity.

    (@RobBie1221#64139) (twinkly docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Vallox

    The Vallox integration migrated to configuration via the
    UI. Configuring Vallox via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    (@slovdahl#62780) (vallox docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Version

    The Version integration migrated to configuration via the
    UI. Configuring Version via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    Additionally, the source and channel attributes have been removed from
    the Version sensor for the local source.

    (@ludeeus#54642 #64827) (version docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    VeSync

    Previous versions of this integration exposed power and energy usage from
    VeSync outlets as state attributes on the switch entity itself. This used the deprecated properties: current_power_w and today_energy_kwh.

    In this version, these two attributes have been removed from the switch
    entity and split into two new diagnostic sensor entities that are attached to
    the same Device.

    Automations and template entities based on the state attribute mechanism should
    be updated accordingly.

    (@decompil3d#61837) (vesync docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Viessmann ViCare

    The scan interval option has been removed, since the default should be fine
    in almost all cases.

    If you really need more fine-grained control you can disable automatic updates
    in the system settings for the Viessmann ViCare integration and automate the
    polling of the entities with the
    homeassistant.update_entity
    service.

    (@oischinger#63343) (vicare docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    VIZIO SmartCast

    If an integrated vizio TV supports apps and the source is currently a non-app
    input (e.g. HDMI-1), the app_id and app_name attributes will no longer be in the media player entity’s state.

    When the TV is using an app, the app_name will still always be visible and the app_id will continue to only be shown if the app is not recognized.

    (@raman325#64025) (vizio docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    VLC media player Telnet

    The previously deprecated YAML configuration of the VLC media player Telnet
    integration has been removed.

    VLC media player Telnet is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62542) (vlc_telnet docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Waze Travel Time

    The previously deprecated YAML configuration of the Waze Travel Time
    integration has been removed.

    Waze Travel Time is now configured via the UI, any existing YAML
    configuration has been imported in previous releases and can now be safely
    removed from your YAML configuration files.

    (@tkdrob#62543) (waze_travel_time docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    WebSocket API / Media Source

    This concerns custom integration developers only.

    The parameters for async_sign_path have changed. Refresh token is now a keyword parameter. If called as part of a HTTP or WebSocket request, the users refresh token will automatically be used.

    (@balloob#64337)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Whois

    The Whois integration migrated to configuration via the
    UI. Configuring Whois via YAML configuration has been
    deprecated and will be removed in a future Home Assistant release.

    Your existing YAML configuration is automatically imported on upgrade to this
    release; and thus can be safely removed from your YAML configuration after upgrading.

    (@frenck#63069) (whois docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Z-Wave JS

    Due to a schema change, zwave-js-server version 1.14.0 or greater is required.
    Ensure you are using the latest version of zwave-js-server (or the add-ons
    that provide those).

    (@raman325#64407) (zwave_js docs)

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Zero-configuration networking (zeroconf)

    This change is only a concern for custom integration developers.

    Currently zeroconf matching only allows matching the macaddress, model, and manufacturer properties along with the name from the ZeroconfServiceInfo.

    Since properties are arbitrarily defined by the zeroconf service,
    the list of named properties has grown over time.

    Matching now allows for any arbitrarily defined property.
    All property matches must be lowercase, wildcards are supported

    The top level keys model, manufacturer, and macaddress
    are now deprecated from the manifest.json file and should
    be moved into a properties dict.

    For example:

    -    {"type":"_airplay._tcp.local.","model":"appletv*"}
    +    {"type":"_airplay._tcp.local.","properties":{"model":"appletv*"}}
    

    (@bdraco#62133) (zeroconf docs)

    Farewell to the following

    The following integrations are no longer available as of this release:

    All changes

    function showDetails(el) {
    const content = el.parentElement.querySelector(“.details-block-content”);
    const up = el.querySelector(“svg#up”);
    const down = el.querySelector(“svg#down”);
    up.style.display = up.style.display === “none” ? “block” : “none”;
    down.style.display = down.style.display === “none” ? “block” : “none”;
    content.hidden = !content.hidden;
    }

    Click to see all changes!

    Scroll to Top