Rule mit Gruppenitem nur wert des geändertem Item senden lassen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Rambo82
Beiträge: 33
Registriert: 9. Jan 2021 14:06
Answers: 0

Rule mit Gruppenitem nur wert des geändertem Item senden lassen

Beitrag von Rambo82 »

Hallo zusammen,

Ich hänge mal wieder gei einer Regel, und zwar ist es möglich, dass ich ein Gruppenitem ( z.b. alle Thermostate ) wenn eines der Items den Status verändert, dass ich nur den geänderten status zurückbekomme.

Hintergrund ist ich möchte mitbekommen wenn ein Thermostat den Status verändert.

Und um zu vermeiden, dass ich eine Regel für jedes Thermostat schreiben muss, wollte ich es mit der Gruppe lösen.

Jetzt fehlt mir nur noch, dass ich nur den status des auslösenden Item bekomme.

Ist das möglich ?
Oder soll ich lieber einzelne Regeln schreiben ?

Danke

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Rule mit Gruppenitem nur wert des geändertem Item senden lassen

Beitrag von udo1toni »

Ja, das ist eine Standard Funktion der Groups.
Nehmen wir eine Gruppe gThermostate, in der alle Thermostate enthalten sind.

Code: Alles auswählen

rule "geänderte Temperatur loggen"
when
    Member of gThermostate changed
then
    logInfo("temperature","Rule wurde durch Item {} ausgelöst, welches seine Temperatur von {} auf {} geändert hat.",triggeringItem.name,previousState,newState)
end
Geht es darum, abhängig vom Wert eine bestimmte Aktion (mit einem anderen Item, abhängig vom auslösenden Item) auszuführen, musst Du darauf achten, dass beide Itemarten möglichst in zwei Gruppen organisiert sind und man von dem einen Item auf das andere Item schließen kann. Sinnvoll wäre z.B. WoZi_Temp und WoZi_tempalarm, in zwei Gruppen gTemperatur und gTempAlarm. Nun kannst Du den Namensteil, der das Temperatur-Item von anderen Temperatur-Items unterscheidet (hier der erste Teil des Namens, bis zum Unterstrich) nutzen, um in der zweiten Gruppe das dazu passende Alarm-Item zu finden:

Code: Alles auswählen

rule "Alarm wenn zu heiß"
when
    Member of gTemperatur changed
then
    if(!(newState instanceof Number)) {
        logWarn("tempAlarm","Item {} lieferte ungültigen Wert {}! Abbruch! Abbruch!",triggeringItem.name,triggeringItem.state)
        return;
    }
    if((newState as Number).floatValue < 25) {
        logInfo("tempAlarm","Item {} lieferte {}. Alles im grünen Bereich.",triggeringItem.name,newState)
        return;
    }
    val myItem = gTempAlarm.members.filter[i|i.name.startsWith(triggeringItem.name.split("_").get(0))].head
    logInfo("tempAlarm","Item {} lieferte {}. Grenzwert 25°C erreicht oder überschritten. Schalte {} ein.",triggeringItem.name,newState,myItem.name)
    myItem.sendCommand(ON)
end
Ich habe hier die Rules in reiner Textform geschrieben. Man kann diese Rules auch über die UI anlegen (dann muss der Teil zwischen when und then als Trigger gesetzt werden, der Teil zwischen then und end landet als DSL Rule im Code-Block. Der Rahmen rule - when- then - end ist nicht Bestandteil des Codes!
Ich habe mich bemüht, die wichtigsten Eigenschaften im Zusammenhang mit Gruppen-Rules mit einzubauen. triggeringItem repräsentiert das Item, welches die Rule getriggert hat. Dieses Item steht nur beim Trigger Member of ... zur Verfügung. previousState und newState sind zwei implizite Variablen, die beim Trigger changed zur Verfügung stehen, newState steht darüber hinaus auch bei received update zur Verfügung.
Falls noch Fragen offen sind, frag! :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten