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

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

Vorheriges Thema - Nächstes Thema

betateilchen

Ich weiß ja nicht, wie Du solche Dinge in die Konfiguration bringst, aber wenn man dafür den integrierten Attribut-Editor benutzt, muss man über die Anzahl der Semikolon selten nachdenken, das macht FHEM dann normalerweise selbst "richtig".
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thowe

Gut gemeinte Worte. In der Praxis hätte ich Devices inkl. Attribute von über 200 sequenziell ablaufenden DbRep-Kommandos im FHEM-Editor eingeben müssen. Dafür habe ich die Alternative genutzt, um einigermaßen den Überblick behalten zu können.
Vor jedem DbRep-Update stelle ich eine Kerze ins Fenster. Diesmal hat es nicht geholfen.
Ich wünsche Euch schöne Feiertage
und sage vielen Dank für Euer Engagement,
Thowe

betateilchen

//offtopic

Es kann natürlich jeder tun und lassen, was und wie er möchte.

Hätte ich 200 DbRep Kommandos nacheinander abzuarbeiten, würde ich das nicht direkt in der Konfiguration hinterlegen, sondern ein 99_dbrepUtils.pm erstellen.
Darin würde ich die Parameter für jeden Aufruf in einem array of hashes ablegen und dann das array abarbeiten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thowe

Interessanter Ansatz, weil übersichtlicher, aber praktikabel? Wie meinst Du das konkret, wenn von Aufruf zu Aufruf einige dbrep-Attribute anzupassen sind, z.B. timestamp_begin, timestamp_end, device, reading, executeAfterProc und bspw. §timestamp_begin§ in einem sqlCmd benutzt werden muss?
Falls das zur Abarbeitung jeder Array-Zeile ein defmod notwendig macht, halte ich das laufzeittechnisch für ungeschickt.

betateilchen

Warum sollte dafür ein defmod notwendig werden? Ein DbRep device muss doch einfach nur vorhanden sein, um beliebige Dinge damit tun zu können.

Alles andere wird per Attributen festgelegt und dann mit "set ... irgendwas" ausgeführt.

Zitat von: Thowe am 17 Dezember 2023, 19:18:30Wie meinst Du das konkret, wenn von Aufruf zu Aufruf einige dbrep-Attribute anzupassen sind, z.B. timestamp_begin, timestamp_end, device, reading, executeAfterProc und bspw. §timestamp_begin§ in einem sqlCmd benutzt werden muss?

wie ich schon geschrieben hatte:

Zitat von: betateilchen am 17 Dezember 2023, 13:33:26die Parameter für jeden Aufruf in einem array of hashes ablegen

Jeder hash im array enthält alle Werte für die Attribute, den auszuführenden Befehl und ggf. Befehlsparameter jeder einzelnen Aktion.

my @dbrep = (
{ timestamp_begin => "2023-12-17 00:00:00", timestamp_end => "2023-12-17 01:00:00", device => "device1", reading => "reading1", cmd => "delEntries" },
{ timestamp_begin => "2023-12-15 11:00:00", timestamp_end => "2023-12-15 12:00:00", device => "device2", reading => "reading2", cmd => "delEntries" },
);

und dann in einer Schleife über das array die Attribute setzen und den angegebenen Befehl ausführen.
Das kann man theoretisch beliebig granular aufdröseln.



//offtopic:
Mega-cool wäre natürlich, wenn man so einen vorbereiteten hash direkt an ein DbRep device übergeben könnte.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thowe

Dankeschön für die Unterstützung. Wenn DbRep jetzt noch eine XML-Struktur mit SQL-Statements verarbeiten könnte...

DS_Starter

Habe eure Diskussion verfolgt ...

Zitat//offtopic:
Mega-cool wäre natürlich, wenn man so einen vorbereiteten hash direkt an ein DbRep device übergeben könnte.

ZitatWenn DbRep jetzt noch eine XML-Struktur mit SQL-Statements verarbeiten könnte...

Mal schauen ...
Wünsche euch guten Start in die Vorweihnachtswoche!
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

betateilchen

Bitte nicht xml, xml ist gruslig und finsterstes Mittelalter.
json macht viel mehr Spaß und ist viel flexibler.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thowe

Im Ernst, ich bezweifele, dass eine SQL-Skriptmaschine für ein Hausautomationssystem erwartet wird.

Thowe

Hallo Heiko,
ist der Ansatz von betateilchen z.Zt. überhaupt umsetzbar? Wie kann ich die strenge Abarbeitungssequenz der DbPrep-Audrufe sicherstellen?
Viele Grüße,
Thowe

DS_Starter

Hallo Thowe,

das kann man svhon machen. wegen der asynchronen Arbeitsweise muss man sich in ein bisschen Steuerungslogik überlegen. man kann im executeBeforeProc einen Status in einem Reading setzen und mit executeAfterProc wieder löschen. den fragt man in seiner Schleife ab und startet dann den nächsten Befehl usw.

Nur als Beispiel.

Aber das

ZitatMega-cool wäre natürlich, wenn man so einen vorbereiteten hash direkt an ein DbRep device übergeben könnte

will ich mir auf jeden Fall noch zu Gemüte führen. Halte ich für viele Einsätze sehr praktisch. Dbrep ist gerade nicht so im Scope, aber kommt wieder mal dran.
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

#2051
Hallo zusammen,

in meinem contrib habe ich die V 8.53.0 hochgeladen.

Es gibt in der V einen Setter multiCmd mit dem man dem Device einen Befehls-Hash übergeben und abarbeiten lassen kann.
Die genaue Syntax/Verwendung könnt ihr der Kommando-Hilfe entnehmen.
Der Befehlshash kann auch über eine Variable übergeben werden.
Als Demo hier ein Beispiel mit einem at-Device:

define Rep.multi at +*01:00:00 {
   my $cmdhash =
   "{
      1  => { timestamp_begin => '2023-12-17 00:00:00',
              timestamp_end   => '2023-12-17 01:00:00',
              device          => 'SMA_Energymeter',
              reading         => 'Einspeisung_Wirkleistung_Zaehler',
              cmd             => 'countEntries history'
            },
      2  => { timestamp_begin => '2023-12-15 11:00:00',
              timestamp_end   => 'previous_day_end',
              device          => 'SMA_Energymeter',
              reading         => 'Einspeisung_Wirkleistung_Zaehler',
              cmd             => 'countEntries'
            },
      3  => { timeDiffToNow   => 'd:2',
              device          => 'SMA_%,MySTP.*',
              reading         => 'etotal,etoday,Ein% EXCLUDE=%Wirkleistung',
              cmd             => 'countEntries history'
            },
      4  => { cmd             => 'sqlCmd select count(*) from current'
            },
    }";
   
    fhem ("set Rep.CPU multiCmd $cmdhash");
}


Mit verbose 4 seht ihr die Abarbeitung der "Queue" im Log:

Zitat2024.01.06 14:17:42.240 4: DbRep Rep.CPU - Start multiCmd index >1<
2024.01.06 14:17:42.418 4: DbRep Rep.CPU - -------- New selection ---------
2024.01.06 14:17:42.419 4: DbRep Rep.CPU - Command: countEntries history
2024.01.06 14:17:42.420 4: DbRep Rep.CPU - FullDay option: 0
2024.01.06 14:17:42.420 4: DbRep Rep.CPU - Timestamp begin human readable: 2023-12-17 00:00:00
2024.01.06 14:17:42.421 4: DbRep Rep.CPU - Timestamp end human readable: 2023-12-17 01:00:00
2024.01.06 14:17:42.421 4: DbRep Rep.CPU - Aggregation: no
2024.01.06 14:17:42.452 4: DbRep Rep.CPU - Database connect - user: fhemtest, UTF-8 option set: yes
2024.01.06 14:17:42.456 4: DbRep Rep.CPU - SQL execute: SHOW VARIABLES LIKE 'collation_database'
2024.01.06 14:17:42.458 4: DbRep Rep.CPU - Database Character set is >utf8mb4_bin<
2024.01.06 14:17:42.459 4: DbRep Rep.CPU - simple do statement: set names "utf8mb4" collate "utf8mb4_bin"
2024.01.06 14:17:42.460 4: DbRep Rep.CPU - SQL execute: SELECT COUNT(*) FROM history where ( DEVICE = 'SMA_Energymeter' ) AND ( READING = 'Einspeisung_Wirkleistung_Zaehler' ) AND TIMESTAMP >= '2023-12-17 00:00:00' AND TIMESTAMP <= '2023-12-17 01:00:00' ;
2024.01.06 14:17:42.586 4: DbRep Rep.CPU - Start multiCmd index >2<
2024.01.06 14:17:42.596 4: DbRep Rep.CPU - -------- New selection ---------
2024.01.06 14:17:42.597 4: DbRep Rep.CPU - Command: countEntries history
2024.01.06 14:17:42.597 4: DbRep Rep.CPU - FullDay option: 0
2024.01.06 14:17:42.598 4: DbRep Rep.CPU - Timestamp begin human readable: 2023-12-15 11:00:00
2024.01.06 14:17:42.598 4: DbRep Rep.CPU - Timestamp end human readable: 2024-01-05 23:59:59
2024.01.06 14:17:42.599 4: DbRep Rep.CPU - Aggregation: no
2024.01.06 14:17:42.644 4: DbRep Rep.CPU - Database connect - user: fhemtest, UTF-8 option set: yes
2024.01.06 14:17:42.648 4: DbRep Rep.CPU - SQL execute: SHOW VARIABLES LIKE 'collation_database'
2024.01.06 14:17:42.650 4: DbRep Rep.CPU - Database Character set is >utf8mb4_bin<
2024.01.06 14:17:42.650 4: DbRep Rep.CPU - simple do statement: set names "utf8mb4" collate "utf8mb4_bin"
2024.01.06 14:17:42.651 4: DbRep Rep.CPU - SQL execute: SELECT COUNT(*) FROM history where ( DEVICE = 'SMA_Energymeter' ) AND ( READING = 'Einspeisung_Wirkleistung_Zaehler' ) AND TIMESTAMP >= '2023-12-15 11:00:00' AND TIMESTAMP <= '2024-01-05 23:59:59' ;
2024.01.06 14:17:42.860 4: DbRep Rep.CPU - Start multiCmd index >3<
2024.01.06 14:17:42.872 4: DbRep Rep.CPU - -------- New selection ---------
2024.01.06 14:17:42.872 4: DbRep Rep.CPU - Command: countEntries history
2024.01.06 14:17:42.873 4: DbRep Rep.CPU - timeDiffToNow - year: , day: 2, hour: , min: , sec:
2024.01.06 14:17:42.874 4: DbRep Rep.CPU - Year 2024 is leap year
2024.01.06 14:17:42.874 4: DbRep Rep.CPU - startMonth: 0 endMonth: 0 lastleapyear: 2024 baseYear: 2024 diffdaylight:0 isdaylight:0
2024.01.06 14:17:42.875 4: DbRep Rep.CPU - FullDay option: 0
2024.01.06 14:17:42.875 4: DbRep Rep.CPU - Time difference to current time for calculating Timestamp begin: 172801 sec
2024.01.06 14:17:42.876 4: DbRep Rep.CPU - Timestamp begin human readable: 2024-01-04 14:17:41
2024.01.06 14:17:42.876 4: DbRep Rep.CPU - Timestamp end human readable: 2024-01-06 14:17:42
2024.01.06 14:17:42.877 4: DbRep Rep.CPU - Aggregation: no
2024.01.06 14:17:42.916 4: DbRep Rep.CPU - Database connect - user: fhemtest, UTF-8 option set: yes
2024.01.06 14:17:42.920 4: DbRep Rep.CPU - SQL execute: SHOW VARIABLES LIKE 'collation_database'
2024.01.06 14:17:42.921 4: DbRep Rep.CPU - Database Character set is >utf8mb4_bin<
2024.01.06 14:17:42.922 4: DbRep Rep.CPU - simple do statement: set names "utf8mb4" collate "utf8mb4_bin"
2024.01.06 14:17:42.927 4: DbRep Rep.CPU - SQL execute: SELECT COUNT(*) FROM history where ( DEVICE IN ('SMA_Energymeter','MySTP_5000') ) AND ( READING LIKE 'Ein%' OR READING IN ('etotal','etoday') ) AND READING NOT LIKE '%Wirkleistung' AND TIMESTAMP >= '2024-01-04 14:17:41' AND TIMESTAMP <= '2024-01-06 14:17:42' ;
2024.01.06 14:17:44.359 4: DbRep Rep.CPU - Start multiCmd index >4<
2024.01.06 14:17:44.504 4: DbRep Rep.CPU - SQL online formatted: select count(*)
from current;
2024.01.06 14:17:44.519 4: DbRep Rep.CPU - -------- New selection ---------
2024.01.06 14:17:44.520 4: DbRep Rep.CPU - Command: sqlCmd select count(*) from current;
2024.01.06 14:17:44.521 4: DbRep Rep.CPU - Timestamp begin human readable: not set
2024.01.06 14:17:44.522 4: DbRep Rep.CPU - Timestamp end human readable: not set
2024.01.06 14:17:44.548 4: DbRep Rep.CPU - Database connect - user: fhemtest, UTF-8 option set: yes
2024.01.06 14:17:44.552 4: DbRep Rep.CPU - SQL execute: SHOW VARIABLES LIKE 'collation_database'
2024.01.06 14:17:44.554 4: DbRep Rep.CPU - Database Character set is >utf8mb4_bin<
2024.01.06 14:17:44.555 4: DbRep Rep.CPU - simple do statement: set names "utf8mb4" collate "utf8mb4_bin"
2024.01.06 14:17:44.556 4: DbRep Rep.CPU - SQL execute: select count(*) from current;
2024.01.06 14:17:44.581 4: DbRep Rep.CPU - SQL result: 21515

Ich habe bei mir schon recht viel getestet, würde mich dennoch freuen wenn der eine oder andere die Möglichkieten in seinem System ausprobiert. Möglicherweise gibt es Situationen die ich noch nicht beachtet habe.

EDIT: habe die die Lösung noch gehärtet, sodass irrtümlich falsch geschriebene Befehle ignoriert werden und dies im Log protokolliert wird.

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

DS_Starter

Ich habe noch weitere Attributschlüssel verfügbar gemacht.
Damit kann man sich die Ergebnisse zum Beipiel über autoForward automatisch in, u.U. verschiedene, Zieldevices konsolidieren lassen.

Das Demo at-Device kann dann z.B. so aussehen:

define Rep.multi at +*01:00:00 {
   my $cmdhash =
   qq/{   
      1  => { timestamp_begin => '2023-12-17 00:00:00',
              timestamp_end   => '2023-12-17 01:00:00',
              device          => 'SMA_Energymeter',
              reading         => 'Einspeisung_Wirkleistung_Zaehler',
              cmd             => 'countEntries history'
            },
      2  => { timestamp_begin => '2023-12-15 11:00:00',
              timestamp_end   => 'previous_day_end',
              device          => 'SMA_Energymeter',
              reading         => 'Einspeisung_Wirkleistung_Zaehler',
              cmd             => 'countEntries'
            },
      3  => { timeDiffToNow   => 'd:2',
              readingNameMap  => 'COUNT',
              autoForward     => '{ ".*COUNT.*" => "Dum.Rep.All" }',
              device          => 'SMA_%,MySTP.*',
              reading         => 'etotal,etoday,Ein% EXCLUDE=%Wirkleistung',
              cmd             => 'countEntries history'
            },
      4  => { timeDiffToNow   => 'd:2',
              readingNameMap  => 'SUM',
              autoForward     => '{ ".*SUM.*" => "Dum.Rep.All" }',
              device          => 'SMA_%,MySTP.*',
              reading         => 'etotal,etoday,Ein% EXCLUDE=%Wirkleistung',
              cmd             => 'sumValue'
            },
      5  => { cmd             => 'sqlCmd select count(*) from current'
            },
    }/;

    fhem ("set Rep.CPU multiCmd $cmdhash");
}

Update liegt in meinem 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

Hallo zusammen,

ich hab seit einiger Zeit (ca 1-2 Wochen) immer mal wieder ne Meldung im Log von zwei DbRep Devices, bei den ich mir noch nicht erklären kann, woher die Meldung kommt. Die Devices wird alle 15 Min aufgerufen (mit Hilfe von executeAfterProc) und mal kommt ein Fehler mal nicht. Z.B. Heute Nacht 5x davor im Laufe des Nachmittags 4x .... total verwunderlich  ???

Da ich absolut keine Idee hab, eben auch weil es nur ab und zu mal kommt. Hoffe ich dass jemand einen Tipp hat, wie ich mich dem Ganzen mal nähern kann:

Fehler:
2024.01.25 02:55:12.191 2: DbRep DBrep_Wetter_wind_speed - ERROR - DBD::mysql::st execute failed: Deadlock found when trying to get lock; try restarting transaction at ./FHEM/93_DbRep.pm line 11956.

Betroffenes Device:
define DBrep_Wetter_wind_speed DbRep DBLogging
attr DBrep_Wetter_wind_speed DbLogExclude .*
attr DBrep_Wetter_wind_speed alias 03 Schnitt Wind_speed errechnen
attr DBrep_Wetter_wind_speed allowDeletion 1
attr DBrep_Wetter_wind_speed device Wetterstation
attr DBrep_Wetter_wind_speed event-on-change-reading .*
attr DBrep_Wetter_wind_speed executeAfterProc set DBrep_Wetter_humidity averageValue writeToDBInTime
attr DBrep_Wetter_wind_speed group Automatische DB Bereinigung
attr DBrep_Wetter_wind_speed icon own-log@darkgrey
attr DBrep_Wetter_wind_speed reading wind_speed
attr DBrep_Wetter_wind_speed room System->Datenbank
attr DBrep_Wetter_wind_speed sortby 13
attr DBrep_Wetter_wind_speed timeDiffToNow m:15
attr DBrep_Wetter_wind_speed timeOlderThan m:0
attr DBrep_Wetter_wind_speed verbose 2
#   DATABASE   fhem_DB_LIVE
#   DEF        DBLogging
#   FUUID      649cad18-f33f-6adc-f2c3-76163c3dfee6ef9a
#   FVERSION   93_DbRep.pm:v8.53.0-s28370/2024-01-10
#   LASTCMD    averageValue writeToDBInTime
#   MODEL      Client
#   NAME       DBrep_Wetter_wind_speed
#   NOTIFYDEV  global,DBrep_Wetter_wind_speed
#   NR         326
#   NTFY_ORDER 50-DBrep_Wetter_wind_speed
#   ROLE       Client
#   STATE      done
#   TYPE       DbRep
#   UTF8       1
#   eventCount 1685
#   HELPER:
#     DBLOGDEVICE DBLogging
#     GRANTS     DROP,RELOAD,SHOW VIEW,CREATE VIEW,CREATE USER,INSERT,TRIGGER,REPLICATION SLAVE,SHUTDOWN,LOCK TABLES,ALTER,FILE,REFERENCES,REPLICATION CLIENT,CREATE TEMPORARY TABLES,INDEX,DELETE,ALTER ROUTINE,PROCESS,CREATE ROUTINE,EXECUTE,SELECT,SHOW DATABASES,UPDATE,EVENT,CREATE
#     IDRETRIES  2
#     MINTS      2022-07-01 00:00:22
#     PACKAGE    main
#     VERSION    8.53.0
#     CV:
#       aggregation no
#       aggsec     1
#       destr      2024-01-25
#       dsstr      2024-01-25
#       epoch_seconds_end 1706180108.03797
#       mestr      01
#       msstr      01
#       testr      11:55:08
#       tsstr      11:40:08
#       wdadd      345600
#       yestr      2024
#       ysstr      2024
#     DBREPCOL:
#       COLSET     1
#       DEVICE     64
#       EVENT      512
#       READING    64
#       TYPE       64
#       UNIT       32
#       VALUE      128
#   OLDREADINGS:
#   READINGS:
#     2024-01-25 11:55:10   2024-01-25__Wetterstation__wind_speed__AVGAM__no_aggregation 1.0000
#     2024-01-25 11:55:10   db_lines_processed 2
#     2024-01-25 11:55:11   state           done
#
setstate DBrep_Wetter_wind_speed done
setstate DBrep_Wetter_wind_speed 2024-01-23 22:31:21 .associatedWith Wetterstation
setstate DBrep_Wetter_wind_speed 2024-01-25 11:55:10 2024-01-25__Wetterstation__wind_speed__AVGAM__no_aggregation 1.0000
setstate DBrep_Wetter_wind_speed 2024-01-25 11:55:10 db_lines_processed 2
setstate DBrep_Wetter_wind_speed 2024-01-25 11:55:11 state done


Vielen Dank im Voraus
VG
Andreas

betateilchen

Zitat von: DS_Starter am 06 Januar 2024, 14:29:55Es gibt in der V einen Setter multiCmd mit dem man dem Device einen Befehls-Hash übergeben und abarbeiten lassen kann.
Die genaue Syntax/Verwendung könnt ihr der Kommando-Hilfe entnehmen.
Der Befehlshash kann auch über eine Variable übergeben werden.

Das sieht gut aus, aber ich habe den Beitrag erst heute entdeckt.
Diese und nächste Woche komme ich wahrscheinlich nicht zum Testen, aber ich werde das auf jeden Fall ausprobieren.

Vorab schonmal Danke für Umsetzen der Idee.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!