Mit einem Switch schalte ich einen Kamerastream für 20 s ein:
<div data-type="switch" class="cell large inline" data-device="Garage_Nord_Video_ein_aus" data-fhem-cmd="set Garage_Nord_Video_ein_aus on;sleep 20;set Garage_Nord_Video_ein_aus off" data-icon="oa-it_camera" data-on-color="hsl(50,100%,50%)">
Das funktioniert einwandfrei: Der Schalter geht auf "on", der FHEM-Befehl wird abgesetzt, nach 20 s gehen der Schalter und das Reading wieder auf "off".
Nun möchte ich während der Laufzeit (sleep 20) die Möglichkeit schaffen, die Kamera vorzeitig wieder auszuschalten. In der obigen Konstellation geht das nicht. Der Schalter reagiert nicht.
Ebenfalls nicht geht
<div data-type="switch" class="cell large inline" data-device="Garage_Nord_Video_ein_aus" data-fhem-cmd="IF ([Garage_Nord_Video_ein_aus:state] eq "off") (set Garage_Nord_Video_ein_aus on;sleep 20;set Garage_Nord_Video_ein_aus off) ELSE (set Garage_Nord_Video_ein_aus off)" data-icon="oa-it_camera" data-on-color="hsl(50,100%,50%)">
Ich möchte diese Sache mit möglichst wenig FHEM-Instanzen (wird langsam unübersichtlich) regeln. Kennt jemand einen eleganten Weg?
<div data-type="switch"
data-device="Garage_Nord_Video_ein_aus"
data-get-on="on-for-timer 20"
data-get-off="off"></div>
Das funktioniert leider nicht.
"on-for-timer" setzt den State des angesprochenen Dummys (!) auf "on-for-timer 20". Nach Ablauf der 20s bleibt dieser Status erhalten; insbesondere wird nicht wieder auf "off" zurückgesetzt. Als Zeitschaltung für Dummies scheint on-for-timer nicht geeignet zu sein. Mein Weg über data-fhem-cmd war ja schon die halbe Lösung. Nur die IF-Abfrage funktionierte nicht.
Testweise habe ich den FHEM-Befehl direkt in der Konsole abgesetzt und hierbei festgestellt, dass die nacheinander auszuführenden Befehle bei IF durch Komma, nicht durch Semikolon getrennt werden müssen (siehe auch FHEM-Ref :-[). Als Zwischenergebnis ist also festzuhalten, dass der FHEM-Befehl
IF ([Garage_Nord_Video_ein_aus:state] eq "off") (set Garage_Nord_Video_ein_aus on,sleep 20,set Garage_Nord_Video_ein_aus off) ELSE (set Garage_Nord_Video_ein_aus off)
funktioniert. Es bleibt die Frage, warum er in der Form
<div data-type="switch" class="cell large inline" data-device="Garage_Nord_Video_ein_aus" data-fhem-cmd="IF ([Garage_Nord_Video_ein_aus:state] eq "off") (set Garage_Nord_Video_ein_aus on,sleep 20,set Garage_Nord_Video_ein_aus off) ELSE (set Garage_Nord_Video_ein_aus off)" data-icon="oa-it_camera" data-on-color="hsl(50,100%,50%)"></div>
aus FTUI nicht korrekt weitergegeben wird.
??? ???
Du hast alles richtig gemacht bis auf eine einzige Kleinigkeit:
<div data-type="switch" class="cell large inline"
data-device="Garage_Nord_Video_ein_aus"
data-fhem-cmd='IF ([Garage_Nord_Video_ein_aus:state] eq "off") (set Garage_Nord_Video_ein_aus on,sleep 20,set Garage_Nord_Video_ein_aus off) ELSE (set Garage_Nord_Video_ein_aus off)'
data-icon="oa-it_camera"
data-on-color="hsl(50,100%,50%)"></div>
Der fhem-cmd muss in einfache ' ' geschrieben werden...
Check ;)
Allerbesten Dank. Interessant ist nur, dass die in meinem ersten Posting genannte einfache Variante des data-fhem-cmd (mit " ") funktionierte.
An alle Mitleser: Der von SamNitro verbesserte Code ist die Musterlösung für alle, die einen Dummy für eine definierte Zeit schalten möchten, einschließlich der Option, ihn vorzeitig wieder zu beenden.
Aber aufpassen: Bei der Befehlsfolge
(1) Manuell EIN
(2) Manuell AUS (innerhalb der Laufzeit von (1)
(3) Manuell EIN (innerhalb der Laufzeit von (1)
wirkt die bei (1) definierte Laufzeit fort und schaltet das mit (3) gestartete Device "vorzeitig" wieder ab. Das ist erstens eine FHEM- (und nicht FTUI) -Angelegenheit und zweitens in meiner Anwendung unkritisch. Es könnte aber sein, dass bei anderen Umsetzungen (insbesondere bei langen Laufzeiten) unerwünschte bzw. irritierende Seiteneffekte entstehen. Die ultimative Lösung erfordert also ein "Killen" aller noch offenen FHEM-Sanduhren. Ob und ggf. wie das geht, kann hier offen bleiben.
Auf jeden Fall ist dies ein guter Tag; eine Baustelle ist geschlossen. 8) 8) 8)
Das Problem des Zurücksetzens des Timers ist jetzt auch gelöst, indem on-for-timer auch für dummies nutzbar gemacht wird. Die ultimative Lösung findet sich in
https://forum.fhem.de/index.php/topic,66578.msg578941.html#msg578941 (https://forum.fhem.de/index.php/topic,66578.msg578941.html#msg578941)
Habe die Lösung berücksichtigt, aber leider wird bei einem vorzeitigen Abbruch der CMD-Befehl weiter ausgeführt; komischerweise muss ich auch den Status selbst setzen...
Hat jemand eine Idee warum ein vorzeitiger Abbruch hier nicht zum Erfolg führt?
Danke vorab!!
<li data-row="3" data-col="5" data-sizex="1" data-sizey="1">
<Header>Rasengiessen</header>
<div class="top-space">
<div data-type="switch"
data-device="Bewaesserung_Rasen"
data-icon="oa-sani_irrigation"
data-get="state"
data-get-on="on"
data-get-off="off"
data-set-on="on"
data-set-off="off"
data-fhem-cmd='IF ([Bewaesserung_Rasen:state] eq "off") (set Bewaesserung_Rasen on, set Bewaesserung_Ventil1 on-for-timer 5,sleep 8,set Bewaesserung_Ventil2 on-for-timer 5,sleep 7, set Bewaesserung_Rasen off) ELSE (set Bewaesserung_Rasen off)'
data-on-color="green"
data-on-background-color="#2A2A2A"
data-off-color="#505050"
data-off-background-color="#2A2A2A"
class="large">
</div>
</div>
</li>
define Bewaesserung_Rasen dummy;
attr Bewaesserung_Rasen room Ventile;
attr Bewaesserung_Rasen icon sani_irrigation;
attr Bewaesserung_Rasen verbose 3;
define Log_Bewaesserung_Rasen FileLog ./log/Bewaesserung_Rasen-%Y-%m.log Bewaesserung_Rasen;
attr Log_Bewaesserung_Rasen logtype text;
attr Bewaesserung_Rasen setList on off;
attr Bewaesserung_Rasen useSetExtensions 1;
setstate Bewaesserung_Rasen off;