Neues Modul: 93_InfluxDBLog

Begonnen von d.schoen, 05 Mai 2017, 11:52:12

Vorheriges Thema - Nächstes Thema

antst

Thanks for excellent work!

I configured logging to InfluxDB, converted my text logs to it, and embedded back to FHEM plots from Grafana (dynamically with all goodness of Grafana) and it works like a charm now!

volschin

Ich bin gerade auf den Thread gestoßen, da ich auf eine Time Series Datenbank umstellen wollte. Ich las im Netz, dass InfluxDB die bis zu 75-fache Performance einer MariaDB bringt.
Ich finde es immer wieder cool, dass schon einer das Thema vorgedacht hat. Ich war noch unschlüssig, ob InfluxDB oder Prometheus, aber mit dem vorhandenen Modul fällt erstmal die Entscheidung bei mir, InfluxDB auszuprobieren.  :)

Vielen Dank an d.schoen für das Modul.
Intel NUC+Ubuntu 22.04+Docker+FHEM6
HomeMatic: HM-MOD-RPI-PCB+HM-USB-CFG2+hmland+diverse, HUE: Hue-Bridge, RaspBee+deCONZ+diverse
Amzn Dash-Buttons, Siro Rollos
4xRPi, 4xCO20, OWL+USB, HarmonyHub, FRITZ!Box 7590, Echo Dots+Show8, Logi Circle 2, HomeBridge
TIG Stack (Telegraf, InfluxDB, Grafana)

pano

Hallo allerseits,

ich habe das Modul nun schon seit einigen Monaten in Betrieb und versuche grade das Logging etwas einzuschränken.
Allerdings wird bei mir garnichts mehr geloggt, sobald ich im regex der def irgend etwas anderes als .* stehen habe.

Bsp:
localhost 8086 meidedb meinuser meinpwd (.*:temperature)

Übersehe ich was, oder kann jemand das auch nachvollziehen?

Danke, Pano

fischit

Meine Definition läuft mit
<host> <port> <DB> <username> <passwort> .*:(temperature|humidity|lueftung|absFeuchte).*

fervor

Hi,

ich bin gerade dabei meine alten FileLogs in die influxdb zu übertragen. Dazu benutze ich ein kleines shell script.
Vielleicht hat ja noch jemand Bedarf.

Es werden alle im gleichen Verzeichnis gefundenen Logs berücksichtigt. Nach dem Import werden die fertigen Logs nach ./ok verschoben. Vielleicht vor dem finalen Start nochmal mit echo vor der curl Anweisung testen.

#!/bin/bash

host=localhost:8086
influxdb_name=fhem_db


################################################################################


mkdir -p ./ok

for file in $(find . -name "*.log" | sort)
do

  while read line
  do

        year=$(echo $line | cut -d - -f 1)
        month=$(echo $line | cut -d - -f 2)
        day=$(echo $line | cut -d - -f 3 | cut -d _ -f 1)
        hour=$(echo $line | cut -d _ -f 2 | cut -d : -f 1)
        minute=$(echo $line | cut -d : -f 2)
        second=$(echo $line | cut -d : -f 3 | cut -d ' ' -f 1)
        sensor=$(echo $line | cut -d ' ' -f 2)
        reading=$(echo $line | cut -d ' ' -f 3 | cut -d : -f 1)
        value=$(echo $line | cut -d ' ' -f 4)

        time=$(echo $(date -d $year'-'$month'-'$day' '$hour':'$minute':'$second +%s)000000000)

        #Test auf nummerische Werte
        if [ "$(echo $value | grep -o '[0-9.]*')" != "" ]; then
#               echo $year-$month-$day'_'$hour:$minute:$second - $time - $sensor $reading $value
                curl -i -XPOST 'http://'$host'/write?db='$influxdb_name'' --data-binary $reading',site_name='$sensor' value='$value' '$time''
        fi


  done < $file

    mv $file ./ok/$file

done

pano

@d.schoen: erst mal vielen Dank für das Modul. Habe mittlerweile so ziemlich alles an Logvisualisierung in Grafana verlegt, was ohne dein InfluxDB Modul nicht geklappt hätte. Danke dafür.
Davon mal abgesehen, entwickelst Du das Modul noch weiter?

Zum einen denke ich, dass man mit den Tags in der Influx noch eine Menge machen könnte (im Sinne von eigene Tags vergeben).

Zum anderen bietet Grafana seit einiger zeit auch sog. Annotations, die man hervorragend nutzen könnte um "binäre" Ereignisse (zB Fenster auf/zu) in den Graphen/Dashboards darzustellen. Die dazugehörige Logik könnte ja auch perspektivisch ins InfluxDB Modul wandern.

Und zu guter Letzt bietet das Modul bisher ja die Möglichkeit per Regex die zu protokollierenden Events einzuschränken. Bei hinreichend vielen verschiedenen zu loggenden Devices und Events wird die DEF aber zunehmend unübersichtlich. Vieleicht wäre ein umgekehrter Ansatz hinfreich iSv an einem Device selbst hinterlegen, ob und welche Events es in InfluxDB loggen soll.

Was denkst Du darüber?
Grüße, Pano

doridian

Ich habe mal ein bisschen an dem Modul rumgebaut
Es speichert jetzt auch den device type/module mit als tag.
Ausserdem kann es metrics remappen (und in meiner Version loggt es nur Attribute, wofuer es mappings hat). Weil viele Module loggen z.B. temperatur als "measured-temp" oder "temperature", manche sogar als "other"
Ebenfalls eingebaut habe ich ein globales attribute influxIgnore, womit man devices ignorieren kann, selbst wenn der regex matcht (Diese ganzen HomeMatic subdevices wuerden sonst doppelte Log-Werte eintragen, die nicht wirklich nuetzlich sind)

https://github.com/Doridian/fhem-InfluxDBLog/blob/master/FHEM/93_InfluxDBLog.pm

Vielleicht koennte man auch noch device-specifische remaps einbauen, um die Attribute einzuschraenken.

rafael.l

Hallo Leute!

Vielen Dank für die sinnvolle Erweiterung für FHEM. Allerdings habe ich Schwierigkeiten Werte von FHEM an die influxDB zu schicken. Bei der Einrichtung habe ich mich an diese beiden howtos gehalten (https://www.frombeyond.de/2017/influxdb-grafana-setup/, https://www.frombeyond.de/2017/fhem-6-grafana-und-influxdb/).

Mittlerweile habe ich herausgefunden, dass es an der Formatierung der Log-Datei liegt. Wie muss die Log-Datei aussehen, damit das Modul tut, was es soll?

Diese Formatierung führt zu einem http-400-error:

2017-12-28_21:11:37 WZ_spannung 3023

Vielen Dank für Eure Hilfe!

pano

Was genau probierst Du denn? Und was hat die Log Datei damit zu tun? Das Modul schreibt - je nachdem was du in der def stehen hast - alle numerischen Readings die ein Event erzeugen in die InfluxDB.

toolking

@d.schoen, danke fürs Modul, wir benutzen influx/grafana in der Firma und ich hab mich gleich wohl gefühlt.
@doridian, danke für die Erweiterung.

Ich habe aber einen kleinen Bug gefunden. Wo kann ich den PR hinschicken? ;)

Negative Werte werden bei mir nicht richtig geschrieben.
in der Funktion: InfluxDBLog_Write
...
my $value = $arr[1];
return if($value =~ m/[^.\d]/);
...

wird hier ein negativer $value rausgeschmissen. Habs bei den negativen Außentemperaturen momentan, zum ersten mal festgestellt.

Mein Fix war, einfach den regex zu erweitern:
m/[^.\d-]/

shaddi

Zitat von: Thyraz am 06 Oktober 2017, 13:28:18
Damit bleibt die einem die doppelte Datenhaltung erspart.
Auch sind String-Werte wie open/closed kein Problem und man erspart sich zusätzliche numerische Userreadings um das in InfluxDB loggen zu können.

Die Werte kann man dann direkt im SELECT Statement wieder zu Werten mappen um sie in Grafana in den Graphen zu bekommen.
Durch die vielfältigen Funktionen die bei einem SELECT möglich sind, brauchen viele Sachen auch gar nicht in Grafana integriert werden, da man das schon auf MySQL Seite erledigen kann.

z.B. Temperaturdaten ausdünnen und durch Mittelwerte ersetzen, damit der Graph schneller lädt / weniger Traffic erzeugt usw.
Oder Offsets auf Werte aufrechnen um mehrere Kurven übereinander in einem Graphen darzustellen.

Kannst du vielleicht ein-zwei Beispiele rein werfen, bitte? Ich stellte mich gerade echt zu blöd an, sinnvolle SQL-Statements zu definieren, die dann im Grafana irgendwas anzeigen..

fischit

Zitat von: shaddi am 12 Januar 2018, 16:17:47
Kannst du vielleicht ein-zwei Beispiele rein werfen, bitte? Ich stellte mich gerade echt zu blöd an, sinnvolle SQL-Statements zu definieren, die dann im Grafana irgendwas anzeigen..
Beispiele findest du hier einiges: https://forum.fhem.de/index.php/topic,77724.0.html

g0t0

#57
Ich bin leider zu doof für die RegEx...

Ich würde gerne alle Readings in die influxDB schieben, deshalb ist ja erstmal .* die RegEx dafür. Damit kommen nur die rein nummerischen Wert in die DB.
Weitere Versuche von mir:
.*:(\d+\.?\d*)
.*:.*:(\d+\.?\d*)


Im RegEx-Tester filtert es aber genau das was ich will: nur floats und ints. Passt z.B. bei "dim 40", "10 %" und "20.5  C".

Wo ist mein Denkfehler?

artcrime

Hi,

ich glaube das influxdb Modul für fhem schreibt nur Integer und Float Werte in die Datenbank. Alles was Strings enthält wird verworfen. Eigentlich Schade ich nutze daher beides mysql und influxdb. Beispielsweise um die Datenübertragungsrate meiner FritzBox in Grafana als Graph darzustellen (Daten aus Influx) und die Externe IP im selben Graph als Annotation anzuzeigen (Daten aus mysql).

Eine Kurve aus influx und eine andere mysql im selben Graph funktioniert aber meines Wissen nach nicht.

Thyraz

Was aber nicht am Modul liegt.
InfluxDB kann nur Zahlenwerte.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...