at: Funktionsweise timespec / Neuauswertung timespec mit perlcode triggern

Begonnen von Starkstromkonsument, 12 März 2022, 09:05:41

Vorheriges Thema - Nächstes Thema

Starkstromkonsument

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.

rudolfkoenig

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.


Starkstromkonsument

#2
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.

Starkstromkonsument

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.

Damian

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