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

#1725
Zitat von: DS_Starter am 08 Dezember 2022, 12:58:28
Deine SQLs sind immer eine Freude .... wie Weihnachten.  :D

Mache doch einen Eintrag im DbRep Wiki. Ich habe eine Abschnitt für hilfreiche SQL angefangen.
Dann geht das Know How nicht verloren und wer Anregungen sucht ....
Ach Du schmeichelst mir jetzt aber wieder :-) :-)
Ich schau mal, ob ich es noch generischer hin bekomme und setze es dann rein.

EDIT: Ich habe es jetzt auch hier im Wiki abgelegt: Wieviel PV-Leistung wird von einem Starkverbraucher verwendet (MySQL)
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

#1726
Ich hätte da auch noch eine Auswertung für Wechselrichter mit den Jahres Statistiken, oder sogar Quartals Statistiken, das wäre aber sehr speziel und das SELECT geht über 284 Zeilen :-)

Das ist auch der Grund, warum ich beim DbRep nach einer Formatierten Speicherung des sqlCmd gefragt hatte.

Hier mal ein List vom Jahres Report, der noch ziemlich kurz ist.

Internals:
   DATABASE   fhem
   DEF        LogDB
   FUUID      614b0a08-f33f-61a8-f1e8-10ef59dfe90ba545
   FVERSION   93_DbRep.pm:v8.49.0-s26054/2022-05-17
   LASTCMD    initial database connect stopped due to attribute 'fastStart'
   MODEL      Client
   NAME       LogDBRep_Statistic_previous_Year
   NOTIFYDEV  global,LogDBRep_Statistic_previous_Year
   NR         424
   NTFY_ORDER 50-LogDBRep_Statistic_previous_Year
   ROLE       Client
   STATE      initialized
   TYPE       DbRep
   UTF8       1
   HELPER:
     DBLOGDEVICE LogDB
     IDRETRIES  3
     PACKAGE    main
     VERSION    8.49.0
   READINGS:
     2021-12-31 23:57:03   SW_Statistic_Autarky_Year 68
     2021-12-31 23:57:03   SW_Statistic_EnergyHomeFeedInGrid_Year 11294
     2021-12-31 23:57:03   SW_Statistic_EnergyHomeGrid_Year 2616
     2021-12-31 23:57:03   SW_Statistic_EnergyHomePvSum_Year 5598
     2021-12-31 23:57:03   SW_Statistic_EnergyHomePv_Year 4171
     2021-12-31 23:57:03   SW_Statistic_EnergyHome_Year 8214
     2021-12-31 23:57:03   SW_Statistic_OwnConsumptionRate_Year 33
     2021-12-31 23:57:03   SW_Statistic_TotalConsumption_Year 8214
     2021-12-31 23:57:03   SW_Statistic_Yield_Year 16892
     2022-01-11 15:19:26   SqlResultRow_01 TIMESTAMP|READING|VALUE
     2022-01-11 15:19:26   SqlResultRow_02 2021-12-31 23:57:03|Statistic_EnergyHomeBat_Year|1427
     2022-01-11 15:19:26   SqlResultRow_03 2021-12-31 23:57:03|SW_Statistic_Autarky_Year|68
     2022-01-11 15:19:26   SqlResultRow_04 2021-12-31 23:57:03|SW_Statistic_EnergyHome_Year|8214
     2022-01-11 15:19:26   SqlResultRow_05 2021-12-31 23:57:03|SW_Statistic_EnergyHomeFeedInGrid_Year|11294
     2022-01-11 15:19:26   SqlResultRow_06 2021-12-31 23:57:03|SW_Statistic_EnergyHomeGrid_Year|2616
     2022-01-11 15:19:26   SqlResultRow_07 2021-12-31 23:57:03|SW_Statistic_EnergyHomePv_Year|4171
     2022-01-11 15:19:26   SqlResultRow_08 2021-12-31 23:57:03|SW_Statistic_EnergyHomePvSum_Year|5598
     2022-01-11 15:19:26   SqlResultRow_09 2021-12-31 23:57:03|SW_Statistic_OwnConsumptionRate_Year|33
     2022-01-11 15:19:26   SqlResultRow_10 2021-12-31 23:57:03|SW_Statistic_TotalConsumption_Year|8214
     2022-01-11 15:19:26   SqlResultRow_11 2021-12-31 23:57:03|SW_Statistic_Yield_Year|16892
     2022-01-11 15:19:26   SqlResultRow_12 2021-12-29 14:35:50|lp_1_kWhCounter_Year|466
     2021-12-31 23:57:03   Statistic_EnergyHomeBat_Year 1427
     2021-12-29 14:35:50   lp_1_kWhCounter_Year 466
     2022-01-11 15:19:26   sqlCmd          SELECT * FROM ( SELECT h.TIMESTAMP, h.READING, IF (h.READING LIKE '%Rate%' OR h.READING LIKE '%Autarky%',h.VALUE ,cast(h.VALUE/1000 AS decimal(6)) ) AS VALUE FROM history h INNER JOIN ( SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history WHERE §device§ AND §reading§ AND TIMESTAMP > STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'-12-31'),'%Y-%m-%d') AND TIMESTAMP < STR_TO_DATE(CONCAT(YEAR(CURDATE()) ,'-01-01'),'%Y-%m-%d') GROUP BY READING ) x1 ON h.TIMESTAMP = x1.TIMESTAMP AND h.READING = x1.READING ) x2 UNION ALL SELECT h.TIMESTAMP, h.READING, h.VALUE FROM history h INNER JOIN ( SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history WHERE DEVICE = 'WB_1' AND READING LIKE 'lp_%_kWhCounter_Year' AND TIMESTAMP > STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'-12-01'),'%Y-%m-%d') AND TIMESTAMP < STR_TO_DATE(CONCAT(YEAR(CURDATE()) ,'-01-01'),'%Y-%m-%d') GROUP BY READING ) x2 ON h.TIMESTAMP = x2.TIMESTAMP AND h.READING = x2.READING ;
     2022-01-11 15:19:26   sqlResultNumRows 11
     2022-11-06 17:27:08   state           initialized
Attributes:
   DbLogExclude .*
   allowDeletion 0
   comment    Version 2022.01.11 11:00
   device     WR_1_API
   reading    SW_Statistic%_Year,Statistic_EnergyHomeBat_Year EXCLUDE=%NoBat%,%EnergyPv%
   room       System
   userExitFn splitReading .*:.*
   verbose    0

Mit dem splitReading erzeuge ich die formatierten reading Namen, die ich dann in einem DOIF uitable im Perl Modus als Statistik Tabelle anzeige.
Das sieht dann so aus wie im Anhang.
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

Na ich kenne dich ja schon ein bisschen ... ;)

Auch das wäre sicher eine hilfreiche Anregung für Nachnutzer.
Da bietet sich an eine extra Wiki Seite zu erstellen und im DbRep Abschnitt für die SQLs einen Link dorthin zu setzen.
Wieder etwas Mehrwert für DB User ...
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

#1728
Zitat von: DS_Starter am 08 Dezember 2022, 13:33:25
Na ich kenne dich ja schon ein bisschen ... ;)

Auch das wäre sicher eine hilfreiche Anregung für Nachnutzer.
Da bietet sich an eine extra Wiki Seite zu erstellen und im DbRep Abschnitt für die SQLs einen Link dorthin zu setzen.
Wieder etwas Mehrwert für DB User ...
Na da haste mal wieder schön die formatierte Anzeige von sqlCmd umdribbelt :-) :-)
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

#1729
Hallo nochmal,

ich habe hier etwas für das Formatieren von SQL Statements gefunden, das sogar eine API hat :-)

Online
github
Und hier könnte etwas offline für Perl sein ;-)

Hier mal ein Beispiel mit einer meiner Zauber SQLs
Input für die Web Page

SELECT X.HOUR, cast(X.generator_P AS decimal(7,2)) AS generator_P, cast(X.Home_Consumption AS decimal(7,2)) AS Home_Consumption, cast(X.PV_after_Home_Consumtion AS decimal(7,2)) AS PV_after_Home_Consumtion, cast(X.consumer_P AS decimal(7,2)) AS consumer_P, if(consumer_P+PV_after_Home_Consumtion <= 0,cast(round(abs(consumer_P+PV_after_Home_Consumtion),2) AS decimal(7,2)),0) AS from_Grid, if(round(consumer_P+PV_after_Home_Consumtion,2) <= 0,round(abs(PV_after_Home_Consumtion*100/consumer_P),0),100) AS Percent FROM ( SELECT X1.HOUR, generator_P, round(Home_Consumtion_P+consumer_P,2) AS Home_Consumption, if(Home_Consumtion_P+consumer_P-generator_P < 0,round(abs(Home_Consumtion_P+consumer_P-generator_P),2),0) AS PV_after_Home_Consumtion, consumer_P FROM ( SELECT hour(TIMESTAMP) AS HOUR, round(avg(value),2) AS consumer_P FROM history WHERE TIMESTAMP > §timestamp_begin§ and TIMESTAMP < DATE_ADD(§timestamp_begin§,INTERVAL 1 DAY) AND §device§ AND §reading§ GROUP BY 1 ) X1 JOIN ( SELECT hour(TIMESTAMP) AS HOUR, round(avg(value),2) AS generator_P FROM history WHERE TIMESTAMP > §timestamp_begin§ AND TIMESTAMP < DATE_ADD(§timestamp_begin§,INTERVAL 1 DAY) AND DEVICE = @generator AND READING = @generator_P AND VALUE > 10 GROUP BY 1 ) X2 JOIN ( SELECT hour(TIMESTAMP) AS HOUR, round(avg(value),2) AS Home_Consumtion_P FROM history WHERE TIMESTAMP > §timestamp_begin§ and TIMESTAMP < DATE_ADD(§timestamp_begin§,INTERVAL 1 DAY) AND DEVICE = @generator AND READING = @Home_Consumtion_P AND VALUE > 10 GROUP BY 1 ) X3 ON X1.HOUR = X2.HOUR AND X1.HOUR = X3.HOUR ) X;

Und so sieht es dann hinterher wieder aus

SELECT X.HOUR,
       cast(X.generator_P AS decimal(7, 2)) AS generator_P,
       cast(X.Home_Consumption AS decimal(7, 2)) AS Home_Consumption,
       cast(X.PV_after_Home_Consumtion AS decimal(7, 2)) AS PV_after_Home_Consumtion,
       cast(X.consumer_P AS decimal(7, 2)) AS consumer_P,
       if(consumer_P+PV_after_Home_Consumtion <= 0, cast(round(abs(consumer_P+PV_after_Home_Consumtion), 2) AS decimal(7, 2)), 0) AS from_Grid,
       if(round(consumer_P+PV_after_Home_Consumtion, 2) <= 0, round(abs(PV_after_Home_Consumtion*100/consumer_P), 0), 100) AS Percent
FROM
  (SELECT X1.HOUR,
          generator_P,
          round(Home_Consumtion_P+consumer_P, 2) AS Home_Consumption,
          if(Home_Consumtion_P+consumer_P-generator_P < 0, round(abs(Home_Consumtion_P+consumer_P-generator_P), 2), 0) AS PV_after_Home_Consumtion,
          consumer_P
   FROM
     (SELECT hour(TIMESTAMP) AS HOUR,
             round(avg(value), 2) AS consumer_P
      FROM history
      WHERE TIMESTAMP > §timestamp_begin§
        AND TIMESTAMP < DATE_ADD(§timestamp_begin§,INTERVAL 1 DAY)
        AND §device§
        AND §reading§
      GROUP BY 1) X1
   JOIN
     (SELECT hour(TIMESTAMP) AS HOUR,
             round(avg(value), 2) AS generator_P
      FROM history
      WHERE TIMESTAMP > §timestamp_begin§
        AND TIMESTAMP < DATE_ADD(§timestamp_begin§,INTERVAL 1 DAY)
        AND DEVICE = @generator
        AND READING = @generator_P
        AND VALUE > 10
      GROUP BY 1) X2
   JOIN
     (SELECT hour(TIMESTAMP) AS HOUR,
             round(avg(value), 2) AS Home_Consumtion_P
      FROM history
      WHERE TIMESTAMP > §timestamp_begin§
        AND TIMESTAMP < DATE_ADD(§timestamp_begin§,INTERVAL 1 DAY)
        AND DEVICE = @generator
        AND READING = @Home_Consumtion_P
        AND VALUE > 10
      GROUP BY 1) X3 ON X1.HOUR = X2.HOUR
   AND X1.HOUR = X3.HOUR) X;

Hierbei wurden sogar die DbRep Variablen sehr schön akzeptiert und das ganze nicht als Syntaxerror beendet.

Ich versuche das mal mit HTTPMOD ins FHEM einzubinden.
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

Ich habe dann auch mal das SELECT für die Verwendung der PV-Leistung ans DbRep Device angepasst.
Hier mal das RAW

defmod LogDBRep_Statistic_Heating_PV_usage DbRep LogDB
attr LogDBRep_Statistic_Heating_PV_usage DbLogExclude .*
attr LogDBRep_Statistic_Heating_PV_usage allowDeletion 0
attr LogDBRep_Statistic_Heating_PV_usage comment Version 2022.12.10 12:00
attr LogDBRep_Statistic_Heating_PV_usage device StromZaehler_Heizung
attr LogDBRep_Statistic_Heating_PV_usage reading SMAEM1901401955_Saldo_Wirkleistung
attr LogDBRep_Statistic_Heating_PV_usage room System
attr LogDBRep_Statistic_Heating_PV_usage sqlCmdVars SET @generator:='WR_1', @generator_P:='SW_Total_AC_Active_P', @Home_Consumtion_P:='SW_Home_own_consumption';;
attr LogDBRep_Statistic_Heating_PV_usage timestamp_begin current_day_begin
attr LogDBRep_Statistic_Heating_PV_usage verbose 0


Das sqlCmd entspricht dem vorherigen Post ;-)
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

RobertSch

#1731
Hallo Zusammen!

Ich habe ein Problem mit meinem fhem. Ich kann aus welchem Grund auch immer das DbRep-Modul nicht hinzufügen.

Cannot load module DbRep

wird ausgegeben, nachdem ich mit

define DBLogging_DbRep DbRep DBLogging

versucht habe dies hinzu zu fügen.

Ein Blick ins Log ergab dann folgendes:

2022.12.14 08:11:38 0: Time::HiRes::ualarm(): unimplemented in this platform at ./FHEM/93_DbRep.pm line 45.
BEGIN failed--compilation aborted at ./FHEM/93_DbRep.pm line 45.


Woran liegt das? Wenn ich die Meldung richtig deute, dann ist es irgendwas mit Time Modul von Perl?

Ich nutze fhem unter Windows auf einer VM. Liegt es an Windows?

Ich bin mit meinem Latein am Ende und würde gerne weiter kommen. Kann mir jemand helfen?

Vielen lieben Dank im Voraus!

LG
Robert


EDIT: Log Ausschnitt mit "verbose 5" Einstellung:
2022.12.14 08:21:13 4: WEB_127.0.0.1_54382 POST /fhem&fw_id=885&room=Server&fwcsrf=csrf_476589676604730&cmd=define+DBLogging_DbRep+DbRep+DBLogging; BUFLEN:0
2022.12.14 08:21:13 5: Cmd: >define DBLogging_DbRep DbRep DBLogging<
2022.12.14 08:21:13 5: Loading ./FHEM/93_DbRep.pm
2022.12.14 08:21:13 1: reload: Error:Modul 93_DbRep deactivated:
Time::HiRes::ualarm(): unimplemented in this platform at ./FHEM/93_DbRep.pm line 45.
BEGIN failed--compilation aborted at ./FHEM/93_DbRep.pm line 45.

2022.12.14 08:21:13 0: Time::HiRes::ualarm(): unimplemented in this platform at ./FHEM/93_DbRep.pm line 45.
BEGIN failed--compilation aborted at ./FHEM/93_DbRep.pm line 45.

2022.12.14 08:21:13 4: WEB: /fhem&fw_id=885&room=Server&fwcsrf=csrf_476589676604730&cmd=define+DBLogging_DbRep+DbRep+DBLogging / RL:1721 / text/html; charset=UTF-8 / Content-Encoding: gzip

/ Cache-Control: no-cache, no-store, must-revalidate

DS_Starter

Guten Morgen Robert,

Du hast recht, es liegt am Time Modul bzw. eher daran dass du Windows benutzt. Ich habe dazu gefunden:


....
The fact that ualarm() isn't supported has nothing to do with the precision
but more with the fact that alarm() doesn't really work on Windows.  It
doesn't interrupt C code or system calls but waits until Perl polls
a messageloop to see if a timer has expired.


Das ist jetzt kein Beinbruch. Ich brauche ualarm nicht (mehr) und habe es aus dem Modul rausgenommen.
Ich checke es noch ein, aber du kannst es schon aus meinem contrib (Fußtext) laden und FHEM restarten.
Dann sollte es klappen.

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

RobertSch

Hallo Heiko!

Danke für die schnelle Problemlösung. Ich konnte das DbRep Modul nun anlegen.

LG
Robert

ch.eick

#1734
Hallo Heiko,
konnte man jetzt eigentlich in einem DbRep Aufruf mehrere SQL Kommandos zusammen absetzen?
z.B. ein INSERT und anschließend noch mehrere UPDATE
Falls es nicht gehen würde, wie könnte man das dann anderweitig lösen?

EDIT: Es scheint nicht zu gehen.
  Mir schwebt da eine Art RAW Modus vor, bei dem einfach alles durchgereicht wird, wie so eine Art SQL Script :-)

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

#1735
Hallo Christian,

das "Problem" bei solchen Batchverarbeitungen ist, dass das Modul keine Ahnung hat was denn nun eigentlich das Ergebnis ist woraus Readings gebildet werden sollen. Die Rückgabe des Selects, bei mehreren ... welches Select ? oder vllt. doch nur die Anzahl der upgedateteten Datensätze oder was sonst ?

Deswegen ist so etwas nicht umgesetzt.

Man könnte versuchen ein Splitting über die keywords select, update, etc. vorzunehmen und die entstandenen SQL's der Reihe nach abzuarbeiten. Ohne Ergebnisse oder Readings zurückzugeben.

Das wäre eine neue Implementierung die es noch nicht gibt.

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

#1736
Hallo Heiko,
danke für die Geduld mit mir ;-)
Zitat von: DS_Starter am 20 Dezember 2022, 20:21:16
das "Problem" bei solchen Batchverarbeitungen ist, dass das Modul keine Ahnung hat was denn nun eigentlich das Ergebnis ist woraus Readings gebildet werden sollen. Die Rückgabe des Selects, bei mehreren ... welches Select ? oder vllt. doch nur die Anzahl der upgedateteten Datensätze oder was sonst ?
Okay, das kann ich verstehen :-(
Ich denke jetzt mal ins unreine:
- Wer soetwas macht, der sollte sich bewust sein, dass es um komplexere Datenbank Veränderungen geht
- Ich hätte jetzt gar nicht damit gerechnet eine Auswertung der vielen SQL Statements zu bekommen
- Dabei sollte maximal am Ende eventuell ein SELECT als finaler Status ausgewertet werden,
  was als Einschränkung im Wiki, mit einem Beispiel, dokumentiert werden sollte.

- Es sollte ein Attribut zur Aktivierung vorhanden sein
- Dadurch wird die Eingabe von "sqlCmd" ohne Prüfung in einer Session an die Datenbank gesendet.
  Okay, wenn Deine §device§ und §reading§ ersetzt werden wäre das ein Zugewinn :-)
- Die Rückmeldung der Datenbank könnte in einem reading erscheinen, ähnlich wie es beim HTTPMOD mit dem httpbody geschieht
- Über userExitFn könnte dann jeder selber die Rückmeldung verifizieren und eventuell mit regex nach Fehlern suchen
Zitat
Deswegen ist so etwas nicht umgesetzt.

Man könnte versuchen ein Splitting über die keywords select, update, etc. vorzunehmen und die entstandenen SQL's der Reihe nach abzuarbeiten. Ohne Ergebnisse oder Readings zurückzugeben.

Das wäre eine neue Implementierung die es noch nicht gibt.
Damit würde DbRep schon fast zu einer SQL Terminal Session erweitert werden. Eine Auslagerung als "DbTerm" um den Modul Code zu verschlanken wäre ja auch denkbar,
dafür reichen aber meine Programmierkenntnisse nicht aus.

1) Was ich noch nicht probiert habe wäre eine SQL Procedur aufzurufen. Würde das im sqlCmd gehen?

2) Komme ich durch die usrExitFn irgendwie an das sqlCmd, um es durch die weiter vorne beschriebene sqlformat.org wieder zu reformatieren?

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

#1737
Moin Christian,

eine grundlegende Schwierigkeit ist, dass wir nach den Vorgaben des DBI Interface Moduls implemetieren und dort keine solche Batchverarbeitung vorgesehen ist, zumindest habe ich keine gefunden.
D.h. alles muß als Einzelstatements den entsprechenden DBI Konstrukten übergeben werden.
Wenn du Spaß daran hast, kannst du dir über die Feiertage ja mal die Doku reinziehen-> https://metacpan.org/pod/DBI
Vllt. findest du ja etwas.

Es gibt noch diverse DBI Erweiterungen über Module wo sich solche Möglichkeiten verstecken könnten. Ein Übersicht findet man hier: https://metacpan.org/search?q=DBIx

Interessant könnte z.B. das sein: https://metacpan.org/pod/DBIx::DWIW
- Robust and simple DBI wrapper to Do What I Want (DWIW)

Zitat
1) Was ich noch nicht probiert habe wäre eine SQL Procedur aufzurufen. Würde das im sqlCmd gehen?
Glaube ich aktuell nicht. Wäre aber implementierbar wenn ich weiß wie man per DBI an eine Prozedur rankommt.
Evtl. über eines der oben verlinkten Zusatzmodule.

Zitat
2) Komme ich durch die usrExitFn irgendwie an das sqlCmd, um es durch die weiter vorne beschriebene sqlformat.org wieder zu reformatieren?
Aktuell nicht. Aber ich glaube das könnte ich implementieren.
Es gibt intern bereits ein (in Ansätzen  ;) ) formatiertes Hash welches bereits ausgeführte SQL's speichert sofern man die SQL-Historie eingeschaltet hat.

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

ch.eick

Zitat von: DS_Starter am 21 Dezember 2022, 08:59:54
Zitat
    1) Was ich noch nicht probiert habe wäre eine SQL Procedur aufzurufen. Würde das im sqlCmd gehen?
Glaube ich aktuell nicht. Wäre aber implementierbar wenn ich weiß wie man per DBI an eine Prozedur rankommt.
Evtl. über eines der oben verlinkten Zusatzmodule.
Hallo Heiko,

ein Proceduraufruf funktioniert und liefert die Anzahl Zeilen des ersten SELECT zurück.

defmod LogDBRep_PV_prognose DbRep LogDB
attr LogDBRep_PV_prognose DbLogExclude .*
attr LogDBRep_PV_prognose allowDeletion 0
attr LogDBRep_PV_prognose comment Version 2022.12.21 11:00
attr LogDBRep_PV_prognose room System
attr LogDBRep_PV_prognose verbose 0

setstate LogDBRep_PV_prognose done
setstate LogDBRep_PV_prognose 2022-12-21 11:45:55 SqlResultRow_1 5839
setstate LogDBRep_PV_prognose 2022-12-21 11:45:55 sqlCmd call dwd_load(12);;
setstate LogDBRep_PV_prognose 2022-12-21 11:45:55 sqlResultNumRows 5839
setstate LogDBRep_PV_prognose 2022-12-21 11:45:55 state done

Damit könnte ich jetzt erstmal als work around leben, wobei ein Scannen des call Aufrufs als SELECT noch etwas schöner wäre.

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

#1739
Es gibt ein Modul DBIx::ProcedureCall -> https://metacpan.org/pod/DBIx::ProcedureCall

Kann den Use Case jetzt nicht übersehen, aber in der Erläuterung zum Modul steht:

Zitat
Dieses Modul bietet eine bequeme Möglichkeit, Stored Procedures von Perl aus aufzurufen, indem es Wrapper-Subroutinen erstellt, die die erforderlichen SQL-Anweisungen erzeugen, Parameter binden und die Abfrage ausführen.

Obwohl die Schnittstelle dieses Moduls datenbankunabhängig ist, werden derzeit nur Oracle und PostgreSQL unterstützt.
....
Das Modul soll eine extrem einfache Schnittstelle zu den gängigsten Formen von gespeicherten Prozeduren bieten. Es wird nicht in der Lage sein, sehr komplexe Fälle zu behandeln. Das ist nicht das Ziel, wenn es 90% der handgeschriebenen SQL- und Bind-Aufrufe eliminieren kann, bin ich zufrieden.
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