Berechneten Datenpunkt erstellen und stündlich automatisch füllen

Das Langzeitarchiv für HomeMatic

Moderator: Co-Administratoren

Antworten
Benutzeravatar
wak
Beiträge: 262
Registriert: 05.05.2014, 00:21
Hat sich bedankt: 2 Mal
Danksagung erhalten: 32 Mal

Berechneten Datenpunkt erstellen und stündlich automatisch füllen

Beitrag von wak » 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:

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."
  }
}
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.

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")}"

  }

}
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

Benutzeravatar
wak
Beiträge: 262
Registriert: 05.05.2014, 00:21
Hat sich bedankt: 2 Mal
Danksagung erhalten: 32 Mal

Re: Berechneten Datenpunkt erstellen und stündlich automatisch füllen

Beitrag von wak » 29.03.2024, 23:30

Hallo Mathias,

sorry, habe jetzt erst bemerkt, das es einen Unterschied gibt zwischen Scriptumgebung und ccu-historian.config Script Engine.

Bekomme beim obigen script folgende Fehlermeldung wenn in der ccu-historian.config eingetragen ist:

Code: Alles auswählen

2024-03-29 23:15:01|SEVERE |Detail: groovy.lang.MissingMethodException: No signature of method: groovy.lang.Binding.dataPoint() is applicable for argument types: (Integer) values: [1083]
	at Config$_run_closure2.doCall(Config:423)
	at Config$_run_closure2.doCall(Config)
	at mdz.ccuhistorian.DatabaseSystem$_executeTask_closure2$_closure5.doCall(DatabaseSystem.groovy:106)
	at mdz.ccuhistorian.DatabaseSystem$_executeTask_closure2$_closure5.call(DatabaseSystem.groovy)
	at mdz.Exceptions.lambda$0(Exceptions.java:84)
	at mdz.Exceptions.catchToLog(Exceptions.java:74)
	at mdz.Exceptions.catchToLog(Exceptions.java:84)
	at mdz.ccuhistorian.DatabaseSystem$_executeTask_closure2.doCall(DatabaseSystem.groovy:105)
	at mdz.ccuhistorian.DatabaseSystem$_executeTask_closure2.call(DatabaseSystem.groovy)
Sieht so aus das einige Klassen nicht verwendet werden dürfen! Kann man das angleichen, oder muß das so bleiben ?

LG Walter

Mathias
Beiträge: 1797
Registriert: 03.11.2010, 10:25
System: CCU
Wohnort: Aachen
Hat sich bedankt: 58 Mal
Danksagung erhalten: 262 Mal
Kontaktdaten:

Re: Berechneten Datenpunkt erstellen und stündlich automatisch füllen

Beitrag von Mathias » 30.03.2024, 12:16

Hallo Walter,
das kann ich angleichen. Es war auch schon so gedacht. Ich schaue mal, dass ich kurzfristg eine neue Version raus gebe.
Gruß
Mathias

Benutzeravatar
wak
Beiträge: 262
Registriert: 05.05.2014, 00:21
Hat sich bedankt: 2 Mal
Danksagung erhalten: 32 Mal

Re: Berechneten Datenpunkt erstellen und stündlich automatisch füllen

Beitrag von wak » 30.03.2024, 18:49

Hallo Mathias,

danke fürs prüfen, ist nicht stressig, einfach bei der nächsten Version mitziehn!
LG wak

Antworten

Zurück zu „CCU-Historian“