Wie hier (viewtopic.php?f=24&t=2527) versprochen, möchte ich hier einen ersten Baustein für eine Zeitschaltuhr teilen.
Funktion:
Der Baustein schaltet zur jeweiligen Uhrzeit Ein/Aus. Über einen Freigabe-Eingang kann das Schalten jederzeit unterbrochen / fortgesetzt werden.
Die Uhrzeiten können fix hinterlegt werden oder über entsprechende (KNX-)Objekte (getrennt für h, min, sec jeweils für ein/aus) mit der Visu verbunden werden (siehe HInweise zu Persistenz/Rebootverhalten weiter unten).
- Die Sommer/Winterzeitumstellung wird korrekt berücksichtig. Für Schaltzeiten zwischen 2:00 und 3:00 wird bei Umstellung auf Sommerzeit um 2:00 geschaltet (es gibt die Zeit zwischen 2:00 und 3:00 nicht), bei Umstellung auf Winterzeit wird in der Stunde 2A (das ist der erste Durchlauf von 2.00 bis 3:00) geschaltet.
- Über eine zusätzlichen Trigger (einfach mit dem "+" hinzufügen), kann die Logik den aktuellen Zustand auch zyklisch senden.
- Der Baustein schaltet exakt zur Sekunde (eventuell mit wenigen ms Abweichung), siehe Screenshot.
Von der klassischen Weihnachtsbeleuchtung bis hin zu Zeitfenstern für Beschattung etc.
Eingänge:
- Einschalten Stunde/Minute/Sekunde: Damit wird die Einschaltzeit festgelegt. Es können feste Werte per Parameter hinterlegt werden oder eine Objektverknüpfung verwendet werden.
- Ausschalten Stunde/Minute/Sekunde: Damit wird die Ausschaltzeit festgelegt.
- Freigabe/Enable: Mit diesem Eingang kann die Zeitschaltuhr aktiviert/deaktiviert werden. Damit kann zB für's Wochenende eine 2. ZSU mit anderen Schaltzeiten angelegt werden. Die beiden ZSU müssen dann wechselseitig aktiviert/gesperrt werden.
- Schaltausgang: Sendet beim Einschalten ein EIN und beim Ausschalten ein AUS. Wird ein zyklischer Trigger verwendet, muss die Sendeoption auf "ct" gesetzt sein!
Werden die Uhrzeiten mit einer Visu verknüpft ist sicherzustellen, dass die Werte auch nach einem Reboot des Servers oder Neustart der Visu korrekt gelesen werden können. Dazu bitte wie folgt vorgehen:
- Persistenz am ZSU Baustein aktivieren.
- L-Flag an den KNX-Objekten für die Schaltzeiten aktivieren, Das Initread-Flag muss deaktiviert sein!
- Den Baustein "Senden nach Reboot" verwenden. Es müssen alle Werte die ausschließlich über die Visu verknüpft sind in diesem Baustein gespeichert werden. Nach einem Reboot sendet dieser Bausteine die Werte neu auf den Bus. Damit sind die Einstellungen an der Visu und im ZSU-Baustein wieder synchron.
Nutzungsrechte:
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.
Falls wer einen freiwilligen Beitrag zur Motivation leisten will: Klick
Viel Spaß damit und gerne Rückmeldung, wenn was fehlt oder euch die Sache gefällt.
Robert
Der Baustein:
Code: Alles auswählen
/**===========================================================
Kommentar
============================================================*/
{
"Level":[
["$I_hour_on","integer",0],
["$I_min_on","integer",0],
["$I_sec_on","integer",0],
["$I_hour_off","integer",0],
["$I_min_off","integer",0],
["$I_sec_off","integer",0],
["$I_Enable","bool",false],
//
["$Output","bool",false],
//
["$Time_on","integer",0],
["$Time_off","integer",0],
["$Time_act","integer",0],
//
["$Utime","integer",0],
["$Utime_Midnight1","integer",0],
["$Utime_Midnight2","integer",0],
["$Utime_NextMidnight","integer",0],
["$Utime_on","integer",0],
["$Utime_on_mod","integer",0],
["$Utime_on_tomorrow","integer",0],
["$Utime_off","integer",0],
["$Utime_off_mod","integer",0],
["$Utime_off_tomorrow","integer",0],
["$Utime_Ref","integer",0],
["$Utime_temp","integer",0],
["$Utime_hour","integer",0],
["$Utime_min","integer",0],
["$Utime_sec","integer",0],
["$LengthOfDay","integer",0],
//
["$Set_Utime_Midnight","bool",false],
["$Set_on","bool",false],
["$Set_off","bool",false],
["$SetCase1","bool",false],
["$SetCase2","bool",false],
["$Set","bool",false],
["$Set_on_tomorrow","bool",false],
["$Set_off_tomorrow","bool",false],
["$Wake_on","bool",false],
["$Wake_off","bool",false],
// Init nach Reboot
["$Enable","bool",false],
["$State","bool",false],
["$StateOut","bool",false],
["$Delay","float",5.0],
["$Set_DST_on","bool",false],
["$Set_DST_off","bool",false],
["$SelectDST_Winter1","bool",false],
["$SelectDST_Winter2","bool",false],
["$SelectDST_Summer1","bool",false],
["$SelectDST_Summer2","bool",false],
["$SelectDST_hour_on","bool",false], // ein nach 2
["$SelectDST_hour_off","bool",false], // aus nach 2
["$SelectDST_hour_on2","bool",false], // ein nach 3
["$SelectDST_hour_off2","bool",false], // aus nach 3
["$Select_DST_on","integer",0],
["$Select_DST_off","integer",0],
["$Corr_DST_on","integer",0],
["$Corr_DST_off","integer",0],
["$Corr_2_on","integer",3600],
["$Corr_2_off","integer",3600],
["$Temp_Float","integer",0.0],
["$Konst3","integer",3],
["$Konst2","integer",2],
["$Konst1","integer",1],
["$Konst0","integer",0],
["$Konst60","integer",60],
["$Konst86400","integer",86400],
["$Konst3600","integer",3600],
["$Konst7200","integer",7200],
["$Konst10800","integer",10800],
["$Konst1_","float",1.0],
["$Konst0_","float",0.0],
["$KonstTrue","bool",true],
["$KonstFalse","bool",false],
["$Cron_Midnight","string","0 0 0 * * *"]
],
"Module":[
// Logik beim speichern bzw. Reboot Aufrufen
["Latch","$StateOut","$State","$KonstTrue",0],
["Clocksignal","-$State",0,"$Delay"],
// State nach Start auf 1 setzen und Clocksignal deaktivieren
["Latch","$KonstTrue","$StateOut","-$State",0],
// Aktuelle Zeit ermitteln
["Localtime",0,"$Utime","$Utime_sec","$Utime_min","$Utime_hour",0,0,0,0,0,0],
// Letztes Mitternacht berechnen
["Polynomial", "$Konst60", "$Utime_temp",["$Utime", "-$Utime_min","-$Utime_hour"]],
["Polynomial", "$Konst1", "$Utime_Midnight1",["$Utime_temp", "-$Utime_sec"]],
// Letztes Mitternacht merken da utime dem cron nachhinkt.
["Latch","$Utime_NextMidnight","$Utime_Midnight2","$KonstTrue",0],
// Zu Mitternacht triggern und Tageslänge ermitteln
["Cron","$KonstTrue","$Set_Utime_Midnight","$Utime_NextMidnight","$Cron_Midnight"],
["Latch","$Utime_Midnight2","$Utime_Midnight1","$Set_Utime_Midnight",0],
// Tageslänge auswerten für Erkennung Sommer/winterzeit Umstellung
["Polynomial", "$Konst1", "$LengthOfDay",["$Utime_NextMidnight", "-$Utime_Midnight1"]],
// Tag länger als 24h => Umstellung auf Winterzeit
["Comparator", "$LengthOfDay", "$SelectDST_Winter1", "$Konst86400"],
// Tag kürzer als 24h => Umstellung auf Sommerzeit
["Comparator", "$Konst86400", "$SelectDST_Summer1", "$LengthOfDay"],
["Polynomial", "$Konst60", "$Time_on",["$I_sec_on", "$I_min_on","$I_hour_on"]],
["Polynomial", "$Konst60", "$Time_off",["$I_sec_off", "$I_min_off","$I_hour_off"]],
["Polynomial", "$Konst60", "$Time_act",["$Utime_sec", "$Utime_min","$Utime_hour"]],
// ON/OFF liegt zwischen 2 und 3
["Limiter","$Time_on","$Temp_Float","$SelectDST_hour_on",["$Konst7200", "$Konst10800"]],
["Limiter","$Time_off","$Temp_Float","$SelectDST_hour_off",["$Konst7200", "$Konst10800"]],
// ON/OFF >= 3:00
["Comparator", "$Konst10800", "-$SelectDST_hour_on2", "$Time_on"],
["Comparator", "$Konst10800", "-$SelectDST_hour_off2", "$Time_off"],
// Und nur bei Aufrufen vor 2:00 korrigieren
["Comparator", "$Time_act", "-$SelectDST_Summer2", "$Konst7200"],
["And" , ["$SelectDST_Summer1","$SelectDST_hour_on","$SelectDST_Summer2"], "$Set_DST_on"],
["And" , ["$SelectDST_Summer1","$SelectDST_hour_off","$SelectDST_Summer2"], "$Set_DST_off"],
// Wenn bei Sommerzeitumstellung Schaltzeit zwischen 2:00 und 3:00 liegt, dann zusätzliche Korrektur auf 2:00
["Polynomial", "$Konst60", "$Corr_2_on",["$I_sec_on", "$I_min_on"]],
["Polynomial", "$Konst60", "$Corr_2_off",["$I_sec_off", "$I_min_off"]],
["BinaryMultiplexer",["$SelectDST_hour_on","$SelectDST_hour_on2","-$Set_DST_on"],"$Select_DST_on"],
["Multiplexer",["$Konst0","-$Corr_2_on","-$Konst3600","-$Corr_2_on","$Konst0","$Konst0","$Konst0","$Konst0" ],"$Corr_DST_on","$Select_DST_on"],
// Und nur bei Aufrufen vor erstmals 3:00 korrigieren, beim 2. Durchlauf von 2:00-3:00 ist die Berechnung der Tageslänge bereits wieder 24h => keine Korrektur
["Comparator", "$Time_act", "-$SelectDST_Winter2", "$Konst10800"],
["And" , ["$SelectDST_Winter1","$SelectDST_hour_on2","$SelectDST_Winter2"], "$Set_DST_on"],
["And" , ["$SelectDST_Winter1","$SelectDST_hour_off2","$SelectDST_Winter2"], "$Set_DST_off"],
["Latch","$Konst3600","$Corr_DST_on","$Set_DST_on",0],
["Latch","$Konst3600","$Corr_DST_off","$Set_DST_off",0],
// Weckzeit ON berechnen
["Polynomial", "$Konst60", "$Utime_temp",["$Utime_Midnight1", "$I_min_on","$I_hour_on"]],
["Polynomial", "$Konst1", "$Utime_on",["$Utime_temp", "$I_sec_on"]],
["Polynomial", "$Konst1", "$Utime_on_mod",["$Utime_on", "$Corr_DST_on"]],
// Schaltzeit liegt in der Vergangenheit? Gilt nicht zum Schaltzeitpunkt!
["Comparator", "$Utime", "$Set_on_tomorrow", "$Utime_on_mod"],
["Polynomial", "$Konst1", "$Utime_on_tomorrow",["$Utime_on_mod", "$Konst86400"]],
["Latch","$Utime_on_tomorrow","$Utime_on_mod","$Set_on_tomorrow",0],
// Weckzeit OFF berechnen
["Polynomial", "$Konst60", "$Utime_temp",["$Utime_Midnight1", "$I_min_off","$I_hour_off"]],
["Polynomial", "$Konst1", "$Utime_off",["$Utime_temp", "$I_sec_off"]],
["Polynomial", "$Konst1", "$Utime_off_mod",["$Utime_off", "$Corr_DST_off"]],
// Schaltzeit liegt in der Vergangenheit? Gilt nicht zum Schaltzeitpunkt!
["Comparator", "$Utime", "$Set_off_tomorrow", "$Utime_off_mod"],
["Polynomial", "$Konst1", "$Utime_off_tomorrow",["$Utime_off_mod", "$Konst86400"]],
["Latch","$Utime_off_tomorrow","$Utime_off_mod","$Set_off_tomorrow",0],
// Wecker auswertern => Liefert true, wenn Wakeup getriggert hat, danach unmittelbar wieder false, da die Weckzeit auf den nächsten Tag vorgesetzt wird.
["Wakeup","$Utime_on_mod","$Wake_on"],
["Wakeup","$Utime_off_mod","$Wake_off"],
["Latch","$KonstTrue","$Output","$Wake_on",1],
["Latch","$KonstFalse","$Output","$Wake_off",1]
],
"Input":[
["Einschalten Stunde","Input","$I_hour_on","c"],
["Einschalten Minute","Input","$I_min_on","c"],
["Einschalten Sekunde","Input","$I_sec_on","c"],
["Ausschalten Stunde","Input","$I_hour_off","c"],
["Ausschalten Minute","Input","$I_min_off","c"],
["Ausschalten Sekunde","Input","$I_sec_off","c"],
["Enable","Input","$I_Enable","c"]
],
"Output":[
["Schaltausgang","Output","$Output","c"]
]
}
/**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. */