ERLEDIGT: mySQL/mariaSQL auslesen

Begonnen von Kornelius777, 28 April 2019, 14:41:16

Vorheriges Thema - Nächstes Thema

Kornelius777

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?

DS_Starter

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
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

Kornelius777

#2
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...

DS_Starter

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.
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