HomeAssistant + Homematic IP: Urlaubsmodus / Manueller Modus via Button im Dashboard

Aus aktuellem Anlass habe ich mich damit beschäftigt, wie ich meine Homematic IP Thermostate, welche ich über OpenCCU eingebunden habe, direkt aus HomeAssistant heraus beispielsweise in einen Urlaubsmodus mit abgesenkter Temperatur setzen kann. Ein solcher Toggle existiert zwar in OpenCCU für jedes Thermostat, leider wird dieser jedoch nicht an HomeAssistant weitergegeben, weshalb man hier etwas erfinderisch werden muss.

Das Ziel war klar: Mit einem einzigen Schalter in der HomeAssistant UI sollte die Temperatur aller Thermostate abgesenkt werden, und beim Deaktivieren des Schalters sollte alles wieder auf den Ausgangszustand zurückgestellt werden. Die Homematic IP Thermostate bieten 3 Heizprogramme an, die sich unabhängig voneinander einstellen lassen – meine laufen im Normalbetrieb im Programm 1. Die Programme werden an HomeAssistant weitergegeben und lassen sich je Thermostat oder Heizungsgruppe einstellen, allerdings soll ja alles gemeinsam über einen einzigen Schalter umgestellt werden. Außerdem bieten die Thermostate einen manuellen Modus, der (wie der Name nahelegt) sämtliche Programme deaktiviert, sodass die Thermostate schlicht die zuletzt eingestellte Temperatur halten.

Demzufolge gibt es grundsätzlich zwei Möglichkeiten, einen Urlaubsmodus zu realisieren:

  • Eins der drei Heizprogramme je Thermostat/Heizungsgruppe in der CCU entsprechend konfigurieren und dieses dann per Schalter in HomeAssistant aktivieren. Beim deaktivieren des Schalters wird wieder auf das „Normalprogramm“ umgeschaltet
  • Alle Thermostate/Heizungsgruppen in den Manuellen Modus setzen und die gewünschte Temperatur einstellen. Beim deaktivieren des Schalters wird wieder auf Automatik zurückgeschaltet.

Für beide Ansätze habe ich im Folgenden eine Lösung, da beide in unterschiedlichen Szenarien nützlich sein können, auch abseits vom „Urlaubsmodus“. Zunächst sollten wir aber kurz sicherstellen, dass wir auch die richtigen Entitäten und Attribute verwenden. Das könnt ihr am Besten in den Entwicklerwerkzeugen in HomeAssistant prüfen – wechselt oben auf den Reiter „Zustände“ und sucht nach euren Heizungsentitäten. In meinem Fall habe ich für alle Räume in OpenCCU Heizungsgruppen erstellt, aber grundsätzlich sollte man die Thermostate auch direkt ansprechen können. In meinem Fall sieht das beispielsweise so aus:

Interessant sind für uns vor allem die Namen der Entitäten sowie die Heizprogramme unter „preset_modes“ – falls die bei euch anders heißen, müsstet ihr das natürlich entsprechend anpassen.

Als nächstes müssen wir die Schalter in HomeAssistant programmieren. Die GUI bietet hier leider noch keine ausreichenden Einstellungsmöglichkeiten, weshalb wir Anpassungen an der configuration.yaml vornehmen müssen. Ich empfehle hierzu das kleine und leichtgewichtige Add-On „File Editor„, welches ihr im Add-on Store installieren könnt – aber natürlich funktioniert das Ganze genauso gut mit anderen Editoren, z.B. dem Studio Code Server, sofern ihr den schon installiert habt. Wenn ihr den Editor eurer Wahl geöffnet habt, navigiert zur configuration.yaml, welche sich im Root-Verzeichnis befinden sollte. Sofern ihr hier noch keine Änderungen vorgenommen habt, steht hier nicht besonders viel, aber die configuration.yaml ist dennoch sehr mächtig, denn nahezu alles, was ihr in der GUI nicht einstellen könnt, lässt sich hier programmieren. Ans Ende der Datei könnt ihr nun den Code für eure Schalter einfügen.

Achtung: Seit Dezember 2025 gilt die alte Syntax für „Legacy Entities“ als deprecated. Das heißt, dass die Schalter nun nicht mehr unter einem einzelnen Switch-Block angelegt werden müssen, stattdessen müssen wir einen übergeordneten Template-Schalter anlegen. Wie immer gilt: der Einzug ist syntaxrelevant, es ist YAML. Damit es etwas übersichtlicher ist, lege ich zuerst eine Gruppe „HmIP Räume“ an, in die ich alle Heizungsgruppen hinzufüge:

# Gruppe mit allen HmIP-Gruppen-Climate-Entitäten
group:
  hmip_raeume:
    name: HmIP Räume
    entities:
      - climate.heizung_kueche_int0000004
      - climate.hmip_heating_int0000001
      - climate.hmip_heating_int0000002
      - climate.schlafzimmer_int0000003

Anschließend können wir die Schalter anlegen. Weil Homematic in meinen Tests manchmal ein paar Sekunden benötigt um alle Entitäten anzusprechen habe ich beim Umschalten der Modi einen Warteblock eingebaut, der erst dann weitergeht, wenn alle Thermostate erfolgreich umgeschaltet wurden (oder nach einem Timeout von 20 Sekunden).

Variante 1: Wechsel in anderes Heizprogramm

# Template-Schalter (nur einmal anlegen - alle Switches folgen darunter!)
template:

# A) Urlaub: setzt auf week_program_2, AUS = week_program_1
- switch:
  - turn_on:
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        hvac_mode: auto
      action: climate.set_hvac_mode
    - wait_template: "{{ expand('group.hmip_raeume') | selectattr('state','equalto','auto')
        | list | count\n   == expand('group.hmip_raeume') | list | count }}"
      timeout: 0:00:20
      continue_on_timeout: true
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        preset_mode: week_program_2
      action: climate.set_preset_mode
    turn_off:
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        hvac_mode: auto
      action: climate.set_hvac_mode
    - wait_template: "{{ expand('group.hmip_raeume') | selectattr('state','equalto','auto')
        | list | count\n   == expand('group.hmip_raeume') | list | count }}"
      timeout: 0:00:20
      continue_on_timeout: true
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        preset_mode: week_program_1
      action: climate.set_preset_mode
    default_entity_id: switch.hmip_urlaub
    name: Heizung Urlaub
    state: "{% set ents = expand('group.hmip_raeume') | selectattr('domain','equalto','climate')
      | list %} {% if ents|count == 0 %}false{% else %} {{ (ents | map(attribute='attributes.preset_mode')
      | list)\n    | select('equalto','week_program_2') | list | count == ents|count
      }}\n{% endif %}"

Variante 2: Wechsel in manuellen Modus

Der Einfachheit halber habe ich diesen Schalter so umgesetzt, dass man anschließend die Temperatur auch tatsächlich manuell für jedes Thermostat einstellen muss. Das mag zwar umständlicher erscheinen, macht den Button aber natürlich auch flexibler nutzbar.

# B) Manuell: AN = heat + preset none; AUS = zurück zu AUTO + Profil 1
- switch:
  - turn_on:
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        hvac_mode: heat
      action: climate.set_hvac_mode
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        preset_mode: none
      action: climate.set_preset_mode
    turn_off:
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        hvac_mode: auto
      action: climate.set_hvac_mode
    - wait_template: "{{ expand('group.hmip_raeume') | selectattr('state','equalto','auto')
        | list | count\n   == expand('group.hmip_raeume') | list | count }}"
      timeout: 0:00:20
      continue_on_timeout: true
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        preset_mode: week_program_1
      action: climate.set_preset_mode
    default_entity_id: switch.hmip_manuell
    name: Heizung Manuell (alle Räume)
    state: "{% set ents = expand('group.hmip_raeume') | selectattr('domain','equalto','climate')
      | list %} {% if ents|count == 0 %}false{% else %} {% set manual = ents\n  |
      selectattr('state','equalto','heat')\n  | selectattr('attributes.preset_mode','equalto','none')
      | list %}\n{{ manual|count == ents|count }} {% endif %}"

Das war’s schon! Klickt in den Entwicklerwerkzeugen vorsichtshalber einmal auf „Konfiguration prüfen“, um sicherzugehen, dass keine Syntaxfehler vorhanden sind. Anschließend startet ihr HomeAssistant neu. Nun solltet ihr die Schalter als Entitäten in HomeAssistant haben und euren Dashboards hinzufügen können, so wie zum Beispiel hier:

Wer möchte, kann auch noch einen dedizierten „Normalprogramm“-Schalter anlegen, der immer dann aktiv ist, wenn die Voraussetzungen erfüllt sind (In diesem Fall Automatikprogramm 1). Das kann für die Übersichtlichkeit der Dashboards nützlich sein, da man auf einen Blick sehen kann ob alles normal eingestellt ist:

# C) Schalter für Normalprogramm (Profil 1)
- switch:
  - turn_on:
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        hvac_mode: auto
      action: climate.set_hvac_mode
    - wait_template: "{{ expand('group.hmip_raeume') | selectattr('state','equalto','auto')
        | list | count\n   == expand('group.hmip_raeume') | list | count }}"
      timeout: 0:00:20
      continue_on_timeout: true
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        preset_mode: week_program_1
      action: climate.set_preset_mode
    turn_off:
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        hvac_mode: heat
      action: climate.set_hvac_mode
    - target:
        entity_id:
        - group.hmip_raeume
      data:
        preset_mode: none
      action: climate.set_preset_mode
    default_entity_id: switch.hmip_normalprogramm
    name: Heizung Normalprogramm
    state: "{% set ents = expand('group.hmip_raeume') | list %} {% if ents|count ==
      0 %}false{% else %} {% set all_auto = ents | selectattr('state','equalto','auto')
      | list | count == ents|count %} {% set all_p1 = (ents | map(attribute='attributes.preset_mode')
      | list)\n                  | select('equalto','week_program_1') | list | count
      == ents|count %}\n{{ all_auto and all_p1 }} {% endif %}"

Ich hoffe, ich konnte euch weiterhelfen!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.