ANzeige geöffneter Fenster im HM-Dis-EP-WM55

Begonnen von juelich, 07 Dezember 2016, 18:58:00

Vorheriges Thema - Nächstes Thema

juelich

Hallo, ich möchte mit obigem Display folgendes realisieren:
1. Wird ein Fenster geöffnet, sollen im Display alle geöffneten Fenster dargestellt werden
2. Sind alle Fenster geschlossen, wird dies durch ein Symbol bestätigt, es wird der Zustand der Alarmanlage dargestellt und die AUßentemperatur nach Wetterbericht

Es hat alles schon einmal gut funktioniert, seit einiger Zeit wurde allerdings das Display zeitweise im Minutentakt neu geschrieben, was oft zu einem Overload und wahrscheinlich auch bald zu leeren Batterien führt.
Deshalb habe ich alles umprogrammiert, was nur teilweise funktioniert.
Ich habe als Grundkonstrukt eine Struktur "Fenster", die alle Fenstersensoren enthält, als Atrrubute habe ich neu vergeben:
event-min-interval    state:1200,LastDevice:30
event-on-change-reading      state,LastDevice
event-on-update-reading     state

Hintergrund ist, dass bei gleichbleibendem Fensterstatus alle 20minein Event getriggert werden soll, wenn ein zweites Fenster geöffnet wird, soll bereits nach 30s en Event getriggert werden, damit auch das zweite Fenster angezeigt wird.
Das Notfiy lautet
define Fensterdisplay notify Fenster:* {
if (Value("Fenster") eq "open") {
my $offeneFenster1 = '\_';
my $offeneFenster2 = '\_';
my $offeneFenster3 = '\_';
if (Value("fenster.badu") eq "open") {$offeneFenster1 = 'BU'};
if (Value("fenster.kueche") eq "open") {$offeneFenster1 .= '\_Kue'};
if (Value("fenster.schlafzimmer") eq "open") {$offeneFenster1 .= '\_SZ'};
if (Value("fenster.wz") eq "open") {$offeneFenster1 .= '\_WZ'};
if (Value("fenster.wiga") eq "open") {$offeneFenster2 = 'WG'};
if (Value("fenster.wiga1") eq "open") {$offeneFenster2 .= '\_WT'};
if (Value("fenster.flur") eq "open") {$offeneFenster2 .= '\_FL'};
if (Value("fenster.bado") eq "open") {$offeneFenster3 = 'BO'};
if (Value("fenster.finley") eq "open") {$offeneFenster3 .= '\_FI'};
if (Value("fenster.enya") eq "open") {$offeneFenster3 .= '\_EN'};
if (Value("fenster.milena") eq "open") {$offeneFenster3 .= '\_MI'};
fhem ("set Display_Dis displayEP $offeneFenster1,open:$offeneFenster2,open:$offeneFenster3,open");}
else {
my $ALM = '';
my $TMP = ReadingsVal("Wetter","temp_c","");
   if (Value("Alarm") eq "on") {$ALM = 'ok'} else {$ALM = 'open'};
fhem ("set Display_Dis displayEP  Fenster\\_zu,ok:ALARM,$ALM:Temp.\\_$TMP,none") ;}}


Es klappt ja die Anzeige eines geöffneten Fensters, allerdings wird mir ein zweites geöffnetes Fenster leider nicht angezeigt. Woran liegt das?

juelich

Ich weiß zwar immer noch nicht, warum obige Variante nicht funktioniert. Habe das Problem aber (hoffentlich) selbst gelöst.
Ich habe die Displaysteuerung wieder wie ursprünglich in zwei NOTIFYS gepackt - eine wenn min. ein Fenster offen ist und eine, wenn alle Fenster zu sind. Ersteres stellte ja mein Problem dar.
Jetzt habe ich das NOTIFY nicht mehr auf die structure Fenster, sonder auf jeden einzelnen Fenstersensor fenster..* gesetzt, alle mit dem Attribut even-on-change versehen.
Das NOTIFY triggert jetzt bei jeder Zustandsänderung, da sich die Anzeige ja auch beim Schließen eines Fensters ändern soll. Mit "if" fange ich die Variante ab, bei der alle Fenster geschlossen sind - hier soll ja das zweite NOTIFY greifen.
fenster..* {
if (Value("Fenster") eq "open") {
my $offeneFenster1 = '\_';
my $offeneFenster2 = '\_';
my $offeneFenster3 = '\_';
if (Value("fenster.badu") eq "open") {$offeneFenster1 = 'BU'};
if (Value("fenster.kueche") eq "open") {$offeneFenster1 .= '\_Kue'};
if (Value("fenster.schlafzimmer") eq "open") {$offeneFenster1 .= '\_SZ'};
if (Value("fenster.wz") eq "open") {$offeneFenster1 .= '\_WZ'};
if (Value("fenster.wiga") eq "open") {$offeneFenster2 = 'WG'};
if (Value("fenster.wiga1") eq "open") {$offeneFenster2 .= '\_WT'};
if (Value("fenster.flur") eq "open") {$offeneFenster2 .= '\_FL'};
if (Value("fenster.bado") eq "open") {$offeneFenster3 = 'BO'};
if (Value("fenster.finley") eq "open") {$offeneFenster3 .= '\_FI'};
if (Value("fenster.enya") eq "open") {$offeneFenster3 .= '\_EN'};
if (Value("fenster.milena") eq "open") {$offeneFenster3 .= '\_MI'};
fhem ("set Display_Dis displayEP $offeneFenster1,open:$offeneFenster2,open:$offeneFenster3,open");
}}


Ich bin trotzdem für Tips dankbar, warum meine erste Variante nicht funktioniert hat.
Und noch eine Frage: Wenn ich bei meiner Structur ein Attribut setze, wird dieses Attribut an jedes einzelne Gerät weitergereicht. Kann man das irgendwie verhindern?
Ich habe bei der structure "Fenster" event-on-update-reading in Zusammenhang mit event-min-interval gesetzt, um bei geschlossenen Fenstern alle 20min ein Displayupdate mit der aktuellen Temperatur und dem Zustand der Alarmanlage zu haben. Diese Attribute will ich aber nicht bei den einzelnen Sensoren haben.
Liebe Grüße

Markus