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
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","") }
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
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 !?
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
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.
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?
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(",,").
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
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);;\
}
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
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?
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".
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
Wer lesen kann, ist klar im Vorteil ... ;)
Danke!