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?
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
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?
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?
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. ;)
Danke, das hilft mir gewiss weiter.