Hauptmenü

[gelöst] Probleme mit set_Exec

Begonnen von roemi, 16 April 2021, 19:38:25

Vorheriges Thema - Nächstes Thema

roemi

Hallo,

ich bastel an einer Treppenlichtsteuerung die soweit auch funktioniert:

{
if ([?23:59-08:00] and [mySensor11] eq "motion")
{fhem_set("HUEDevice18 pct 50") if ([?HUEDevice18] ne "on");
    set_Exec("off1",180,'fhem_set("HUEDevice18 pct 0")');}
elsif ([?08:01-23:58] and [Anwesenheit] eq "present")
{
if ([myLightLevelSensor23:lux:d] > 11000)
{fhem_set("HUEDevice18 pct 0")}
elsif ([myLightLevelSensor23:lux:d] > 10000)
{fhem_set("HUEDevice18 pct 12")}
elsif ([myLightLevelSensor23:lux:d] > 9000)
{fhem_set("HUEDevice18 pct 25")}
elsif ([myLightLevelSensor23:lux:d] > 8000)
{fhem_set("HUEDevice18 pct 37")}
else
{fhem_set("HUEDevice18 pct 50")}
}
else
{
set_Exec("off2",60,'fhem_set("HUEDevice18 pct 0")',0);
}
}


In der letzten Zeile (ohne die {}) findet sich die Anweisung
Zitatset_Exec("off2",60,'fhem_set("HUEDevice18 pct 0")',0);
In der Endversion soll Nachts die Lampe für 3 min brennen (s.o.) und tagsüber soll das Treppenhaus erst nach 10 min (=600 und nicht 60 wie hier zum testen) Abwesenheit ausschalten.
Aber genau diese Verzögerung funktioniert nicht. egal ob ich den letzten Parameter mitgebe oder nicht.
Mache ich an der Stelle nur das Licht ohne Verzögerung aus, funktioniert es.

Ich stehe vor einem Rätsel  :-[ und bin für jeden Tipp dankbar.

Danke
Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

Damian

Zitat von: roemi am 16 April 2021, 19:38:25
Hallo,

ich bastel an einer Treppenlichtsteuerung die soweit auch funktioniert:

{
if ([?23:59-08:00] and [mySensor11] eq "motion")
{fhem_set("HUEDevice18 pct 50") if ([?HUEDevice18] ne "on");
    set_Exec("off1",180,'fhem_set("HUEDevice18 pct 0")');}
elsif ([?08:01-23:58] and [Anwesenheit] eq "present")
{
if ([myLightLevelSensor23:lux:d] > 11000)
{fhem_set("HUEDevice18 pct 0")}
elsif ([myLightLevelSensor23:lux:d] > 10000)
{fhem_set("HUEDevice18 pct 12")}
elsif ([myLightLevelSensor23:lux:d] > 9000)
{fhem_set("HUEDevice18 pct 25")}
elsif ([myLightLevelSensor23:lux:d] > 8000)
{fhem_set("HUEDevice18 pct 37")}
else
{fhem_set("HUEDevice18 pct 50")}
}
else
{
set_Exec("off2",60,'fhem_set("HUEDevice18 pct 0")',0);
}
}


In der letzten Zeile (ohne die {}) findet sich die AnweisungIn der Endversion soll Nachts die Lampe für 3 min brennen (s.o.) und tagsüber soll das Treppenhaus erst nach 10 min (=600 und nicht 60 wie hier zum testen) Abwesenheit ausschalten.
Aber genau diese Verzögerung funktioniert nicht. egal ob ich den letzten Parameter mitgebe oder nicht.
Mache ich an der Stelle nur das Licht ohne Verzögerung aus, funktioniert es.

Ich stehe vor einem Rätsel  :-[ und bin für jeden Tipp dankbar.

Danke
Römi

set_Exec ohne den letzten Parameter wird funktionieren.

Ich vermute, dass z.B. [myLightLevelSensor23:lux:d] öfters triggert und dein letzter else-Fall immer wieder zum Zuge kommt, mit der Konsequenz, dass dein Timer immer wieder neu gesetzt wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

roemi

Hallo Damian,

das hört sich erst mal plausibel an. Jetzt müsste ich es nur noch verstehen  ;D
Ich war mir sicher, das diese Bedingung
elsif ([?08:01-23:58] and [Anwesenheit] eq "present")
ausreichend ist.
Wir bereits beschrieben, schaltet das Licht aus wenn ich die Verzögerung deaktiviere.

Aber ja, wenn die Trigger einen Timer immer wieder zurücksetzen ... dann wird das nicht funktionieren.
Nur wie bekommt man das in den Griff?

Danke
Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

Damian

Im Perlmodus musst du nicht alles in einen Block packen wie im FHEM-Modus. Vielleicht teilst du es dir in mehrere unabhängige Blöcke auf.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

roemi

Hallo und DANKE.

Natürlich ist das aufteilen in Blöcke eine echte Alternative.  8)
Zumindest die Nachtschaltung (die auch nicht funktionierte) macht nun was sie soll.
Ob die Tagschaltung genauso spurt sehe ich am Wochenende.
Ich melde mich.

Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

roemi

Hallo Damian,

kurze Info: Deinem Tipp folgend habe ich mehrere Blöcke erzeugt und arbeite nun auch mit Variable.
Letzteres brachte den Erfolg.
Als nächstes probiere ich die Blockanzahl wieder zu minimieren.

Danke Dir Für Deine Hilfe

Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

roemi

Hallo,

zu früh gefreut und zu früh als "gelöst" gekennzeichnet.
Zitatif ([?v_keller_aus] ne "ja" and [?v_kellertreppe] eq "aus" and [HUEDevice18] ne "off")
{fhem_set("v_keller_aus ja");}
set_Exec("off",600,'fhem_set("HUEDevice18 pct 0"),fhem_set("v_keller_aus nein")');}

Die Variable "v_keller_aus" hat am Anfang den Wert "nein".
Die Varaible "v_kellertreppe" = "aus".
Das Licht ist an.
Es sind also alle Bedingungen erfüllt um auszuführen.

Als erstes wird die Variable "v_keller_aus" auf "ja" gesetzt und dann der Timer auf 10 Minuten. Das funktioniert!!

Da die Bedingungen nun nicht mehr erfüllt sind, dürfte es auch nicht zur erneuten Ausführung kommen.
Trotzdem wird der Timer immer wieder neu gestartet  :-\ (also werden die Bedingungen ignoriert (weil vermutlich ein dummer Fehler vorhanden))

Danke

Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

Damian

Zitat von: roemi am 18 April 2021, 15:59:42
Hallo,

zu früh gefreut und zu früh als "gelöst" gekennzeichnet.
Die Variable "v_keller_aus" hat am Anfang den Wert "nein".
Die Varaible "v_kellertreppe" = "aus".
Das Licht ist an.
Es sind also alle Bedingungen erfüllt um auszuführen.

Als erstes wird die Variable "v_keller_aus" auf "ja" gesetzt und dann der Timer auf 10 Minuten. Das funktioniert!!

Da die Bedingungen nun nicht mehr erfüllt sind, dürfte es auch nicht zur erneuten Ausführung kommen.
Trotzdem wird der Timer immer wieder neu gestartet  :-\ (also werden die Bedingungen ignoriert (weil vermutlich ein dummer Fehler vorhanden))

Danke

Römi

Dein Timer ist doch außerhalb deiner IF-Anweisung, siehe geschweifte Klammern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

roemi

 :o
Sch... kopieren ...  8) Scheint nun zu klappen.

Danke
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

roemi

Hier alle vier, bisher funktionierende, Blöcke.
Vermutlich findet der ein oder andere noch die ein oder andere "Schwachstelle".
Dafür bin ich dankbar.
Zitat{
if ([?00:00-08:00] and [handy_michael] eq "present")
{ fhem("set v_kellertreppe nacht ; set HUEDevice18 pct 0");}
elsif ([?08:00-23:59] and [handy_michael] eq "present")
{ fhem("set v_kellertreppe tag");}
else
{ fhem("set v_kellertreppe aus") }
}
==================
{
if ([?v_keller_aus] ne "ja" and [?v_kellertreppe] eq "aus" and [HUEDevice18] ne "off")
{fhem_set("v_keller_aus ja");
set_Exec("off2",600,'fhem_set("HUEDevice18 pct 0"),fhem_set("v_keller_aus nein")');}
}
==================
{
if ([?v_keller_sleep] ne "ja" and [?v_kellertreppe] eq "nacht" and [mySensor26] eq "motion")
{fhem_set("HUEDevice18 pct 25") if ([?HUEDevice18] ne "on");
{fhem_set("v_keller_sleep ja");}
set_Exec("off",180,'fhem_set("HUEDevice18 pct 0"),fhem_set("v_keller_sleep nein")');}
}
==================
{
if ([v_kellertreppe] eq "tag")
{
if ([myLightLevelSensor23:lux:d] > 12000)
{fhem_set("HUEDevice18 pct 0")}
elsif ([myLightLevelSensor23:lux:d] > 10500)
{fhem_set("HUEDevice18 pct 12")}
elsif ([myLightLevelSensor23:lux:d] > 9000)
{fhem_set("HUEDevice18 pct 25")}
elsif ([myLightLevelSensor23:lux:d] > 8000)
{fhem_set("HUEDevice18 pct 37")}
else
{fhem_set("HUEDevice18 pct 50")}
}
}

Ich weis z.B. noch nicht wie ich es verarbeiten soll, wenn jemand innerhalb der 10 min "nicht anwesend" zurückkommt.
Die Variable "v_keller_aus" muss dann wieder auf "nein" gesetzt werden. Aber wann?

Danke

Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

Damian

#10
Programmcode kannst du besser mit # (Code einfügen) und nicht über Zitat formatieren.

Hast du dir schon überlegt, was du gegen wiederholtes Schalten machst?

Bei jedem Event von  ([myLightLevelSensor23:lux:d] wird bei dir nämlich geschaltet, meistens umsonst ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

roemi

Hallo,

eigentlich wollte ich # verwenden  8)
Ok. Das Licht in Abhängigkeit zum  Lichtsensor zu dimmen fand ich ... eigentlich gut, aber ob es den gedachten Effekt hat weis ich noch gar nicht.
Du hast schon Recht, es wird viel geschaltet ... wirkt sich das negativ auf irgendwas aus?

Danke für jeden Dankanstoß

Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

Damian

Zitat von: roemi am 18 April 2021, 23:22:55
Hallo,

eigentlich wollte ich # verwenden  8)
Ok. Das Licht in Abhängigkeit zum  Lichtsensor zu dimmen fand ich ... eigentlich gut, aber ob es den gedachten Effekt hat weis ich noch gar nicht.
Du hast schon Recht, es wird viel geschaltet ... wirkt sich das negativ auf irgendwas aus?

Danke für jeden Dankanstoß

Römi

Klar, wenn du alle deine Probleme so löst,  wie hier den gleichen Befehl mehrfach senden, dann wirst irgendwann Probleme mit der Funkübertragung bekommen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

roemi

Guten Morgen!

Die Schalthäufigkeit läßt sich nur reduzieren wenn ich auf das anpassen verzichte und nur bei "größer als 12000 Lux Licht aus" nutze.

{
if ([?00:00-08:00] and [handy_michael] eq "present")
{ fhem("set v_kellertreppe nacht ; set HUEDevice18 pct 0");}
elsif ([?08:00-23:59] and [handy_michael] eq "present")
{ fhem("set v_kellertreppe tag");}
else
{ fhem("set v_kellertreppe aus") }
}
==================
{
if ([?v_keller_aus] ne "ja" and [?v_kellertreppe] eq "aus" and [HUEDevice18] ne "off")
{fhem_set("v_keller_aus ja");
set_Exec("off2",600,'fhem_set("HUEDevice18 pct 0"),fhem_set("v_keller_aus nein")');}
}
==================
{
if ([?v_keller_sleep] ne "ja" and [?v_kellertreppe] eq "nacht" and [mySensor26] eq "motion")
{fhem_set("HUEDevice18 pct 25") if ([?HUEDevice18] ne "on");
{fhem_set("v_keller_sleep ja");}
set_Exec("off",180,'fhem_set("HUEDevice18 pct 0"),fhem_set("v_keller_sleep nein")');}
}
==================
{
if ([v_kellertreppe] eq "tag")
{
if ([myLightLevelSensor23:lux:d] > 12000)
  {fhem_set("HUEDevice18 pct 0")}
else
  {fhem_set("HUEDevice18 pct 50")}
}
}


Bleibt noch die Frage wie ich den Timer stoppe der nach 10 min Abwesenheit das Licht ausschaltet und einer innerhalb die Zeit das Haus wieder betritt.
Das wird sicher nicht häufig vorkommen und wenn, dann geht das Licht kurz aus. Durch die Anwesendheit wird es aber unmittelbar wieder eingeschaltet. Wenn jemand eine Idee hat ... 

Danke

Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

Damian

Zitat von: roemi am 19 April 2021, 09:16:08
Guten Morgen!

Die Schalthäufigkeit läßt sich nur reduzieren wenn ich auf das anpassen verzichte und nur bei "größer als 12000 Lux Licht aus" nutze.

{
if ([?00:00-08:00] and [handy_michael] eq "present")
{ fhem("set v_kellertreppe nacht ; set HUEDevice18 pct 0");}
elsif ([?08:00-23:59] and [handy_michael] eq "present")
{ fhem("set v_kellertreppe tag");}
else
{ fhem("set v_kellertreppe aus") }
}
==================
{
if ([?v_keller_aus] ne "ja" and [?v_kellertreppe] eq "aus" and [HUEDevice18] ne "off")
{fhem_set("v_keller_aus ja");
set_Exec("off2",600,'fhem_set("HUEDevice18 pct 0"),fhem_set("v_keller_aus nein")');}
}
==================
{
if ([?v_keller_sleep] ne "ja" and [?v_kellertreppe] eq "nacht" and [mySensor26] eq "motion")
{fhem_set("HUEDevice18 pct 25") if ([?HUEDevice18] ne "on");
{fhem_set("v_keller_sleep ja");}
set_Exec("off",180,'fhem_set("HUEDevice18 pct 0"),fhem_set("v_keller_sleep nein")');}
}
==================
{
if ([v_kellertreppe] eq "tag")
{
if ([myLightLevelSensor23:lux:d] > 12000)
  {fhem_set("HUEDevice18 pct 0")}
else
  {fhem_set("HUEDevice18 pct 50")}
}
}


Bleibt noch die Frage wie ich den Timer stoppe der nach 10 min Abwesenheit das Licht ausschaltet und einer innerhalb die Zeit das Haus wieder betritt.
Das wird sicher nicht häufig vorkommen und wenn, dann geht das Licht kurz aus. Durch die Anwesendheit wird es aber unmittelbar wieder eingeschaltet. Wenn jemand eine Idee hat ... 

Danke

Römi

Die allgemeine Regel gegen ein wiederholtes Schalten des gleichen Befehls lautet: Merke den letzten Ausführungszustand und führe den Befehl nur aus, wenn sich der Zustand ändert. Das kann man in DOIF-Perl mit Instanzvariablen (Devicevariablen) beginnend mit $_ machen.

Genau das macht aber DOIF im FHEM-Modus - es arbeitet mit Zuständen und wiederholt sie standardmäßig nicht.

Einen laufenden Timer kann man mit del_Exec vor seiner Ausführung löschen, siehe https://fhem.de/commandref_DE.html#DOIF_del_Exec
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

roemi

Hallo,

ZitatEinen laufenden Timer kann man mit del_Exec vor seiner Ausführung löschen
Auch das habe ich nun umgesetzt!!  :D

ZitatDie allgemeine Regel gegen ein wiederholtes Schalten des gleichen Befehls lautet: Merke den letzten Ausführungszustand und führe den Befehl nur aus, wenn sich der Zustand ändert. Das kann man in DOIF-Perl mit Instanzvariablen (Devicevariablen) beginnend mit $_ machen.
Genau das macht aber DOIF im FHEM-Modus - es arbeitet mit Zuständen und wiederholt sie standardmäßig nicht.
Das muss ich mir in Ruhe antun ...

Danke (vorerst) ... ich komme wieder, keine Frage  ;)

Römi

https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren

roemi

Hallo Damian,

ZitatMerke den letzten Ausführungszustand und führe den Befehl nur aus, wenn sich der Zustand ändert.
es hat eine weile gedauert, aber nun glaube ich es verstanden zu haben.

Jedesmal wenn ein Block durchlaufen und die Lux abgefragt wird, schreibt er den gedimmten Wert ins Device und sendet sofort einen Befehl an die Lampe! Ich dachte, ich schreibe den Wert ins Device und der sendet nur wenn sich was geändert hat. Zu kurz gesprungen!
Richtig ist, den Wert immer nur dann ins Device zu schreiben wenn er sich geändert hat. dazu nutze ich entweder eine Variable oder ich frage den aktuellen Wert des Device ab, vergleiche und schreibe nur bei Veränderung. Richtig verstanden?

Römi
https://www.roemi.de ... von einem, der auszog, 5000 deutsche Biere zu probieren