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

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

Vorheriges Thema - Nächstes Thema

DS_Starter

Nach weiteren intensiven Testen habe ich die neue Version soeben eingecheckt.
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

Hallo,

ich habe noch ein bisschen weitergemacht und nun gibt es für SQLite Nutzer die Möglichkeit über sqlCmd PRAGMA Werte abzufragen. Bisher konnte man PRAGMA zwar setzen, aber eine Abfrage funktionierte nicht.

Außerdem wird die Encoding Einstellung der DB bei der initialen Verbindung direkt von der DB gelesen und davon die Einstellung von UTF8 (Internal) abgeleitet.

Es gibt auch einen neuen getter initData mit dem die initialen DB Internas als Readings angezeigt werden, z.B. die effektiven Userrechte auf die DB bei MariaDB.


   READINGS:
     2021-12-08 23:14:58   background_processing_time 0.0858
     2021-12-08 23:14:58   dbEncoding      UTF8
     2021-12-08 23:14:58   indexState      Index Report_Idx exists
     2021-12-08 23:14:58   sql_processing_time 0.0815
     2021-12-08 23:14:58   state           done
     2021-12-08 23:14:58   timestamp_oldest_dataset 2017-06-02 15:30:00
     2021-12-08 23:14:58   userRights      INSERT,SELECT,UPDATE,FILE,SHOW VIEW,INDEX,DELETE,PROCESS


Liegt 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

Sailor

Hallo Heiko

Zitat von: DS_Starter am 03 Dezember 2021, 22:31:10
ja, das sollte machbar sein.
Übliche Praxis ist für jede Aufgabe ein separates DbRep zu erstellen, zu parametrisieren und regelmäßig ausführen lassen.

Bevor ich mir meine DbLog zerschieße anbei mein tägliches at um 01:00 Uhr
Ich hoffe, das jetzt so richtig nach deiner Anleitung programmiert zu haben

Ich verstehe nicht, ob die 3 Instanzen sich nicht ins Gehege kommen, wenn diese parallel ausgeführt werden.

Danke fürs drüber schauen!

Gruß
    Sailor



*01:00:00 {

my $FileSize = int((-s "/home/fhem/fhemDb/fhem.db")/(1024*1024));
fhem("setreading myDbLog DbFileSize " . $FileSize);

### Delete all values older than 365 days
fhem("set DbRepArchive_365d delEntries EXCLUDE=CH_GasCalculator:CH_GasCounter_counters.A_EnergyMonthLast,CH_GasCalculator:CH_GasCounter_counters.A_EnergyMeter,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMonthLast,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMeter,myDbLog:DbFileSize");

### Create daily average value for all values older than 180 days
fhem("set DbRepArchive_180d reduceLog average=day EXCLUDE=CH_GasCalculator:CH_GasCounter_counters.A_EnergyMonthLast,CH_GasCalculator:CH_GasCounter_counters.A_EnergyMeter,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMonthLast,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMeter INCLUDE=%_Thermosta%:%,%_Radiato%:%,CH_Pressure%:%,CH_Speedtest:download,CH_Speedtest:upload,CH_Speedtest:ping,sysmon:%,myKm200:%,CH_GasCalculator:%,CH_WaterCalculator:%,CH_ElectricityCalculator:%");

### Create hourly average value for all values older than 30 days
fhem("set DbRepArchive_030d reduceLog average EXCLUDE=CH_GasCalculator:CH_GasCounter_counters.A_EnergyMonthLast,CH_GasCalculator:CH_GasCounter_counters.A_EnergyMeter,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMonthLast,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMeter INCLUDE=%_Thermosta%:%,%_Radiato%:%,CH_Pressure%:%,CH_Speedtest:download,CH_Speedtest:upload,CH_Speedtest:ping,sysmon:%,myKm200:%,CH_GasCalculator:%,CH_WaterCalculator:%,CH_ElectricityCalculator:%");

### Shrink database
fhem("set DbRepBasic Vaccuum");

my $FileSize = int((-s "/home/fhem/fhemDb/fhem.db")/(1024*1024));
fhem("setreading myDbLog DbFileSize " . $FileSize);
}


Mit dem

DbRepArchive_030d

Internals:
   DATABASE   /home/fhem/fhemDb/fhem.db
   DEF        myDbLog
   FUUID      61ae23b0-f33f-02bc-d155-41d99a832a462b73
   FVERSION   93_DbRep.pm:v8.46.1-s25321/2021-12-07
   LASTCMD     
   MODEL      Client
   NAME       DbRepArchive_030d
   NOTIFYDEV  global,DbRepArchive_030d
   NR         3489
   NTFY_ORDER 50-DbRepArchive_030d
   ROLE       Client
   STATE      connected » ProcTime: 0.0020 sec
   TYPE       DbRep
   UTF8       0
   HELPER:
     DBLOGDEVICE myDbLog
     IDRETRIES  3
     MINTS      2021-12-06 15:55:13
     PACKAGE    main
     SQLHIST   
     VERSION    8.46.1
     DBREPCOL:
       COLSET     1
       DEVICE     64
       EVENT      512
       READING    64
       TYPE       64
       UNIT       32
       VALUE      128
   OLDREADINGS:
   READINGS:
     2021-12-08 15:15:37   background_processing_time 0.0044
     2021-12-08 15:15:37   index_state     Index Report_Idx exists
     2021-12-08 15:15:37   sql_processing_time 0.0020
     2021-12-08 15:15:37   state           connected
Attributes:
   DbLogExclude .*
   allowDeletion 1
   devStateIcon connected.*:10px-kreis-gelb disconnect.*:10px-kreis-rot done.*:10px-kreis-gruen connected:10px-kreis-gruen
   fastStart  0
   group      DbLog
   role       Client
   room       System
   showproctime 1
   stateFormat {ReadingsVal("$name","state", undef) eq "running" ? "renaming" : ReadingsVal("$name","state", undef). " » ProcTime: ".ReadingsVal("$name","sql_processing_time", undef)." sec"}
   timeDiffToNow d:30
   timeout    86400


DbRepArchive_180d

Internals:
   DATABASE   /home/fhem/fhemDb/fhem.db
   DEF        myDbLog
   FUUID      61ae247f-f33f-02bc-fd78-8f2cb9f61fd91343
   FVERSION   93_DbRep.pm:v8.46.1-s25321/2021-12-07
   LASTCMD     
   MODEL      Client
   NAME       DbRepArchive_180d
   NOTIFYDEV  global,DbRepArchive_180d
   NR         3490
   NTFY_ORDER 50-DbRepArchive_180d
   ROLE       Client
   STATE      connected » ProcTime: 0.0024 sec
   TYPE       DbRep
   UTF8       0
   HELPER:
     DBLOGDEVICE myDbLog
     IDRETRIES  3
     MINTS      2021-12-06 15:55:13
     PACKAGE    main
     SQLHIST   
     VERSION    8.46.1
     DBREPCOL:
       COLSET     1
       DEVICE     64
       EVENT      512
       READING    64
       TYPE       64
       UNIT       32
       VALUE      128
   OLDREADINGS:
   READINGS:
     2021-12-08 15:15:36   background_processing_time 0.0048
     2021-12-08 15:15:36   index_state     Index Report_Idx exists
     2021-12-08 15:15:36   sql_processing_time 0.0024
     2021-12-08 15:15:36   state           connected
Attributes:
   DbLogExclude .*
   allowDeletion 1
   devStateIcon connected.*:10px-kreis-gelb disconnect.*:10px-kreis-rot done.*:10px-kreis-gruen connected:10px-kreis-gruen
   fastStart  0
   group      DbLog
   role       Client
   room       System
   showproctime 1
   stateFormat {ReadingsVal("$name","state", undef) eq "running" ? "renaming" : ReadingsVal("$name","state", undef). " » ProcTime: ".ReadingsVal("$name","sql_processing_time", undef)." sec"}
   timeDiffToNow d:365  - 180
   timeOlderThan 180
   timeout    86400


DbRepArchive_365d

Internals:
   DATABASE   /home/fhem/fhemDb/fhem.db
   DEF        myDbLog
   FUUID      61ae252e-f33f-02bc-f22a-d79e2ad17ab37d95
   FVERSION   93_DbRep.pm:v8.46.1-s25321/2021-12-07
   LASTCMD     
   MODEL      Client
   NAME       DbRepArchive_365d
   NOTIFYDEV  global,DbRepArchive_365d
   NR         3491
   NTFY_ORDER 50-DbRepArchive_365d
   ROLE       Client
   STATE      connected » ProcTime: 0.0044 sec
   TYPE       DbRep
   UTF8       0
   HELPER:
     DBLOGDEVICE myDbLog
     IDRETRIES  3
     MINTS      2021-12-06 15:55:13
     PACKAGE    main
     SQLHIST   
     VERSION    8.46.1
     DBREPCOL:
       COLSET     1
       DEVICE     64
       EVENT      512
       READING    64
       TYPE       64
       UNIT       32
       VALUE      128
   OLDREADINGS:
   READINGS:
     2021-12-06 16:09:28   /--/----DELETED_ROWS_HISTORY-- 7143447
     2021-12-08 15:15:54   background_processing_time 0.0087
     2021-12-08 15:15:54   index_state     Index Report_Idx exists
     2021-12-08 15:15:54   sql_processing_time 0.0044
     2021-12-08 15:15:54   state           connected
Attributes:
   DbLogExclude .*
   allowDeletion 1
   devStateIcon connected.*:10px-kreis-gelb disconnect.*:10px-kreis-rot done.*:10px-kreis-gruen connected:10px-kreis-gruen
   fastStart  0
   group      DbLog
   role       Client
   room       System
   showproctime 1
   stateFormat {ReadingsVal("$name","state", undef) eq "running" ? "renaming" : ReadingsVal("$name","state", undef). " » ProcTime: ".ReadingsVal("$name","sql_processing_time", undef)." sec"}
   timeOlderThan 365
   timeout    86400


******************************
Man wird immer besser...

DS_Starter

#1548
Moin Sailor,

ich schaue es mir morgen an. Möchte nicht nur kurz drüberfliegen und habe heute keine Zeit.
Aber moderne SQLite sollten mit parallenen Lese- und Schreibvorgängen kein Problem haben sofern WAL eingeschaltet ist.
WAL ist Standard im DbLog, siehe attr SQLiteJournalMode.

Grüße,
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

#1549
Hallo Sailor,

ich habe ein paar Hinweise zusammengestellt und Korrekturen mit rot gekennzeichnet.
Ungeachtet einer möglichen Parallelität würde ich die Aktionen sequentiell ablaufen lassen. Zwei reduceLog gleichzeitig ist
kontraproduktiv und "Vacuum" würde ich generell nicht parallel laufen lassen. Vacuum sperrt dir auch die history, weshalb asynchroner Betrieb von DbLog in dem Fall Pflicht ist, aber das hast du denke ich.

Es gibt in DbRep bereits die Mechanismen für eine squentielle Abarbeitung eingebaut, Stichwort sind die Attr executeBeforeProc  und executeAfterProc.

Die Änderungen im Einzelnen:

DbRepArchive_365d
Zitat
Internals:
   DATABASE   /home/fhem/fhemDb/fhem.db
   DEF        myDbLog
   FUUID      61ae252e-f33f-02bc-f22a-d79e2ad17ab37d95
   FVERSION   93_DbRep.pm:v8.46.1-s25321/2021-12-07
   LASTCMD     
   MODEL      Client
   NAME       DbRepArchive_365d
   NOTIFYDEV  global,DbRepArchive_365d
   NR         3491
   NTFY_ORDER 50-DbRepArchive_365d
   ROLE       Client
   STATE      connected » ProcTime: 0.0044 sec
   TYPE       DbRep
   UTF8       0
Attributes:
   DbLogExclude .*
   allowDeletion 1
   devStateIcon connected.*:10px-kreis-gelb disconnect.*:10px-kreis-rot done.*:10px-kreis-gruen connected:10px-kreis-gruen
   fastStart  0
   group      DbLog
   role       Client
   room       System
   showproctime 1
   stateFormat {ReadingsVal("$name","state", undef) eq "running" ? "renaming" : ReadingsVal("$name","state", undef). " » ProcTime: ".ReadingsVal("$name","sql_processing_time", undef)." sec"}
   timeOlderThan d:365
   timeout    86400
  executeAfterProc  set DbRepArchive_180d reduceLog average=day EXCLUDE=CH_GasCalculator:CH_GasCounter_counters.A_EnergyMonthLast,CH_GasCalculator:CH_GasCounter_counters.A_EnergyMeter,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMonthLast,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMeter
device EXCLUDE=CH_GasCalculator,CH_GasCalculator,CH_ElectricityCalculator,CH_ElectricityCalculator,myDbLog
readings: EXCLUDE=CH_GasCounter_counters.A_EnergyMonthLast,CH_GasCounter_counters.A_EnergyMeter,CH_ElectricityCounter_IEC_01_energyCalc_EnergyMonthLast,CH_ElectricityCounter_IEC_01_energyCalc_EnergyMeter,DbFileSize


Erläuterung: Wenn DbRepArchive_365d ausgeführt ist, startet das Device im Anschluß gleich DbRepArchive_180d.
Den reduceLog Befehl habe ich geändert und nur EXCLUDE belassen. INCLUDE kann nur eine Device/Reading -Kombination in der Befehlszeile angeben (siehe Hilfe).
Der delEntries-Befehl erlaubt zur Zeit keine EXCLUDE/INCLUDE Angaben in der Befehlszeile, sondern nur in den Attributen (siehe Hilfe)

DbRepArchive_180d:
Zitat
Internals:
   DATABASE   /home/fhem/fhemDb/fhem.db
   DEF        myDbLog
   FUUID      61ae247f-f33f-02bc-fd78-8f2cb9f61fd91343
   FVERSION   93_DbRep.pm:v8.46.1-s25321/2021-12-07
   LASTCMD     
   MODEL      Client
   NAME       DbRepArchive_180d
   NOTIFYDEV  global,DbRepArchive_180d
   NR         3490
   NTFY_ORDER 50-DbRepArchive_180d
   ROLE       Client
   STATE      connected » ProcTime: 0.0024 sec
   TYPE       DbRep
   UTF8       0
Attributes:
   DbLogExclude .*
   allowDeletion 1
   devStateIcon connected.*:10px-kreis-gelb disconnect.*:10px-kreis-rot done.*:10px-kreis-gruen connected:10px-kreis-gruen
   fastStart  0
   group      DbLog
   role       Client
   room       System
   showproctime 1
   stateFormat {ReadingsVal("$name","state", undef) eq "running" ? "renaming" : ReadingsVal("$name","state", undef). " » ProcTime: ".ReadingsVal("$name","sql_processing_time", undef)." sec"}
   timeDiffToNow d:365
   timeOlderThan d:180

   timeout    86400
    executeAfterProc  set DbRepArchive_030d reduceLog average EXCLUDE=CH_GasCalculator:CH_GasCounter_counters.A_EnergyMonthLast,CH_GasCalculator:CH_GasCounter_counters.A_EnergyMeter,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMonthLast,CH_ElectricityCalculator:CH_ElectricityCounter_IEC_01_energyCalc_EnergyMeter
   device %_Thermosta,%_Radiato%,CH_Pressure%,CH_Speedtest,sysmon,myKm200,CH_GasCalculator,CH_WaterCalculator,CH_ElectricityCalculator


Erläuterung: timeDiffToNow / timeOlderThan waren syntaktisch falsch angegeben. executeAfterProc  startet wieder das nächste Device wenn fertig nur mit dem EXCLUDE, (das INCLUDE erfolgt im attr device des nachfolgenden DbRep). Das Attr device includiert die zu behandelnden Devices.

DbRepArchive_030d:

Zitat
Internals:
   DATABASE   /home/fhem/fhemDb/fhem.db
   DEF        myDbLog
   FUUID      61ae23b0-f33f-02bc-d155-41d99a832a462b73
   FVERSION   93_DbRep.pm:v8.46.1-s25321/2021-12-07
   LASTCMD     
   MODEL      Client
   NAME       DbRepArchive_030d
   NOTIFYDEV  global,DbRepArchive_030d
   NR         3489
   NTFY_ORDER 50-DbRepArchive_030d
   ROLE       Client
   STATE      connected » ProcTime: 0.0020 sec
   TYPE       DbRep
   UTF8       0
Attributes:
   DbLogExclude .*
   allowDeletion 1
   devStateIcon connected.*:10px-kreis-gelb disconnect.*:10px-kreis-rot done.*:10px-kreis-gruen connected:10px-kreis-gruen
   fastStart  0
   group      DbLog
   role       Client
   room       System
   showproctime 1
   stateFormat {ReadingsVal("$name","state", undef) eq "running" ? "renaming" : ReadingsVal("$name","state", undef). " » ProcTime: ".ReadingsVal("$name","sql_processing_time", undef)." sec"}
   timeDiffToNow d:30
   timeout    86400
   executeAfterProc  set DbRepBasic Vaccuum
   device %_Thermosta%,%_Radiato%,CH_Pressure,CH_Speedtest,sysmon,myKm200,CH_GasCalculator,CH_WaterCalculator,CH_ElectricityCalculator


Erläuterung: executeAfterProc startet Vaccuum wenn fertig.
Das Attr device inkludiert wieder die relevanten Devices.

Im DbRepBasic musst du noch setzen:
executeAfterProc  {my $FileSize = int((-s "/home/fhem/fhemDb/fhem.db")/(1024*1024));
fhem("setreading myDbLog DbFileSize " . $FileSize);}


Es startet die Size Ermittlung nach dem Vacuum. In einem at kannst du es so nicht verwenden, da Vacuum im Hintergrund noch laufen würde so wie du es im at hinterlegt hattest.

Um die gesamte Kette zu starten brauchst du jetzt nur noch so ein at:


*01:00:00 {

my $FileSize = int((-s "/home/fhem/fhemDb/fhem.db")/(1024*1024));
fhem("setreading myDbLog DbFileSize " . $FileSize);

### Delete all values older than 365 days
fhem("set DbRepArchive_365d delEntries");
}


Dann läuft alles nach und nach durch wenn wir keinen Fehler gemacht haben.
Vor dem ersten Versuch sollte man eine aktuellen Datenbanksicherung haben was eigentlich immer der Standard sein sollte.

Grüße,
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

RalfRog

@DS_STARTER
zur Korrektur reduceLog --> https://forum.fhem.de/index.php/topic,53584.msg1191355.html#msg1191355

Klasse funktioniert :)  Danke!
Im set reduceLog der DbLog selber steckt der Fehler aber noch drin?

Gruß Ralf
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

DS_Starter

Hallo Ralf,

ZitatIm set reduceLog der DbLog selber steckt der Fehler aber noch drin?
Ja. Ich bin mir auch unsicher ob/wie ihn dort mit vertretbaren Aufwand bereinigen kann.
Im DbRep habe ich durch die Modularchitektur einfach mehr Möglichkeiten.

Eigentlich möchte ich am Liebsten alle Auswertungs- und Pflegefunktionen aus dem DbLog entfernen. DbLog soll sich nur um
das Logging kümmern. Auswerten und die Datenbank pflegen erledigt man mit DbRep. Aber historisch bedingt gibt es dort eben auch ein paar Funktionen die nichts mit dem eigentlichen Logging zu tun haben.

Also alles wie count(Nbl), deleteOldDays(Nbl), reduceLog(Nbl), userCommand erledigt man besser mit den entsprechenden Kommandos in DbRep.
Muß mal schauen wie ich es letztlich löse im DbLog. Vielleicht schreibe ich eine "deprecated Meldung" ins FHEM Log damit die User dadurch langsam für solche Aktionen auf DbRep umschwenken wenn noch nicht passiert.

Grüße,
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

RalfRog

Hmmm...    Vermutlich ne passable Idee. Das "Gleiche" an zwei Stellen zu pflegen ist ja eher blöd insbesondere wenn man es nicht einfach übernehmen kann.

Haben nicht andere Maintainer ihr Modul quasi mit neuem Namen und entsprechend passendem Funktionsumfang "neu" erstellt.
Das alte Modul kann dann ohne weitere Pflege bestehen bleiben und der User kann nach eigenem Gusto und Bedarf umsteigen wenns nötig wird.
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

DS_Starter

Ja, da hast du durchaus recht. Allerdings gibt es tiefere Verzahnungen zum Beispiel mit dem SVG Modul, sodass auch dort Erweiterungen notwendig wären bevor ein neues DbLog online gehen könnte.
Will damit andeuten, dass im Falle von DbLog die Dinge nicht ganz so trivial sind. Es greift schon recht tief in den FHEM Mechanismus ein.
Wenn ich ein neues DbLog erstelle, will ich gleich das Datenmodell überarbeiten. Das zieht dann wieder mehr hinterher ....
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

Hallo Heiko,
es stehen mal wieder die Statistiken an und ich habe mich wieder in SQL ausgetobt :-)
Weil das SQL recht umfangreich ist habe ich es wegen der Lesbarkeit entfernt.
Das Ergebnis wird im DbRep auch bereits korrekt angezeigt, jedoch funktioniert die Aufteilung in brauchbare readings nicht vollständig.

Die fehlenden readings habe ich mit "<<<<<<<<<<<" markiert. Den Unterstrich am Ende des Namens hatte ich auch schon durch einen Buchstaber ersetzt, was nicht gereicht hat.

VG
    Christian

Hier mal das List

Internals:
   CFGFN     
   DATABASE   fhem
   DEF        LogDB
   FUUID      61d43f05-f33f-61a8-ae1e-d125add1076a72f1
   FVERSION   93_DbRep.pm:v8.43.0-s24929/2021-09-06
   LASTCMD    sqlCmd SELECT * FROM ( SELECT  TIMESTAMP,  CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1)),'_',REPLACE(READING,'_Year','')) AS READING,  VALUE FROM (  SELECT 
< snip >

   MODEL      Client
   NAME       LogDBRep_Statistic_previous_Quarter
   NOTIFYDEV  global,LogDBRep_Statistic_previous_Quarter
   NR         27404
   NTFY_ORDER 50-LogDBRep_Statistic_previous_Quarter
   ROLE       Client
   STATE      done
   TYPE       DbRep
   UTF8       1
   HELPER:
     DBLOGDEVICE LogDB
     GRANTS     USAGE,ALL PRIVILEGES
     IDRETRIES  2
     MINTS      2019-04-03 00:23:42
     PACKAGE    main
     SQLHIST   
     UEFN_REGEXP .*:.*
     USEREXITFN splitReading
     VERSION    8.43.0
     DBREPCOL:
       COLSET     1
       DEVICE     64
       EVENT      0
       READING    64
       TYPE       64
       UNIT       32
       VALUE      128
   Helper:
     DBLOG:
       state:
         LogDB:
           TIME       1641299717.09238
           VALUE      initialized
   OLDREADINGS:
   READINGS:
     2021-06-30 23:59:00   Q2_Statistic_EnergyHomeBat 676
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyHome 1623
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyHomeFeedInGrid 4797
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyHomeGrid 16
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyHomePv 1186
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyHomePvSum 1607
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyPv1 2019
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyPv2 1614
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyPv4 1260
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyPv5 1797
     2021-09-30 23:59:00   Q3_SW_Statistic_TotalConsumption 1623
     2021-09-30 23:59:00   Q3_SW_Statistic_Yield 6404
     2021-09-30 23:59:00   Q3_SW_Statistic_Yield_NoBat 5983
     2021-09-30 23:59:00   Q3_Statistic_EnergyHomeBat 421
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyHome 2583
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyHomeFeedInGrid 511
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyHomeGrid 1378
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyHomePv 875
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyHomePvSum 1205
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyPv1 510
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyPv2 422
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyPv4 330
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyPv5 551
     2021-12-31 23:59:00   Q4_SW_Statistic_TotalConsumption 2583
     2021-12-31 23:59:00   Q4_SW_Statistic_Yield 1716
     2021-12-31 23:59:00   Q4_SW_Statistic_Yield_NoBat 1386
     2021-12-31 23:59:00   Q4_Statistic_EnergyHomeBat 330
     2022-01-05 19:24:23   SqlResultRow_01 TIMESTAMP|READING|VALUE
     2022-01-05 19:24:23   SqlResultRow_02 2021-12-31 23:59:00|Q4_|previous                    <<<<<<<<<<<<<  das fehlt
     2022-01-05 19:24:23   SqlResultRow_03 2021-12-31 23:59:00|Q4_Statistic_EnergyHomeBat|330
     2022-01-05 19:24:23   SqlResultRow_04 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyHome|2583
     2022-01-05 19:24:23   SqlResultRow_05 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyHomeFeedInGrid|511
     2022-01-05 19:24:23   SqlResultRow_06 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyHomeGrid|1378
     2022-01-05 19:24:23   SqlResultRow_07 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyHomePv|875
     2022-01-05 19:24:23   SqlResultRow_08 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyHomePvSum|1205
     2022-01-05 19:24:23   SqlResultRow_09 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyPv1|510
     2022-01-05 19:24:23   SqlResultRow_10 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyPv2|422
     2022-01-05 19:24:23   SqlResultRow_11 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyPv4|330
     2022-01-05 19:24:23   SqlResultRow_12 2021-12-31 23:59:00|Q4_SW_Statistic_EnergyPv5|551
     2022-01-05 19:24:23   SqlResultRow_13 2021-12-31 23:59:00|Q4_SW_Statistic_TotalConsumption|2583
     2022-01-05 19:24:23   SqlResultRow_14 2021-12-31 23:59:00|Q4_SW_Statistic_Yield_NoBat|1386
     2022-01-05 19:24:23   SqlResultRow_15 2021-12-31 23:59:00|Q4_SW_Statistic_Yield|1716
     2022-01-05 19:24:23   SqlResultRow_16 2021-09-30 23:59:00|Q3_|                             <<<<<<<<<<<<<
     2022-01-05 19:24:23   SqlResultRow_17 2021-09-30 23:59:00|Q3_Statistic_EnergyHomeBat|421
     2022-01-05 19:24:23   SqlResultRow_18 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyHome|1623
     2022-01-05 19:24:23   SqlResultRow_19 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyHomeFeedInGrid|4797
     2022-01-05 19:24:23   SqlResultRow_20 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyHomeGrid|16
     2022-01-05 19:24:23   SqlResultRow_21 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyHomePv|1186
     2022-01-05 19:24:23   SqlResultRow_22 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyHomePvSum|1607
     2022-01-05 19:24:23   SqlResultRow_23 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyPv1|2019
     2022-01-05 19:24:23   SqlResultRow_24 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyPv2|1614
     2022-01-05 19:24:23   SqlResultRow_25 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyPv4|1260
     2022-01-05 19:24:23   SqlResultRow_26 2021-09-30 23:59:00|Q3_SW_Statistic_EnergyPv5|1797
     2022-01-05 19:24:23   SqlResultRow_27 2021-09-30 23:59:00|Q3_SW_Statistic_TotalConsumption|1623
     2022-01-05 19:24:23   SqlResultRow_28 2021-09-30 23:59:00|Q3_SW_Statistic_Yield_NoBat|5983
     2022-01-05 19:24:23   SqlResultRow_29 2021-09-30 23:59:00|Q3_SW_Statistic_Yield|6404
     2022-01-05 19:24:23   SqlResultRow_30 2021-06-30 23:59:00|Q2_|                             <<<<<<<<<<<<<
     2022-01-05 19:24:23   SqlResultRow_31 2021-06-30 23:59:00|Q2_Statistic_EnergyHomeBat|393                            Die doppelten sind noch ein Fehler in der Datenbank
     2022-01-05 19:24:23   SqlResultRow_32 2021-06-30 23:59:00|Q2_Statistic_EnergyHomeBat|676
     2022-01-05 19:24:23   SqlResultRow_33 2021-03-31 23:59:00|Q1_|                             <<<<<<<<<<<<<
     2022-01-05 19:24:23   SqlResultRow_34 2021-03-31 23:59:00|Q1_Statistic_EnergyHomeBat|-1152        <<<<<<<<<<<<<
     2022-01-05 19:24:23   SqlResultRow_35 2021-03-31 23:59:00|Q1_Statistic_EnergyHomeBat|-1435        <<<<<<<<<<<<<

     2022-01-05 19:24:23   sqlCmd          SELECT * FROM ( SELECT  TIMESTAMP,  CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1)),'_',REPLACE(READING,'_Year','')) AS READING,  VALUE < snip >

     2022-01-05 19:24:23   sqlResultNumRows 34
     2022-01-05 19:24:23   state           done
Attributes:
   DbLogExclude .*
   allowDeletion 0
   comment    Version 2022.01.04 14:00
   room       System
   sqlCmdVars SET @offset:=  (   CASE WHEN MONTH(CURRENT_DATE) IN (1,4,7,10) THEN @offset:=0          WHEN MONTH(CURRENT_DATE) IN (2,5,8,11) THEN @offset:=1       ELSE @offset:=2   END  );
   userExitFn splitReading .*:.*
   verbose    0
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

DS_Starter

Hallo Christian,

mir ist nicht klar wie ich dir jetzt helfen könnte ?

LG
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

EDIT: Ich glaube ich bin auf der Spur, die Funktion splitReading hatte ich einfach übernommen und da ist der RegEx Filter falsch.
    Trotzdem erstmal Danke

Zitat von: DS_Starter am 05 Januar 2022, 20:51:24
mir ist nicht klar wie ich dir jetzt helfen könnte ?
Ich vermute es ist etwas mit " userExitFn splitReading .*:.* " nicht okay.
Warum werden alle anderen reading Namen erkannt und umgesetzt, aber die anderen wiederum nicht?


Das wird erkannt und als reading angelegt
2022-01-05 19:24:23   SqlResultRow_03 2021-12-31 23:59:00|Q4_Statistic_EnergyHomeBat|330

Und diese werden nicht als reading angelegt
2022-01-05 19:24:23   SqlResultRow_02 2021-12-31 23:59:00|Q4_|previous
2022-01-05 19:24:23   SqlResultRow_16 2021-09-30 23:59:00|Q3_|
2022-01-05 19:24:23   SqlResultRow_30 2021-06-30 23:59:00|Q2_|
2022-01-05 19:24:23   SqlResultRow_33 2021-03-31 23:59:00|Q1_| 
2022-01-05 19:24:23   SqlResultRow_35 2021-03-31 23:59:00|Q1_Statistic_EnergyHomeBat|-1435
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

DS_Starter

Zitat
Ich vermute es ist etwas mit " userExitFn splitReading .*:.* " nicht okay.

Wie sieht denn deine Funktion splitReading aus ?
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 05 Januar 2022, 22:43:52
Wie sieht denn deine Funktion splitReading aus ?
Ich hatte gerade den Post vorher noch editiert.
Danke erstmal.
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

ch.eick

Hallo Heiko,
ich hatte vor einiger Zeit mal angefragt, ob Du einen Patch inds DRep mit aufnehmen würdest.
Der erste teil war da ersetzten von §device§ und §reading§ für sqlcmd , was Du ja schon teilweise eingebaut hattest.

Der Patch mit wunsch zur Aufnahme wäre folgendes

< snip >

## ch.eick patch ########################################
#  $sql =~ s/§device§/'$device'/xg   if ($device);                                                                      ## das hattest Du bereits rein genommen
#  $sql =~ s/§reading§/'$reading'/xg if ($reading);

  if ($reading) {
    $reading = DbRep_createCommonSql($hash,undef,undef,$reading,undef,undef,undef);
    $reading =~ s/AND 1 \;//ig;
    $sql =~ s/§reading§/$reading/ig;
  }
  if ($device) {
    $device  = DbRep_createCommonSql($hash,undef,$device,undef,undef,undef,undef);
    $device  =~ s/AND 1 \;//ig;
    $sql =~ s/§device§/$device/ig;
  }

###################################################

< snip >


Durch den Patch würden z.B. auch solche einsetzungen möglich sein, was ich jetzt jedes mal wieder einbaue.

device WR_1_API
reading Statistic_%Year EXCLUDE=%Autarky%,%Rate%


Leider kommen noch diese warnings :-)

2022.01.08 17:04:17.353 1: PERL WARNING: Use of uninitialized value $device in pattern match (m//) at ./FHEM/93_DbRep.pm line 9861.
2022.01.08 17:04:17.354 1: PERL WARNING: Use of uninitialized value $idevice in split at ./FHEM/93_DbRep.pm line 9887.
2022.01.08 17:04:17.355 1: PERL WARNING: Use of uninitialized value $selspec in concatenation (.) or string at ./FHEM/93_DbRep.pm line 9552.
2022.01.08 17:04:17.356 1: PERL WARNING: Use of uninitialized value $addon in concatenation (.) or string at ./FHEM/93_DbRep.pm line 9627.
2022.01.08 17:04:17.356 1: PERL WARNING: Use of uninitialized value $reading in substitution (s///) at ./FHEM/93_DbRep.pm line 9964.
2022.01.08 17:04:17.357 1: PERL WARNING: Use of uninitialized value $reading in pattern match (m//) at ./FHEM/93_DbRep.pm line 9966.
2022.01.08 17:04:17.357 1: PERL WARNING: Use of uninitialized value $ireading in split at ./FHEM/93_DbRep.pm line 9987.


VG
    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