FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Yil am 13 Februar 2016, 09:48:30

Titel: Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?
Beitrag von: Yil am 13 Februar 2016, 09:48:30
Hallo zusammen,

typisch Anfänger: ich habe einen Wecker definiert mit:

define WeckerMorgens dummy
attr WeckerMorgens setList state:time
attr WeckerMorgens webCmd state


Hinweis: die ausführliche setList mit einzelnen Uhrzeiten habe ich mittlerweile gelöscht.

Ich möchte nun gerne die gewählte Uhrzeit an einen at-Befehl übergeben:

define Wecker_morgens at *(hier soll die gewählte Uhrzeit rein) ...

Kennt jemand dafür eine elegante Methode bzw. irgendeine Methode, mit der das geht? ReadingsVal("WeckerMorgens ","state","") produziert einen Fehler - kein timespec.

Vielen Dank, Yil
Titel: Antw:Wie bekomme ich aus state:06:45 eine Uhrzeit für den at-Befehl?
Beitrag von: betateilchen am 13 Februar 2016, 09:53:20
define Wecker_morgens at *(hier soll die gewählte Uhrzeit rein)

geschweifte Klammern verwenden, wenn Du perl Funktionen auswerten willst.

define Wecker_morgens at *{ ReadingsVal("WeckerMorgens","state","") }

Titel: Antw:Wie bekomme ich aus state:06:45 eine Uhrzeit für den at-Befehl?
Beitrag von: Yil am 13 Februar 2016, 13:46:37
Ich habe zwischenzeitlich eine bessere Definition gefunden:

define WeckerMorgens dummy
attr WeckerMorgens setList state:time
attr WeckerMorgens webCmd state


Ergebnis von:

define Wecker_morgens at *{ ReadingsVal("WeckerMorgens","state","") } ...

in dem FHEM-Weboberfläche nach dem Speichern ist:

Wrong timespec {: either HH:MM:SS or {perlcode}

Ich stelle mich vermutlich zu ungeschickt an  :o

Titel: Antw:Wie bekomme ich aus state:06:45 eine Uhrzeit für den at-Befehl?
Beitrag von: Hollo am 13 Februar 2016, 18:55:15
Zitat von: Yil am 13 Februar 2016, 13:46:37
Ich habe zwischenzeitlich eine bessere Definition gefunden..
Wrong timespec {: either HH:MM:SS or {perlcode}
...
Ist dann wohl nicht so viel besser.  :)

Mach doch ein notify auf die Änderung Deines Dummy und damit ein modify des at !?
Titel: Antw:Wie bekomme ich aus state:06:45 eine Uhrzeit für den at-Befehl?
Beitrag von: Yil am 14 Februar 2016, 20:14:51
Keine schlechte Idee. Danke  :)

Trotzdem würde ich gerne verstehen, was an: { ReadingsVal("WeckerMorgens","state","") } falsch ist. Denn egal, ob ich

state: time oder state ohne Zusatz und eine lange setList definiere, die Fehlermeldung ist immer die gleiche, nämlich Wrong timespec {: either HH:MM:SS or {perlcode}.

VG Yil

Titel: Antw:Wie bekomme ich aus state:06:45 eine Uhrzeit für den at-Befehl?
Beitrag von: Hollo am 14 Februar 2016, 20:45:18
Ohne es jetzt probiert zu haben, deute ich das so:
als timespec wir HH:MM:SS erwartet, Du lieferst aber nur eine Angabe mit Stunden und Minuten.
Mach doch mal testweise in Deiner setlist einen Eintrag MIT Sekunden und probier es aus.
Titel: Antw:Wie bekomme ich aus state:06:45 eine Uhrzeit für den at-Befehl?
Beitrag von: Yil am 14 Februar 2016, 22:45:42
An sich auch ne gute Idee - aber leider auch nicht erfolgreich. Ist ja zum Verzweifeln ...  :-\

Ich habe nun setList:06:45:00 eingetragen, wieder der gleiche Fehler. setList:time liefert übrigens auch nur "06:45" ohne Sekundenangabe.

Es muss doch irgendwie möglich sein, aus einem Dummy, der als setList:time explizit Zeitwerte in der Webkonsole zur Auswahl stellt und diese in seinen Status schreibt, diese so abzufragen, dass damit ein AT-Statement gefüllt werden kann. Hat das noch niemand gemacht?

Titel: Antw:Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?
Beitrag von: crusader am 15 Februar 2016, 00:20:41
Leerzeichen weglassen:

define Wecker_morgens at *{ReadingsVal("WeckerMorgens","state","")} set Lamp on

Nützt Dir aber nix.
Der Ausdruck wird beim Initialisieren und danach wegen des * immer beim Auslösen des at-Devices ausgeführt.

Wenn der Wecker morgens angeht, stellt er also die Weckzeit für den nächsten Tag. Eine nachträgliche Verstellung von WeckerMorgens wirkt sich dann erst am übernächsten Tag aus.

ReadingsVal("..","state","") heisst übrigens einfach Value(",,").
Titel: Antw:Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?
Beitrag von: Damian am 15 Februar 2016, 07:50:30
Zitat von: crusader am 15 Februar 2016, 00:20:41
Leerzeichen weglassen:

define Wecker_morgens at *{ReadingsVal("WeckerMorgens","state","")} set Lamp on

Nützt Dir aber nix.
Der Ausdruck wird beim Initialisieren und danach wegen des * immer beim Auslösen des at-Devices ausgeführt.

Wenn der Wecker morgens angeht, stellt er also die Weckzeit für den nächsten Tag. Eine nachträgliche Verstellung von WeckerMorgens wirkt sich dann erst am übernächsten Tag aus.

ReadingsVal("..","state","") heisst übrigens einfach Value(",,").

Damit sollte es besser klappen:

define wecker DOIF ([[WeckerMorgens]]) (set Lamp on)

attr wecker do always


Hiermit wird auch immer die aktuelle Zeit aus dem Dummy genommen.

Gruß

Damian
Titel: Antw:Wie bekomme ich aus state:06:45 eine Uhrzeit für den at-Befehl?
Beitrag von: Hollo am 15 Februar 2016, 09:30:20
Zitat von: Yil am 14 Februar 2016, 22:45:42
...Es muss doch irgendwie möglich sein, aus einem Dummy, der als setList:time explizit Zeitwerte in der Webkonsole zur Auswahl stellt und diese in seinen Status schreibt, diese so abzufragen, dass damit ein AT-Statement gefüllt werden kann. Hat das noch niemand gemacht?
So, habe nochmal nachgeschaut; ich habe sowas (verteilt über mehrere Sachen) bei mir drin.
Mein "Wecker" läuft automatisch, ich kann aber auch Ausschalten oder halt eine andere "Weckzeit" aus einer Liste auswählen.
Daraus resultierend wird 1 Stunde vor der Weckzeit schonmal das Bad vorgeheizt.

Hatte da auch länger rumprobiert, wenn ich so drüber nachdenke.
Der Trick war nachher folgender:

- ich habe für meinen "Schaltvorgang ein "normales at" definiert
define Vorheizen at *05:00:00 {\
mache dies und das}


- dann einen Dummy für die Weckzeit mit
setList state:Auto,05:00,05:30,05:45,06:00,06:30,07:00,07:30,08:00,08:30,09:00,Skip,Aus

- und ein notify, welches auf die Weckzeit-Verstellung reagiert;
  abgesehen von dem Auto, Aus oder Skip ist der entscheidende Teil
define n_Wecker notify Wecker { $a=Value("Wecker");;\
                        $a =~ s/\./:/ ;;\
                           my $heizen = TimeOffset($a,-60);;\
                           fhem ("modify Vorheizen *".$heizen);;\
                 }
 
Titel: Antw:Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?
Beitrag von: Yil am 16 Februar 2016, 08:30:12
Sehr genial - vielen Dank! Irgendwie ahnte ich, dass es mit DOIF wieder mal viel einfacher geht.

Zunächst habe ich es umgesetzt wie von Hollo vorgeschlagen. Mit einem Notify auf die Änderung und einem modify des AT-Befehls. Fehlt noch der angehängte SAVE-Befehl, damit die Änderung in der fhem.cfg auch gleich geschrieben wird. Ist aber nicht ganz so elegant, wie ich das gern hätte.

Für: $a =~ s/\./:/ ;;\

muss ich mein Hochschulstudium erst noch beenden ...  ;) ;D

Danke für den Hinweis wg. Value("..") - werde ich im Code ändern.

VG Yil

Titel: Antw:Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?
Beitrag von: Yil am 16 Februar 2016, 08:31:45
ZitatDamit sollte es besser klappen:

Code: [Auswählen]

define wecker DOIF ([[WeckerMorgens]]) (set Lamp on)

attr wecker do always


Hiermit wird auch immer die aktuelle Zeit aus dem Dummy genommen.

Rückfrage: warum 2x eckige Klammer auf und zu?
Titel: Antw:Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?
Beitrag von: Hollo am 16 Februar 2016, 09:25:04
Zitat von: Yil am 16 Februar 2016, 08:30:12
...Fehlt noch der angehängte SAVE-Befehl, damit die Änderung in der fhem.cfg auch gleich geschrieben wird...
Ahh hab ich nicht geschrieben...
Das habe ich absichtlich weggelassen, damit sichergestellt ist, dass bei einem Neustart zwischendurch immer die frühe Weckzeit ist, und ich nicht zu spät bin.  ;D
Zitat
Für: $a =~ s/\./:/ ;;\

muss ich mein Hochschulstudium erst noch beenden ...  ;) ;D
Das hintere ;;\ ist ja nur "da kommt noch ein Befehl und Zeilenumbruch"; davor ist sinngemäß "suche ein bestimmtes Zeichen und ersetze es durch ein anderes bestimmtes Zeichen".

Titel: Antw:Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?
Beitrag von: Damian am 16 Februar 2016, 09:36:14
Zitat von: Yil am 16 Februar 2016, 08:31:45
Rückfrage: warum 2x eckige Klammer auf und zu?
http://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben

Gruß

Damian
Titel: Antw:Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?
Beitrag von: Yil am 16 Februar 2016, 12:50:25
Wer lesen kann, ist klar im Vorteil ...  ;)

Danke!