Neues Modul Kapacitor(für InfluxDBs)

Begonnen von timmib, 26 Januar 2021, 23:57:27

Vorheriges Thema - Nächstes Thema

timmib


timmib

Hallo Karflyer,

laut Doku ist dies der neue Weg das zu machen. Das sollte auch mit dem Modul harmonieren.

https://docs.influxdata.com/influxdb/cloud/tools/kapacitor/#use-kapacitor-stream-tasks

Karflyer

Hallo Tim,

Hallo Karflyer,
laut Doku ist dies der neue Weg das zu machen. Das sollte auch mit dem Modul harmonieren.
https://docs.influxdata.com/influxdb/cloud/tools/kapacitor/#use-kapacitor-stream-tasks


Das habe ich versucht und mehrere Stunden damit verbracht das ans laufen zu bekommen. Leider ohne Erfolg. Heißt aber nicht, dass es nicht doch so funktioniert. Hast du mittlerweile selbst einmal probiert, dass in Verbindung mit InfluxDB 2.0 ans laufen zu bekommen?

Grüße
Stefan

timmib

Hi Stefan,

ne, noch nicht. Ich nutze produktiv InfluxDB 1 und bin auch happy damit.

InfluxDB 2 hab ich nur in einer VM zum Entwickeln damit das InfluxDBLogger Modul was zum testweisen hinschreiben mit API v2.

Was genau ging denn nicht?


valvak

Hi zusammen,

ich hab vor kurzem von RaspberryPi auf Proxmox im ThinkCentre mit Docker umgebaut. In dem Zusammenhang hab ich die mysql auf dem NAS jetzt auch als InfluxDB auf dem Proxmox laufen.

Aktuell errechne ich einen Mittelwert über 14 Tage mit der Mysql über DBLog. Dies würde ich aber gerne auch mit Influx lösen, deswegen teste ich gerade mit deinem Modul.

Fhem und Kapacitor funktioniert auch soweit. Kapacitor spricht auch mit der Influx. Allerdings bekomme ich aktuell alle Felder welche "temperature" enthalten. Das Attribut "Where" scheint nicht zu greifen. Eine Änderung an der RetentionPolicity scheint der Kapacitor auch nicht mitzubekommen.

Internals:
   DATABASE   fhem
   DEF        InfluxDB_Kapacitor fhem autogen temperature
   FUUID      601e7024-f33f-55ff-a196-30feae9ad4802b57
   IODev      InfluxDB_Kapacitor
   InfluxDB_Kapacitor_MSGCNT 143
   InfluxDB_Kapacitor_TIME 2021-02-06 11:45:39
   LASTInputDev InfluxDB_Kapacitor
   MEASUREMENT temperature
   MSGCNT     143
   NAME       Test
   NR         911
   RETENTIONPOLICY autogen
   STATE      not updated
   TYPE       KapacitorTask
   READINGS:
     2021-02-06 11:45:39   age             0
     2021-02-06 11:44:53   state           not updated
     2021-02-06 11:36:01   stats           {"node-stats":{"alert2":{"working_cardinality":1,"warns_triggered":0,"oks_triggered":0,"emitted":0,"infos_triggered":34,"crits_triggered":0,"collected":34,"errors":0,"alerts_triggered":34,"alerts_inhibited":0,"avg_exec_time_ns":11748653},"from1":{"collected":34,"avg_exec_time_ns":2226,"emitted":34,"errors":0,"working_cardinality":0},"stream0":{"avg_exec_time_ns":0,"collected":34,"emitted":34,"errors":0,"working_cardinality":0}},"task-stats":{"throughput":0}}
     2021-02-06 11:45:39   time            2021-02-06T10:45:39.338677742Z
     2021-02-06 11:45:39   value           39.625
Attributes:
   where      Aussentemperatur
   windowSize 5



root@InfluxDB:~# kapacitor show fhem.Test
ID: fhem.Test
Error:
Template:
Type: stream
Status: enabled
Executing: true
Created: 06 Feb 21 10:32 UTC
Modified: 06 Feb 21 10:32 UTC
LastEnabled: 06 Feb 21 10:32 UTC
Databases Retention Policies: ["fhem"."autogen"]
TICKscript:
stream
    |from()
        .measurement('temperature')
    |alert()
        .id('fhem.Test')
        .info(lambda: TRUE)
        .tcp('10.0.0.9:50226')

DOT:
digraph fhem.Test {
graph [throughput="0.00 points/s"];

stream0 [avg_exec_time_ns="0s" errors="0" working_cardinality="0" ];
stream0 -> from1 [processed="67"];

from1 [avg_exec_time_ns="1.675µs" errors="0" working_cardinality="0" ];
from1 -> alert2 [processed="67"];

alert2 [alerts_inhibited="0" alerts_triggered="67" avg_exec_time_ns="2.931826ms" crits_triggered="0" errors="0" infos_triggered="67" oks_triggered="0" warns_triggered="0" working_cardinality="1" ];
}


Kannst du dir erklären wieso alle Messwerte eintrudeln welche temperature heißen?
Sorry wenn es eigentlich offensichtlich ist, bin sehr neu mit Grafana bzw. Influx.

Gruß
Mark

timmib

Hallo Mark,

bei der windowsSize fehlt die Zeitangabe. z.B. "5s"

Deswegen steht der State auch auf:

STATE      not updated

Sieht so aus, als wenn die API das entsprechend mangels Zeiteinheit abgelehnt hat.

Viele Grüße

Tim

valvak

Ne daran liegts nicht. Grundsätzlich ist ja Leben in dem Modul, es kommen jegliche Fields mit temperature welche FHEM vorher nach Influx geschrieben hat. Nur das Where scheint nicht zu greifen, bzw. ein Ändern des Test-Devices ändert den Kapacitor Task nicht mit.


Internals:
   DATABASE   fhem
   DEF        InfluxDB_Kapacitor fhem autogen power
   FUUID      601e7024-f33f-55ff-a196-30feae9ad4802b57
   IODev      InfluxDB_Kapacitor
   InfluxDB_Kapacitor_MSGCNT 386
   InfluxDB_Kapacitor_TIME 2021-02-06 12:09:11
   LASTInputDev InfluxDB_Kapacitor
   MEASUREMENT power
   MSGCNT     386
   NAME       Test
   NR         911
   RETENTIONPOLICY autogen
   STATE      not updated
   TYPE       KapacitorTask
   READINGS:
     2021-02-06 12:09:34   age             23
     2021-02-06 12:09:21   state           not updated
     2021-02-06 11:36:01   stats           {"node-stats":{"alert2":{"working_cardinality":1,"warns_triggered":0,"oks_triggered":0,"emitted":0,"infos_triggered":34,"crits_triggered":0,"collected":34,"errors":0,"alerts_triggered":34,"alerts_inhibited":0,"avg_exec_time_ns":11748653},"from1":{"collected":34,"avg_exec_time_ns":2226,"emitted":34,"errors":0,"working_cardinality":0},"stream0":{"avg_exec_time_ns":0,"collected":34,"emitted":34,"errors":0,"working_cardinality":0}},"task-stats":{"throughput":0}}
     2021-02-06 12:09:11   time            2021-02-06T11:09:11.662242936Z
     2021-02-06 12:09:11   value           31.5
Attributes:
   where      ED300L


Nach ändern und Updaten von tempeature auf power die Ausgabe das Kapacitors:

root@InfluxDB:~# kapacitor show fhem.Test
ID: fhem.Test
Error:
Template:
Type: stream
Status: enabled
Executing: true
Created: 06 Feb 21 10:32 UTC
Modified: 06 Feb 21 10:32 UTC
LastEnabled: 06 Feb 21 10:32 UTC
Databases Retention Policies: ["fhem"."autogen"]
TICKscript:
stream
    |from()
        .measurement('temperature')
    |alert()
        .id('fhem.Test')
        .info(lambda: TRUE)
        .tcp('10.0.0.9:50226')

DOT:
digraph fhem.Test {
graph [throughput="0.00 points/s"];

stream0 [avg_exec_time_ns="0s" errors="0" working_cardinality="0" ];
stream0 -> from1 [processed="308"];

from1 [avg_exec_time_ns="1.794µs" errors="0" working_cardinality="0" ];
from1 -> alert2 [processed="308"];

alert2 [alerts_inhibited="0" alerts_triggered="308" avg_exec_time_ns="3.295656ms" crits_triggered="0" errors="0" infos_triggered="308" oks_triggered="0" warns_triggered="0" working_cardinality="1" ];
}
root@InfluxDB:~# kapacitor list tasks
ID        Type      Status    Executing Databases and Retention Policies
fhem.Test stream    enabled   true      ["fhem"."autogen"]
root@InfluxDB:~#


Grüße

valvak

Zitat von: timmib am 06 Februar 2021, 12:01:47
Hallo Mark,

bei der windowsSize fehlt die Zeitangabe. z.B. "5s"

Deswegen steht der State auch auf:

STATE      not updated

Sieht so aus, als wenn die API das entsprechend mangels Zeiteinheit abgelehnt hat.

Viele Grüße

Tim

Also nicht falsch verstehen, ich weiss schon was du meinst. Aber auch vorher ohne windowSize scheint er das Where nicht genommen zu haben.
Allerdings hab ich keine Ahnung wieso.

timmib

#23
Du musst alles beides setzten:
windowSize meanField


    if ( defined($windowSize) && defined($meanField) )
    {
        $windowAndMeanNode = "|window()\n.period($windowSize)\n.every($windowSize)\n|mean('$meanField')\n";
    }


und dein WHERE ist auch kein gültiger lambda Ausdruck. https://docs.influxdata.com/kapacitor/v1.5/nodes/where_node/

Also ca. so
lambda: "DEIN_TAG_NAME" == 'ED300L'

valvak

Ok das hat geholfen  ;)

Durch das Weglassen des where Attributes updated er dann auch auf power.

Ok dann schau ich mal wie ich das am besten einbaue damit er es erkennt.

Grüße

timmib

Super,

wie gesagt das where Attribut sollte so ähnlich aussehen.

lambda: "DEIN_TAG_NAME" == 'ED300L'

valvak

#26
Magst du mir auch noch sagen wie sich

        .period(30s)
        .every(30s)


definiert setzen lassen? windowSize setzt bei 30s direkt beide. Ich muss doch für ... nehmen wir mal an 14 Tage Average alle 30s ein errechneter Messwert ...

        .period(14d)
        .every(30s)


nutzen? Oder kann ich mit movingAverage im meanField arbeiten?

Grüße

P.S.: Hab mir dein Modul gerade angeschaut, wird definitiv beides als windowSize gesetzt.

timmib

Yo,

das Feature fehlt noch.

Wenn Du das haben möchtest, kann ich das gerne ergänzen.

Viele Grüße

Tim


valvak

Moin

Wie gesagt bin erst neu in der Influx Umgebung und hab vorher viel mit Dblog und dbrep gemacht. In der Technikerschule habe ich auch nur SQL Statements genutzt.

Ich nutze den Mittelwert der Außentemperatur als schaltbedingung für die Heizperiode. Diese Berechnung über dbrep ist die letzte Sache um Mysql ganz einzustampfen, influx ist da schon Performanter.

Ich kann mir halt nicht ganz vorstellen wie der Kapacitor arbeitet, wenn ich den average auch über das meanfield übergeben kann brauchst du das Modul nicht komplett umbauen  :)
Sprich ich weiß nicht ob ich den Punkt oben mit Periode und Every richtig interpretiert habe.

Aber wenn die Funktion rein kommt wäre das natürlich schön 🤩

timmib

#29
*** neue Version *** siehe oben.

@valvak
Window kann nun feiner parametrisiert werden. period und every sind einzeln setzbar. Siehe CommandRef(neu).

Plus neues detach Attribut um Ändern des Tasks auszusetzen.

Beachte, dass Kapacitor nur neue Mittelwerte berechnet wenn auch neue Werte kommen.