Seite 1 von 1

influxdb: openHAB rule -> flux task

Verfasst: 10. Aug 2023 10:02
von nw378
Hallo,

ich habe meine InfluxDB erfolgreich von 1.8.2 auf 2.7.1 upgedatet und meine, die Grundzüge der Flux Sprache zu verstehen.

Ich habe vor, den Bucket, in den openHAB persistiert, mit einer Retentiontime von 30 Tagen einzustellen, um den gigantischen Datenmüll über Board zu werfen.
Ich habe Tasks erstellt, die die Langzeitdaten downsamplen und in einen zweiten Bucket speichern. Funktioniert.

Nun zu meinem Problem: ich habe eine OH rule, die den Stromverbrauch den aktuellen Monats mit dem des Vorjahres vergleicht und als Prozentwert ausgibt. Nur kann OH nun nicht mehr auf die Altdaten in dem Langzeit-Bucket zugreifen.

Nach Netz-Recherche kann man OH wohl nicht so konfigurieren, dass es auf zwei Buckets zugreifen kann. (oder doch?)

Also habe ich mir überlegt, diese Regel per Flux Task ausführen zulassen und die Ergebnisse in den Kurzzeit-Bucket zu speichern. Beim Übersetzen breche ich mir aber die Ohren.

Sind hier Influx-Profis, die mir unter die Arme greifen können?

Die OH-Rule:

Code: Alles auswählen

rule "Vergleich Vorjahr"
when Time cron "* 0 * * * ?" then 
    val Number strm_vjm_float = (((Stromzaehler_kWh.historicState(now.minusDays(365), "influxdb").state as Number) - (Stromzaehler_kWh.historicState(now.minusDays(395), "influxdb").state as Number)))
    val int strm_vjm_int = strm_vjm_float.intValue
    val Number strm_mnt_float = (Stromzaehler_kWh.deltaSince(now.minusDays(30))) 
    val int strm_mnt_int = strm_mnt_float.intValue
    strm_mnt.postUpdate(strm_mnt_int)
    strm_vjm.postUpdate(strm_vjm_int)
    var strm_label = ((strm_mnt_float / strm_vjm_float) *100 - 100)
    strom_lbl.postUpdate(strm_label)
end
Ergänzung, mein bisheriger Ansatz sah so aus; spuckt aber einen Fehler beim Berechnen des 30-Tage Deltas aus:

Code: Alles auswählen

option task = {
  name: "VergleichVorjahr",
  every: 1h, 
}

from(bucket: "openHAB_history")
  |> range(start: -1y) 
  |> filter(fn: (r) => r._measurement == "Stromzaehler_kWh")
  |> filter(fn: (r) => r._field == "value") 


  |> window(every: 1d) 
  |> aggregateWindow(every: 30d, fn: sum) // Sum values for 30-day windows
  |> map(fn: (r) => ({ r with _value: r._value - (r._value |> lag(offset: 30, column: "_value")) }))
  |> group()
  |> map(fn: (r) => ({
      r with
      strm_vjm_float: r.stromzaehler_kWh - (r.stromzaehler_kWh |> lag(offset: 10, column: "_value")),
      strm_mnt_float: r.stromzaehler_kWh |> last(),
      strm_label: ((r.strm_mnt_float / r.strm_vjm_float) * 100.0 - 100.0),
    }))
  |> to(bucket: "openHAB", fieldFn: (r) => ({
      _time: r._time,
      strm_vjm: r.strm_vjm_float,
      strm_mnt: r.strm_mnt_float,
      strm_lbl: r.strm_label,
    }))