Für eine rudimentäre Zeitschaltuhrfunktionalität wollte ich gerne mehrere dynamische Zeitpunkte (abhängig vom Sonnenstand) verwenden.
Diese Zeitpunkte liegen meißt als Unix-Timestamp vor.
Als erstes kam mir der Gedanke mehrere wakeups zu verwenden. Funktioniert mit ein wenig Aufwand - aber man sieht im Doctormode nicht den wahren Zustand: viewtopic.php?f=65&t=5520#p58918
Besser geeignet schien mir ein Kalendertimer - hier wird mittels CRON genau zum Zeitpunkt X z.B. eingeschalten und die nächste Auslösung der Logik (durch den nächsten Schaltzeitpunkt) schaltet wieder aus. Also habe ich mir den Code mal in eine custom-Logik kopiert.
Nun erwartet CRON als Eingabe eine cron-Syntax (z.B. "0 0 23 * * *")..... Wie also nun die als Schaltpunkte vorliegenden UNIX-Timestamps in CRON-Syntax umwandeln? ..... Geht mit localtime -> printf ->concat .....Ganzschön aufwändig.
Hier mal der Code für meine Logik die folgendes macht:
In der Adventszeit wird Abends zum Sonnenuntergang +/- x Minuten boolean (das Licht) EINgeschalten. Der AUSschaltzeitpunkt ist fix vorgegeben (als CRON-String -> $Cron_Abend). Früh wird zu einem fixen Zeitpunkt EINgeschalten ($Cron_Frueh) und zum Sonnenaufgang +/- X Minuten AUSgeschalten
Code: Alles auswählen
/**
* Schaltzeiten boolean in Abhängigkeit vom Sonnenstand
* Zur Adventszeit - und nur wenn jemand anwesend ist
* Korrekturwerte (plus/minus) in Sekunden
*/
{
"Level": [
["$true","bool",true],
["$SU","int",0],
["$Cron_Abend","string","0 0 1 * * *"], // Standard 1 Uhr ausschalten
["$Cron_Frueh","string","0 55 5 * * *"], // Standard 5.55 Uhr einschalten
["$Cron1","string","0"],
["$Cron2","string","0"],
["$Cron3","string","0"],
["$Cron4","string","0"],
["$Cron5","string","0"],
["$Cron6","string","0"],
["$SA","int",0],
["$Presence","bool",true],
["$Advent","bool",false],
["$StringFormat","string","%d"],
["$Null","string","0"],
["$Stern","string","*"],
["$Empty","string"," "],
["$Min1","int",0],
["$Min2","int",0],
["$Min3","int",0],
["$Min4","int",0],
["$Min5","int",0],
["$Min6","int",0],
["$Hour1","int",0],
["$Hour2","int",0],
["$Hour3","int",0],
["$Hour4","int",0],
["$Hour5","int",0],
["$Hour6","int",0],
["$Min1str","string","0"],
["$Min2str","string","0"],
["$Min3str","string","0"],
["$Min4str","string","0"],
["$Min5str","string","0"],
["$Min6str","string","0"],
["$Hour1str","string","0"],
["$Hour2str","string","0"],
["$Hour3str","string","0"],
["$Hour4str","string","0"],
["$Hour5str","string","0"],
["$Hour6str","string","0"],
["$Result1","bool",false],
["$Result2","bool",false],
["$Result3","bool",false],
["$Result4","bool",true],
["$Result5","bool",true],
["$Result6","bool",true],
["$ResultAbend","bool",true],
["$ResultFrueh","bool",false],
["$Out1","int",0],
["$Out2","int",0],
["$Out3","int",0],
["$Out4","int",0],
["$Out5","int",0],
["$Out6","int",0],
["$Korrektur1","int",0],
["$Korrektur2","int",0],
["$Korrektur3","int",0],
["$Korrektur4","int",0],
["$Korrektur5","int",0],
["$Korrektur6","int",0],
["$Formula","string","X1+X2"],
["$VAR<Inhibit?>","bool",false]
],
"Module": [
["Break",["$VAR<Inhibit?>"]],
["Break",["-$Presence","-$Advent"]],
// Abends aus berechnen
["Cron","$true","-$ResultAbend",0,"$Cron_Abend"],
["SendExplicit","$ResultAbend","$ResultAbend",2],
// Früh ein berechnen
["Cron","$true","$ResultFrueh",0,"$Cron_Frueh"],
["SendExplicit","$ResultFrueh","$ResultFrueh",1],
["CalcFormula",["$SU","$Korrektur1"], "$Out1", "$Formula"],
// Errechnete Zeit $Out1 in Bestandteile zerlegen. Wir brauchen $Min und $Hour
["Localtime","$Out1",0,0,"$Min1","$Hour1",0,0,0,0,0,0],
["Printf","$Min1","$StringFormat", "$Min1str"],
["Printf","$Hour1","$StringFormat", "$Hour1str"],
// Cronstring zusammensetzen
["Concat",["$Null","$Empty","$Min1str","$Empty","$Hour1str","$Empty","$Stern","$Empty","$Stern","$Empty","$Stern"], "$Cron1"],
["Cron","$true","$Result1",0,"$Cron1"],
["SendExplicit","$Result1","$Result1",1],
["CalcFormula",["$SU","$Korrektur2"], "$Out2", "$Formula"],
// Errechnete Zeit $Out2 in Bestandteile zerlegen. Wir brauchen $Min und $Hour
["Localtime","$Out2",0,0,"$Min2","$Hour2",0,0,0,0,0,0],
["Printf","$Min2","$StringFormat", "$Min2str"],
["Printf","$Hour2","$StringFormat", "$Hour2str"],
// Cronstring zusammensetzen
["Concat",["$Null","$Empty","$Min2str","$Empty","$Hour2str","$Empty","$Stern","$Empty","$Stern","$Empty","$Stern"], "$Cron2"],
["Cron","$true","$Result2",0,"$Cron2"],
["SendExplicit","$Result2","$Result2",1],
["CalcFormula",["$SU","$Korrektur3"], "$Out3", "$Formula"],
// Errechnete Zeit $Out3 in Bestandteile zerlegen. Wir brauchen $Min und $Hour
["Localtime","$Out3",0,0,"$Min3","$Hour3",0,0,0,0,0,0],
["Printf","$Min3","$StringFormat", "$Min3str"],
["Printf","$Hour3","$StringFormat", "$Hour3str"],
// Cronstring zusammensetzen
["Concat",["$Null","$Empty","$Min3str","$Empty","$Hour3str","$Empty","$Stern","$Empty","$Stern","$Empty","$Stern"], "$Cron3"],
["Cron","$true","$Result3",0,"$Cron3"],
["SendExplicit","$Result3","$Result3",1],
["CalcFormula",["$SA","$Korrektur4"], "$Out4", "$Formula"],
// Errechnete Zeit $Out4 in Bestandteile zerlegen. Wir brauchen $Min und $Hour
["Localtime","$Out4",0,0,"$Min4","$Hour4",0,0,0,0,0,0],
["Printf","$Min4","$StringFormat", "$Min4str"],
["Printf","$Hour4","$StringFormat", "$Hour4str"],
// Cronstring zusammensetzen
["Concat",["$Null","$Empty","$Min4str","$Empty","$Hour4str","$Empty","$Stern","$Empty","$Stern","$Empty","$Stern"], "$Cron4"],
["Cron","$true","-$Result4",0,"$Cron4"],
["SendExplicit","$Result4","$Result4",2],
["CalcFormula",["$SA","$Korrektur5"], "$Out5", "$Formula"],
// Errechnete Zeit $Out5 in Bestandteile zerlegen. Wir brauchen $Min und $Hour
["Localtime","$Out5",0,0,"$Min5","$Hour5",0,0,0,0,0,0],
["Printf","$Min5","$StringFormat", "$Min5str"],
["Printf","$Hour5","$StringFormat", "$Hour5str"],
// Cronstring zusammensetzen
["Concat",["$Null","$Empty","$Min5str","$Empty","$Hour5str","$Empty","$Stern","$Empty","$Stern","$Empty","$Stern"], "$Cron5"],
["Cron","$true","-$Result5",0,"$Cron5"],
["SendExplicit","$Result5","$Result5",2],
["CalcFormula",["$SA","$Korrektur6"], "$Out6", "$Formula"],
// Errechnete Zeit $Out6 in Bestandteile zerlegen. Wir brauchen $Min und $Hour
["Localtime","$Out6",0,0,"$Min6","$Hour6",0,0,0,0,0,0],
["Printf","$Min6","$StringFormat", "$Min6str"],
["Printf","$Hour6","$StringFormat", "$Hour6str"],
// Cronstring zusammensetzen
["Concat",["$Null","$Empty","$Min6str","$Empty","$Hour6str","$Empty","$Stern","$Empty","$Stern","$Empty","$Stern"], "$Cron6"],
["Cron","$true","-$Result6",0,"$Cron6"],
["SendExplicit","$Result6","$Result6",2]
],
"Input": [
["Korrektur1 ABENDS","Zeit in sec (positiv oder negativ)","$Korrektur1","u"],
["Korrektur2 ABENDS","Zeit in sec (positiv oder negativ)","$Korrektur2","u"],
["Korrektur3 ABENDS","Zeit in sec (positiv oder negativ)","$Korrektur3","u"],
["Korrektur1 FRÜH","Zeit in sec (positiv oder negativ)","$Korrektur4","u"],
["Korrektur2 FRÜH","Zeit in sec (positiv oder negativ)","$Korrektur5","u"],
["Korrektur3 FRÜH","Zeit in sec (positiv oder negativ)","$Korrektur6","u"],
["AUSschalten ABENDS","Cronstring - Standard 1 Uhr","$Cron_Abend","u"],
["EINschalten FRÜH","Cronstring - Standard 5.55 Uhr","$Cron_Frueh","u"],
["Sonnenuntergang","Unixtime aus Astrobaustein","$SU","ci"],
["Sonnenaufgang","Unixtime aus Astrobaustein","$SA","ci"],
["Anwesenheit","Jemand zu Hause?","$Presence","u"],
["Adventszeit?","aus Logik Advent","$Advent","u"],
["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
],
"Output": [
["ABENDS EIN 1","Schaltereignis 1","$Result1","x"],
["ABENDS EIN 2","Schaltereignis 2","$Result2","x"],
["ABENDS EIN 3","Schaltereignis 3","$Result3","x"],
["FRÜH AUS 1","Schaltereignis 4","$Result4","x"],
["FRÜH AUS 2","Schaltereignis 5","$Result5","x"],
["FRÜH AUS 3","Schaltereignis 6","$Result6","x"],
["ABENDS AUS","Abends aus nach Cronstring","$ResultAbend","x"],
["FRÜH EIN","Früh ein nach Cronstring","$ResultFrueh","x"]
]
}
/**Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht. */

PS: Die Berechnung der Adventszeit erfolgt über diese Logik: viewtopic.php?p=51998&hilit=advent#p51998
@elabnet
MEIN WUNSCH wäre quasi ein Logikmodul ala Kalendertimer, welches einen Unix-Timestamp als Eingang akzeptiert. Und idealerweise sollte man auch noch festlegen können, was zum Schaltzeitpunkt gesendet wird (true oder false) - aber es würde auch ohne dies schon eine deutliche Erleichterung bringen.