[gelöst] Plot für Stromverbrauch Vergleich Aktuell / vor einem Jahr

Begonnen von andi11, 03 Oktober 2019, 07:57:40

Vorheriges Thema - Nächstes Thema

andi11

Hallo,
ich erfasse den Zählerstand von meinen Stromzählern, und protokolliere ins DBLog.
Dank dem tollen Statistics Modul hab ich eine Berechnung von Verbrauch/Tag Verbrauch/Monat usw.
Z.b. Hour: 0 Day: 2 Month: 27 Year: 1923

#logdb Stromverbrauch_Zaehler1:statTotal-get:::$val=~s/.*Day..(([\d]*.[\d]*)|[\d]*).*/$1/e
#logdb Stromverbrauch_Zaehler1:statTotal-get:::$val=~s/.*Month..(([\d]*.[\d]*)|[\d]*).*/$1/e

plot "<IN>" using 1:2 axes x1y1 title 'Tag' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Monat' ls l1 lw 1 with lines


Jetzt würde ich mir gerne einen Chart basteln um den Verbauch zu vergleichen.
Bevorzugt: Vergleich Monatsverbrauch aktuelles Jahr mit letztem Jahr
=> z.b. erster Plot (Maximalerwert Januar, Maximalwert Februar....)
zweiter Plot (Maximalwert letzter Januar, Maximalwert letzter Februar)
Es kann dabei rollierend sein, muss aber nicht.

Im Anhang hab ichs mal mit LibreOffice zusammengeklickt.

CBSnake

Hi,

interessanter Ansatz, in der Beschreibung zum Plot hab ich dazu nichts gefunden, bliebe noch die Möglichkeit mit Readings zu arbeiten und das alte Reading nach einem Jahr nochmals in das Logfile zu schreiben
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

andi11

Man könnte evl eine Art rollierenden Puffer mit readings basteln. Jeweils Anfang des Monats:
ReadingLast-3=ReadingLast-2
ReadingLast-2=ReadingLast-1
ReadingLast-1=ReadingLast-0
ReadingLast-0=statisticslastmonth
Nachteil:
Wenn ich mal auf die Idee komme das ich später mit dem Verbrauch von vor 2Jahren oder so zu vergleichen hab ich keinerlei Daten.

Mögliche Ansätze die mir ansonsten einfallen:
Zum Anfang des Monats den Verbrauch einmalig in einem Reading "wegsichern". Und dann damit und Logproxy irgendwas "hinfrickeln"
Nachteil:
ich habe bisher dieses historische Reading nicht=> bei 0 Daten anfangen
Logproxy ist mir irgendwie "suspekt" es ist wahnisnnig mächtig, aber ich kapier es einfach nicht.

"Manuelle" SQLQuery plotten.
Mit SQL sollte sich eine entsprechende Abfrage basteln lassen.
Nachteil:
Dafür ist dieses kombinierte Statistics Reading nicht super.
Keine Ahnung ob man irgendwie mit Boardmitteln Querys plotten kann?

Abhilfe für die fehlenden passenden historischen Daten könnte jeweils sein, dass ich die manuell im DBLog mit SQL einpflege.

rudolfkoenig

Moeglichkeiten, die mir einfallen:
- beide Plots einzeln erstellen, Linie per Menu aus dem ersten Plot kopieren und per Paste im Zweiten einfuegen
- logProxy verwenden
- die Daten kopieren, dabei Namen anpassen und Datum um ein Jahr verschieben


Shadow3561

Mit logProxy sollte es funktionieren.

Hier hatte jemand ein ähnliches Anliegen und hat es dann mit logProxy gelöst.

https://forum.fhem.de/index.php?topic=87715.0

andi11

mit Logproxy krieg ich einen Offset in den Chart. D.h. 2x das gleiche Reading anzeigen, einmal mit einmal ohne Offset.
Aber wie könnte ich vorher das Monatsmaximum rausfiltern? Wären halt massiv weniger Werte.

Shadow3561

#6
Ich würde mit logproxy arbeiten. Dort kannst du Logdaten aus verschiedenen Quellen benutzen.
https://wiki.fhem.de/wiki/LogProxy
Einfach mal durchlesen. Es ist ziemlich mächtig.

Ich habe mit offset gearbeitet um mir die Werte vom Vortag als Vergleich anzeigen zu lassen.  Dies geht auch mit den Werten vom Vorjahr.

# Created by FHEM/98_SVG.pm, 2019-06-30 13:13:25
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid y2tics
set ylabel "Ampere"
set y2label "Volt"
set yrange [0:9]
set y2range [0:250]

#logproxy DbLog:logdb:WR_Fronius_MPPT:Current_String1__A
#logproxy DbLog:logdb:WR_Fronius_MPPT:Voltage_String1__V
#logproxy DbLog:logdb,offset=60*60*24:WR_Fronius_MPPT:Current_String1__A
#logproxy DbLog:logdb,offset=60*60*24:WR_Fronius_MPPT:Voltage_String1__V

plot "<IN>" using 1:2 axes x1y1 title 'String Ampere' ls l1fill lw 0.2 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'String Volt' ls l3fill lw 0.2 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Ampere Vortag' ls l6 lw 0.5 with histeps,\
     "<IN>" using 1:2 axes x1y2 title 'Volt Vortag' ls l8 lw 0.5 with histeps



andi11

danke für deinen Code. Ich weiß, Logproxy ist sehr mächtig.

Allerdings müsste ich erstmal meine anzuzeigenden Readings reduzieren.
Aktuell habe ich eben nur ein Sammelreading aus dem Statisticsmodul mit Verbrauch/Stunde, Verbrauch/Monat und Verbrauch/Jahr.
Selbst wenn ich jetzt das Reading Verbrauch/Monat habe, dann wird das von Statistics doch deutlich öfter geschrieben als 1x pro Monat. Damit brauch das anzeigen von 2 Jahrescharts doch recht lange.
Und wenn ich jetzt mit DOIF o.ä. am Ende des Monats ab sofort ein Reading aktualisieren würde, so würden mir dooferweise die historischen Daten der letzten 1 1/2Jahre fehlen :(


andi11

#8
Also ich habs jetzt so gemacht. Für die Zukunft ein DOIF.
Dieses ermittelt immer am Monatsanfang den Verbrauch vom letzten Monat.
([01:07] and ($mday==1))
{
CopyMonthUsage("Stromverbrauch_Zaehler1","statTotal-getLast","VerbrauchLastMonth");
CopyMonthUsage("Stromverbrauch_Zaehler2","statTarif1-getLast","VerbrauchLastMonthTarif1");
CopyMonthUsage("Stromverbrauch_Zaehler2","statTarif2-getLast","VerbrauchLastMonthTarif2");
CopyMonthUsage("Stromverbrauch_Zaehler2","statTotal-getLast","VerbrauchLastMonthTotal");
}

Ans Attribut do always denken!

In myutils hab ich noch die Funktion. Im DOIF selbst sollte man die mittlerweile hinterlegen können, aber das hatte ich irgendwie nicht hingekriegt:

sub CopyMonthUsage($$$) {
#holt sich aus einem StatisticsReading den Monatsverbrauch und packt ihn in das neue Reading
     my ($device,$reading,$outreading) =@_;
     my $verbrauch=(split(" ", (ReadingsVal($device,$reading,""))))[5];
     fhem("setreading ".$device." ".$outreading." ".$verbrauch);   
}


Historische Werte habe ich direkt mittels mysql querys in der logdb hinterlegt (elegantere Lösungen gerne genommen)
INSERT INTO `fhem`.`history` (`TIMESTAMP`, `DEVICE`,`TYPE`,`EVENT`,`READING`,`VALUE`)
VALUES
('2018-02-01 1:05:00',
'Stromverbrauch_Zaehler1','KNX',
'VerbrauchLastMonth 246',
'VerbrauchLastMonth',
246
);


Und dann endlich mittels Logproxy den Plot bearbeitet
# Created by FHEM/98_SVG.pm, 2019-10-06 08:39:06
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Stromverbrauch Jahresvergleich'
set ytics
set y2tics
set grid y2tics
set ylabel "kwh"
set y2label "kwh"

#lp DbLog:logdb,offset=-60*60*24*30:Stromverbrauch_Zaehler1:VerbrauchLastMonth
#lp DbLog:logdb,offset=60*60*24*334:Stromverbrauch_Zaehler1:VerbrauchLastMonth

plot "<IN>" using 1:2 axes x1y2 title 'Aktuelles Jahr' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Letztes Jahr' ls l1 lw 1 with lines


Der komische Offset Faktor von 334 kommt vom "11Monate" schieben