Hallo FHEM-Gemeinde,
ich würde gerne einen variablen Wert aus einem Dummy einlesen, und als sleep wert in einem notify verwenden.
Und zwar so:
Bewaesserung:start.* set Bewaesserungsventil on; sleep [Bewaesserung_zeit]; set Bewaesserungsventil off
So geht es aber nicht, und mir fällt nicht so recht ein Grund ein wieso.
Hat jemand eine Idee, was man besser machen kann/muss?
Viele Grüße
Martin
Hi,
steht doch aber eindeutig in der Doku wie es gehen kann: https://commandref.fhem.de/#sleep
Zitatas a timespec (HH:MM or HH:MM:SS or {perlfunc})
probiere so etwas in der Kommandozeile:
sleep {"00:00:03"};set Lampe on
Du brauchst auch keinen extra dummy, es geht irgendwo ein Reading.
sleep {ReadingsVal('Device','Readingname','00:00:03'};set Bewaesserungsventil off
Gruß Otto
Bitte in den Anfängerbereich verschieben (kannst du als TE selbst!), "Codeschnipsel" ist für fertigen Code, siehe hier angepinnten Thread!
In diesem Board bitte keine Themen mit Fragen starten, sondern ausschließlich funktionsfähige Codeschnipsel posten.
Bitte nimm Dir die Zeit, das richtige Board für Dein Thema bzw. Deine Frage auszuwählen!
Dazu bitte in der Liste http://fhem.de/MAINTAINER.txt nachschauen, welches Modul in welchem Unterforum/Board betreut wird.
Im Zweifelsfall bitte "Anfängerfragen" nutzen.
Danke!
Hallo Otto,
danke für die schnelle Antwort. Ich wollte es gerne so leserlich wie möglich haben. Sonst geht ja auch z.b.
sleep 3;
für 3 s. Da mir ganze Zahlen in Sekunden genügen, habe ich mir einen Schieberegler als Dummy gebaut, über den ich dann die Zeit setzten wollte.
Irgendwie will es nicht...wenn ich in der Konsole das eingebe
sleep { ReadingsVal('Bewaesserung_zeit', 'state', '00:00:30'}; set Bewaesserungsventil off
kommt als Rückgabewert "Last parameter must be quiet" und im Log erscheint nichts, und der Befehl nach dem sleep wird nicht ausgeführt.
:( :(
Hmm, das Problem sind hier evtl. die Leerzeichen: FHEM muss das irgendwie "parsen", also ermitteln, welche Parameter gesetzt sind, und da sind halt Leerzeichen der Standard...
Versuch's mal so:
sleep {ReadingsVal('Bewaesserung_zeit','state','00:00:30')}; set Bewaesserungsventil off
(Wobei ich nicht sicher bin, ob da nicht eine Sekundenangabe rauskommen muss und daher mAn. der "nicht-Vorhanden-Wert" eher einfach '30' sein sollte).
Zitat von: Beta-User am 28 Januar 2021, 15:29:01
Hmm, das Problem sind hier evtl. die Leerzeichen: FHEM muss das irgendwie "parsen", also ermitteln, welche Parameter gesetzt sind, und da sind halt Leerzeichen der Standard...
Versuch's mal so:
sleep {ReadingsVal('Bewaesserung_zeit','state','00:00:30')}; set Bewaesserungsventil off
(Wobei ich nicht sicher bin, ob da nicht eine Sekundenangabe rauskommen muss und daher mAn. der "nicht-Vorhanden-Wert" eher einfach '30' sein sollte).
Ja, es müssen Sekunden angegeben werden.
Evtl. mal so probieren:
{fhem "sleep ".ReadingsNum("Bewaesserung_zeit","state",30)."; set Bewaesserungsventil off"}
Gruß
Dan
Man kann sich gern was wünschen und ausdenken und man kann es nach Doku machen - ich hatte ja schon zitiert. ;)
Die Variante von Dan geht natürlich auch. ;D Wenn der Wert aus einem Slider kommen soll, ist die Variante sicher die einfachste.
In meinem Vorschlag ({Perlfunc}) MUSS Timespec zurückkommen - so steht es in der Doku und funktioniert auch!
Also drei gleiche Varianten:
sleep 30
sleep 00:00:30
sleep {"00:00:30"}
Das geht nicht
sleep {"30"}
Aber einfach und übersichtlich ist eben auch immer Geschmacksache :)
Mein Gedanke so es so vor:
define dummy Bewaesserung_zeit
set Bewaesserung_zeit 00:00:30
Sowas wird immer nicht gehen -> ReadingsVal( - was immer da für ein komischer Krümel dazwischen ist. :o
Hallo zusammen, und danke für die vielen Vorschläge.
Die Rückgabewerte der vorgeschlagenen Varianten sind zwar ok, aber das Problem ist immer, dass bei sleep das Kommando nach sleep bereits vor dem sleep ausgeführt wird. "sleep" scheint also nur mit festen Werten zu funktionieren.
Mein nächster Ansatz war nun, es mit "at" zu probieren. Dafür habe ich in meinen Schieberegler-Dummy testweise ein "time" reading im Format 00:00:10 erstellt. (Testweise auch mit "+")
define a_Bewaesserung at { ReadingsVal("Bewaesserung_zeit", "time", "00:00:00") } set Bewaesserungsventil off
das gibt in der Konsole aber den Fehler
Wrong timespec {: either HH:MM:SS or {perlcode}
Übrigens steht diese Beispiel auch im Wiki https://wiki.fhem.de/wiki/At (https://wiki.fhem.de/wiki/At)
Ich verstehe nicht wirklich, wo der Fehler liegen soll. Das Format stimmt eigentlich. >:(
ZitatÜbrigens steht diese Beispiel auch im Wiki
NIcht ganz, da sind keine Leerzeichen zwischen den Parametern in ReadingsVal vorhanden.
Gruß
Thomas
Zitat von: M.K. am 30 Januar 2021, 14:45:52
aber das Problem ist immer, dass bei sleep das Kommando nach sleep bereits vor dem sleep ausgeführt wird. "sleep" scheint also nur mit festen Werten zu funktionieren.
Nur wenn Du die Abfolge falsch zusammen baust. Zeig doch mal deinen kompletten Versuchs-Text
Kompletter funktionierender Test:
define b_zeit dummy
attr b_zeit room b_test
setreading b_zeit time 00:00:05
define b_at at {ReadingsVal('b_zeit','time','')} {}
attr b_at room b_test
Hier mal noch ein paar Erklärbär links
https://forum.fhem.de/index.php?topic=105963.15
https://forum.fhem.de/index.php?topic=108270.0
https://forum.fhem.de/index.php?topic=85330.0
@Thomas
Ja, das stimmt. Ohne Leerzeichen geht es. An anderen Stellen geht es aber mit Leerzeichen. Z.B. bei Eingabe von
{ ReadingsVal("Bewaesserung_zeit", "time", 0) }
in die FHEM-Konsole. Da sehe ich nicht durch.
@Otto
Danke, die Links haben mich in die richtige Richtung geführt. Hätte aber nicht gedacht, dass man dafür so "komplexe" Ausdrücke braucht.
Das funktionierende Endergebnis:
set Bewaesserungsventil on; define a_Bewaesserung at {POSIX::strftime("%H:%M:%S",localtime(time+Value("Bewaesserung_zeit")))} set Bewaesserungsventil off
Wobei mein Dummy "Bewaesserung_zeit" die variable Zeit in Sekunden (bzw. eine einfache Zahl) als Schieberegler bereitstellt.
Danke allerseits,
VG
Martin
Zitat von: M.K. am 02 Februar 2021, 10:00:12
Ohne Leerzeichen geht es. An anderen Stellen geht es aber mit Leerzeichen. Z.B. bei Eingabe von
{ ReadingsVal("Bewaesserung_zeit", "time", 0) }
in die FHEM-Konsole. Da sehe ich nicht durch.
Für at (das du hier indirekt definierst) steht es in der https://fhem.de/commandref_modular.html#at, dass an dieser Stelle (u.a.) Leerzeichen nicht erlaubt sind:
Zitat<timespec> is either HH:MM, HH:MM:SS or {perlfunc()}. perlfunc must return a string in timedet format. Note: {perlfunc()} may not contain any spaces or tabs.
Den Hintergrund dafür hatte ich schon versucht zu erläutern: Leerzeichen (und Tabs) dienen eben häufig auch dazu, Parameter voneinander zu trennen. Der Modulcode (hier: von at) muss irgendwie (unaufwändig!) erkennen können, wann denn der Ausführungsteil beginnt...
Moin,
ich lege mal noch was gaaanz einfaches nach :)
define b_zeit dummy
attr b_zeit room b_test
attr b_zeit setList sec:slider,0,1,10
attr b_zeit webCmd sec
define n_zeit notify b_zeit:sec.* set SD3 on;;sleep $EVTPART1;;set SD3 off
attr n_zeit room b_test
Vielleicht haben alle am Anfang zu komplex gedacht. Falls Perl doch eine Rolle spielen sollte (Weitere Bedingungen abfragen), geht auch:
defmod n_zeit notify b_zeit:sec.* {fhem("set SD3 on;;sleep $EVTPART1;;set SD3 off")}
Falls die Zeit wieder nicht der Trigger sein sollte, geht natürlich Dan sein Vorschlag (ein 'set b_zeit start' - startet den Vorgang):
defmod n_zeit notify b_zeit:start {fhem("set SD3 on;;sleep ".ReadingsNum('b_zeit','sec',127).";;set SD3 off")}
Man kann auch beides kombinieren :) - es gibt unzählige Möglichkeiten :)
Gruß Otto