The most Powerful card in Home AssistanT: AUTO-ENTITIES
Kort intro
Home Assistant er virkelig det ypperste av hva som kjennetegner et vellykket åpen kildekode-prosjekt. De ubegrensede mulighetene, det blomstrende fellesskapet og utviklerne som samarbeider og deler kunnskap, gjør det til en plattform som bare blir bedre og bedre for hver dag som går.
I dag vil jeg hedre en av disse bidragsyterne, Thomas Loven. Den 8. november 2019 lanserte han auto-enheter kortet for Home Assistant. Hvis du ikke vet hva auto-entities er, er det kanskje det kraftigste kortet du kan bruke når du bygger egendefinerte dashbord i Home Assistant.
Ved første øyekast virker det ganske enkelt. Et kort som automatisk kan liste opp alle enhetene dine basert på et filter, der filteret kan være domene, område, navn osv. Med auto-enheter har du mange valg, og i dette innlegget skal vi se nærmere på ett av disse valgene, og det vi skal se nærmere på, er templating.
Dependencies
In our examples we use more that just auto-entities for our full card renders. This is because we will sue auto-entities to populate other cards. Therefore you will need (in order to generate the same examples as us) the following cards installed in your Home Assistant installation:
Auto-Entities (duh)
Button-text-Card
Button-Card
Mushroom-cards
Stakc-in-Card
Bar-Card
Templating
Maler, for de av dere som ikke vet det, er et stykke kode som kan skrives i et kort for logiske uttrykk. Det er nesten som å programmere inne i et kort, men la oss ikke henge oss opp i detaljer. Ved å kombinere templating med auto-entiteter får kortet plutselig "superkrefter", og det mener jeg absolutt. La oss se på et eksempel med yaml.
Standard Atuo-enheter
Som nevnt er auto-entiteter et ganske enkelt kort til å begynne med, men det har mange hemmeligheter å avdekke. Før vi ser nærmere på nøyaktig hva det er å avdekke, la oss ta en titt på standardmåten å gjøre ting på når det gjelder auto-enheter:
Vanlige Auto-enheter
Det ser kjedelig ut, er ikke intuitivt og blir fort bare en lang liste med enheter med mindre du spesifiserer nøyaktig hva du vil ha!
Vis hele koden Skjul kode
type: custom:auto-entities
kort
type: entities
title: Alle lys
show_header_toggle: true
filter: filter:
include:
- domain: light
exclude: ekskluder
- state: utilgjengelig
sort:
method: name
ignore_case: true
show_empty: false
For konfigurasjonen ovenfor velger vi et domene (lys) som skal vises på kortet, og så sier vi at vi vil ekskludere de som ikke er tilgjengelige. Dette er greit, men det er veldig enkelt og veldig grunnleggende. Vi har ingen sortering, bortsett fra etter navn, vi viser ALLE lysene i Home Assistant-installasjonen (det betyr grupper av lys og lys i grupper), og du får en lang liste med en enkel veksling. Som nevnt er dette greit, men det trengs mer for å være skikkelig nyttig.
La oss si at du vil dimme et lys eller endre fargen på det, da må du utføre en "hold"-handling på lyset og vente på at popup-vinduet for lyset vises for å endre disse innstillingene. Det er heller ingen sortering annet enn etter navn, så det er lett å slå på/av feil lys.
La magien begynne!
Hvis vi i stedet introduserer litt templating i dette kortet, får vi noe som fungerer som magi:
Vi kan forvandle den kjedelige, flate, vanlige konfigurasjonen av automatiske enheter til noe som er sortert og listet opp etter områder, og som har all kontroll lett tilgjengelig med et enkelt fingertrykk.
Og det absolutt beste med den? Det oppdateres automatisknår du legger til, fjerner og endrer områder og lys. Det betyr at du ikke lenger trenger å oppdatere kortet hvis du legger til flere lys!
Siden vi gjengir lysene ved hjelp av mushroom-light-cards, kan vi også vise de individuelle kontrollene for hvert lys automatisk hvis de er til stede!
Og det beste av alt?
Skalering fungerer ut av boksen.
Kortet skaleres automatisk til nesten alle enheter! En nettleser i 4k, et nettbrett, en telefon osv.
Hvordan da?
Så hvordan fungerer dette egentlig?
Svaret er komplekst, men med templating har vi muligheten til det:
For each area, add a thin divider and a header row with the area name and a standard icon and before you ask, no we can not use the areas own icons for this unfortunately.
We then list that area’s lights as Mushroom light cards with brightness, color temp, and color controls ( if they are present for the device they will be rendered - if not only the standard light is rendered)
Hvis det ikke finnes noen områder, viser vi meldingen "Ingen områder funnet" og ber brukeren om å opprette områder og legge til lys.
Skjulte lys er ekskludert, lysene er sortert etter navn, og det overordnede enhetskortet viser en topptekstbryter som slår av ALLE lysene hvis du trykker på den.
Vis hele koden Skjul kode
type: custom:auto-entities
card:
show_header_toggle: true
type: entities
filter:
template: >-
{%- set areas = states.light | map(attribute='entity_id') | map('area_name') | unique | reject('none') | list | sort -%}
{% if areas | length == 0 %}
[
{
'type': 'custom:button-text-card',
'title': 'No Areas found in the Home Assistant installation',
'subtitle': 'Create some areas and populate them with soem lights',
'icon': 'mdi:chat-question',
'background_color': 'var(--primary-color)',
}
]
{% else %}
[
{%- for area in areas %}
{
'type': 'custom:button-card',
'styles': {
'card': [
{ 'height': '5px' },
{ 'max-height': '10px' },
{ 'padding': '0' },
{ 'margin': '0' },
{ 'background-color': 'var(--primary-color)' }
]
}
},
{
'type': 'custom:button-text-card',
'title': '{{ area }}',
'icon': 'mdi:lightbulb',
'background_color': 'var(--primary-color)',
},
{%- set lights = states.light | selectattr('entity_id', 'in', area_entities(area)) | sort(attribute='name') -%}
{%- for light in lights %}
{
'type': 'custom:mushroom-light-card',
'entity': '{{ light.entity_id }}',
'use_light_color': 'true',
'show_brightness_control': 'true',
'show_color_control': 'true',
'collapsible_controls': 'false',
'show_color_temp_control': 'true',
'styles': { 'card': [ { 'border-radius': '20px' } ] }
}
{%- if not loop.last %},{% endif %}
{%- endfor %}
{%- if not loop.last %},{% endif %}
{%- endfor %}
]
{% endif %}
exclude:
- hidden_by: "*"
So what else could we create here?
Well, for example, this battery state card:
Battery Overview
This card lists ALL your batteries, and sorts them automatically based on percentage. It is maintenance free and will auto-update when new battery devices are added to your installation.
Simple Sorting
Because of the sorting, this card makes it super easy to keep track of and maintain you battery powered devices.
Vis hele koden Skjul kode
type: custom:auto-entities
card:
type: custom:stack-in-card
card_mod:
style: |
ha-card {
padding-top: 5px;
padding-bottom: 0px;
border-width: 0px;
background: none;
--ha-card-box-shadow: 0px;
}
filter:
include:
- entity_id: sensor.*batter*
options:
type: custom:bar-card
card_mod:
style: >
bar-card-currentbar, bar-card-backgroundbar {
border-radius: 12px !important;
height: 70px !important;
margin-top: -8px !important;
width: 100%;
right: 0.5%;
display: flex;
justify-content: center;
align-items: center;
}
ha-icon {
position: relative;
padding: 0px;
border-radius: 50%;
display: flex;
justify-content: center !important;
align-items: center !important;
--mdc-icon-size: calc(100% - 6px);
right: 4px;
}
bar-card-row, ha-icon {
color: color-mix(in srgb, var(--bar-color) 100%, transparent) !important;
background: color-mix(in srgb, var(--bar-color) 20%, transparent);
}
bar-card-indicator {
color: color-mix(in srgb, var(--bar-color) 100%, transparent) !important;
top: -18px;
}
bar-card-name {
margin-top: auto !important;
left: 0px;
color: white;
display: flex;
justify-content: center;
align-items: center;
background-color: var(--secondary-color);
padding: 4px;
}
bar-card-value {
margin-top: auto !important;
font-size: 16px;
width: 0px;
color: white;
display: flex;
justify-content: right;
align-items: right;
background-color: var(--secondary-color);
padding: 15px;
padding-left: 60px;
margin-right: 20px;
border-radius: 20px;
width: 40px;
}
ha-card {
margin: -4px 0px !important;
height: 90px;
}
bar-card-row bar-card-currentbar, ha-icon,
bar-card-backgroundbar {
--bar-color:
{% if states(config.entity) == 'unavailable' or states(config.entity) == 'none' or states(config.entity) == 'unknown'%}
var(--primary-color) !important;
--card-mod-icon: mdi:bug !important;
{% elif states(config.entity) == 'unknown' %}
var(--primary-color) !important;
--card-mod-icon: mdi:bug !important;
{% elif states(config.entity) == 'full' %}
#22c402 !important;
--card-mod-icon: mdi:battery !important;
{% elif states(config.entity) == 'high' %}
#22c402 !important;
--card-mod-icon: mdi:battery-80 !important;
{% elif states(config.entity) == 'medium' %}
#e7fc03 !important;
--card-mod-icon: mdi:battery-50 !important;
{% elif states(config.entity) == 'low' %}
#ff4d00 !important;
--card-mod-icon: mdi:battery-20 !important;
{% elif states(config.entity) == 'Not Charging' or states(config.entity) == 'discharging' %}
var(--accent-color) !important;
--card-mod-icon: mdi:bug !important;
{% elif states(config.entity) == 'Charging' or states(config.entity) == 'charging' %}
#22c402 !important;
--card-mod-icon: mdi:bug !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 10 %}
#ff0026 !important;
--card-mod-icon: mdi:battery-10 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 20 %}
#ff4d00 !important;
--card-mod-icon: mdi:battery-20 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 30 %}
#ff9900 !important;
--card-mod-icon: mdi:battery-30 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 40 %}
#ffcc00 !important;
--card-mod-icon: mdi:battery-40 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 50 %}
#e7fc03 !important;
--card-mod-icon: mdi:battery-50 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 60 %}
#aaff00 !important;
--card-mod-icon: mdi:battery-60 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 70 %}
#aaff00 !important;
--card-mod-icon: mdi:battery-70 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 80 %}
#22c402 !important;
--card-mod-icon: mdi:battery-80 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 90 %}
#22c402 !important;
--card-mod-icon: mdi:battery-90 !important;
{% elif states(config.entity) | is_number and states(config.entity) | int <= 100 %}
#22c402 !important;
--card-mod-icon: mdi:battery !important;
{% else %}
#22c402 !important;
--card-mod-icon: mdi:battery !important;
{% endif %}
}
bar-card-row ha-icon {
color: color-mix(in srgb, var(--bar-color) 100%, transparent);
margin-top: 15px;
width: 70px !important;
height: 70px !important;
border-radius: 15px;
display: flex;
justify-content: center !important;
align-items: center !important;
--mdc-icon-size: calc(100% - 6px);
}
ha-card {
padding: 0px !important;
margin: -2px !important;
height: 90px;
border-width: 0px;
background: none;
--ha-card-box-shadow: 0px;
}
exclude:
- hidden_by: "*"
sort:
method: state
numeric: true
ignore_case: false
reverse: false
show_empty: true
card_param: cards
We will not go into details on how the full card is structured as its quite complex, but feel free to learn its inner workings and modify it to suit your needs.
Konklusjon
Etter å ha lest dette og testet det ut, forstår du kanskje nå HVORFOR Autoentiteter er et "superkort" i Home Assistant.
Autoenheter har muligheten til å replikere et hvilket som helst kort, med et hvilket som helst design, med NESTED-kortkonfigurasjoner basert på dine behov - automatisk befolket med spesifikke enheter / domener / enheter osv. Sier jeg nå at dette er lett og enkelt å gjøre? Nei, og det er det ikke. Jeg har brukt utallige timer på å prøve å feilsøke visse jinja-malfeil som rett og slett ikke gir mening for å få konfigurasjonen jeg ønsker å gjengi riktig i dashbordene mine. Moroa starter VIRKELIG når du prøver å hekke auto-entitetskort i et auto-entitetskort. Det vil virkelig sette deg i en løkke hvis du ikke er forsiktig med syntaksen, men jeg tror det er best tjent med et annet blogginnlegg.
Det jeg sier er at du i utgangspunktet (og med litt arbeid) kan lage automatiske kort for ALLE dine forskjellige typer enheter. Lys, temperatursensorer, fuktighetssensorer, aktive bevegelsessensorer og så videre.
Uansett, følg med på neste blogginnlegg om Home Assistant, så kan du kanskje lære en ting eller to.