Long press “Home Assistant” at the top

and the menu will switch to edit mode

The same can be achieved via the profile settings

Long press “Home Assistant” at the top
and the menu will switch to edit mode
The same can be achieved via the profile settings
Somehow, I’ve only just realized that a badge icon can be used to display another entity status on a template card, even though it’s written in the documentation. I now use it to display the status of presence or motion sensors in the respective rooms.
badge_icon: >-
{{ "mdi:motion-sensor" if states("binary_sensor.0xb4e3f9fffeb689d4_occupancy") == "on" }}
badge_color: >-
{{ "green" if states("binary_sensor.0xb4e3f9fffeb689d4_occupancy") == "on" }}
So far, I have only made backups of my Home Assistant VM via Proxmox to my TrueNAS server. To also have a remote backup, I stumbled over Nextcloud Backup. For the add-on installation you have to add a repository, but after that the setup is straight forward.
Just noticed that you can add a confirmation dialog on a tab action.
https://www.home-assistant.io/dashboards/actions/
https://www.home-assistant.io/dashboards/actions/#options-for-confirmation
Very helpful to prevent things from being activated by mistake.
type: entity
entity: input_boolean.sleep_status
tap_action:
action: toggle
confirmation:
text: Activate sleep mode?
icon: mdi:sleep
icon_color: indigo
A few months ago, I installed a Reolink Doorbell at our front door. Since then, I’ve used it for simple automations like sending a photo when someone is at the door. To capture a photo, I was using the camera.snapshot
service. I never used the photos and videos that the doorbell itself recorded and that were stored on my TrueNAS system via FTP. Mainly because I haven’t found a good way to display the captured photos and videos on my Dashboard. But finally I was able to fill the gap with the Gallery Card, which turned out to be exactly what I needed the whole time. By using it, you can simply display the latest images and videos, even when they are stored in some kind of nested folder structure, and it also helps to parse filenames to display them in a more convenient way.
Following a brief overview of what I had to do:
data/camera
/Reolink/Wifi-Doorbell/Recordings
(to do that, simply mount the NFS share to your local machine or use the terminal)/Reolink/Wifi-Doorbell/Recordings
YYYY-MM-DD
Reolink
(whatever you like)Media
/mnt/data/camera
type: custom:gallery-card
entities:
- media-source://media_source/media/Reolink/Reolink/Wifi-Doorbell/Recordings/
maximum_files: 25
menu_alignment: top
folder_format: YYYY/MM/DD
video_loop: true
video_autoplay: true
video_muted: true
file_name_date_begins: 12
file_name_format: YYYYMMDDHHmmss
caption_format: HH:mm:ss DD/MM
Most variables are self-explanatory and also well explained by the galery-card docs, but below a few words about the settings I used, beginning with the path to the media which is provided on the entities attribute.
entities:
- media-source://media_source/media/Reolink/Reolink/Wifi-Doorbell/Recordings/
The first part is a default value: media-source://media_source/
Followed by the usage type and name we have chosen when mounting the NSF share: media/Reolink/
Then we need the directory path: Reolink/Wifi-Doorbell/Recordings
Because we chose in the Reolink settings “Generate subfolder by: YYYY-MM-DD
“, the files are stored in a hierarchy like this:
The gallery-card can automatically parse this, if you provide the following setting: folder_format: YYYY/MM/DD
.
And because the filenames look like this: Haustuer_00_20231230143626.jpg, you have to add file_name_date_begins: 12
to skip the firs letters, and file_name_format: YYYYMMDDHHmmss
to parse the date. With caption_format: HH:mm:ss DD/MM
you can define the output, how you want to display the parsed timestamp.
15.03.2025: As the original Gallery Card is discontinued, I switched to a fork.
I recently saw this cool dashboard and the person cards caught my eye. As the dashboard creator also provided all the yaml code and a really helpful guide, I tried to rebuild it. I was already using the mushroom-person-card, so I “just” had to add the little icons (mushroom-chips-card) below it (using the vertical-stack-in-card). To display the network type and the charging status, you first have to enable these sensors in the Home Assistant Companion App on your mobile phone. This is my result:
type: horizontal-stack
cards:
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-person-card
entity: person.nico
icon_type: entity-picture
secondary_info: last-changed
card_mod:
style: |
ha-card {
background: transparent;
}
- type: horizontal-stack
cards:
- type: custom:mushroom-chips-card
alignment: center
card_mod:
style: |
ha-card {
--chip-font-size: 0.3em;
--chip-icon-size: 0.5em;
--chip-border-width: 0;
--chip-box-shadow: none;
--chip-background: none;
--chip-border: none;
--chip-spacing: none;
--chip-font-weight: bold;
}
chips:
- type: template
entity: sensor.mi_8_network_type
content: '{{ states(''sensor.mi_8_network_type'')}}'
icon: |-
{% if is_state('sensor.mi_8_network_type','wifi')%}
mdi:wifi
{% elif is_state('sensor.mi_8_network_type','vpn')%}
mdi:network
{% elif is_state('sensor.mi_8_network_type','cellular')%}
mdi:signal-4g
{% else %}
mdi:network-strength-off
{% endif %}
icon_color: >-
{% if is_state('sensor.mi_8_network_type','wifi') or
is_state('sensor.mi_8_network_type','vpn')%}
green
{% elif is_state('sensor.mi_8_network_type','cellular')%}
red
{% else %}
grey
{% endif %}
tap_action:
action: more-info
- type: template
entity: sensor.mi_8_battery_level
content: '{{ states(''sensor.mi_8_battery_level'')}}%'
icon: |-
{% set state = states('sensor.mi_8_battery_level')|float %}
{% if state >= 0 and state < 10 %} mdi:battery-10
{% elif state >= 10 and state < 20 %} mdi:battery-20
{% elif state >= 20 and state < 30 %} mdi:battery-30
{% elif state >= 30 and state < 40 %} mdi:battery-40
{% elif state >= 40 and state < 50 %} mdi:battery-50
{% elif state >= 50 and state < 60 %} mdi:battery-60
{% elif state >= 60 and state < 70 %} mdi:battery-70
{% elif state >= 70 and state < 80 %} mdi:battery-80
{% elif state >= 80 and state < 95 %} mdi:battery-90
{% else %} mdi:battery
{% endif %}
icon_color: |-
{% set state = states('sensor.mi_8_battery_level')|float %}
{% if state >= 0 and state < 20 %} red
{% elif state >= 20 and state < 50 %} orange
{% elif state >= 50 and state < 80 %} yellow
{% else %} green
{% endif %}
tap_action:
action: more-info
- type: template
entity: sensor.mi_8_battery_power
content: '{{ states(''sensor.mi_8_battery_power'')}} W'
icon: |-
{% if is_state('binary_sensor.mi_8_is_charging','on')%}
mdi:power-plug
{% else %}
mdi:power-plug-off
{% endif %}
icon_color: |-
{% if is_state('binary_sensor.mi_8_is_charging','on')%}
blue
{% else %}
grey
{% endif %}
tap_action:
action: more-info
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-person-card
entity: person.user2
icon_type: entity-picture
secondary_info: last-changed
card_mod:
style: |
ha-card {
background: transparent;
}
- type: horizontal-stack
cards:
- type: custom:mushroom-chips-card
alignment: center
card_mod:
style: |
ha-card {
--chip-font-size: 0.3em;
--chip-icon-size: 0.5em;
--chip-border-width: 0;
--chip-box-shadow: none;
--chip-background: none;
--chip-border: none;
--chip-spacing: none;
--chip-font-weight: bold;
}
chips:
- type: template
entity: sensor.redmi_note_8_pro_network_type
content: '{{ states(''sensor.redmi_note_8_pro_network_type'')}}'
icon: >-
{% if
is_state('sensor.redmi_note_8_pro_network_type','wifi')%}
mdi:wifi
{% elif
is_state('sensor.redmi_note_8_pro_network_type','vpn')%}
mdi:network
{% elif
is_state('sensor.redmi_note_8_pro_network_type','cellular')%}
mdi:signal-4g
{% else %}
mdi:network-strength-off
{% endif %}
icon_color: >-
{% if is_state('sensor.redmi_note_8_pro_network_type','wifi')
or is_state('sensor.redmi_note_8_pro_network_type','vpn')%}
green
{% elif
is_state('sensor.redmi_note_8_pro_network_type','cellular')%}
red
{% else %}
grey
{% endif %}
tap_action:
action: more-info
- type: template
entity: sensor.mi_8_battery_level
content: '{{ states(''sensor.redmi_note_8_pro_battery_level'')}}%'
icon: >-
{% set state = states('sensor.redmi_note_8_pro_battery_level')|float %}
{% if state >= 0 and state < 10 %} mdi:battery-10
{% elif state >= 10 and state < 20 %} mdi:battery-20
{% elif state >= 20 and state < 30 %} mdi:battery-30
{% elif state >= 30 and state < 40 %} mdi:battery-40
{% elif state >= 40 and state < 50 %} mdi:battery-50
{% elif state >= 50 and state < 60 %} mdi:battery-60
{% elif state >= 60 and state < 70 %} mdi:battery-70
{% elif state >= 70 and state < 80 %} mdi:battery-80
{% elif state >= 80 and state < 95 %} mdi:battery-90
{% else %} mdi:battery
{% endif %}
icon_color: >-
{% set state = states('sensor.redmi_note_8_pro_battery_level')|float %}
{% if state >= 0 and state < 20 %} red
{% elif state >= 20 and state < 50 %} orange
{% elif state >= 50 and state < 80 %} yellow
{% else %} green
{% endif %}
tap_action:
action: more-info
- type: template
entity: sensor.redmi_note_8_pro_battery_power
content: '{{ states(''sensor.redmi_note_8_pro_battery_power'')}} W'
icon: >-
{% if is_state('binary_sensor.redmi_note_8_pro_is_charging','on')%}
mdi:power-plug
{% else %}
mdi:power-plug-off
{% endif %}
icon_color: >-
{% if is_state('binary_sensor.redmi_note_8_pro_is_charging','on')%}
blue
{% else %}
grey
{% endif %}
tap_action:
action: more-info
Update 15.01.2025: When I migrated my dashboard to the new sections layout, I could get rid of the surrounding horizontal stack and had to adjust some minor things like font size and icon size. I also added the Steps sensor from my mobile phone (chekc here). Here is it, how it looks now:
type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-person-card
entity: person.nocin
icon_type: entity-picture
secondary_info: last-changed
card_mod:
style: |
ha-card {
background: transparent;
}
- type: horizontal-stack
cards:
- type: custom:mushroom-chips-card
alignment: center
card_mod:
style: |
ha-card {
--chip-font-size: 0.32em;
--chip-icon-size: 0.5em;
--chip-border-width: 0;
--chip-box-shadow: none;
--chip-background: none;
--chip-border: none;
--chip-spacing: none;
--chip-font-weight: bold;
}
chips:
- type: template
entity: sensor.mi_8_network_type
content: "{{ states('sensor.mi_8_network_type')}}"
icon: |-
{% if is_state('sensor.mi_8_network_type','wifi')%}
mdi:wifi
{% elif is_state('sensor.mi_8_network_type','vpn')%}
mdi:network
{% elif is_state('sensor.mi_8_network_type','cellular')%}
mdi:signal-4g
{% else %}
mdi:network-strength-off
{% endif %}
icon_color: >-
{% if is_state('sensor.mi_8_network_type','wifi') or
is_state('sensor.mi_8_network_type','vpn')%}
green
{% elif is_state('sensor.mi_8_network_type','cellular')%}
red
{% else %}
grey
{% endif %}
tap_action:
action: more-info
- type: template
entity: sensor.mi_8_battery_level
content: "{{ states('sensor.mi_8_battery_level')}}%"
icon: |-
{% set state = states('sensor.mi_8_battery_level')|float %}
{% if state >= 0 and state < 10 %} mdi:battery-10
{% elif state >= 10 and state < 20 %} mdi:battery-20
{% elif state >= 20 and state < 30 %} mdi:battery-30
{% elif state >= 30 and state < 40 %} mdi:battery-40
{% elif state >= 40 and state < 50 %} mdi:battery-50
{% elif state >= 50 and state < 60 %} mdi:battery-60
{% elif state >= 60 and state < 70 %} mdi:battery-70
{% elif state >= 70 and state < 80 %} mdi:battery-80
{% elif state >= 80 and state < 95 %} mdi:battery-90
{% else %} mdi:battery
{% endif %}
icon_color: |-
{% set state = states('sensor.mi_8_battery_level')|float %}
{% if state >= 0 and state < 20 %} red
{% elif state >= 20 and state < 50 %} orange
{% elif state >= 50 and state < 80 %} yellow
{% else %} green
{% endif %}
tap_action:
action: more-info
- type: template
entity: sensor.mi_8_battery_power
content: "{{ states('sensor.mi_8_battery_power')}} W"
icon: |-
{% if is_state('binary_sensor.mi_8_is_charging','on')%}
mdi:power-plug
{% else %}
mdi:power-plug-off
{% endif %}
icon_color: |-
{% if is_state('binary_sensor.mi_8_is_charging','on')%}
blue
{% else %}
grey
{% endif %}
tap_action:
action: more-info
- type: horizontal-stack
cards:
- type: custom:mushroom-chips-card
alignment: center
card_mod:
style: |
ha-card {
--chip-font-size: 0.32em;
--chip-icon-size: 0.5em;
--chip-border-width: 0;
--chip-box-shadow: none;
--chip-background: none;
--chip-border: none;
--chip-spacing: none;
--chip-font-weight: bold;
}
chips:
- type: template
entity: sensor.daily_steps_mi8
content: "{{ states('sensor.daily_steps_mi8')}} steps today"
tap_action:
action: more-info
Cool template sensor idea I found here, which combines the states of two sensors and display the different combined states. Useful if, for example, you want to combine a door lock and a contact sensor on the same door.
Settings -> Devices & services -> Helpers -> Create Helper -> Template
{% if is_state('lock.kellertur', 'locked') and is_state('binary_sensor.kellertur_contact', 'off') %}
Locked
{% elif is_state('lock.kellertur', 'unlocked') and is_state('binary_sensor.kellertur_contact', 'on') %}
Open
{% elif is_state('lock.kellertur', 'unlocked') and is_state('binary_sensor.kellertur_contact', 'off') %}
Closed, Unlocked
{% elif is_state('lock.kellertur', 'locked') and is_state('binary_sensor.kellertur_contact', 'on') %}
Open, Locked
{% else %}
Unknown
{% endif %}
Helpful to check whether a door is really closed when locking it via a smart lock. Because else it could happen, that you would see status “Locked“, although the door is still open. But with this helper, you will get in this situation “Open, Locked“.
To emphasize such a situation even more clearly, you can of course also add some icon colors.
I have some lights in my garden which are turned on in the night and are controlled by the Adaptive Lighting component, to automatically adjust brightness and color during the night. But if someone comes home late and this is detected by a motion sensor, I wanted to increase the brightness of all the lights in the garden for a short time.
Increasing the brightness was easy, as it can be done by using the light.turn_on
service. However, it took me a few minutes to figure out how to reactivate adaptive lighting on these lights when motion is no longer detected. But it’s actually super simple (and it’s directly written on the GitHub start page here and here). You just have to deactivate the “manually controlled” flag that got activated by “manually” increasing the brightness. Following an example with a single motion sensor (binary_sensor.haustuer_motion
), a lamp (light.haustur_light
) and the adaptive lightning switch entity (switch.adaptive_lighting_haustuer
).
alias: Motion sensor front door
description: "Increase brightness for three minutes when motion is detected"
trigger:
- platform: state
entity_id:
- binary_sensor.haustuer_motion
to: "on"
condition:
- condition: state
entity_id: sun.sun
state: below_horizon
action:
- service: light.turn_on
data:
transition: 3
brightness_pct: 70
target:
entity_id: light.haustur_light
- wait_for_trigger:
- platform: state
entity_id:
- binary_sensor.haustuer_motion
to: "off"
for:
hours: 0
minutes: 3
seconds: 0
timeout:
hours: 0
minutes: 0
seconds: 0
milliseconds: 0
- service: adaptive_lighting.set_manual_control
data:
manual_control: false
entity_id: switch.adaptive_lighting_haustuer
lights:
- light.haustur_light
mode: single
Just learned that you can directly provide a title for a vertical-stack. Until now, I always added a mushroom-title-card at the beginning of every new stack like that:
type: vertical-stack
cards:
- type: custom:mushroom-title-card
title: Lichter
But as you can directly provide a title for the vertical stack, you can get rid of this now unnecessary title card. The title can only be set via code editor.
The only difference is the smaller gap between title and content, which in my opinion looks even better this way.
type: vertical-stack
title: Lichter
In Zigbee2MQTT, go to Settings, Advanced, ZigBee Channel.