Seite 1 von 1

Item aus Gruppe per Switch deaktivieren

Verfasst: 26. Nov 2022 13:43
von mad-mike
Hallo zusammen.

Ich möchte ein Item Switch einer Gruppe per anderen Switch deaktivieren.

Hintergrund:

Ich nutze eine Gruppe wo alle Lampen hinterlegt sind, und diese beinhalten auch die Lampen vom Kinderzimmer.

Nun ist das Kind ja auch manchmal Zuhause und ich dachte mir, man kann das irgendwie per Switch deaktivieren damit die Lampen im Kinderzimmer nicht ausgehen..

Im 2ten step will ich versuchen das ganze per rule zu Steuern aber dazu später... (Soweit bin ich noch nicht :mrgreen: )

Ich dachte mir irgendwie: wenn Item "Kind Zuhause on" dann Item Kinderzimmer Lampe in Gruppe deaktiviert....

Geht sowas?

Danke und Gruß.

Re: Item aus Gruppe per Switch deaktivieren

Verfasst: 27. Nov 2022 02:23
von udo1toni
Nein, das geht nicht. Andersrum geht es aber: Du definierst eine Rule, um alle Lichter auszuschalten (ist ohnehin zuverlässiger als über das Group Item einen Befehl an alle zu senden).
In der Rule hast Du nun mehrere Möglichkeiten, entweder Du durchläufst die Gruppe und prüfst (falls "deaktiviert") jeweils, ob das Item nicht berücksichtigt werden soll:

Code: Alles auswählen

gLights.members.filter[i|i.state == ON].forEach[light|
    if(!(active.state != ON && light.name == "LichtKind"))
        light.sendCommand(OFF)
]
Alternativ kannst Du das Licht auch komplett aus der Gruppe raus lassen und separat in der Rule schalten.

Falls die Gruppe sowohl Switch Items als auch Dimmer Items enthält, muss man das gesondert berücksichtigen.

Re: Item aus Gruppe per Switch deaktivieren

Verfasst: 27. Nov 2022 18:16
von mad-mike
Wie würde das denn aussehen?? :oops:
Alles was ich versucht habe, hat die Rule abgebrochen mit fehler meldungen...

Also das gruppen Item heisst:

Code: Alles auswählen

Lampe
Und das item vom Kind heisst:

Code: Alles auswählen

Constantin
Vielleicht errinnerst du dich noch an anderer stell hattest du mir mal dies gebaut:

Code: Alles auswählen

var Timer tZentralAus = null                                                                // ein Zeiger für einen Timer
var Integer iZentralAus                                                                     // ein Zähler
val Integer iMio = 1000000

rule "Zentral_off"
when
    Channel "shelly:shelly25-relay:784c5f2ecc:relay2#button" triggered SHORT_PRESSED or     // Taster - Haustür
    Item Zentral_taster changed to ON                                                       // APP
then
    tZentralAus?.cancel                                                                     // Falls Timer existiert, weg damit
    iZentralAus = 5                                                                         // Zähler initialisieren
    tZentralAus = createTimer(now.plusNanos(10*iMio), [|                                    // Timer anlegen und fast sofort starten
        iZentralAus-=1                                                                      // Zähler runterzählen
        if(iZentralAus < 1) {                                                               // falls am Ende angekommen
            Lampe.sendCommand(OFF)                                                          // Gruppe OFF
            HTTPURLThing_km7.sendCommand(ON)                                                // Relais ON
            Zentral_taster.sendCommand(OFF)                                                 // APP Schalter
        } else {                                                                            // ansonsten
            Shelly107_Betrieb.sendCommand(if(Shelly107_Betrieb.state != ON) ON else OFF)    // toggle Relais
            tZentralAus.reschedule(now.plusNanos((if(iZentralAus > 1) 500 else 1000)*iMio)) // plane den Timer erneut ein
        }
    ])
end
Nun hatte ich versucht den teil mit ""Lampe.sendCommand(OFF)"" durch deinen Teil oben zu ersetzen... Aber irgendwie bin ich gescheitert. :roll:

Gruss

Re: Item aus Gruppe per Switch deaktivieren

Verfasst: 27. Nov 2022 19:13
von udo1toni
So müsste das eigentlich gehen:

Code: Alles auswählen

var Timer tZentralAus = null                                                                // ein Zeiger für einen Timer
var Integer iZentralAus                                                                     // ein Zähler
val Integer iMio = 1000000

rule "Zentral_off"
when
    Channel "shelly:shelly25-relay:784c5f2ecc:relay2#button" triggered SHORT_PRESSED or     // Taster - Haustür
    Item Zentral_taster changed to ON                                                       // APP
then
    tZentralAus?.cancel                                                                     // Falls Timer existiert, weg damit
    iZentralAus = 5                                                                         // Zähler initialisieren
    tZentralAus = createTimer(now.plusNanos(10*iMio), [|                                    // Timer anlegen und fast sofort starten
        iZentralAus-=1                                                                      // Zähler runterzählen
        if(iZentralAus < 1) {                                                               // falls am Ende angekommen
            Lampe.members.filter[i|i.state == ON].forEach[licht|                            // für jedes eingeschaltete Item der Gruppe
                if(!(licht.name == "Constantin" && active.state == OFF))                    // prüfe, ob Name == Constantin und gleichzeitig Item active OFF)
                    list.sendCommand(OFF)                                                   // falls nicht, sende OFF ans Item 
            ]
            HTTPURLThing_km7.sendCommand(ON)                                                // Relais ON
            Zentral_taster.sendCommand(OFF)                                                 // APP Schalter
        } else {                                                                            // ansonsten
            Shelly107_Betrieb.sendCommand(if(Shelly107_Betrieb.state != ON) ON else OFF)    // toggle Relais
            tZentralAus.reschedule(now.plusNanos((if(iZentralAus > 1) 500 else 1000)*iMio)) // plane den Timer erneut ein
        }
    ])
end
Der Punkt ist, dass nicht die Gruppe den Befehl bekommt (und dann stellvertretend an die einzelnen Items weiterreicht), sondern die Gruppe wird durchlaufen, für jedes Item der Gruppe wird das Lambda ausgeführt (das Lambda ist der Inhalt zwischen [ und ]).

Ob man die Gruppe zunächst nach den ITems filtert, die eingeschaltet sind, ist erst mal unerheblich.