Seite 1 von 1

Szenen einrichten, Item in mehreren Szenen

Verfasst: 5. Nov 2022 14:54
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

Re: Szenen einrichten, Item in mehreren Szenen

Verfasst: 5. Nov 2022 17:33
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.

Re: Szenen einrichten, Item in mehreren Szenen

Verfasst: 5. Nov 2022 17:59
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

Re: Szenen einrichten, Item in mehreren Szenen

Verfasst: 5. Nov 2022 19:37
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.

Re: Szenen einrichten, Item in mehreren Szenen

Verfasst: 5. Nov 2022 20:15
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.