Skip to content

Instantly share code, notes, and snippets.

@EverythingSmartHome
Last active December 3, 2025 09:15
Show Gist options
  • Select an option

  • Save EverythingSmartHome/13f14c328669f72eee717752069a0398 to your computer and use it in GitHub Desktop.

Select an option

Save EverythingSmartHome/13f14c328669f72eee717752069a0398 to your computer and use it in GitHub Desktop.
A collection of useful templates for Home Assistant dashboards
{{ states.binary_sensor
| selectattr('attributes.device_class', 'in', ['door','window'])
| selectattr('state', 'equalto', 'on')
| list | count }}
{% set AREAS = ['kitchen','office','bedroom','living room'] %}
{% set DOMAIN = 'light' %}
{% set ns = namespace(ids=[]) %}
{% for a in AREAS %}
{% set ns.ids = ns.ids + area_entities(a) %}
{% endfor %}
{{ expand(ns.ids|unique)
| selectattr('domain','equalto', DOMAIN)
| selectattr('state','equalto','on')
| list | count }}
# Security 🔏
{% if states.sensor.open_doors_and_windows.state | int > 0 %}
You have {{states.sensor.open_doors_and_windows.state}} doors/windows open.
{% else %}
All windows and doors are closed.
{% endif %}
## Lights 💡
You have {{states.sensor.kitchen_light_count.state}} lights on currently.
{% set area_id = 'kitchen' %}
{% set ents = expand(area_entities(area_id)) %}
{% set lights = ents
| selectattr('domain', 'equalto', 'media_player')
| selectattr('state', 'equalto', 'playing') %}
{{ lights | list | count }}
{% set area_id = 'kitchen' %}
{% set ents = expand(area_entities(area_id)) %}
{% set switch = ents
| selectattr('domain', 'equalto', 'switch')
| selectattr('state', 'equalto', 'on') %}
{{ switch | list | count }}
{% set time = now().hour %}
{% if time >= 5 and time < 12 %}
{% set greeting = 'Good morning' %}
{% elif time >= 12 and time < 17 %}
{% set greeting = 'Good afternoon' %}
{% elif time >= 17 and time < 24 %}
{% set greeting = 'Good evening' %}
{% elif time >= 0 and time < 5 %}
{% set greeting = 'You should be sleeping' %}
{% endif %}
# {{greeting}}, {{user}}!
{% set time = now().hour %}
{% if time >= 5 and time < 12 %}
{% set greeting = 'Good morning' %}
{% elif time >= 12 and time < 17 %}
{% set greeting = 'Good afternoon' %}
{% elif time >= 17 and time < 24 %}
{% set greeting = 'Good evening' %}
{% elif time >= 0 and time < 5 %}
{% set greeting = 'You should be sleeping' %}
{% endif %}
{% if state_attr('calendar.lewis_s_calendar', 'start_time') == None %}
{% set cal_message = "you have no upcoming events, enjoy 🥳"%}
{% else %}
{% set start_time = state_attr('calendar.lewis_s_calendar', 'start_time') | as_timestamp | timestamp_custom("%H:%M", false) %}
{% set cal_message = "your next event is at " + start_time %}
{% endif %}
# {{greeting}}, {{user}}!
It's {{now().hour}}:{{now().minute}} and {{cal_message}}.
@theincubus
Copy link

If a door or window is open, it will share the name - it auto-finds all binary_sensors with device_class: door (and garage doors) and lists the ones that are on.

{% set open_doors = states.binary_sensor
| selectattr('attributes.device_class','in',['door','garage_door','opening'])
| selectattr('state','eq','on')
| list %}

{% if open_doors | count > 0 %}
{{ open_doors | count }} door(s) open:
{% for s in open_doors -%}

  • {{ s.name }}
    {%- endfor %}
    {% else %}
    All doors are closed.
    {% endif %}

If you want Windows too, then change the first line in the list to:
['door','garage_door','window','opening'] and replace the wording as you like.

@theincubus
Copy link

List the Thermostats that are turned on and their names.

{% set cooling = states.climate
| selectattr('state','eq','cool')
| list %}

{% if cooling | count > 0 %}
{{ cooling | count }} thermostat(s) in COOL mode:
{% for c in cooling -%}

  • {{ c.name }}{% if c.attributes.current_temperature is defined %} ({{ c.attributes.current_temperature }}°C){% endif %}
    {%- endfor %}
    {% else %}
    Turned off
    {% endif %}

@RSG-GIT
Copy link

RSG-GIT commented Nov 18, 2025

How can I include the lights I turn on with the Sonoff TX (switch) in this code? Thanks in advance for your help.

{% set AREAS = ['kitchen','office','bedroom','living room'] %}
{% set DOMAIN = 'light' %}

{% set ns = namespace(ids=[]) %}
{% for a in AREAS %}
{% set ns.ids = ns.ids + area_entities(a) %}
{% endfor %}
{{ expand(ns.ids|unique)
| selectattr('domain','equalto', DOMAIN)
| selectattr('state','equalto','on')
| list | count }}

@reubendowle
Copy link

The light-on count is watching ALL entities in the given areas changes which is not efficient. Better to filter the ns.ids to only the target domains:

{% set AREAS = ['garage','kitchen','alex bedroom','tessa bedroom','master bedroom','living room','office','guest bedroom','laundry'] %}
{% set DOMAIN = 'light' %}

{% set ns = namespace(ids=[]) %}
{% for a in AREAS %}
  {% set area_entities = area_entities(a) %}
  {% for entity_id in area_entities %}
    {% if entity_id.split('.')[0] == DOMAIN %}
      {% set ns.ids = ns.ids + [entity_id] %}
    {% endif %}
  {% endfor %}
{% endfor %}

{{ expand(ns.ids|unique)
    | selectattr('state','equalto','on')
    | rejectattr('entity_id', 'is_hidden_entity')
    | list | count }}

@fluffy88
Copy link

For the Light On Count template, if I wanted the count to work across all devices regardless of area, would this be a sensible template to use?

{{
  states.light 
    | selectattr('state','equalto','on') 
    | list 
    | count 
}}

@Homemf
Copy link

Homemf commented Nov 19, 2025

To add more areas, use this code and it works for me.

{% set AREAS = ['Kitchen', 'Office', 'Bedroom', 'Living Room'] %}
{% set DOMAIN = 'light' %}

{% set ns = namespace(ids=[]) %}

{# Recorre las áreas y busca entidades de varias formas para asegurar compatibilidad #}
{% for area in AREAS %}
{% set area_id = area | lower | replace(' ', '_') %}

{# Búsqueda normal por ID normalizada #}
{% set found = area_entities(area_id) %}

{# Fallback: usar atributos area_id de las entidades #}
{% if found | length == 0 %}
{% set fallback = states
| selectattr('attributes.area_id','equalto', area_id)
| map(attribute='entity_id')
| list %}
{% set found = found + fallback %}
{% endif %}

{# Último intento: usar el nombre tal cual (por si el area_id no está normalizado) #}
{% if found | length == 0 %}
{% set alt = area_entities(area) %}
{% set found = found + alt %}
{% endif %}

{# Acumular resultados #}
{% set ns.ids = ns.ids + found %}
{% endfor %}

{# Filtrar entidades del dominio (light, switch, etc.) y encendidas #}
{% set encendidas = expand(ns.ids | unique)
| selectattr('domain','equalto', DOMAIN)
| selectattr('state','equalto','on')
| list %}

{{ encendidas | count }}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment