Neues Modul InfluxDBLogger

Begonnen von timmib, 07 Oktober 2020, 23:31:09

Vorheriges Thema - Nächstes Thema

topa_LE

Zitat von: kennymc.c am 16 Mai 2022, 17:25:52
Hab eigentlich erst vor kurzem alles bei mir auf v2 umgestellt und würde nur ungern wieder zurück.

Leuchtet ein ;-) , dann müsste sich der Entwickler ggf. noch mal zu äußern.

Ich beende das nun auch hier erstmal, weil meine geloggten Werte nicht nach Wunsch in Grafana definiert werden können. Da müsste ich nun zu viel umcoden, was die NonNumerus Readings MQTT2 betrifft. Zuviel probiert und einfach den Überblick verloren, schade drum, weil das Modul ist gut!

Viel Erfolg für dich bei deiner Problembewältigung, ich kann da leider nicht helfen, da ich V2 nicht nutze.

UdoR

Hallo zusammen,

ich bekomme folgende Fehlermeldung:
2022.05.25 20:48:07 1: InfluxDBLogger: [influxDB] Error = unable to parse 'subnetMask,site_name=MQTT2_Schaukasten value=255.255.255.0 1653504486000000000': invalid number

die Ursache liegt offenbar in Zeile 375:
$map->{$deviceName}->{$readingName}->{"numeric"} = $readingValue =~ /^[0-9,.E-]+$/;

Hier wird nicht abgefangen, dass mehrere Punkte zu einer ungültigen Zahl führen. Daher folgende Korrektur des regulären Ausdrucks:
$map->{$deviceName}->{$readingName}->{"numeric"} = $readingValue =~ /^[-+]?[0-9]*[\.\,]?[0-9]+([eE][-+]?[0-9]+)?$/;


Gruß Udo

m-d-ley

Hallo,
ist es irgendwie möglich einen eigenen Timestamp zu übergeben? Meine Idee ist es einen Dummy mit Setreading händisch zu füttern. Im Setreading würde ich den Timestamp mit angeben, allerdings übermittelt Influxdblogger natürlich den aktuellen Timestamp. Hat da jemand eine Idee?

Danke und Lg

Weisswurstverkäufer

Zitat von: m-d-ley am 02 Juni 2022, 14:36:32
Hallo,
ist es irgendwie möglich einen eigenen Timestamp zu übergeben? Meine Idee ist es einen Dummy mit Setreading händisch zu füttern. Im Setreading würde ich den Timestamp mit angeben, allerdings übermittelt Influxdblogger natürlich den aktuellen Timestamp. Hat da jemand eine Idee?

Danke und Lg

Das sollte sein was Du suchst, oder?

ZitatreadingTimeStamps attr <name> readingTimeStamps [0|1]
If enabled(1) the ReadingTimestamp from FHEM is send to InfluxDB, Default is off(0). This is useful for devices that publish the values later with the original timestamp delayed. Default: 0 (InfluxDB determines the timestamp on its own)

JooNey

Hallöchen zusammen,

ich würde auch gern meine Daten loggen, habe bei mir zu Hause aber eine KairosDB mit Cassandra laufen - deshalb einfach nur kurz die Frage, ob es mit den aktuellen Konfigurationsmöglichkeiten dieses Bausteins auch möglich ist an die KairosDB (statt an eine InfluxDB) zu loggen? (Für den interessierten Leser, hier die Info, wie man Datenpunkte hinzufügt: https://kairosdb.github.io/docs/restapi/AddDataPoints.html )

Falls es grundsätzlich möglich ist, würde ich mich tiefer in die Konfiguration des Moduls einlesen, falls nicht, wäre die Frage, ob es möglich wäre das Modul etwas anzupassen, sodass man evtl. auch auf die KairosDB loggen kann!?

Danke.

Beste Grüße
JooNey

JooNey

Moin,

also ich habe jetzt mal ne InfluxDB aufgesetzt, und versuche da meine KNX-Daten reinzuschreiben, aber irgendwie mag es nicht wirklich klappen. Es kommen vereinzelte Werte an, aber nicht das, was ich haben will, also keine Temperaturen der Sensoren oder Prozente der Rollos z.B. Und auch von den Licht/Taster/Schalter Stati kommt nicht wirklich was.

Nachdem ich versucht habe über "$READINGNAME=$READINGVALUE" im influxDB dev sowie "attr event-on-change-reading state" bei den sendenden Devices zu verwenden, waren die meisten Fehler weg, dafür werden die Werte eigentlich alle gedropped.

Woran liegt das, was kann ich anders machen?

Hier mal das influxDB Device:
Internals:
   CFGFN     
   DATABASE   KNX
   DEF        http://192.168.11.31:8086 KNX
   FUUID      62e26d73-f33f-098d-2709-86d9079aa6f283ed
   NAME       influxDB
   NOTIFYDEV 
   NR         940
   NTFY_ORDER 50-influxDB
   STATE      Statistics: t=1789 s=666 f=1123 e=2175
   TYPE       InfluxDBLogger
   URL        http://192.168.11.31:8086
   eventCount 10892
   passwd     saved
   READINGS:
     2022-07-30 09:54:07   dropped_writes  6634
     2022-07-30 09:54:07   dropped_writes_last_message KNX_0301022 state 26.40 °C
     2022-07-29 22:13:02   failed_writes   1123
     2022-07-29 22:13:02   failed_writes_last_error unable to parse 'knx_S_Keller_Aussen,device=knx_S_Keller_Aussen last-sender=1.0.2,state=1,steuern-get=1': invalid number
     2022-07-30 09:50:00   state           Statistics: t=1789 s=666 f=1123 e=2175
     2022-07-30 09:50:00   succeeded_writes 666
     2022-07-30 09:50:00   total_events    2175
     2022-07-30 09:50:00   total_writes    1789
Attributes:
   api        v2
   conversions closed=0,open=1,tilted=2,false|off|no=0,true|on|yes=1
   fields     $READINGNAME=$READINGVALUE
   measurement $DEVICE
   org        JooNey
   readingInclude state
   room       InfluxDB
   tags       device={my $str = AttrVal($device,"alias",$device); $str =~ s/\s/_/g; return $str;}
   username   KNX
   verbose    5


Hoffe, ihr habt weiterführende Ideen.

Danke und Grüße
JooNey

P.S.: Wo finde ich eigentlich das InfluxDBLogger Device Logfile?

meier81

Hallo JooNey,

kannst du uns mal zeigen wie der state der Devices die du loggen willst aussieht, ich denke fast das hier schon das Problem sein könnte.

Anbei hab ich dir mal eine meiner Definitionen der InfluxDB Config angehängt:


Internals:
   DATABASE   Energie
   DEF        http://127.0.0.1:8086 Energie KG_hr_SZ_Haus,KG_hr_GZ_Haus,KG_wr_SD_Trockner,KG_wr_SD_Waschmaschine,KG_mr_SD_Entfeuchter
   FUUID      6175af97-f33f-1612-4877-6bd3d9deb3a58d17
   FVERSION   93_InfluxDBLogger.pm:0.256500/2022-02-07
   NAME       NN_xx_SW_InfluxDB_Energie
   NOTIFYDEV  KG_hr_SZ_Haus,KG_hr_GZ_Haus,KG_wr_SD_Trockner,KG_wr_SD_Waschmaschine,KG_mr_SD_Entfeuchter
   NR         92
   NTFY_ORDER 50-NN_xx_SW_InfluxDB_Energie
   STATE      Statistics: t=242052 s=242031 f=21 e=302459
   TYPE       InfluxDBLogger
   URL        http://127.0.0.1:8086
   eventCount 1950
   READINGS:
     2022-05-15 21:39:55   dropped_writes  0
     2022-05-15 21:39:55   dropped_writes_last_message <none>
     2022-07-30 11:49:02   state           Statistics: t=242052 s=242031 f=21 e=302459
     2022-07-30 11:49:02   succeeded_writes 242031
     2022-07-30 11:49:01   total_events    302459
     2022-07-30 11:49:01   total_writes    242052
Attributes:
   alias      InfluxDB Energie
   api        v2
   conversions closed=0,open=1,tilted=2,false|off|no=0,true|on|yes=1
   deviceTagName device_name
   icon       time_note
   org        privat
   readingExclude (ENERGY_ApparentPower|ENERGY_ReactivePower):.*
   readingInclude (Power_.*__kW|ENERGY_Power|Energy_total_T1__kWh|GAS_ENERGY_COUNTER):.*
   security   token


Ich logge bei mir halt nicht den state sondern readings der Devices, meistens ist der state ja aus mehreren Werten und Texten zusammengesetzt, das wird hier beim loggen zu Problemen führen.
Probiere es vielleicht auch mal mit einem reading des Device od das funktioniert.

Gruß

Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

JooNey

Hey Markus,

das reading heißt "state". :)

Siehe hier für einen der Temperaturfühler:

Internals:
   DEF        3/1/82:dpt9.001
   DEVNAME    KNX_0301082
   FIRSTGADNAME g1
   FUUID      602fd431-f33f-098d-cb62-9f3329bb1ec5c38d
   GETSTRING  g1:noArg
   IODev      KNX
   KNX_MSGCNT 44645
   KNX_RAWMSG C01215w031520cc9
   KNX_TIME   2022-07-30 14:19:44
   LASTInputDev KNX
   MSGCNT     44645
   NAME       KNX_0301082
   NR         27
   SETSTRING  g1:slider,-274,6710,670760
   STATE      24.50 °C
   TYPE       KNX
   eventCount 44594
   model      dpt9
   GADDETAILS:
     g1:
       CODE       03152
       GROUP      3/1/82
       MODEL      dpt9.001
       NO         1
       OPTION     
       RDNAMEGET  getG1
       RDNAMEPUT  putG1
       RDNAMESET  setG1
       SETLIST    :slider,-274,6710,670760
   GADTABLE:
     03152      g1
   READINGS:
     2022-07-28 23:34:00   IODev           KNX
     2022-07-30 14:19:44   getG1           24.50 °C
     2022-07-30 14:19:44   last-sender     1.2.21
     2022-07-30 14:19:44   state           24.50 °C
Attributes:
   IODev      KNX
   event-on-change-reading state
   event-on-update-reading state
   group      EG
   room       KNX_3_Heizung


Dazu gibt es dann noch den STATE als internal, das stimmt. Der bringt mir dann vermutlich die Fehler bei den devices, bei denen das alles in diesen STATE kommt.

Beste Grüße

meier81

#233
Ich glaube dein Problem ist das im state 24.50 °C steht, das loggt influxdb standard nicht und dropped es da es keine reine Zahl ist sondern eine Zeichenkette. Du kannst zwar das Attribut STRINGVALUESALLOWED setzen dann loggt er auch Zeichenketten, ob du die dann aber so toll auslesen bzw. benutzen kannst aus der influxdb weiß ich nicht.

Hast du nicht mal ein Device wo du ein reading hast mit einer reinen Zahl, meine Fühler sehen z.B. so aus:

Internals:
   DEF        000E9A498E8582:1
   FUUID      617b9334-f33f-1612-79e9-e81f1c3dc33ffd5e
   FVERSION   88_HMCCUCHN.pm:v5.0.0-s25675/2022-02-13
   IODev      NN_xx_SW_debmatic
   NAME       EG_ku_TF_Raum
   NR         126
   STATE      24.1
   TYPE       HMCCUCHN
   ccuaddr    000E9A498E8582:1
   ccudevstate active
   ccuif      HmIP-RF
   ccuname    HmIP-STHD 000E9A498E8582:1
   ccurolectrl HEATING_CLIMATECONTROL_TRANSCEIVER
   ccurolestate HEATING_CLIMATECONTROL_TRANSCEIVER
   ccusubtype STHD
   ccutype    HmIP-STHD
   eventCount 22
   firmware   2.6.0
   readonly   no
   READINGS:
     2022-07-30 19:31:19   ACTIVE_PROFILE  1
     2022-07-30 19:31:19   ACTUAL_TEMPERATURE 24.1
     2022-07-30 19:31:19   ACTUAL_TEMPERATURE_STATUS NORMAL
     2022-07-30 19:31:19   BOOST_MODE      false
     2022-07-30 19:31:19   BOOST_TIME      0
     2022-07-30 19:31:19   FROST_PROTECTION false
     2022-07-30 19:31:19   HEATING_COOLING HEATING
     2022-07-30 19:31:19   HUMIDITY        56
     2022-07-30 19:31:19   HUMIDITY_STATUS NORMAL
     2022-07-30 08:09:32   IODev           NN_xx_SW_debmatic
     2022-07-30 19:31:19   PARTY_MODE      false
     2022-07-30 08:09:48   PARTY_SET_POINT_TEMPERATURE 0.0
     2022-07-30 08:09:48   PARTY_TIME_END 
     2022-07-30 08:09:48   PARTY_TIME_START
     2022-07-30 19:31:19   QUICK_VETO_TIME 0
     2022-07-30 19:31:19   SET_POINT_MODE  auto
     2022-07-30 19:31:19   SET_POINT_TEMPERATURE 21.0
     2022-07-30 19:31:19   SWITCH_POINT_OCCURED false
     2022-07-30 19:31:19   WINDOW_STATE    closed
     2022-07-30 19:31:20   absoluteHumidity 12.2
     2022-07-30 19:31:20   activity        alive
     2022-07-30 19:31:20   battery         ok
     2022-07-30 19:31:19   control         21.0
     2022-07-30 19:31:19   desired-temp    21.0
     2022-07-30 19:31:20   devstate        ok
     2022-07-30 19:31:20   dewpoint        14.8
     2022-07-30 19:31:20   hmstate         24.1
     2022-07-30 19:31:19   humidity        56
     2022-07-30 19:31:19   measured-temp   24.1
     2022-07-30 19:31:20   rssidevice      -54
     2022-07-30 08:09:48   rssipeer        -68
     2022-07-30 19:31:19   state           24.1
     2022-07-30 19:31:19   temperature     24.1
     2022-07-30 19:31:20   voltage         2.8


Da siehst du ja bei den readings stehen immer nur Werte, ohne Einheit.

Gruß Markus

Ach, habe ich auch eben gesehen du hast die Attribute
event-on-change-reading state
event-on-update-reading state


beide gleichzeitig gesetzt, wenn du keines der beiden setzt verhält es sich standard wie event-on-update-reading, d.h. jedes Mal wenn das reading aktualisiert wird (auch wenn sich der Wert nicht geändert hat) wird getriggert, also in die influxdb geloggt. Mit dem Attribut event-on-change-reading wird nur getriggert wenn sich der Wert geändert hat, ansonsten erfolgt kein Eintrag in die influxdb. Wenn du beide Attribute gleichzeitig setzt und das auch auf das gleiche reading ist event-on-update-reading das höher wirkende Attribut und überstimmt event-on-change-reading. Das heißt du kannst in den Fall beide Attribute auch weglassen. Beide Attribute zusammen machen nur Sinn wenn du z.B. event-on-change-reading .* setzt und dann event-on-update-reading state, dann werden alle readings nur auf Änderung getriggert bis auf das reading state, das wird bei Aktualisierung getriggert.

Und nochwas: du musst bei READINGINCLUDE dann state:.* und nicht nur state angeben, siehe commandref:

READINGINCLUDE attr <name> readingInclude <regex>
Nur Ereignisse die zutreffen werden geschrieben. Hinweis - das Format eines Ereignisses sieht so aus: 'state: on'


Aber wie gesagt da steht bei dir dann auch noch das °C drin, das gibt dann weiterhin Probleme.
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

JooNey

#234
Hey meier81,

danke für den Hinweis. Kann ich denn ein Reading generieren, bei dem die Einheit nicht mit angegeben wird? (edit: lese gerade den Wiki Eintrag zu userreadings.) Ich gehe mal davon aus, das kommt aus der Definition der KNX Gruppenadressen.

Bzw. einfacher wäre ja, wenn ich das Readinginclude so matchen könnte, dass er die Einheiten einfach weglässt. Aber da weiß ich nicht, wie das Matching funktioniert. Nach normalen RegExp könnte ich ja sowas hier angeben, und würde die Zahlen als Ergebnis bekommen:
state:.(\d+(?:[\.\,]\d{1,2})?)[A-Za-z° ]*

Ginge das hier auch? Dann hätte ich ja mit ner ordentlich angelegten Expression alles erschlagen.

Beste Grüße

JooNey

Ok, kurz mal was ausprobiert:

attr KNX_0301082 userReadings fTemp:state:.* { ReadingsNum("KNX_0301082","state",0) }

um ein userReading zu erzeugen, welches dann die Temperatur ohne Einheiten hat, und beim influxDB "readingInclude fTemp:.*" gesetzt. Scheint aber auch nicht zu klappen. Es steht zwar im Log, dass influxDB notified wird, aber es kommt rein gar nix mehr durch. Vermutlich "sieht" er fTemp nicht. *seufz*

meier81

#236
Zitat von: JooNey am 31 Juli 2022, 13:13:58
Hey meier81,

danke für den Hinweis. Kann ich denn ein Reading generieren, bei dem die Einheit nicht mit angegeben wird? (edit: lese gerade den Wiki Eintrag zu userreadings.) Ich gehe mal davon aus, das kommt aus der Definition der KNX Gruppenadressen.

Bzw. einfacher wäre ja, wenn ich das Readinginclude so matchen könnte, dass er die Einheiten einfach weglässt. Aber da weiß ich nicht, wie das Matching funktioniert. Nach normalen RegExp könnte ich ja sowas hier angeben, und würde die Zahlen als Ergebnis bekommen:
state:.(\d+(?:[\.\,]\d{1,2})?)[A-Za-z° ]*

Ginge das hier auch? Dann hätte ich ja mit ner ordentlich angelegten Expression alles erschlagen.

Beste Grüße

Da bin ich leider auch der falsche Ansprechpartner, mit den regex Ausdrücken breche ich mir auch regelmäßig die Finger  :)

Ich glaube ich habe eben auch noch einen Fehler bei deiner Definition entdeckt, du hast ja dein influxdb Device so definiert:

http://192.168.11.31:8086 KNX

Da fehlt aber das Device noch, muss ja define <name> InfluxDBLogger [http|https]://IP_or_Hostname:port dbname devspec definiert werden, das heißt bei dir fehlt die devspec.

Probiere mal die Definition bei dir so:

define influxDB InfluxDBLogger http://192.168.11.31:8086 KNX KNX.*
attr influxDB api v2
attr influxDB conversions closed=0,open=1,tilted=2,false|off|no=0,true|on|yes=1
attr influxDB org JooNey
attr influxDB readingInclude fTemp:.*
attr influxDB room InfluxDB
attr influxDB username KNX


Gruß Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

JooNey

Naja, wenn das "includeReading" nicht "matched", also den Ausdruck in den Klammern als Ergebnis nimmt, dann bringt das Beste RegEx nix. Das, was ich da geschrieben habe, würde normalerweise alles Matchen, was ne Zahl vorn hat, und dann hinten dran nix oder eine beliebige Zeichenkette inkl. °. Und dieser Wert müsste dann übergeben werden.

Der Fehler scheint aber viel subtiler. Die Definition der userReadings muss exakt auf das Leerzeichen passen, sonst passiert gar nichts. Ich habe das jetzt mehrfach ausprobiert, und festgestellt, dass wenn es nicht exakt so geschrieben wird wie hier, gar nix passiert:
attr KNX_0701002 userReadings KNX_value:getG1:.* {ReadingsNum($name,"getG1",2)}

Leerzeichen in den { } oder gar ; oder fehlendes Leerzeichen nach dem *, sorgt alles dafür, dass das userReading zwar "angelegt" wird, aber das eigentliche Reading niemals auftaucht. Warum? Keine Ahnung, aber nachdem ich es so gemacht habe, wird die influxDB mit Werten gefüllt. Da ich gerade nix hab, was alle Sekunde da was reinschiebt, werde ich mal ein, zwei Tage warten. Temperaturen oder Schaltstati von Leuchten sind da ganz gut. Mal sehen, ob meine Wetterstation sich auch immer schön meldet. :)

Ich melde mich mit nem Update, wie gut es nun klappt.

Beste Grüße

P.S.: event-on-change-Reading habe ich erstmal rausgenommen - es sollen ja Werte in die DB fließen. Wenn das alles klappt, dann kann ich das einstellen.

meier81

Zitat von: JooNey am 31 Juli 2022, 17:32:59
Leerzeichen in den { } oder gar ; oder fehlendes Leerzeichen nach dem *, sorgt alles dafür, dass das userReading zwar "angelegt" wird, aber das eigentliche Reading niemals auftaucht.

Ja, das mit dem Leerzeichen nach dem Stern muss natürlich sein, das war ja aber in deinem Beispiel weiter oben richtig gewesen. Und im Perl-Ausdruck in den geschweiften Klammern darf kein Leerzeichen haben, das ging mir auch durch. Aber wenn´s jetzt passt ist ja super  ;)

Bin mal gespannt was du berichtest.

Gruß Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

topa_LE

Zitat von: UdoR am 25 Mai 2022, 21:26:20

Hier wird nicht abgefangen, dass mehrere Punkte zu einer ungültigen Zahl führen. Daher folgende Korrektur des regulären Ausdrucks:
$map->{$deviceName}->{$readingName}->{"numeric"} = $readingValue =~ /^[-+]?[0-9]*[\.\,]?[0-9]+([eE][-+]?[0-9]+)?$/;



Hatte ich auch schon gemerkt. Eventuell kann es der Entwickler im Modul anpassen.

Funktioniert so perfekt. :)