KNX Data Secure Unterstützung
für KNX Logger und KNX Busmonitor

KNX Diagnose Monitor, Import des ETS Projektes deutlich beschleunigt, Suche in der Navigation
Mehr Informationen dazu hier im Forum

Insider Version 6 zur 4.5 jetzt für alle Mitglieder des Insider Clubs installierbar
Alle Infos zum Update im Timberwolf Wiki

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

Informationen und Diskussionen über Logik-Engine und Logik-Editor
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln
Benutzeravatar

Ersteller
jensgulow
Reactions:
Beiträge: 473
Registriert: Fr Apr 19, 2019 4:37 pm
Wohnort: Leipzig
Hat sich bedankt: 75 Mal
Danksagung erhalten: 206 Mal

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

#1

Beitrag 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.
Zuletzt geändert von jensgulow am Mo Nov 18, 2024 11:11 am, insgesamt 1-mal geändert.
Viele Grüße

Jens

_____________________________________________________________________
TWS 2600#394 , TWS 3500L#1051, VPN offen, Reboot erlaubt
genutzt? -> TWS, KNX, 1-wire, MQTT, MODBUS, Http-REST-API, IFTTT, Enocean, Amazon Alexa
Benutzeravatar

Parsley
Reactions:
Beiträge: 681
Registriert: Di Okt 09, 2018 7:27 am
Wohnort: 490..
Hat sich bedankt: 791 Mal
Danksagung erhalten: 425 Mal

#2

Beitrag 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. ;)
Gruß Parsley

Timberwolf Server 3500L #657 (VPN offen, reboot nach Absprache)
Bitte WIKI lesen.

StefanW
Elaborated Networks
Elaborated Networks
Reactions:
Beiträge: 10702
Registriert: So Aug 12, 2018 9:27 am
Wohnort: Frauenneuharting
Hat sich bedankt: 5303 Mal
Danksagung erhalten: 8685 Mal
Kontaktdaten:

#3

Beitrag 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
Zuletzt geändert von StefanW am Mo Nov 18, 2024 11:07 am, insgesamt 1-mal geändert.
Stefan Werner
Product Owner für Timberwolf Server, 1-Wire und BlitzART
Bitte WIKI lesen. Allg. Support nur im Forum. Bitte keine PN
Zu Preisen, Lizenzen, Garantie, HW-Defekt an service at elabnet dot de

Link zu Impressum und Datenschutzerklärung oben.
Benutzeravatar

Ersteller
jensgulow
Reactions:
Beiträge: 473
Registriert: Fr Apr 19, 2019 4:37 pm
Wohnort: Leipzig
Hat sich bedankt: 75 Mal
Danksagung erhalten: 206 Mal

#4

Beitrag von jensgulow »

Auf jeden Fall habe ich die entsprechende Zeile im Code ergänzt.
Viele Grüße

Jens

_____________________________________________________________________
TWS 2600#394 , TWS 3500L#1051, VPN offen, Reboot erlaubt
genutzt? -> TWS, KNX, 1-wire, MQTT, MODBUS, Http-REST-API, IFTTT, Enocean, Amazon Alexa

jhaeberle
Reactions:
Beiträge: 208
Registriert: Do Aug 24, 2023 11:07 am
Wohnort: Raum Augsburg
Hat sich bedankt: 86 Mal
Danksagung erhalten: 40 Mal

#5

Beitrag 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
TWS 3500XL, ID: 1409 (VPN offen, Reboot nach Rücksprache)
Benutzeravatar

Ersteller
jensgulow
Reactions:
Beiträge: 473
Registriert: Fr Apr 19, 2019 4:37 pm
Wohnort: Leipzig
Hat sich bedankt: 75 Mal
Danksagung erhalten: 206 Mal

#6

Beitrag 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.
Viele Grüße

Jens

_____________________________________________________________________
TWS 2600#394 , TWS 3500L#1051, VPN offen, Reboot erlaubt
genutzt? -> TWS, KNX, 1-wire, MQTT, MODBUS, Http-REST-API, IFTTT, Enocean, Amazon Alexa

jhaeberle
Reactions:
Beiträge: 208
Registriert: Do Aug 24, 2023 11:07 am
Wohnort: Raum Augsburg
Hat sich bedankt: 86 Mal
Danksagung erhalten: 40 Mal

#7

Beitrag 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
TWS 3500XL, ID: 1409 (VPN offen, Reboot nach Rücksprache)
Benutzeravatar

Ersteller
jensgulow
Reactions:
Beiträge: 473
Registriert: Fr Apr 19, 2019 4:37 pm
Wohnort: Leipzig
Hat sich bedankt: 75 Mal
Danksagung erhalten: 206 Mal

#8

Beitrag 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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Viele Grüße

Jens

_____________________________________________________________________
TWS 2600#394 , TWS 3500L#1051, VPN offen, Reboot erlaubt
genutzt? -> TWS, KNX, 1-wire, MQTT, MODBUS, Http-REST-API, IFTTT, Enocean, Amazon Alexa

jhaeberle
Reactions:
Beiträge: 208
Registriert: Do Aug 24, 2023 11:07 am
Wohnort: Raum Augsburg
Hat sich bedankt: 86 Mal
Danksagung erhalten: 40 Mal

#9

Beitrag von jhaeberle »

Ach krass! So einfach! Ich hatte jetzt eher mit einem Docker-Container gerechnet… DANKE!!!
TWS 3500XL, ID: 1409 (VPN offen, Reboot nach Rücksprache)
Benutzeravatar

Ersteller
jensgulow
Reactions:
Beiträge: 473
Registriert: Fr Apr 19, 2019 4:37 pm
Wohnort: Leipzig
Hat sich bedankt: 75 Mal
Danksagung erhalten: 206 Mal

#10

Beitrag 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....
Viele Grüße

Jens

_____________________________________________________________________
TWS 2600#394 , TWS 3500L#1051, VPN offen, Reboot erlaubt
genutzt? -> TWS, KNX, 1-wire, MQTT, MODBUS, Http-REST-API, IFTTT, Enocean, Amazon Alexa
Antworten

Zurück zu „Logikengine & Logik-Editor“