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

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

Vorheriges Thema - Nächstes Thema

ch.eick

Zitat von: DS_Starter am 02 Januar 2023, 12:41:11
Funktioniert  8)
Ich denke, wir sind ein tolles team ;-)
Frohes neues Jahr Euch allen.

EDIT: Das klappt noch nicht, da es asyncron ist :-( und somit das vorherige Ergebnis geholt wird.
   Eventuell könnte da noch jemand helfen.

Und hir noch eine Integration ins DbRep Device, wodurch das formatierte SQL Kommando als userReading "SQL_Format" im DbRep Device erscheint.

attr LogDBRep_Statistic_previous_Year userReadings SQL_Format:sqlCmd.* { CommandSet(undef, "SQL_Format 01_SQL_Format ".ReadingsVal('$NAME','sqlCmd','null')); ReadingsVal('SQL_Format','result','null')}


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

DS_Starter

Zitat
EDIT: Das klappt noch nicht, da es asyncron ist :-( und somit das vorherige Ergebnis geholt wird.
   Eventuell könnte da noch jemand helfen.

userExitFn benutzen:

{
  if ($READING eq "sqlCmd") {
      CommandSet(undef, "SQL_Format 01_SQL_Format ".ReadingsVal($NAME, $READING, 'null'));
      my $ret  = ReadingsVal('SQL_Format', 'result', 'null');
      my $hash = $defs{$NAME};
      readingsBulkUpdate ($hash, 'SQL_Format', $ret);
  }
}
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 02 Januar 2023, 14:15:31
userExitFn benutzen:

{
  if ($READING eq "sqlCmd") {
      CommandSet(undef, "SQL_Format 01_SQL_Format ".ReadingsVal($NAME, $READING, 'null'));
      my $ret  = ReadingsVal('SQL_Format', 'result', 'null');
      my $hash = $defs{$NAME};
      readingsBulkUpdate ($hash, 'SQL_Format', $ret);
  }
}


Da das SQL_Format ja auch von mehreren DbRep aufgerufen werden kann habe ich mir überlegt, dass man mehrere HTTPMOD set einbauen könnte.
Mit diesem userReadings würde das Formatieren gestartet

attr LogDBRep_Statistic_previous_Year userReadings SQL_Format:sqlCmd.* { CommandSet(undef, "SQL_Format ".$NAME." ".ReadingsVal("$NAME","sqlCmd","null"));"waiting on SQL_Format"}


Und im SQL_Format sähe es dann so aus

defmod SQL_Format HTTPMOD none 0
attr SQL_Format DbLogExclude .*
attr SQL_Format comment Version 2023.01.02 14:00
attr SQL_Format enableCookies 1
attr SQL_Format room System
attr SQL_Format set01Data reindent=1&sql=$val
attr SQL_Format set01ExtractAllJSON 1
attr SQL_Format set01Method POST
attr SQL_Format set01Name LogDBRep_Statistic_previous_Year
attr SQL_Format set01OExpr CommandSetReading(undef, "LogDBRep_Statistic_previous_Year SQL_Format ".$val);;$val
attr SQL_Format set01ParseResponse 1
attr SQL_Format set01TextArg 1
attr SQL_Format set01URL https://sqlformat.org/api/v1/format
attr SQL_Format showBody 0
attr SQL_Format showError 1
attr SQL_Format verbose 0

Durch das set01OExpr wird das Formatierte Ergebnis zurück ins entsprechende aufrufende Device geschrieben.
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,

ich habe eine V ins contrib gestellt welche die Online Formatierung der SQL's automatisch intern macht.
Das klappt gut, aber noch nicht für mehrere SQLs in einem Satz, z.B.
                       SET \@diff=0;
                       SET \@delta=NULL;
                       SELECT t1.TIM....


Da bin ich noch dran. Wenn das alles klappt, führe ich noch ein Attr ein damit man die Online Formatierung einschalten kann wenn man es möchte.

Kannst du mal testen.
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

Jetzt klappt die Online Formatierung auch mit komplexen, zusammengesetzten Statements.
Liegt in contrib zum Test.
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 03 Januar 2023, 10:55:04
Jetzt klappt die Online Formatierung auch mit komplexen, zusammengesetzten Statements.
Liegt in contrib zum Test.
Hallo Heiko,

die set Statements hatten wir doch ins

sqlCmdVars SET @days:=7, @corr:=0.7, @diff:=0, @temp:=0, @device:='WR_1', @reading1:='SW_Total_DC_P_sumOfAllPVInputs', @reading2:='Solar_Calculation_fc0', @readingname:='Solar_Correction_Faktor_auto' ;

gepackt. Ich war bisher immer davon ausgegangen, dass man ein SQL Statement ins sqlCmd packen kann.
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

#1761
Zitat
Ich war bisher immer davon ausgegangen, dass man ein SQL Stement ins sqlCmd packen kann.
Ja, ist auch richtig so bzw. du hast recht.

Aber soetwas geht schon über sqlCmd:


SET @diff=0;
SET @delta=NULL;
SELECT t1.TIMESTAMP,
       t1.READING,
       t1.VALUE,
       t1.DIFF,
       t1.TIME_DELTA
FROM
  (SELECT TIMESTAMP,READING,
                    VALUE,
                    cast((VALUE-@diff) AS DECIMAL(12, 4)) AS DIFF, @diff:=VALUE AS curr_V, TIMESTAMPDIFF(MINUTE, @delta,TIMESTAMP) AS TIME_DELTA, @delta:=TIMESTAMP AS curr_T
   FROM history
   WHERE §device§
     AND §reading§
     AND TIMESTAMP >= §timestamp_begin§
     AND TIMESTAMP <= §timestamp_end§
   ORDER BY TIMESTAMP) t1;


Meine Antwort "Jetzt klappt die Online Formatierung auch mit komplexen, zusammengesetzten Statements." bezog sich lediglich auf die Online Formatierung mit dem Formatter-Dienst.
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 03 Januar 2023, 10:55:04
Jetzt klappt die Online Formatierung auch mit komplexen, zusammengesetzten Statements.
Liegt in contrib zum Test.
Da habe ich Dich jetzt aber ganz schön angeschoben :-) :-) Ist schon schön, wenn es lesbarer wird.
Hast Du es dann jetzt intern direkt bevor das Statement wieder ins sqlCmd geschrieben wird formatiert?

Ich bin noch nicht zum Testen gekommen.
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

Zitat von: DS_Starter am 03 Januar 2023, 11:12:53
Ja, ist auch richtig so bzw. du hast recht.

Aber soetwas geht schon über sqlCmd:

< snip >

Meine Antwort "Jetzt klappt die Online Formatierung auch mit komplexen, zusammengesetzten Statements." bezog sich lediglich auf die Online Formatierung mit dem Formatter-Dienst.
Da gibt es wohl auch noch eine split Funktion, ich hatte mir nur den quick win angeschaut und war sehr begeistert.
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
Hast Du es dann jetzt intern direkt bevor das Statement wieder ins sqlCmd geschrieben wird formatiert?
Ja, im Prinzip. Intern passiert im Detail ein bisschen mehr. Betrifft auch sqlCmdHistory und sqlSpecial.
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
Da gibt es wohl auch noch eine split Funktion
Gibt es, aber die nehme ich nicht. Die bringt keine so schöne Formatierung zurück wie "format".
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

Übrigens scheint das mit den "set @variable" in zukünftigen Oracle MySQL Versionen irgend wann raus genommen zu werden.
Das scheint dann so gelöst zu werden

SELECT concat(x1.DATE, " ", LPAD(x1.HOUR, 2, 0), ":00:00") AS TIMESTAMP,
                  x1.DATE,
                  x1.HOUR AS HOUR,
              h.READING,
                  h.VALUE,
      @diff:=0,@delta:=NULL                     <<<< also als zusätzliche Spalte in einer Tabelle
           FROM history h
< snip >
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

Das Attr sqlFormatService ist nun eingefügt um den Formatdienst aktivieren zu können.
-> 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

alkazaa

Moin, und ein nachträgliches Happy New Year.

Es ist ja toll, was hier alles an SQL-Feuerwerk abgebrannt wird. Obwohl ich selbst lieber mit dem Syntax-highlighting von notepad++ arbeite und zu FHEM mit CTRL-C und -V hin- und her springe.
Ich habe aber noch ein anderes Problem: Da ich keine Ahnung habe, wie ich auf das Resultat des nonBlocking sqlCmd in einem externen Modul (konkret: 99_fronthemUtils.pm) zugreifen kann, benutze ich sqlCmdBlocking.
Und das kann nur Queries mit einem ";"
Das geht also z.B.: SET @a=1, @b=2; SELECT * FROM current
Und das geht nicht: "SET @a=1; SET @b=2; SELECT * FROM current"
In sqlCmd geht beides

Gruß
Franz

ch.eick

Hallo Franz
Zitat von: alkazaa am 03 Januar 2023, 16:14:47
Moin, und ein nachträgliches Happy New Year.

Es ist ja toll, was hier alles an SQL-Feuerwerk abgebrannt wird. Obwohl ich selbst lieber mit dem Syntax-highlighting von notepad++ arbeite und zu FHEM mit CTRL-C und -V hin- und her springe.
Ich habe aber noch ein anderes Problem: Da ich keine Ahnung habe, wie ich auf das Resultat des nonBlocking sqlCmd in einem externen Modul (konkret: 99_fronthemUtils.pm) zugreifen kann, benutze ich sqlCmdBlocking.
Und das kann nur Queries mit einem ";"
Das geht also z.B.: SET @a=1, @b=2; SELECT * FROM current
Und das geht nicht: "SET @a=1; SET @b=2; SELECT * FROM current"
In sqlCmd geht beides
Das machen wir eigentlich genau so, wenn man aber mal einen Überblich im DbRep haben möchte ist das SQL Statement halt schlecht zu lesen.

Eigentlich sollte es aber wie hier angesprochen funktionieren. Ich habe gerne die Variablen separat im Device.
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