Klar...
Code: Alles auswählen
// Globale Variablen, Konstanten und Imports müssen vor der ersten Rule definiert werden.
var Boolean bWash = false // definiere eine globale Variable
// vom Typ Boolean
// mit dem Namen bWash und
// belege diese zunächst mit dem Wert false
rule "Waschmaschine fertig" // Definiere eine Rule mit dem Namen "Waschmaschine fertig"
when // ab hier folgt eine Liste aller Trigger, die die Rule auslösen
Item sps_kg_wm_leistung changed // Wenn das Item sps_kg_wm_leistung seinen Status ändert, starte die Rule
then // ab hier folgt der auszuführende Code
if(!bWash) { // Bedingung: die Variable bWash muss false enthalten
// das ! ist die logische Negierung, aus true wird false und umgekehrt
if(sps_kg_wm_leistung.state > 20) // Bedingung: der Status des Items sps_kg_wm_leistung ist grüßer als 20
bWash = true // setze die Variable bWash auf true
} else { // falls die zugehörige if-Anweisung (vor der öffnenden geschweiften Klammer) nicht zutrifft
if(sps_kg_wm_leistung.state < 1.4) {// Bedingung: der Status des Items sps_kg_wm_leistung ist keiner als 1.4
sendTelegram("Sascha","Die Waschmaschine ist fertig") // sende eine Nachricht über Telegram
bWash = false // setze die Variable bWash auf false
}
}
end // Ende des Codeblocks und Ende der Rule
Die geschweiften Klammern {} fassen mehrere Befehle so zusammen, dass sie wie ein Befehl behandelt werden (auf dieser Ebene)
Der Grund hierfür: jegliche bedingte Verzweigungen wirken immer nur auf den nächsten Befehl. Beispiel:
Code: Alles auswählen
if(sps_kg_wm_leistung.state < 1.4) {
sendTelegram("Sascha","Die Waschmaschine ist fertig")
bWash = false
}
ist das status < 1.4, werden beide Befehle ausgeführt, sonst keiner.
Code: Alles auswählen
if(sps_kg_wm_leistung.state < 1.4)
sendTelegram("Sascha","Die Waschmaschine ist fertig")
bWash = false
ist das status < 1.4, wird sendTelegram ausgeführt, sonst nicht. die Wertzuweisung wird immer ausgeführt.
Die Einrückung des Codes dient einzig der Lesbarkeit und hat keinen Einfluss auf den Ablauf.
beim ersten if() wäre streng genommen keine Klammerung nötig, allerdings ist im ersten if-block eine weitere bedingte Verzweigung eingebaut und es folgt dann der else-block für die erste bedingte Verzweigung. Die DSL wird den else-Teil dann auf das flasche if beziehen.
Im ersten Codebeispiel gibt es noch die eckigen Klammern []. Diese schließen ein Lambda ein. Das Lambda ist ein Codeblock, der als Parameter dient. Dort gibt es ebenfalls einen senkrechten Slash |. Im Fall eines Timers spielt der keine Rolle und kann sogar weg gelassen werden (ist aber besserer Stil ihn hinzuschreiben). Wenn man z.B. eine Gruppefiltert, so benötigt man einen Stellvertreter für die einzelnen Gruppenmember, um im Filter das Item verwendne zu können, so:
Code: Alles auswählen
gMyGroup.members.filter[i|i.name.contains("Licht")].forEach[j|
j.sendCommand(ON)
]
Diese drei Zeilen sorgen dafür, dass alle Member der Gruppe gMyGroup, in deren Namen das Wort "Licht" enthalten ist, den Befehl ON senden.
Diese drei Zeilen sind auch ein gutes Beispiel, wie mächtig die Rules DSL ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet