Das sollte eigentlich ganz einfach sein.
Ich habe das zwar unter OH3 noch nicht ausprobiert, sollte aber ähnlich wie in OH2 (und auch schon OH1) funktionieren.
Punkt 1: Es gibt ein Window Icon mit drei definierten Zuständen, nämlich open, closed und ajar. Damit man dieses Icon verwenden kann, muss ein String Item verwendet werden, denn Contact hat nur OPEN oder CLOSED (oder NULL) als Zustand, ja, leider...
Was kommt nun von homematic? Falls String mit OPEN, CLOSED und AJAR, brauchst Du gar nichts weiter zu tun, als lediglich das entsprechende Icon auszuwählen.
Kommen von homematic aber zwei binäre Informationen (z.B. 0/1 für closed/open und 0/1 für closed/ajar), dann bedarf es einer Rule. Du legst Die Kontakte und die zugehörigen String Items dann in Gruppen an, am besten drei Gruppen für die drei "Sorten" Items. Alle Items, die zueinander gehören (also je drei für ein Fenster) müssen einen identischen Namensteil haben, damit die Zuordnung klar ist. Dieser identische Namensteil muss für alle Item an der gleihcen Stelle sein, also z.B. der erste Teil des Itemnamens. Weiterhin muss sich dieser Namensteil für alle Fenster unterscheiden, so dass der Namensteil eindeutig für jedes Fenster ist. Ein weiterer Namensteil sollte dann pro Gruppe gleich sein. Also zum Beispiel:
Fenster01_String, Fenster01_Open, Fenster01_Ajar. (Die weiteren Items heißen dann z.B. Fenster02_... oder auch Wohnzimmerfenster5_... oder KiziF_... oder wie auch immer, der Punkt ist der Unterstrich mit einem weiteren Namensteil und dass der 1. Teil des Namens eindeutig ist.
Die Items kommen nun jeweils in eine Gruppe, z.B. heißen die Gruppen gWinOpen, gWinAjar und gWinString. Für jedes Fenster liegt also in jeder der Gruppen exakt ein Item (entsprechend der Funktion der Gruppe).
Nun legst Du eine Rule an:
Code: Alles auswählen
Rule "Fensterzustand von Contact nach String"
when
Member of gWinOpen changed or
Member of gWinAjar changed
then
val strName = triggeringItem.name.split("_").get(0) // welches Fenster betrifft die Änderung
var strState = "CLOSED"
if(gWinOpen.members.filter[i|i.name.startsWith(strName)].head.state == OPEN)
strState = "OPEN"
else if(gWinAjar.members.filter[i|i.name.startsWith(strName)].head.state == OPEN)
strState = "AJAR"
if(gWinString.members.filter[i|i.name.startsWith(strName)].head.state.toString != strState)
gWinString.members.filter[i|i.name.startsWith(strName)].head.postUpdate(strState)
end
Diese Rule reicht für alle Fenster, egal wie viele das sind. Sollten Fenster nur einen Kontakt haben, kann man die Rule leicht abwandeln, so dass vor der Wertabfrage zunächst geprüft wird, ob der Kontakt überhaupt vorhanden ist.