[gelöst] DbRep mit komplexem MySQL Code

Begonnen von ch.eick, 27 Februar 2026, 16:22:26

Vorheriges Thema - Nächstes Thema

ch.eick

Hallo Heiko,
ich schreite mit meinem MySQL ja nun immer weiter fort :-) und stoße natürlich an die Grenzen vom DbRep beim Parsen :-(
Meine Vermutung ist das "with", mit dem ich die Bandwurm SELECTs lesbarer aufteile.


Hier werte ich mein SmartMeter aus und berechne den Verbrauch passend zur Stromboerse im 15 Minuten Takt.
Das dann mulipliziert mit dem jeweiligen Preis wird mit dem INSERT direkt wieder als Kosten in die DB geschrieben.
2026.02.27 16:06:07.804 3: Stromboerse_connect  ur_24 : Neuberechnung der Kosten in der Datenbank

INSERT INTO history (TIMESTAMP, DEVICE, TYPE, READING, VALUE)

WITH price AS (
  SELECT
    TIMESTAMP AS interval_start,
    VALUE AS price_ct_per_kWh   -- z.B. Cent/kWh
  FROM history
  WHERE DEVICE = 'Stromboerse_connect'
    AND READING = 'fc0_total'
    AND TIMESTAMP >= CURDATE()
    AND TIMESTAMP < CURDATE() + INTERVAL 1 DAY
),

consumption AS (
  SELECT
    interval_start,
    CASE
      WHEN interval_start = CURDATE() THEN 0
      WHEN VALUE < LAG(VALUE) OVER (ORDER BY interval_start) THEN NULL
      ELSE VALUE - LAG(VALUE) OVER (ORDER BY interval_start)
    END AS kWh_15min
  FROM (
    SELECT
      FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(TIMESTAMP) / 900) * 900) AS interval_start,
      VALUE,
      ROW_NUMBER() OVER (
        PARTITION BY FLOOR(UNIX_TIMESTAMP(TIMESTAMP) / 900)
        ORDER BY TIMESTAMP DESC
      ) AS rn
    FROM history
    WHERE DEVICE  = 'WR_0_KSEM'
      AND READING = 'Active_energy+'
      AND TIMESTAMP >= CURDATE() - INTERVAL 15 MINUTE
  ) t
  WHERE rn = 1
    AND interval_start >= CURDATE()
    AND interval_start < CURDATE() + INTERVAL 1 DAY
)

SELECT *
FROM (
  SELECT
    c.interval_start                   AS TIMESTAMP,
    'Stromboerse_connect'              AS DEVICE,
    'cost'                             AS TYPE,
    'nodes_cost'                       AS READING,
        ROUND(COALESCE(c.kWh_15min,0) * COALESCE(p.price_ct_per_kWh,0) / 100, 6 ) AS VALUE
  FROM consumption c
LEFT JOIN price p
       ON p.interval_start = c.interval_start
) AS new_values

ON DUPLICATE KEY UPDATE
  VALUE = new_values.VALUE;

2026.02.27 16:06:07.812 2: DbRep LogDBRep_Stromboerse_connect_SQL - DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 at ./FHEM/93_DbRep.pm line 7073.

2026.02.27 16:06:07.812 2: DbRep LogDBRep_Stromboerse_connect_SQL - ERROR - DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 at ./FHEM/93_DbRep.pm line 7073.


Wäre es denkbar eine Art Master Modus zu etablieren, bei dem das MySQL nicht überprüft wird?
Der Code läuft ohne Probleme in der DB, ansonsten müsste ich das ganze wieder in Proceduren in der DB ablegen ;-)

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

#1
Hallo Christian,

im Modul (Perl) selbst wird kein SQL-Syntaxcheck durchgeführt. Die Meldung (DBD::mysql::st...) wird direkt vom Datenbanktreiber (DBD Perl-Modul) zurückgeliefert.
Möglicherweise wäre es zielführend im CPAN zu forschen (Version des DBD) bzw. auf DBD::MariaDB umzustellen.
Die eingesetzten Versionen siehst du im Configcheck des zugeordneten DbLog-Devices.

Grüße,
Heiko
Proxmox+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 28 Februar 2026, 09:39:47Im Modul (Perl) selbst wird kein SQL-Syntaxcheck durchgeführt. Die Meldung (DBD::mysql::st...) wird direkt vom Datenbanktreiber (DBD Perl-Modul) zurückgeliefert.
Möglicherweise wäre es zielführend im CPAN zu forschen (Version des DBD) bzw. auf DBD::MariaDB umzustellen.
Die eingesetzten Versionen siehst du im Configcheck des zugeordneten DbLog-Devices.

Hallo Heiko
ich verwende den FHEM Docker Container, wäre sowas dann nicht dort zu aktualisieren?

DBD::DBM, DBD::ExampleP, DBD::File, DBD::Gofer, DBD::MariaDB, DBD::Mem, DBD::Pg, DBD::Proxy, DBD::SQLite, DBD::Sponge, DBD::mysql

Result of version check

Used Perl version: 5.38.5
Used DBI (Database independent interface) version: 1.647
Used DBD (Database driver) version mysql: 4.051
Used DbLog version: 5.11.0
Your local DbLog module is up to date.
Rating:
Recommendation: Update of DbLog is not needed.
Your DBD version fulfills UTF8 support, no need to update DBD.

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

ch.eick

Hallo Heiko,
ich habe das Problem jetzt gefunden und es waren einfach nur die Kommentare im SQL, die ich einfach entfernt habe.
Jetzt läuft es genau so, wie es sein sollte.
Sorry für die Störung, ich wollte halt zuerst einen Menschen fragen :-) ChatGBT wuste die Antwort auch, obwohl es auch dort erst die zweite Problematik gewesen ist.

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