Ich hab gestern befürchte ich das gleiche nochmal umgesetzt.
Das Problem der Einschaltzeit/Ausschaltzeit Reihenfolge habe ich gerade noch gelöst.
Das Modul nutzt die Wakeup Funktion, das macht vieles deutlich einfacher (Sein Ausgang ist im Prinzip ein Comperator auf UTime, aber mit integriertem Timer, der zu diesem Zeitpunkt dann triggert).
Außerdem habe ich das Verhalten soweit erweitert, dass sofort beim Speichern oder Reboot die Weckzeiten gesetzt werden.
Über die Sendeoptionen ist ein Senden bei Änderung 1x EIN, 1x AUS (mit c) oder zyklisch (ct) mit zusätzlichem Trigger (die Standardlösung am +).
Auch ein Enable hab ich integriert. Sekunden fehlen noch.
Das Prinzip ist etwas anders und ich nutze mehr die verfügbaren Module, wo ihr selbst per clocksignal einen Trigger erzeugt.
Schaut euch das mal an, ob wir hier eine gemeinsame Lösung draus machen können, denn am Ende sind die beiden Lösungen am Ausgang gleichwertig. Der Baustein schaltet zu exakten Sekunde.
Kurz zur Funktion: Beim Speichern wird letztes Mitternacht berechnet, ab dann wird jeweils Mitternacht per Cron gespeichert. Die Weckzeit wird dann mit UTime Mitternacht + h*3600 + min*60 berechnet.
Den Rest erledigt Wakeup.
Code: Alles auswählen
/**===========================================================
Kommentar
============================================================*/
{
"Level":[
["$I_hour_on","integer",0],
["$I_min_on","integer",0],
["$I_hour_off","integer",0],
["$I_min_off","integer",0],
["$I_Enable","bool",false],
//
["$Output_on","bool",true],
["$Output_off","bool",false],
//
["$Utime","integer",0],
["$Utime_Midnight1","integer",0],
["$Utime_Midnight2","integer",0],
["$Utime_on","integer",0],
["$Utime_off","integer",0],
["$Utime_Ref","integer",0],
["$Utime_temp","integer",0],
["$Utime_hour","integer",0],
["$Utime_min","integer",0],
["$Utime_sec","integer",0],
//
["$Set_Utime_Midnight","bool",false],
["$Set_on","bool",false],
["$Set_off","bool",false],
["$SetCase1","bool",false],
["$SetCase2","bool",false],
["$Set","bool",false],
["$Wake_on","bool",false],
["$Wake_off","bool",false],
["$Wake_on_Last","bool",false],
["$Wake_off_Last","bool",false],
["$Wake_on_Trigger","bool",false],
["$Wake_off_Trigger","bool",false],
// Init nach Reboot
["$Enable","bool",false],
["$State","bool",false],
["$StateOut","bool",false],
["$Delay","float",5.0],
["$TimerStatus","bool",false],
["$SelectCase","bool",false],
["$Konst1","integer",1],
["$Konst0","integer",0],
["$Konst60","integer",60],
["$Konst3600","integer",3600],
["$Konst1_","float",1.0],
["$Konst0_","float",0.0],
["$KonstTrue","bool",true],
["$KonstFalse","bool",false],
["$Cron_Midnight","string","0 0 0 * * *"]
],
"Module":[
["Localtime",0,"$Utime","$Utime_sec","$Utime_min","$Utime_hour",0,0,0,0,0,0],
["Latch","$StateOut","$State","$KonstTrue",0],
// Logik beim speichern bzw. Reboot Aufrufen
["Clocksignal","-$State",0,"$Delay"],
["Latch","$Utime","$Utime_Ref","-$State",0],
// und Utime_Midnight2 initialisieren (State=0)
["Polynomial", "$Utime_hour", "$Utime_temp",["$Utime_Ref", "-$Konst3600"]],
["Polynomial", "$Utime_min", "$Utime_temp",["$Utime_temp", "-$Konst60"]],
["Polynomial", "$Utime_sec", "$Utime_Midnight2",["$Utime_temp", "-$Konst1"]],
["Latch","$Utime_Midnight2","$Utime_Midnight1","-$State",0],
// State nach Start auf 1 setzen
["Latch","$KonstTrue","$StateOut","-$State",0],
// Zeit übernehmen, wenn Cron getriggert hat
["Cron","$KonstTrue","$Set_Utime_Midnight",0,"$Cron_Midnight"],
["Latch","$Utime","$Utime_Midnight1","$Set_Utime_Midnight",0],
// Weckzeit ON berechnen
["Polynomial", "$I_hour_on", "$Utime_temp",["$Utime_Midnight1", "$Konst3600"]],
["Polynomial", "$I_min_on", "$Utime_on",["$Utime_temp", "$Konst60"]],
// Weckzeit OFF berechnen
["Polynomial", "$I_hour_off", "$Utime_temp",["$Utime_Midnight1", "$Konst3600"]],
["Polynomial", "$I_min_off", "$Utime_off",["$Utime_temp", "$Konst60"]],
// Wecker auswertern => Liefert dauerhaft true, wenn t>t_wecker
["Wakeup","$Utime_on","$Wake_on"],
["Wakeup","$Utime_off","$Wake_off"],
// Ein/Aus berechnen abhängig davon ob EIN vor AUS oder AUS vor EIN
["Comparator", "$Utime_on", "$SelectCase", "$Utime_off"],
["And" , ["$Wake_on","$Wake_off","$SelectCase","$I_Enable"], "$SetCase1"],
["And" , ["$Wake_on","-$Wake_off","-$SelectCase","$I_Enable"], "$SetCase2"],
["Multiplexer",["$SetCase1","$SetCase2"],"$Set","-$SelectCase"]
],
"Input":[
["Einschalten Stunde","Input","$I_hour_on","c"],
["Einschalten Minute","Input","$I_min_on","c"],
["Ausschalten Stunde","Input","$I_hour_off","c"],
["Ausschalten Minute","Input","$I_min_off","c"],
["Enable","Input","$I_Enable","c"]
],
"Output":[
["Einschalten","Output","$Set","c"],
// ["Einschalten","Output","$Output_on","x"]
// ["Ausschalten","Output","$Output_off","x"],
["Debug Utime_Midnight1","","$Utime_Midnight1","a"]
]
}