Autor Thema: Modul 93_DbRep - Reporting und Management von Datenbankinhalten (DbLog)  (Gelesen 71884 mal)

Offline supergrobi

  • New Member
  • *
  • Beiträge: 40
...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...

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2642
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 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 9/64 Bit  (Stretch),
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN,Log2Syslog,SMAEM,SMAInverter

Offline supergrobi

  • New Member
  • *
  • Beiträge: 40
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? :)
« Letzte Änderung: 11 Juli 2018, 13:45:43 von supergrobi »

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2642
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 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 9/64 Bit  (Stretch),
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN,Log2Syslog,SMAEM,SMAInverter

Offline supergrobi

  • New Member
  • *
  • Beiträge: 40
pahhh!

das geht...

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2642
 :)
damit kannst du dich langsam vorwärts hangeln. Du schaffst das !

Lg
Heiko
ESXi 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 9/64 Bit  (Stretch),
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN,Log2Syslog,SMAEM,SMAInverter

Offline supergrobi

  • New Member
  • *
  • Beiträge: 40
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 !!!

Offline supergrobi

  • New Member
  • *
  • Beiträge: 40
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
« Letzte Änderung: 13 Juli 2018, 12:01:43 von supergrobi »

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2642
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
« Letzte Änderung: 13 Juli 2018, 22:51:53 von DS_Starter »
ESXi 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 9/64 Bit  (Stretch),
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN,Log2Syslog,SMAEM,SMAInverter

Offline supergrobi

  • New Member
  • *
  • Beiträge: 40
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
« Letzte Änderung: Heute um 09:45:37 von supergrobi »

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2642
Müssen nicht. Aber es macht es einfacher und übersichtlicher.

Lg,
Heiko
ESXi 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 9/64 Bit  (Stretch),
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN,Log2Syslog,SMAEM,SMAInverter

Offline supergrobi

  • New Member
  • *
  • Beiträge: 40
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

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2642
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
« Letzte Änderung: Heute um 18:03:15 von DS_Starter »
ESXi 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 9/64 Bit  (Stretch),
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN,Log2Syslog,SMAEM,SMAInverter

 

decade-submarginal