PV Visualisierung mit Shelly1PM

Begonnen von ddd, 28 April 2021, 12:06:16

Vorheriges Thema - Nächstes Thema

ddd

Hallo,

Ich habe eine PV Anlage mit mehreren Miko Invertern. Die Inverter sind auf alle 3 Fasen aufgeteilt.
Jede Fase habe ich über jeweils einen Shelly 1PM angebunden.
Somit kann ich die Leistung jeder Fase überwachen.

Nun möchte ich das schön auswerten.
Anzeigen möchte ich folgendes:
Momentane eingespeiste Gesamtleistung
Die gesamt eingespeiste Energie
Gesamtleistung pro Tag/Monat
Gesamt Energie pro Tag/Monat
Maximal Leistung pro Tag pro Faser und Gesamt
Maximal eingespeiste Energie pro Tag
Wie kann ich das am Besten machen?
Gerne kann man das auch in der MySQL DB speicher. Is eh eine vorhanden. Welche Möglichkeit am Besten dafür ist.

Die Shellys sind schon in Fhem eingebunden und zeigen mir momentan pro Faser die Leistung/Energie an.



Lg

ch.eick

Zitat von: ddd am 28 April 2021, 12:06:16
Ich habe eine PV Anlage mit mehreren Miko Invertern. Die Inverter sind auf alle 3 Phasen aufgeteilt.
Jede Phase habe ich über jeweils einen Shelly 1PM angebunden.
Somit kann ich die Leistung jeder Phase überwachen.

Nun möchte ich das schön auswerten.
Anzeigen möchte ich folgendes:
Momentane eingespeiste Gesamtleistung
Die gesamt eingespeiste Energie
Gesamtleistung pro Tag/Monat
Gesamt Energie pro Tag/Monat
Maximal Leistung pro Tag pro Phase und Gesamt
Maximal eingespeiste Energie pro Tag
Wie kann ich das am Besten machen?
Gerne kann man das auch in der MySQL DB speicher. Is eh eine vorhanden. Welche Möglichkeit am Besten dafür ist.

Die Shellys sind schon in Fhem eingebunden und zeigen mir momentan pro Phaser die Leistung/Energie an.

Okay, ungewöhnlich, aber warum nicht :-)
Hast Du eventuell auch einen Leskopt am Zähler? Damit könntest Du den Eigenverbrauch dann bestimmen. Die Shellys sagen Dir ja nicht was ins Netz geht.
Für die Benennung der readings solltest Du mal beim Thread von SMA oder Kostal schauen, damit wird es dann sicher einfach lesbarer.

Über ein Hilfs Device Deiner Wahl solltest Du alle Messwerte in einem Device zusammenfassen, was dann Dein "Wechselrichter" sein wird.
Jeder Shelly ist dann ein String, wobei es dann bei Dir AC Leistung ist und nicht DC wie bei den normalen Wechselrichtern.
Mit userReadings kannst Du dann die anderen Werte berechnen.
Beim SMA Thread werden auch Counter und Funktionen in den 99_myUtls verwendet, um die Tages und Monatswerte zu ermitteln.

Sobald die Werte bereit sind kannst Du das dann in die Datenbank schreiben und daraus mit Grafana Diagramme zeichnen.

Die Shellys haben auch noch Energiezähler, über die Du Dir einiges an Tages und Monats Berechnungen sparen kannst.
Hier lese ich z.B. jeden Morgen Zählerstände aus und schreibe den Wert in ein Reading in z.B. Deinen "Wechselrichter"
Du könntest so die Shellys auslesen und die Zählerstände des WR speichern, dann hast Du einen Tages/Monats/Jahres Zähler für die Erzeugung des WR

################################################################################################################
## 5 Jeden Morgen die Zählerstände aktualisieren, damit im Schwarm die Statistiken berechnet werden können
##
DOELSEIF
([00:01])

  (setreading WR_1_API SW_Meter_init_FeedInGrid_Day [WR_0_KSEM:Active_energy-])   ## 6172
  (setreading WR_1_API SW_Meter_init_Grid_Day [WR_0_KSEM:Active_energy+])         ## 4727

({if ($mday eq 1)
     {
      fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Month [WR_0_KSEM:Active_energy-]");   ## 5707
      fhem("setreading WR_1_API SW_Meter_init_Grid_Month [WR_0_KSEM:Active_energy+]");         ## 4717

      if ($yday eq 1)
        {
         fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Year [WR_0_KSEM:Active_energy-]");   ## 5241
         fhem("setreading WR_1_API SW_Meter_init_Grid_Year [WR_0_KSEM:Active_energy+]");         ## 3517
        }
     }
  }
)


Such mal im Wiki nach Plenticore, da kannst Du das ganze auch noch einer Leistungsprognose schmücken, aber das kommt erst wenn die Hausaufgaben erledigt sind ;-)
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

ddd

Hallo,

danke für die ausführliche Antwort.

Das die Leistungsmessung mit den Shellys nicht optimal ist, das ist mir schon klar.

Ich habe noch einen Rücklaufgesperrten Zähler mit digitaler S0 Schnittstelle welcher mit die Eingespeiste Leistung zählt.
Diesen könnte ich auch auslesen doch dafür brauche ich wieder zusätzliche Hardware. (damit habe ich mich noch nicht befasst).

Ich kämpfe momentan noch damit die einzelnen Leistungen der Shellys in ein Reading zu packen.

LG

ch.eick

#3
Zitat von: ddd am 28 April 2021, 14:44:48
Ich kämpfe momentan noch damit die einzelnen Leistungen der Shellys in ein Reading zu packen.
Du könntest ein DOIF nehmen und das z.B. jede Minute aktualisieren.
Dort kannst Du dann auch eigene readings ablegen und hättest noch zusätzlich die Möglichkeit auf Events zu reagieren.

Hier ein ungetestetes Beispiel, das Dir schon mal diverse Zähler und Statistiken liefern sollte.
Das kannst Du im RAW Editor so eingeben, bekommst aber wahrscheinlich noch Fehlermeldungen.
Somit wäre dann dieses Device Dein Wechselrichter WR_1

defmod WR_x DOIF ################################################################################################################\
## 1 Readings einsammeln\
##\
([:59]) ## jede Stunde\
{\
   ## Lesen der Shellys\
  CommandSetReading(undef, "$SELF Active_P_L1 ".ReadingsVal("shelly01","power",0));;\
  CommandSetReading(undef, "$SELF Active_P_L2 ".ReadingsVal("shelly02","power",0));;\
  CommandSetReading(undef, "$SELF Active_P_L3 ".ReadingsVal("shelly03","power",0));;\
\
  CommandSetReading(undef, "$SELF Energy_L1 ".ReadingsVal("shelly01","energy",0));;\
  CommandSetReading(undef, "$SELF Energy_L2 ".ReadingsVal("shelly02","energy",0));;\
  CommandSetReading(undef, "$SELF Energy_L3 ".ReadingsVal("shelly03","energy",0));;\
\
  if (AttrVal("$SELF","verbose",0) >=3){Log 3, "$SELF cmd_1 : Werte aktualisiert"}\
\
  ## Summen berechnen\
  CommandSetReading(undef, "$SELF Total_AC_Active_P ".(ReadingsVal("$SELF","Active_P_L1",0)+ReadingsVal("$SELF","Active_P_L2",0)+ReadingsVal("$SELF","Active_P_L3",0)));;\
\
  if (AttrVal("$SELF","verbose",0) >=3){Log 3, "$SELF cmd_1 : Summen berechnet"}\
\
  ## Statistiken berechnen\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv1_Day ".(ReadingsVal("$SELF","Energy_L1",0)-ReadingsVal("$SELF","Meter_init_yield_Day_L1",0)));;\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv2_Day ".(ReadingsVal("$SELF","Energy_L2",0)-ReadingsVal("$SELF","Meter_init_yield_Day_L2",0)));;\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv3_Day ".(ReadingsVal("$SELF","Energy_L3",0)-ReadingsVal("$SELF","Meter_init_yield_Day_L3",0)));;\
  CommandSetReading(undef, "$SELF Statistic_Yield_Day ".(ReadingsVal("$SELF","Statistic_EnergyPv1_Day",0)+ReadingsVal("$SELF","Statistic_EnergyPv2_Day",0)+ReadingsVal("$SELF","Statistic_EnergyPv3_Day",0)));;\
\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv1_Month ".(ReadingsVal("$SELF","Energy_L1",0)-ReadingsVal("$SELF","Meter_init_yield_Month_L1",0)));;\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv2_Month ".(ReadingsVal("$SELF","Energy_L2",0)-ReadingsVal("$SELF","Meter_init_yield_Month_L2",0)));;\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv3_Month ".(ReadingsVal("$SELF","Energy_L3",0)-ReadingsVal("$SELF","Meter_init_yield_Month_L3",0)));;\
  CommandSetReading(undef, "$SELF Statistic_Yield_Month ".(ReadingsVal("$SELF","Statistic_EnergyPv1_Month",0)+ReadingsVal("$SELF","Statistic_EnergyPv2_Month",0)+ReadingsVal("$SELF","Statistic_EnergyPv3_Month",0)));;\
\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv1_Year ".(ReadingsVal("$SELF","Energy_L1",0)-ReadingsVal("$SELF","Meter_init_yield_Year_L1",0)));;\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv2_Year ".(ReadingsVal("$SELF","Energy_L2",0)-ReadingsVal("$SELF","Meter_init_yield_Year_L2",0)));;\
  CommandSetReading(undef, "$SELF Statistic_EnergyPv3_Year ".(ReadingsVal("$SELF","Energy_L3",0)-ReadingsVal("$SELF","Meter_init_yield_Year_L3",0)));;\
  CommandSetReading(undef, "$SELF Statistic_Yield_Year ".(ReadingsVal("$SELF","Statistic_EnergyPv1_Year",0)+ReadingsVal("$SELF","Statistic_EnergyPv2_Year",0)+ReadingsVal("$SELF","Statistic_EnergyPv3_Year",0)));;\
\
  CommandSetReading(undef, "$SELF Statistic_Yield_Total ".(ReadingsVal("$SELF","Energy_L1",0)+ReadingsVal("$SELF","Energy_L2",0)+ReadingsVal("$SELF","Energy_L3",0)));;\
\
  if (AttrVal("$SELF","verbose",0) >=3){Log 3, "$SELF cmd_1 : Statistiken berechnet"}\
}\
\
################################################################################################################\
## 2 Jeden Morgen die Zählerstände aktualisieren, damit die Statistiken berechnet werden können\
##\
DOELSEIF\
([00:01])\
{\
  CommandSetReading(undef, "$SELF Meter_init_yield_Day_L1 [shelly01:energy]");;\
  CommandSetReading(undef, "$SELF Meter_init_yield_Day_L2 [shelly02:energy]");;\
  CommandSetReading(undef, "$SELF Meter_init_yield_Day_L3 [shelly03:energy]");;\
\
  if (AttrVal("$SELF","verbose",0) >=3){Log 3, "$SELF cmd_2 : Tageszähler initialisiert"};;\
\
  if ($mday eq 1)\
   {\
    CommandSetReading(undef, "$SELF Meter_init_yield_Month_L1 [shelly01:energy]");;\
    CommandSetReading(undef, "$SELF Meter_init_yield_Month_L2 [shelly02:energy]");;\
    CommandSetReading(undef, "$SELF Meter_init_yield_Month_L3 [shelly03:energy]");;\
    if (AttrVal("$SELF","verbose",0) >=3){Log 3, "$SELF cmd_2 : Monatszähler initialisiert"};;\
\
    if ($yday eq 1)\
     {\
      CommandSetReading(undef, "$SELF Meter_init_yield_Year_L1 [shelly01:energy]");;\
      CommandSetReading(undef, "$SELF Meter_init_yield_Year_L2 [shelly02:energy]");;\
      CommandSetReading(undef, "$SELF Meter_init_yield_Year_L3 [shelly03:energy]");;\
      if (AttrVal("$SELF","verbose",0) >=3){Log 3, "$SELF cmd_2 : Jahreszähler initialisiert"};;\
     }\
   }\
}\
\
################################################################################################################\
## X Jeden Morgen die Zählerstände vom EVU aktualisieren, damit im Schwarm die Statistiken berechnet werden können\
##\
DOELSEIF\
([00:02])\
{\
  ## Hier die Zählerstände vom EVU ähnlich meinem Muster setzen\
  CommandSetReading(undef, "$SELF Message Kein EVU Zähler konfiguriert");;\
}\

attr WR_x DbLogExclude .*
attr WR_x DbLogInclude Active_P_.*,Energy_.*,Total_.*,Statistic_.*
attr WR_x alias WR_1
attr WR_x do always
attr WR_x group PV Steuerung
attr WR_x icon sani_solar
attr WR_x room Strom->Photovoltaik
attr WR_x verbose 3
attr WR_x webCmd cmd_1
attr WR_x webCmdLabel Aktualisieren :

setstate WR_x 2021-04-29 10:21:47 Active_P_L1 0
setstate WR_x 2021-04-29 10:21:47 Active_P_L2 0
setstate WR_x 2021-04-29 10:21:47 Active_P_L3 0
setstate WR_x 2021-04-29 10:21:47 Energy_L1 0
setstate WR_x 2021-04-29 10:21:47 Energy_L2 0
setstate WR_x 2021-04-29 10:21:47 Energy_L3 3497.2
setstate WR_x 2021-04-29 09:14:03 Meter_init_yield_Day_L1 0
setstate WR_x 2021-04-29 09:26:18 Meter_init_yield_Day_L2 0
setstate WR_x 2021-04-29 09:14:03 Meter_init_yield_Day_L3 0
setstate WR_x 2021-04-29 09:27:44 Meter_init_yield_Month_L1 0
setstate WR_x 2021-04-29 09:27:56 Meter_init_yield_Month_L2 0
setstate WR_x 2021-04-29 09:28:09 Meter_init_yield_Month_L3 0
setstate WR_x 2021-04-29 09:29:33 Meter_init_yield_Year_L1 0
setstate WR_x 2021-04-29 09:29:22 Meter_init_yield_Year_L2 0
setstate WR_x 2021-04-29 09:29:07 Meter_init_yield_Year_L3 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv1_Day 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv1_Month 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv1_Year 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv2_Day 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv2_Month 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv2_Year 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv3_Day 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv3_Month 0
setstate WR_x 2021-04-29 10:21:47 Statistic_EnergyPv3_Year 0
setstate WR_x 2021-04-29 10:21:47 Statistic_Yield_Day 0
setstate WR_x 2021-04-29 10:21:47 Statistic_Yield_Month 0
setstate WR_x 2021-04-29 10:21:47 Statistic_Yield_Total 0
setstate WR_x 2021-04-29 10:21:47 Statistic_Yield_Year 0
setstate WR_x 2021-04-29 10:21:47 Total_AC_Active_P 0


Solltest Du Dich entscheiden die Namen des Devices und der readings so beizubehalten, dann dürftest Du Dich auf der Kostal Plenticore Wiki Seite auch zurecht finden :-)

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

#4
Zitat von: ddd am 28 April 2021, 14:44:48
Das die Leistungsmessung mit den Shellys nicht optimal ist, das ist mir schon klar.
Bei den Shellys musst Du aufpassen, da sich die energy Zähler bei einem Reset wieder auf Null setzen.
Das solltest Du immer mal wieder prüfen und dann bei den "Meter_init_yield_.*" Werten als Offset aufaddieren.
Bei Tag und Monat wäre es relativ schnell wieder okay, Jedoch beim Jahreszähler fällt es erst sehr spät auf.
Auch bei den Berechnungen solltest Du da mal drüber nach denken.

Für mein DOIF Beispiel musst Du die "Meter_init_yield_.*" readings auch einmal setzen, ansonsten kommen da Fehlermeldungen weil die readings fehlen.

Beim RAW kannst Du noch ein setstate verwenden oder halt ein setreading für jeden Wert
Anstelle von 0 kannst Du dann Deinen Zählerstand verwenden.

setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Day_L1 0
setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Day_L2 0
setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Day_L3 0
setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Month_L1 0
setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Month_L2 0
setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Month_L3 0
setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Year_L1 0
setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Year_L2 0
setstate WR_1 2021-04-28 16:57:00 Meter_init_yield_Year_L3 0


Nach einem Save Config im Fhem werden die reading mit den letzten gesicherten Werten wiederhergestellt.

Gruß
   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

#5
Und nochmal ich :-)
Den Hausverbrauch und die Einspeisung bekommst Du nur über den EVU Zähler berechnet oder mit einem SmartMeter.

Hier geht's übrigens zum Kostal Plenticore Thread
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

ddd

Hallo,

habe das mal für mich angepasst.

Er mag nur den Befehl:
attr WR_1 DbLogExclude .*
attr WR_1 DbLogInclude Active_P_.*,Energy_.*,Total_.*,Statistic_.*

nicht.

WR_1 DOIF: expected DOELSEIF or DOELSE: attr WR_1 DbLogExclude .*


Den Hausverbrauch will ich momentan nicht abrufen, mir gehts es nur um die Erzeugte Energie.
Den EVU Zähler will ich eh noch nicht auslesen. Zuerst mal die PV sauber einbinden dann sehen wir weiter.

LG

ch.eick

Zitat von: ddd am 29 April 2021, 07:12:14
Den Hausverbrauch will ich momentan nicht abrufen, mir geht's es nur um die Erzeugte Energie.
Den EVU Zähler will ich eh noch nicht auslesen. Zuerst mal die PV sauber einbinden dann sehen wir weiter.

Moin,
ich habe es nochmal für Dich umgebaut und hier aktualisiert.

Ohne den EVU Zähler oder eine andere Messeinrichtung hinter dem Zähler kannst Du nicht den Hausverbrauch und die Einspeisung bestimmen.
Autarkie und Eigenverbrauch fehlen dann natürlich auch.

Ein KSEM oder SMA EM 20 in den online Portalen liegt bei 345€ neu
SMA Energy Meter 10, gebraucht bei 100€

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

ddd

Zitat von: ch.eick am 29 April 2021, 10:33:47
Ohne den EVU Zähler oder eine andere Messeinrichtung hinter dem Zähler kannst Du nicht den Hausverbrauch und die Einspeisung bestimmen.
Autarkie und Eigenverbrauch fehlen dann natürlich auch.

Hallo,

Ich will ja momentan nicht den Eigenverbrauch bestimmen oder den Autarkiegrad, sonder nur die Leistung welche ich mir selbst erzeuge.
Mit meiner Schaltung kann ich das schon machen, da mein Zähler so eingebaut ist, dass er nur die erzeugte Energie Zählt und nicht die die er bezieht.

Ob das jetz zu 100% stimmt oder nicht sei da mal in den Raum gestellt.

Ich habe mir den Code noch mal ins FHEM kopiert muss aber zuerst die Anbindung an die DB herstellen um das korrekt auzulesen.

LG
Daniel

ch.eick

Zitat von: ddd am 29 April 2021, 16:14:35
Ich will ja momentan nicht den Eigenverbrauch bestimmen oder den Autarkiegrad, sonder nur die Leistung welche ich mir selbst erzeuge.
Mit meiner Schaltung kann ich das schon machen, da mein Zähler so eingebaut ist, dass er nur die erzeugte Energie Zählt und nicht die die er bezieht.

Ich habe mir den Code noch mal ins FHEM kopiert muss aber zuerst die Anbindung an die DB herstellen um das korrekt auzulesen.
Die Zähler solltest Du besser zuerst im Device überprüfen.
Du hattest von Einspeisung geschrieben, das ist dann ins Grid.
Bei Dir stellt jeder Shelly einen Modul String dar, jedoch wird es bei Dir in AC Leistung dargestellt.

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