[Geloest]: Daten aus Log-DB lesen und in Fhem weiterverarbeiten

Begonnen von Hackstall, 31 Mai 2019, 21:24:43

Vorheriges Thema - Nächstes Thema

Hackstall

Hallo,

ich möchte gerne Daten aus meiner FHEM Datenbank lesen und weiterverarbeiten
und das Ergebnis anzeigen.

Ist das moeglich?

Wenn ich Kurven plotte werden ja auch Daten aus der Datenbank gelesen.

Seht Ihr hier eine Moeglichkeit?

Danke Andreas

roedert

Mit set userCommand auf das Datenbank-Logdevice kannst du beliebige SQL-Statements absetzen, das Ergebnis steht dann im Reading userCommandResult und kann beliebig weiterverarbeitet werden.

Hackstall

Hallo,

danke war mir nicht bekannt.
Ein Forenbeitrag gibt es hierzu aber dieser ist nicht befriedigend.

Hier wird gesagt dass der usercommand nur zu testzwecken implementiert wurde.
in der Commandref kann ich leider auch nichts finden.

Wie auch immer Test oder nicht waere mir egal, sofern ich meine Werte (gerne über Sql) zurückbekomme.

Mir ist aber nicht klar wie die Returnreadings aussehen.
Haettest Du vielleicht ein Beispiel?

Danke A. Krause

roedert

#3
Was willst denn genau erreichen?

Ich halte zB ca 30 Tage meine Zählerstände im Log vor und mache hiermit eine "Jahreshochrechnung"
Aus der DB wird der erste und letzte Wert inclusive der entsprechenden Timestamps ausgelesen und daraus der Jahresverbauch hochgerechnet.

v2 ... letzter Zählerstand
t2 ... letzter Timestamp
v1 ... erster Zählerstand
t1 ... erster Timestamp

Die Differenz wird in den Readings kWh und days gespeichert .... das Attribut stateFormat macht dann die Jahreshochrechnung:
{sprintf("%.0f",ReadingsVal($name,'kWh',0)/ReadingsVal($name,'days',0)*365) . " kWh/Jahr"}

{
$v2 = ReadingsVal('Strom','kWh',0);
$t2 = str2time(ReadingsTimestamp('Strom','kWh',0));
fhem("set DbLog userCommand select timestamp from history where device='Strom' and reading='kWh' order by timestamp limit 1");
$t1 = str2time(ReadingsVal('DbLog','userCommandResult',0));
fhem("set DbLog userCommand select value from history where device='Strom' and reading='kWh' order by timestamp limit 1");
$v1 = ReadingsVal('DbLog','userCommandResult',0);
fhem("setreading Strom.Jahr kWh " . ($v2-$v1));
fhem("setreading Strom.Jahr days " . (($t2-$t1)/(24*60*60)));
}

Hackstall

Hallo,

vielen Dank das ist genau was ich gebraucht habe.
Spitze. Danke.
viele Gruesse
Andreas


DS_Starter

Denkt aber bitte daran, dass euer FHEM für die Zeit der db-operation blockiert wird ! Je nach geschwindigkeit der db . Und wenn die db nicht reagiert bleibt euer fhem stehen.
Alternative ist DbRep, siehe Wiki zu Beispielen. Ist etwas aufwendiger, aber sicherer.

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