GROUP(OPEN, CLOSED,TITELD)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

GROUP(OPEN, CLOSED,TITELD)

Beitrag von Baumtasche »

Hallo zusammen,

ich bräuchte einen Tipp von euch. Ich habe mehrere Fensterkontakte die den Status OPEN, CLOSED oder TITELD annehmen können. Ich will diese Kontakte gerne in eine Gruppe aufnehmen, und die Gruppenitem soll den Status OPEN oder CLOSED annehmen können.

CLOSED --> alle Fenster zu
OPEN --> mindestens ein Fenster ist offen oder gekippet (titeld)

Kann mir da jemand helfen?

Über:

Code: Alles auswählen

Group:Contact:OR(OPEN,CLOSED) oder
Group:String:OR(OPEN,CLOSED)
funktioniert es leider nicht, da wird das gekippte Fenster nicht erkannt :-(

Vielen Dank im voraus
von udo1toni » 27. Apr 2021 00:18
Das wird in diesem Fall so nicht funktionieren.

Das Problem: Du brauchst ein String Item, um über OPEN und CLOSED hinaus noch TILTED abbilden zu können.
OR kann nur zwei Status abbilden, und diese Status dürfen keine Strings sein, lediglich Contact oder Switch Status sind zulässig.

Du kannst das also nicht auf direktem Weg erledigen. Du kannst aber mit einem Proxy Item und einer Rule arbeiten:

Code: Alles auswählen

rule "update proxy item"
when
    Member of gFensterStrings changed // gFensterStrings enthält alle Strings, die OPEN, CLOSED oder TILTED enthalten
then
    if(gFensterStrings.members.size > gFensterStrings.members.filter[i|i.state.toString == "CLOSED"].size)
        alleFensterZu.postUpdate(OPEN) // dies ist das Proxy Item
    else
        alleFensterZu.postUpdate(CLOSED)
end
Gehe zur vollständigen Antwort

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

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von udo1toni »

Das wird in diesem Fall so nicht funktionieren.

Das Problem: Du brauchst ein String Item, um über OPEN und CLOSED hinaus noch TILTED abbilden zu können.
OR kann nur zwei Status abbilden, und diese Status dürfen keine Strings sein, lediglich Contact oder Switch Status sind zulässig.

Du kannst das also nicht auf direktem Weg erledigen. Du kannst aber mit einem Proxy Item und einer Rule arbeiten:

Code: Alles auswählen

rule "update proxy item"
when
    Member of gFensterStrings changed // gFensterStrings enthält alle Strings, die OPEN, CLOSED oder TILTED enthalten
then
    if(gFensterStrings.members.size > gFensterStrings.members.filter[i|i.state.toString == "CLOSED"].size)
        alleFensterZu.postUpdate(OPEN) // dies ist das Proxy Item
    else
        alleFensterZu.postUpdate(CLOSED)
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von Baumtasche »

Danke !

Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von Baumtasche »

@Udo1Toni: ich habe deine Antwort jetzt so umgesetzt, und es klappt prima. Jetzt habe ich nur noch ein Problem, ich will auslesen, welcher Aktor (TITELD oder OPEN) ist. Normalerweise mache ich das folgendermaßen (war auch ein Tipp von dir :-))

Code: Alles auswählen


msg = gKontakteDG.members.filter[ i | i.toString.contains("OPEN")].map[ label ].reduce[ s, label | s + " und " + label ] 

jetzt soll die "Schleife" nicht nur nach "OPEN" suchen, sondern auch nach "TITELD", kannst du mir dazu bitte auch noch einen Tipp geben?

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

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von udo1toni »

Ich würde es in diesem Fall andersrum formulieren (allerdings bekommst Du dann halt alles zu sehen außer die gescjlossenen, also auch solche Items, die auf NULL oder UNDEV stehen:

Code: Alles auswählen

msg = gKontakteDG.members.filter[ i | !(i.toString.contains("CLOSED"))].map[ label ].reduce[ s, label | s + " und " + label ] 
Natürlich kannst Du auch mehrere Bedingungen verwenden:

Code: Alles auswählen

msg = gKontakteDG.members.filter[ i | i.toString.contains("OPEN") || i.toString.contains("TILTED")].map[ label ].reduce[ s, label | s + " und " + label ] 
Eventuell möchtest Du noch eine Information, welche Fenster gekippt und welche geöffnet sind:

Code: Alles auswählen

msg1 = gKontakteDG.members.filter[ i | i.toString.contains("OPEN") ].map[ label ].reduce[ s, label | s + " und " + label ] 
msg2 = gKontakteDG.members.filter[ i | i.toString.contains("TILTED") ].map[ label ].reduce[ s, label | s + " und " + label ] 
msg = msg1 + " sind geöffnet, " + msg2 + " sind gekippt."
Natürlich sollte man da noch ein paar Bedingungen einflechten, damit die entsprechenden Teilmeldungen nur dann verwendet werden, wenn mindestens eines der Fenster betroffen ist, aber das ist dann ja mehr eine Fingerübung...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von Baumtasche »

Klasse , vielen lieben Dank

BGrosse
Beiträge: 11
Registriert: 11. Feb 2021 10:44
Answers: 1

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von BGrosse »

Hallo @udo1toni!

Tolles Beispiel und tolle Lösungserklärung! Danke dafür!

Wenn ich mal grade das Beispiel

Code: Alles auswählen

msg = gKontakteDG.members.filter[ i | i.toString.contains("OPEN") ].map[ label ].reduce[ s, label | s + " und " + label ]
nehme (eine reduzierte Liste aller Elemente, die auf "OPEN" stehen), dann bekomme ich natürlich, was ich will. Allerdings sind die Labels jetzt irgendwie "ungeordnet". Ich hätte an dieser Stelle gerne generell eine alphabetisch geordnete Ausgabe der Elemente aus der Liste.

Jetzt dachte ich mir in meinem jugendlichen Leichtsinn "OK, anscheinend kann man ja bei .map die Kommandos kaskadieren (also wie im Beispiel nicht nur nach label mit "OPEN" filtern und dann noch die Liste reduzieren.". Also hab ich mal versucht, an das .reduce noch ein .sortBy[ label ] zu anzuhängen - das geht aber leider nicht.

Hast Du hier noch eine Idee, wie ich die .map Ausgabe alphabetisch sortiert bekomme? :?:
OpenHAB 4.1.2 auf Raspberry Pi 4 mit Bullseye 32 Bit (Production System)
OpenHAB 4.2.1 auf Raspberry Pi 5 mit Bookworm 64 Bit (Test System)

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

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von udo1toni »

Du musst das sortBy einfach vor dem map ausführen:

Code: Alles auswählen

msg = gKontakteDG.members.filter[ i | i.toString.contains("OPEN") ].sortBy[ label ].map[ label ].reduce[ s, label | s + " und " + label ]
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

BGrosse
Beiträge: 11
Registriert: 11. Feb 2021 10:44
Answers: 1

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von BGrosse »

Das is ja der Hit! Es funktioniert! :o

DANKE Udo!

Hast Du auch noch einen Tip zufällig, wie ich in meine mit "und" getrennte Liste der Elemente einen Zeilenumbruch hinein bekomme? Ich habs schon mit \n und auch \r\n probiert, aber irgendwie kam da einfach nichts bei raus. Es wurde einfach ignoriert. Hast Du sowas schonmal gemacht :?:
OpenHAB 4.1.2 auf Raspberry Pi 4 mit Bullseye 32 Bit (Production System)
OpenHAB 4.2.1 auf Raspberry Pi 5 mit Bookworm 64 Bit (Test System)

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

Re: GROUP(OPEN, CLOSED,TITELD)

Beitrag von udo1toni »

Ich denke, es kommt da vor allem darauf an, wie Du die Message weiter verwendest.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten