Seite 1 von 1

Wenn ein Schalter auf ON dann zwei weitere auch Schalten (solved)

Verfasst: 16. Feb 2020 10:27
von netZr0t
Hi,

muss nach langer Zeit mal wieder die Experten zu Rate ziehen.
Ich habe im Flur nur ein Licht, aber drei Schalter, die ursprünglich klassisch über Kreuzschaltung verkabelt waren.
Diese Schalter habe ich jetzt durch Sonoff Touch Schalter ersetzt, die alle einfach parallel verkabelt sind.

Das heisst, ich kann zwar von jedem Schalter einschalten, aber natuerlich nicht mehr von einem anderen aus, solange noch ein Schalter an ist.
Ich habe die Schalter in einer Gruppe

Code: Alles auswählen

Group:Switch:OR(ON, OFF) gEGFlur	"Flurlicht"
Switch Flurlicht1 "Flurlicht1" <light> (gEGFlur) ["Lighting"] { channel="mqtt:topic:T0EU2C_FLUR1:switch1" }
Switch Flurlicht2 "Flurlicht2" <light> (gEGFlur) ["Lighting"] { channel="mqtt:topic:T0EU2C_FLUR2:switch1" }
Switch Flurlicht3 "Flurlicht3" <light> (gEGFlur) ["Lighting"] { channel="mqtt:topic:T0EU2C_HTUER1:switch1" }
Der Gruppenschalter funktioniert auch wie er soll, wenn ich aber an den Lichtschaltern schalte beeinflusst das den Gruppenschalter nicht.

muss man das mit einer Rule machen ?

Ich habe das mal so ausprobiert, funktioniert aber auch nicht

Code: Alles auswählen

rule "EGGruppenschaltung SW1 ON"
when
  Item Flurlicht1 received command ON
then
    Flurlicht2.sendCommand(ON)
    Flurlicht3.sendCommand(ON)
end

rule "EGGruppenschaltung SW1 OFF"
when
  Item Flurlicht1 received command OFF
then
    Flurlicht2.sendCommand(OFF)
    Flurlicht3.sendCommand(OFF)
end

Bitte um Erleuchtung

Re: Wenn ein Schalter auf ON dann zwei weitere auch Schalten

Verfasst: 16. Feb 2020 19:49
von udo1toni
So darfst Du das nicht machen. Stattdessen solltest Du die Lampe nur von einem Schalter schalten lassen und die anderen Sonoff Touch nur verwenden, um den Schaltbefehl weiterzuleiten. Die Verschaltung (damit die Taster wie die Kreuzschaltung funktionieren) musst Du dann über mqtt erledigen.
Anschließend reicht eine Rule:

Code: Alles auswählen

// globale Variablen immer zu Beginn der Datei definieren!
var Boolean bFlur = false

rule "Flurlicht"
when
    Member of gEGFlur received command
then
    if(bFlur) return;
    bFlur = true
    gEGFlur.members.forEach[i | 
        if(i.state != receivedCommand)
            i.sendCommand(receivedCommand)
    ]
    Thread::sleep(300)
    bFlur = false
end
Die Rule triggert bei jedem Schaltbefehl. Falls die globale Variable bFlur true ist, wird die Rule sofort abgebrochen. Falls die Rule weiter läuft, wird die Variable auf true gesetzt (damit wird also verhindert, dass die Rule sich immer weiter selbst triggert).
Anschließend wird an jeden Member der Gruppe der gleiche Befehl gesendet, falls das Item einen anderen Status hat.
Danach wartet die Rule noch einen kurzen Moment und setzt abschließend die Variable wieder auf false.
Die Wartezeit ist der Tatsache geschuldet, dass es schon mal einen Moment dauert, bis der Status eines Items dem Befehl gefolgt ist.
Ließe man die Lock-Variable weg, würde der Code mehrfach gleichzeitig ausgeführt, bis sich alles beruhigt hat.

Re: Wenn ein Schalter auf ON dann zwei weitere auch Schalten

Verfasst: 20. Feb 2020 22:24
von netZr0t
Super, vielen Dank, werde das am Wochende ausprobieren.

Gesendet von meinem MI 9 mit Tapatalk


Re: Wenn ein Schalter auf ON dann zwei weitere auch Schalten

Verfasst: 22. Feb 2020 17:24
von netZr0t
Servus,

habe mich da heute nochmal dran gemacht. Ich habe die Phasenduchschaltung bei Flurlicht2 und Flurlicht3 weggeklemmt.
Wenn ich softwaremaessig (UI) einen Schalter betätige schaltet er die anderen beiden mit. Das ist ja schon mal genau das was sie tuen sollen.
Leider funktioniert das nicht wenn ich einen Schalter physikalisch betätige. Das log sagt eigentlich genau das was ich will, aber es passiert nichts.

Flurlicht2 changed from OFF to ON
gEGFlur changed from OFF to ON through Flurlicht2

Was genau meintest du was ich auf MQTT Seite machen soll ?

Gruss

Torsten

PS: der Thread:sleep(300) muss glaube ich Thread.sleep(300) heissen

Re: Wenn ein Schalter auf ON dann zwei weitere auch Schalten

Verfasst: 22. Feb 2020 19:05
von udo1toni
Es muss Thread::sleep(300) heißen (zwei Doppelpunkte)

Offensichtlich generiert der Tastendruck kein Kommando. Schade. Dann halt so:

Code: Alles auswählen

// globale Variablen immer zu Beginn der Datei definieren!
var Boolean bFlur = false

rule "Flurlicht"
when
    Member of gEGFlur changed
then
    if(bFlur) return;
    bFlur = true
    gEGFlur.members.forEach[i | 
        if(i.state != triggeringItem.state)
            i.sendCommand(triggeringItem.state)
    ]
    Thread::sleep(300)
    bFlur = false
end
Gesendet von meinem SM-G973F mit Tapatalk

Re: Wenn ein Schalter auf ON dann zwei weitere auch Schalten

Verfasst: 23. Feb 2020 08:37
von netZr0t
Perfekt. Works like a charme !
Danke Dir wie immer für die Expertise.
Ich glaube ich muss mich mal mit JAVA Auseinandersetzen. Ich verstehe zwar was du da machst, aber den Syntax check ich nicht

Re: Wenn ein Schalter auf ON dann zwei weitere auch Schalten (solved)

Verfasst: 24. Feb 2020 14:59
von udo1toni
:) Immer gerne. Das ist allerdings kein Java ;) sondern XTend. Da das in Java entwickelt wird/wurde, gibt es eine größere Menge an Ähnlichkeiten, im Grunde ist es aber ziemlich anders...