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

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

Vorheriges Thema - Nächstes Thema

kadettilac89

Zitat von: DS_Starter am 30 März 2020, 11:20:42
@kadettilac89 ... Hmm, kannte ich noch nicht und kommt bei mir auch nicht. Habe eine Weile auf den Code geschaut und kam momentan noch nicht dahinter. Vermutung: du verwendest in deinem stateFormat eine Auswertung des Readings sql_processing_time, erzeugst es aber nicht. D.h. die angegebene Verknüpfung sollte auf jeden Fall eine Warnung werfen.


Habe mal alle stateformat, alles was processing time beinhaltet rausgeworfen und die Readings des DBLog devices gelöscht. Meldung ist weg. danke

DS_Starter

So kannst du es alternativ verwenden:


stateFormat { ReadingsVal($name,"state", "") eq "running" ? "renaming" : ReadingsVal($name,"state", ""). " » ProcTime: ".ReadingsVal($name,"sql_processing_time", "")." sec"}


Das wirft dann auch keine Fehler.
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

flummy1978

Hallöchen,

zunächst einmal mehr ein RIESEN Lob, für Deine Arbeit... Ich weiss dass jeder seine eigene Art hat danke zu sagen, aber ich finde bei den Devs darf gerne mal ein Blick in die Signatir geworfen werden ;)

@Topic:
Ich GLAUBE, dass ich einen kleinen Bug entdeckt hab:

Berechnungsgrundlage: Der Durchschnitt der letzten 10 Minuten soll gerechnet werden.
List
Internals:
   .FhemMetaInternals 1
   DATABASE   user_fhem
   DEF        DBLogging
   FUUID      5e809fec-f33f-8d79-7131-84e8c885a567a522
   FVERSION   93_DbRep.pm:v8.39.0-s21473/2020-03-21
   LASTCMD    averageValue writeToDBInTime
   MODEL      Client
   NAME       DBrep_Wetter_windgust
   NOTIFYDEV  global,DBrep_Wetter_windgust
   NR         276
   NTFY_ORDER 50-DBrep_Wetter_windgust
   ROLE       Client
   STATE      done
   TYPE       DbRep
   UTF8       1
   .attraggr:
   .attrminint:
   HELPER:
     DBLOGDEVICE DBLogging
     GRANTS     CREATE TEMPORARY TABLES,RELOAD,ALTER ROUTINE,UPDATE,INSERT,SHOW VIEW,CREATE VIEW,DELETE,DROP,TRIGGER,REPLICATION CLIENT,REFERENCES,INDEX,REPLICATION SLAVE,CREATE,CREATE ROUTINE,LOCK TABLES,EXECUTE,PROCESS,SELECT,ALTER,EVENT,FILE
     IDRETRIES  3
     MINTS      2019-09-22 01:30:00
     PACKAGE    main
     SQLHIST   
     VERSION    8.39.0
     CV:
       aggregation no
       aggsec     1
       destr      2020-03-30
       dsstr      2020-03-30
       epoch_seconds_end 1585570932
       mestr      03
       msstr      03
       testr      14:22:12
       tsstr      14:12:12
       wdadd      604800
       yestr      2020
       ysstr      2020
     DBREPCOL:
       COLSET     1
       DEVICE     64
       EVENT      512
       READING    64
       TYPE       64
       UNIT       32
       VALUE      128
   OLDREADINGS:
   READINGS:
     2020-03-30 07:52:13   .associatedWith Wetterstation
     2020-03-30 14:22:13   2020-03-30__Wetterstation__wind_gust__AVGAM__no_aggregation 8.0000
     2020-03-30 14:22:13   db_lines_processed 2
     2020-03-30 14:22:13   state           done
Attributes:
   DbLogExclude .*
   allowDeletion 1
   device     Wetterstation
   group      FileLog
   icon       own-log@darkgrey
   reading    wind_gust
   room       System->Datenbank
   timeDiffToNow m:10
   timeOlderThan m:0
   verbose    2


Ergebnis:

1. 2020-03-30 02:04:14 Wetterstation HP1000 calculated avgam_no_wind_gust 502790
2. 2020-03-30 02:34:14 Wetterstation HP1000 calculated avgam_no_wind_gust  0.0000 502823


Ich konnte noch nicht herausfinden, wann er den Wert LEER lässt und wann er eine 0.000 einfügt.

Das Problem ist allerdings bei dem Leeren Wert, wird beim Aufruf der entsprechenden Plots der Log vollgespamt:
2020.03.30 08:05:21.042 1: PERL WARNING: Argument "" isn't numeric in subtraction (-) at ./FHEM/98_SVG.pm line 2130.
2020.03.30 08:05:21.043 1: stacktrace:
2020.03.30 08:05:21.043 1:     main::__ANON__                      called by ./FHEM/98_SVG.pm (2130)
2020.03.30 08:05:21.044 1:     main::SVG_render                    called by ./FHEM/98_SVG.pm (1186)
2020.03.30 08:05:21.044 1:     main::SVG_doShowLog                 called by ./FHEM/98_SVG.pm (258)
2020.03.30 08:05:21.044 1:     main::SVG_FwFn                      called by ./FHEM/01_FHEMWEB.pm (2042)
2020.03.30 08:05:21.045 1:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (1159)
2020.03.30 08:05:21.045 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (590)
2020.03.30 08:05:21.045 1:     main::FW_Read                       called by fhem.pl (3772)
2020.03.30 08:05:21.046 1:     main::CallFn                        called by fhem.pl (757)


Könnte man hier vielleicht eine Abfrage einsetzen, dass er einen Wert "NULL" oder eben leer gar nicht einfügt, sondern dann eben nichts / den letzten übernimmt oder der oder?

ZitatAuszug:

* autoForward - wenn aktiviert, werden die Ergebnisreadings einer Funktion in ein oder mehrere Devices übertragen.
Die Definition erfolgt in der Form:

{
  "<source-reading> => "<dest.device> [=> <dest.-reading>]",
  "<source-reading> => "<dest.device> [=> <dest.-reading>]",
  ...
}
Das ist gemein, je mehr Du einbaust umso mehr Möglichkeiten / Ideen kommen mir, wie ich SQL mehr Arbeit überlassen kann, statt FHEM  ::) ;D Die Wildcards .* werden sicherlich viele erfreuen, die sich mit DBs nicht auskennen. Ich denke es ist auf jeden Fall eine große Erleichterung, weil man die "Schreibstruktur" aus den anderen Modulen,Attributen etc von FHEM behalten kann.
Falls Du hier ein paar Tests "erwartest" würde das zumindest bei mir einiges dauern. Meine ToDo Liste ist grad ewig lang und ich komme kaum nach  :-\

ZitatEdit: @Andreas ... ich habe 126 DbRep-Devs. Habe mit jsonlist2 eine Übersicht erzeugt. Das ist ganz schön viel. Was interessiert dich daran bzw. wozu brauchst du das?
Ich lerne gern von anderen, die etwas womit ich mich einigermaßen auskenne, bereits wesentlich besser / intensiver / strukturierter einsetzen als ich. Bedeutet: Zwingend brauchen, würde ich von Dir nichts direkt, aber mich würde die Struktur interessieren. Du hast ja mal geschrieben, dass Du gern mit Rohdaten arbeitest und diese dann gezielt filterst. Das macht in vielen Fällen durchaus Sinn, benötigt aber auch ein gewisses Vorgehen. Als Beispiel:

Nummeriert einzelne Devices.

  • Daten der PV Anlage werden ungefiltert erfasst (ggf separate DB / Tabelle)
  • DBRep errechnet einen Zeitraum X-Schnitt für einen Detaillierten Überblick (aber deutlich weniger Daten)
  • SVG Plot für den live Überblick
  • DBRep errechnet einen Zeitraum Y-Schnitt für historische Daten
  • Ggf SVG Plot für historisches
  • DBRep verschiebt Durchschnittsdaten in eine andere Tabelle / Reading / was auch immer
  • DBRep bereinigt die Tabelle nach Zeitraum X avg=day
  • DBRep bereinigt die Tabelle nach Zeitraum Y avg=hour
  • usw
Das wäre jetzt eine Idee / Beispiel wie man mehrere Geräte für eine bestimmte Funktion bräuchte, die allerdings die Grundvorteile (und noch einige mehr) dass man ALLE Daten hätte, die man haben möchte oder behalten möchte UND Plots, Übersichtsseiten usw keine Unmengen auslesen müssten, weil entsprechende Schnittwerte vorhanden sind....

Ich hab grad massive Probleme in der umsortierung meiner Räume. Den Fehler würde ich gern beim Aufbau mit / um meine DB herum gern vermeiden. Genauso möchte ich auch vermeiden wie es hier mal zu finden war: ".....Meine DB hat 5 Mio Einträge in der DB und das Auslesen / Sichern / wiedereinspielen dauert ewig oder ist zu groß ...."

Viele Grüße
Andreas

DS_Starter

Danke Andreas  :),

Also ...

Zitat
Ich konnte noch nicht herausfinden, wann er den Wert LEER lässt und wann er eine 0.000 einfügt.
Ein 0.000 wird wenn der berechnete/ermittelte Wert tatsächlich 0 ergibt, wohingegen leer geliefert wird wenn wegen fehlender Werte kein Ergebnis berechnet/ermittelt werden konnte.
Allerdings bin ich der Meinung, dass im letzteren Fall immer ein "-" geliefert wird. Sollte das nicht so sein, muss ich tatsächlich nochmal danach schauen. Bräuchte dann mal ein konkretes Beispiel, also die konkret ausgeführte Aktion.

Bezüglich der Vorgehnsweise PV-Anlage... hattest du dir im Wiki schon mal das angeschaut:
https://wiki.fhem.de/wiki/Datenbankgest%C3%BCtzte_Erstellung_der_Energiebilanz_einer_SMA_PV-Anlage_mit_%C3%9Cberschusseinspeisung ?

Ist zwar schon etwas älter und DbRep kann inzwischen noch mehr, aber dennoch ein guter Einstieg denke ich.

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

DS_Starter

Ha, ich habe doch noch den kleinen Bug gefunden der dazu geführt hat, dass LEER als Value in die DB geschrieben hat wenn das Berechnungsergebnis leer oder "-" war.

Danke Andreas für den Stubs darauf !

Ist wieder im contrib.
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

flummy1978

Leider nein. Das Beispiel oben ist exakt das Ergebnis aus der Tabelle gewesen. Es ist also nichts eingetragen gewesen kein NULL und auch nicht - Ich gehe davon aus, dass das daher rührt weil es in diesem Zeitraum keinerlei Daten gab - Das kann ich jetzt erstmal nicht mehr nachvollziehen, weil ich die leeren gelöscht habe. Das konkrete Beispiel ist exakt aus dem Device das ich oben gepostet habe. Oder was brauchst Du zusätzlich ?
Erledigt  8)
War grad dabei das zu schreiben ;) - Nicht dafür Du hilfst mir / uns - Da ist Bug Reporting inkl *grins*

Bezüglich der Vorgehnsweise PV-Anlage...
Ich habe keine PV Anlage ;D Das war jetzt nur ein Beispiel für die Menge der Devices. Es hätte auch Stromverbrauch, Temperatur oder oder oder sein können ;)

Viele Grüße
Andreas

DS_Starter

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

ch.eick

Zitat von: DS_Starter am 30 März 2020, 16:51:09
Bezüglich der Vorgehnsweise PV-Anlage... hattest du dir im Wiki schon mal das angeschaut:
https://wiki.fhem.de/wiki/Datenbankgest%C3%BCtzte_Erstellung_der_Energiebilanz_einer_SMA_PV-Anlage_mit_%C3%9Cberschusseinspeisung ?

Ist zwar schon etwas älter und DbRep kann inzwischen noch mehr, aber dennoch ein guter Einstieg denke ich.
Ich denke mit den PV-Daten kann ich dienen, ich werde mich mal dran setzen und versuchen das Beispiel zu adaptieren.
Eine Uebertragung auf meine Kostal Plenticore ist nicht ganz so einfach, da nicht alle Werte exact so geliefert werden. Ich hoffe da einen Weg mit
DBrep zu finden, um die Berechnungen direkt aus der DB nutzen zu koennen.

Gruss
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

flummy1978

Hey Christian,

Zitat von: ch.eick am 31 März 2020, 13:18:50
DBrep zu finden, um die Berechnungen direkt aus der DB nutzen zu koennen.

ich denke mal für andere wäre das sicherlich interessant und sinnvoll ... unser Dach ist leider nach Norden, ich hoffe dass Du das nicht auf mein Beispiel bezogen hast. Daher muss ich nochmal wiederholen:
"...............Bezüglich der Vorgehnsweise PV-Anlage...
Ich habe keine PV Anlage ;D Das war jetzt nur ein Beispiel für die Menge der Devices. Es hätte auch Stromverbrauch, Temperatur oder oder oder sein können........"

Viele Grüße
Andreas

ch.eick

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

flummy1978

Mahlzeit,

ich hab da (mal wieder) ein kleines Anliegen:

Wenn ich das nachfolgende Device mit "average Value writeToDBInTime" ausführe, kommt die Meldung:

ZitatIf you want write results back to database, attributes "device" and "reading" must be set. In that case "device" mustn't be a devspec and mustn't contain SQL-Wildcard (%). The "reading" to evaluate has to be a single reading and no list.

Demnach muss das Reading einzeln sein und keine Liste haben. In der Attr Erklärung ist aber explizit von einer Liste die Rede:
Zitatreading - Abgrenzung der DB-Selektionen auf ein bestimmtes oder mehrere Readings sowie exkludieren von Readings. Mehrere Readings werden als Komma separierte Liste angegeben. Es können SQL Wildcard (%) verwendet werden.
Wird dem Reading bzw. der Reading-Liste ein "EXCLUDE=" vorangestellt, werden diese Readings nicht inkludiert.

    Beispiele:
    attr <name> reading etotal
    attr <name> reading et%
    attr <name> reading etotal,etoday
    attr <name> reading eto%,Einspeisung EXCLUDE=etoday
    attr <name> reading etotal,etoday,Ein% EXCLUDE=%Wirkleistung

Bedeutet das zwangsläufig, dass es bei dieser Abfrage keine Möglichkeit gibt mehrere Readings eines Devices auf einen Schlag zu bearbeiten, oder hab ich da nen kleinen Bug gefunden, anstatt das Feature zu nutzen ?  ;D

Internals:
   .FhemMetaInternals 1
   .triggerUsed 0
   DATABASE   user_fhem
   DEF        DBLogging
   FUUID      5e809fec-f33f-8d79-7131-84e8c885a567a522
   FVERSION   93_DbRep.pm:v8.40.0-s21546/2020-03-30
   LASTCMD    averageValue writeToDBInTime
   MODEL      Client
   NAME       DBrep_Wetter_windgust
   NOTIFYDEV  global,DBrep_Wetter_windgust
   NR         269
   NTFY_ORDER 50-DBrep_Wetter_windgust
   ROLE       Client
   STATE      done
   TYPE       DbRep
   UTF8       1
   .attraggr:
   .attrminint:
   HELPER:
     DBLOGDEVICE DBLogging
     GRANTS     INSERT,DROP,UPDATE,LOCK TABLES,CREATE TEMPORARY TABLES,EVENT,REPLICATION CLIENT,REPLICATION SLAVE,SHOW VIEW,ALTER ROUTINE,ALTER,FILE,RELOAD,EXECUTE,CREATE,DELETE,INDEX,REFERENCES,CREATE ROUTINE,PROCESS,CREATE VIEW,SELECT,TRIGGER
     IDRETRIES  3
     MINTS      2019-09-22 01:30:00
     PACKAGE    main
     SQLHIST   
     VERSION    8.40.0
     CV:
       aggregation no
       aggsec     1
       destr      2020-04-28
       dsstr      2020-04-28
       epoch_seconds_end 1588078598
       mestr      04
       msstr      04
       testr      14:56:38
       tsstr      14:46:38
       wdadd      518400
       yestr      2020
       ysstr      2020
     DBREPCOL:
       COLSET     1
       DEVICE     64
       EVENT      512
       READING    64
       TYPE       64
       UNIT       32
       VALUE      128
   OLDREADINGS:
   READINGS:
     2020-04-27 20:41:08   .associatedWith Wetterstation
     2020-04-28 14:56:39   2020-04-28__Wetterstation__wind_gust__AVGAM__no_aggregation -
     2020-04-28 14:56:39   db_lines_processed 0
     2020-04-28 14:56:39   state           done
Attributes:
   DbLogExclude .*
   alias      Windspitzen Schnitt errechnen
   allowDeletion 1
   device     Wetterstation
   group      Automatische DB Bereinigung
   icon       own-log@darkgrey
   reading    wind_gust,luminosity
   room       System->Datenbank
   timeDiffToNow m:10
   timeOlderThan m:0
   verbose    2


Ich bleibe ja dabei...... Das Modul ist genial  8) ;)

Viele Grüße
Andreas

DS_Starter

ZitatBedeutet das zwangsläufig, dass es bei dieser Abfrage keine Möglichkeit gibt mehrere Readings eines Devices auf einen Schlag zu bearbeiten, oder hab ich da nen kleinen Bug gefunden, anstatt das Feature zu nutzen ?
Da muss ich selbst auch erstmal eine Weile drüber sinnieren  :) .. melde mich.
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

flummy1978

Zitat von: DS_Starter am 28 April 2020, 15:51:35
Da muss ich selbst auch erstmal eine Weile drüber sinnieren  :) .. melde mich.

Oh man ... irgendwann wirst Du mich hassen :-X ....oder warum muss ich immer sowas finden *lach*

Wenn es zu umständlich wird, sag bescheid, dann mache ich halt mehrere Geräte. So eine Abfrage mit einem Device zu erstellen wäre schon nice

DS_Starter

Hallo Andreas,

Zitat
Bedeutet das zwangsläufig, dass es bei dieser Abfrage keine Möglichkeit gibt mehrere Readings eines Devices auf einen Schlag zu bearbeiten, oder hab ich da nen kleinen Bug gefunden, anstatt das Feature zu nutzen ? 
Also das ist kein Bug (hoffentlich bist du jetzt nicht enttäuscht  :D ), sondern ich habe es absichtlich so beschränkt.
Grund ist/war, dass ich für das Rückschreiben in die DB einen eindeutigen (regelkonformen) Devicenamen brauche und ebenfalls einen eindeutigen Readingnamen. Beides ist bei einer Liste mit Wildcards nicht gegeben.

Allerdings, wenn ich die ganze Sache mit etwas Abstand betrachte, könnte man sowohl für den Devicenamen  als auch Readingnamen generische Bezeichner erstellen wenn der User Listen verwendet.

Bezüglich Reading ist es sogar einfach. Hier kann ich den User verpflichten in solchen Fällen zwangsweise das Attribut readingNameMap zu setzen. Schwieriger ist es beim Devicenamen wenn mehrere Devices bzw. Namen mit Wildcards
verwendet werden.

Wenn man also das Problem des eindeutigen Devicenamens organisatorisch gelöst bekommt, könnte man diese Begrenzungen beseitigen.
Werde es mal auf meine ToDo setzen , bin aber auch für Ideen offen...  :)

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

flummy1978

Hallo Heiko,

vielen Dank für die Erklärung. Wenn man (also ich) genauer drüber nachdenkt, macht es auch Sinn und ist auch gut so, dass Du ursprünglich daran gedacht hast ;)

Zitat von: DS_Starter am 30 April 2020, 17:12:56
Bezüglich Reading ist es sogar einfach. Hier kann ich den User verpflichten in solchen Fällen zwangsweise das Attribut readingNameMap zu setzen. Schwieriger ist es beim Devicenamen wenn mehrere Devices bzw. Namen mit Wildcards
verwendet werden.
Wenn man also das Problem des eindeutigen Devicenamens organisatorisch gelöst bekommt, könnte man diese Begrenzungen beseitigen.
Werde es mal auf meine ToDo setzen , bin aber auch für Ideen offen...  :)
readingNameMap wäre in der Tat eine Möglichkeit ...

Je länger ich darüber nachdenke umso mehr fallen mir nur zwei eine Möglichkeiten ein die für eine Mehrauswahl funktionieren würden:
1. Device:Reading - Liste .... d.h. JEDEM Reading muss auch von einem Device vorangestellt werden
Ist es nicht, gilt (wie bisher) das Device aus dem attr device (das könnte man ja prüfen ob die readings mit oder ohne device angegeben sind)
2. Mehrere Angaben von Reading NUR OHNE wildcards bei den Devices möglich .... (also DEVICE_ohneWildcard:READING_mitWildcard)

Wenn einem dann schon so viel erspart wird, kann man die paar Devices von Hand eingeben  ::)

Man könnte also die Prüfung ansetzen "nur Reading" -> dann gehen auch wildcards -> device:reading -> dann sind Wildcards nicht möglich (bzw nur auf reading beschränkt)

Ist zwar ziemlich gequillter Hirnschmalz, weil ich für heute schon mehr oder weniger durch bin, aber imho eine Möglichkeit....

Grüße
Andreas