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

Hallo zusammen,

ich habe eine neue DbRep-Version eingecheckt.
Die Funktion diffValue kann nun unterscheiden nun ob keine Werte zur Auswertung vorhanden sind oder die Differenz 0 ist.
Im ersten Fall wird wie bisher "-" ausgegeben, im zweiten Fall entsprechend Differenz "0".

Ist morgen früh im update enthalten.

VG
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

Ein herzerfrischendes "Moin" vom achtern Diek vorweg!

Das Tool DbRep ist inzwischen so mächtig geworden, dass ich mich frage ob dort inzwischen auch folgende Problematik gelöst werden kann:

Ich möchte einmal am Tag einen Befehl absetzen, bei dem
a) Alle Werte die jünger als 30d sind, auf einen stündlichen Mittelwert um xx:30 Uhr reduzieren.
b) Alle Werte die älter sind als 180d auf einen täglichen Mittelwert um 12:00 Uhr reduzieren.
c) Alle Werte die älter sind als 365d löschen.

Wobei es Ausnahmen geben muss, da gewisse Readings (monatlicher Gasverbrauch einmal zum Ende des Monats ermittelt) nicht durch a) bis c) behandelt werden soll.

Ich hoffe ich habe mich dahingehend verständlich ausgedrückt.

Danke für Eure Hilfe

Gruß
    Sailor
******************************
Man wird immer besser...

DS_Starter

#1532
Hallo Sailor,

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.
Ich nehme immer ein bereits existierendes Devices, kopiere es und passe es dann an.

Zitatc) Alle Werte die älter sind als 365d löschen.

Die leichteste Aufgabe. Du setzt die Attr

allowDeletion = 1
timeOlderThan = d:365


Mit dem Befehl "set ... delEntries" werden alle Daten älter als 365 Tage gelöscht.


Zitatb) Alle Werte die älter sind als 180d auf einen täglichen Mittelwert um 12:00 Uhr reduzieren.

Mit reduceLog kannst du arbeiten. Du setzt die Attribute

allowDeletion = 1
timeOlderThan = d:180
(timeDiffToNow = d:365  - optional)


Mit dem Befehl "set ... reduceLog average=day"  werden die Daten älter als 180 Tage auf einen Tagesmittelwert reduziert.
Wenn du das optionale timeDiffToNow ebenfalls setzt, werden Daten älter als 180 und nicht älter als 365 Tage bearbeitet.

Sollen Device/Readings ausgeklammert werden, ergänzt du den Befehl mit "EXCLUDE=device1:reading1,device2:reading2,...".


Zitata) Alle Werte die jünger als 30d sind, auf einen stündlichen Mittelwert um xx:30 Uhr reduzieren.

Auch hier nimmst du reduceLog und setzt die Attribute

allowDeletion = 1
timeDiffToNow = d:30


Der Befehl wäre dann "set ... reduceLog average". Device/Readings excluden wie oben angegeben.

Es gibt noch die Möglichkeit durch direkte Eingabe beim Befehl bestimmte Dinge mitzugeben.
Ich bevorzuge aber die fixe Einstellung über die Attribute.
Hoffe ich habe nichts vergessen. :) In der Hilfe findest du noch Infos zu möglichen Attributen in diesem Kontext.

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

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.
Ich nehme immer ein bereits existierendes Devices, kopiere es und passe es dann an.

Cool, ich bereite mal was vor und poste den Erfolg...

Gruß und Danke
    Sailor
******************************
Man wird immer besser...

DS_Starter

Hallo zusammen,

ich habe die Möglichkeiten des Attr userExitFn überarbeitet. Es ist nun möglich eigenen Code direkt im Attr zu hinterlegen.
Die Version liegt zunächst in meinem contrib zum Testen.

Zum Download in der FHEMWEB Kommandozeile inklusive der Ausführungszeichen angeben und danach FHEM restarten:


"wget -qO ./FHEM/93_DbRep.pm https://svn.fhem.de/fhem/trunk/fhem/contrib/DS_Starter/93_DbRep.pm"



Grüße,
Heiko

-------------------------------------------------------------------------------

userExitFn - stellt eine Schnittstelle zur Ausführung eigenen Usercodes zur Verfügung.
Grundsätzlich arbeitet die Schnittstelle ohne Eventgenerierung bzw. benötigt zur Funktion keinen Event. Die Schnittstelle kann mit folgenden Varianten verwendet werden.

    1. Aufruf einer Subroutine, z.B. in 99_myUtils.pm

    Die aufzurufende Subroutine wird in 99_myUtils.pm nach folgendem Muster erstellt:

    sub UserFunction {
      my $name    = shift;             # der Name des DbRep-Devices
      my $reading = shift;             # der Namen des erstellen Readings
      my $value   = shift;             # der Wert des Readings
      my $hash    = $defs{$name};
      ...
      # z.B. übergebene Daten loggen
      Log3 $name, 1, "UserExitFn $name called - transfer parameter are Reading: $reading, Value: $value " ;
      ...
    return;
    }

    Im im Attribut wird die Subroutine und optional ein Reading:Value Regex als Argument angegeben werden. Ohne diese Angabe werden alle Wertekombinationen als "wahr" gewertet und an die Subroutine übergeben (entspricht .*:.*).

        Beispiel:
        attr userExitFn UserFunction .*:.*
        # "UserFunction" ist die Subroutine in 99_myUtils.pm.
    Die Regexprüfung nach der Erstellung jedes Readings. Ist die Prüfung wahr, wird die angegebene Funktion aufgerufen.

    2. direkte Einngabe von eigenem Code

    Der eigene Code wird in geschweifte Klammern eingeschlossen. Der Aufruf des Codes erfolgt nach der Erstellung jedes Readings. Im Code stehen folgende Variablen für eine Auswertung zur Verfügung:

        $NAME - der Name des DbRep-Devices
        $READING - der Namen des erstellen Readings
        $VALUE - der Wert des Readings


        Beispiel:

        {
          if ($READING =~ /PrEnergySumHwc1_0_value__DIFF/) {
            my $mpk  = AttrVal($NAME, 'Multiplikator', '0');
            my $tarf = AttrVal($NAME, 'Tarif', '0');                                   # Kosten €/kWh           
            my $m3   = sprintf "%.3f", $VALUE/10000 * $mpk;                            # verbrauchte m3
            my $kwh  = sprintf "%.3f", $m3 * AttrVal($NAME, 'Brennwert_kWh/m3', '0');  # Umrechnung m3 -> kWh
            my $cost = sprintf "%.2f", $kwh * $tarf;
           
            my $hash = $defs{$NAME};
           
            readingsBulkUpdate ($hash, 'gas_consumption_m3',   $m3);
            readingsBulkUpdate ($hash, 'gas_consumption_kwh', $kwh);
            readingsBulkUpdate ($hash, 'gas_costs_euro',     $cost);
          }   
        }

        # Es werden die Readings gas_consumption_m3, gas_consumption_kwh und gas_costs_euro berechnet und im DbRep-Device erzeugt.

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 Ralf, @all,

ich habe mich mal deiner Meldung in #1513 zugewendet und die reduceLog Funktion überarbeitet.
Einen wesentlichen Fehler mit average=day konnte ich beseitigen.
Offen ist noch, dass bei average die letzte Stunde nicht auf den Halbstundenwert reduziert wird und bei average=day der letzte
Tag nicht auf den 12:00 Wert reduziert wird. Aber da bin ich dran.

Die Version liegt im contrib, download siehe eine Meldung zuvor.

@sailor, die gefixte Version dürfte für deine Aufgabenstellung wichtig 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

DS_Starter

Zitat
Offen ist noch, dass bei average die letzte Stunde nicht auf den Halbstundenwert reduziert wird und bei average=day der letzte
Tag nicht auf den 12:00 Wert reduziert wird. Aber da bin ich dran.

Ist nun auch erledigt und die Version ins contrib geladen.

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

Sailor

Hallo Heiko

Zitat von: DS_Starter am 03 Dezember 2021, 22:31:10
Mit dem Befehl "set ... reduceLog average=day"  werden die Daten älter als 180 Tage auf einen Tagesmittelwert reduziert.
Wenn du das optionale timeDiffToNow ebenfalls setzt, werden Daten älter als 180 und nicht älter als 365 Tage bearbeitet.
Sollen Device/Readings ausgeklammert werden, ergänzt du den Befehl mit "EXCLUDE=device1:reading1,device2:reading2,...".

Frage: Mit dem Befehl - Zusatz EXCLUDE und INCLUDE
kann ich davon ausgehen, dass bei folgendem Befehl


EXCLUDE=Device:Reading1, Device:Reading2 INCLUDE=Device:.*


Alle Readings des Device gemittelt bzw. gelöscht werden, bis auf die unter EXCLUDE aufgeführt?

Gruss
   Sailor
******************************
Man wird immer besser...

DS_Starter

#1538
Nabend Sailor,

naja nicht ganz. Momentan zieht immer die ganz hinten stehende Option, also entweder das INCLUDE oder das EXCLUDE.
Das beide Optionen ziehen, daran arbeite ich noch.

Aber wenn du die Attribute mit verwendest, kannst du es umsetzen. Du setzt:


attr ... device Device


und rufst dann auf


set ... reduceLog average=day EXCLUDE=Device:Reading1,Device:Reading2


Dadurch werden im select alle Datensätze mit "DEVICE" aus der DB innerhalb der Zeitgrenzen gelesen.
In der nachfolgenden Verarbeitung werden wiederum die im EXCLUDE angegebenen Kombinationen ausgeschlossen.

Achtung: innerhalb des EXCLUDE keine Leerzeichen verwenden. Außerdem kann man dort keine Wildcards angeben. in den device/reading Attributen schon.

Es geht auch nur die Attr zu verwenden:


attr ... device Device
attr ... reading EXCLUDE=Reading1,Reading2


Dann führst du nur aus:


set ... reduceLog average=day


LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

#1539
Nun werden auch direkt bei der Kommandozeilenangabe von reduceLog gleichzeitig angegebene EXCLUDE / INCLUDE Optionen berücksichtigt:

Beispiel:

    set <name> reduceLog 174:180 average EXCLUDE=SMA_Energymeter:Bezug_Wirkleistung INCLUDE=SMA_Energymeter:%
    # Datensätze älter als 174 und jünger als 180 Tage werden auf den Durchschnitt pro Stunde reduziert.
    # Es werden alle Readings vom Device "SMA_Energymeter" außer "Bezug_Wirkleistung" berücksichtigt. reduziert. 

So ist der Aufruf ebenfalls möglich um alle Device/Reading Kombinationen außer SMA_Energymeter:Bezug_Wirkleistung und DumDev:Energy zu bearbeiten:


set <name> reduceLog 174:180 average EXCLUDE=SMA_Energymeter:Bezug_Wirkleistung,DumDev:Energy INCLUDE=%:%


Liegt 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 07 Dezember 2021, 00:14:25
Nun werden auch direkt bei der Kommandozeilenangabe von reduceLog gleichzeitig angegebene EXCLUDE / INCLUDE Optionen berücksichtigt:
So ist der Aufruf ebenfalls möglich um alle Device/Reading Kombinationen außer SMA_Energymeter:Bezug_Wirkleistung und DumDev:Energy zu bearbeiten:

set <name> reduceLog 174:180 average EXCLUDE=SMA_Energymeter:Bezug_Wirkleistung,DumDev:Energy INCLUDE=%:%


Danke fuer deinen Einsatz.

Verstehe ich das richtig, das "%" ersetzt das ".*" an beliebiger Stelle?
BR_RadiatorL
BR_RadiatorR
GR_Radiator
KT_Radiator
TR_RadiatorL
TR_RadiatorR
CR_Radiator

werden mit
EXCLUDE=%_Radiato%:%
abgefangen?

Gruß
    Sailor
******************************
Man wird immer besser...

ch.eick

Zitat von: Sailor am 07 Dezember 2021, 12:22:27
Verstehe ich das richtig, das "%" ersetzt das ".*" an beliebiger Stelle?
BR_RadiatorL
BR_RadiatorR
GR_Radiator
KT_Radiator
TR_RadiatorL
TR_RadiatorR
CR_Radiator

werden mit
EXCLUDE=%_Radiato%:%
abgefangen?
Hallo Sailer,

ja, das % ist für ein beliebiges Zeichen bei der SQL Abfrage in einer Datenbank.

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

Sailor

Hallo Christian

Zitat von: ch.eick am 07 Dezember 2021, 12:31:38
ja, das % ist für ein beliebiges Zeichen bei der SQL Abfrage in einer Datenbank.

Das war das Stichwort!

http://www.w3bai.com/de/sql/sql_wildcards.html

Danke
   Gruß
      Sailor
******************************
Man wird immer besser...

DS_Starter

Ich ergänze es mal noch in der Hilfe. Die Verwendung von "%" ist nicht an jeder Stelle in DbRep gleichermaßen gültig und kommt auf den Kontext der jweiligen Funktion an.
Aber hier in reduceLog konnte ich es so bauen.
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

Habe die Hilfe ergänzt. Liegt im contrib:

Arbeitsweise mit Optionsangabe

....

Die Zusätze "EXCLUDE" bzw. "INCLUDE" können ergänzt werden um device/reading Kombinationen in reduceLog auszuschließen bzw. einzuschließen und überschreiben die Einstellung der Attribute "device" und "reading", die in diesem Fall nicht beachtet werden.
Diese Angabe in "EXCLUDE" wird als Regex ausgewertet. Innerhalb von "INCLUDE" können SQL-Wildcards verwendet werden (weitere Informationen zu SQL-Wildcards siehe mit get <name> versionNotes 6).
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