[V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input
Verfasst: Mo Nov 18, 2024 10:48 am
Ich nehme mal Bezug auf folgende Diskussion: viewtopic.php?p=58888&hilit=cron+string ... der#p58888
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
Vielleicht will ja jemand zur Adventszeit das benutzen 
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.
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.