DBLog höchster Wert des Tages behalten rest verwerfen/löschen

Begonnen von kask, 02 August 2022, 18:13:38

Vorheriges Thema - Nächstes Thema

DS_Starter

Ich habe reduceLog für die Erweiterung vorbereitet und komplett überarbeitet.
Wer die neue V testen möchte schaut bitte hier: https://forum.fhem.de/index.php/topic,53584.msg1231080.html#msg1231080
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

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

dirk.k

Danke für den Aufwand.
Ich habe es mehrfach probiert ... erhalte aber nach 7-8 Minuten einen Fehler:
DBD::SQLite::st execute failed: database is locked at ./FHEM/93_DbRep.pm line 9286.

Mein Befehl:
set DbRep.logdb reduceLog 1 max include=%:Relay,MAX_SC_02543a:onoff,MAX_SC_02543a:on_off_ticker


DS_Starter

#33
Je nach Performance kann es notwendig sein die SQLite vor parallelen Schreibprozessen (DbLog) zu
schützen.
Man kann mit den Attributen im DbRep die DbLog temporär während der Laufzeit von reduceLog sperren.
DbLog sollte asynchron eingestellt sein.


executeBeforeProc  set <DbLog Device> reopen 3600
executeAfterProc  set <DbLog Device> reopen
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

Motivierte linke Hände

Nur zum Verständnis nochmal: Verstehe ich diesen Faden dahingehend richtig, dass DbRep aktuell, wenn ich für diffValue, averageValue etc. das Attribut "devices" auf mehrere Devices setze, die Aktion nicht für jedes Device einzeln, sondern einmal aggregiert über alle Devices ausführt?

D.h. ich muss mir, wenn ich 20 Geräte habe, für die ich Differenzwerte in die DB schreiben möchte, mir 20 DbReps anlegen - oder für ein DbRep vor jedem Aufruf die Attribute ändern?

Und wenn ich das richtig verstanden habe: Geht was kaputt (weil DbRep Datenbankanfragen NBL ausführt, ich aber rapide Attribute ändere und DbRep-Anfragen auslöse), wenn ich mir eine Perl-Schleife wie die folgende baue:


[...]
foreach my $dev (sort keys %defs) {
    if($defs{$dev}{TYPE} eq 'MQTT2_DEVICE') {
      if (AttrVal($defs{$dev}{NAME},'model','err') eq 'shellyPlus_1pm') {
        fhem("attr myDbRep device $defs{$dev}{NAME}";
        fhem("attr myDbRep device energy_total");
        fhem('set myDBRep diffValue writeToDB");
      } elsif (AttrVal($defs{$dev}{NAME},'model','err') eq 'shelly3em') {
        fhem("attr myDbRep device $defs{$dev}{NAME}";
        fhem("attr myDbRep device emeter_sum_total");
        fhem('set myDBRep diffValue writeToDB");
      }
    }
  }
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

DS_Starter

#35
Zitat
Verstehe ich diesen Faden dahingehend richtig, dass DbRep aktuell, wenn ich für diffValue, averageValue etc. das Attribut "devices" auf mehrere Devices setze, die Aktion nicht für jedes Device einzeln, sondern einmal aggregiert über alle Devices ausführt?
Ja das ist richtig. Die gesetzten devices und/ oder readings werden wie angegeben in der DB Abfrage includiert (bzw. excludiert) und aus dem Selektionsergebnis der Wert average, min, max ... ermittelt.

Zitat
D.h. ich muss mir, wenn ich 20 Geräte habe, für die ich Differenzwerte in die DB schreiben möchte, mir 20 DbReps anlegen - oder für ein DbRep vor jedem Aufruf die Attribute ändern?
Ja, normalerweise kopiert man sich einfach ein angelegtes Rep und ändert die Attribute wie gewünscht bzw. benötigt.
Das lässt man dann regelmäßig über die DB arbeiten.
Ein DbRep anzulegen und dann immer die Attr zu ändern würde zwar gehen, war aber von mir nie so gedacht für den produktiven Einsatz.

Zitat
Geht was kaputt (weil DbRep Datenbankanfragen NBL ausführt, ich aber rapide Attribute ändere und DbRep-Anfragen auslöse), wenn ich mir eine Perl-Schleife wie die folgende baue:
Es geht zwar technisch nichts kaputt, aber das verwendete Device bringt in seinen Readings nicht nachvollziehbare Ergebnisse.
Also besser so nicht machen.
Außerdem würdest du massiv parallele Prozesse starten, die je nach verfügbarer Hardware zu Engpässen führen könnte.
Stimmt nicht, genau das habe ich per Design verboten, d.h. das Device würde erst einen neuen Prozess starten wenn der laufende beendet ist.
Besser mehrere DbRep anlegen und zeitlich "entzerrt" ausführen.
Es gibt noch die Möglichkeit eine Chain aufzubauen, die sebständig nacheinander die Aufgaben ausführt: https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Abarbeitung_einer_sequentiellen_Befehlskette_mittels_non-blocking_sqlCmd-Kommandos
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

dirk.k

Hallo,
als Erstes ... es sieht so aus, als bekäme ich die gewünschten Maximalwerte.
Aber ich scheine noch Probleme bei der Geräteauswahl zu haben ...
mein Befehl:
set DbRep.logdb reduceLog 1 max include=%:Relay,MAX_SC_02543a:onoff,MAX_SC_02543a:on_off_ticker

Dieser scheint sich aber auch auf Devices bzw Werte auszuwirken, welche ich gar nicht abgegeben habe.
Die folgende Kurve ist weder relay noch von einem MAX-device

Vermutungen... muss INCLUDE großgeschrieben werden? Und kann ich überhaupt mehrere readings auf einmal wählen?
 



DS_Starter

#37
Zitat
Vermutungen... muss INCLUDE großgeschrieben werden?
Das ist korrekt -> siehe Commandref

Zitat
Und kann ich überhaupt mehrere readings auf einmal wählen?
Hier ist zu unterscheiden, ob Operatoren in der Befehlszeile angegeben werden oder nicht.
In der Commandref gibt es die Beschreibung der Arbeitsweise mit Angabe von Operatoren in der Befehlszeile oder nicht was dann zur Verwendung der Einträge in den Attributen device und reading führt. Die Beschreibung der Befehlszeilenoperatoren sind exakt zu befolgen und nicht "frei" zu interpretieren, d.h. in dem Fall sind nicht mehrere Readings angebbar.
Die Verwendung der Attr device und reading statt dessen ist sehr viel flexibler als die Befehlszeilenoperatoren, mehrere Readings sind angebbar.
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

cbl

Ich hänge mich an dieses alte Thema, da ich exakt das gleiche Problem habe. Ich bin dem Beispiel von DS_Starter gefolgt (DANKE!) und bei mir werden alle Einträge gelöscht.

Zitat von: DS_Starter am 03 August 2022, 21:39:18Hier nochmal ein schrittweises Beispiel.
Dieses DbRep wird für die nachfolgenden Aktionen verwendet:

defmod Rep.fhemtest1 DbRep LogDB1
attr Rep.fhemtest1 aggregation no
attr Rep.fhemtest1 allowDeletion 1
attr Rep.fhemtest1 device MySTP_5000
attr Rep.fhemtest1 event-on-update-reading state
attr Rep.fhemtest1 reading total_pac
attr Rep.fhemtest1 room DbLog
attr Rep.fhemtest1 showproctime 1
attr Rep.fhemtest1 timestamp_begin 2022-07-30 00:00:00
attr Rep.fhemtest1 timestamp_end 2022-07-30 23:59:59
attr Rep.fhemtest1 verbose 4

Es wird Device / Reading  MySTP_5000 / total_pac verwendet, das ist die gemessene Leistung des Wechselrichters.

Zunächst ein countEntries um die aktuell vorhandenen Datensätze zu zählen:

2022.08.03 21:02:58.866 4: DbRep Rep.fhemtest1 - -------- New selection ---------
2022.08.03 21:02:58.867 4: DbRep Rep.fhemtest1 - Command: countEntries history
2022.08.03 21:02:58.867 4: DbRep Rep.fhemtest1 - FullDay option: 0
2022.08.03 21:02:58.868 4: DbRep Rep.fhemtest1 - Timestamp begin human readable: 2022-07-30 00:00:00
2022.08.03 21:02:58.868 4: DbRep Rep.fhemtest1 - Timestamp end human readable: 2022-07-30 23:59:59
2022.08.03 21:02:58.869 4: DbRep Rep.fhemtest1 - Aggregation: no
2022.08.03 21:02:58.890 4: DbRep Rep.fhemtest1 - Database connect - user: fhemtest1, UTF-8 option set: yes
2022.08.03 21:02:58.895 4: DbRep Rep.fhemtest1 - SQL execute: SELECT COUNT(*) FROM history where ( DEVICE = 'MySTP_5000' ) AND ( READING = 'total_pac' ) AND TIMESTAMP >= '2022-07-30 00:00:00' AND TIMESTAMP <= '2022-07-30 23:59:59' ;

Ergebnis sind 763:

  READINGS:
    2022-08-03 21:02:59  2022-07-30__COUNT_history__no_aggregation 763
    2022-08-03 21:02:59  background_processing_time 0.9327
    2022-08-03 21:02:59  sql_processing_time 0.9277
    2022-08-03 21:02:59  state          done

Jetzt zeige ich den Max Wert an mit maxValue display:

2022.08.03 21:08:45.719 4: DbRep Rep.fhemtest1 - -------- New selection ---------
2022.08.03 21:08:45.720 4: DbRep Rep.fhemtest1 - Command: maxValue display
2022.08.03 21:08:45.720 4: DbRep Rep.fhemtest1 - FullDay option: 0
2022.08.03 21:08:45.721 4: DbRep Rep.fhemtest1 - Timestamp begin human readable: 2022-07-30 00:00:00
2022.08.03 21:08:45.721 4: DbRep Rep.fhemtest1 - Timestamp end human readable: 2022-07-30 23:59:59
2022.08.03 21:08:45.722 4: DbRep Rep.fhemtest1 - Aggregation: no
2022.08.03 21:08:45.746 4: DbRep Rep.fhemtest1 - Database connect - user: fhemtest1, UTF-8 option set: yes
2022.08.03 21:08:45.749 4: DbRep Rep.fhemtest1 - SQL execute: SELECT VALUE,TIMESTAMP FROM history where ( DEVICE = 'MySTP_5000' ) AND ( READING = 'total_pac' ) AND TIMESTAMP >= '2022-07-30 00:00:00' AND TIMESTAMP <= '2022-07-30 23:59:59' ORDER BY TIMESTAMP

Ergebnis ist 1.1790 um 2022-07-30_15-29-27:

  READINGS:
    2022-08-03 21:08:46  2022-07-30_15-29-27__MySTP_5000__total_pac__MAX__no_aggregation 1.1790
    2022-08-03 21:08:46  background_processing_time 1.1393
    2022-08-03 21:08:46  sql_processing_time 1.1318
    2022-08-03 21:08:46  state          done

Jetzt werden außer dem Maxwert alle anderen gelöscht mit maxValue deleteOther

2022.08.03 21:12:36.700 4: DbRep Rep.fhemtest1 - -------- New selection ---------
2022.08.03 21:12:36.701 4: DbRep Rep.fhemtest1 - Command: maxValue deleteOther
2022.08.03 21:12:36.701 4: DbRep Rep.fhemtest1 - FullDay option: 0
2022.08.03 21:12:36.702 4: DbRep Rep.fhemtest1 - Timestamp begin human readable: 2022-07-30 00:00:00
2022.08.03 21:12:36.702 4: DbRep Rep.fhemtest1 - Timestamp end human readable: 2022-07-30 23:59:59
2022.08.03 21:12:36.703 4: DbRep Rep.fhemtest1 - Aggregation: no
2022.08.03 21:12:36.722 4: DbRep Rep.fhemtest1 - Database connect - user: fhemtest1, UTF-8 option set: yes
2022.08.03 21:12:36.726 4: DbRep Rep.fhemtest1 - SQL execute: SELECT VALUE,TIMESTAMP FROM history where ( DEVICE = 'MySTP_5000' ) AND ( READING = 'total_pac' ) AND TIMESTAMP >= '2022-07-30 00:00:00' AND TIMESTAMP <= '2022-07-30 23:59:59' ORDER BY TIMESTAMP;
2022.08.03 21:12:37.505 4: DbRep Rep.fhemtest1 - Database connect - user: fhemtest1, UTF-8 option set: yes
2022.08.03 21:12:37.507 4: DbRep Rep.fhemtest1 - begin transaction
2022.08.03 21:12:37.507 4: DbRep Rep.fhemtest1 - SQL execute: delete FROM history where ( DEVICE = 'MySTP_5000' ) AND ( READING = 'total_pac' ) AND TIMESTAMP >= '2022-07-30 00:00:00' AND TIMESTAMP <= '2022-07-30 23:59:59' AND (TIMESTAMP,VALUE) != ("2022-07-30 15:29:27","1.179");
2022.08.03 21:12:37.930 4: DbRep Rep.fhemtest1 - transaction committed
2022.08.03 21:12:37.931 3: DbRep Rep.fhemtest1 - number of lines deleted in "LogDB1": 762

Es wurden also 762 gelöscht, vorganden waren (siehe oben) 763.

Zum check nochmal ein countEntries nach dem Löschen:

  READINGS:
    2022-08-03 21:33:35  2022-07-30__COUNT_history__no_aggregation 1
    2022-08-03 21:33:35  background_processing_time 1.8349
    2022-08-03 21:33:35  sql_processing_time 1.8309
    2022-08-03 21:33:35  state          done

1 Datensatz blieb übrig. Um noch zu vergleichen welcher geblieben ist mache ich ein fetchrows:

  READINGS:
    2022-08-03 21:34:56  2022-07-30_15-29-27__1__MySTP_5000__total_pac 1.179
    2022-08-03 21:34:56  background_processing_time 1.6397
    2022-08-03 21:34:56  number_fetched_rows 1
    2022-08-03 21:34:56  sql_processing_time 1.6355
    2022-08-03 21:34:56  state          done

Wie erwartet verblieb der Datensatz  2022-07-30_15-29-27 mit  1.179 in der DB.

Die Abweichung ist bei mir die Device- und Reading-Definition:

Im Device möchte ich mit einem DBRep alle gleichartigen Devices behandeln. Daher habe ich dort "strom.*" gesetzt, um alle ElectricityCalculator-Instanzen zu erwischen.
Beim Reading habe ich "%_EnergyCostDay", um bei den unterschiedlichen Devices die unterschiedlichen Readings, die alle so enden, zu erwischen.
Beim Testen gestern lief das erfolgreich und es blieb mit
set DbRepDevice maxValue deleteOthergenau der Maximum-Eintrag übrig.

Nun habe ich über Nacht genau den Befehl mit einem DOIF ausgeführt und es sind alle Werte von gestern weg.



define dbrep.energieverbrauchszaehler.energycostday DbRep dblog
attr dbrep.energieverbrauchszaehler.energycostday aggregation no
attr dbrep.energieverbrauchszaehler.energycostday allowDeletion 1
attr dbrep.energieverbrauchszaehler.energycostday device strom.*
attr dbrep.energieverbrauchszaehler.energycostday reading %_EnergyCostDay
attr dbrep.energieverbrauchszaehler.energycostday room System
attr dbrep.energieverbrauchszaehler.energycostday timestamp_begin previous_day_begin
attr dbrep.energieverbrauchszaehler.energycostday timestamp_end previous_day_end
#  DATABASE  fhem
#  DEF        dblog
#  FUUID      64982e6f-f33f-ae1f-157d-7dd49ca6a8da12d5
#  FVERSION  93_DbRep.pm:v8.52.7-s27577/2023-05-16
#  LASTCMD    maxValue deleteOther
#  MODEL      Client
#  NAME      dbrep.energieverbrauchszaehler.energycostday
#  NOTIFYDEV  global,dbrep.energieverbrauchszaehler.energycostday
#  NR        3934
#  NTFY_ORDER 50-dbrep.energieverbrauchszaehler.energycostday
#  ROLE      Client
#  STATE      done
#  TYPE      DbRep
#  UTF8      1
#  eventCount 6
#  HELPER:
#    DBLOGDEVICE dblog
#    GRANTS    USAGE,ALL PRIVILEGES
#    IDRETRIES  2
#    MINTS      2022-04-30 07:42:16
#    PACKAGE    main
#    VERSION    8.52.7
#    CV:
#      aggregation no
#      aggsec    1
#      destr      2023-06-25
#      dsstr      2023-06-25
#      epoch_seconds_end 1687730399
#      mestr      06
#      msstr      06
#      testr      23:59:59
#      tsstr      00:00:00
#      wdadd      86400
#      yestr      2023
#      ysstr      2023
#    DBREPCOL:
#      COLSET    1
#      DEVICE    64
#      EVENT      0
#      READING    64
#      TYPE      64
#      UNIT      32
#      VALUE      128
#  Helper:
#    DBLOG:
#      2023-06-25_10-37-03__strom./__/_EnergyCostDay__MAX__no_aggregation:
#        dblog:
#          TIME      1687732207.23272
#          VALUE      1982.9460
#      connectionEncoding:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      utf8mb4
#      dbEncoding:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      utf8mb4
#      db_lines_processed:
#        dblog:
#          TIME      1687732207.23272
#          VALUE      954
#      indexState:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      Index Report_Idx exists
#      state:
#        dblog:
#          TIME      1687732207.36492
#          VALUE      done
#      timestamp_oldest_dataset:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      2022-04-30 07:42:16
#      userRights:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      USAGE,ALL PRIVILEGES
#  OLDREADINGS:
#  READINGS:
#    2023-06-26 00:30:07  2023-06-25_10-37-03__strom./__/_EnergyCostDay__MAX__no_aggregation 1982.9460
#    2023-06-26 00:30:07  db_lines_processed 954
#    2023-06-26 00:30:07  state          done
#  powerMap:
#  readingsDesc:
#    pM_consumption:
#      rtype      w
#    pM_energy:
#      rtype      whr
#
setstate dbrep.energieverbrauchszaehler.energycostday done
setstate dbrep.energieverbrauchszaehler.energycostday 2023-06-26 05:56:57 .associatedWith strom strom.netzbezug strom.netzbezug.ohnepv strom.netzeinspeisung strom.produktion strom.verbrauch strom.waermepumpe.bezug strom.waermepumpe.produktion
setstate dbrep.energieverbrauchszaehler.energycostday 2023-06-26 00:30:07 2023-06-25_10-37-03__strom./__/_EnergyCostDay__MAX__no_aggregation 1982.9460
setstate dbrep.energieverbrauchszaehler.energycostday 2023-06-26 00:30:07 db_lines_processed 954
setstate dbrep.energieverbrauchszaehler.energycostday 2023-06-26 00:30:07 state done


Im DOIF steht nur
set dbrep.energieverbrauchszaehler.energycostday maxValue deleteOther

Wo liegt mein Fehler?


Danke und Gruß
Christian

cbl

Zitat von: cbl am 26 Juni 2023, 10:16:12Ich hänge mich an dieses alte Thema, da ich exakt das gleiche Problem habe. Ich bin dem Beispiel von DS_Starter gefolgt (DANKE!) und bei mir werden alle Einträge gelöscht.

Zitat von: DS_Starter am 03 August 2022, 21:39:18Hier nochmal ein schrittweises Beispiel.
Dieses DbRep wird für die nachfolgenden Aktionen verwendet:

defmod Rep.fhemtest1 DbRep LogDB1
attr Rep.fhemtest1 aggregation no
attr Rep.fhemtest1 allowDeletion 1
attr Rep.fhemtest1 device MySTP_5000
attr Rep.fhemtest1 event-on-update-reading state
attr Rep.fhemtest1 reading total_pac
attr Rep.fhemtest1 room DbLog
attr Rep.fhemtest1 showproctime 1
attr Rep.fhemtest1 timestamp_begin 2022-07-30 00:00:00
attr Rep.fhemtest1 timestamp_end 2022-07-30 23:59:59
attr Rep.fhemtest1 verbose 4

Es wird Device / Reading  MySTP_5000 / total_pac verwendet, das ist die gemessene Leistung des Wechselrichters.

Zunächst ein countEntries um die aktuell vorhandenen Datensätze zu zählen:

2022.08.03 21:02:58.866 4: DbRep Rep.fhemtest1 - -------- New selection ---------
2022.08.03 21:02:58.867 4: DbRep Rep.fhemtest1 - Command: countEntries history
2022.08.03 21:02:58.867 4: DbRep Rep.fhemtest1 - FullDay option: 0
2022.08.03 21:02:58.868 4: DbRep Rep.fhemtest1 - Timestamp begin human readable: 2022-07-30 00:00:00
2022.08.03 21:02:58.868 4: DbRep Rep.fhemtest1 - Timestamp end human readable: 2022-07-30 23:59:59
2022.08.03 21:02:58.869 4: DbRep Rep.fhemtest1 - Aggregation: no
2022.08.03 21:02:58.890 4: DbRep Rep.fhemtest1 - Database connect - user: fhemtest1, UTF-8 option set: yes
2022.08.03 21:02:58.895 4: DbRep Rep.fhemtest1 - SQL execute: SELECT COUNT(*) FROM history where ( DEVICE = 'MySTP_5000' ) AND ( READING = 'total_pac' ) AND TIMESTAMP >= '2022-07-30 00:00:00' AND TIMESTAMP <= '2022-07-30 23:59:59' ;

Ergebnis sind 763:

  READINGS:
    2022-08-03 21:02:59  2022-07-30__COUNT_history__no_aggregation 763
    2022-08-03 21:02:59  background_processing_time 0.9327
    2022-08-03 21:02:59  sql_processing_time 0.9277
    2022-08-03 21:02:59  state          done

Jetzt zeige ich den Max Wert an mit maxValue display:

2022.08.03 21:08:45.719 4: DbRep Rep.fhemtest1 - -------- New selection ---------
2022.08.03 21:08:45.720 4: DbRep Rep.fhemtest1 - Command: maxValue display
2022.08.03 21:08:45.720 4: DbRep Rep.fhemtest1 - FullDay option: 0
2022.08.03 21:08:45.721 4: DbRep Rep.fhemtest1 - Timestamp begin human readable: 2022-07-30 00:00:00
2022.08.03 21:08:45.721 4: DbRep Rep.fhemtest1 - Timestamp end human readable: 2022-07-30 23:59:59
2022.08.03 21:08:45.722 4: DbRep Rep.fhemtest1 - Aggregation: no
2022.08.03 21:08:45.746 4: DbRep Rep.fhemtest1 - Database connect - user: fhemtest1, UTF-8 option set: yes
2022.08.03 21:08:45.749 4: DbRep Rep.fhemtest1 - SQL execute: SELECT VALUE,TIMESTAMP FROM history where ( DEVICE = 'MySTP_5000' ) AND ( READING = 'total_pac' ) AND TIMESTAMP >= '2022-07-30 00:00:00' AND TIMESTAMP <= '2022-07-30 23:59:59' ORDER BY TIMESTAMP

Ergebnis ist 1.1790 um 2022-07-30_15-29-27:

  READINGS:
    2022-08-03 21:08:46  2022-07-30_15-29-27__MySTP_5000__total_pac__MAX__no_aggregation 1.1790
    2022-08-03 21:08:46  background_processing_time 1.1393
    2022-08-03 21:08:46  sql_processing_time 1.1318
    2022-08-03 21:08:46  state          done

Jetzt werden außer dem Maxwert alle anderen gelöscht mit maxValue deleteOther

2022.08.03 21:12:36.700 4: DbRep Rep.fhemtest1 - -------- New selection ---------
2022.08.03 21:12:36.701 4: DbRep Rep.fhemtest1 - Command: maxValue deleteOther
2022.08.03 21:12:36.701 4: DbRep Rep.fhemtest1 - FullDay option: 0
2022.08.03 21:12:36.702 4: DbRep Rep.fhemtest1 - Timestamp begin human readable: 2022-07-30 00:00:00
2022.08.03 21:12:36.702 4: DbRep Rep.fhemtest1 - Timestamp end human readable: 2022-07-30 23:59:59
2022.08.03 21:12:36.703 4: DbRep Rep.fhemtest1 - Aggregation: no
2022.08.03 21:12:36.722 4: DbRep Rep.fhemtest1 - Database connect - user: fhemtest1, UTF-8 option set: yes
2022.08.03 21:12:36.726 4: DbRep Rep.fhemtest1 - SQL execute: SELECT VALUE,TIMESTAMP FROM history where ( DEVICE = 'MySTP_5000' ) AND ( READING = 'total_pac' ) AND TIMESTAMP >= '2022-07-30 00:00:00' AND TIMESTAMP <= '2022-07-30 23:59:59' ORDER BY TIMESTAMP;
2022.08.03 21:12:37.505 4: DbRep Rep.fhemtest1 - Database connect - user: fhemtest1, UTF-8 option set: yes
2022.08.03 21:12:37.507 4: DbRep Rep.fhemtest1 - begin transaction
2022.08.03 21:12:37.507 4: DbRep Rep.fhemtest1 - SQL execute: delete FROM history where ( DEVICE = 'MySTP_5000' ) AND ( READING = 'total_pac' ) AND TIMESTAMP >= '2022-07-30 00:00:00' AND TIMESTAMP <= '2022-07-30 23:59:59' AND (TIMESTAMP,VALUE) != ("2022-07-30 15:29:27","1.179");
2022.08.03 21:12:37.930 4: DbRep Rep.fhemtest1 - transaction committed
2022.08.03 21:12:37.931 3: DbRep Rep.fhemtest1 - number of lines deleted in "LogDB1": 762

Es wurden also 762 gelöscht, vorganden waren (siehe oben) 763.

Zum check nochmal ein countEntries nach dem Löschen:

  READINGS:
    2022-08-03 21:33:35  2022-07-30__COUNT_history__no_aggregation 1
    2022-08-03 21:33:35  background_processing_time 1.8349
    2022-08-03 21:33:35  sql_processing_time 1.8309
    2022-08-03 21:33:35  state          done

1 Datensatz blieb übrig. Um noch zu vergleichen welcher geblieben ist mache ich ein fetchrows:

  READINGS:
    2022-08-03 21:34:56  2022-07-30_15-29-27__1__MySTP_5000__total_pac 1.179
    2022-08-03 21:34:56  background_processing_time 1.6397
    2022-08-03 21:34:56  number_fetched_rows 1
    2022-08-03 21:34:56  sql_processing_time 1.6355
    2022-08-03 21:34:56  state          done

Wie erwartet verblieb der Datensatz  2022-07-30_15-29-27 mit  1.179 in der DB.

Die Abweichung ist bei mir die Device- und Reading-Definition:

Im Device möchte ich mit einem DBRep alle gleichartigen Devices behandeln. Daher habe ich dort "strom.*" gesetzt, um alle ElectricityCalculator-Instanzen zu erwischen.
Beim Reading habe ich "%_EnergyCostDay", um bei den unterschiedlichen Devices die unterschiedlichen Readings, die alle so enden, zu erwischen.
Beim Testen gestern lief das erfolgreich und es blieb mit
set DbRepDevice maxValue deleteOthergenau der Maximum-Eintrag übrig.

Nun habe ich über Nacht genau den Befehl mit einem DOIF ausgeführt und es sind alle Werte von gestern weg.



define dbrep.energieverbrauchszaehler.energycostday DbRep dblog
attr dbrep.energieverbrauchszaehler.energycostday aggregation no
attr dbrep.energieverbrauchszaehler.energycostday allowDeletion 1
attr dbrep.energieverbrauchszaehler.energycostday device strom.*
attr dbrep.energieverbrauchszaehler.energycostday reading %_EnergyCostDay
attr dbrep.energieverbrauchszaehler.energycostday room System
attr dbrep.energieverbrauchszaehler.energycostday timestamp_begin previous_day_begin
attr dbrep.energieverbrauchszaehler.energycostday timestamp_end previous_day_end
#  DATABASE  fhem
#  DEF        dblog
#  FUUID      64982e6f-f33f-ae1f-157d-7dd49ca6a8da12d5
#  FVERSION  93_DbRep.pm:v8.52.7-s27577/2023-05-16
#  LASTCMD    maxValue deleteOther
#  MODEL      Client
#  NAME      dbrep.energieverbrauchszaehler.energycostday
#  NOTIFYDEV  global,dbrep.energieverbrauchszaehler.energycostday
#  NR        3934
#  NTFY_ORDER 50-dbrep.energieverbrauchszaehler.energycostday
#  ROLE      Client
#  STATE      done
#  TYPE      DbRep
#  UTF8      1
#  eventCount 6
#  HELPER:
#    DBLOGDEVICE dblog
#    GRANTS    USAGE,ALL PRIVILEGES
#    IDRETRIES  2
#    MINTS      2022-04-30 07:42:16
#    PACKAGE    main
#    VERSION    8.52.7
#    CV:
#      aggregation no
#      aggsec    1
#      destr      2023-06-25
#      dsstr      2023-06-25
#      epoch_seconds_end 1687730399
#      mestr      06
#      msstr      06
#      testr      23:59:59
#      tsstr      00:00:00
#      wdadd      86400
#      yestr      2023
#      ysstr      2023
#    DBREPCOL:
#      COLSET    1
#      DEVICE    64
#      EVENT      0
#      READING    64
#      TYPE      64
#      UNIT      32
#      VALUE      128
#  Helper:
#    DBLOG:
#      2023-06-25_10-37-03__strom./__/_EnergyCostDay__MAX__no_aggregation:
#        dblog:
#          TIME      1687732207.23272
#          VALUE      1982.9460
#      connectionEncoding:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      utf8mb4
#      dbEncoding:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      utf8mb4
#      db_lines_processed:
#        dblog:
#          TIME      1687732207.23272
#          VALUE      954
#      indexState:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      Index Report_Idx exists
#      state:
#        dblog:
#          TIME      1687732207.36492
#          VALUE      done
#      timestamp_oldest_dataset:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      2022-04-30 07:42:16
#      userRights:
#        dblog:
#          TIME      1687732202.91498
#          VALUE      USAGE,ALL PRIVILEGES
#  OLDREADINGS:
#  READINGS:
#    2023-06-26 00:30:07  2023-06-25_10-37-03__strom./__/_EnergyCostDay__MAX__no_aggregation 1982.9460
#    2023-06-26 00:30:07  db_lines_processed 954
#    2023-06-26 00:30:07  state          done
#  powerMap:
#  readingsDesc:
#    pM_consumption:
#      rtype      w
#    pM_energy:
#      rtype      whr
#
setstate dbrep.energieverbrauchszaehler.energycostday done
setstate dbrep.energieverbrauchszaehler.energycostday 2023-06-26 05:56:57 .associatedWith strom strom.netzbezug strom.netzbezug.ohnepv strom.netzeinspeisung strom.produktion strom.verbrauch strom.waermepumpe.bezug strom.waermepumpe.produktion
setstate dbrep.energieverbrauchszaehler.energycostday 2023-06-26 00:30:07 2023-06-25_10-37-03__strom./__/_EnergyCostDay__MAX__no_aggregation 1982.9460
setstate dbrep.energieverbrauchszaehler.energycostday 2023-06-26 00:30:07 db_lines_processed 954
setstate dbrep.energieverbrauchszaehler.energycostday 2023-06-26 00:30:07 state done


Im DOIF steht nur
set dbrep.energieverbrauchszaehler.energycostday maxValue deleteOther

Problem selbst gelöst. Die Antwort stand irgendwo weiter oben im Thread:

Bei mehreren Devices wird der MaxValue über _alle_ Devices ermittelt und nur der bleibt übrig. Ich muss also für jedes Device ein eigenes DbRep-Device anlegen.

loetmeister

Zitat von: DS_Starter am 17 August 2022, 20:04:06
ZitatVermutungen... muss INCLUDE großgeschrieben werden?
Das ist korrekt -> siehe Commandref

Hallo,

bin auch grade darüber gestolpert.... und leider "include=" statt INCLUDE= benutzt.
Hier:
https://fhem.de/commandref.html#DbRepset
https://fhem.de/commandref_DE.html#DbRepset
ist leider kein Hinweis das es in Großbuchstaben sein muss... eventuell könnte das überarbeitet werden?  O:-)

Gruß,
Thomas

DS_Starter

Hallo Thomas,

Zitatist leider kein Hinweis das es in Großbuchstaben sein muss... eventuell könnte das überarbeitet werden?

In der Commandref ist die Syntax doch genau angegeben:

reduceLog [<no>[:<nn>]] [mode] [EXCLUDE=device1:reading1,device2:reading2,...] [INCLUDE=device:reading]

Wie man sieht, ist die Großschreibung von EXCLUDE / INCLUDE eindeutig vorgegeben.
Ich könnte höchstens noch schreiben dass man bitte die Syntax einhalten soll, jedoch sollte das eigentlich selbstverständlich sein.  ;)

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

loetmeister

#42
Hallo Heiko,

Danke, ja so ist es verständlich. :⁠-⁠)
Vermutlich schauen wir uns verschiedene Commandrefs an...? Auf https://fhem.de/commandref.html#DbRepset steht:

Zitatset <name> reduceLog <no>[:<nn>] [average[=day]] [exclude=device1:reading1,device2:reading2,...]

Reduces historical records older than <no> days and (optionally) newer than <nn> days to one record (the first) per hour per device & reading.
Inside device/reading SQL wildcards "%" and "_" can be used.

The optional specification of 'average' or 'average=day' not only cleans the database, but also reduces all numerical values of an hour or a day are reduced to a single average value.

Optionally, the last parameter "exclude=device1:reading1,device2:reading2,...." can be specified to exclude device/reading combinations from reduceLog.
Instead of "exclude", "include=device:reading" can be specified as the last parameter in order to limit the SELECT query executed on the database. This reduces the RAM load and increases performance. The option "include" can only be specified with a device:reading combination.

Examples:
set <name> reduceLog 270 average include=Luftdaten_remote:%
set <name> reduceLog 100:200 average exclude=SMA_Energymeter:Bezug_Wirkleistung

Gruß,
Thomas

DS_Starter

Moin Thomas,

den Link muß ich korrigieren, der funktioniert nicht.

Jedoch ist die von dir gezeigte ComRef die vom DbLog reducelog und nicht die vom DbRep.

Benutzt du reducelog von DbLog oder DbRep ?
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

loetmeister

Ah, verflixt. Das ist Erklärung...
Ja, ich nutze DbRep und bin vom Wiki https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten für die "Set" Befehle zur Commandref gekommen... Da hab ich dann aber den falschen Abschnitt erwischt.  :-[
Hatte ich nicht gesehen das DbLog und DbRep den selben Befehl haben.


Gruß,
Thomas