Modul 93_DbRep - Reporting und Management von Datenbankinhalten (DbLog)

Begonnen von DS_Starter, 19 Mai 2016, 22:52:13

Vorheriges Thema - Nächstes Thema

supergrobi

...richtig.
ich kenne Perl nicht und bin wohl fälschlicherweise davon ausgegangen, das DBReporting:(\d).*Grid.*  das komplette Grid  abholt  :o
dem ist wohl nicht so. Jetzt rätsel ich also darüber, was das (\d) eigentlich tut :) das *Grid* wird wohl irgendwas aus deinen Aufbau sein. Hier sollte dann wohl das SqlResultRow_1 rein...

DS_Starter

Du musst das notify ntürlich anpassen. \d ist perl für eine ziffer und grid ist einfach
der string grid.  ;)
Du müsstest also DBReporting:.*SqlResultRow_1.*  probieren .... und etwas perl lernen  :)
ESXi@NUC+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

supergrobi

#767
Hallo Heiko,

Danke für die Hilfe. Ich weiß ich muss Perl lernen. Leider ist es schwierig, das ganze mit FHEM in Verbindung zu bringen.
Dein Vorschlag DBReporting:.*SqlResultRow_1.*  funktioniert leider genauso wenig...
DBReporting:.*SqlResultRow_1.* { fhem "setreading Energy.Tag.Kuehlschrank".(split(":",$EVTPART0))[0]." $EVTPART1"}

ich dachte der "." oder das "*" wäre da irgendwie falsch. Ich konnte mich dran erinnern, das es bei einigen ESP Devices so aussieht: Lampe:Relay
Also hab ich auch DBReporting:SqlResultRow_1.* { fhem "setreading Energy.Tag.Kuehlschrank".(split(":",$EVTPART0))[0]." $EVTPART1"}
usw. probiert
Aber das Ding will einfach nicht. Das Dummy behält seine ? ? ?

Könnte bei mir bitte jemand kurz die "Holzhammermethode" anwenden? :)

DS_Starter

probiers doch erstmal ganz simpel mit
DBReporting:.*SqlResultRow_1.* { fhem "setreading Energy.Tag.Kuehlschrank test test"}

Ein event kommt ja ? du könntest dir im Eventmonitor auch ein notify generieren lassen und dann anpassen.


ESXi@NUC+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


DS_Starter

 :)
damit kannst du dich langsam vorwärts hangeln. Du schaffst das !

Lg
Heiko
ESXi@NUC+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

supergrobi

Danke Dir...

ich hab den Fehler gefunden... :)
DBReporting:SqlResultRow_1.* { fhem "setreading Energy.Tag.Kuehlschrank ".(split(":",$EVTPART0))[0]." $EVTPART1"}

es fehlte das Leerzeichen zwischen Kuehlschrank und " ::)

jetzt kommt ich weiter !!!

supergrobi

#772
Hallo Heiko,

ich schon wieder...
würde so etwas funktionieren?:
define Temperatur.Tag.berechnen at *02:00:00 { fhem "set DBReporting sqlCmd select MIN(CAST(VALUE as double)) from history where DEVICE = """LaCrosse_3E""" AND TIMESTAMP like "$year"-"$month"-"$mday-1"% AND READING = """temperature""";"}

oder wie bekomme ich das bei solch eine Abfrage dynamisch hin?
dann könnte ich mir ein "at" basteln, in dem einmal täglich die Berechnung gemacht wird...

zur Erläuterung ... [Edit]
ich kann mir z.B. mit
set DBReporting sqlCmd select MIN(CAST(VALUE as double)) from history where DEVICE = "LaCrosse_3E" AND TIMESTAMP like "2018-07-05%" AND READING = "temperature";

die aktuelle Min(/Max/Avg) Temperatur des ausgewählten Tages ausgeben lassen.
Diese möchte ich in ein Dummy schreiben und dadurch in der DB speichern.
dazu möchte ich ein "At" benutzen.
Für das "at" müsste ich aber den Tag von gestern Dynamisch auswählen...

lg
Thomas

DS_Starter

#773
Hallo Thomas,

am einfachsten wäre es wahrscheinlich wenn du dir ein dbrep definierst mit den Attributen

device=LaCrosse_3E
reading=temperature
aggregation=day
timestamp_begin=previous_day_begin
timestamp_end=previous_day_end


Jetzt kannst du dir ein at definieren und ein

set dbrep minValue     oder max/avgValue

regelmässig aufrufen, auf den dummy übertragen ... was auch immer.

Noch einfacher hast du es wenn du ein

set dbrep minValue writeToDB     (oder max/avgValue)

verwendest. Dann bekommst du für jeden Tag den min/max/avg Wert automatisch in die Db geliefert. Schau dir mal dazu die Erläuterungen in der commandref an.

Wenn du mit sqlCmd arbeiten möchtest, kannst du Platzhalter verwenden um die Timestamp-Einstellungen des Dbrep devices zu übernehmen (also previous_day_begin z.b.). Steht auch in der commandref erläutert.

Ps: dein Ansatz würde am 1. des Monats zum Absturz von fhem führen weil $mday-1 ungültig wäre.

Lg
Heiko
ESXi@NUC+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

supergrobi

#774
Hallo Heiko,
Danke für die wie immer ausführliche Hilfe.

verstehe ich das richtig, das ich dann, wie in deinem Beispiel für jedes Device - Min/Max/Avg einen eigenen DBRep anlegen muss ?

lg
Thomas

DS_Starter

Müssen nicht. Aber es macht es einfacher und übersichtlicher.

Lg,
Heiko
ESXi@NUC+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

supergrobi

Hallo Forum,

ich traue es mir nicht, das hier zu sagen :)
ich möchte versuchen, nicht für jedes Device ein eigenes DBRep aufzumachen und hab deshalb ein "at" wie folgt definiert...

define at.Energy.Tag.Kuehlschrank at *15:52:00 attr DBReporting_LaCrosse device LaCrosse_3E;;\
attr DBReporting_LaCrosse reading temperature;;\
attr DBReporting_LaCrosse aggregation day;;\
attr DBReporting_LaCrosse timestamp_begin previous_day_begin;;\
attr DBReporting_LaCrosse timestamp_end previous_day_end;;\
set DBReporting_LaCrosse minValue writeToDB;;\
set DBReporting_LaCrosse mmaxValue writeToDB;;\
set DBReporting_LaCrosse avgValue writeToDB
attr at.Energy.Tag.Kuehlschrank room Energy


dabei gibt es nun ein timeout, der process wird terminated... (set DBReporting_LaCrosse minValue writeToDB)
Ich nehme an, die DB suche dauert zu lange und es wird bereits die nächste Zeile gestartet.
kann man das umgehen? Ich weiß ich muss noch einiges lernen. Aber zu meiner Entschuldigung... das versuche ich ja hiermit

lg
Thomas

DS_Starter

#777
Hi Thomas,
den grund für die Problematik hast du richtig erkannt, er liegt in der asynchronen Arbeitsweise begründet.
Es gibt nun mindestens zwei Ansätze. Entweder definierst du drei at und setzt in jedem at die notwendigen Attribute vor dem set Befehl, so wie du es bereits gemacht hast. Aber eben für minValue, maxValue, avgValue jeweils ein at. Den Abstand zwischen den at wählst du genügend groß.

Der zweite Ansatz ist die Verwendung von userExitFn. damit kannst du eine Queue aufbauen die nacheinander minValue , maxValue, avgValue ausführt sobald der vorherige Befehl ausgeführt ist.
Bin momentan im Urlaub und kann deswegen nicht soviel Zeit für Erklärungen aufwenden, aber vielleicht gelingt es dir ja mit Hilfe anderer User sowas aufzubauen.
Später kann ich wieder mehr unterstützen.

edit, die Attribute musst du in den at nicht setzen, die ändern sich ja nicht. einmal im dbrep definiert reicht.

Lg
Heiko
ESXi@NUC+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

supergrobi

Hallo Heiko,

danke für die Hilfe. Solch "Denk-Anstöße" sind immer sehr Hilfreich :)
...Aber das Benutzen der userExitFn ist mir momentan noch zu weit fortgeschritten.

ich probiere es dann erst einmal mit einzelnen Aufrufen.

lg
Thomas

supergrobi

ich mache es jetzt so...

define at.Energy.Tag.Kuehlschrank1 at *11:51:00 attr DBReporting_LaCrosse device LaCrosse_3E;;\
attr DBReporting_LaCrosse reading temperature;;\
attr DBReporting_LaCrosse aggregation day;;\
attr DBReporting_LaCrosse timestamp_begin previous_day_begin;;\
attr DBReporting_LaCrosse timestamp_end previous_day_end;;\
set DBReporting_LaCrosse averageValue writeToDB\
attr at.Energy.Tag.Kuehlschrank1 room Energy


jedoch hab ich immer noch nicht rausgefunden wo die Werte mit writeToDB hingeschrieben werden...
als Rückmeldung gibt es:


2018-07-16__LaCrosse_3E__temperature__AVERAGE__2018-07-16 22.4021 2018-07-17 11:51:00
state done 2018-07-17 11:51:00