FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Klinki am 29 April 2016, 11:05:20

Titel: Zählerstände aus "fremder" Datenbank darstellen
Beitrag von: Klinki am 29 April 2016, 11:05:20
Hallo Gemeinde,

Folgendes Szenario: Ich verwende einen Raspberry Pi über dessen GPIOs (mit ein bisschen Außenbeschaltung) Impulse von Gas, Ferrais(Strom) und diverser s0-Zähler erfasst werden. Es werden aber auch Zustände erfasst (z.B. Heizung An oder aus). Diese werden aktiv gepollt.
Ein Python Skript wertet die Impulse aus und schreibt Verbräuche und Zählerstände in die MySQL-Datenbank meines FHEM-Servers. Funktioniert auch alles ganz prima.

Problematisch wird es allerdings die aktuellen Zählerstände in fhem dann auch darzustellen.

Ich habe folgenden Weg gewählt:
Um nun Zählerstände in fhem direkt anzeigen zu können, muss fhem die aktuellen Werte aus der Datenbank holen. Dazu wird der Befehl userCommand des DbLog-Moduls genutzt. Mit diesem Befehl lassen sich Datenbank-Abfragen durchführen. Das Ergebnis dieser Abfrage wird im DbLog-eigenen Reading userCommandResult abgelegt und wird von dort aus weiterverarbeitet.

Das folgende Beispiel zeigt exemplarisch das Auslesen von Zählerständen von 2 s0 Zählern (Klimaanlagen Serverraum und Büro).
Es werden zwei Dummys angelegt, die die Zählerstände aufnehmen:

# Zählerstand Klimaanlage Server
define s0_KlimaanlageServer dummy
attr s0_KlimaanlageServer room Energiezähler
attr s0_KlimaanlageServer group Zählerstand

# Zählerstand Klimaanlage Büro
define s0_KlimaanlageBuero dummy
attr s0_KlimaanlageBuero room Energiezähler
attr s0_KlimaanlageBuero group Zählerstand


Eine Dummy-Variable (dummy_s0) nimmt das Ergebnis der Abfrage entgegen. Das Notify reagiert auf das Reading userCommandResult welches nach der Datenabfrage aktualisiert wird und "füttert" die Variable dummy_s0 mit dem Ergebnis der Abfrage.


define dummy_s0 dummy
define dummy_s0Notif notify logdb:userCommandResult.* {fhem("set dummy_s0 $EVTPART1");;}


Über ein at-Kommando wird ein ganzer Befehlsblock alle 5 Minuten ausgeführt:


define UpdateZaehlerstaende at +*00:05:00 { \
{fhem("set logdb userCommand SELECT round(VALUE,2) FROM history where DEVICE='Raspi_9'  AND UNIT = 'kWh' order by TIMESTAMP desc limit 1")};;  my $val=Value("dummy_s0");;   {fhem ("set s0_KlimaanlageServer $val")};; \
{fhem("set logdb userCommand SELECT round(VALUE,2) FROM history where DEVICE='Raspi_26' AND UNIT = 'kWh' order by TIMESTAMP desc limit 1")};;  my $val=Value("dummy_s0");;   {fhem ("set s0_KlimaanlageBuero $val")};; \
}


Die Befehle im Einzelnen:

define UpdateZaehlerstaende at +*00:05:00

-> Führe at-Kommando alle 5 Minuten aus


{fhem("set logdb userCommand SELECT round(VALUE,2) FROM history where DEVICE='Raspi_9'  AND UNIT = 'kWh' order by TIMESTAMP desc limit 1")}

-> Setze DB-Abfrage ab. Über den Device-Namen und die Einheit (UNIT) ist der Zähler eindeutig definiert. Der Zusatz limit 1 sorgt dafür, dass nur 1 Datensatz zurückgegeben wird


my $val=Value("dummy_s0")


Nachdem die Abfrage ausgeführt wurde, kann deren Ergebnis aus der (fhem-)Variablen dummy_s0 in die (Perl-)Variable $val übernommen werden. Diese steht dann auch im fhem zur Verfügung. Somit lässt sich mit


fhem ("set s0_KlimaanlageBuero $val")

der Wert aus $val der fhem-Variablen s0_KlimaanlageBuero übergeben


....funktioniert! Erscheint mir aber ziemlich umständlich. Falls jemand Tipps oder Anmerkungen hat: immer raus damit!