Neues Modul InfluxDBLogger

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

Vorheriges Thema - Nächstes Thema

timmib

OK, die machen es in 38_netatmo.pm wirklich. Kannte ich nicht

      readingsBeginUpdate($hash);
      $hash->{".updateTimestamp"} = FmtDateTime($reading->[0]);
      readingsBulkUpdate( $hash, $reading->[1], $reading->[2] );
      $hash->{CHANGETIME}[0] = FmtDateTime($reading->[0]);
      readingsEndUpdate($hash,1);
      $latest = $reading->[0] if( $reading->[0] > $latest );

Weisswurstverkäufer

Ich habe gar keine Ahnung wie das in FHEM alles funktioniert. Ich habe mir nur mal irgendwann in Python einen Import für meine Solarthermieanlage gehackt. Da ist die Quelle eine CSV-Datei in der auch der Timestamp drin steht. Da mache ich dann wohl einfach so:


                point = {"measurement": metric, "time": timestamp, "fields": fields, "tags": tags}
                datapoints.append(point)

                response = client.write_points(datapoints)


... und habe trotz nur einem großen Requests für alle Werte den korrekten Timestamp

timmib

Hi,

schaut euch mal die neue BETA-Version an.

Diese kann nun Strings (Danke an msome) UND originale Zeitstempel

Bitte beides inklusive Doku testen und zurückmelden, damit ich das nach SVN schieben kann.

ZitatstringValuesAllowed attr <name> stringValuesAllowed [0|1]
If enabled (1) it allows to write strings as value, if disabled(0) non-numeric values will be blocked (dropped). Default: 0 (non-numeric values are blocked)
readingTimeStamps 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)

Viele Grüße

Tim

Weisswurstverkäufer

Hallo Tim,

habe die Version jetzt (kurz) getestet. Sieht für mich perfekt aus (beide Funktionen). Besten Dank dafür!

Übrigens: wenn man stringValuesAllowed nutzen will muss man wohl die alten Daten löschen da sonst imkompatibel:

partial write: field type conflict: input field "value" on measurement "state" is type string, already exists as type float dropped=1

Falls noch Probleme auftreten würde ich sie noch melden.

rob

Hallo Tim.

Ich habe auch testweise die angehangene Datei geladen und im Test-FHEM ein "reload  93_InfluxDBLogger" ausgeführt. Anschl. bekam ich diese Hinweise:

Too many arguments for main::InfluxDBLogger_BuildDataDynamic at ./FHEM/93_InfluxDBLogger.pm line 197, near "$numeric)"
Too many arguments for main::InfluxDBLogger_BuildDataDynamic at ./FHEM/93_InfluxDBLogger.pm line 221, near "$numeric)"
Too many arguments for main::InfluxDBLogger_GetFieldSet at ./FHEM/93_InfluxDBLogger.pm line 249, near "$numeric)"

Dann kurzerhand doch FHEM restartet und es passt. Vielleicht lag es an meiner Testumgebung. Nix wildes, wollt es nur rückmelden, falls interessant.

Mit stringValuesAllowed 1 und 0 habe ich ein wenig rumprobiert - klappt auch bei mir prima  8)
Die cref könnte ggf. um einen Hinweis ergänzt werden, dass die conversions ziehen, falls gesetzt, und man nicht im Nachhinein von Werten auf Text und umgekehrt im selben Feld umschwenken sollte - wie von Weisswurstverkäufer schon beschrieben.

partial write: field type conflict: input field "value" on measurement "value" is type float, already exists as type string dropped=1
partial write: field type conflict: input field "value" on measurement "quarks" is type string, already exists as type float dropped=1


Vorschlag:
stringValuesAllowed attr <name> stringValuesAllowed [0|1]
If enabled (1) it allows to write strings as value, if disabled(0) non-numeric values will be blocked (dropped). Default: 0 (non-numeric values are blocked)
Conversions are still in effect, if set. Influx doesn't let you write conversed text as value when a field was already written as text and vice versa.


Bei den conversions könnte ich nun meinen, soetwas müsste auch gehen:
attr myTestInflux conversions xyz=aaa,1=bbb
Wird auch klaglos in die DB geschrieben, allerdings ist value dann null (mit distinct in Grafana nachgeschaut).
Wann man die conversions auch für Text nutzen könnte, wäre es ggf. nicht nötig alle Daten zu löschen, falls man doch aus irgendwelchen Gründen umschwenken muss. Mir fällt allerdings kein schönes Beispiel ein :)

Viele Grüße
rob

timmib

Hi,

vielen Dank für das Feedback. Den Hinweis zum Umschalten kommt in die Doku, gute Idee.

ZitatBei den conversions könnte ich nun meinen, soetwas müsste auch gehen:

Ja, geht auch, weil vorher konvertiert wird. Man muss nur es nur in "" packen, ich verstehe im Moment noch nicht warum er das nicht automatisch macht.

attr influx conversions 1="eins"
attr influx stringValuesAllowed 1


Viele Grüße

Tim

timmib

#201
Zitatich verstehe im Moment noch nicht warum er das nicht automatisch macht.

.. so das hab ich jetzt auch kapiert.

Der Witz ist, dass hier auf der rechten Seite vom = auch Perl code geschrieben werden kann. Leider habe ich versäumt das in die Doku zu schreiben.
Damit kann man z.B. sowas machen.
attr influx conversions 1={ return 2*2;; }
Was immer wenn eine 1 als Wert eines Readings auftritt 2*2 also 4 in die Datenbank schreibt.
Der sinnvolle Usecase ist das Ersetzen von Werten mit RegEx Gruppe um z.B. Werte von ihrer Einheit zu befreien. Siehe hierzu: https://forum.fhem.de/index.php/topic,114860.msg1103001.html#msg1103001
([0-9]+)%=$1

Lange Rede - kurzer Sinn:
Bei 1=eins würde Perl eins ausführen mit dem Ergebnis leerer String.
Bei 1="eins" würde Perl "eins" ausführen mit dem Ergebnisstring "eins".


timmib

Guten Abend,

ich habe die neue Version nun nach SVN commited.


Weisswurstverkäufer

Bei mir kam es heute Nacht mehrmals zu folgender Meldung:

partial write: field type conflict: input field "value" on measurement "temperature" is type string, already exists as type float dropped=1

Kann ich irgendwie rausfinden was das war? Temperatur als String ist ja irgendwie kurios

rob

Hast Du vielleicht bei einem der abgefragten Devices einen formatierten Wert z.B. "5.1°C" dabei?
Tritt das nicht mehr auf? Wenn doch, dann ggf. mit verbose 4 mal loggen lassen, da wird es konkret woher das kommt.

timmib

Genau, einfach das verbose Attribut auf 4 für diesen Logger stellen und dann nach sowas ausschau halten.

InfluxDBLogger: LOGGERNAME Sending data....

oder einfach alles von dem Logger hier posten.

Weisswurstverkäufer

#206
Lustigweise kam das gestern den ganzen Tag nicht mehr vor. Heute Nacht dann aber wieder:

2022.02.09 00:25:19 1: InfluxDBLogger: [influxdb] Error = partial write: field type conflict: input field "value" on measurement "temperature" is type string, already exists as type float dropped=1

[...]

2022.02.09 07:09:10 1: InfluxDBLogger: [influxdb] Error = partial write: field type conflict: input field "value" on measurement "temperature" is type string, already exists as type float dropped=1


Ich stelle jetzt mal das influxdb-device auf Verbose 4 und schaue (das wird vermutlich ganz schön spammen, oder?)

2022.02.09 07:58:29 4: InfluxDBLogger: [influxdb] notified from device Regensensor
2022.02.09 07:58:29 4: InfluxDBLogger: [influxdb] notified from device Regensensor about temperature: -water
2022.02.09 07:58:29 4: InfluxDBLogger [influxdb] - Read passwd from file
2022.02.09 07:58:29 4: InfluxDBLogger: [influxdb] Sending data temperature,site_name=Regensensor value="-water" 1644389909000000000
to http://192.168.42.210:8086/write?db=fhem
2022.02.09 07:58:29 1: PERL WARNING: Argument "water" isn't numeric in numeric lt (<) at (eval 103215) line 1.
2022.02.09 07:58:29 4: InfluxDBLogger: [influxdb] notified from device Regensensor
2022.02.09 07:58:29 4: InfluxDBLogger: [influxdb] notified from device Regensensor about water: no_water
2022.02.09 07:58:29 4: InfluxDBLogger [influxdb] - Read passwd from file
2022.02.09 07:58:29 4: InfluxDBLogger: [influxdb] Sending data water,site_name=Regensensor value="no_water" 1644389910000000000
to http://192.168.42.210:8086/write?db=fhem
2022.02.09 07:58:29 1: InfluxDBLogger: [influxdb] Error = partial write: field type conflict: input field "value" on measurement "temperature" is type string, already exists as type float dropped=1
2022.02.09 07:58:29 4: InfluxDBLogger: [influxdb] HTTP Succeeded succeeded_writes: 133


Irgendwie kurios. Der Regensensor hat tempeature, aber das steht auf -1

msome

Guten Morgen,
ich hatte eben auch so ein Problem und hab es durch Zufall direkt gesehen und konnte im Reading nachschauen. Bei mir ist es scheinbar das Zahlenformat.
Ab und zu werden in eines meiner Devices Readings mit E Format geschrieben - diese werden dann aber von InfluxLogger als String erkannt, und können daher nicht in das bestehende Float Geld eingefügt werden.

Beispiel:
state.accuexport.today
6.103515625e-05
2022-02-09 07:59:05

Da muss ich wohl mal sehen wie ich in die Erfassung (Jsonmod) eine Umwandlung reinbekomme damit das E Format nicht im Reading landet...
Ist aber schon ein bisschen Tricky; vor String Aktivierung gingen solche Fehler unter (dropped).

Viel Glück den Anderen bei der Suche.

@timmib , wenn solch ein Fehler Auftritt, könntest du dann den Wert des Readings der nicht geschrieben werden konnte, mit in der Fehlermeldung ausgeben? Das würde ein Logging mit hohem Verbose vermeiden, vor allem wenn der Fehler nur sporadisch auftritt. Das fehlgeschlagene Reading steht ja in der Fehlermeldung bereits drinnen... ?
FHEM auf ODROID-C4 & FHEM auf Raspberry 3B+
IO: HMUARTLGW (wired), Velux KLF200, DuoFernStick, DeConz, HMUSB-2, JeeLink, ModBus, RS232, WiFi,
Geräte: so ziemlich alles was es an Geräten von HM gibt, PCA301, SDM630M, Hue Lampen & Steckdosen

Weisswurstverkäufer

Ach, es liegt bestimmt an meiner

eventMap
0:no_water
1:water

dann macht er aus "temperature" -1 ein "temperature" -water?

Das ist ja irgendwie ein bisschen bekloppt :')

timmib

#209
Eigentlich sollte er 6.103515625e-05 als numeric erkennen. Ich bin bisher nur von großen 'E' ausgegangen.
Füge mal das kleine "e" in Zeile 375 in die RegEx ein, ob Influx damit leben kann.
^[0-9,.eE-]+$.

Zitatdann macht er aus "temperature" -1 ein "temperature" -water?
Da kann ich leider nicht viel zu sagen. Aber beim InfluxDBLogger kommt es als solches an laut deinem log. So wie ich evetMap verstehen ist der Linke Teil eine RegEx und wird ersetzt.