Hallo,
ich habe vor einiger Zeit einen Wecker Programmiert und möchte nun über meine FTUI-Oberfläche die Weckzeit und An/Aus schalten können. Ich habe ein paar Fragen zur Funktionsweise von
at.
1. Wenn ich die Zeit mit
set at_wecker modifyTimeSpec <timespec>
ändere, wird nach einem Neustart von FHEM wieder die in der DEF angegebene Zeit verwendet. Ist das das beabsichtigte Verhalten?
Da ich so nicht weitergekommen bin, habe ich zwei
dummy-devices erstellt und mein Code sieht nun so aus:
# Weckzeit
define d_wecker_zeit dummy
setuuid d_wecker_zeit 622bace1-f33f-9236-4bc7-d46da41586b979a2
attr d_wecker_zeit comment Startzeit für den Wecker
attr d_wecker_zeit group Automatisierung
attr d_wecker_zeit room Einstellungen,Übersicht
attr d_wecker_zeit setList :time
# Wecker an/aus
define d_wecker dummy
setuuid d_wecker 622bad65-f33f-9236-7b46-0063bcc7203f4527
attr d_wecker comment Status des Weckers (on/off)
attr d_wecker devStateIcon off:ios-off on:ios-on-green
attr d_wecker group Automatisierung
attr d_wecker room Einstellungen,Übersicht
attr d_wecker setList on off
# SchlaZi Nachttischlampen morgens hochdimmen
define at_wecker at *{ReadingsVal("d_wecker_zeit","state","07:55")} { if (!$we && Value("d_wecker") eq 'on') {\
\
fhem "set DIM_SchlaZi_Tisch_.* 50 0 1200";;\
\
fhem "set avr_kueche on";;\
fhem "set avr_kueche volume 80";;\
fhem "set avr_kueche speaker-a on";;\
fhem "set avr_kueche speaker-a on";;\
fhem "set avr_kueche preset radio1";;\
\
} }
setuuid at_wecker 5c85027e-f33f-9236-431b-a1b9d75d0120d3d7
attr at_wecker alias Wecker
attr at_wecker comment Wecker: lässt Nachttischlampen in 20 min (1200s) hochdimmen
attr at_wecker computeAfterInit 1
attr at_wecker group Automatisierung
attr at_wecker room Einstellungen,Übersicht
attr at_wecker webCmd active:inactive
2. Ich hatte als
timespec zunächst
*{Value("d_wecker_zeit")}
verwendet. Das führte bei einem Neustart von FHEM zur Fehlermeldung
Zitatthe function "Value("d_wecker_zeit")" must return a timespec and not ? ? ?
(wie auch hier beschrieben: https://forum.fhem.de/index.php/topic,124593.0.html) und das
at-Device wurde nicht erstellt. Warum tritt dieser Fehler auf?
d_wecker_zeit wird vorher definiert und es ist eine gültige
timespec gesetzt.
3. Ich habe nun folgendes Problem:
at_wecker übernimmt eine Änderung der Zeit in
d_wecker_zeit nicht bzw. erst bei der nächsten Ausführung von
at_wecker zur alten Zeit. Im Event Monitor kommt ganz sauber das Event
Zitat2022-03-12 08:51:14 dummy d_wecker_zeit 05:57
Herumprobieren mit
set at_wecker active / inactive
funktioniert leider nicht. Was mache ich falsch? Kann man die Neuauswertung des
timespec über irgendeinen anderen Befehl triggern?
Vielen Dank für Hilfe.
ZitatWenn ich die Zeit mit set at_wecker modifyTimeSpec <timespec>ändere, wird nach einem Neustart von FHEM wieder die in der DEF angegebene Zeit verwendet.
Ad 1: DEF wird nach modifyTimeSpec geaendert.
Ad 2: wenn man nach dem modifyTimeSpec die neue Definition nicht speichert (aka save), wird nach einem Neustart die alte Definition verwendet.
Die automatische Speicherung einer Aenderung ist in FHEM nicht ueblich, eine Ausnahme sind per autocreate angelegte neue Geraete.
Folgendes loest ein Speichern nach diesem Befehl aus:
define ca_weckerSave cmdAlias set at_wecker modifyTimespec .* AS set $EVENT;; save
attr ca_weckerSave verbose 2
Zitatthe function "Value("d_wecker_zeit")" must return a timespec and not ? ? ?
Das liegt daran, dass bei der Definition aus fhem.cfg d_wecker_zeit noch nicht mit dem alten Wert initialisiert ist, das passiert spaeter.
Die Loesung ist eine Methode mit einer default Wert zu verwenden, z.Bsp ReadingsVal("d_wecker_zeit", "state", "12:00"), weiterhin muss fuers at das computeAfterInit Attribut gesetzt werden.
Zitatat_wecker übernimmt eine Änderung der Zeit in d_wecker_zeit nicht
at reagiert nicht auf Events, fuer sowas sind andere Module wie z.Bsp. notify zustaendig.
Die neue Zeit wird nach dem Ausfuehren der Aktuellen berechnet.
Vielen Dank für die Erläuterungen.
ZitatDie neue Zeit wird nach dem Ausfuehren der Aktuellen berechnet.
Kann man eine Neuauswertung des timespec vom at auch vor der nächsten Ausführung irgendwie triggern/erzwingen (ohne FHEM neu zu starten oder an der DEF etwas zu ändern)? Ich fühle mich mit dem automatischen Speichern nicht so wohl, habe mir schon ein paar mal was zerschossen. Am liebsten würde ich mir ein notify für meinen dummy
d_wecker_zeit bauen, der in
at_wecker die Neuauswertung des timespec triggert.
Ich habe das nun wie folgt gelöst:
define n_wecker_zeit notify d_wecker_zeit:.* { fhem "set at_wecker modifyTimeSpec " . InternalVal("at_wecker","TIMESPEC","ERROR") }
Ich lasse mittels modifyTimeSpec den TIMESPEC mit sich selbst überschreiben. at wertet dadurch die Perlfunktion im TIMESPEC erneut aus.
Wenn es noch einfach geht, freue ich mich über einen Tipp. Vielen Dank.
Zitat von: Starkstromkonsument am 13 März 2022, 13:54:02
Wenn es noch einfach geht, freue ich mich über einen Tipp. Vielen Dank.
Das geht. Es gibt Module, die automatisch eine geänderte Zeit anpassen können.