Neues Modul Kapacitor(für InfluxDBs)

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

Vorheriges Thema - Nächstes Thema

timmib

Hallo liebe Freunde von InfluxDB,

das neue Modul ermöglicht die effektive Übertragung von InfluxDB "Fields" nach FHEM.
Dies ist sehr nützlich um Werte,die direkt nach InfluxDB geschrieben werden (ohne FHEM) trotzdem in FHEM nutzbar zu machen. So entsteht anstatt einer Doppellieferung nach InfluxDB und FHEM eine Kette.
Ein Paradebeispiel dafür sind CPU und Memory Werte die man mit Telegraf sammelt.

Und nicht nur das, es kann die volle Macht von Kapacitor dabei ausgenutzt werden. Kapacitor erlaubt z.B. gleitende Mittelwerte über bestimmte Zeitfenster uvm.

Das Modul registriert automatisch einen einfachen Task beim Kapacitor und stellt einen TCP-Server bereit um die Werte zu empfangen. Dieser Task wird sogar automatisch aktualisiert, wenn ihr die Attribute ändert.

TODOs:

  • jegliche Security
  • jegliches Löschen des Tasks
  • Unterstützung von mehreren Measurements/Devices. D.h. es wird ein primäres IODev geben was den TCP-Server stellt und die Werte an die Kind-Device weitergibt.
  • InfluxDB2 support

Doku folgt.

Neue Version 28.01.2021:

  • Task werden jetzt mit dem Device disabled/enabled und gelöscht
  • Man kann die Stats direkt in FHEM abholgen mit get stats
  • Der Kapacitor Host und Port können jetzt nurnoch beim anlegen gesetzt werden und nicht mehr als Attribut. Da das Ändern ohnehin keinen Sinn macht.
  • Der Status vom Task wird als Reading in FHEM angezeigt.
  • Besseres Logging
  • Ändern des eigenen Ports startet den TCP-Server automatisch neu

Neue Version 29.01.2021:

  • Auftrennung von Kommunikation und Tasks und damit Unterstützung von mehreren Measurements parallel
  • WHERE Bedingung kann angegeben werden
  • WINDOW und MEAN_FIELD kann angegeben werden

Neue Version 30.01.2021:

  • Alter der Readings wird alle 10s berechnet (age)
  • TCP-Verbindungen werden öfter geschlossen
  • Fehlerbehandlung von HTTP Problemen
  • Standard Attribute hinzugefügt

Neue Version 01.02.2021:

  • Message Counter zählt nun richtig und es werde nicht immer weiter internals angelegt
  • Temporäge TCP-Verbindungs Geräte werden direkt gelöscht

Neue Version 07.02.2021:

  • command ref vorhanden(Englisch)!!!
  • window kann feiner parametrisiert werden. period und every sind einzeln setzbar
  • detach Attribut um Ändern des Tasks auszusetzen

Neue Version 04.02.2022:

  • FUnktioniert nun auch mit der neuesten FHEM version. Dort wurde ein Bug gefixet der dieses Modul unbrauchbar gemacht hat.

Viel Spaß beim Testen und Feedback schreiben.

Tim

PS. Link zu  Kapacitor https://docs.influxdata.com/kapacitor/v1.5/

timmib

#1
Hier ein kurzer Hinweis zur Benutzung.

UPDATE: 29.01.2021

define NAME Kapacitor KAPACITOR_HOST [KAPACITOR_PORT]
disable:1,0 An und Abschalten des TCP-Servers.
ownhost Optional eine bestimmte IP oder DNS-Name auf den Kapacitor die Daten schicken soll. Default ist die IP von FHEM.
ownport Optional ein bestimmter Port auf den Kapacitor die Daten schicken soll. Default ist 50226.

Dann ZUSÄTZLICH pro Task ein Device:

define NAME KapacitorTask KAPACITOR_DEVICE DATABASE RETENTIONPOLICY MEASUREMENT
database Der Name der Datenbank aus der man die Werte möchte.
retentionpolicy Der Name der Retention Policy aus der man die Werte möchte.
measurement Der Name des Measurements aus der man die Werte möchte.

Attribute:
where Optionale where Clause um z.B. auf tag oder field zu beschränken.
windowSize Optionale windowSize Die größere des gleitendes Fensters. Gemeinsam mit meanField zu nutzen
meanField Optionale meanField Das Feld für den Mittelwert. Gemeinsam mit windowSize zu nutzen

Setter
createorupdatetask Erzwingen des Anlegen/Aktualisieren des Kapacitor Tasks. Wird eigentlich beim Setzen der Attribute automatisch gemacht.

Viele Grüße

Tim

Karflyer

Hallo Tim,

klasse Idee von dir Kapacitor an FHEM anzubinden. Leider funktioniert das bei mir noch nicht so wie propagiert. Allerdings muss ich dazu sagen, dass ich sowohl INFLUXDB (und jetzt Kapacitor) und FHEM in Docker-Containern laufen habe. Und INFLUXDB die 2.0-Version ist.
Ich habe Kapacitor so aufgesetzt wie es von den Influx-Leuten im Zusammenspiel mit der 2.0-Version beschrieben wird. Die Kommunikation von FHEM zu Kapacitor scheint stattzufinden (die Log-Datei von Kapacitor enthält entsprechende Einträge) aber es werden keine Readings in FHEM erzeugt. Hier mal ein List des FHEM-Devices:
Internals:
   FD         47
   FUUID      60113a1b-f33f-bb67-9ad8-8822f3ea72c88c4f
   FVERSION   93_Kapacitor.pm:?/2021-01-27
   NAME       kapacitor
   NR         786
   PORT       50226
   STATE      opened
   TYPE       Kapacitor
   stacktrace  TcpServer_Close:378 Kapacitor_Close:127 Kapacitor_Set:3813 CallFn:1919 DoSet:1951 CommandSet:99 CommandCmdAlias:1251 AnalyzeCommand:2721 FW_fC:991 FW_answerCall:596 FW_Read:3818 CallFn:759
   READINGS:
     2021-01-27 18:37:03   state           opened
Attributes:
   database   telegraf
   host       192.168.x.xxx
   measurement temp
   ownhost    192.168.y.yyy
   ownport    50226
   port       9092
   retentionpolicy 3d
   room       Log


Hast du ad hoc eine Idee woran es liegen könnte?

Grüße
Stefan

timmib

Hi Stefan,

man muss die Seite neu laden, damit die Readings angezeigt werden.

Aber das hast Du wahrscheinlich schon gemacht.

Viele Grüße

Tim

timmib

#4
Sonst könntest du Mal mit netcat(nc) testweise was nach FHEM schicken.

Was sagt kapacitor zum Task? Wie sehen da die Statistiken aus?

kapacitor list tasks

kapacitor show fhem.DEVICENAME


timmib


Karflyer

ZitatSonst könntest du Mal mit netcat(nc) testweise was nach FHEM schicken.
Was sagt kapacitor zum Task? Wie sehen da die Statistiken aus?

Tim, ich habe dein aktualisiertes Modul eingespielt. Daten erhalte ich leider immer noch nicht.
kapacitor list tasks bringt:
ID             Type      Status    Executing Databases and Retention Policies
fhem.kapacitor stream    enabled   true      ["telegraf"."3d"]


kapacitor show fhem.kapacitor bringt:
ID: fhem.kapacitor
Error:
Template:
Type: stream
Status: enabled
Executing: true
Created: 27 Jan 21 15:46 UTC
Modified: 29 Jan 21 11:07 UTC
LastEnabled: 29 Jan 21 11:07 UTC
Databases Retention Policies: ["telegraf"."3d"]
TICKscript:
stream
    |from()
        .measurement('temp')
    |alert()
        .info(lambda: 1 < 2)
        .tcp('192.168.2.11:50226')

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

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

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

alert2 [alerts_inhibited="0" alerts_triggered="0" avg_exec_time_ns="0s" crits_triggered="0" errors="0" infos_triggered="0" oks_triggered="0" warns_triggered="0" working_cardinality="0" ];
}



Hier ein aktuelles List des Devices:
Internals:
   CFGFN     
   DEF        192.168.xxx.xxx 9092
   FD         56
   FUUID      6013df3a-f33f-bb67-8325-6a22736c3cb4e550
   HOST       192.168.xxx.xxx
   KAPACITOR_PORT 9092
   NAME       kapacitor
   NR         18759
   PORT       50226
   STATE      opened
   TYPE       Kapacitor
   stacktrace  TcpServer_Close:556 Kapacitor_Close:134 Kapacitor_Attr:3818 CallFn:3049 CommandAttr:1251 AnalyzeCommand:2721 FW_fC:948 FW_answerCall:596 FW_Read:3818 CallFn:759
   READINGS:
     2021-01-29 12:13:45   age             63781906033.778
     2021-01-29 11:11:35   state           opened
     2021-01-29 12:07:17   stats           {"node-stats":{"from1":{"working_cardinality":0,"avg_exec_time_ns":0,"collected":0,"emitted":0,"errors":0},"alert2":{"warns_triggered":0,"errors":0,"avg_exec_time_ns":0,"working_cardinality":0,"collected":0,"emitted":0,"crits_triggered":0,"oks_triggered":0,"alerts_inhibited":0,"alerts_triggered":0,"infos_triggered":0},"stream0":{"working_cardinality":0,"avg_exec_time_ns":0,"collected":0,"emitted":0,"errors":0}},"task-stats":{"throughput":0}}
     2021-01-29 12:07:17   task            stats fetched
Attributes:
   database   telegraf
   measurement temp
   ownhost    192.168.yyy.yyy
   ownport    50226
   retentionpolicy 3d
   room       Log


Ein Auszug aus dem Kapazitor-Log:
ts=2021-01-29T11:11:16.629Z lvl=info msg="http request" service=http host=127.0.0.1 username=- start=2021-01-29T11:11:16.625013988Z method=GET uri=/kapacitor/v1/tasks/fhem.kapacitor?dot-view=attributes&replay-id=&script-format=formatted protocol=HTTP/1.1 status=200 referer=- user-agent=KapacitorClient request-id=b4c680a3-6222-11eb-8006-000000000000 duration=3.980783ms

Kann es sein dass es an diesem Sachverhalt bei Influxdb 2.0 liegt:
ZitatUse Kapacitor stream tasks
InfluxDB Cloud and OSS 2.0 do not have subscription APIs and do not support Kapacitor stream tasks directly. To use Kapacitor stream tasks, write data directly to Kapacitor using the Kapcitior write API.

Grüße
Stefan

timmib

Hi, ja ich befürchte das ist so.

Wie Du in den Stats siehst wird in dem Task schlicht nix verarbeitet. Entsprechend kann in FHEM auch nix ankommen.

ZitatInfluxDB Cloud and OSS 2.0 do not have subscription APIs and do not support Kapacitor stream tasks directly.

Die spannende Frage ist, wie man diese automatische Übertragung
ZitatTo use Kapacitor stream tasks, write data directly to Kapacitor using the Kapcitior write API."
hinbekommt.

Viele Grüße

Tim


timmib


Karflyer

Nach der Definition von dem KapacitorDevice habe ich diese drei Warnmeldungen im Log:

2021.01.29 21:28:19.915 1: PERL WARNING: Use of uninitialized value $a[1] in subtraction (-) at ./FHEM/99_Utils.pm line 21.
2021.01.29 21:28:19.915 1: PERL WARNING: Argument "0;00" isn't numeric in subtraction (-) at ./FHEM/99_Utils.pm line 21.
2021.01.29 21:28:19.916 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.

timmib


Karflyer

ZitatWelche FHEM Version hast Du?

FVERSION
fhem.pl:v6.0-s23613/2021-01-25

timmib

#12
Die Logeinträge habe ich auch. Ist jetzt behoben, ist im Rahmen des "age"-Reading passiert.

Klappen die Module den soweit?

timmib


Karflyer

ZitatDie Logeinträge habe ich auch. Ist jetzt behoben, ist im Rahmen des "age"-Reading passiert.

Klappen die Module den soweit?

Kann ich mit Bestimmtheit erst sagen, wenn die Influxdb2-Unterstützung implementiert ist  ;)