Stromverbrauch berechnen - dblog

Begonnen von Lars, 24 Februar 2014, 19:05:14

Vorheriges Thema - Nächstes Thema

Lars

Mahlzeit!
Ich logge über ein SMLUSB Device meinen Stromzähler. Der aktuelle Verbrauch und Zählerstand wird nun kontinuierlich in das dblog geschrieben. Auf das dblog mache ich derzeit nur einen Plot über den aktuellen Verbrauch. Jetzt überlege ich, wie ich am sinnvollsten Delta-Zählerstände (Tages, Wochen-, Monat-, Jahresverbrauch) berechne und darstelle. Ich möchte
a) die vier Werte im FHEMWEB anzeigen (momentaner Stand)
b) für jeden Delta-Stand einen Plot erstellen
c) die Werte später aus der db mit anderen Tools abfragen können

Meine erste Idee war vier Dummys zu erstellen und diese dann stündlich durch ein "at" zu berechnen.
- aktueller Stand - Stand von heute 00:00 Uhr
- aktueller Stand - Stand vom letzten Montag 00:00 Uhr
- aktueller Stand - Stand vom letzten Monatsersten 00:00 Uhr
- aktueller Stand - Stand vom letzten 01.01. 00:00 Uhr

Nur... Wenn ich das stündlich mache, dann zeigt mir ja SVG für jede Stunde einen eigenen Wert an. Ich will ja pro Tag / Woche / Monat / Jahr nur einen Wert anzeigen der kontinuierlich wächst. Oder kann man die x-Achse konfigurieren, dass sie nicht auf den Timestamp geht?

Dann bin ich über die Funktion "dblog get when used for webcharts" aus der Reference gestoßen und nun komplett unsicher. Wie geht man dieses Thema denn sinnvoll an? Vielleicht kann jemand der dies bereits umgesetzt hat ein paar Tipps geben.

Gruß
Lars
FHEM Hauptsystem auf ESXi VM | dblog | 3 rPi für Nebensysteme | 2 Beaglebone Black Test- / Integrationssystem

JoeALLb

Hallo Lars, ich experimentiere gerade ebenfalls mit einer Lösung dafür.
Ich nehme jedoch keine dummys, sondern userReadings.
Vielleicht finden wir gemeinsam eine gute Lösung?
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Lars

Hallo JoeALLb,

hört sich spannend an, erzähl mir mehr von Deiner Lösung!

Gruß
Lars
FHEM Hauptsystem auf ESXi VM | dblog | 3 rPi für Nebensysteme | 2 Beaglebone Black Test- / Integrationssystem

JoeALLb

Mein derzeitiger Status:
Ich habe mir einen SQL gebaut, der mir für jeden Tag eine Zusammenfassung schreibt und in die DB einfügt.
Das klappt soweit ganz gut und ich plane dann, künftig die kleinen einzelnen "total" Readings zu löschen, da ich diese nicht benötige.

Die stündlichen Werte ermittle ich derzeit mit einem userReadiung.
Monatliche Werte ermittle ich derzeit noch gar nicht, ließe sich aber sehr einfach per SQL erledigen.

So ganz zufrieden bin ich noch nicht, und arbeite noch etwas an der Umsetzung.
Da Du noch kein DBLog verwendest, wird die Umsetzung bei dir vermutlich schwieriger.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Lars

DbLog hab ich im Einsatz. Mit Deiner Lösung bist Du also schon weiter als ich.
Poste doch mal deine Querys und das Skript zur Setzung der UserReadings.

Gruß
Lars
FHEM Hauptsystem auf ESXi VM | dblog | 3 rPi für Nebensysteme | 2 Beaglebone Black Test- / Integrationssystem

JoeALLb

Wenn Du mir danach hilfst, einen Wiki-Eintrag dafür zu schreiben ;-)

Es hängt natürlich stark davon ab, was Du für Werte aktuell bekommst. Ich habe verschiedene Stromzähler, die jeweils andere Readingsliefern.

Hier ein Beispiel. Dieser schickt regeläßig ein Reading "total".
Dafür verwende ich folgendes Userreading um die Werte wegzuspeichern;
consumptionHour:total monotonic {ReadingsVal($name,'total',0)},consumptionDay:total monotonic {ReadingsVal($name,'total',0)}

in einem Stündlichen notify setzte ich folgendes;:
+*01:00:00 {
fhem("setreading power consumptionLastHour ".ReadingsVal('powersolar','consumptionHour',0));
fhem("setreading power consumptionHour 0")
}

alignTime 00:59:59


Das Mitternächtliche Notify sieht so aus:
*00:00:00 {
fhem("setreading power day_last ".(ReadingsVal('powersolar','total',0)-ReadingsVal('powersolar','consumptionDay',0)));
fhem("setreading power consumptionDay ".ReadingsVal('powersolar','total',0));
}


Das landet dann in der DB, und nach ca.. einem Monat lösche ich die vielen alten "total" Werte, da ich sie nicht mehr benötige.

Dadurch erhalte ich ab jetzt die Stundenzusammenfassungen,.
Um diese für bereits geloggte Tage zu generieren, habe ich mir einen SQL gebaut, den ich gerade nicht griffbereit habe.

Hilft Dir das schon mal weiter, oder hast Du andere Werte mit denen Du arbeiten musst?
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Lars

Na klar, das mit dem Wiki-Eintrag bekommen wir hin.
Ich habe deinen Code an meine Devices angepasst und eingefügt, ich lasse das jetzt mal laufen.
Was mir schon aufgefallen ist. Das at +*01:00:00 wird bei mir an den ZP des FHEM-Starts angepasst. Ich denke mit dem "alignTime 00:59:59" korrigierst Du das. Richtig? Gehört da nicht noch etwas vor? Ich habe das jetzt zunächst in meiner cfg ausgelassen.
FHEM Hauptsystem auf ESXi VM | dblog | 3 rPi für Nebensysteme | 2 Beaglebone Black Test- / Integrationssystem

JoeALLb

Zitat von: Lars am 28 Februar 2014, 18:04:38
korrigierst Du das. Richtig? Gehört da nicht noch etwas vor? Ich habe das jetzt zunächst in meiner cfg ausgelassen.

korrekt, das ist ein Attribut.

attr <device> alignTime 00:00:00
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

JoeALLb

@Lars:
Funktioniert es bisher bei Dir mit den Userreadings?

Für die Bereinigung von Altdaten hätte ich die SQL-Befehle griffbereit, um diese in die DB einzutragen.
Leider scheiter ich am Plotten dieser Daten (http://forum.fhem.de/index.php/topic,20836.0.html). Ich hoffe mal,
dass ich den Fehler bald finde um hierfür eine Anleitung schreiben zu können.
Vorallem die Usercommands aus http://forum.fhem.de/index.php/topic,20735.0.html können hierfür sicherlich gut genutzt werden.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Lars

Die stündlichen Werte sind kein Problem, bei den Tageswerten habe ich derzeit noch ein Problem. Ich habe nun die Definitionen verändert und warte jetzt bis Mitternacht.  :o
Auf dem System hatte ich kein Statefile definiert, dadurch bin ich bei einem Neustart von FHEM immer mit dem Total-Wert der Zähler gestartet, das ist jetzt auch gefixt.
Was genau meinst Du mit Bereinigung der Altdaten? FHEM schreibt bei mir nur den stündlichen Wert und den Tageswert (hoffentlich ab heute) in die DB. Diese Daten werde ich auch langfristig aufheben. Ich habe jetzt schon über 600.000 Datensätze in der histrory, da kommt es auf die paar Einträge auch nicht mehr an.

Deine gplot Datei habe ich mir angeschaut und kann da nichts ungewöhnliches dran erkennen. Hast du mal die alten Readings aus Deiner DB gelöscht um zu schauen, ob es auch mit "frischen" Werten zu aussieht?

Gruß
Lars
FHEM Hauptsystem auf ESXi VM | dblog | 3 rPi für Nebensysteme | 2 Beaglebone Black Test- / Integrationssystem

JoeALLb

#10
Unter bereinigen verstehe ich:

Ich habe bisher pro Tag ca. 500 Einträge in die DB mit dem Reading "power".
Ich erstelle mit den Userreadings für jeden Tag stündliche und tägliche consolidierte Einträge (last_hour, last_day).
Da in der Vergangenheit diese Readings noch nicht gelaufen sind, habe ich einen SQL erstellt, der mir die Werte für last_hour und last_day
aus dem bisher geloggten "power" Reading berechnet und ebenfalls in die DB einträgt. Danach könnte ich die
nicht mehr benötigten, alten "power"-readings aus der DB löschen. bei mir sind das aktuell 1.7Mio Datensätze, die ich dadurch löschen kann.

Mein Problem mit den Plots ist, dass die über das Userreading geloggten Werte korrekt angezeigt werden, die über den SQL-Befehl  in
die DB eingetragenen Werte werden nicht angezeigt. Seltsam....

Ich bin jedoch noch am überlegen, ob mir die Zusammenfassung nach "stündlich" ausreicht, oder ob ich dies nochmals in kleinere Einheiten unterteile (10 minütlich, halbstündlich, oder gar konfigurierbar).

Würdest Du die bisher geloggen Details einfach in der DB belassen?

FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Lars

Ah ok, jetzt verstehe ich. An den Queries hätte ich in der Tat Interesse, schick sie doch mal rüber. Ich probiere das dann mal auf meiner Testumgebung aus, vielleicht kommen wir dann auch bei Deinem Darstellungsproblem in SVG weiter.

Noch protokolliere ich den Momentanverbrauch von zwei Stromzählern alle 30 Sekunden und lösche diese Daten nicht. Ich persönlich könnte auf diese Daten nach 30 Tagen verzichten und dann nur noch die stündlichen Werte behalten. Bei diesen könnte ich mir vorstellen, dass sie mich nach 365 Tagen auch nicht mehr interessieren und ich nur noch die Tageswerte langfristig speichere. Kommt auf meine TODO Liste...
Generell macht es natürlich absolut Sinn, alle Daten die nach einer Zeit uninteressant sind zu löschen.

Noch kürzere Intervalle benötige ich persönlich nicht.
FHEM Hauptsystem auf ESXi VM | dblog | 3 rPi für Nebensysteme | 2 Beaglebone Black Test- / Integrationssystem

JoeALLb

#12
Welche Werte liefert denn dein Stromzähler?

Ein ConsumtionTotal, das den Wert immer nach oben zählt, oder ein
power, das die in der zwischenzeit verbrauchten watt/h angibt?

Ich habe für beide Fälle unterschiedliche SQL-Statements.


Edit1:
Für consumptionTotal: Achtung: Dieser Select ist sehr langsam, vorallem ohne passenden Index, funktioniert aber bei mir ganz gut und ich benötigte ihn ja nur einmalig.
Wenn mir das Ergebnis des Select-Statements gefällt, schreibe ich einfach "insert into history" davor, dann werden diese Datensätze direkt eingetragen.
SELECT LOW_PRIORITY DATE_FORMAT(a.timestamp, '%Y-%m-%d 00:00:00') AS JustDate,a.device,'' as type,concat('last_',a.reading,': ',b.value-a.value) as event, b.value-a.value value,'' as unit FROM history a join history b on a.device=b.device and a.reading=b.reading where b.timestamp > DATE_FORMAT(a.timestamp, '%Y-%m-%d 23:59:58') and a.READING='consumptionTotal' and a.DEVICE='PCA301_02' GROUP BY JustDate;
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Lars

Er liefert zwei Werte:
- TOTAL-Verbrauch (kW/h)
- Momentanverbrauch (W)
FHEM Hauptsystem auf ESXi VM | dblog | 3 rPi für Nebensysteme | 2 Beaglebone Black Test- / Integrationssystem

JoeALLb

Der Momentverbrauch hilft uns dann nicht sonderlich weiter...., ein sum() über den ganzen Tag hat bei mir keine schönen Ergebnisse gebracht,
obwohl der zugehörige SQL-Befehl schneller wäre ;-)

Ich habe den oberen Beitrag schon editiert. Du solltest hinten nur das reading und den device anpassen müssen.

Eventuell machst Du dir vorher eine Kopie der Datenbank, je nachdem wie schnell der SQL ausgeführt wird, und was für eine DB
Du verwendest könnte er deine DB für inserts locken.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270