[SOLVED] Zwei MQTT Switches schalten synchron [profile="follow"]
-
- Beiträge: 383
- Registriert: 19. Feb 2020 20:51
- Wohnort: Saarbrücken
[SOLVED] Zwei MQTT Switches schalten synchron [profile="follow"]
Wie bekomme ich das denn hin, habt ihr eine Idee?
Zum Aktivieren meines Rule für eine Alarmanlage, habe ich momentan ein Dummy Switch "AlarmAussen" definiert.
In der Sitemap kann ich somit dieses Rule aktivieren und deaktivieren, soweit alles gut.
Nun möchte ich zusätzlich zwei separate Sonoff Touch Schalter verwenden, um auch an verschiedenen Stellen im Haus die Alarmanlage
bedienen zu können.
Das bedeutet, der Dummy Switch und die beiden Sonoffs müssen synchronisiert diese Rule aktivieren bzw. deaktivieren.
Natürlich soll das auch an den Schaltern und dem Dummy Switch entsprechend rückgemeldet werden.
Diese Sonoff Touch haben eine blaue LED, die zeigt wenn ein Schalter an ist.
... OK den Dummy Switch brauche ich ja evtl gar nicht mehr, das könnte ich ja jetzt mit dem Sonoff Touch machen, aber es bleibt
immer noch die Frage wie bekomme ich das nun mit zwei Sonoff Touch synchronisiert ? ....
Zum Aktivieren meines Rule für eine Alarmanlage, habe ich momentan ein Dummy Switch "AlarmAussen" definiert.
In der Sitemap kann ich somit dieses Rule aktivieren und deaktivieren, soweit alles gut.
Nun möchte ich zusätzlich zwei separate Sonoff Touch Schalter verwenden, um auch an verschiedenen Stellen im Haus die Alarmanlage
bedienen zu können.
Das bedeutet, der Dummy Switch und die beiden Sonoffs müssen synchronisiert diese Rule aktivieren bzw. deaktivieren.
Natürlich soll das auch an den Schaltern und dem Dummy Switch entsprechend rückgemeldet werden.
Diese Sonoff Touch haben eine blaue LED, die zeigt wenn ein Schalter an ist.
... OK den Dummy Switch brauche ich ja evtl gar nicht mehr, das könnte ich ja jetzt mit dem Sonoff Touch machen, aber es bleibt
immer noch die Frage wie bekomme ich das nun mit zwei Sonoff Touch synchronisiert ? ....
Zuletzt geändert von Boris099 am 15. Mär 2020 13:09, insgesamt 3-mal geändert.
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))
-
- Beiträge: 383
- Registriert: 19. Feb 2020 20:51
- Wohnort: Saarbrücken
Re: Zwei MQTT Switches aktivieren einen Dummy Switch??
OK ich habe schon mal was gefunden, das geht wohl mit Group Topics in Tasmota
also die zwei Sonoff Touch in der Konsole mit "GroupTopic yourgroupname" einer Gruppe zuordnen.
Aber wir greife ich das nun auf in Openhab, wie spreche ich die Gruppe dann an?
also die zwei Sonoff Touch in der Konsole mit "GroupTopic yourgroupname" einer Gruppe zuordnen.
Aber wir greife ich das nun auf in Openhab, wie spreche ich die Gruppe dann an?
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Zwei MQTT Switches aktivieren einen Dummy Switch??
Warum so kompliziert?
Du ordnest jedem Schalter einen Channel zu, mit dem Du den Schalter nun schalten kannst. Anschließend nutzt Du eine Gruppe:
(Die Channel musst Du natürlich Deinen Gegebenheiten anpassen, ebenso musst Du die Channel korrekt anlegen, mit stateTopic und commandTopic)
Und eine Rule dazu:
Egal welcher Schalter betätigt wird, alle anderen Schalter werden automatisch nachgezogen. Da die Rule auf changed triggern muss, aber selbst die Trigger Items schaltet, welche einen anderen Status haben als den empfangenen change, muss man verhindern, dass die selbst gesendeten Befehle die Rule triggern. (Na ja, das Triggern kann man nicht verhindern, aber das erneute Ausführen des Codes...) Das passiert mit der Variablen bLock.
Thread::sleep(500) sorgt für ein bisschen Wartezeit, um openHAB Zeit zu geben, sich zu beruhigen
Das Group Topic ist für die geplante Anwendung eher ungeeignet, es sei denn, Du willst ausschließlich diese beiden Sonoffs einsetzen, das Group Topic gilt nämlich gewöhnlich für alle mit Tasmota geflashten Geräte.
Du ordnest jedem Schalter einen Channel zu, mit dem Du den Schalter nun schalten kannst. Anschließend nutzt Du eine Gruppe:
Code: Alles auswählen
Group:Switch gAlarmSwitch
Switch AlarmSwitch01 "Schalter 1" (gAlarmSwitch) {channel="mqtt:topic:broker:thing1:ch1"}
Switch AlarmSwitch02 "Schalter 2" (gAlarmSwitch) {channel="mqtt:topic:broker:thing2:ch1"}
Und eine Rule dazu:
Code: Alles auswählen
var Boolean bLock = false
rule "Alarm schalten"
when
Member of gAlarmSwitch changed
then
if(bLock) return;
bLock = true
gAlarmSwitch.members.filter[f | f.state != triggeringItem.state].forEach[i | i.sendCommand(triggeringItem.state.toString)]
Thread::sleep(500)
bLaock = false
end
Thread::sleep(500) sorgt für ein bisschen Wartezeit, um openHAB Zeit zu geben, sich zu beruhigen

Das Group Topic ist für die geplante Anwendung eher ungeeignet, es sei denn, Du willst ausschließlich diese beiden Sonoffs einsetzen, das Group Topic gilt nämlich gewöhnlich für alle mit Tasmota geflashten Geräte.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 383
- Registriert: 19. Feb 2020 20:51
- Wohnort: Saarbrücken
Re: Zwei MQTT Switches aktivieren einen Dummy Switch??
Pffff, na das ist doch einfach
(ein Witz)
also verstanden kein GroupTopic, diese von Dir vorgeschlagene Variante ist viel flexibler, und kann
beliebig angepasst und erweitert werden.
Also die Channel habe ich schon, die Touchs sind ja schon eingebunden die lauten bei mir:
Diese ordne ich nun einfach einer neuen Gruppe zu (muss das Group:Switch definiert werden oder einfach nur Group)?
Das ist soweit verstanden.
Wenn ich das für alle sechs Switches mache, werden die beiden Touch komplett synchron gehalten, ich kann aber z.B. auch nur
jeweils einen Switch des 3fach Touch synchronisieren, das ist echt cool!
Und diese Rule trägt nun einfach Sorge dafür, dass alle Zuständer der vorher zugeordneten Switches dieser Gruppe gleichgezogen werden, korrekt?
OK, diese Rule zu verstehen benötigt einen Insider, sieht aber cool aus, Boolean war für mich schon immer irgendwie wie Chinesisch
Und diese Rule setze ich einfach als weiteres file.rules in meinen rules folder, korrekt?
EDIT:
Aber warte, wie verwende ich das nun in meinem Alarm rule, dort frage ich folgendes ab:
Lass ich das dann einfach so, da das o.g. rule ja immer dafür sorgt, das in diesem Fall beide Switches synchronisiert sind?

also verstanden kein GroupTopic, diese von Dir vorgeschlagene Variante ist viel flexibler, und kann
beliebig angepasst und erweitert werden.
Also die Channel habe ich schon, die Touchs sind ja schon eingebunden die lauten bei mir:
Code: Alles auswählen
Switch E_Touch10_1 {channel="mqtt:topic:4e525484:E_Touch10_1"}
Switch E_Touch10_2 {channel="mqtt:topic:4e525484:E_Touch10_2"}
Switch E_Touch10_3 {channel="mqtt:topic:4e525484:E_Touch10_3"}
Switch S_Touch90_1 {channel="mqtt:topic:28fd4b46:S_Touch90_1"}
Switch S_Touch90_2 {channel="mqtt:topic:28fd4b46:S_Touch90_2"}
Switch S_Touch90_3 {channel="mqtt:topic:28fd4b46:S_Touch90_3"}
Das ist soweit verstanden.
Wenn ich das für alle sechs Switches mache, werden die beiden Touch komplett synchron gehalten, ich kann aber z.B. auch nur
jeweils einen Switch des 3fach Touch synchronisieren, das ist echt cool!
Und diese Rule trägt nun einfach Sorge dafür, dass alle Zuständer der vorher zugeordneten Switches dieser Gruppe gleichgezogen werden, korrekt?
OK, diese Rule zu verstehen benötigt einen Insider, sieht aber cool aus, Boolean war für mich schon immer irgendwie wie Chinesisch

Und diese Rule setze ich einfach als weiteres file.rules in meinen rules folder, korrekt?
EDIT:
Aber warte, wie verwende ich das nun in meinem Alarm rule, dort frage ich folgendes ab:
Code: Alles auswählen
if(E_Touch10_2.state == OFF) {
return;
}
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Zwei MQTT Switches aktivieren einen Dummy Switch??
Also, ich hangele mich mal entlang... 
Boolean ist der Variablentyp, es handelt sich um ein einzelnes Bit, was entweder gesetzt (true) oder nicht gesetzt (false) sein kann.
Dieser Typ hat eine angenehme Eigenschaft, if-Statements müssen nämlich diesem Typ entsprechen. deshalb kann man einfach if(BooleanVariable) schreiben, ist das Bit gesetzt, wird der Befehl danach ausgeführt, ist das Bit nicht gesetzt, wird der Befehl übersprungen.
if(bLock) bedeutet also: Falls bLock gesetzt ist, führe den nachfolgenden Befehl aus.
der nachfolgende Befehl lautet return; und ist der Befehl, die Rule frühzeitig zu verlassen. Falls also bLock gesetzt ist, wird die Ausführung der Rule abgebrochen und damit verhindert, dass die Rule sich endlos selbst aufruft.
Anschließend sorgt die eine Zeile dafür, dass alle (forEach) Gruppenmitglieder (members), auf die die Bedingung zutrifft (filter), dass der Status ungleich dem Status des triggernden Items (triggeringItem.state) ist, einen Befehl erhalten, der dem Status des triggernden Items entspricht. Status können gewöhnlich kein Befehl sein, aber wenn man einen String draus macht (toString) sollte es funktionieren.
Die Rule kannst Du zusammen mit anderen Rules in einer Datei speichern, wichtig ist aber, dass die globale Variable zu Beginn der Datei definiert wird, also vor der ersten Rule. Du kannst natürlich auch mehrere Dateien für die Rules verwenden, notwendig ist das aber nicht.
Die Rule hält alle Items der angegebenen Gruppe synchron. Falls Du noch mehr Tasten hast, die ebenfalls den Alarm scharf und unscharf schalten können sollen, ordnest Du sie einfach der Gruppe zu.
Falls Du weitere Gruppen auf die gleiche Art bilden willst, kann man da auch noch was machen, allerdings muss man die Rule dann etwas erweitern, leider gibt es keine direkte Möglichkeit, herauszufinden, zu welcher Gruppe ein triggerndes Item gehört.
Grob gesagt kann man aber die Gruppenzugehörigkeit ermitteln und anschließend alle Gruppenmitglieder dieser Gruppe auf den gleichen Status nachziehen. Wichtig ist natürlich, dass jedes Item nur zu genau einer Gruppe gehört, denn woher soll openHAB wissen, welche die richtige Gruppe ist...
Interessant wird das aber erst, wenn es um mehr als drei Gruppen geht, vorher ist es einfacher, die Rule zu kopieren und jeweils die verwendete Gruppe zu ändern. Jede Rule sollte dann sicherheitshalber auch eine eigene globale Variable bekommen.
In der Rule, die sich um den Alarm kümmert, kannst Du einfach einen der beteiligten Schalter abfragen, z.B. so wie Du es geschrieben hast.
Deine channel-Links sind unvollständig, da fehlt die Bridge

Boolean ist der Variablentyp, es handelt sich um ein einzelnes Bit, was entweder gesetzt (true) oder nicht gesetzt (false) sein kann.
Dieser Typ hat eine angenehme Eigenschaft, if-Statements müssen nämlich diesem Typ entsprechen. deshalb kann man einfach if(BooleanVariable) schreiben, ist das Bit gesetzt, wird der Befehl danach ausgeführt, ist das Bit nicht gesetzt, wird der Befehl übersprungen.
if(bLock) bedeutet also: Falls bLock gesetzt ist, führe den nachfolgenden Befehl aus.
der nachfolgende Befehl lautet return; und ist der Befehl, die Rule frühzeitig zu verlassen. Falls also bLock gesetzt ist, wird die Ausführung der Rule abgebrochen und damit verhindert, dass die Rule sich endlos selbst aufruft.
Anschließend sorgt die eine Zeile dafür, dass alle (forEach) Gruppenmitglieder (members), auf die die Bedingung zutrifft (filter), dass der Status ungleich dem Status des triggernden Items (triggeringItem.state) ist, einen Befehl erhalten, der dem Status des triggernden Items entspricht. Status können gewöhnlich kein Befehl sein, aber wenn man einen String draus macht (toString) sollte es funktionieren.
Die Rule kannst Du zusammen mit anderen Rules in einer Datei speichern, wichtig ist aber, dass die globale Variable zu Beginn der Datei definiert wird, also vor der ersten Rule. Du kannst natürlich auch mehrere Dateien für die Rules verwenden, notwendig ist das aber nicht.
Die Rule hält alle Items der angegebenen Gruppe synchron. Falls Du noch mehr Tasten hast, die ebenfalls den Alarm scharf und unscharf schalten können sollen, ordnest Du sie einfach der Gruppe zu.
Falls Du weitere Gruppen auf die gleiche Art bilden willst, kann man da auch noch was machen, allerdings muss man die Rule dann etwas erweitern, leider gibt es keine direkte Möglichkeit, herauszufinden, zu welcher Gruppe ein triggerndes Item gehört.
Grob gesagt kann man aber die Gruppenzugehörigkeit ermitteln und anschließend alle Gruppenmitglieder dieser Gruppe auf den gleichen Status nachziehen. Wichtig ist natürlich, dass jedes Item nur zu genau einer Gruppe gehört, denn woher soll openHAB wissen, welche die richtige Gruppe ist...
Interessant wird das aber erst, wenn es um mehr als drei Gruppen geht, vorher ist es einfacher, die Rule zu kopieren und jeweils die verwendete Gruppe zu ändern. Jede Rule sollte dann sicherheitshalber auch eine eigene globale Variable bekommen.
In der Rule, die sich um den Alarm kümmert, kannst Du einfach einen der beteiligten Schalter abfragen, z.B. so wie Du es geschrieben hast.
Deine channel-Links sind unvollständig, da fehlt die Bridge

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 383
- Registriert: 19. Feb 2020 20:51
- Wohnort: Saarbrücken
Re: Zwei MQTT Switches aktivieren einen Dummy Switch??
Vielen Dank für deine Erklärungen, ich versuche das gleich mal, ob das funktioniert.
Deine Version erscheint mir sehr flexibel einsetzbar.
Was meinst Du mit "Deine channel-Links sind unvollständig, da fehlt die Bridge", dass ich die Gruppenzuordnung noch nicht drin habe?
Und nochmal zurück zu deinem Beispiel, ist Group:Switch gAlarmSwitch notwendig oder geht auch einfach nur Group gAlarmSwitch?
Deine Version erscheint mir sehr flexibel einsetzbar.
Was meinst Du mit "Deine channel-Links sind unvollständig, da fehlt die Bridge", dass ich die Gruppenzuordnung noch nicht drin habe?
Und nochmal zurück zu deinem Beispiel, ist Group:Switch gAlarmSwitch notwendig oder geht auch einfach nur Group gAlarmSwitch?
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))
-
- Beiträge: 383
- Registriert: 19. Feb 2020 20:51
- Wohnort: Saarbrücken
Re: Zwei MQTT Switches aktivieren einen Dummy Switch??
Und hier noch was zur Vervollständigung des Themas und für evtl. Follower
Ich habe auch in der OHCommunity gefragt, da kam ein anderer Lösungsansatz hoch, welcher sich für mein Verständnis jedoch nicht ganz so flexibel darstellt. Dabei wird bei der Item Definition mit einem "Profile Befehl" ein anderer channel abgeglichen.
Ich habe das auch noch nicht komplett verstanden.
Man muß hier sicher noch die Gegenrichtung also Channel1 zu Channel2 und andersrum definieren.
Das bezieht sich dann immer nur auf genau diese Items, ist also nicht so flexibel wie das rule s.o.
Ich denke das hier also schon bei der Item Definition eine Funktiondafür sorgt gewünschte Switches abzugleichen
Try using a Profile (follow) for the items and see if that fits your needs.
Follow Profile Info:
If one device should “follow” the actions of another device, this can be used. The term “follow” in this case means that any state that is sent to an Item will be forwarded from this Item to any linked Channel with the follow Profile. It takes state updates on an Item and sends them as a command onto the Channel. In the direction from the ThingHandler towards the Item, this Profile ignores state updates.
Example:
und dann müsste hier sicher noch diese Zeile dazu, oder wie seht ihr das?
Ich habe auch in der OHCommunity gefragt, da kam ein anderer Lösungsansatz hoch, welcher sich für mein Verständnis jedoch nicht ganz so flexibel darstellt. Dabei wird bei der Item Definition mit einem "Profile Befehl" ein anderer channel abgeglichen.
Ich habe das auch noch nicht komplett verstanden.
Man muß hier sicher noch die Gegenrichtung also Channel1 zu Channel2 und andersrum definieren.
Das bezieht sich dann immer nur auf genau diese Items, ist also nicht so flexibel wie das rule s.o.
Ich denke das hier also schon bei der Item Definition eine Funktion
Code: Alles auswählen
[profile="follow"]
Try using a Profile (follow) for the items and see if that fits your needs.
Follow Profile Info:
If one device should “follow” the actions of another device, this can be used. The term “follow” in this case means that any state that is sent to an Item will be forwarded from this Item to any linked Channel with the follow Profile. It takes state updates on an Item and sends them as a command onto the Channel. In the direction from the ThingHandler towards the Item, this Profile ignores state updates.
Example:
Code: Alles auswählen
Switch Light1 { channel="Your_Item_Channel", channel="Your_Other_Item_Channel" [profile="follow"] }
Code: Alles auswählen
Switch Light2 { channel="Your_Other_Item_Channel", channel="Your_Item_Channel" [profile="follow"] }
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))
-
- Beiträge: 383
- Registriert: 19. Feb 2020 20:51
- Wohnort: Saarbrücken
Re: Zwei MQTT Switches aktivieren einen Dummy Switch??
Also ich habe hier gerade nochmal etwas gespielt mit diesem [profile="follow"]
Ergebnis: Das funktioniert aber mit ein paar kleinen Einschränkungen!
Ich habe den Button 2 des ersten Sonoff Touch nun mit dem Button 2 des zweiten Sonoff Touch synchron.
Nebeneffekt: Der Switch E_Touch90_2 existiert nun nicht mehr, er ist wie E_Touch10_2.
In der Sitemap ist dieser Switch E_Touch90_2 nicht mehr ansprechbar
Im Log erscheint lediglich Switch E_Touch10_2 auch wenn ich den anderen Switch E_Touch90_2 bediene
Also ich kann das für mein Anwendungsbeispiel verwenden, das mag aber nicht in jedem Fall gut sein.
Für mich kann ich nun 2 Schalter in unterschiedlichen Räumen einfach synchron halten und in der rule greife
ich E_Touch10_2 ab, und erreiche was ich will.
meine items für diese beiden sonoff touch 3 Buttons sehen folgendermassen aus
Comment:
Das rule wie oben gezeigt, kann selbiges wesentlich flexibler unter Verwendung von Gruppen erreichen.
Diese [profile="follow"] ist halt ein schneller Weg um 2 Schalter zu synchronisieren
Ergebnis: Das funktioniert aber mit ein paar kleinen Einschränkungen!
Ich habe den Button 2 des ersten Sonoff Touch nun mit dem Button 2 des zweiten Sonoff Touch synchron.
Nebeneffekt: Der Switch E_Touch90_2 existiert nun nicht mehr, er ist wie E_Touch10_2.
In der Sitemap ist dieser Switch E_Touch90_2 nicht mehr ansprechbar
Im Log erscheint lediglich Switch E_Touch10_2 auch wenn ich den anderen Switch E_Touch90_2 bediene
Also ich kann das für mein Anwendungsbeispiel verwenden, das mag aber nicht in jedem Fall gut sein.
Für mich kann ich nun 2 Schalter in unterschiedlichen Räumen einfach synchron halten und in der rule greife
ich E_Touch10_2 ab, und erreiche was ich will.
meine items für diese beiden sonoff touch 3 Buttons sehen folgendermassen aus
Code: Alles auswählen
Switch E_Touch10_1 {channel="mqtt:topic:4e525484:E_Touch10_1"}
Switch E_Touch10_2 {channel="mqtt:topic:4e525484:E_Touch10_2", channel="mqtt:topic:28fd4b46:S_Touch90_2" [profile="follow"]}
Switch E_Touch10_3 {channel="mqtt:topic:4e525484:E_Touch10_3"}
Switch S_Touch90_1 {channel="mqtt:topic:28fd4b46:S_Touch90_1"}
Switch S_Touch90_3 {channel="mqtt:topic:28fd4b46:S_Touch90_3"}
Das rule wie oben gezeigt, kann selbiges wesentlich flexibler unter Verwendung von Gruppen erreichen.
Diese [profile="follow"] ist halt ein schneller Weg um 2 Schalter zu synchronisieren
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))