Berechneten Datenpunkt erstellen und stündlich automatisch füllen
Verfasst: 29.03.2024, 17:26
Hallo Historian-Freunde,
da wir jetzt nach dem Osterputz wieder Platz in der Datenbank haben, wollte ich jetzt mal die Script Möglichkeiten für Expression nutzen.
Eigentlich wollte ich es direkt in HighChart nutzen, bin jetzt aber erstmal den einfachen Weg gegangen.
Die Aufgabe war eine HighChart-Grafik mit berechneten Zeitreihen zu erstellen.
Dafür habe ich mir zuerst mal einen neuen User-Datenpunkt angelegt:
Die Überlegung für den berechneten Wert, war Zähler 1 minus Zähler 2 auf stündliche Durchschnittswerte und dies für die letzten 7 Tage.
Das Script soll jede Stunde laufen und zuerst die alte Berechnung löschen.
Was raus kam war folgendes das ich in meiner ccu-historian.config am Ende hinzugefügt habe, damit es stündlich automatisch läuft.
Nach dem ersten Lauf von beiden, konnte ich in HighChart den neuen Datenpunkt finden und die Zeitreihe schön darstellen!
Wiki für Script Funktionen: https://github.com/mdzio/ccu-historian/ ... r%C3%BCcke
WIKI für Expressions: https://github.com/mdzio/ccu-historian/ ... on-ab-v340
Vielleicht kann es ja der einer oder andere nutzen und Mathias falls du willst, kannst du das Beispiel auch gerne ins Wiki aufnehmen.
LG wak
da wir jetzt nach dem Osterputz wieder Platz in der Datenbank haben, wollte ich jetzt mal die Script Möglichkeiten für Expression nutzen.
Eigentlich wollte ich es direkt in HighChart nutzen, bin jetzt aber erstmal den einfachen Weg gegangen.
Die Aufgabe war eine HighChart-Grafik mit berechneten Zeitreihen zu erstellen.
Dafür habe ich mir zuerst mal einen neuen User-Datenpunkt angelegt:
Code: Alles auswählen
// *** Benutzerdatenpunkt anlegen V1.0.0 ***
// Für Benutzerdatenpunkte muss immer die Schnittstelle "User" verwendet werden.
createDataPoint("User", "000001:1", "COUNTER") {
// Eigenschaften setzen.
attributes.displayName="Stromzähler Summe"
attributes.room="CalcRoom"
attributes.function="CalcFunc"
attributes.comment="Über Script berechnete Werte"
// Messbereich und Einheit setzen.
attributes.maximum=999999999
attributes.unit="kWh"
attributes.minimum=0
// Folgende Typen sind zulässig: FLOAT, STRING, BOOL, ACTION, ALARM, INTEGER, ENUM
attributes.type="FLOAT"
// Bei stetigen Messwerten auf true setzen (z.B. Zähler, Temperatur, Füllstand) und bei
// unstetigen auf false setzen (z.B. Schalter, Aufzählung).
continuous=true
// Zyklisches Aktualisieren der Meta-Informationen aus der CCU abschalten.
// Ansonsten werden die obigen Einstellungen irgendwann wieder überschrieben.
noSynchronization=true
historyDisabled=false
historyHidden=false
}
// *** Skript ***
def createDataPoint(interfaceId, address, identifier, configure) {
def id=new DataPointIdentifier(interfaceId, address, identifier)
def dp=database.getDataPoint(id)
def exists=(dp!=null)
if (!exists) {
dp=new DataPoint(id: id)
}
configure.delegate=dp
configure.resolveStrategy=Closure.DELEGATE_ONLY
configure()
dp.historyString=(dp.attributes.type=="STRING")
if (exists) {
database.updateDataPoint(dp)
println "Datenpunkt $id wurde aktualisiert."
} else {
database.createDataPoint(dp)
println "Datenpunkt $id wurde neu angelegt."
}
}
Das Script soll jede Stunde laufen und zuerst die alte Berechnung löschen.
Was raus kam war folgendes das ich in meiner ccu-historian.config am Ende hinzugefügt habe, damit es stündlich automatisch läuft.
Code: Alles auswählen
database.tasks.CalcUser1.enable=true
database.tasks.CalcUser1.cron="0 0 * * * ?"
database.tasks.CalcUser1.script={
// berechnete Zeitreihe löschen und neu berechnen v1
def id=new DataPointIdentifier("User", "000001:1", "COUNTER")
def dp=database.getDataPoint(id)
if (dp!=null) {
def txt="Berechnung: "+dp.displayName+" ("+dp.idx+") -> "
// alte Zeitreihe komplett löschen
def cnt = database.deleteTimeSeries(dp, null, null)
def tage=30
def end=new Date()
def begin=new Date() - tage
def a1=dataPoint(1083) // 1. Datenreihe von IDX 1083 STROM_Z1_W
def a2=dataPoint(1075) // 2. Datenreihe von IDX 1075 STROM_HZ_W
// Berechnung: 1. - 2. dann stündlicher Druchschnitt
def a3=(a1-a2).average(hourly())
// neue berechnete Zeitreihe erstellen
def timeSeries=new TimeSeries(dp)
// lesen/berechnen für den gewünschten Zeitraum
a3.read(begin, end).each{row ->
row.value = Math.round(row.value*100.0)/100.0 // berechneten Wert runden
timeSeries.add(row)
// println txt+" "+row
}
// neue berechnete Zeitreihe auf Datenbank schreiben
def cntNew=database.insertTimeSeries(timeSeries)
print txt+"alte Zeitreihe gelöscht ($cnt) neue geschreiben ($cntNew)"
println " ${begin.format("dd.MM.YYYY")} - ${end.format("dd.MM.YYYY")}"
}
}
Wiki für Script Funktionen: https://github.com/mdzio/ccu-historian/ ... r%C3%BCcke
WIKI für Expressions: https://github.com/mdzio/ccu-historian/ ... on-ab-v340
Vielleicht kann es ja der einer oder andere nutzen und Mathias falls du willst, kannst du das Beispiel auch gerne ins Wiki aufnehmen.
LG wak