Der Code einer Customlogik besteht immer aus 4 notwendigen Abschnitten (Input, Output, Level und Module) und 1 optionalen Abschnitt (Meta).
Ich finde soweit ist es erstmal sehr nah an vielen Programmier- oder Script-Sprachen und sichrlich für Jedermann nachvollziehbar. Wichtig ist, das man versteht, dass in den Input und Output Abschnitten keine Variablen deklariert werden, sondern diese lediglich mit der richtigen Variablen verschaltet werden. Die Variablen dazu müssen aber im Abschnitt Level deklariert werden!
Wenn man dieses Prinzip verstanden hat, ist meines Erachtes schon der erste Schrecken einer Customlogik verkloren. Zumindest erging es mir so.
Und wenn man nun eine Logik modifizieren möchte, dann muss man sich zunächst überlegen, wo es alles Änderungen braucht.
) die Ergänzung vornehmen möchte, dass es einen zusätzlichen Eingang gibt, durch den man den Ablauf der Logik verhindern kann. Es bietet sich an, diesen Eingang Inhibit zu nennen, weil es dann genauso aussieht, wie bei Standardlogiken!
Nach kurzer Überlegung ist einem klar, dass es nun also folgende Ergänzungen braucht
Man muss jetzt also lediglich genau die drei Zeilen an den richtigen Stellen einfügen.
Die Positionen in den Abschnitten Level und Input sind egal, man muss lediglich bedenken, dass nach jeder Zeile (bis auf die letzte Zeile!!!) jeweils ein "," (Komma) als Trennungszeichen angefügt wird.
Das Break bietet sich in diesem Beispiel an erster Stelle im Abschnitt Module an. Und dann braucht es hier natürlich ein Komme am Ende.
So sieht das Ergebnis dann aus (im Kommentar habe ich ergänzt, dass es nun die V1.3 ist):
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.
* Über "Zyklischer Sendeinterval [s]" kann eingestellt werden, ob der Ausgang zyklisch geschrieben werden soll. Wenn nein = 0, niedriges Werte sollten z.B. zur Schonung des KNX-Bus vermieden werden. 900 = 15 Minuten und stellt vermutlich in den meisten Fällen ein ausreichende Minumum dar. Der Wert 3600 sendet den Ausgang folglich 1x je Stunde und zusätzlich bei Änderung.
*
* 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 (29.09.2020): optionaler Inhibit-Eingänge (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.3",
"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"],
["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
],
"Output": [
["Zeitfenster aktiv","Aktuelle Zeit ist im Zeitfenster", "$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],
["$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],
["$VAR<Inhibit?>","bool",false]
],
"Module": [
["Break",["$VAR<Inhibit?>"]],
// 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"]],
// 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"]
]
}