Szenen einrichten, Item in mehreren Szenen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
TorstenE
Beiträge: 246
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

Szenen einrichten, Item in mehreren Szenen

Beitrag von TorstenE »

Hallo Mitstreiter,

wie eine Rule eingerichtet wird ist mir klar:

Code: Alles auswählen

rule "Szene Morgen ein"
    when
        // Szene aktivieren
        Item sMorgen received command ON
    then
    	// schalte irgend welche Licht-Items ein
    end
Also über ein Szene-Item, welches als Switch konfiguriert ist, die Szene aktivieren bzw. deaktivieren.
(egal, mal welcher Trigger dieses Szene-Item noch alles schaltet ausser der manuelle Switch)

Nur wie stellt Ihr das an, wenn Items in mehreren Szenen enthalten sind. Wird dann von einer
Szene in die andere gewechselt (1. Szene ausschalten, 2. Szene einschalten), dann blinken
z.B. die Lichter, welche in beiden Szenen enthalten sind. Das ist natürlich ein
unschöner Effekt.

Vielleicht gibt es eine generelle Vorgehensweise für Szenen ?

Danke

Torsten
openHAB 5.0.0 (#4495) auf einem Pi 4 mit openHABian

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

Re: Szenen einrichten, Item in mehreren Szenen

Beitrag von udo1toni »

Das Beispiel ist etwas mager :) weil ausgerechnet der Teil fehlt, der in der Rule aktiv arbeitet (also die sendCommands...)

Aber nehmen wir mal ein Beispiel einer statischen Szenensteuerung:

Code: Alles auswählen

rule "Szenen Schaltung"
 when
    Item Szene changed
 then
    if(!(newState instanceof Number) {
        logWarn("scene","Szenensteuerung: {} ist keine gültige Szene! ABBRUCH!",newState)
        return;
    }
    logInfo("scene","Szenensteuerung: es wurde Szene {} gewählt.",newState)
                     // aktueller Wert als Default
    var swLicht1  = myLicht1.state // myLicht11-4  sind Switch Items
    var swLicht2  = myLicht2.state
    var swLicht3  = myLicht3.state
    var swLicht4  = myLicht4.state
    var dimLicht5 = myLicht5.state // myLicht 5-8 sind Dimmer Items
    var dimLicht6 = myLicht6.state
    var dimLicht7 = myLicht7.state
    var dimLicht8 = myLicht8.state
    switch((newState as Number).intValue) {
        case 0 : { swLicht1 = OFF swLicht2 = OFF swLicht3 = OFF swLicht4 = OFF dimLicht5 =   0 dimLicht6 =   0 dimLicht7 =   0 dimLicht8 =   0 }
        case 1 : { swLicht1 =  ON swLicht2 =  ON swLicht3 = OFF swLicht4 = OFF dimLicht5 =  30 dimLicht6 =  50 dimLicht7 =  70 dimLicht8 =  90 }
        case 2 : { swLicht1 = OFF swLicht2 =  ON swLicht3 =  ON swLicht4 = OFF dimLicht5 =  15 dimLicht6 =  37 dimLicht7 =  42 dimLicht8 =  55 }
        case 3 : { swLicht1 = OFF swLicht2 = OFF swLicht3 =  ON swLicht4 =  ON dimLicht5 =  11 dimLicht6 =  55 dimLicht7 =  12 dimLicht8 =  19 }
        case 5 : { swLicht1 = OFF swLicht2 =  ON                                               dimLicht6 =  17                 dimLicht8 = 47 }
    }
    if(myLicht1.state != swLicht1)
        myLicht1.sendCommand(swLicht1.toString)
    if(myLicht2.state != swLicht2)
        myLicht2.sendCommand(swLicht2.toString)
    if(myLicht3.state != swLicht3)
        myLicht3.sendCommand(swLicht3.toString)
    if(myLicht4.state != swLicht4)
        myLicht4.sendCommand(swLicht4.toString)
    if(myLicht5.state != dimLicht5)
        myLicht5.sendCommand(dimLicht5)
    if(myLicht6.state != dimLicht6)
        myLicht6.sendCommand(dimLicht6)
    if(myLicht7.state != dimLicht7)
        myLicht7.sendCommand(dimLicht7)
    if(myLicht8.state != dimLicht8)
        myLicht8.sendCommand(dimLicht8)
 end
Der Knackpunkt ist: zunächst werden die Sollwerte in Variablen festgelegt. Anschließend wird für jedes Item geprüft, ob der aktuelle Status mit dem Sollwert übereinstimmt. Nur bei einer Abweichung wird auch ein Befehl gesendet.
Damit auch Szenen "addierend" verwendet werden können (also die Szenennummer 5 steuert nur vier statt acht Items, die übrigen sollen einfach den aktuellen Status behalten), wird zu Beginn der aktuelle Status in die lokalen Variablen geladen.
Da es sich bei swLicht1 - 4 um OnOffType handelt, wird openHAB rummosern, weil es keinen Status als Befehl verwenden möchte (als ob das bei Zahlen anders wäre...) Deshalb der Kunstgriff mit dem .toString :)
Und ja, es gibt keine Szene 4. Szenen müssen nicht zwangsläufig durchgehend nummeriert sein ;)

Natürlich ist das oben hässlicher Spaghetticode, geht hübscher mit Gruppen und HashMaps.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
TorstenE
Beiträge: 246
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

Re: Szenen einrichten, Item in mehreren Szenen

Beitrag von TorstenE »

Hallo Udo,

danke für das Beispiel. Der Tipp mit den Variablen löst meine Frage vollkommen.
Also gibt es eigentlich immer nur 1 "Haupt"-Szene die praktisch aktiv/gültig ist.
Bei Szene 5 interessieren somit nur 2 Items, der Rest wäre egal - ebenfalls verstanden.

Aber jetzt die Frage: Jetzt konkurrieren Szene 2 und Szene 5 bei dem "swLicht1". D.h. wenn Du Szene 5 nach Szene 2 aktivierst, kannst Du die Szene 5 eigenständig nicht mehr zurück nehmen. - Wo wird so etwas verwendet ?

Schönen Abend

Torsten
openHAB 5.0.0 (#4495) auf einem Pi 4 mit openHABian

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

Re: Szenen einrichten, Item in mehreren Szenen

Beitrag von udo1toni »

Man kann ohnehin keine Szenen "zurücknehmen".
Eine Szene kann per Definition auch nicht "aktiv" sein und somit auch nicht "deaktiviert" werden.
Eine Szene wird ausgelöst und damit nehmen alle beteiligten Items einen in der Szene definierten Status an.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
TorstenE
Beiträge: 246
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

Re: Szenen einrichten, Item in mehreren Szenen

Beitrag von TorstenE »

Ok, das ist praktisch die "Grund-Idee". Die Items nehmen bei einer Szene einen Status ein - fertig.
Verstanden - zurück gibt es nicht, somit logisch.

Danke Udo.
openHAB 5.0.0 (#4495) auf einem Pi 4 mit openHABian

Antworten