Monat / Jahreswerte vergleichen und darstellen

Begonnen von MiniBlister, 19 April 2018, 21:53:45

Vorheriges Thema - Nächstes Thema

MiniBlister

Hallo,

ich bin relative neu bei fhem und komme von IPSymcon. Was mir bei fhem schwer fällt ist zu verstehen, wie ich Daten aus der DBLog aggregiere und entsprechend tabellarisch darstelle.
Es geht mir z.B. um den Stromverbauch welchen ich wie folgt darstellen moechte:






MonatVerbrauch aktuelles JahrVerbrauch letztes JahrDelta
Jan5000kwH5100kmH100kmH
Feb5000kwH5100kmH100kmH
Maerz4000kwH4100kmH100kmH

Wie muss ich da generell vorgehen? Ich koennte das sicherlich einfach ueber SQL machen aber ich denke fhem bietet da mehr. Verstehe nur noch nicht wie.

Welche Readings muss ich da anlegen und wie mache ich das auf monatlicher basis. in IPSymcon gibt es da einfach einen befehl AC_GetAggregatedValues.

Vielen Dank fuer die Starthilfe

MiniBlister


DS_Starter

#2
Hallo,

speziell für tabellarische Auswertungen der DbLog-DB habe ich das Modul DbRep erstellt.
Damit gibt es viele Möglichkeiten der DbLog-Auswertung, benötigt allerdings ein bisschen Einarbeitungszeit.
Stichwort Aggregation ... im DbRep macht man das mit dem Attribut "aggregation".

Im Wiki habe ich einen Beitrag erstellt wie man die Ergebnisauswertung einer PV-Anlage anfertigen kann: https://wiki.fhem.de/wiki/Datenbankgest%C3%BCtzte_Erstellung_der_Energiebilanz_einer_SMA_PV-Anlage_mit_%C3%9Cberschusseinspeisung

Und allgemein zu DbRep: https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten

Ergänzung: In der aktuellsten Version gibt es "DbReadingsVal" um Werte eines bestimmten Zeitpunktes aus der DB zu lesen. Das wäre sicherlich genau das Richtige für dein Vorhaben. Damit kannst du dir zB. über ein Dummy und Readingsgroup die Übersicht zusammenstellen die du vorhast.
Wenn Fragen zu DbRep sind -> Forum: https://forum.fhem.de/index.php/topic,53584.0.html

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

MiniBlister

Hallo Heiko,

vielen Dank fuer das tolle Modul. Super Arbeit.

Leider habe ich es nicht ganz verstanden und du kannst mir eventuell nochmals weiter helfen.
Ich habe ein DbRep Device angelegt.
defmod DBLogging_DbRep DbRep DBLogging
attr DBLogging_DbRep DbLogExclude .*
attr DBLogging_DbRep aggregation day
attr DBLogging_DbRep device VZStromzaehlerWP
attr DBLogging_DbRep group DbRep.Energy.Group,
attr DBLogging_DbRep reading total_consumption
attr DBLogging_DbRep readingNameMap WP_total_energy
attr DBLogging_DbRep room 99_Logging
attr DBLogging_DbRep showproctime 1

setstate DBLogging_DbRep done
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-09__WP_total_energy__2018-04-09 -
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-10__WP_total_energy__2018-04-10 -
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-11__WP_total_energy__2018-04-11 -
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-12__WP_total_energy__2018-04-12 18274737.9787
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-13__WP_total_energy__2018-04-13 18279464.0859
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-14__WP_total_energy__2018-04-14 18289173.5833
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-15__WP_total_energy__2018-04-15 18296905.4403
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-16__WP_total_energy__2018-04-16 18302704.3196
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-17__WP_total_energy__2018-04-17 18310872.4809
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-18__WP_total_energy__2018-04-18 18317402.9756
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-19__WP_total_energy__2018-04-19 18319937.0477
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-20__WP_total_energy__2018-04-20 18322619.1178
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-21__WP_total_energy__2018-04-21 -
setstate DBLogging_DbRep 2018-04-22 21:33:46 2018-04-22__WP_total_energy__2018-04-22 18329278.5655
setstate DBLogging_DbRep 2018-04-22 21:33:46 background_processing_time 0.5804
setstate DBLogging_DbRep 2018-04-22 21:33:46 db_lines_processed 14
setstate DBLogging_DbRep 2018-04-22 21:33:46 sql_processing_time 0.5689
setstate DBLogging_DbRep 2018-04-22 21:33:46 state done


Weiterhin habe ich ein Dummy Device erstellt:
defmod DbRep.Energy dummy
attr DbRep.Energy DbLogExclude .*
attr DbRep.Energy userReadings totalenergy {DbReadingsVal("DBLogging_DbRep"," \
VZStromzaehlerWP:total_consumption","2018-04-22 08:00:00","")}


Habe ich das so richtig verstanden? Leider kommt da wohl nichts an.

DS_Starter

Guten Morgen,

das ist schon mal ein guter Anfang  :), wobei es noch nicht das ist was ich meinte.

Das DbRep müsstest du auf aggregation=month stellen um für jeden Monat die Werte zusammengefasst zu bekommen.
Dann fehlen die Eingrenzungen auf das jeweilige Jahr, timestamp_begin=current_year_begin, timestamp_end=current_year_end.
Mit diesen Einstellungen würdest du für das laufende Jahr für jeden Monat die Werte bekommen die du für deine Tabelle brauchst.

Dann fehlen dir noch die gleichen Werte für das Vorjahr.
Dazu kopiere die das DbRep:

copy DBLogging_DbRep DBLogging_DbRep_previous_year 

und ändere die timestamp-Eingrenungen ab:  timestamp_begin=previous_year_begin, timestamp_end=previous_year_end.
Jetzt hast du zwei DbReps die dir für jedes zu betrachtende Jahr die Werte jedes Monats liefern, d.h. die Rohdaten für deinen Vergleich sind damit vorhanden.

Ich glaube das Dummy Device brauchst du in deinem Fall doch nicht. Unabhängig davon wird userreading in dem Fall nicht klappen weil es nur erstellt wird wenn die anderen Readings in diesem (Dummy) Device aktualisiert werden, die es ja nicht gibt.

Ich würde nun an deiner Stelle ein Device mit Readingsgroup erstellen und in diesem Device nun die Ergebnisse der beiden DbRep's entsprechend guppieren damit die von dir gewünschte Tabelle entsteht. Readingsgroup kann auch mit Zellinhalten rechnen, sodass du auch die von dir gewünschte Differenz ausrechnen und darstellen kasst. Den Dummy kannst wieder löschen.

Also der Weg wäre zunächst die DbRep-Devices so einzustellen, dass alle gewünschten Rohdaten geliefert sind und dann diese Werte in einer Readingsgroup zusammenzufassen.
Mit einem AT kannst du dann die Datenlieferung der DbReps regelmäßig ausführen lassen.

Welche DB nutzt du eigentlich ?

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

MiniBlister

Hallo Heiko,

vielen Dank für deine ausführliche Erklärung. Das hat sehr geholfen.
Ich habe das ganze auf einem upsquared http://www.up-board.org/upsquared/ board laufen unter Ubuntu und habe mysql installiert.

Ich schreibe nun folgendes in die DB:
defmod KG.sr.VZ.Heizstrom.dbrep.0 DbRep KG.sr.UP.DBLogging
attr KG.sr.VZ.Heizstrom.dbrep.0 DbLogExclude .*
attr KG.sr.VZ.Heizstrom.dbrep.0 aggregation month
attr KG.sr.VZ.Heizstrom.dbrep.0 comment Heizstrom monthly current year
attr KG.sr.VZ.Heizstrom.dbrep.0 device KG.sr.VZ.Heizstrom
attr KG.sr.VZ.Heizstrom.dbrep.0 group DbRep
attr KG.sr.VZ.Heizstrom.dbrep.0 reading total_consumption
attr KG.sr.VZ.Heizstrom.dbrep.0 room 3.1_Strom
attr KG.sr.VZ.Heizstrom.dbrep.0 showproctime 1
attr KG.sr.VZ.Heizstrom.dbrep.0 timestamp_begin current_year_begin
attr KG.sr.VZ.Heizstrom.dbrep.0 timestamp_end current_year_end


Mit folgender ReadingsGroup bekomme ich die Daten angezeigt.
defmod KG.sr.VZ.Tab.regp readingsGroup TYPE=DbRep:.*.KG.sr.VZ.*.DIFF.*
attr KG.sr.VZ.Tab.regp DbLogExclude .*
attr KG.sr.VZ.Tab.regp nostate 1
attr KG.sr.VZ.Tab.regp notime 1
attr KG.sr.VZ.Tab.regp room 3.1_Strom


Sieht so aus als ob die Basis passen wuerde. Nochmals vielen Dank!
Was ich noch nicht ganz verstanden habe ist, wie ich die zwei DbReps zusammen mappe.
Die radings fuer current year beginnen alle:
2018-04-24_21-38-57__KG.sr.VZ.Heizstrom__total_consumption__DIFF__2018-04
3232.7000
2018-05-01__KG.sr.VZ.Heizstrom__total_consumption__DIFF__2018-05
3232.7000

fuer privious year:
2017-04-24_21-38-57__KG.sr.VZ.Heizstrom__total_consumption__DIFF__2017-04
3232.7000
2017-05-01__KG.sr.VZ.Heizstrom__total_consumption__DIFF__2017-05
3232.7000


Jetzt muesst ich nach meinem Verstaendis entweder die Readings in den DBReps "renamen" (mit Januar - Deyember) oder eben die mappings in der ReadingsGroup machen, richtig?

Raphael

DS_Starter

Hallo Raphael,

nein du musst nichts renamen oder mappen. Du kannst Regex auf die Readings anwenden.
Es ist sicherlich am Anfang einfacher die Tabelle etwas umzugestalten. Also etwa so (ungetestet):


<%measure_power_meter>,<>,<Januar>,<>,<Februar>,<>,<März>,...
KG.sr.VZ.Heizstrom.dbrep.0:<2017>,<>,.*-01,<>,.*-02,<>,.*-03,...
KG.sr.VZ.Heizstrom.dbrep.1:<2018>,<>,.*-01,<>,.*-02,<>,.*-03,...


KG.sr.VZ.Heizstrom.dbrep.1 wäre dabei das DbRep für 2018, ich habe nicht gesehen wie es wirklich heißt.

Die Readings enden alle auf ...__2017-04, __2017-05, __2018-04, __2018-05 usw. Das kannst du zur Unterscheidung nutzen.
Wenn du das hinbekommen hast kannst du die Gestaltung auch ändern, also Zeilen und Spalten tauschen. Lies dazu noch ein bisschen zu  Readingsgroup im Wiki oder hole dir noch etwas Hilfe im Readingsgroup-Forum. Readingsgroup ist sehr mächtig und kann viel. Man muss aber genau schauen wie das anzuwenden ist. Das weiß ich auch nicht alles und probiere viel  ;)

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

MiniBlister

Hallo,

vielen Dank für die Hilfe.
Hab nun die Readingsgroups hin bekommen. Da ich ja mehrere Berechnungen noch machen möchte (Kosten pro Monat / Vergleich zum Abschlag / Vergleich zum Vorjahr /....) hatte ich mir überlegt für jeden Monat ein Dummy zu erstellen und die Readings dann dort festzulegen um.

eg:
dum.EnergyMonth.01
readings1: 
readings2:
dum.EnergyMonth.02
readings1: 
readings2:
dum.EnergyMonth.03
readings1: 
readings2:


Aber irgendwie habe ich eine Abneigung so viele starre Devices anzulegen. Was ist wenn ich plötzlich auf Quartale berechnen möchte, oder jede Woche. Dann legen ich 52 Devices an. Das ist sehr unoptimiert.
Jemand eine Idee?

DS_Starter

Du kannst dir doch für alle deine Berechnungen/Auswertungen jeweils die benötigten DbRep's und Readingsgroups zur Zusammnfassung anlegen.
Vieleicht habe ich deine Gedankengänge aber auch nicht richtig verstanden und übersehe etwas ....
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