(gelöst) Daten aus DBLog -> Perl-Array

Begonnen von jannis, 23 Februar 2020, 12:20:23

Vorheriges Thema - Nächstes Thema

jannis

Per DBLog logge ich alle Events in eine Datenbank.
Wie bekommt man in FHEM über Perl am einfachsten an readings aus der Datenbank?
Konkret, wie komme ich an alle Einträge in der Datenbank für "Steckdose_01"?

Über DBRep könnte ich natürlich abfragen:
select TIMESTAMP, DEVICE, READING, VALUE from history where DEVICE = "Steckdose_01";

Aber ich möchte diese Daten dann automatisch weiterverarbeiten. Also müsste ich sie in Perl in einem Array haben. Wie ist also der einfachste Weg, die Daten ohne Umwege in einen Perl-Array zu übertragen?
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

DS_Starter

Hallo jannis,

ZitatAlso müsste ich sie in Perl in einem Array haben. Wie ist also der einfachste Weg, die Daten ohne Umwege in einen Perl-Array zu übertragen?
Der Weg über ein Array ist nicht optimal denn du holst ja mit deinem Statement alle Einträge für die Steckdose aus der DB. Der Umfang wird vermutlich bedeutend sein.

Es gibt im DbRep verschiedene bereits eingebaute Möglichkeiten um Daten für die weitere Verarbeitung zur Verfügung zu stellen. Eine wesentliche Möglichkeit dafür ist das Attribut userExitFn.

Wenn du noch etwas genauer darstellst was du machen möchtest kann ich dir evtl. einen Weg zeichnen.

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

jannis

#2
Zitat von: DS_Starter am 23 Februar 2020, 12:44:31
Hallo jannis,
Der Weg über ein Array ist nicht optimal denn du holst ja mit deinem Statement alle Einträge für die Steckdose aus der DB. Der Umfang wird vermutlich bedeutend sein.

Es gibt im DbRep verschiedene bereits eingebaute Möglichkeiten um Daten für die weitere Verarbeitung zur Verfügung zu stellen. Eine wesentliche Möglichkeit dafür ist das Attribut userExitFn.

Wenn du noch etwas genauer darstellst was du machen möchtest kann ich dir evtl. einen Weg zeichnen.

Grüße,
Heiko

Auf Dein Angebot bezüglich DBRep komme ich gleich noch zurück.

Aber zunächst zum direkten übernehmen von Daten in einen perl-array:
die "select"-Abfrage oben wirft natürlich eine Menge Datensätze raus.

Je nach Bedarf filter daher ich die gewünschten Datensätze per "where ...", z.B.:

select TIMESTAMP, DEVICE, READING, VALUE from history where DEVICE = "Steckdose_01" and READING="ENERGY_Power" order by TIMESTAMP DESC LIMIT 50;


Also zurück zur Frage, wie bekommt man das Suchergebnisse ohne Umwege in ein perl-array?
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

jannis

Zitat von: jannis am 23 Februar 2020, 13:02:00
Auf Dein Angebot bezüglich DBRep komme ich gleich noch zurück.

Aber zunächst zum direkten übernehmen von Daten in einen perl-array:
die "select"-Abfrage oben wirft natürlich eine Menge Datensätze raus. Je nach Bedarf filter daher ich die gewünschten Datensätze per "where ...", z.B.:

select TIMESTAMP, DEVICE, READING, VALUE from history where DEVICE = "Steckdose_01" and READING="ENERGY_Power" order by TIMESTAMP DESC LIMIT 50;


Also zurück zur Frage, wie bekommt man das Suchergebnisse ohne Umwege in ein perl-array?
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

DS_Starter

Ok, wenn du über where noch filterst sieht die Sache schon anders aus.  :)

Also erstes Besipiel. Wenn man zum Beispiel folgendes Statement ausführt:


set ... sqlCmd 
select TIMESTAMP, DEVICE, READING, VALUE from history where DEVICE="SMA_Energymeter" order by TIMESTAMP DESC limit 50;


und hast das Attribut


sqlResultFormat = sline


gesetzt, bekommt man ein solches Ergebnis im Reading SqlResult:


2020-02-23 13:06:04|SMA_Energymeter|state|-345.6]|[2020-02-23 13:06:04|SMA_Energymeter|Saldo_Wirkleistung|-345.6]|[2020-02-23 13:06:04|SMA_Energymeter|L3_Strom|1.50]|[2020-02-23 13:06:04|SMA_Energymeter|L3_Spannung|234.6]|[2020-02-23 13:06:04|SMA_Energymeter|L2_Strom|0.36]|[2020-02-23 13:06:04|SMA_Energymeter|L2_Spannung|235.1]|[2020-02-23 13:06:04|SMA_Energymeter|L1_Strom|1.17]|[2020-02-23 13:06:04|SMA_Energymeter|L1_Spannung|234.3]|[2020-02-23 13:06:04|SMA_Energymeter|Einspeisung_Wirkleistung_Zaehler|15495.8739]|[2020-02-23 13:06:04|SMA_Energymeter|Einspeisung_Wirkleistung|0.0]|[2020-02-23 13:06:04|SMA_Energymeter|Einspeisung_WirkP_Zaehler_Diff|0]|[2020-02-23 13:06:04|SMA_Energymeter|Einspeisung_WirkP_Verguet_Diff|0.0000]|[2020-02-23 13:06:04|SMA_Energymeter|Bezug_Wirkleistung_Zaehler|10938.4169]|[2020-02-23 13:06:04|SMA_Energymeter|Bezug_WirkP_Zaehler_Diff|0.0075]|[2020-02-23 13:06:04|SMA_Energymeter|Bezug_WirkP_Kosten_Diff|0.0020]|[2020-02-23 13:05:04|SMA_Energymeter|state|-496.7]|[2020-02-23 13:05:04|SMA_Energymeter|Saldo_Wirkleistung|-496.7]|[2020-02-23 13:05:04|SMA_Energymeter|L3_Strom|1.50]|[2020-02-23 13:05:04|SMA_Energymeter|L3_Spannung|235.1]|[2020-02-23 13:05:04|SMA_Energymeter|L2_Strom|0.45]|[2020-02-23 13:05:04|SMA_Energymeter|L2_Spannung|235.3]|[2020-02-23 13:05:04|SMA_Energymeter|L1_Strom|1.36]|[2020-02-23 13:05:04|SMA_Energymeter|L1_Spannung|233.9]|[2020-02-23 13:05:04|SMA_Energymeter|Einspeisung_Wirkleistung_Zaehler|15495.8739]|[2020-02-23 13:05:04|SMA_Energymeter|Einspeisung_Wirkleistung|0.0]|[2020-02-23 13:05:04|SMA_Energymeter|Einspeisung_WirkP_Zaehler_Diff|0]|[2020-02-23 13:05:04|SMA_Energymeter|Einspeisung_WirkP_Verguet_Diff|0.0000]|[2020-02-23 13:05:04|SMA_Energymeter|Bezug_Wirkleistung_Zaehler|10938.4094]|[2020-02-23 13:05:04|SMA_Energymeter|Bezug_WirkP_Zaehler_Diff|0.0064]|[2020-02-23 13:05:04|SMA_Energymeter|Bezug_WirkP_Kosten_Diff|0.0017]|[2020-02-23 13:04:04|SMA_Energymeter|state|-350.3]|[2020-02-23 13:04:04|SMA_Energymeter|Saldo_Wirkleistung|-350.3]|[2020-02-23 13:04:04|SMA_Energymeter|L3_Strom|1.49]|[2020-02-23 13:04:04|SMA_Energymeter|L3_Spannung|234.9]|[2020-02-23 13:04:04|SMA_Energymeter|L2_Strom|0.40]|[2020-02-23 13:04:04|SMA_Energymeter|L2_Spannung|235.2]|[2020-02-23 13:04:04|SMA_Energymeter|L1_Strom|1.17]|[2020-02-23 13:04:04|SMA_Energymeter|L1_Spannung|233.3]|[2020-02-23 13:04:04|SMA_Energymeter|Einspeisung_Wirkleistung_Zaehler|15495.8739]|[2020-02-23 13:04:04|SMA_Energymeter|Einspeisung_Wirkleistung|0.0]|[2020-02-23 13:04:04|SMA_Energymeter|Einspeisung_WirkP_Zaehler_Diff|0]|[2020-02-23 13:04:04|SMA_Energymeter|Einspeisung_WirkP_Verguet_Diff|0.0000]|[2020-02-23 13:04:04|SMA_Energymeter|Bezug_Wirkleistung_Zaehler|10938.4030]|[2020-02-23 13:04:04|SMA_Energymeter|Bezug_Wirkleistung|350.3]|[2020-02-23 13:04:04|SMA_Energymeter|Bezug_WirkP_Zaehler_Diff|0.0058]|[2020-02-23 13:04:04|SMA_Energymeter|Bezug_WirkP_Kosten_Diff|0.0016]|[2020-02-23 13:03:04|SMA_Energymeter|state|-394.5]|[2020-02-23 13:03:04|SMA_Energymeter|Saldo_Wirkleistung|-394.5]|[2020-02-23 13:03:04|SMA_Energymeter|L3_Strom|1.51]|[2020-02-23 13:03:04|SMA_Energymeter|L3_Spannung|235.0


Du brauchst quasi nur im Attribut userExitFn eine Sub in 99_myUtils anzugeben die dieses Reading und dessen Inhalt empfängt und daraus mit:


@array = split("]|[", $value);


ein Array erstellt. Dort kann du auch gleich die Weiterverarbeitung verorten.
Mit dem Attr sqlResultFormat  kann man aber auch ein JSON erstellen oder mit sqlResultFormat  = mline eine mulilineformat und kannst damit weitermachen.

Ganz ohne Umweg ist das nicht, aber denke es stellt kein Problem für dich dar.  ;)
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

jannis

Danke, das hilft mir gewiss weiter.
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?