Hauptmenü

Zusammenbauen von Werten

Begonnen von iamandy, 27 August 2016, 16:49:18

Vorheriges Thema - Nächstes Thema

iamandy

Hallo Leser  :)

Mein Ziel ist es auf das Display meines HM-Dis-EP-WM55 alle offenen Fenster in einer Zeile anzuzeigen. Das Display kann max 11 Zeichen, das heißt es muss abgekürzt werden, das ist aber OK. Mein Wunsch ist das z.B. "WZ AZ WC" oder z.B. "SZ MZ BD" da steht. Ich habe 6 Räume, es gibt also ziemlich viele Kombinationsmöglichkeiten...

Schreiben tut man das mit "set HM_123456_Dis displayEP WZ\_AZ\_WC" (\_ steht für ein Leerzeichen)

Was ich nicht weiß ist wie man das zusammen setzt, denn dazu müsste ich ein paar "IF WZ open then echo WZ\_" in das set Kommando rein bringen und ich weiß nicht wie ich das im DOIF hinbekomme. Ich würde gerne auf {fhem} Kommandos verzichten, würde es aber als Notlösung nehmen.

Hat jemand eine Idee?

Ellert

Du könntest auf alle Tür- und Fensterkontakte (TFK) triggern und dann mit IF alle prüfen, ob sie offen sind, die "auf"-Bezeichenr sammeln und am Ende ins Display schreiben, vielleicht so:

(["TFK."]) (
  IF ([TFK1] eq "auf") (setreading <DOIFname> displaycollector <Bezeichner1>\_),
  IF ([TFK2] eq "auf") (setreading <DOIFname> displaycollector {(ReadingsVal("<DOIFname>","displaycollector","")."<Bezeichner2>\_")}),
   .
   .
   .
  IF ([TFK6] eq "auf") (setreading <DOIFname> displaycollector {(ReadingsVal("<DOIFname>","displaycollector","")."<Bezeichner6>\_")}) ELSE (setreading <DOIFname> displaycollector \_),
   set HM_123456_Dis displayEP [<DOIFname>:displaycollector])


Und das Attribut do auf always setzen.

Ungetestet.

iamandy

Hallo Ellert,

Das ist natürlich elegant und funktioniert (fast  ;D ).

Toll! Vielen Dank!!

Bei den {} IFs müssen wohl doppelte (( drumm rum, dann geht es aber wunderbar, sonst meckert er mit "no right bracket"!
  IF ([Fenster.WC]            =~ "opened") ((setreading Test3_Doif displaycollector {(ReadingsVal("Test3_Doif","displaycollector","")."WC\_")})),


Das ELSE am Ende hatte ich erst nicht verstanden. Aber ich denke Du hast es rein gemacht, weil der Zustand kommen kann das alle Fenster geschlossen sind und sonst der "alte" Wert nicht überschrieben wird. Das Problem, es ist glaube ich noch nicht ganz richtig gelöst, denn das ELSE bezieht sich NUR auf das letzte IF und damit überschriebt es immer alles, sei denn das letzte IF ist wahr. Die einzige Lösung die mir einfällt ist als erstes das Reading displaycollector zu "leeren", finde ich aber nicht so elegant... Andere Idee?

iamandy

Ich glaube fast das ich das Reading am Anfang leeren muss, sonst wird die Kette der offenen Fenster nämlich bei jedem Durchlauf länger... Blöd nur das man es nicht mit nichts setzen kann, oder geht das irgendwie?

Ellert

ZitatDie einzige Lösung die mir einfällt ist als erstes das Reading displaycollector zu "leeren"

Ich würde ein \_ reinschreiben, ein leeres Reading könnte unerwünschte Nebenwirkungen haben.