⚙️Programme und HomeMatic-Skript

In der WebUI baut man Programme aus Wenn-Bedingungen und Dann/Sonst-Aktivitäten. Ausgeführt werden sie von der Logikschicht ReGaHss – die auch HomeMatic-Skript versteht. Hier läuft beides in einer eigenen, vereinfachten Engine für ein erfundenes Beispielhaus.

🧠Die drei Auslösearten

bei Änderung auslösen

Das Programm startet nur, wenn sich der Wert ändert (Fenster zu → offen). Wiederholt das Gerät denselben Zustand, passiert nichts.

bei Aktualisierung auslösen

Startet bei jeder Meldung, auch mit gleichem Wert – nötig für Tastendrücke (PRESS_SHORT ist immer true).

nur prüfen

Löst nie aus, wird aber mitgeprüft, wenn eine andere Bedingung das Programm gestartet hat (z. B. „um 22:00 und Fenster zu“).

💡 Wann läuft „Sonst“?
Nur wenn das Programm ausgelöst wurde und die Bedingung nicht erfüllt ist – z. B. „Fenster geschlossen“ bei einem Programm, das auf „Fenster = offen, bei Änderung“ reagiert. Ohne Auslöser wird weder Dann noch Sonst ausgeführt.

🏠Simulator: Programme im Beispielhaus

Fünf Programme, fünf Geräte. Löse Ereignisse aus, spule die Zeit vor (Start 21:50, Nachtabsenkung um 22:00) und verfolge im Protokoll, welches Programm warum läuft. Mit der Maus über ein Programm hebt dessen Einträge hervor.
Fenster auf → Heizung absenken
0× ausgelöst
WennFensterkontakt Wohnzimmer (0 = zu, 1 = offen) == 1bei Änderung auslösen
Dann
• Systemvariable „Fenster offen“ ← true
• Thermostat Wohnzimmer Solltemperatur ← 12
Sonst
• Systemvariable „Fenster offen“ ← false
• Thermostat Wohnzimmer Solltemperatur ← 21
Taster Flur → Steckdose Küche umschalten (Skript)
0× ausgelöst
WennWandtaster Flur kurz == truebei Aktualisierung auslösen
Dann
• Skript ausführen
! Steckdose umschalten
var sd = dom.GetObject("HmIP-RF.000A1BE9A00003:3.STATE");
if (sd.State()) {
  sd.State(false);
  WriteLine("Steckdose war an – jetzt aus");
} else {
  sd.State(true);
  WriteLine("Steckdose eingeschaltet");
}
Sonst—
Steckdose nach 10 Minuten wieder aus
0× ausgelöst
WennSteckdose Küche == truebei Änderung auslösen
Dann
• Steckdose Küche ← false (verzögert 600 s)
Sonst—
Rauchalarm → Licht an + Meldung
0× ausgelöst
WennRauchmelder Flur Alarmstatus (1 = PRIMARY_ALARM) == 1bei Änderung auslösen
Dann
• Licht Garage ← true
• Systemvariable „Alarmmeldung“ ← „Rauch im Flur!“
Sonst
• Systemvariable „Alarmmeldung“ ← „“
Nachtabsenkung 22:00 (nur wenn Fenster zu)
0× ausgelöst
WennZeit: täglich 22:00 UhrZeitpunktUNDFensterkontakt Wohnzimmer (0 = zu, 1 = offen) == 0nur prüfen
Dann
• Thermostat Wohnzimmer Solltemperatur ← 17
Sonst—
🏠 Beispielhaus
21:50:00
🪟
Fenster Wohnzimmer
zu
🌡️
Solltemperatur
21 °C
🔌
Steckdose Küche
aus
⚫
Licht Garage (klassisch)
aus
🔥
Rauchmelder Flur
ruhig
⏳
verzögerte Aktivitäten
keine
Systemvariablen
Anwesenheittrue
Fenster offenfalse
Alarmmeldung„“
⚡ Ereignisse auslösen
🕒 Zeit vorspulen
📋 Ablaufprotokoll
0 Einträge · neueste oben

Löse links ein Ereignis aus – z. B. „Fenster öffnen“ oder „Taster kurz“ – oder spule auf 22:00 vor.

Nachgebildete Regeln: Bedingungsblöcke sind ODER-verknüpft, Bedingungen innerhalb eines Blocks UND; verzögerte Aktivitäten starten bei erneutem Auslösen neu; Verschachtelungen über 8 Ebenen werden als mögliche Endlosschleife abgebrochen. Die echte ReGaHss hat weitere Feinheiten (z. B. „Sonst, wenn“-Blöcke, Zeitmodul mit Serien).

📜HomeMatic-Skript – Grundlagen

Skripte laufen in der ReGaHss – als Aktivität „Skript ausführen“ in einem Programm oder zum Testen unter „Programme → Skript testen“. Zugriff auf Geräte und Variablen geht über das Objektmodell dom:

  • dom.GetObject("HmIP-RF.000A1BE9A00001:1.ACTUAL_TEMPERATURE") – Datenpunkt holen
  • .State() lesen, .State(wert) schreiben (löst Funk aus!)
  • dom.GetObject(ID_SYSTEM_VARIABLES).Get("Anwesenheit") – Systemvariable
  • .Value() lesen, WriteLine(…) gibt Text aus, # verkettet Texte
  • Kommentare beginnen mit !, Anweisungen enden mit ;
! Beispiel: Heizung absenken, wenn Fenster offen
var fenster = dom.GetObject("HmIP-RF.000A1BE9A00002:1.STATE");
var soll    = dom.GetObject("HmIP-RF.000A1BE9A00001:1.SET_POINT_TEMPERATURE");

if (fenster.State() == 1) {
  soll.State(12.0);
  WriteLine("Fenster offen → 12 °C");
} else {
  WriteLine("Fenster zu");
}
⚠️ Jedes State(x) kann ein Funkbefehl sein
Ein Skript, das in einer Schleife oder alle paar Sekunden Aktoren schreibt, kostet Duty Cycle. Vorher prüfen, ob der Wert sich überhaupt ändert.
✅ Klammern setzen
HomeMatic-Skript hat Eigenheiten bei der Auswertung von Ausdrücken. Der Simulator hier nutzt die übliche Rangfolge – in echten Skripten Ausdrücke im Zweifel immer klammern.

🧪Skript-Spielwiese

Eine Teilmenge von HomeMatic-Skript (var, if/elseif/else, dom.GetObject, State/Value, WriteLine, Rechnen und Vergleichen) in einer eigenen Engine – mit Protokoll aller Lese- und Schreibzugriffe.
Ausgabe

Noch nicht ausgeführt.

Zustand im Beispielhaus
HmIP-RF.000A1BE9A00002:1.STATE0
HmIP-RF.000A1BE9A00001:1.SET_POINT_TEMPERATURE21
HmIP-RF.000A1BE9A00001:1.ACTUAL_TEMPERATURE20.5
HmIP-RF.000A1BE9A00003:3.STATEfalse
HmIP-RF.000A1BE9A00004:1.PRESS_SHORTfalse
HmIP-RF.000A1BE9A00005:1.SMOKE_DETECTOR_ALARM_STATUS0
BidCos-RF.XYZ0000001:1.STATEfalse
Anwesenheittrue
Fenster offenfalse
Alarmmeldung„“