sleep x; Wie einen variablen Wert für sleep setzen?

Begonnen von M.K., 28 Januar 2021, 08:58:13

Vorheriges Thema - Nächstes Thema

M.K.

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

Otto123

#1
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

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!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

M.K.

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.

:( :(

Beta-User

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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Otto123

#6
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

M.K.

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

Ich verstehe nicht wirklich, wo der Fehler liegen soll. Das Format stimmt eigentlich.   >:(


TomLee

ZitatÜbrigens steht diese Beispiel auch im Wiki

NIcht ganz, da sind keine Leerzeichen zwischen den Parametern in ReadingsVal vorhanden.

Gruß

Thomas

Otto123

#9
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

M.K.

@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

Beta-User

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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz