Heizungsautomatisierung (Update): jetzt mit Tags!
Hier kommt ein kurzes Update zu meinem ursprünglichen Artikel über die Heizungsautomatisierung. Es beschreibt die Umstellung von einem globalen Modus-System auf ein flexibles, tag-basiertes Profil-System. Er baut auf dem ursprünglichen Post auf; wenn ihr den also nicht gelesen habt, dann bitte zunächst diesen lesen.
Kurzüberblick — was hat sich geändert
Statt eines einzelnen, globalen Modussystems (ein Modus für die ganze Bude) verwaltet die Steuerung jetzt Tags. Ein Tag ist ein semantischer Zustand (z. B. urlaub, ferien, krank_alle, kind_zu_hause), kann gleichzeitig mit anderen Tags aktiv sein und definiert, welche Zeitpläne (Profile/Modi) in welchen Räumen gelten sollen.
Nachteile des alten Systems
Ich hatte globale Zeitpläne pro Modus.
- Jeder Raum hatte also
kinder_krankdefiniert, auch wenn es z. B. für die Küche oder das Arbeitszimmer kaum einen Unterschied zunormalgab. - Dadurch entstanden viele redundante Zeitpläne und damit hoher Definitions- und Pflegeaufwand.
- Jeder Raum hatte also
Kombinationen wie ein Kind ist krank und meine Frau ist zu Hause (Wohnzimmer und Kinderzimmer heizen) sind eigentlich unabhängig von der Frage, ob ich im Arbeitszimmer sitze und Homeoffice habe oder im Büro bin. Ich musste aber einzelne Zeitpläne für all diese Kombinationen stricken und pflegen.
Vorteile und Beschreibung der neuen Idee
- Mehrere gleichzeitig aktive Tags (z. B.
['ferien', 'buerotag']) sind möglich. - Tags haben Trigger, Effekte und Prioritäten.
- Trigger bestimmen, ob ein Tag aktiv ist oder nicht.
- Effekte wirken auf Räume, indem sie Profile für den Raum aktivieren.
- Tags können pro Raum unterschiedliche Effekte haben.
- Laufzeit-States zeigen transparent, welche Tags und Profile aktiv sind.
- Ein Tag
buerotagwirkt z. B. nur absenkend auf das Arbeitszimmer. - Parallel kann ein Tag
kind_krankaktiv sein und sich auf das Kinderzimmer oder auch auf das Kinderzimmer und das Wohnzimmer auswirken. - Prioritäten lösen Konflikte automatisch pro Raum.
- Adapter-Signale (
feiertag,schoolfree,absence) sind parallel zu Kalender-Einträgen Trigger, die einen Tag aktivieren.
Designprinzipien (kurz)
- Deterministisch: Für jeden Raum wird basierend auf aktiven Tags und Prioritäten genau ein aktiver Tag bzw. ein Profil ausgewählt.
- Raumorientiert: Effekte werden pro Raum oder als
defaultdefiniert. - Beobachtbar: Neue Runtime-States liefern Diagnosedaten (aktive Tags, pro Raum aktiver Tag, letztes angewendetes Profil).
Migration
Die Migration war nicht weiter schwer; ich musste vor allem die alte Kalender-Definition durch die nun recht zentrale Tag-Definition ersetzen.
1) Neue Datei: heating/config/tags.json, alte Kalenderregeln konvertieren
Minimalstruktur eines Tags:
{
"tags": {
"urlaub": {
"priority": 40,
"triggers": {
"keywords": ["Urlaub", "Reise"]
},
"effects": {
"default": "urlaub"
}
}
// und so weiter
}
}
Der Text „Urlaub“ in meinem Kalender triggert hier also für alle Räume (default) den Modus Urlaub.
Wichtige Regeln:
priority: größer = wichtigertriggers: mindestenskeywordsoderadapterSignaleffects: mindestens ein Raum oderdefault
2) Adapter-Signale zuordnen
Verfügbare Adapter-Signale:
feiertag— Feiertags-Adapterschoolfree— Schulfrei-Adapterabsence— Anwesenheitsstatus (invertiert: Abwesenheit → Tag aktiv)
Beispiel mit Adapter:
{
"ferien": {
"priority": 30,
"triggers": {
"keywords": ["Ferien"],
"adapterSignal": "schoolfree"
},
"effects": {
"default": "ferien"
}
}
}
Der Schoolfree-Adapter triggert hier an einem Tag ohne Schule für alle Räume (default) den Modus Ferien.
3) Raumspezifische Effekte
Tags können raumspezifische Modi setzen. Beispiel:
{
"buerotag": {
"priority": 20,
"triggers": {
"keywords": ["Robert im Büro", "Bürotag"]
},
"effects": {
"arbeitszimmer": "eco"
}
}
}
Hier bewirkt entweder der Text „Robert im Büro“ oder der Text „Bürotag“ in meinem Kalender, dass sich mein Arbeitszimmer tagsüber nicht aufheizt.
Fazit
Das neue Tag-System macht die Heizungssteuerung deutlich flexibler. Ich habe erheblich weniger Zeitpläne zu managen, und das System ist dennoch deutlich anpassungsfähiger. Der Haupteffekt ist, dass sich bestimmte Einflüsse oft nur auf einzelne Räume auswirken — und genau das macht alles so viel einfacher.
Mein normal-Plan ist nun der Wochenplan, der hier am häufigsten zutrifft: Ich bin im Homeoffice, die Kinder sind in Kindergarten und Schule, und meine Frau ist bei ihrer Arbeit. Abweichungen von diesem normal werden entweder durch die Adapter ganz automatisch oder durch Kalendereinträge ausgelöst. Dabei ergeben sich Einträge für Urlaubsreisen ganz automatisch — das würde man ja ohnehin in den Kalender schreiben. Die XY krank-Einträge sind auch keine große Umstellung; in gewissen Grenzen habe ich das schon immer gemacht. Wenn ich krank war, habe ich z. B. „Robert krank“ als Ganztagesereignis in meinen Kalender geschrieben und in dem Zug auch gleich alle Business- und Privattermine an dem Tag abgesagt. Zum einen wird man dann nicht von irgendeinem Meeting angebimmelt, an dem man ohnehin nicht teilnehmen wird, und zum anderen sagt einem der Kalender später, im Rückblick, immer, was an einem fraglichen Tag tatsächlich los war.
Die im ersten Artikel beschriebenen weiteren Sonderfunktionen — Abwesenheitsabsenkung und Motion-Boost — gibt es natürlich weiterhin; sie blieben unangetastet.
Nun scheint mir das System erst einmal fertig, aber wer weiß – der Spieltrieb ist stark in mir. Falls ihr noch Ideen habt, dann immer her damit.