2023.4: Custom template macros, and many more new entity dialogs!


Home Assistant Core 2023.4! 🎉

The spring (release) is here! And do we have some fine new features for you to play with this upcoming easter weekend! 🐰

I’m thrilled to see more of those new entity dialogs coming in this release. They look beautiful and work exceptionally well from the mobile app. There is even an added bonus of new Tile card features! But…

Oh boy, do I love the new ability to make your own Jinja2 template macros in this release. It is mind-blowing! The best thing about them, it makes them easily shareable as well! Can’t wait to see what you all come up with!

Happy Easter! 🐣 and enjoy the release!


Don’t forget to join our release party live stream on YouTube 5 April 2023, at 12:00 PDT / 21:00 CEST!

New dialogs for alarm, cover, and fan entities

The previous release brought in new entity dialogs for lights, switches, and sirens; it seems many of you really liked it!

So, this release @piitaya kept on trucking, implementing the designs by @matthiasdebaat, bringing the same new clean and neat UI in entity dialogs for alarm control panels, covers, and fans!


First up, covers! For covers, there are many variants, doors, windows, curtains, blinds, shutters, etc. Not just that, some can be controlled by how far they are open/closed, and others can only be opened and closed.

This is no problem for the new dialogs. They will adjust to the capabilities your cover has:

Screenshots showing the new cover entity information dialogs.

The one on the left is interesting, as the first slider controls how far down the blinds are. Notice how it slides in from the top! The slider directly next to it controls the tilt. Nice!


Next up, the fan entities. The UI experience shown in the dialog will automatically adjust to the capabilities of the fan you are controlling, just like with covers.

Screenshots showing the new fan entity information dialogs.

Depending on the number of speed steps your fan has, the dialog will automatically adjust the UI. In case it has four speed steps or less, it will show the speed buttons as on the left screenshot. Otherwise, it will use the slider shown on the most right screenshot.

Alarm control panels

Lastly, the alarm control panel entities. They are a bit different compared to others as, more often, these require one to input a code to arm or disarm the alarm.

Screenrecording showing the new alarm control panel entity information dialogs work with the pin-input. This is how arming and disarming an alarm now looks like.

When needed, the pin-pad will pop up! A nice finishing touch is the neat little animation is shown during the process of arming and disarming the alarm.

New features for the Tile card

The Tile card has two new features: Fan speed & Alarm mode.

Both look and feel similar to the new entity dialogs from above, making the look and feel, nice and consistent. Take a look; aren’t they beautiful?

Screenshots the new fan speed feature for tile cards.

Like the new fan entity dialog, the fan speed feature will show buttons if there are 4 speeds or less; in all other cases, it will use the slider. If the fan can only be turned on/off, like the fan in the middle in the above screenshot, the regular tile can be used.

The alarm mode feature allows quickly setting your alarm in a different state. The feature provides the option to select which modes are shown as buttons in the card.

Screenshots the new alarm mode feature for tile cards.

Just like with the new entity dialog, the pin pad will pop up once a code entry is needed and even the nice little animation is there. 🤩

Macros for your templates

If you are an advanced Home Assistant user, you most likely will be familiar with Home Assistant’s templating language: Jinja2. It allows you to do amazing powerful things in your templates. However, if you have lots of them, you often end up repeating similar logic everywhere!

@depoll to the rescue! He found a way to add the ability to centrally define your own Jinja2 macros and import and use them anywhere in Home Assistant! 🤯

To support this, Home Assistant now has a new custom_templates folder, where you can store your macros. For example, assume this file /config/custom_templates/tools.jinja:

{% macro answer_question(entity_id) %}

Is the {{ state_attr(entity_id, 'friendly_name') }} on?
{{ (states(entity_id) == 'on') | iif('Yes', 'No') }}!

{% endmacro %}

This macro answer_question will ask and answer a question based on a given entity ID. You can now import and use this macro anywhere in Home Assistant. For example:

{% from 'tools.jinja' import answer_question %}
{{ answer_question('light.kitchen') }}

Which will output:

Is the kitchen light on?

An fantastic contribution! Thank you, @depoll!

Reusing templates documentation

More new templating features

As if the reusability of your macros wasn’t good enough already, there is much more templating goodness in this release!

Thanks, @depoll, @ehendrix23, @petro31, and @rokam, for these amazing additions down below! ❤️

Adjusted behavior of relative_time and today_at

@Petro31 adjust the behavior for template entities using the relative_time and today_at template functions to update their state once a minute. Nice!

New is_hidden_entity function

The brand new is_hidden_entity function was added by @depoll, which can tell if a given entity has been marked “hidden” or not. This function also works as a test. Cool!

This example returns a list of all entities in the kitchen area that are not hidden.

{{ area_entities('kitchen') | reject('is_hidden_entity') | list }}

New areas function

Talking about areas, @rokam added an areas function, which returns a list of all areas you have!

A simplistic example:

{{ areas() }}

Added break and continue for use in for loops

@depoll added support for break and continue in for loops, which allows short-circuiting those loops, allowing you to make them more efficient.

{%- for value in range(10) %}
    {%- if value == 1 -%}
        {%- continue -%}
    {%- elif value == 3 -%}
        {%- break -%}
    {%- endif -%}
    {{ value }}
{%- endfor -%}

New has_value function

Lastly, @ehendrix23 added a requested template function from the Month of “What the Heck?!”: has_value. The has_value function can also be used as test and can filter out entities currently in an unavailable or unknown state.

You could use this conditionally, like so:

{% if has_value('sensor.train_departure_time') %}
  The train leaves at {{ states('sensor.train_departure_time') }}
{% endif %}

Or, maybe list all entities from the living room that currently have no state value:

{{ area_entities('living_room') | reject('has_value') | list }}

Database scalability

As your smart home grows and you add more devices, this means more data to keep track of. This release includes significant advancements to the recorder database design to help Home Assistant scale.

This version has a new database format that reduces the space needed to store history for your devices. This change comes with a few benefits:

  • Smaller (deduplication), less disk usage
  • Reduced disk IO (SD-card lifetime improvements)
  • Reduced CPU-usage 📉
  • Quicker startup 🏎️
  • Faster history graphs and logbook
  • Reduced latency in the entire system which means less waiting from the time you hit a button until an action completes 🚀
  • Home Assistant now keeps history when renaming entities 🤘

If you are accessing the database directly, check out the Data Science Portal and the SQL Integration for updated example queries.

It may take a while to complete background data migration, depending on the size of your stored data. To ensure Home Assistant keeps history when renaming an entity, wait 24 hours after upgrading before renaming.

New selector capabilities

Selectors are user inputs for the user interface that drive things like Blueprints. A new selector for use in Blueprints has been added by @emontnemery and @piitaya: The constant selector.

The constant selector provides an optional input, which returns a fixed value (the constant) when enabled, otherwise doesn’t provide any value at all.

Example use in a Blueprint:

  name: Constant selector example
      label: Enabled
      value: true

Which results in the following:

A screenshot showing the new constant selector. When checked, the selector returns the set value.

Also improved are the device and entity filters on the Area, Entity, Device, and Target selectors. Previously, you could filter with a single set of conditions; now, you can pass in a list of filters.

If you are building Blueprints, this can be really helpful if a user should be able to select one of multiple different devices.

An example, this selector allows you to select the battery sensor of either a Philips Hue RWL020 (US) or RWL021 (EU) remote in your Blueprint.

    - integration: deconz
      manufacturer: Philips
      model: RWL020
    - integration: deconz
      manufacturer: Philips
      model: RWL021
    - domain: sensor
      device_class: battery

Translating entities

Over the past releases, we’ve been slowly extending translation support in more places in Home Assistant. This release completes support for translating entities!

This includes the entities’ names, their attributes, and translations of the attribute values. These translations will be visible on your dashboards, dialogs, automation editors, etc. Pretty much all places displaying them.

Integrations have to explicitly add support for these. Quite a few integrations have done so in this release, but we expect many to follow in the upcoming releases.

Other noteworthy changes

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

  • @ArturoGuerra added support for locks to Matter! Nice!
  • The new light entity dialog (introduced last release) now better supports white mode. Thanks, @piitaya!
  • @emontnemery added energy storage and volume storage device classes; these will allow differentiating between, for example, consumed energy versus stored energy in a battery.
  • @starkillerOG is rocking the Reolink integration. It now provides button, switch, siren, select, number, and light entities for all kinds of things you Reolink cameras and doorbells can do. Awesome!
  • The Universal Media Player now supports browsing media! Thanks, @Drafteed!
  • The Supervisor integration now provides sensors containing the Home Assistant Core and Supervisor’s stats. Thanks, @ludeeus!
  • The Spotify integration now supports podcasts! Nice @BTMorton!
  • LIVISI Smart Home now supports climate devices, switches (PSSO, ISS, and ISS2), and window sensors (WDS). Thanks @StefanIacobLivisi & @planbnet!
  • ESPHome now supports pairing Bluetooth devices. Nice work @bdraco & @jagheterfredrik!
  • @MarkGodwin extended the TP-Link Omada integration to support update entities; awesome!
  • All sun.sun entity attributes are now also available as sensors, much easier to use, thanks @gjohansson-ST!
  • Covers with the door device class, now appear as actual doors in HomeKit, nice @Dexwell!
  • @loongyh did something similar for Google Assistant. Covers with the window device class now show up as actual windows. Thanks!
  • The SQL integration now supports settings device and state classes, thanks @gjohansson-ST!
  • @teharris1 added support for the new Insteon i3 device, cool!

New Integrations

This release has no new integrations, but does provide a couple of new virtual integrations. Virtual integrations are stubs handled by other (existing) integrations to help with findability. These are new:

Integrations now available to set up from the UI

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

Release 2023.4.1 - April 6

Release 2023.4.2 - April 8

Release 2023.4.3 - April 12

Release 2023.4.4 - April 13

Release 2023.4.5 - April 17

Release 2023.4.6 - April 21

Need help? Join the community!

Home Assistant has a great community of users who are all more than willing to help each other out. So, join us!

Our very active Discord chat server is an excellent place to be at, and don’t forget to join our amazing forums.

Found a bug or issue? Please report it in our issue tracker, to get it fixed! Or, check our help page for guidance for more places you can go.

Are you more into email? Sign-up for our Building the Open Home Newsletter to get the latest news about features, things happening in our community and other news about building an Open Home; straight into your inbox.

Backward-incompatible changes

If you are a custom integration developer and want to learn about breaking changes and new features available for your integration: Be sure to follow our developer blog. The following are the most notable for this release:

Farewell to the following

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

  • Dark Sky has been removed. Apple acquired Dark Sky, and the API has now been shut down. (@gjohansson-ST - #90322)
  • Magicseaweed has been removed. Magicseedweed no longer provides API keys to users. Additionally, the integration is no longer in a functional state. (@gjohansson-ST - #90277)

All changes

Of course, there is a lot more in this release. You can find a list of all changes made here: Full changelog for Home Assistant Core 2023.4