ich habe bei der Jalousie-Steuerung die Herausforderung gehabt, dass ich einen Logikbaustein vermisst habe, der mir in einem definierten Zeitintervall TRUE liefert (z.B. von 8 bis 22 Uhr), außerhalb des Zeitfenster aber FALSE.
Beispiel für eine Anwendung: Ich will die Jalousiesteuerung helligkeitsabhängig machen, vor 8 Uhr sollen die Jalousien aber nicht hochfahren, auch wenn es draußen schon hell ist.
Hierfür habe ich folgende CustomLogik programmiert, die ich gerne zur Verfügung stelle. Feedback und Verbesserungsvorschläge sind willkommen.
Nach dem Speichern müssen erst noch alle Eingänge auf Parameter umgestellt werden, das geht leider (bisher) nicht per default (siehe auch hier).
Hier die Quellcode:
Code: Alles auswählen
/**
* Zeitfenster
* Der Logikbaustein sendet TRUE, wenn die aktelle Uhrzeit zwischen den beiden angegebenen Zeiten liegt.
* Davor und danach wird FALSE gesendet.
* Über Zyklus [s] kann gesteuert werden, wie oft die Prüfung stattfindet und der Ausgangswert ggfs.
* aktualisiert wird.
*
* Nutzungsrechts: 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."
*
* Erstellt am 12.08.2020 von Markus Großmann
*
* ChangeLog:
* V1.3 (17.12.2020): Baustein funktioniert auch, wenn das Zeitfenster über Mitternacht definiert ist, also wenn VON-Zeit > BIS-Zeit (edit Robosoc)
* V1.2 (13.08.2020): optionaler zyklischer Sendetakt, output parameter t statt c (edit Robosoc)
* V1.1 (13.08.2020): Ausgang wird nun sekundengenau geschaltet
* V1.0 (13.08.2020): Initial Release
*/
{
"_Meta": { // Optional
"Description": "Zeitfenster",
"Version": "1.2",
"Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
},
"Input": [
["Stunde von","Stunde von", "$h_from", "c"],
["Minute von","Minute von", "$m_from", "c"],
["Sekunde von","Sekunde von", "$s_from", "c"],
["Stunde bis","Stunde bis", "$h_to", "c"],
["Minute bis","Minute bis", "$m_to", "c"],
["Sekunde bis","Sekunde bis", "$s_to", "c"],
["Zyklischer Sendeinterval", "optionaler Sendetakt in Sekunden, 0 = deaktiv: Ausgang wird nur bei Änderung gesendet, bei Wert > 0 wird der Ausgang zyklisch entrechend gesendet","$interval","c"]
],
"Output": [
["Ausgang","Wenn aktuelle Zeit im Zeitfenster, ausgang = 1, sonst 0", "$CurrIsInInterval", "t"]
],
"Level": [
["$ltime","integer", 0],
["$h_from","integer", 0],
["$m_from","integer", 0],
["$s_from","integer", 0],
["$h_to","integer", 0],
["$m_to","integer", 0],
["$s_to","integer", 0],
["$h_curr","integer", 0],
["$m_curr","integer", 0],
["$s_curr","integer", 0],
["$TimeFrom","integer",0],
["$TimeTo","integer",0],
["$TimeBufferNeg","integer",0],
["$TimeCurrent","integer",0],
["$CurrIsAfterFrom","bool", false],
["$CurrIsAfterTo","bool", false],
["$CurrIsInInterval","bool", false],
["$Const1","integer",1],
["$Const60","integer",60],
["$Const86400", "integer", 86400],
["$Period","integer",60],
["$ConstTRUE","bool", true],
["$SecondsTillFrom","integer",0],
["$SecondsTillTo","integer",0],
["$SecondsTillNext","integer",1],
["$SecondsTillFrom_GT_Zero", "bool", false],
["$SecondsTillTo_GT_Zero", "bool", false],
["$From_GT_To", "bool", false],
["$interval", "integer", 0],
["$Negieren", "bool", false]
],
"Module": [
// Aktuelle Uhrzeit
["Localtime",0,"$ltime","$s_curr","$m_curr","$h_curr",0,0,0,0,0,0],
["Polynomial", "$Const60", "$TimeCurrent", ["$s_curr","$m_curr","$h_curr"]],
// Zeit Von in Sekunden
["Polynomial", "$Const60", "$TimeFrom", ["$s_from","$m_from","$h_from"]],
// Zeit Bis in Sekunden
["Polynomial", "$Const60", "$TimeTo", ["$s_to","$m_to","$h_to"]],
// Prüfen, ob TimeFrom > TimeTo, sonst tauschen und Ausgang negieren
["Comparator", "$TimeFrom" , "$Negieren" , "$TimeTo" ],
["Latch","$TimeTo","$TimeBufferNeg","$Negieren",0],
["Latch","$TimeFrom","$TimeTo","$Negieren",0],
["Latch","$TimeBufferNeg","$TimeFrom","$Negieren",0],
// Wie lange noch bis Zeit von?
["Polynomial", "$Const1", "$SecondsTillFrom", ["$TimeFrom", "-$TimeCurrent"]],
["Comparator", "$Const1", "$SecondsTillFrom_GT_Zero", "$SecondsTillFrom"],
["Polynomial", "$SecondsTillFrom_GT_Zero", "$SecondsTillFrom", ["$SecondsTillFrom", "$Const86400"]],
// Wie lange noch bis Zeit bis?
["Polynomial", "$Const1", "$SecondsTillTo", ["$TimeTo", "-$TimeCurrent"]],
["Comparator", "$Const1", "$SecondsTillTo_GT_Zero", "$SecondsTillTo"],
["Polynomial", "$SecondsTillTo_GT_Zero", "$SecondsTillTo", ["$SecondsTillTo", "$Const86400"]],
// Was ist früher?
["Comparator", "$SecondsTillFrom" , "$From_GT_To" , "$SecondsTillTo" ],
["Multiplexer", ["$SecondsTillFrom", "$SecondsTillTo"],"$SecondsTillNext", "$From_GT_To"],
// Timer setzen
["Clocksignal","$ConstTRUE",0,"$SecondsTillNext"],
// zyklischer Sendetimer
["Clocksignal","$ConstTRUE",0,"$interval"],
// Ergebniswert berechnen
["Comparator", "$TimeFrom" , "$CurrIsAfterFrom" , "$TimeCurrent" ],
["Comparator", "$TimeTo" , "$CurrIsAfterTo" , "$TimeCurrent" ],
["And", ["-$CurrIsAfterFrom", "$CurrIsAfterTo"], "$CurrIsInInterval"],
["Latch","-$CurrIsInInterval","$CurrIsInInterval","$Negieren",0]
]
}
Viel Spaß damit.
Gruß
Markus