FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Kornelius777 am 28 April 2019, 14:41:16

Titel: ERLEDIGT: mySQL/mariaSQL auslesen
Beitrag von: Kornelius777 am 28 April 2019, 14:41:16
Hallo Leute,

vor ca. einem Monat habe ich ein Dummy-Device gebaut, in das fhem täglich um 23:59:55 Uhr den aktuellen Gaszähler- und Stromzähler-Wert hineinschreibt.
Das Ganze läuft prima - keine Beschwerden.

Jetzt überlege ich, wie es möglich ist, aus der Datenbank exakt diese Information herauszulocken:
Wie war der jeweilige Zählerstand täglich um 23:59:55 Uhr?
Ziel: Ich möchte mein Dummy-Device mit den Daten aus der Datenbank befüllen.

Aus Unerfahrenheit fällt mir leider nicht ein, wie das gehen könnte.

Mag mir jemand eine Hilfestellung geben?

SELECT * FROM `history` WHERE `TIMESTAMP` LIKE '%2019-%-% 23:59:55%'
funktioniert natürlich nicht. So werden ja nur die Events ausgegeben, die exakt zu dieser Uhrzeit geschrieben wurden...

Hat jemand einen Tipp?

Danke Euch!

Grüße!

Kornelius

EDIT:
Alternativ könnte ich mir vorstellen, einfach den letzten Wert des Tages pro Device zu nehmen.
Wie würde das gehen?
Titel: Antw:mySQL/mariaSQL auslesen
Beitrag von: DS_Starter am 28 April 2019, 15:13:20
Hallo Kornelius,

dafür gibt es bereits ein fertiges Kommando im DbRep.
Auszug aus der Commandref:

Sobald ein DbRep-Device definiert ist, wird die Funktion DbReadingsVal zur Verfügung gestellt. Mit dieser Funktion läßt sich, ähnlich dem allgemeinen ReadingsVal, der Wert eines Readings aus der Datenbank abrufen. Die Funktionsausführung erfolgt blockierend. Die Befehlssyntax ist:

    DbReadingsVal("<name>","<device:reading>","<timestamp>","<default>")

    Beispiele:
    $ret = DbReadingsVal("Rep.LogDB1","MyWetter:temperature","2018-01-13 08:00:00","");
    attr <name> userReadings oldtemp {DbReadingsVal("Rep.LogDB1","MyWetter:temperature","2018-04-13 08:00:00","")}

    <name>    : Name des abzufragenden DbRep-Device
    <device:reading>    : Device:Reading dessen Wert geliefert werden soll
    <timestamp>    : Zeitpunkt des zu liefernden Readingwertes (*) in der Form "YYYY-MM-DD hh:mm:ss"
    <default>    : Defaultwert falls kein Readingwert ermittelt werden konnte


(*) Es wird der zeitlich zu <timestamp> passendste Readingwert zurück geliefert, falls kein Wert exakt zu dem angegebenen Zeitpunkt geloggt wurde.

Damit kannst du eine Variable füllen und mit setreading in ein Dummy-Reading schreiben ... what ever.
Das Verfahren ist im Wiki zu DbRep beschrieben:
https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Werte_mittels_Funktion_DbReadingsVal_.C3.BCbertragen

Grüße,
Heiko
Titel: Antw:mySQL/mariaSQL auslesen
Beitrag von: Kornelius777 am 28 April 2019, 15:14:21
Jetzt habe ich etwas gebastelt und bin auf folgende Lösung gekommen:

mysql -u fhemuser --password=fhempassword < /tmp/fhem.mysql > /tmp/fhem.out

...wobei /tmp/fhem.mysql so aussieht:

SELECT MAX(cast(`value` as unsigned)),`TIMESTAMP` FROM `history` WHERE `DEVICE`="HAR.StromZaehler" and `READING`="total_consumption_kwh" GROUP BY DATE(`TIMESTAMP`)

So konnte ich jetzt schonmal die Stromwerte auslesen.
Ein erster Schritt...
Titel: Antw:mySQL/mariaSQL auslesen
Beitrag von: DS_Starter am 28 April 2019, 15:18:43
Nimm ein DbRep-Device für solche Auswertungen. Das macht es dir viel einfacher die Datenbankwerte in FHEM zu integrieren.  ;)
Im Wiki stehen viele Beispiele dafür.