Seite 1 von 2

GROUP(OPEN, CLOSED,TITELD)

Verfasst: 26. Apr 2021 21:27
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

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 27. Apr 2021 00:18
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

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 28. Apr 2021 07:54
von Baumtasche
Danke !

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 29. Apr 2021 21:48
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?

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 30. Apr 2021 12:39
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...

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 1. Mai 2021 00:11
von Baumtasche
Klasse , vielen lieben Dank

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 26. Feb 2022 18:44
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? :?:

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 26. Feb 2022 19:20
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 ]

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 26. Feb 2022 20:04
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 :?:

Re: GROUP(OPEN, CLOSED,TITELD)

Verfasst: 26. Feb 2022 20:43
von udo1toni
Ich denke, es kommt da vor allem darauf an, wie Du die Message weiter verwendest.