Habe jetzt eine Logik geschrieben, die jeweils am Ende eines Tages nur einmal triggert und dann ermittelt, welche Werte geschrieben werden sollen. So wie sie jetzt ist, kann sie die ersten 8 Werte noch nicht zyklisch schreiben. Da bin ich mir noch immer nicht ganz sicher ob das eine gute Idee ist, weil man dann ja auch immer in eine angeschlossene Zeitreihe schreibt.
- Korrektes Verhalten in Schaltjahren (es wird am 29ten geschrieben und nicht am 28ten)
- Nur einmaliges Triggern an jedem Kalender-Tag (egal ob Jahresende, Monatsende, Wochen-Ende oder nur ein beliebiger Tag im Jahr).
- sie schreibt aktuell um 23:59:59...das könnte bei Verwendung mit vielen Zählern dazu führen, dass ein Wert auch mal nach Mitternacht in eine Zeitreihe geschrieben wird.
Code: Alles auswählen
/**
* Zähler Universalbaustein V2
* 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.
*/
{
"Input":[
["Zähler","Kontinuierlicher Zähler","$Counter","A"] ],
"Output":[
["Zähler Vortag","Zählerstand zum Ende des vorherigen Tages","$End_D","X"],
["Zähler Vorwoche","Zählerstand zum Ende der vorherigen Woche","$End_W","X"],
["Zähler Vormonat","Zählerstand zum Ende des vorherigen Monats","$End_M","X"],
["Zähler Vorjahr","Zählerstand zum Ende des vorherigen Jahres","$End_Y","X"],
["Verbrauch Vortag","Verbrauch des letzten Tages","$Consumption_PrevD","X"],
["Verbrauch Vorwoche","Verbrauch der letzten Woche","$Consumption_PrevW","X"],
["Verbrauch Vormonat","Verbrauch des letzten Monats","$Consumption_PrevM","X"],
["Verbrauch Vorjahr","Verbrauch des letzten Jahres","$Consumption_PrevY","X"],
["Verbrauch Aktueller Tag","Verbrauch des aktuellen Tages bisher","$Consumption_CurrD","C"],
["Verbrauch Aktuelle Woche","Verbrauch der aktuellen Woche bisher","$Consumption_CurrW","C"],
["Verbrauch Aktueller Monat","Verbrauch des aktuellen Monats bisher","$Consumption_CurrM","C"],
["Verbrauch Aktuelles Jahr","Verbrauch des aktuellen Jahres bisher","$Consumption_CurrY","C"]
],
"Level":[
["$Cron_D","string","59 59 23 * * *"],
["$HalfDayinSec","integer",43200],
["$Formula_Tomorrow","string","X1+X2"],
["$Formula_End_of","string","X1=1?1:0"],
["$Today_Utime","integer",0],
["$Today_Wday","integer",0],
["$Tomorrow_Utime","integer",0],
["$Tomorrow_Mday","integer",0],
["$Tomorrow_Yday","integer",0],
["$SendCond_D","bool",false],
["$SendCond_W","bool",false],
["$SendCond_M","bool",false],
["$SendCond_Y","bool",false],
["$Eins","integer",1],
["$True","bool",true],
["$Counter","float",0.0],
["$End_D","float",0.0],
["$End_W","float",0.0],
["$End_M","float",0.0],
["$End_Y","float",0.0],
["$Consumption_PrevD","float",0.0],
["$Consumption_PrevW","float",0.0],
["$Consumption_PrevM","float",0.0],
["$Consumption_PrevY","float",0.0],
["$Consumption_CurrD","float",0.0],
["$Consumption_CurrW","float",0.0],
["$Consumption_CurrM","float",0.0],
["$Consumption_CurrY","float",0.0],
["$Formula","string","X2>0?X1-X2:0"],
["$Gate","bool",true]
],
"Module":[
//täglich am Ende des Tages triggern
["Cron","$True","$SendCond_D",0,"$Cron_D"],
// Werte des aktuellen Tages bestimmen
["Localtime",0,"$Today_Utime",0,0,0,0,0,0,"$Today_Wday",0,0],
// Werte des Folgetages bestimmen
["CalcFormula",["$Today_Utime","$HalfDayinSec"], "$Tomorrow_Utime", "$Formula_Tomorrow"],
["Localtime","$Tomorrow_Utime",0,0,0,0,"$Tomorrow_Mday",0,0,0,"$Tomorrow_Yday",0],
//Tageswerte schreiben
//Berechnung des aktuellen Verbrauches in der Periodenende
["CalcFormula",["$Counter","$End_D"], "$Consumption_CurrD", "$Formula"],
//Setzen und Senden des Periodenende, wenn Bedingung erfüllt
["Latch","$Counter","$End_D","$SendCond_D",1],
["SendExplicit","$SendCond_D","$End_D",0],
//Setzen und Senden des Periodenendverbrauches, wenn Bedingung erfüllt
["Comparator" , "$End_D" , "$Gate" , 0],
["And",["$Gate","$SendCond_D"],"$SendCond_D"],
["Latch","$Consumption_CurrD","$Consumption_PrevD","$SendCond_D",1],
["SendExplicit","$SendCond_D","$Consumption_PrevD",0],
//Wochenwerte schreiben
//Berechnung des aktuellen Verbrauches in der Periodenende
["CalcFormula",["$Counter","$End_W"], "$Consumption_CurrW", "$Formula"],
//Prüfen ob das Ende einer Woche (also Sonntag-Abend) erreicht ist und ob die Logik wegen des Periodenendes getriggert wurde
["Comparator" , "$Today_Wday" , "-$SendCond_W" , 0],
["And",["$SendCond_D","$SendCond_W"],"$SendCond_W"],
//Setzen und Senden des Periodenende, wenn Bedingung erfüllt
["Latch","$Counter","$End_W","$SendCond_W",1],
["SendExplicit","$SendCond_W","$End_W",0],
//Setzen und Senden des Periodenendverbrauches, wenn Bedingung erfüllt
["Comparator" , "$End_W" , "$Gate" , 0],
["And",["$Gate","$SendCond_W"],"$SendCond_W"],
["Latch","$Consumption_CurrW","$Consumption_PrevW","$SendCond_W",1],
["SendExplicit","$SendCond_W","$Consumption_PrevW",0],
//Monatswerte schreiben
//Berechnung des aktuellen Verbrauches in der Periodenende
["CalcFormula",["$Counter","$End_M"], "$Consumption_CurrM", "$Formula"],
//Prüfen ob das Ende eines Monats erreicht ist und ob die Logik wegen des Periodenendes getriggert wurde
["Comparator" , "$Tomorrow_Mday" , "-$SendCond_M" , "$Eins"],
["And",["$SendCond_D","$SendCond_M"],"$SendCond_M"],
//Setzen und Senden des Periodenende, wenn Bedingung erfüllt
["Latch","$Counter","$End_M","$SendCond_M",1],
["SendExplicit","$SendCond_M","$End_M",0],
//Setzen und Senden des Periodenendverbrauches, wenn Bedingung erfüllt
["Comparator" , "$End_M" , "$Gate" , 0],
["And",["$Gate","$SendCond_M"],"$SendCond_M"],
["Latch","$Consumption_CurrM","$Consumption_PrevM","$SendCond_M",1],
["SendExplicit","$SendCond_M","$Consumption_PrevM",0],
//Jahreswerte schreiben
//Berechnung des aktuellen Verbrauches in der Periodenende
["CalcFormula",["$Counter","$End_Y"], "$Consumption_CurrY", "$Formula"],
//Prüfen ob das Ende eines Jahres erreicht ist und ob die Logik wegen des Periodenendes getriggert wurde
["Comparator" , "$Tomorrow_Yday" , "-$SendCond_Y" , "$Eins"],
["And",["$SendCond_D","$SendCond_Y"],"$SendCond_Y"],
//Setzen und Senden des Periodenende, wenn Bedingung erfüllt
["Latch","$Counter","$End_Y","$SendCond_Y",1],
["SendExplicit","$SendCond_Y","$End_Y",0],
//Setzen und Senden des Periodenendverbrauches, wenn Bedingung erfüllt
["Comparator" , "$End_Y" , "$Gate" , 0],
["And",["$Gate","$SendCond_Y"],"$SendCond_Y"],
["Latch","$Consumption_CurrY","$Consumption_PrevY","$SendCond_Y",1],
["SendExplicit","$SendCond_Y","$Consumption_PrevY",0]
]
}