Tado + card_mod — Et varme-dashboard der rent faktisk siger noget

5 Tado-zoner i Home Assistant med mushroom klimakort, CSS-vejrtrækningsanimation på aktive zoner og tilstedeværelsesbaseret nedsætning der faktisk virker.

#tado #opvarmning #dashboard #card-mod #home-assistant
7. marts 2025
Tado + card_mod — Et varme-dashboard der rent faktisk siger noget

Tados HA-integration er en af de bedste out-of-the-box — indbygget i HA, ingen HACS. Du skal bruge Tado Internet Bridge-hardware og en Tado-konto. Tilføj integrationen, log ind, og alle zoner dukker op som climate.*-entiteter med fuld understøttelse. Statuspop kommer tilbage under fem sekunder. Det bare virker.

Så selve opvarmningsdelen var nem. Det interessante var at få dashboardet til at fortælle noget med et øjeblik.

Vejrtrækningsanimationen

Problemet med at vise 5 klimakort i et gitter: de ser alle ens ud uanset om varmen kører eller ej. Temperatur vist, indstillingspunkt vist, tilstand vist. Men man kan ikke se hvilke zoner der aktivt fyrer kedlen.

Jeg tilføjede en CSS keyframe-animation via card_mod der kun aktiverer når hvac_action-attributten er heating:

type: custom:mushroom-climate-card
entity: climate.zone_stue
card_mod:
  style: |
    :host {
      {% if state_attr('climate.zone_stue', 'hvac_action') == 'heating' %}
      animation: breathe 3s ease-in-out infinite;
      {% endif %}
    }
    @keyframes breathe {
      0%, 100% { filter: drop-shadow(0 0 4px rgba(255, 100, 0, 0.3)); }
      50%       { filter: drop-shadow(0 0 14px rgba(255, 100, 0, 0.75)); }
    }

Aktive zoner pulserer med en varm orange glød. Inaktive er statiske. Over et 5-zones gitter er det øjeblikkeligt tydeligt hvilke rum der bruger energi.

En gæst spurgte om huset åndede. Det føltes rigtigt.

Dupliker blokken for hver zone og skift entitets-ID. Jinja2 inde i card_mod evalueres ved render-tid, så hvert kort beslutter selvstændigt om det skal animere.

Layout

Fem kort i et 2-kolonne gitter via custom:layout-card (HACS), pakket ind i et glas custom:stack-in-card (HACS), med card_mod (HACS) til CSS-animationerne:

type: custom:stack-in-card
card_mod:
  style: |
    ha-card {
      background: rgba(255,255,255,0.05) !important;
      backdrop-filter: blur(15px) !important;
      border: 1px solid rgba(255,255,255,0.10) !important;
      box-shadow: 0 8px 32px rgba(0,0,0,0.3) !important;
      border-radius: 28px !important;
    }
    ha-card::before { display: none !important; }
cards:
  - type: custom:layout-card
    layout_type: custom:grid-layout
    layout:
      grid-template-columns: 1fr 1fr
      grid-gap: 8px
      padding: 8px
    cards:
      - type: custom:mushroom-climate-card
        entity: climate.zone_stue
        show_temperature_control: true
        card_mod:
          style: |
            :host {
              {% if state_attr('climate.zone_stue', 'hvac_action') == 'heating' %}
              animation: breathe 3s ease-in-out infinite;
              {% endif %}
            }
            @keyframes breathe {
              0%, 100% { filter: drop-shadow(0 0 4px rgba(255,100,0,0.3)); }
              50%       { filter: drop-shadow(0 0 14px rgba(255,100,0,0.75)); }
            }
      # gentag for hver zone

show_temperature_control: true tilføjer +/- knapper direkte på kortet. En lille ting, men det betyder at man kan justere en zone uden at navigere nogen steder.

Tilstedeværelsesbaseret nedsætning

Når alle forlader huset, drop alt til 17°C. Når nogen vender tilbage, gendan auto-tilstand så Tados egen tidsplan overtager:

alias: Tado — Væk nedsætning
trigger:
  - platform: state
    entity_id: group.husstandsmedlemmer
    to: not_home
action:
  - repeat:
      for_each:
        - climate.zone_stue
        - climate.zone_kontor
        - climate.zone_sovevarelse
        - climate.zone_badevarelse
        - climate.zone_gang
      sequence:
        - service: climate.set_temperature
          target:
            entity_id: "{{ repeat.item }}"
          data:
            temperature: 17

alias: Tado — Gendan ved hjemkomst
trigger:
  - platform: state
    entity_id: group.husstandsmedlemmer
    to: home
action:
  - repeat:
      for_each: [climate.zone_stue, climate.zone_kontor, climate.zone_sovevarelse,
                 climate.zone_badevarelse, climate.zone_gang]
      sequence:
        - service: climate.set_hvac_mode
          target:
            entity_id: "{{ repeat.item }}"
          data:
            hvac_mode: auto

Jeg bruger dette frem for Tados egen geofencing fordi min tilstedeværelsesdetektion kombinerer telefon-GPS, UniFi enhedssporing og en person.*-entitet. Det er mere pålideligt end Tados app alene, der af og til beslutter at jeg er gået ud når jeg bare er i haven.

Vinduesopdagelse

Tados åbent-vindue-detektion er hardware-baseret — TRV’en måler et pludseligt temperaturfald og sætter varmen i den zone på pause automatisk. HA eksponerer dette via binary_sensor.zone_*_window.

Jeg tilføjede en notifikation for vinduer der har stået åbne mere end 20 minutter under aktiv opvarmning. Baderummet er den sædvanlige synder. Automatiseringen har sandsynligvis sparet mere i varmeomkostninger end alt andet jeg har bygget med Tado.

alias: Tado — Åbent vindue advarsel
trigger:
  - platform: state
    entity_id:
      - binary_sensor.zone_stue_window
      - binary_sensor.zone_badevarelse_window
    to: "on"
    for:
      minutes: 20
condition:
  - condition: template
    value_template: >
      {{ state_attr(trigger.entity_id | replace('binary_sensor.', 'climate.') | replace('_window', ''), 'hvac_action') == 'heating' }}
action:
  - service: notify.alle_enheder
    data:
      title: "Vindue åbent — varmen kører"
      message: >
        {{ trigger.entity_id
           | replace('binary_sensor.zone_','')
           | replace('_window','')
           | replace('_',' ')
           | title }} har stået åbent i 20 minutter.