Hallo Leute,
Ich möchte verschiedene readings aus unterschiedlichen devices in eine influxx gerne wegloggen.
Anbindung influxx ist alles klar.
Jetzt zum eigentlichen Problem.
Damit genaue Auswertungen gefahren werden können, müssen alle readings den selben Timestamp aufweisen. Jetzt ist fhem aber event basiert, dann wenn readings aktualisiert werden, erst zu diesem Zeitpunkt werden diese auch nach influxx geloggt.
Folglich hat der PV Ertrag, PV Einspeisung unterschiedliche Timestamp, weil die Readings aus unterschiedlichen Devices kommen oder auch der events an sich später erfolgt ist.
Ich habe mir schon readingproxy angeschaut, aber scheinbar ist das ja nur ein hilfsdevice was selber keine events auslöst.
Könnte mir jemand Hilfestellung geben. Ist das mit Standardmittel von fhem möglich oder muss ein Modul gebaut werden.
VG
Du könntest Dir eine eigene Perl Funktion schreiben, die die readings dann mit einem inert und gleichem TIMESTAMP in die Datenbank schreibt.
Das ginge auch in einem userreading, hier mal mit MySQL als Beispiel
- beim event nodes_00_00_cost.* wird ausgelöst
- es wird ein reading gelesen, dass einen Timestamp beinhaltet
In diesem Fall bekommt man z.B. von Tibber jede Stunde die Kosten, die ich aber mit TIMESTAMP passend zur jeweiligen
Stunde eintragen möchte, damit man dann daraus Diagramme zeichnen kann, bzw in der DB bei einer Abfrage nach TIMESTAMP den
richtigen Wert bekommt.
- Dann wird das zweite reading mir dem Wert zur Stunde gelesen
- mit zwei INSERT werden dann die Kosten und der Verbrauch in die DB geschrieben
- zum Schluss wird noch ein TIMESTAMP als Quittung in das userreading geschrieben, was wiederum als Trigger für eine weitere Operation dienen kann
nodes_TIMESTAMP:nodes_00_00_cost.* {
my ($timestamp,$value) = 2x0;
my $tmp = 0;
for (my $loop_last = 0; $loop_last <= 2; $loop_last++) {
$timestamp = ReadingsVal("$NAME","nodes_00_".sprintf("%02d",$loop_last)."_from","null");
$value = ReadingsVal("$NAME","nodes_00_".sprintf("%02d",$loop_last)."_cost","null");
if ( $value ne "null" ) {
# Eintragen der Kosten für die Stunde
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)
VALUES('".$timestamp."','$NAME','Tibber','nodes_cost','".$value."')
ON DUPLICATE KEY UPDATE
VALUE='".$value."';") ;
# Eintragen des Verbrauchs für die Stunde
$value = ReadingsVal("$NAME","nodes_".$loop_last."_consumption","null");
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)
VALUES('".$timestamp."','$NAME','Tibber','nodes_consumption','".$value."')
ON DUPLICATE KEY UPDATE
VALUE='".$value."';") ;
} else {
$tmp = "null";
}
} # end for
if ($tmp eq "null") {
$timestamp = $tmp
}
$timestamp;
},
VG Christian
Hi,
Danke für den Tipp. Ist aber etwas zu hoch für mich.
Ich hatte gehofft, das lässt sich etwas einfacher lösen.
Ich wüste jetzt nicht, wie ich statt den dblogger direkt in die influxx schreiben soll.
Gruss
Zitat von: lewej am 24 Mai 2023, 16:54:55Ich hatte gehofft, das lässt sich etwas einfacher lösen.
Ich wüste jetzt nicht, wie ich statt den dblogger direkt in die influxx schreiben soll.
Den dblogger und influxx kenne ich auch nicht, bisher komme ich mit der MySQL Anbindung sehr gut zurecht.
Zitat von: lewej am 17 Mai 2023, 17:20:12Ich habe mir schon readingproxy angeschaut, aber scheinbar ist das ja nur ein hilfsdevice was selber keine events auslöst.
Im anderen Fred habe ich Dir auch eine Antwort reingeschrieben: https://forum.fhem.de/index.php?msg=1276873 (https://forum.fhem.de/index.php?msg=1276873).
Eigentlich sollte readingsProxy schon Events auslösen.
Christians Ansatz kümmert sich direkt ums Wegschreiben der Werte. Im Falle von Influx haben wir ja ein Modul dafür, was halt Trigger benötigt. Obigen Code könnte man auch so umbauen, dass das Ziel ein Dummy o.ä. wäre, sodass InfluxDB wieder seinen Trigger bekommt.
Oder eben wie Christian in die Modulfunktionen reinfuchsen und mit dem Wissen dann direkt nach Influx schreiben.
Gibt halt viele Möglichkeiten. Ja, auch ein extra Modul dafür, wäre eine Möglichkeit ;)
Vorschlag: pick Dir den Ansatz raus, welcher Dir eher sympathisch ist und verfolge den weiter. Wenn es hakt, kann man Dir an der Stelle direkter/ konkreter helfen :)
VG
rob
Mit DbLog geht das recht einfach.
Dazu benutzt man _nicht_ die Events, sondern holt sich die Werte per Abfrage mit:
set <name> addLog ....
in die Datenbank. Sogar den Timestamp kann man auf diesem Weg anpassen. Wie das geht ist in der Hilfe zum addLog Befehl als Beispiel beschrieben.
DbLog arbeitet natürlich in eine SQLite oder MySQL, nicht influxDB.