Seite 1 von 2

[V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Mo Nov 18, 2024 10:48 am
von jensgulow
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

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. */ 
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.

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Mo Nov 18, 2024 11:04 am
von Parsley
Cool, danke Jens.

Falls es für dich ok ist würde sich Elabnet sicher freuen, wenn du die Logik unter die TOLL stellst. ;)

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Mo Nov 18, 2024 11:07 am
von StefanW
Hi Lukas,
Parsley hat geschrieben: Mo Nov 18, 2024 11:04 amFalls es für dich ok ist würde sich Elabnet sicher freuen, wenn du die Logik unter die TOLL stellst. ;)
Es ist eigentlich NICHT für ElabNET (wir nutzen diese Logik ja nicht und "verkaufen" die auch nicht), sondern das ist für alle Nutzer, insbesondere für gewerbliche Kunden, damit die Lizenzierung glasklar ist.

Also Community für Community. Wir stellen nur die Plattform zum Austausch zur Verfügung.

lg

Stefan

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Mo Nov 18, 2024 11:12 am
von jensgulow
Auf jeden Fall habe ich die entsprechende Zeile im Code ergänzt.

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Sa Dez 07, 2024 10:07 pm
von jhaeberle
Hi Jens,
jensgulow hat geschrieben: Mo Nov 18, 2024 10:48 am 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
die Logik würde mir total taugen, aber irgendwie komme ich nicht dahinter und bitte um etwas Erleuchtung.
Ich würde damit gerne ein Licht im Hauseingang schalten. Morgens 5.50 bis 30 Min nach Sonnenaufgang und abends ab 30 min vor Sonnenuntergang bis 22:30. Das soll erst aml "immer" laufen, also habe ich Anwesenheit und Advent mal auf True gesetzt. Korrektur 1 ABENDS und FRÜH jeweils auf 1800.
Astromodul ist konfiguriert, den unix timecode habe ich kontrolliert, könnte stimmen.
Aber im Doktormodus schaut mir das so aus, dass die Ergebnisse falsch rum sind... jetzt um 21:30 Uhr ist abends ein 1 false und früh ein 1 true. Dazu ist abends aus true und früh ein false.

Wie geht das??? Kann ich meine Lampen Schalten GA "einfach" an Abends EIN 1, Früh AUS 1, Früh EIN und Abends AUS hängen? Wohl nicht, weil alle Ausgänge wohl true senden, wenn es was zu "schalten" gibt. Invertieren bewirkt aber auch nix.

Kannst mir jemand etwas Erkenntnis rüber schicken, bitte?

Bild

Danke, Gruß
Jochen

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Sa Dez 07, 2024 10:12 pm
von jensgulow
Durch das "send explizit" taugt der doctor-Mode und die Grafana-Visualisierung nur bedingt.
Am besten du hängst an die Ausgänge mal "dummy" MQTT-Geräte und schaust dann, ob das gweünscht Verhalten auftritt oder nicht. Bei mir läuft das so wie angegeben eigentlich stabil.
Wie geht das??? Kann ich meine Lampen Schalten GA "einfach" an Abends EIN 1, Früh AUS 1, Früh EIN und Abends AUS hängen?
Genau so - wie gesagt durch das send explizit sind die debug-Möglichkeiten eingeschränkt.

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Sa Dez 07, 2024 10:15 pm
von jhaeberle
Okay, verstehe.
Ich hab das also schon richtig gemacht? Wow.

Hast du mir bitte einen Tipp, wie ich das mit den Dummy MQTT Geräten angehen muss?

Gruß
Jochen

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Sa Dez 07, 2024 10:20 pm
von jensgulow
Im MQTT Gerätemanager ein neues device anlegen - topic vergeben und dann ein "publish" anlegen (siehe screenshot.

Dieses Topic verbindest Du dann mit einem Ausgang der Logik und kannst schauen zu welchem Zeitpunkt was am Ausgang gesandt wird.

Natürlich musst Du vorher das MQTT System incl. Broker schon in Betrieb haben...
Dummy MQTT Gerät.jpg

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Sa Dez 07, 2024 10:22 pm
von jhaeberle
Ach krass! So einfach! Ich hatte jetzt eher mit einem Docker-Container gerechnet… DANKE!!!

Re: [V4.5 IP1] Kalender-Timer Modul mit Unix-Timestamp als input

Verfasst: Sa Dez 07, 2024 10:24 pm
von jensgulow
Naja, den MQTT Broker brauchst Du schon.....Das ist ein Docker Container bei mir.
Mustt Du Dich bitte mal im entsprechenden Bereich des Forums einlesen....