Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)

Begonnen von ch.eick, 07 Oktober 2020, 16:09:12

Vorheriges Thema - Nächstes Thema

ch.eick

Im Photovoltaikforum kam gerade mal die Frage auf, wie man alte Daten aus dem Portal runter laden kann.
Das geht über die Diagramme und dort kann man z.B. ein csv File erstellen. Bisher ist das aber noch Handarbeit.
Der Plenticore gibt noch einen Download von bis zu 100 Tagen her, was dann schon mal wesentlich besser zu verarbeiten ist.
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 zusammen,
alle die erst später mit Ihrem Wechselrichter bei den SW_* readings eingestiegen sind möchten sicherlich noch Ihre bisherigen readings rückwirkend ergänzen, damit die Jahres und Quartals Statistiken auch schon länger zurück funktionieren.

Dazu muss man den Zeitpunkt des Umstiegs finden, damit man beim TIMESTAMP alles davor bearbeiten kann.

Immer zuerst einen Backup machen!!!

Dies wären die readings, die ich bereits verwende jeweils mit _[Day|Month|Year]  ergänzt, wodurch die Anzahl also drei mal so hoch ist.

Statistic_EnergyHome
Statistic_EnergyHomeFeedInGrid
Statistic_EnergyHomeGrid
Statistic_EnergyHomePv
Statistic_EnergyHomePvSum
Statistic_EnergyPv1
Statistic_EnergyPv2
Statistic_EnergyPv4
Statistic_EnergyPv5
Statistic_TotalConsumption
Statistic_Yield


Zum Suchen reicht sicher ein einfaches SELECT in der Nähe des Datums, an das man sich erinnert.
Achtung, der TIMESTAMP sollte genau passen, damit man keine Feklermeldung wegen duplicate key bekommt. Ab dem neueren Datum sind die Werte dann doppelt in der DB, nur halt mit unterschiedlichem Namen. Das kann man dann später noch bereinigen, wenn der Platz man knapp wird oder man sich wirklich entschieden hat.

SELECT * FROM history
WHERE DEVICE='WR_1_API'
  AND READING = 'SW_Statistic_EnergyPv1_Year'
  AND TIMESTAMP < '2021-05-01'
order by TIMESTAMP desc;


Und hiermit kann man dann jedes READING mit SW_ zusätzlich eintragen. Bitte das Datum anpassen, damit nur die älteren bearbeitet werden.

INSERT INTO history
SELECT
  TIMESTAMP,
  DEVICE,
  TYPE,
  EVENT,
  CONCAT('SW_',READING) AS READING,
  VALUE,
  UNIT
FROM history x1
WHERE DEVICE='WR_1_API'
  AND READING = '< Das alte reading, das als SW_* ergänzt werden soll >'
  AND TIMESTAMP < '2021-05-06 14:33:31'
;


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

Guten Morgen zusammen,
hier kommt dann nun auch die Quartalsauswertung, die im stateFormat des WR_1_API Devices bereits schlummert.
Da das SQL SELECT ziemlich groß ist wird es hier jetzt in zwei Schritte geliefert.
Bitte seht zu, dass vorher der Jahres Report läuft, dann sind wesentliche Dinge bereits erledigt. Auch die Datenpflege aus dem vorherigen Post ist eine Voraussetzung, da ansonsten eventuell nicht alles angezeigt wird.

Das RAW vom LogDBRep_Statistic_previous_Quarter
Hier ist bereits eine @offset Variable des SELECT beinhaltet und die Variablen §device§ und §reading§, die durch das DbRep in dem SELECT ergenzt werden.

defmod LogDBRep_Statistic_previous_Quarter DbRep LogDB
attr LogDBRep_Statistic_previous_Quarter DbLogExclude .*
attr LogDBRep_Statistic_previous_Quarter allowDeletion 0
attr LogDBRep_Statistic_previous_Quarter comment Version 2022.01.14 10:00
attr LogDBRep_Statistic_previous_Quarter device WR_1_API
attr LogDBRep_Statistic_previous_Quarter reading SW_Statistic%_Year,Statistic_EnergyHomeBat_Year EXCLUDE=%Autarky%,%Rate%,%NoBat%
attr LogDBRep_Statistic_previous_Quarter room System
attr LogDBRep_Statistic_previous_Quarter sqlCmdVars SET @offset:=  (   CASE WHEN MONTH(CURRENT_DATE) IN (1,4,7,10) THEN @offset:=0          WHEN MONTH(CURRENT_DATE) IN (2,5,8,11) THEN @offset:=1       ELSE @offset:=2   END  );;
attr LogDBRep_Statistic_previous_Quarter userExitFn splitReading .*:.*
attr LogDBRep_Statistic_previous_Quarter verbose 0


Bitte achtet darauf, dass die splitReading() Funktion in 99_myUtils aktualisiert wurde.

Wenn das Device LogDBRep_Statistic_previous_Quarter angelegt wurde geht Ihr bitte her und ruft im Device mit "set sqlcmd" den Eingabe Editor auf und tragt dort das SQL SELECT Kommando ein.
Anschließend dann mit Klick auf "set" ausführen. Wenn das SELECT okay ist und fehlerfrei ausgeführt wurde, dann bleibt es erhalten. Bei einem Fehler wird es nicht in die sqlcmd Kommandowiederholung aufgenommen. Bitte speichert Euch das SQL SELECT auch nochmal in einer Datei als Sicherung weg, dann könnt Ihr es immer wieder herstellen.

Jetzt bitte nur keine Panic :-) es ist nur soooo lang, da bereits alle vier vorherigen Quartale in einem Rutsch ausgewertet werden, dies ist dann rollierend zu lesen.
Wenn Q1 mit "previous" markiert ist, dann würed Q4, Q3, Q2 das vorherige sein. Somit sollte der Report also jeweils nach dem Ende eines Quartals erstellt werden.
Im stateFormat wird jeweils nur das "previous" angezeigt.

SELECT * FROM
(
SELECT
  TIMESTAMP,
  IF(READING='_Year',CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1))),CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1)),'_',REPLACE(READING,'_Year',''))) AS READING,
  VALUE
FROM
(
  SELECT
    DATE_FORMAT(CURRENT_DATE - INTERVAL @offset MONTH, '%Y-%m-01 23:59:00') - INTERVAL 1 DAY AS TIMESTAMP,
    '_Year'    AS READING,
'previous' AS VALUE
  UNION ALL
  SELECT * FROM
    (
     SELECT
       DATE_FORMAT(end.TIMESTAMP, '%Y-%m-%d 23:59:00') AS TIMESTAMP,
       end.READING,
       (end.VALUE-begin.VALUE) AS VALUE
     FROM
     (
         SELECT
           h.TIMESTAMP,
           h.READING,
           cast(h.VALUE/1000 AS decimal(6)) AS VALUE
         FROM history h
       INNER JOIN
         (
         SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history
           WHERE DEVICE = 'WR_1_API'
             AND ( READING LIKE 'SW_Statistic_%Year' OR READING='Statistic_EnergyHomeBat_Year' )
             AND READING NOT LIKE '%Autarky%'
             AND READING NOT LIKE '%Rate%'
            AND READING NOT LIKE '%NoBat%'
          AND TIMESTAMP >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1+@offset MONTH, '%Y/%m/28' )
             AND TIMESTAMP <  DATE_FORMAT( CURRENT_DATE - INTERVAL @offset MONTH, '%Y/%m/01' )
           GROUP BY READING
         ) x1
       ON    h.TIMESTAMP = x1.TIMESTAMP
         AND h.READING   = x1.READING
         AND h.VALUE != 0
     ) end
   INNER JOIN
     (
       SELECT
         h.TIMESTAMP,
         h.READING,
         cast(h.VALUE/1000 AS decimal(6)) AS VALUE
       FROM history h
     INNER JOIN
       (
        SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history
          WHERE  DEVICE = 'WR_1_API'
            AND ( READING LIKE 'SW_Statistic_%Year' OR READING='Statistic_EnergyHomeBat_Year' )
            AND READING NOT LIKE '%Autarky%'
            AND READING NOT LIKE '%Rate%'
            AND READING NOT LIKE '%NoBat%'
        AND TIMESTAMP >= DATE_FORMAT( CURRENT_DATE - INTERVAL 4+@offset MONTH, '%Y/%m/28' )
            AND TIMESTAMP <  DATE_FORMAT( CURRENT_DATE - INTERVAL 3+@offset MONTH, '%Y/%m/01' )
          GROUP BY READING
       ) x1
     ON    h.TIMESTAMP = x1.TIMESTAMP
       AND h.READING   = x1.READING
       AND h.VALUE != 0
     ) begin
   ON    end.READING = begin.READING
     AND MONTH(end.TIMESTAMP) IN (3,6,9,12)
   ) QX
) QA
) UA

UNION ALL

SELECT
  TIMESTAMP,
  IF(READING='_Year',CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1))),CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1)),'_',REPLACE(READING,'_Year',''))) AS READING,
  VALUE
FROM
(
  SELECT
    DATE_FORMAT(CURRENT_DATE - INTERVAL 3+@offset MONTH, '%Y-%m-01 23:59:00') - INTERVAL 1 DAY AS TIMESTAMP,
    '_Year' AS READING,
null    AS VALUE
  UNION ALL
  SELECT * FROM
    (
     SELECT
       DATE_FORMAT(end.TIMESTAMP, '%Y-%m-%d 23:59:00') AS TIMESTAMP,
       end.READING,
       (end.VALUE-begin.VALUE) AS VALUE
     FROM
     (
         SELECT
           h.TIMESTAMP,
           h.READING,
           cast(h.VALUE/1000 AS decimal(6)) AS VALUE
         FROM history h
       INNER JOIN
         (
         SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history
           WHERE DEVICE = 'WR_1_API'
             AND ( READING LIKE 'SW_Statistic_%Year' OR READING='Statistic_EnergyHomeBat_Year' )
             AND READING NOT LIKE '%Autarky%'
             AND READING NOT LIKE '%Rate%'
            AND READING NOT LIKE '%NoBat%'
          AND TIMESTAMP >= DATE_FORMAT( CURRENT_DATE - INTERVAL 4+@offset MONTH, '%Y/%m/28' )
             AND TIMESTAMP <  DATE_FORMAT( CURRENT_DATE - INTERVAL 3+@offset MONTH, '%Y/%m/01' )
           GROUP BY READING
         ) x1
       ON    h.TIMESTAMP = x1.TIMESTAMP
         AND h.READING   = x1.READING
         AND h.VALUE != 0
     ) end
   INNER JOIN
     (
       SELECT
         h.TIMESTAMP,
         h.READING,
         cast(h.VALUE/1000 AS decimal(6)) AS VALUE
       FROM history h
     INNER JOIN
       (
        SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history
          WHERE  DEVICE = 'WR_1_API'
             AND ( READING LIKE 'SW_Statistic_%Year' OR READING='Statistic_EnergyHomeBat_Year' )
            AND READING NOT LIKE '%Autarky%'
            AND READING NOT LIKE '%Rate%'
            AND READING NOT LIKE '%NoBat%'
        AND TIMESTAMP >= DATE_FORMAT( CURRENT_DATE - INTERVAL 7+@offset MONTH, '%Y/%m/28' )
            AND TIMESTAMP <  DATE_FORMAT( CURRENT_DATE - INTERVAL 6+@offset MONTH, '%Y/%m/01' )
          GROUP BY READING
       ) x1
     ON    h.TIMESTAMP = x1.TIMESTAMP
       AND h.READING   = x1.READING
       AND h.VALUE != 0
     ) begin
   ON    end.READING = begin.READING
     AND MONTH(end.TIMESTAMP) IN (3,6,9,12)
   ) QX
) QB

UNION ALL

SELECT
  TIMESTAMP,
  IF(READING='_Year',CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1))),CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1)),'_',REPLACE(READING,'_Year',''))) AS READING,
  VALUE
FROM
(
  SELECT
    DATE_FORMAT(CURRENT_DATE - INTERVAL 6+@offset MONTH, '%Y-%m-01 23:59:00') - INTERVAL 1 DAY AS TIMESTAMP,
    '_Year' AS READING,
null    AS VALUE
  UNION ALL
  SELECT * FROM
    (
     SELECT
       DATE_FORMAT(end.TIMESTAMP, '%Y-%m-%d 23:59:00') AS TIMESTAMP,
       end.READING,
       (end.VALUE-begin.VALUE) AS VALUE
     FROM
     (
         SELECT
           h.TIMESTAMP,
           h.READING,
           cast(h.VALUE/1000 AS decimal(6)) AS VALUE
         FROM history h
       INNER JOIN
         (
         SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history
           WHERE DEVICE = 'WR_1_API'
             AND ( READING LIKE 'SW_Statistic_%Year' OR READING='Statistic_EnergyHomeBat_Year' )
             AND READING NOT LIKE '%Autarky%'
             AND READING NOT LIKE '%Rate%'
            AND READING NOT LIKE '%NoBat%'
          AND TIMESTAMP >= DATE_FORMAT( CURRENT_DATE - INTERVAL 7+@offset MONTH, '%Y/%m/28' )
             AND TIMESTAMP <  DATE_FORMAT( CURRENT_DATE - INTERVAL 6+@offset MONTH, '%Y/%m/01' )
           GROUP BY READING
         ) x1
       ON    h.TIMESTAMP = x1.TIMESTAMP
         AND h.READING   = x1.READING
         AND h.VALUE != 0
     ) end
   INNER JOIN
     (
       SELECT
         h.TIMESTAMP,
         h.READING,
         IF( MONTH(h.TIMESTAMP) != 12 , cast(h.VALUE/1000 AS decimal(6)) , 0 ) AS VALUE
       FROM history h
     INNER JOIN
       (
        SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history
          WHERE  DEVICE = 'WR_1_API'
             AND ( READING LIKE 'SW_Statistic_%Year' OR READING='Statistic_EnergyHomeBat_Year' )
            AND READING NOT LIKE '%Autarky%'
            AND READING NOT LIKE '%Rate%'
            AND READING NOT LIKE '%NoBat%'
        AND TIMESTAMP >= DATE_FORMAT( CURRENT_DATE - INTERVAL 10+@offset MONTH, '%Y/%m/28' )
            AND TIMESTAMP <  DATE_FORMAT( CURRENT_DATE - INTERVAL 9+@offset MONTH, '%Y/%m/01' )
          GROUP BY READING
       ) x1
     ON    h.TIMESTAMP = x1.TIMESTAMP
       AND h.READING   = x1.READING
       AND h.VALUE != 0
     ) begin
   ON    end.READING = begin.READING
     AND MONTH(end.TIMESTAMP) IN (3,6,9,12)
   ) QX
) QC

UNION ALL

SELECT
  TIMESTAMP,
  IF(READING='_Year',CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1))),CONCAT('Q',CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1)),'_',REPLACE(READING,'_Year',''))) AS READING,
  VALUE
FROM
(
  SELECT
    DATE_FORMAT(CURRENT_DATE - INTERVAL 9+@offset MONTH, '%Y-%m-01 23:59:00') - INTERVAL 1 DAY AS TIMESTAMP,
    '_Year' AS READING,
null    AS VALUE
  UNION ALL
  SELECT * FROM
    (
     SELECT
       DATE_FORMAT(end.TIMESTAMP, '%Y-%m-%d 23:59:00') AS TIMESTAMP,
       end.READING,
       (end.VALUE-begin.VALUE) AS VALUE
     FROM
     (
         SELECT
           h.TIMESTAMP,
           h.READING,
           cast(h.VALUE/1000 AS decimal(6)) AS VALUE
         FROM history h
       INNER JOIN
         (
         SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history
           WHERE DEVICE = 'WR_1_API'
             AND ( READING LIKE 'SW_Statistic_%Year' OR READING='Statistic_EnergyHomeBat_Year' )
             AND READING NOT LIKE '%Autarky%'
             AND READING NOT LIKE '%Rate%'
            AND READING NOT LIKE '%NoBat%'
          AND TIMESTAMP >= DATE_FORMAT( CURRENT_DATE - INTERVAL 10+@offset MONTH, '%Y/%m/28' )
             AND TIMESTAMP <  DATE_FORMAT( CURRENT_DATE - INTERVAL 9+@offset MONTH, '%Y/%m/01' )
           GROUP BY READING
         ) x1
       ON    h.TIMESTAMP = x1.TIMESTAMP
         AND h.READING   = x1.READING
         AND h.VALUE != 0
     ) end
   INNER JOIN
     (
       SELECT
         h.TIMESTAMP,
         h.READING,
         IF( MONTH(h.TIMESTAMP) != 12 , cast(h.VALUE/1000 AS decimal(6)) , 0 ) AS VALUE
       FROM history h
     INNER JOIN
       (
        SELECT max(TIMESTAMP) AS TIMESTAMP,READING FROM history
          WHERE  DEVICE = 'WR_1_API'
            AND ( READING LIKE 'SW_Statistic_%Year' OR READING='Statistic_EnergyHomeBat_Year' )
            AND READING NOT LIKE '%Autarky%'
            AND READING NOT LIKE '%Rate%'
            AND READING NOT LIKE '%NoBat%'
        AND TIMESTAMP >= DATE_FORMAT( CURRENT_DATE - INTERVAL 13+@offset MONTH, '%Y/%m/28' )
            AND TIMESTAMP <  DATE_FORMAT( CURRENT_DATE - INTERVAL 12+@offset MONTH, '%Y/%m/01' )
          GROUP BY READING
       ) x1
     ON    h.TIMESTAMP = x1.TIMESTAMP
       AND h.READING   = x1.READING
       AND h.VALUE != 0
     ) begin
   ON    end.READING = begin.READING
     AND MONTH(end.TIMESTAMP) IN (3,6,9,12)
   ) QX
) QD
;

Nach dem Ausführen entsteht im DbRep Device aus der formatierten Eingabe ein Bandwurm, was nicht mehr wirklich lesbar ist. Also wie bereits geschrieben nochmal selber weg sichern.

Nach dem Ausführen sollte es dann so aussehen, Q4 hat den "previos" Eintrag, da wir ja noch nicht April haben.

Q1
Q1_SW_Statistic_EnergyHome 2199
Q1_SW_Statistic_EnergyHomeFeedInGrid 324
Q1_SW_Statistic_EnergyHomeGrid 1205
Q1_SW_Statistic_EnergyHomePv 712
Q1_SW_Statistic_EnergyHomePvSum 994
Q1_SW_Statistic_TotalConsumption 2200
Q1_SW_Statistic_Yield 1318
Q1_Statistic_EnergyHomeBat 283
Q2
Q2_SW_Statistic_EnergyHome 1809
Q2_SW_Statistic_EnergyHomeFeedInGrid 5662
Q2_SW_Statistic_EnergyHomeGrid 17
Q2_SW_Statistic_EnergyHomePv 1398
Q2_SW_Statistic_EnergyHomePvSum 1792
Q2_SW_Statistic_EnergyPv1 2081
Q2_SW_Statistic_EnergyPv2 1655
Q2_SW_Statistic_TotalConsumption 1808
Q2_SW_Statistic_Yield 7454
Q2_Statistic_EnergyHomeBat 393
Q3
Q3_SW_Statistic_EnergyHome 1623
Q3_SW_Statistic_EnergyHomeFeedInGrid 4797
Q3_SW_Statistic_EnergyHomeGrid 16
Q3_SW_Statistic_EnergyHomePv 1186
Q3_SW_Statistic_EnergyHomePvSum 1607
Q3_SW_Statistic_EnergyPv1 2019
Q3_SW_Statistic_EnergyPv2 1614
Q3_SW_Statistic_EnergyPv4 1260
Q3_SW_Statistic_EnergyPv5 1797
Q3_SW_Statistic_TotalConsumption 1623
Q3_SW_Statistic_Yield 6404
Q3_Statistic_EnergyHomeBat 421
Q4 previous
Q4_SW_Statistic_EnergyHome 2583
Q4_SW_Statistic_EnergyHomeFeedInGrid 511
Q4_SW_Statistic_EnergyHomeGrid 1378
Q4_SW_Statistic_EnergyHomePv 875
Q4_SW_Statistic_EnergyHomePvSum 1205
Q4_SW_Statistic_EnergyPv1 510
Q4_SW_Statistic_EnergyPv2 422
Q4_SW_Statistic_EnergyPv4 330
Q4_SW_Statistic_EnergyPv5 551
Q4_SW_Statistic_TotalConsumption 2583
Q4_SW_Statistic_Yield 1716
Q4_Statistic_EnergyHomeBat 330


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

kaiman

Hallo,

danke für die neuen Funktionen!
Die Jahreswerte bekomme ich jetzt angezeigt. Quartalsberechnen erhalte ich leider keine Werte.
Kann das damit zu tun haben, dass ich erst Dez 2021 angefangen habe mit der Aufzeichnung in FHEM?

ch.eick

Zitat von: kaiman am 18 Januar 2022, 17:31:20
Hallo,

danke für die neuen Funktionen!
Die Jahreswerte bekomme ich jetzt angezeigt. Quartalsberechnen erhalte ich leider keine Werte.
Kann das damit zu tun haben, dass ich erst Dez 2021 angefangen habe mit der Aufzeichnung in FHEM?
Danke für die Rückmeldung.

Ja, die Jahreswerte brauchen nur den 31.12 als Refferenz, bei den Quartalswerten ist es eine Berechnung, die zumindest Anfang und Ende benötigt.
Wenn Du die entsprechenden Werte hast, kann man sie nachträglich in die Datenbank rein schreiben.

Bei Dir wäre ja das Q4 und die Jahreswerte die selben, da denke ich könnte man mal bis April warten :-)
Oder es müssen die 0 Werte, bzw Werte aus dem Portal, im September am 30.09 um 23:59 manuell rein, dann sollte für Q4 auch was angezeigt werden.
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

kaiman

Hi,

ok, verstanden. Dann sollte ich in Q2 die Werte aus Q1 angezeigt bekommen, das passt dann ja auch ;).

DANKE für den Support!

ch.eick

Zitat von: kaiman am 18 Januar 2022, 19:46:30
Dann sollte ich in Q2 die Werte aus Q1 angezeigt bekommen, das passt dann ja auch ;).
Wie gesagt, wenn Du im Portal die Werte für die Quartale raus suchst kann man sie in die Datenbank übertragen.
Die Anfrage ist schon mal gekommen, aber die Werte liegen mir noch nicht vor. Ich bräuchte mal ein Muster für die Vorlage.
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

kaiman

Hi,

ich habe meine PV Anlage erst im Dez 21 in Betrieb genommen, daher kann ich keine Werte zusteuern, sry.

ch.eick

Moin zusammen,

in dem WR_1_API stateFormat war noch ein kleiner Fehler, den ich jetzt korrigiert habe. Bitte ladet das nochmal neu.
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 zusammen,
ich möchte Euch mal mit beim Nachdenken einbinden.
Bei mir steht wegen eines Defekts wohl der Austausch eines Plenticore an, bei dem dann wohl auch die Zählerstände neu bei Null anfangen.

Bisher habe ich diese Zähler identifiziert, die ich gerne mit monotonic() einfach im FHEM Device weiter laufen lassen würde, oder dann auch
als SW_* ermittle. Dabei würde der Zähler des neuen Gerätes einfach neu starten und der von SW_* dann den der gesamten PV-Anlage
kontinuierlich weiter rechnen.

Total_home_consumption 14603179.00
Total_home_consumption_Battery 3054237.00
Total_home_consumption_Grid 6569121.50
Total_home_consumption_PV 4999233.00
Total_yield 20132404.00


Aber auch diese Berechnung wird sich dann nur auf den neuen Wechselrichter beziehen.
Mit der Erzeugung eines neuen SW_* Wertes könnte man dann die Richtige consumption_rate der PV-Anlage wieder berechnen.

Total_home_consumption_rate 40.00


Bitte schaut Euch auch mal die einzelnen Werte im WR_1 und WR_1_API Device an, damit bei der Aktion nicht etwas durch die Lappen geht.

Bei den Statistiken sehe ich nur ein kleineres Problem bei den Jahres Werten, was man eventuell besser im DbRep Report erledigen könnte.

Aber auch dort tauchen die Total Werte auf

Statistic_Energy*_Total

Statistic_EnergyPv1_Total 5758368.95
Statistic_EnergyPv2_Total 4797012.43
Statistic_EnergyPv3_Total 0

Statistic_Yield_Total 20132264.78

Statistic_OwnConsumptionRate_Total 40.00
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

Gude :-)

Ich teste bereits die Modifizierung im WR_1 und WR_1_API für vorbereitung eines Wechselrichter Tausches.
Zukünftig werden die Total_* Zähler des Devices wie es normal ist bei einem Hardware Tausch wieder bei Null beginnen. Die korrespondierenden SW_Total_* Werte werden jedoch monoton weiter zählen. Somit spiegel die SW_* auch den Zustand einer "virtuellen" komplett Anlage wieder - Und schon wieder hat mich meine darmalige Benennung eingeholt :-)

Bis später
   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

Und schon wieder der nächste Punkt...

Beim Solar_forecast() kann es innerhalb einer SQL Abfrage in der Datenbank zu einer Division durch Null kommen, was an einer bestimmten Datenkonstellation liegt.
Ich habe das jetzt expliziet abgefangen und Ihr müsste es in der 99_myUtil Solar_forecast() bitte korrigieren, falls Ihr den Forcast verwendet.

Es geht um diese Zeile des SQL Statements

cast((t1.VALUE/(t1.VALUE+(-1*\@temp))*\@corr) AS DECIMAL(4,1))       AS FACTOR,


Die Ihr bitte wie folgt austauscht

if(((t1.VALUE+(-1*\@temp))*\@corr)=0,0, cast((t1.VALUE/(t1.VALUE+(-1*\@temp))*\@corr) AS DECIMAL(4,1))) AS FACTOR,

Somit wird vor der Berechnung zuerst geprüft, ob eine Division durch 0 entsteht und in dem Fall einfach eine 0 als FACTOR ausgegeben.

Im Wiki werde ich es auch korrigieren.

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

misux

Hallöö! Ich mal wieder... Hatte in letzter Zeit wenig bis gar keine Zeit... Musste vieles andere machen, aber ich musste auch zwischendurch meinen Raspi neustarten und die Log hat mir was feines nach dem Neustart rausgehauen...

Gibt es dafür vielleicht eine Lösung?

2022.02.11 16:40:00 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.02.11 16:40:00 3: eval:
my $calcVal = 0;
my $WR      = "WR_1";
my $YearBefore      = "LogDBRep_Statistic_previous_Year";
my $YearPrevious    = POSIX::strftime("%Y",localtime(time_str2num(ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null"))));
my $QuarterBefore   = "LogDBRep_Statistic_previous_Quarter";
my $QuarterPrevious = "null";
foreach my $i (1,2,3,4) {if (ReadingsVal("$QuarterBefore","Q".$i,0) eq "previous"){ $QuarterPrevious = "Q".$i }};

my $pvt   = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",0) );
my $pvtd  = sprintf("%04d",ReadingsVal("$name","SW_Statistic_Yield_Day",0)/1000 );
my $pvtm  = sprintf("%04d",ReadingsVal("$name","SW_Statistic_Yield_Month",0)/1000 );
    $pvtm .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_Yield",0) ) : "";
my $pvty  = sprintf("%05d",ReadingsVal("$name","SW_Statistic_Yield_Year",0)/1000 );
    $pvty .= ($YearPrevious ne "0") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_Yield_Year",0) ) : "";

my $pv    = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0) );
my $pvd   = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Day",0)/1000 );
my $pvm   = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Month",0)/1000 );
    $pvm  .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_EnergyHomePv",0) ) : "";
my $pvy   = sprintf("%05d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Year",0)/1000 );
    $pvy  .= ($YearPrevious ne "0") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_EnergyHomePv",0) ) : "";
   
my $gfi   =  sprintf("%04d W",(ReadingsVal($WR,"Total_Active_P_EM",0)<=0 ? abs(round(ReadingsVal($WR,"Total_Active_P_EM",0),0)):  0) );
my $gfid  = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Day",0)/1000 );
my $gfim  = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Month",0)/1000 );
    $gfim .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_EnergyHomeFeedInGrid",0) ) : "";
my $gfiy  = sprintf("%05d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Year",0)/1000 );
    $gfiy .= ($YearPrevious ne "0") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_EnergyHomeFeedInGrid_Year",0) ) : "";
   
my $eb    = sprintf("%04d W",(ReadingsVal($WR,"Total_Active_P_EM",0)>=0 ? round(ReadingsVal($WR,"Total_Active_P_EM",0),0) : 0) );
my $ebd   = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Day",0)/1000 );
my $ebm   = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Month",0)/1000 );
    $ebm  .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_EnergyHomeGrid",0) ) : "";
my $eby   = sprintf("%05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000 );
    $eby  .= ($YearPrevious ne "0") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_EnergyHomeGrid_Year",0) ) : "";

my $pvb   = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0));
my $pvbd  = sprintf("%04d",ReadingsVal("$name","Statistic_EnergyHomeBat_Day",0)/1000 );
my $pvbm  = sprintf("%04d",ReadingsVal("$name","Statistic_EnergyHomeBat_Month",0)/1000 );
    $pvbm .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_Statistic_EnergyHomeBat",0) ) : "";
my $pvby  = sprintf("%05d",ReadingsVal("$name","Statistic_EnergyHomeBat_Year",0)/1000 );
    $pvby .= ($YearPrevious ne "0") ? sprintf(" / %05d", ReadingsVal("$YearBefore","Statistic_EnergyHomeBat_Year",0) ) : "";

my $et    = sprintf("%04d W",(ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_grid",0)) );
my $etd   = sprintf("%04d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Day",0)/1000 );
my $etm   = sprintf("%04d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Month",0)/1000 );
    $etm  .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_TotalConsumption",0) ) : "";
my $ety   = sprintf("%05d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Year",0)/1000 );
    $ety  .= ($YearPrevious ne "0") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_TotalConsumption_Year",0) ) : "";

my $valA  = ReadingsVal($WR, "SW_Total_AC_Active_P",0)-ReadingsVal($WR, "SW_Home_own_consumption_from_grid",0);
    $calcVal = ($valA > 0) ? round($valA /($valA + ReadingsVal($WR, "SW_Home_own_consumption_from_grid",""))*100 ,0) : 0;
my $aq    = sprintf("%4d %%",(($calcVal > 100) ? 100 : $calcVal) );

my $aqd   = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_Autarky_Day",0) );
my $aqm   = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_Autarky_Month",0) );
my $aqy   = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_Autarky_Year",0) );
   
my $valS  = ReadingsVal($WR,"SW_Total_AC_Active_P",0);
    $calcVal = ($valS > 0) ? round((ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0) + ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)) / $valS * 100 ,0) : 0;
my $sq    =  sprintf("%4d %%",(($calcVal > 100) ? 100 : $calcVal) );

my $sqd   = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Day",0) );
my $sqm   = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Month",0) );
my $sqy   = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Year",0) );
   
my $date  = POSIX::strftime("%Y-%m-%d",localtime(time_str2num(ReadingsTimestamp($name, "auth_me_authenticated",0))));
my $md    = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "auth_me_authenticated",0))));
my $cd    = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Day",0))));
my $cm    = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Month",0))));
    $cm   .= ($QuarterPrevious ne "null") ? " / ".POSIX::strftime("%d.%m",localtime(time_str2num(ReadingsTimestamp("$QuarterBefore","$QuarterPrevious",0) ))) : "";
my $cy    = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Year",0))));
    $cy   .= ($YearPrevious ne "0") ? " / ".$YearPrevious : "";

"<html><table border=2 bordercolor='darkgreen' cellspacing=0 style='width: 100%'>
<colgroup>
   <col span='1' style='width: 52%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
</colgroup>
<tr><td style='padding-right:5px;padding-left:5px;font-weight:bold'>Statistik vom $date in kWh</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>aktuell</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Heute</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Monat".(($QuarterPrevious ne "null") ? " / ".$QuarterPrevious : "")."</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Jahr".(($YearPrevious ne "0") ? " / Vorjahr" : "")."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Erzeugung PV-Total</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvt."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvtd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvtm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvty."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug von PV</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pv."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvy."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug von Batterie</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvb."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvbd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvbm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvby."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug ins Haus (Energieverbrauch)</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$et."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$etd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$etm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$ety."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug vom Netz</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$eb."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$ebd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$ebm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$eby."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Einspeisung ins Netz</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$gfi."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$gfid."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$gfim."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$gfiy."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Autarkiequote</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$aq."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$aqd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$aqm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$aqy."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Eigenverbrauchsquote</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$sq."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$sqd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$sqm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$sqy."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Berechnet um</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$md."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$cd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$cm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$cy."</td></tr>
</table></html>"

ch.eick

Zitat von: misux am 11 Februar 2022, 16:48:25
Hallöö! Ich mal wieder... Hatte in letzter Zeit wenig bis gar keine Zeit... Musste vieles andere machen, aber ich musste auch zwischendurch meinen Raspi neustarten und die Log hat mir was feines nach dem Neustart rausgehauen...

Gibt es dafür vielleicht eine Lösung?
Das dürfte nur einmal kommen, aber ich habe noch nicht gefunden welche Variable da nicht initialisiert ist :-(
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 zusammen,
es gibt ja immer was zu tun...

Für den KSEM gibt es bereits einige Zeit eine neue Firmware, die ich heute installiert habe. Vorher habe ich noch einen Backup und die Logdaten des KSEM gesichert.
Bisher konnte ich keine Probleme feststellen.
Im Photovoltaikforum gab es Meldungen, dass zu Kommunikations Problemen mit dem Plenticore gekommen ist, wenn man den Update des Plenticore zuerst machen würde.
Wärend des Updates kommt es natürlich zu einer kleinen Unterbrechung.
Zitat20.02.22 10:40 6006 Systemstörung => Energiemeter kann nicht ausgelesen werden. Bitte kontrollieren Sie die Verbindung zu dem Sensor.

Den Update des Plenticore mache ich dann später, da es wohl einige Verbesserungen bei der Speicher Steuerung gegeben hat. Auch die Notladung soll verbessert worden sein.
Lest dazu einfach mal die Release Notes. Ich denke es wird aber keine Änderungen in der externen Speicher Steuerungen geben, da die in diesen Fällen nur unterstützend zu sehen ist.
Die Erhöhung des Delta-SoCs bei der Notladung wäre ja auch nur eine weitere minimierende Maßnahme gegen die Notladungen, die wir ja schon durch den Wechsel des MinSoC zwischen gutem und schlechtem Wetter machen.

Mit dem Plenticore Update könnt Ihr ja noch etwas warten, da ich ja zwei Stück habe und erstmal auf dem Plenticore teste, der keinen Speicher hat :-)
Danach kommt dann der mit Speicher, da der ja wegen des Fehlers eh bald ausgetauscht würde.

Viele Grüße
     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