Werte für PV-Anlage in dblog manuell anpassen/ergänzen

Begonnen von Erby, 21 Februar 2025, 16:59:17

Vorheriges Thema - Nächstes Thema

Erby

Hallo,

ich habe seit kurzen die "Datenbankgestützte Erstellung der Energiebilanz einer SMA PV-Anlage mit Überschusseinspeisung" mit der Anleitung aus der WIKI eingerichtet. Hat alles super geklappt.

Jetzt möchte ich gerne die Monats- und Jahreswerte korrigieren, um letztendlich korrekte Werte seit Monatsangang und Jahresbeginn angezeigt zu bekommen. Nur wie korrigiere bzw. ergänze ich in der Praxis diese Werte?


ch.eick

Das kannst Du mit einem SQL Tool mit SQL Statements direkt in der Datenbank machen.
Mit DbRep kannst Du auch einiges erledigen.
Ich verwende eine original Oracle MySQL im Docker Container, da hat man den vollen MySQL Kommandoumfang.

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

Erby

Vielen Dank Christian.

Ich benutze Fhem auf einem Pi4 mit MariaDB.

Ich habe keine Ahnung von SQL. Deswegen benötige ich etwas mehr Erklärung.

Welches Tool nutze ich dafür? Kann man das nicht in Fhem mit Befehlen machen? Wenn ja welche?

Grüße Micha

rabehd

Hast Du ein DBRep-Device? Wenn nicht, dann lege dir eins an.
Dann lies Dir mal die Commandref dazu durch, Stichwort "changeValue".
Auch funktionierende Lösungen kann man hinterfragen.

ch.eick

Ich hab auch alles auf nem RPI4 nur halt in Docker.
Für Oracle ist es der SQL Explorer, bei MariaDB sollte der auch gehen.

In Fhem geht das mit DbRep, aber SQL SELECT müsstest Du Dir auf dauer doch etwas aneignen, denn das ist die Sprache in der Datenbank.
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

RalfRog

Zitat von: ch.eick am 21 Februar 2025, 20:15:30Für Oracle ist es der SQL Explorer, bei MariaDB sollte der auch gehen.
Wenn nicht oder "zu mächtig" - HeidiSQL ist zum reinschauen und Kleinigkeiten (eine handvoll Werte) ändern auch ganz nett.
FHEM auf Proxmox VM Bookworm (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

ch.eick

Zitat von: RalfRog am 21 Februar 2025, 21:46:47
Zitat von: ch.eick am 21 Februar 2025, 20:15:30Für Oracle ist es der SQL Explorer, bei MariaDB sollte der auch gehen.
Wenn nicht oder "zu mächtig" - HeidiSQL ist zum reinschauen und Kleinigkeiten (eine handvoll Werte) ändern auch ganz nett.
Bei mir kamen halt später die komplexeren Wünsche dazu und da ist das Original halt ziemlich gut.
Wie geschrieben es läuft auf einem RPI4 mit 64 Bit (Achtung den RPI zu Beginn direkt mit 64 Bit installieren ! ) im Docker Container.

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

300P

Hallo zusammen!

Für solche Zwecke (Korrektur / hinzufügen/ löschen von einzelnen Datensätzen oder auch manchmal direkte SQL-Befehle abzusetzen) nutze ich auf dem Iphone / Mac das Programm ,,TablePlus" in der kostenlosen Version.

Damit sind dann maximal 2 Tabs gleichzeitig nutzbar - das reicht dafür bislang immer aus.

Gruß
300P
Gruß
300P

FHEM 6.4|RPi|SMAEM|SMAInverter|SolarForecast|DbLog|DbRep|MariaDB|Buderus-MQTT_EMS|
Fritzbox|fhempy|JsonMod|HTTPMOD|Modbus ser+TCP|ESP32-Digitizer-AI_on_the_Edge|ESP32CAM usw.

ch.eick

Moin,
ich hau jetzt mal einen raus, um Werbung für eine komplette MySQL Datenbank zu machen.
Das Beispiel bearbeitet eine Wallbox Auswertung.
- Es wird durch die WB jeden Tag ein Zähler begonnen, wenn ein E-Auto geladen wird
- Mit einem RFID Chip kann man sich identifizieren, was momentan noch nicht komplett funktioniert
- Deshalb schreibe ich die fehlenden Daten mit SQL INSERT selber in die DB
- Am Monats Ende lasse ich eine Auswertung laufen, die die Ladevorgänge mit dem Kunden in einer Liste aufführt
Das ist dann die Grundlage für die Abrechnung.


SQL Beispiel
-- Mit dem SET werden variablen gesetzt
SET @date     :='2025-02-01',
    @device   :='WB_1',
    @reading  :='cp_7_set_log_imported_since_plugged',
    @EVU_cost := 0.32;


-- Nach dem SET kommt nun die Auswertung

SELECT * FROM (                                      -- Hier soll noch bereinigt und sortiert werden
  SELECT                                             -- Spaltensummen für kWh und Cost bilden
    if(Ladevorgang IS NULL,"Summe",Ladevorgang)   AS Ladevorgang,
    TIMESTAMP                                     AS Ladezeit,
    sum(kWh_RFID)                                 AS 'kWh',
    sum(Cost)                                     AS Cost
  FROM
   (
    SELECT                                           -- Berechnung der Ladevorgänge
      TMP                                            AS Ladevorgang,
      max(TIMESTAMP)                                 AS TIMESTAMP,
      cast(sum(DIFF/1000       )    AS DECIMAL(5,2)) AS kWh_RFID,
      cast(sum(DIFF/1000*@cost )    AS DECIMAL(5,2)) AS Cost
    FROM
     (                                               -- Gruppieren und nummerieren der Ladevorgänge
      SELECT
        TIMESTAMP,
        READING,
        VALUE,
        if(cast((VALUE-@diff) AS DECIMAL(7,0)) < 0,NULL,
          if(@diff = 0,VALUE,cast((VALUE-@diff) AS DECIMAL(7,0))) )           AS DIFF,

        if(cast((VALUE-@diff) AS DECIMAL(7,0)) < 0,@diff:=0,@diff:=VALUE)     AS curr_V,

        if(TIMESTAMPDIFF(SECOND,@delta,TIMESTAMP) > 3600,
           NULL,TIMESTAMPDIFF(SECOND,@delta,TIMESTAMP) )                      AS DELTA,

        if(VALUE = 0,@tmp+1,
           if(TIMESTAMPDIFF(SECOND,@delta,TIMESTAMP) > 3600,@tmp:=@tmp+1,@tmp)) AS TMP,

        @delta:=TIMESTAMP                                                     AS curr_T,

        (SELECT @cost:=@EVU_cost)

      FROM  history, (SELECT @tmp:=1)x               -- Zurücksetzen für die Nummerierung der Ladevorgänge
      WHERE DEVICE      = @device
        AND READING     = @reading
        AND TIMESTAMP  >= @date
     ) t_Ladevorgang                                 -- Alles > 7200 (2h) wird als separates Laden gewertet
    GROUP BY TMP                                     -- max(kWh) und max(Cost) bilden
   ) t_Summen
  GROUP BY Ladevorgang,TIMESTAMP WITH ROLLUP           -- Spaltensummen für kWh und Cost bilden

  UNION
   (
    SELECT                                             -- Welche RFID hat geladen
      if(VALUE = "0005082760","Denis",
      if(VALUE = "0000000001","Mike","")) AS Ladevorgang,
      TIMESTAMP,
      "" AS kWh_RFID,
      "" AS Cost
    FROM history
    WHERE DEVICE   =  @device
      AND READING  = 'cp_6_get_rfid_number'
      AND VALUE   != 'NULL'                            -- Unterbrechung beim Laden
      AND date(TIMESTAMP) >=  @date
   )
 ) t_Bereinigen
WHERE
   (   Ladevorgang = "Summe"                         -- Die Summenzeile wird gebraucht
    OR Ladezeit IS NOT NULL                          -- Ungewünschte Zeilen vom ROLLUP entfernen
   )
  AND kWh  IS NOT NULL
  AND Cost IS NOT NULL
ORDER BY ISNULL(Ladezeit), Ladezeit                 -- Die Summen Zeile als letztes
;

-- Nun kommt solch eine Liste heraus

# Ladevorgang Ladezeit kWh Cost
Denis 2025-02-08 08:44:51
1 2025-02-08 08:44:52 25.46 8.15
Denis 2025-02-08 20:08:11
2 2025-02-08 20:08:12 10.89 3.49
Mike 2025-02-10 15:47:20
3 2025-02-10 15:47:21 18.66 5.97
Denis 2025-02-16 05:48:00
4 2025-02-16 05:48:01 25.75 8.24
Denis 2025-02-23 14:52:21
5 2025-02-23 14:52:22 7.49 2.40
Summe 88.25 28.25


Der nächste Schritt wäre dann dieser Bericht als ein DbRep Device ins FHEM einzutragen, wodurch die Tabell im Device als READING erscheint.
Wer den Kostal Plenticore Thread verfolgt findet solche komplexen Auswertungen als Monats oder Jahres Berichte, die dann unter Statistiken in den Devices mit uiTable angezeigt werden.
Du darfst diesen Dateianhang nicht ansehen.
Ich habe auch eine Pseudo WB definiert, mit der ich manuell meine Ladevorgänge an fremden Ladesäulen direkt mit SQL in die MySQL Datenbank eintrage. Hier mal ein SQL Report mit Darstellung im FHEMWEB
Du darfst diesen Dateianhang nicht ansehen.

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

Erby

#9
Zitat von: rabehd am 21 Februar 2025, 20:12:24Hast Du ein DBRep-Device? Wenn nicht, dann lege dir eins an.
Dann lies Dir mal die Commandref dazu durch, Stichwort "changeValue".


Hallo,

ja ich habe ein DBRep-Device für jeden Wert. Ich habe dann hierzu folgendes probiert:

set Rep.STP5000.Erzeugung.Jahr changeValue old="25.2" new="325.25"

Hat aber nicht funktioniert :-(


ch.eick

#10
Für das DbRep gibt es einen eigenen Thread, eventuell gibt's da ne antwort zu DbRep.

Bei Deinem DbRep müsste natürlich noch zusätzlich der TIMESTAMP passend gesetzt werden, da es den alten Wert ja mehrfach geben könnte. Schau mal die Attribute time.* , insbesondere das timestamp_begin und timestamp_end .


In SQL sollte das so aussehen
UPDATE history
  SET
--      READING = '<neuer Name>',
--      TIMESTAMP = from_unixtime(60 * round(unix_timestamp(TIMESTAMP)/60)),         -- so könnte man den TIMESTAMP auch runden
      VALUE   = '<neuer Wert>'

where DEVICE    = '<DEVICE Name>'
  and READING   = '<READING Name>'
  and TIMESTAMP = '2024-12-14 09:13:47'          -- Der TIMESTAMP muss exakt passen
;
Im SQL gibt es natürlich auch das DELETE, INSERT und komplexere Kombinationen mit denen man jeden Wert neu berechnen oder aus etwas anderem neu erstellen kann. Es lohnt sich wirklich. Das DbRep verwende ich nur für dauerhafte Aktionen.

Ich habe mal nach SQL clients gesucht, die links sind aber ohne gewehr:
- MySQL Workbench  https://www.mysql.com/products/workbench
- phpMyAdmin       https://github.com/phpmyadmin/phpmyadmin
- DBeaver          https://github.com/dbeaver/dbeaver
- HeidiSQL         https://github.com/HeidiSQL/HeidiSQL
- SQL Chat         https://github.com/sqlchat/sqlchat
- Beekeeper Studio https://github.com/beekeeper-studio/beekeeper-studio
- DbGate           https://github.com/dbgate/dbgate
- SQLECTRON        https://github.com/sqlectron/sqlectron-gui
- pgAdmin          https://github.com/pgadmin-org/pgadmin4
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

RalfRog

#11
Hi
Ich habe gerade erst in einer Kopie meiner DB alle Werte von kWh nach Wh mit DBRrep "umgerechnet".

LASTCMD
changeValue old=% new=($VALUE,$UNIT) = ($VALUE*1000,"Wh")
Hat super geklappt.

Hast du denn die Attribute für DEVICE, READING und Time gesetzt/nicht gesetzt?
Das macht ja einen Unterschied in der Bearbeitung.

Gruß Ralf

Edit PS
Achtung da fehlen noch die "..." und {...}
Bin gerade am Smartphone, muss mal am PC schauen
FHEM auf Proxmox VM Bookworm (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

rabehd

Zitat von: Erby am 24 Februar 2025, 09:18:30ja ich habe ein DBRep-Device für jeden Wert.
Bei mir reicht ein Device um jeden Tag mehrere Werte automatisch zu bearbeiten.
Auch funktionierende Lösungen kann man hinterfragen.

Erby

Zitat von: RalfRog am 24 Februar 2025, 09:57:05Hi
Ich habe gerade erst in einer Kopie meiner DB alle Werte von kWh nach Wh mit DBRrep "umgerechnet".

LASTCMD
changeValue old=% new=($VALUE,$UNIT) = ($VALUE*1000,"Wh")
Hat super geklappt.

Hast du denn die Attribute für DEVICE, READING und Time gesetzt/nicht gesetzt?
Das macht ja einen Unterschied in der Bearbeitung.

Gruß Ralf

Edit PS
Achtung da fehlen noch die "..." und {...}
Bin gerade am Smartphone, muss mal am PC schauen


Mein DbRep-Device sieht wie folgt aus:

defmod Rep.STP5000.Erzeugung.Jahr DbRep LogDB
attr Rep.STP5000.Erzeugung.Jahr aggregation no
attr Rep.STP5000.Erzeugung.Jahr devStateIcon connected:10px-kreis-gelb .*disconnect:10px-kreis-rot .*done:10px-kreis-gruen
attr Rep.STP5000.Erzeugung.Jahr device STP_5000
attr Rep.STP5000.Erzeugung.Jahr event-on-update-reading state
attr Rep.STP5000.Erzeugung.Jahr group SMA Energy Meter Auswertung
attr Rep.STP5000.Erzeugung.Jahr reading etotal
attr Rep.STP5000.Erzeugung.Jahr room Energie
attr Rep.STP5000.Erzeugung.Jahr showproctime 1
attr Rep.STP5000.Erzeugung.Jahr timeout 180
attr Rep.STP5000.Erzeugung.Jahr timestamp_begin current_year_begin
attr Rep.STP5000.Erzeugung.Jahr timestamp_end current_year_end
attr Rep.STP5000.Erzeugung.Jahr userExitFn setDumEnergy .*:.*
attr Rep.STP5000.Erzeugung.Jahr verbose 2

RalfRog

#14
Hallo Erby
vorab als Anmerkung:
  • ich hoffe du hast ein Backup der Datenbank. Man kann sich ja mit unbedachten Kommandos die Inhalte zerschießen.
  • der vollständige Eintrag im meinem set oben war: old="%" new={"($VALUE,$UNIT) = ($VALUE*1000,"Wh")"}
  • ich mache mir für umfangreiche Einmalmanipulationen der Datenbak immer ein separates DBRep-Device. Ohne die unnötigen Attribute room, event-on, etc. ... ist das deutlich übersichtlicher

Sprich für meine einmalige Umrechnungsaufgabe:
defmod DBRepChng DbRep DBLogging
attr DBRepChng device EM_Haushalt
attr DBRepChng reading statEnergyCumDayLast
attr DBRepChng timestamp_begin 2023-01-02 23:58:30
attr DBRepChng timestamp_end 2024-12-31 23:59:00

Wenn du >> set Rep.STP5000.Erzeugung.Jahr changeValue old="25.2" new="325.25" << mit diesem DBRep  machst:
defmod Rep.STP5000.Erzeugung.Jahr DbRep LogDB
attr Rep.STP5000.Erzeugung.Jahr device STP_5000
attr Rep.STP5000.Erzeugung.Jahr reading etotal
attr Rep.STP5000.Erzeugung.Jahr timestamp_begin current_year_begin
attr Rep.STP5000.Erzeugung.Jahr timestamp_end current_year_end

vermutlich unnötig für deine Aufgabe
attr Rep.STP5000.Erzeugung.Jahr userExitFn setDumEnergy .*:.*

nicht relevant für deine Aufgabe
attr Rep.STP5000.Erzeugung.Jahr devStateIcon connected:10px-kreis-gelb .*disconnect:10px-kreis-rot .*done:10px-kreis-gruen
attr Rep.STP5000.Erzeugung.Jahr event-on-update-reading state
attr Rep.STP5000.Erzeugung.Jahr group SMA Energy Meter Auswertung
attr Rep.STP5000.Erzeugung.Jahr room Energie
attr Rep.STP5000.Erzeugung.Jahr showproctime 1
attr Rep.STP5000.Erzeugung.Jahr timeout 180
attr Rep.STP5000.Erzeugung.Jahr verbose 2
attr Rep.STP5000.Erzeugung.Jahr aggregation no
werden im aktuellen Jahr für Device "STP_5000" Reading "etotal" alle Werte = 25.2 durch 325.25 ersetzt
Wenn das Kommando abgearbeitet ist steht (nach Aktualisierung) in den Readings des DBRep was das Ergenis ist und wieviele Einträge geändert wurden.

Gruß Ralf






FHEM auf Proxmox VM Bookworm (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen