Für mich zur Bestätigung... DbRep-Devices

Begonnen von wowogiengen, 30 September 2023, 11:30:50

Vorheriges Thema - Nächstes Thema

wowogiengen

Hallo,
ist es richtig, dass ich für jedes Löschen und Zusammenfassen von Datenbankeinträgen ein eigenes DbRep-Device benötige, welches ich dann mittels einem at-Device zu gegebener Zeit triggere?

Ich möchte meine DB dahingehend aufräumen, dass:
  • Zeilen mit RSSI-Readings nach 1/2 Jahr gelöscht werden
  • Zeilen mit Temperaturen zunächst nach Stunden, dann nach Tagen, Wochen und evtl. Monaten gemittelt werden und die jeweiligen Ausgangswerte dann gelöscht werden
  • andere Readings auch irgendwann gelöscht werden...
Mein DbLog device sieht gerade so aus:
Internals:
   COLUMNS    field length used for Device: 64, Type: 64, Event: 512, Reading: 64, Value: 128, Unit: 32
   CONFIGURATION ./mySQLDB.conf
   DEF        ./mySQLDB.conf Rolladen.*:pct|HzgThermostat.*:batteryLevel|HzgThermostat.*:desired-temp|HzgThermostat.*:measured-temp|HzgThermostat.*:RSSI|HzgStatus.*:humidity|HzgAktor.*:level|HzgAktor.*:RSSI|_HzgAktorBuero00:RSSI|HzgHC.*:*.PerDay|HzgHC.*:countsPerDay|HzgHC.*:countsOverall|HzgHC.*:pulseTimeIncrement|HzgHC.*:pulseTimeEdge|HzgHC.*:pulseTimePerDay|HzgHC.*:pulseTimeOverall|HzgHC.*:pauseTimeIncrement|HzgHC.*:pauseTimeEdge|HzgHC.*:pauseTimePerDay|HzgHC.*:pauseTimeOverall
   FUUID      5ed93474-f33f-a625-5c2b-b4f6628ef5ffc1ff
   FVERSION   93_DbLog.pm:v4.12.3-s24440/2021-05-15
   MODE       asynchronous
   MODEL      MYSQL
   NAME       mySQLDB
   NOTIFYDEV  Rolladen.*,HzgAktor.*,_HzgAktorBuero00,HzgThermostat.*,HzgStatus.*,HzgHC.*
   NR         156
   NTFY_ORDER 50-mySQLDB
   PID        23185
   REGEXP     Rolladen.*:pct|HzgThermostat.*:batteryLevel|HzgThermostat.*:desired-temp|HzgThermostat.*:measured-temp|HzgThermostat.*:RSSI|HzgStatus.*:humidity|HzgAktor.*:level|HzgAktor.*:RSSI|_HzgAktorBuero00:RSSI|HzgHC.*:*.PerDay|HzgHC.*:countsPerDay|HzgHC.*:countsOverall|HzgHC.*:pulseTimeIncrement|HzgHC.*:pulseTimeEdge|HzgHC.*:pulseTimePerDay|HzgHC.*:pulseTimeOverall|HzgHC.*:pauseTimeIncrement|HzgHC.*:pauseTimeEdge|HzgHC.*:pauseTimePerDay|HzgHC.*:pauseTimeOverall
   STATE      connected
   TYPE       DbLog
   UTF8       0
   dbconn     mysql:database=fhem;host=192.168.188.6;port=3307
   dbuser     fhemdbuser
   HELPER:
     COLSET     1
     DEVICECOL  64
     EVENTCOL   512
     OLDSTATE   connected
     PACKAGE    main
     READINGCOL 64
     TC         current
     TH         history
     TYPECOL    64
     UNITCOL    32
     VALUECOL   128
     VERSION    4.12.3
   READINGS:
     2023-09-30 11:25:36   CacheOverflowLastNum 0
     2022-01-17 19:09:18   CacheOverflowLastState normal
     2023-09-30 11:25:37   CacheUsage      0
     2023-09-30 11:25:37   NextSync        2023-09-30 11:29:37 or if CacheUsage 1500 reached
     2023-09-30 11:25:37   background_processing_time 0.2831
     2023-01-03 17:33:48   countCurrent    1428
     2023-01-03 17:33:48   countHistory    4862102
     2020-06-15 18:58:48   lastCachefile   ./log/cache_mySQLDB_2020-06-15_18-05-08 import successful
     2023-09-30 11:25:37   sql_processing_time 0.2289
     2023-09-30 11:25:37   state           connected
     2020-10-21 18:37:41   userCommand     select device,reading, count(*) from current group by device,reading;
     2020-10-21 18:37:41   userCommandResult HzgAktorBad
Attributes:
   DbLogType  Current/History
   asyncMode  1
   bulkInsert 1
   cacheLimit 1500
   event-on-change-reading CacheUsage
   excludeDevs .*#.*RSSI.*
   room       DbLog,LogFiles,System
   showNotifyTime 0
   showproctime 1
   syncInterval 240
   verbose    2

Aktuell habe ich dazu eben noch einige weitere DbRep-Devices:
dbRepBad1
dbRepBad2
dbRepBad3
dbRepBuero1
dbRepBuero2
dbRepBuero3
dbRepDeleteRSSI
dbRepDropRSSI
dbRepSchlafzimmer1
dbRepSchlafzimmer2
dbRepSchlafzimmer3
dbRepStatistic
dbRepWohnzimmer1
dbRepWohnzimmer2
dbRepWohnzimmer3

und da würde jetzt für die Zusammenfassung der Temperaturen nochmal einiges hinzukommen...
Wobei es doch sicherlich möglich sein solle, die Readings verschiedener Devices mit Hilfe eines DbRep, und nicht mehrere, so wie hier gezeigt zu bearbeiten...:

define dbRepBuero3 DbRep mySQLDB
attr dbRepBuero3 aggregation month
attr dbRepBuero3 allowDeletion 1
attr dbRepBuero3 devStateIcon connected:10px-kreis-gelb .*disconnect:10px-kreis-rot .*done:10px-kreis-gruen
attr dbRepBuero3 device HzgThermostatBuero
attr dbRepBuero3 event-on-update-reading state
attr dbRepBuero3 group DBRep
attr dbRepBuero3 reading measured-temp
attr dbRepBuero3 room DbLog,LogFiles,System
attr dbRepBuero3 timestamp_begin previous_month_begin
attr dbRepBuero3 timestamp_end previous_month_end
attr dbRepBuero3 verbose 2
attr dbRepBuero3 webCmd averageValue writeToDB

setstate dbRepBuero3 done
setstate dbRepBuero3 2023-06-08 19:02:46 .associatedWith HzgThermostatBuero
setstate dbRepBuero3 2023-09-01 01:40:02 2023-08-01__HzgThermostatBuero__measured-temp__AVGAM__2023-08 25.0071
setstate dbRepBuero3 2023-09-01 01:40:02 db_lines_processed 2
setstate dbRepBuero3 2023-09-01 01:40:02 state done

(den  Code habe ich sinngemäß in jedem der obigen devices drin... :-\


betateilchen

Du kannst sowohl bei device als auch bei reading eine Liste hinterlegen.
Steht auch so in der commandref.

Zitatdevice - Selection of particular or several devices.
You can specify a list of devices separated by "," or use device specifications (devspec).
In that case the device names are derived from the device specification and the existing devices in FHEM before carry out the SQL selection.

reading - Selection of particular or several readings. More than one reading can be specified by a comma separated list.
SQL wildcard (%) can be used.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wowogiengen

Hallo betateilchen,

Ok,

ich mach mir also ein neues (bzw. in meinem Fall 3 neue ) DbRep-Device, wo dann drinsteht:
attr dbRepNeuTempProTag device HzgThermostatBuero,HzgThermostatWohnzimmer, HzgThermostatBadoder vielleicht noch kürzer dann (damit alle Thermostate abgedeckt werden.
attr dbRepNeuTempProTag device HzgThermostat.*
Im ersten Fall will ich die maximale Einschaltdauer des PWM-Moduls pro Tag abgespeichert haben
==> dbRepPWMOnDay
Im zweiten Fall speichere ich die Durchschnittstemperatur pro Tag der Thermostate
==> dbRepAvgTempDay
Im dritten Fall dann die Durchschnittstemperatur der Readings aus dem zweiten Fall pro Monat.
==> dbRepAvgTempMonth

und dann halt in den device-Attributen die Liste der Devices woher die readings kommen
und im reading-Attribut die Liste der Readings aus den Devices...

Woher weiß das DbRep dann, wie die Zuordung zwischen den Devices und den Readings aus den Attributen ist? Oder wird jedem Device dann das entsprechende Reading in der Liste zugeordnet? Oder alle quasi ausmultipliziert, so dass jedes Device jedes Reading verarbeitet?

Ich könnte ja für die ersten beiden Fälle sowas schreiben wie
attr dbRepProTag device HzgThermostatBuero,HzgThermostatWohnzimmer, HzgThermostatBad, HzgHCBuero,HzgHCWohnzimmer, HzgHCBad
attr dbRepProTag reading measured-temp,measured-temp,measured-temp, pulseTimePerDay, pulseTimePerDay, pulseTimePerDay

HzgHC.* ist ein HourCounter...

Für alle 3 Fälle brauch ich dann aber nochmal 3 Devices, um die Ausgangswerte zu löschen, oder?



betateilchen

Nach mehrmaligem Lesen habe ich Dein Vorhaben immer noch nicht verstanden.

Aber meine Vermutung geht dahin, dass es für das, was Du vorhast, viel einfachere Lösungen gibt, als in der DbLog Datenbank nachträglich eine komplexe Aggregation und statistische Bereinigung durchzuführen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wowogiengen

Also,
dann versuche ich es nocheinmal... anders...

Die DB loggt folgendermassen:
defmod mySQLDB DbLog ./mySQLDB.conf
Rolladen.*:pct|
HzgThermostat.*:batteryLevel|
HzgThermostat.*:desired-temp|
HzgThermostat.*:measured-temp|
HzgThermostat.*:RSSI|
HzgStatus.*:humidity|
HzgAktor.*:level|
HzgAktor.*:RSSI|
_HzgAktorBuero00:RSSI|
HzgHC.*:*.PerDay|
HzgHC.*:countsPerDay|
HzgHC.*:countsOverall|
HzgHC.*:pulseTimeIncrement|
HzgHC.*:pulseTimeEdge|
HzgHC.*:pulseTimePerDay|
HzgHC.*:pulseTimeOverall|
HzgHC.*:pauseTimeIncrement|
HzgHC.*:pauseTimeEdge|
HzgHC.*:pauseTimePerDay|
HzgHC.*:pauseTimeOverall

(eventuell sind das auch so schon viel zu viele Readings, die ich da in die Datenbank schreibe...)

Grundsätzlich interessieren mich hier measured-temp und desired-temp der Thermostate, sowie die Level-Readings der Aktoren. Da es bei den tagesaktuellen Werten keine Aggregation und Auswertung geben soll, brauche ich da grundsätzlich erstmal alle Werte.

Für all das habe ich mir schon entsprechende SVG-Plots erstellt, die aber auf Grund der  Datenmenge sehr lange dauern zu laden (wenn man entsprechend den Zeitraum rauszoomt)...

Da es nach ein paar Tagen eh egal ist, wie die Temperatur genau um 13:25 war, habe ich hier die Temperaturwerte der einzelnen Devices eben pro Tag gemittelt und diese dann wieder als eigenen Wert in die DB geschrieben. Die Ausgangswerte sollte ich noch löschen - ansonsten müllt es mir trotzdem die DB zu...

Die HourCounter wollte ich dazu verwenden, um zu sehen, wie lange die Heizung in einem bestimmten Raum an ist, aber offensichtlich ist der letzte Wert am Tag (also um 23:59:59, pulseTimePerDay) nicht immer der gewünschte höchste Zeitwert.

Trotzdem möchte ich
- die gesammelten Temperaturwerte pro Tag und dann pro Monat mitteln.
- die Einschaltdauer der Hourcounters auf den höchsten Wert am Tag begrenzen und alle anderen wegwerfen.

Was dann noch an Tabellenzeilen übrig bleibt, kann dann nach ein paar Wochen komplett weg.

Vielleicht gehts auch kurz...
Temperatur und Einschaltdauer erfassen, pro Tag und Monat mitteln, und dann die Originalwerte nach 1 Monat wegwerfen...

Viele Grüße und Danke für deine Mühe
Wolfgang


betateilchen

Zitat von: wowogiengen am 30 September 2023, 17:54:56Vielleicht gehts auch kurz...
Temperatur und Einschaltdauer erfassen, pro Tag und Monat mitteln, und dann die Originalwerte nach 1 Monat wegwerfen...

Nimm das statistics Modul und logge die Daten, die dort erzeugt werden. Dann brauchst Du nur die Daten dieses devices behalten und das geht in DbRep einfach mit EXCLUDE= bei der Angabe im Attribut device. Alles andere kannst Du dann einfach löschen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wowogiengen

Ich habe es mal versucht...
list myStatDevice
Internals:
   DEF        HzgThermostat.*
   DEV_REGEXP HzgThermostat.*
   FUUID      65184c9f-f33f-a625-26b3-0d4a111a97f926e9
   NAME       myStatDevice
   NOTIFYDEV  global,HzgThermostat.*
   NR         734642
   NTFY_ORDER 10-myStatDevice
   PREFIX     stat
   STATE      Updated stats for: HzgThermostatBad
   TYPE       statistics
   READINGS:
     2023-09-30 18:28:22   monitoredDevicesCUL_HM HzgThermostatBad,HzgThermostatBad_remote,HzgThermostatBuero,HzgThermostatFlur,HzgThermostatHWR,HzgThermostatSchlafzimmer,HzgThermostatToilette,HzgThermostatWohnzimmer
     2023-09-30 18:28:22   monitoredDevicesnotify HzgThermostatBuero_notify_1
     2023-09-30 18:28:26   nextPeriodChangeCalc 2023-09-30 18:59:55
     2023-09-30 18:45:59   state           Updated stats for: HzgThermostatBad
   fhem:
     modulVersion $Date: 2019-12-24 00:07:57 +0100 (Tue, 24 Dec 2019) $
     nextPeriodChangeTime 1696093195
Attributes:
   DbLogInclude *.*
   deltaReadings measured-temp, desired-temp

Irgendetwas passiert, aber wo sehe ich jetzt welche Daten?
Mit
statMeasured-temp Hour: 0.0 Day: 0.0 Month: 0.0 Year: 0.0 (since: 2023-09-30_18:32:58 )   2023-09-30 18:45:59
statStateDay      CMDs_done: 00:01:54 CMDs_done_Count: 1 (since: 2023-09-30_18:28:22)     2023-09-30 18:30:16
statStateMonth    CMDs_done: 00:01:54 CMDs_done_Count: 1 (since: 2023-09-30_18:28:22)     2023-09-30 18:30:16
statStateYear     CMDs_done: 00:01:54 CMDs_done_Count: 1 (since: 2023-09-30_18:28:22)     2023-09-30 18:30:16

kann ich doch nichts anfangen?

betateilchen

Könnte sein, dass die readings im HzgThermostat auftauchen. Aber sie wären dort zumindest an ihrem Namensschema erkennbar.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wowogiengen

Hallo Betateilchen,
auch nach einem Tag (an dem ja laut Wiki und Doku ein Min-/Mittel-/Maxwert gebildet worden sein sollte, sehe ich immer noch nix vernünftiges in meinen Devices...
Was fehlt hier noch?

Internals:
   DEF        HzgThermostat.*|HzgHC.*
   DEV_REGEXP HzgThermostat.*|HzgHC.*
   FUUID      65184c9f-f33f-a625-26b3-0d4a111a97f926e9
   NAME       myStatDevice
   NOTIFYDEV  global,HzgThermostat.*|HzgHC.*
   NR         734642
   NTFY_ORDER 10-myStatDevice
   PREFIX     stat
   STATE      Updated stats for: HzgHC_Schlafzimmer
   TYPE       statistics
   READINGS:
     2023-09-30 18:28:22   monitoredDevicesCUL_HM HzgThermostatBad,HzgThermostatBad_remote,HzgThermostatBuero,HzgThermostatFlur,HzgThermostatHWR,HzgThermostatSchlafzimmer,HzgThermostatToilette,HzgThermostatWohnzimmer
     2023-09-30 19:20:35   monitoredDevicesHourCounter HzgHC_Bad,HzgHC_Buero,HzgHC_Flur,HzgHC_Schlafzimmer,HzgHC_Toilette,HzgHC_Wohnzimmer
     2023-09-30 18:28:22   monitoredDevicesnotify HzgThermostatBuero_notify_1
     2023-10-01 17:59:55   nextPeriodChangeCalc 2023-10-01 18:59:55
     2023-10-01 18:03:46   state           Updated stats for: HzgHC_Schlafzimmer
   fhem:
     modulVersion $Date: 2019-12-24 00:07:57 +0100 (Tue, 24 Dec 2019) $
     nextPeriodChangeTime 1696179595
Attributes:
   DbLogInclude *.*
   deltaReadings measured-temp, desired-temp
   verbose    1

Solange kein vernünftiges Reading beim Device ankommt, kann ich auch keines zum Loggen in die Datenbank auswählen...
:(

Viele Grüße
Wolfgang

wowogiengen

Hallo,
kleines update,
es kommt nun was an, nachdem ich bisschen was geändert habe:

statDesired-tempDay    Min: 17.5 Avg: 17.5 Max: 17.5 (since: 2023-10-01_18:19:56 )    2023-10-01 18:27:20
statDesired-tempHour    Min: 17.5 Avg: 17.5 Max: 17.5 (since: 2023-10-01_18:19:56 )    2023-10-01 18:27:20
statDesired-tempMonth    Min: 17.5 Avg: 17.5 Max: 17.5 (since: 2023-10-01_18:19:56 )    2023-10-01 18:27:20
statDesired-tempYear    Min: 17.5 Avg: 17.5 Max: 17.5 (since: 2023-10-01_18:19:56 )    2023-10-01 18:27:20
statMeasured-temp    Hour: 0.0 Day: 0.4 Month: 0.4 Year: 0.2 (since: 2023-09-30_18:32:03 )    2023-10-01 18:25:48
statMeasured-tempDay    Min: 25.2 Avg: 25.2 Max: 25.2 (since: 2023-10-01_18:27:20 )    2023-10-01 18:27:20
statMeasured-tempHour    Min: 25.2 Avg: 25.2 Max: 25.2 (since: 2023-10-01_18:27:20 )    2023-10-01 18:27:20
statMeasured-tempLast    Hour: 0.0 Day: -0.2 Month: -0.2 Year: - (since: 2023-09-30_18:32:03 )    2023-10-01 17:59:55
statMeasured-tempMonth    Min: 25.2 Avg: 25.2 Max: 25.2 (since: 2023-10-01_18:27:20 )    2023-10-01 18:27:20
statMeasured-tempYear    Min: 25.2 Avg: 25.2 Max: 25.2 (since: 2023-10-01_18:27:20 )    2023-10-01 18:27:20

aber aus dem Reading kann ich ja keinen vernünftigen Wert für die Datenbank machen, damit die SVG-Plots das auswerten können.

Muss man bei FHEM denn alles so kompliziert machen? Jedesmal, wenn ich ein kleines Problem habe, bekomme ich mit meiner Frage und den Antworten darauf dann wieder Probleme, die ich ohne FHEM nie gehabt hätte...

Ich hätte es gerne so gehabt:

statDesired-tempHourMin 17.5  2023-10-01 18:27:20
statDesired-tempHourAvg 17.5  2023-10-01 18:27:20
statDesired-tempHourMax 17.5  2023-10-01 18:27:20


Daraus würde dann in der Datenbank wiederum 3 Zeilen generiert werden, die dann als Quelle für den Plot genommen werden könnten...

Icinger

Schau dir im statistics-Device das Attribut "singularReadings" an.

Mit zB
.*:temperature:(Min|Max|Avg):(Hour|Day)|bekommst du dann

     2023-10-01 18:43:35   statTemperatureDayAvg 16.59
     2023-09-30 23:59:55   statTemperatureDayAvgLast 17.40
     2023-07-04 23:59:55   statTemperatureDayLast Min: 15.50 Avg: 21.94 Max: 28.20
     2023-10-01 18:43:35   statTemperatureDayMax 21.20
     2023-09-30 23:59:55   statTemperatureDayMaxLast 21.40
     2023-10-01 18:43:35   statTemperatureDayMin 13.60
     2023-09-30 23:59:55   statTemperatureDayMinLast 13.70
     2023-09-30 23:59:55   statTemperatureDay_Last Min: 13.70 Avg: 17.40 Max: 21.40
     2023-10-01 18:43:35   statTemperatureHour Min: 17.50 Avg: 18.11 Max: 18.90
     2023-10-01 18:43:35   statTemperatureHourAvg 18.11
     2023-10-01 17:59:55   statTemperatureHourAvgLast 20.42
     2023-07-05 15:59:55   statTemperatureHourLast Min: 26.70 Avg: 27.31 Max: 28.10
     2023-10-01 18:43:35   statTemperatureHourMax 18.90
     2023-10-01 17:59:55   statTemperatureHourMaxLast 21.20
     2023-10-01 18:43:35   statTemperatureHourMin 17.50
     2023-10-01 17:59:55   statTemperatureHourMinLast 18.90

Also die perfekten Werte fürs Loggen :)

PS: Immer die "....Last" loggen, das sind die Durchschnittswerte der vergangenen Stunde/Tag/Woche/Jahr
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

wowogiengen

Halll Icinger,
für mich wäre es aber dann ja eher sowas wie

attr myStatDevice minAvgMaxReadings desired-temp,measured-temp
attr myStatDevice singularReadings HzgThermostat.*:.*-temp:(Min|Max|Avg):(Hour|Day)
da ich die Werte aller Devices "HzgThermostat.*" haben möchte, und die Readings mit "-temp" aufhören...?

Irgendwo hab ich jetzt aber wieder einen Bock geschossen, da auf einmal alle Devices alle Readings in die DB schreiben...

wowogiengen

Hallo,
und nochwas ist mir aufgefallen...
Eigentlich wollte ich die Anzahl der Einträge in die Datenbank reduzieren... ???

Durch das Statistik-Modul werden jetzt aber mindestens nochmal genauso viele Einträge erzeugt, sobald sich ein Wert geändert hat... Das ist doch nicht im Sinne des Erfinders? Reicht es nicht, pro Zeiteinheit genau 3 Werte für Min, Max und Durchschnitt in die DB zu schreiben? Wieso wird bei jeder Änderung des Ausgangswertes die geänderte Berechnung genauso geloggt?

Icinger

ZitatWieso wird bei jeder Änderung des Ausgangswertes die geänderte Berechnung genauso geloggt?
Einfach mal ins Blaue geraten:

Weil du dich nicht mit DbLogInclude|DbLogExclude auseinandergesetzt hast?

Und ausserdem
ZitatPS: Immer die "....Last" loggen, das sind die Durchschnittswerte der vergangenen Stunde/Tag/Woche/Jahr
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

rabehd

Ich denke hier muss man mal neu anfangen. Schon bei der Idee viele DbRep-Device anzulegen vermute ich ein Konzeptproblem.
Auch funktionierende Lösungen kann man hinterfragen.