Zum Verzweifeln: Wie bekomme ich aus state:time eine Uhrzeit für den at-Befehl?

Begonnen von Yil, 13 Februar 2016, 09:48:30

Vorheriges Thema - Nächstes Thema

Yil

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
HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

betateilchen

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","") }

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Yil

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

HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

Hollo

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 !?
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Yil

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

HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

Hollo

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.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Yil

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?

HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

crusader

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(",,").

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Hollo

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);;\
                 }
 
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Yil

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

HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

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?
HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

Hollo

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".

FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Yil

HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi