FHEM Forum

FHEM - Energiemanagement und Energieerzeugung => Solaranlagen => Thema gestartet von: ch.eick am 07 Oktober 2020, 16:09:12

Umfrage
Frage: dummy
Antwort 1: 1
Antwort 2: 2
Titel: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Oktober 2020, 16:09:12
Hallo zusammen,
da es von mir mehrere Threads zu diesem Thema gegeben hat fasse ich nun alles hier zusammen und schließe die anderen.

Dokumentiert wird alles auf der Wiki Seite Kostal_Plenticore_10_Plus (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus)

Es geht um folgende Themen:

  • Plenticore 10 Plus
  • KSEM
  • BYD HV
  • Forecast/Leistungsprognose
  • Bilanz
  • Eigenverbrauch Steuerung

Das Wiki umfasst momentan folgende Einträge

Stand 2020.10.07
Inhaltsverzeichnis
1 Voraussetzungen Energietechnik
2 Geräte-Registrierung
3 Hersteller Dokumentation
4 Einbindung in das Netzwerk
5 Voraussetzungen FHEM Umfeld
5.1 Alle Geräte müssen mit TCP/IP erreichbar sein
5.2 Alle Module sollten auf einem aktuellen Stand sein
5.3 Python
5.3.1 Ein Python 3 sollte vorhanden sein
5.3.2 Es müssen folgende Python Module vorhanden sein
5.4 Eine LogDB/LogDBRep sollte bereits vorhanden sein, was hier nicht weiter erklärt wird.
5.5 Verwendete Module
6 Einbindung in FHEM: Überblick
6.1 Hardware Anbindung (alles über LAN)
6.1.1 Kostal Plenticore Plus
6.1.1.1 Kostal Plenticore Plus die Basis information (Modbus/TCP)
6.1.1.1.1 Plenticore Modbus Definition
6.1.1.1.2 Modbus Timing
6.1.1.1.3 RAW Definition des konfigurations Dummy
6.1.1.1.4 RAW Definition des Wechselrichters
6.1.1.1.5 Userreadings
6.1.1.2 Kostal Plenticore Plus die API (über HTTPMOD mit Python Skript Authentifizierung)
6.1.1.2.1 Umstellungsaufwand, falls jemand früher eingestiegen ist.
6.1.1.2.2 Plenticore API
6.1.1.2.3 Dateiverzeichnis
6.1.1.2.4 Python 3
6.1.1.2.5 Passworte
6.1.1.2.6 plenticore_auth_* Erläuterung
6.1.1.2.7 plenticore_auth_finish
6.1.1.2.8 plenticore_auth_session
6.1.1.2.9 Ablaufbeschreibung PV_Anlage_1_API
6.1.1.2.10 Automatischer Login mit Sessionaufbau
6.1.1.2.11 RAW Definition des PV_Anlage_1_API
6.2 Kostal Smart Energy Manager (KSEM) (Modbus/TCP)
6.2.1 RAW Definition des KSEM
6.3 BYD Speicher (mit HTTPMOD)
6.3.1 RAW Definition BYD_Status
7 Timeing für die PV extra Funktionen
7.1 RAW Definition PV_Schedule (DOIF)
8 Energie Bilanz
8.1 RAW Definition Energiebilanz
8.2 Erstellen von zusätzlichen Werten in der Datenbank
8.2.1 RAW Definition LogDBRep_PV_total_diff_Week
8.2.2 RAW Definition LogDBRep_PV_total_max_Month
8.2.3 RAW Definition LogDBRep_PV_used_diff_Week
8.2.4 RAW Definition LogDBRep_PV_used_max_Month
8.3 Timing für die Datenbank Einträge
8.4 Löschen von nicht mehr benötigten Werten in der Datenbank
9 Wetter-/Leistungs-Prognose
9.1 Deutscher Wetter Dienst (DWD)
9.1.1 RAW Definition DWD_Forecast
9.2 99_myUtils.pm Funktionen
9.2.1 Solar_forecast
9.2.2 Solar_Plain
9.2.3 Forecast Basiseinstellung
9.2.4 Berücksichtigung von Temperatur, Bewölkung und Regen
9.2.4.1 Temperatur
9.2.4.2 Wolken und Regen
9.3 wunderground
9.4 RAW Definition Wetter_<Wohnort>
10 Diagramme
10.1 RAW Definition Hauptverbraucher
10.1.1 SVG_LogDB_Photovoltaik_2
10.1.2 GPLOTFILE SVG_LogDB_Photovoltaik_2.gplot
10.2 RAW Definition Leistungsbezug
10.2.1 SVG_LogDB_Photovoltaik_3
10.2.2 GPLOTFILE SVG_LogDB_Photovoltaik_3.gplot
10.3 RAW Definition PV_Bilanz
10.3.1 SVG_LogDB_PV_Bilanz
10.3.2 GPLOTFILE SVG_LogDB_PV_Bilanz.gplot
10.4 RAW Definition Forecast / Calculation
10.4.1 SVG_LogDB_Photovoltaik_4
10.4.2 GPLOTFILE SVG_LogDB_Photovoltaik_4.gplot
11 PV Eigenverbrauch-Steuerung
11.1 Beispiel Luft Wärme Pumpe
11.1.1 RAW Definition LWP_LuftWärmePumpe (dummy Modul)
11.1.2 RAW Definition LWP_PV (DOIF Modul)
11.1.3 RAW Definition rg_LWP_Status (readingsGroup Modul)
11.2 Beispiel Pool
11.2.1 RAW Definition Pool_Softube (dummy Modul)
11.2.2 RAW Definition Pool_PV (DOIF Modul)
11.2.3 RAW Definition Pool_Signale (Shelly Modul: shelly1pm)
11.2.4 RAW Definition Pool_Counter (HourCounter Modul)
11.2.5 RAW Definition rg_Pool_Status (readingsGroup Modul)
11.3 Beispiel Waschmaschine (mit Walzenschalter ;-) )
11.3.1 RAW Definition Waschmaschine (dummy Modul)
11.3.2 RAW Definition Waschmaschine_PV (DOIF Modul)
11.3.3 RAW Definition Waschmaschine_Signale (Shelly Modul: shelly1pm)
11.3.4 RAW Definition Waschmaschine_Counter (HourCounter Modul)
11.3.5 RAW Definition rg_Waschmaschine_Status (readingsGroup Modul)
12 Problemlösung
13 Projekte der FHEM-Community
14 Links


Gruß
   Christian
Titel: Antw:Photovoltaik mit Eigenverbrauch Steuerung (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Oktober 2020, 10:54:25
Moin,
ein Newsletter mit Informationen, die bisher verstreut waren:

durch einen Test von einem anderen Mitstreiter hat sich herausgestellt, dass BYD nun die neue Version des Speichers BYD_HVS ausliefert. Dieser neue Speicher hat anscheinend noch kein WebGui und wird nur über eine Handy App Konfiguriert. Leider kann man den somit nicht mit meiner Lösung abfragen.

BYD HV Speicher (nicht HVS!)
Diese Speicher wird über das httpmod Modul angesprochen, ist jedoch noch nicht bis in die letzten Tiefen abfragbar.
Der Begriff "Array" bezeichnet einen Speicher mit mehreren Modulen, die mit dem Series_Battery_Counts angegeben werden. Eine Battery hat dabei ca. 1.28 KW und kann über RunData.asp mit weiteren details abgefragt werden. Momentan ist jedoch noch keine gezielte Abfrage der Module 2-n über "get BYD_Status RunData" möglich.

BYD_Speicher HV mit HTTPMOD (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#BYD_Speicher_.28mit_HTTPMOD.29)

Update: 2020.10.08
Für den bisherigen BYD_HV habe ich eine Aktualisierung im Wiki eingefügt.
Man kann jetzt über ein get den Wert Series_Battery_Counts auslesen und in einem userreading wird dieser mit 1.28 zur Gesamtkapazität berechnet.


InstallationConfig_Array_Counts 1
InstallationConfig_Array_Power 8.96
InstallationConfig_Installation_Time 2020-1-5 13:36:8
InstallationConfig_Series_Battery_Counts 7


Gruß
     Christian
Titel: Antw:Photovoltaik mit Eigenverbrauch Steuerung (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Oktober 2020, 13:02:39
EDIT: Die Einspeisung ist nun auch im PV_Anlage_1_API Device integriert und in den userreadings aufgenommen worden.

Hallo zusammen,
es wurde nun bereits mehrfach nach der Darstellung der Einspeisung nachgefragt.
Hier liefert der Kostal Plenticore bereits sehr viele Informationen, bei denen man dann noch die Batterie, falls vorhanden, berücksichtigen muss.
Die Ladung der Batterie ist nicht als Einspeisung zu werten.

Meine Interpretation ist in dem Device Dum.Energie im userreading beinhaltet.
Möchte man nun einen Plot erstellen und die Einspeisung, bzw den Netzbezug darstellen, so kann man dies am einfachsten aus dem Dum.Energie Device machen,
oder muss eventuell die gewünschten userreadings zusätzlich in das PV_Anlage_1 Device übernehmen.

Dum.Energie readings

READINGS:
     AutarkyQuote   
     AutarkyQuoteDay
     AutarkyQuoteMonth
     AutarkyQuoteYear
     GridConsumption <<< Netzbezug
     GridConsumptionDay
     GridConsumptionMonth
     GridConsumptionYear
     GridFeedIn      <<< Einspeisung
     GridFeedInDay   
     GridFeedInMonth
     GridFeedInYear 
     PV             
     PVDay           
     PVMonth         
     PVTotal         
     PVTotalDay     
     PVTotalMonth   
     PVTotalYear     
     PVYear         
     SelfConsumptionQuote
     SelfConsumptionQuoteDay
     SelfConsumptionQuoteMonth
     SelfConsumptionQuoteYear
     TotalConsumption
     TotalConsumptionDay
     TotalConsumptionMonth
     TotalConsumptionYear

Bei diesen Readings handelt es sich um Statistiken, die nicht mit einer hohen Frequenz geschrieben werden. Sie eignen sich somit nicht für eine Berechnung von Verbräuchen, diese sollten besser aus dem PV_Anlage_1 Device bezogen werden, wobei wahrscheinlich die meisten Werte bereits schon vorhanden sein werden.

Eine Abfrage des KSEM ist in Verbindung mit dem Plenticore nicht notwendig und würde die LAN Belastung nur unnötig erhöhen. Wesentliche Werte vom KSEM werden vom Plenticore über RS485 oder LAN gelesen und vom Plenticore über ModBus/TCP bereit gestellt.

PV_Anlage_1

Total_active_power_(powermeter)   <<< Liefert als +/- Wert die Information vom KSEM, hierbei bedeutet - eine Einspeisung und + den Netzbezug
Home_own_consumption_from_grid   <<< zeigt nur den Netzbezug, jedoch nicht die Einspeisung

Um readings mit "(" ins Logging aufzunehmen ist zu beachten, dass "(" und ")" im Regex als Gruppenkennzeichnis verwendet wird und deshalb bei event-on-* maskiert werden muss.

DBLogInclude Total_active_power_\(powermeter\),Act_state_of_charge,Actual_battery_charge_-minus_or_discharge_-plus_Power,Actual_battery_charge_usable_Power,Battery_temperature,Home_own_consumption_from_PV,Home_own_consumption_from_battery,Home_own_consumption_from_grid,Power_DC1,Power_DC2,Power_DC_Sum,Total_DC_Power,Total_DC_Power_Max,Total_PV_Power_reserve,Solar_.*

event-on-change-reading Total_active_power_\(powermeter\),Act_state_of_charge,Actual_battery_charge_.*,Battery_temperature,Home_own_consumption_from_.*,Power_DC1,Power_DC2,Power_DC_Sum,Total_DC_Power,Total_DC_Power_Max,Total_PV_Power_reserve,Solar_.*

# Ergebnis in der DbLog...
| 2020-10-16 13:28:57 | PV_Anlage_1 | Total_active_power_(powermeter)                       | -4.70 |
| 2020-10-16 13:29:52 | PV_Anlage_1 | Total_active_power_(powermeter)                       | -6.20 |


PV_KSEM

M_AC_Power  <==> Total_active_power_(powermeter)


Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Oktober 2020, 18:13:44
EDIT: Achtung, dieser Update kann entfallen und mit dem nächsten Post kombiniert werde, da das PV_Anlage_1_Bilanz Device in der Zwischenzeit komplett entfallen kann.


Hallo nochmal,

es gab da noch eine Unsauberkeit bei der Namensgebung für die Bilanz.
Das Device Dum.Energy wurde nun umbenannt in PV_Anlage_1_Bilanz. Die Plots ändern sich somit ebenfalls, da sie auf das Device in der Datenbank zugreifen.
Ein Vorteil dieser Änderung ist, dass bei einem SELECT in der Datenbank mit "DEVICE LIKE 'PV_Anlage_1%'" nun alle READING sehr einfach zu erreichen sind.

Alle diejenigen, die bereits vor diesem Datum eingestiegen sind müssen dann jedoch noch die Einträge in der DbLog umschreiben.
Als aller erstes solltet Ihr mal einen aktuellen Backup der Datenbank erstellen, bei einem Fehler durch die falsche Auswähl wäre ansonsten alles weg :-(

Danach geht's dann weiter

# zuerst bitte genau nachschauen, dass Ihr auch die richtigen Einträge erwischt.
SELECT TIMESTAMP,DEVICE,READING,VALUE FROM history WHERE DEVICE='Dum.Energy' AND TIMESTAMP > '2020-01-01 00:00:00' ORDER BY TIMESTAMP LIMIT 500;

# Es ist wichtig, dass Ihr den alten TIMESTAMP beibehaltet!
UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_Bilanz' WHERE DEVICE='Dum.Energy' AND TIMESTAMP > '2020-01-01 00:00:00';


Bei mir war dann ca. 20 Minuten später alles wieder schön :-)

Hier kommt auch mal ein schönes SELECT, für Devices, bei denen einige readings nicht so häufig geschrieben werden ;-)

## Alle aktuellsten readings eines devices im letzten Tagesverlauf
SET @device = 'PV_Anlage_1_Bilanz';
SELECT t1.TIMESTAMP,t1.DEVICE,t1.READING,t1.VALUE
  FROM history t1
  INNER JOIN
   (select max(TIMESTAMP) AS TIMESTAMP,DEVICE,READING
      from history
      where DEVICE    = @device and
            TIMESTAMP > NOW() - INTERVAL 1 DAY
      group by READING) x
  ON x.TIMESTAMP = t1.TIMESTAMP AND
     x.DEVICE    = t1.DEVICE    AND
     x.READING   = t1.READING;


Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Oktober 2020, 17:32:34
EDIT 2020.10.21 Diese Bereinigung und Umstellung wäre dann nun erledigt. Ein späterer Schritt könnte dann noch das weitere Aufräumen der readings im PV_Anlage_1_API Device sein.

     Vielen Dank für Euer Gehör
           Christian

EDIT 2020.10.21 Das stateFormat wurde nochmals nachgearbeitet
EDIT 2020.10.21 Es wurde im PV_Schedule Device ein 5 Minuten Update für "get PV_Anlage_1_API 04_/auth/me" eingerichtet, damit das stateFormat die Aktuellen Werte häufiger aktualisiert.
EDIT 2020.10.21 Unten sind nun auch SQL zum Löschen in der Datenbank, aber erst einen Backup machen, wenn Ihr nicht sicher seit!
EDIT 2020.10.21 Im Dum.Energie => PV_Anlage_1_Bilanz tauchen jetzt in der Datenbank nur nor die Momentanwerte auf, die in der Form nicht benötigt werden.
                         Weiter unten in diesem Post habe ich noch eine sql SELECT eingefügt, um diese zu zeigen.
                         Der nächste Schritt ist nun das Löschen vom Dum.Energie bzw PV_Anlage_1_Bilanz und auch das löschen der restlichen DB Einträge.
                         Bitte achtet vorher darauf, dass Ihr alle Werte, die noch gewünscht sind zum PV_Anlage_1_API Device migriert habt.
EDIT 2020.10.21 Für die bereits in der DB erzeugten diff und max Werte habe die SQL Statements für die Migration unten hinzugefügt
EDIT 2020.10.21 Das stateFormat und userreading fon PV_Anlage_1API wurde für die Statistic_ der Bilanz angepasst. Ein Bild hängt an.
                         Momentanwerte werden hier nicht ins Log geschrieben, da sie nur der Übersicht dienen sollen.
EDIT 2020.10.20 Unten findet Ihr jetzt auch die SQL Statements für die Datenbank Änderung der readings.
EDIT 2020.10.20 Das PV_Anlage_1_Bilanz Device ist nun ebenfalls im Wiki aktualisiert. Das userreading holt nun die Werte aus dem _API Device.


Und das Aufräumen geht weiter.

Im Device PV_Anlage_1_Bilanz werden zur Zeit im userreading erweiterte Statistiken berechnet, die zum Device PV_Anlage_1_API gehören, was jedoch historisch bedingt noch nicht existiert hatte. Somit wandern diese readings dann jetzt in das richtige Device.

Betroffen sind zur Zeit folgende readings, die dann auch den Zusatz "Statistic_" bekommen
EDIT: Hierzu gibt es bereits einen aktuelleren Eintrag, damit die Namen besser zu denen vom Plenticore passen!

PVDay
PVMonth
PVYear

GridFeedInDay
GridFeedInMonth
GridFeedInYear

TotalConsumptionDay
TotalConsumptionMonth,
TotalConsumptionYear


Die Berechnungen für die Momentan Werte wird erst einmal bleiben, da diese ja nicht statistisch sind.

Im Device PV_Anlage_1_API sind die oben genannten Werte dann noch in Watt und werden anschließend im PV_Anlage_1_Bilanz Device in Kilowatt dargestellt.

Die Aktualisierung ist bereits im Wiki. Bitte beachtet, dass im Anschluss noch die Änderung im Bilanz Device folgen muss, da ansonsten doppelte werte in der Datenbank sein werden.
Bisherige Werte aus dem Bilanz Device können dann natürlich in der Datenbank später dem neuen Device zugeordnet werden und gehen somit nicht verloren. Die Vorgehensweise dürfte bereits bekannt sein.

Ich habe es natürlich jetzt schon gemacht, aber bitte prüft die SQL Statements vorher und macht auch vorher einen Backup.
EDIT: Achtung, an dieser Stelle kann man auch direkt zu den endgültigen Namen vom 2020.10.22 umziehen.

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_TotalConsumptionDay', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='TotalConsumptionDay' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_TotalConsumptionMonth', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='TotalConsumptionMonth' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_TotalConsumptionYear', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='TotalConsumptionYear' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_PVDay', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='PVDay' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_PVMonth', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='PVMonth' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_PVYear', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='PVYear' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_GridFeedInDay', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='GridFeedInDay' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_GridFeedInMonth', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='GridFeedInMonth' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='Statistic_GridFeedInYear', VALUE=round(VALUE*1000,2)
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='GridFeedInYear' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='max_month_Statistic_PVMonth'
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='max_month_PVMonth' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='max_month_Statistic_PVTotalMonth'
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='max_month_PVTotalMonth' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='diff_week_Statistic_PVMonth'
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='diff_week_PVMonth' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, DEVICE='PV_Anlage_1_API', READING='diff_week_Statistic_PVTotalMonth'
   WHERE DEVICE='PV_Anlage_1_Bilanz' and READING='diff_week_PVTotalMonth' AND TIMESTAMP > '2020-01-01 00:00:00';

###################### Achtung, das ist zum Löschen, also Backup machen oder sich sicher sein :-) ###################

delete FROM history WHERE DEVICE='PV_Anlage_1_Bilanz' AND TIMESTAMP > '2020-01-01 00:00:00';


Die Reste vom Dum.Energie bzw PV_Anlage_1_Bilanz Device in der Datenbank

SELECT TIMESTAMP,DEVICE,READING,VALUE FROM history WHERE DEVICE='PV_Anlage_1_Bilanz' AND TIMESTAMP > '2020-01-01 00:00:00' order BY TIMESTAMP limit 500;

snip ...
| 2020-10-21 10:45:00 | PV_Anlage_1_Bilanz | AutarkyQuote         | 90    |
| 2020-10-21 10:45:00 | PV_Anlage_1_Bilanz | GridConsumption      | 20    |
| 2020-10-21 10:45:00 | PV_Anlage_1_Bilanz | GridFeedIn           | 0     |
| 2020-10-21 10:45:00 | PV_Anlage_1_Bilanz | PV                   | 641   |
| 2020-10-21 10:45:00 | PV_Anlage_1_Bilanz | PVTotal              | 734   |
| 2020-10-21 10:45:00 | PV_Anlage_1_Bilanz | SelfConsumptionQuote | 87    |
| 2020-10-21 10:45:00 | PV_Anlage_1_Bilanz | TotalConsumption     | 714   |
snip ...


Der Trigger von diesem Device ist im PV_Schedule enthalten und kann dann auch raus.


Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Oktober 2020, 13:19:49
Es ist nun wiederkehrend die Frage aufgetaucht, warum das Aufsummieren von einzel readings aus der Datenbank, z.B. für den Tagesertrag stark vom Zählerstand für die Einspeisung abweicht.
Ich versuche dies dann mal zu erklären :-)

Die Devices arbeiten mit event-on-change reading, wobei somit im Nachgang in der Datenbank zum Teil unregelmäßige Einträge entstehen und diese dann auch noch vom Abstand zwischen den Triggerzeiten abhängig sind.

Vom reading "Total_active_power_(powermeter)" wäre der negative Teil die Einspeisung ins Netz.
Dargestellt, aber nicht gelogged, wird dies im Device PV_Anlage_1 im stateFormat . Hier erscheit also entweder 0 oder ein Wert in Watt.

(ReadingsVal("PV_Anlage_1","Total_active_power_(powermeter)",0)<=0 ? abs(round(ReadingsVal("PV_Anlage_1","Total_active_power_(powermeter)",0),0)):  0)." W";


Würde man nun versuchen die negativen Werte des reading "Total_active_power_(powermeter)" in der Datenbank zu summieren, so stellt man fest, dass die Summe nicht dem Zählerstand des EVU entspricht.

Gründe dafür sind:
- Der Abfrage Zyklus mit 60 Sekunden ist für eine Messung recht grob, das macht der KSEM mindestens im Sekunden Bereich.
- Durch die grobe Abfrage fallen dann auch noch Werte heraus, die dazwischen beginnen und enden. Dies wäre z.B. das 40 Sekunden Händewaschen mit einem 21 KW Durchlauferhitzer ;-)
- Wird direkt hintereinander Abgefragt und der Wert hat sich nicht geändert, kommt auch kein neuer Eintrag in die Datenbank.
- Dies führt dazu, dass man bei der Abfrage der Datenbank auch das Delta des TIMESTAMP berücksichtigen muss, was zusätzlich ungenau wird.

Abhilfe schafft hier jedoch der Plenticore mit seinen Statistiken, die die Tages-, Monats- und Jahressummen liefern. Diese werden nun bereits durch das PV_Anlage_1_API Device stündlich abgefragt und bei Änderung ins Log geschrieben. Am ende des Tages kann man dann die zwischen Werte Löschen und nur den letzten Tageswert behalten, bzw den letzten Monats- oder Jahreswert.

Dies wird dann in einem nächsten Schritt hier noch ergänzt werden.

Desweiteren vermute ich, dass sich jeder über kurz oder lang einen Lesekopf auf den EVU Zähler installieren wird, wodurch sich dann die Zwischenschritte ablesen lassen.

Wer den KSEM zusätzlich ausliest bekommt hier die entsprechenden Register ebenfalls angezeigt, die dann jedoch noch mit einem Offset mit dem EVU Zähler synchronisiert werden sollte.
Achtung, wenn der KSEM zurück gesetzt wird, beginnt er wieder bei Null ;-)

obj-h512-reading Active_energy+ 2125.7094
obj-h516-reading Active_energy- 3709.5486
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Oktober 2020, 14:36:04
Und noch eine Nachricht.

Da ja nicht alle elektrische Großverbraucher haben und ich den Sommer über auch kleinere Geräte angeschlossen habe gibt es nun weitere Beispiele im Wiki.

- Accu laden, z.B. Rasenroboter und E-Bike
- Brunnenpumpe mit extra Taster am Shelly2.5 und Endabschaltung bei Nichtbenutzung

Bei diesen Beispielen teilen sich die Geräte einen Shelly2.5 , was die Kosten auf gerade mal 25€ zusammen senkt.
Natürlich ohne Steckdosen und Taster :-)
Weiterhin ist die Lösung auch noch über das WLan zu verbinden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Oktober 2020, 11:28:49
Hallo zusammen,
auf vielfachen Wunsch meiner Ideen ;-) und einem weiteren Mitstreiter gibt es eine Bereinigung im PV_Anlage_1_API Device.
Nun sollten aber so ziemlich alle Wünsche erfüllt sein und viele Berechnungen in DOIFs erledigt sein.


- attr PV_Anlage_1_API DbLogInclude Statistic_Autarky.*,Statistic_Energy.*,Statistic_Own.*,Statistic_Total.*,Statistic_Yield.*,Statistic_PV.*,Statistic_Grid.*
- stateFormat aus dem Wiki
- userreading aus dem Wiki

Es wurden readings umbenannt, damit die userreadings besser zu den Plenticore readings passen
Die Einspeisung ins Netz:
  Statistic_EnergyFeedInGrid_Day
  Statistic_EnergyFeedInGrid_Month
  Statistic_EnergyFeedInGrid_Year
Der Hausverbrauch als Summe vom direkten PV und der Batterie
  Statistic_EnergyHomePvSum_Day
  Statistic_EnergyHomePvSum_Month
  Statistic_EnergyHomePvSum_Year

Weiterhin gibt es nun den ertrag ohne die Batterie, weil Statistic_Yield_Day laut Kostal die Batterie enthält.
  Statistic_Yield_NoBat_Day
  Statistic_Yield_NoBat_Month
  Statistic_Yield_NoBat_Year

## einmal kann man alle Statistic_ readings löschen und wieder neu einlesen
deletereading PV_Anlage_1_API Statistic_*
get PV_Anlage_1_API 20_/processdata/scb_statistic_EnergyFlow


wie immer müssen jetzt natürlich bereits vorhandene Logeinträge zu den neuen reading Namen umgezogen werden. Bitte schaut dazu zu den bisherigen Posts und modifiziert die SQLs nach den jeweiligen Anforderungen.

EDIT: Okay, hier ein kleiner Überblick

SET @device = 'PV_Anlage_1_API';
SELECT t1.TIMESTAMP,t1.DEVICE,t1.READING,t1.VALUE
  FROM history t1
  INNER JOIN
   (select max(TIMESTAMP) AS TIMESTAMP,DEVICE,READING
      from history
      where DEVICE    = @device and
            TIMESTAMP > NOW() - INTERVAL 1 DAY
      group by READING) x
  ON x.TIMESTAMP = t1.TIMESTAMP AND
     x.DEVICE    = t1.DEVICE    AND
     x.READING   = t1.READING;

+---------------------+-----------------+------------------------------------+------------------+
| TIMESTAMP           | DEVICE          | READING                            | VALUE            |
+---------------------+-----------------+------------------------------------+------------------+
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_Autarky_Day              | 78.1824126685    |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_Autarky_Month            | 69.5112729702    |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_Autarky_Total            | 68.3550253426    |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_Autarky_Year             | 78.8398715615    |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyFeedInGrid_Day     | 5.77             |                  <<<<< neu
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyFeedInGrid_Month   | 29075.31         |                  <<<<< neu
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyFeedInGrid_Year    | 5189920.93       |                  <<<<< neu
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomeBat_Day        | 2150.2203689484  |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomeBat_Month      | 106338.785185352 |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomeBat_Total      | 1456290.5320946  |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomeBat_Year       | 1310352.66285165 |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomeGrid_Day       | 786.2094131098   |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomeGrid_Month     | 122445.10343664  |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomeGrid_Total     | 2197546.68945482 |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomeGrid_Year      | 1154187.37131264 |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomePvSum_Day      | 2818.75          |                  <<<<< neu
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomePvSum_Month    | 279224.58        |                  <<<<< neu
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomePvSum_Year     | 4292633.31       |                  <<<<< neu
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomePv_Day         | 668.5259759135   |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomePv_Month       | 172885.790277168 |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomePv_Total       | 3259074.38706554 |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHomePv_Year        | 2982280.64988293 |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHome_Day           | 3605.3363498516  |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHome_Month         | 401702.148528503 |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHome_Total         | 6898363.7820191  |
| 2020-10-23 11:44:35 | PV_Anlage_1_API | Statistic_EnergyHome_Year          | 5444758.72015098 |
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_GridFeedInDay            | 5.71             |                  <<<<< muss umziehen
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_GridFeedInMonth          | 29075.25         |                  <<<<< muss umziehen
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_GridFeedInYear           | 5189920.87       |                  <<<<< muss umziehen
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_OwnConsumptionRate_Day   | 99.7837913186    |
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_OwnConsumptionRate_Month | 90.5648443358    |
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_OwnConsumptionRate_Total | 47.4788047504    |
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_OwnConsumptionRate_Year  | 45.2677830054    |
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_PVDay                    | 2601.82          |                  <<<<< muss umziehen
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_PVMonth                  | 279007.65        |                  <<<<< muss umziehen
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_PVYear                   | 4292416.38       |                  <<<<< muss umziehen
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_TotalConsumptionDay      | 3353.05          |                  <<<<< muss umziehen
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_TotalConsumptionMonth    | 401417.77        |                  <<<<< muss umziehen
| 2020-10-23 10:57:00 | PV_Anlage_1_API | Statistic_TotalConsumptionYear     | 5446568.78       |                  <<<<< muss umziehen
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_TotalConsumption_Day     | 3410.02          |                  <<<<< neu
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_TotalConsumption_Month   | 401474.74        |                  <<<<< neu
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_TotalConsumption_Year    | 5446625.75       |                  <<<<< neu
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_Yield_Day                | 2644.0674482191  |
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_Yield_Month              | 308119.43733729  |
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_Yield_NoBat_Day          | 496.92           |                  <<<<< neu
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_Yield_NoBat_Month        | 201783.72        |                  <<<<< neu
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_Yield_NoBat_Year         | 8172024.20       |                  <<<<< neu
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_Yield_Total              | 9931163.91202423 |
| 2020-10-23 11:09:05 | PV_Anlage_1_API | Statistic_Yield_Year               | 9482373.79571359 |
+---------------------+-----------------+------------------------------------+------------------+

## Nun zum Umziehen, hier folgen noch SQLs, da ich es gerade live mache 2020.10.23 12:00 Uhr gestartet
UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_EnergyHomePvSum_Day' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_PVDay' AND TIMESTAMP > '2020-01-01 00:00:00';
UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_EnergyHomePvSum_Month' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_PVMonth' AND TIMESTAMP > '2020-01-01 00:00:00';
UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_EnergyHomePvSum_Year' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_PVYear' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_TotalConsumption_Day' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_TotalConsumptionDay' AND TIMESTAMP > '2020-01-01 00:00:00';
UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_TotalConsumption_Month' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_TotalConsumptionMonth' AND TIMESTAMP > '2020-01-01 00:00:00';
UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_TotalConsumption_Year' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_TotalConsumptionYear' AND TIMESTAMP > '2020-01-01 00:00:00';

UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_EnergyFeedInGrid_Day' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_GridFeedInDay' AND TIMESTAMP > '2020-01-01 00:00:00';
UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_EnergyFeedInGrid_Month' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_GridFeedInMonth' AND TIMESTAMP > '2020-01-01 00:00:00';
UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Statistic_EnergyFeedInGrid_Year' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_GridFeedInYear' AND TIMESTAMP > '2020-01-01 00:00:00';

## Bis hierhin hat es nun ca. 45 Minuten gebraucht.

Nun fehlen noch die Werte, die durch die Datenbank monatlich und wöchentlich erstellt werden, denn dort ändert sich durch die Namensänderung auch etwas.



Viele Grüße
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Oktober 2020, 18:55:56
Hallo zusammen,
ich hoffe es geht Euch nicht zu schnell.

Durch das Aufräumen der Datenbank und die Umbenennungen der readings  habe ich nun auch im Wiki den Bereich Erstellen von zusätzlichen Werten in der Datenbank (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Erstellen_von_zus.C3.A4tzlichen_Werten_in_der_Datenbank) mit den Plots für die Bilanz überarbeitet.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Oktober 2020, 11:07:32
Moin,

wem es noch nicht aufgefallen ist:
Man kann nun beim PV_Schedule die einzelnen DOIF direkt über den Status (mit Label) anklicken (direkt auf cmd_* klicken). Dann wird dieser Zweig sofort ausgeführt und berechnet z.B. dien Forecast_0  mit
den aktuellen DWD Daten neu.

Das Ergebnis im Diagramm wird natürlich durch den Datenbank Cache und den asynchronen Betrieb der Datenbank dann verzögert dargestellt.
Den Refresh Button vom Browser nicht vergessen, damit das SVG aktualisiert wird.

BYD_Status cmd_1           Das haben natürlich nur die, die den alten HVS Speicher haben und diesen bereits auslesen.
Statistic_Update cmd_2    holt auch zwischendurch die Statistiken ab und schreibt diese in die Datenbank
Forecast_0 cmd_3             Forecast heute
Forecast_1 cmd_4             Forecast Morgen
Bilanz_Actual cmd_5         aktualisiert im stateFormat vom PV_Anlage_1_API die aktuellen Werte
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Oktober 2020, 11:15:54
Und hier mal zwei aktuelle Bilder, wie es entstehen würde, wenn man dem Wiki folgt:
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Oktober 2020, 08:40:46
Guten Morgen zusammen,
da nun einige Photovoltaik Enthusiasten bis zur Leistungsprognose vorgedrungen sind gibt es hier mal wieder eine weitere Information.

Die Leistungsprognose wird von der Funktion Solar_forecast() in der 99_myUtils.pm errechnet. Diese Funktion bekommt unter anderem beim Aufruf den Zeitraum [0|1]  und das Log Device übergeben. Der Aufruf erfolgt für den aktuellen Tag, aus dem PV_Schedule Device, zwischen 07:00 und 19:00 Uhr und für den Folgetag mit zwei Aktualisierungen um kurz vor 07:00 und um kurz nach 19:00 Uhr.
Diese Zeiträume richten sich nach den Aktualisierungen der Prognosedaten des DWD.

################################################################################################################
## 3 PV Prognose vom aktuellen Tag aktualisieren
##     zwischen 7 und 19 Uhr zur vollen Stunde
DOELSEIF
([07:00-20:00] and [:00])
   (
    {Solar_forecast("LogDB","LogDBRep_delete_PV_Forecast","PV_Anlage_1","Solar_Calculation_fc","DWD_Forecast",0)}
   )
################################################################################################################
## 4 PV Prognose für den nächsten Tag aktualisieren
##
DOELSEIF
([06:55] or [19:11])
   (
    {Solar_forecast("LogDB","LogDBRep_delete_PV_Forecast","PV_Anlage_1","Solar_Calculation_fc","DWD_Forecast",1)}
   )


Hierduch werden dann nun die Prognesewerte auf Stundenbasis in die Datenbank geschrieben, von wo sie in den Plots dargestellt werden.

Möchte man nun eine dieser Prognosen für eine Entscheidung verwenden muss man den Wert aus der Datenbank und nicht aus dem PV_Anlage_1 Device lesen. Ein Beispiel wurde bereits im Device Pool_PV angewendet, um im Herbst/Winter die Startzeit für den Pool nach vorne zu verlegen, damit der höhere Temperaturverlust durch die längere Laufzeit ausgeglichen werden kann.

Die entsprechenden Zeilen sehen wie folgt aus:
- Zeitpunkt für die Entscheidung ist 07:17, also kurz nach der letzten Prognoseaktualisierung
- in $timestamp wird die Prognosezeit auf 12:00:00 Uhr gesetzt (es gibt nur volle Stundenwerte !)
- DbReadingsVal() holt den Wert aus der Datenbank
- mit der nun folgenden if Anweisung wird dann durch das setzen eines readings zwischen zwei Werten gewechselt.

################################################################################################################
## 13 Pool Startzeit durch Forecast verschieben. Der Forecast wird um 7:00 im Device PV_Schedule aktualisiert
##
DOELSEIF
([07:17])
    (
     {my $timestamp = POSIX::strftime("%Y-%m-%d 12:00:00",localtime(time));
      my $VALUE     = DbReadingsVal("LogDBRep_select_PV_Forecast","PV_Anlage_1:Solar_Calculation_fc0",$timestamp,0);
      if ( $VALUE < 4000 )
         {fhem("setreading Pool TimeStart ".ReadingsVal("Pool","TimeStartWinter",0) )}
      else
         {fhem("setreading Pool TimeStart ".ReadingsVal("Pool","TimeStartSummer",0) )}
     },
     {Log 3, "Pool_PV cmd_13 : Pool TimeStart switched"}
    )


Um $timestamp richtig zu setzen wäre diese Wiki Seite zu verwenden Zeitangaben, rechnen mit (https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit)

## Die aktuelle Stunde von morgen. Achtung 08:59 Uhr liefert 08:00 Uhr am nächsten Tag und nicht 09:00 Uhr
my $timestamp = POSIX::strftime("%Y-%m-%d %H:00:00",localtime(time +1*24*60*60))

## ein fester Werte zum Testen
my $timestring = "2020-10-26 12:00:00"

## Heute 13 Uhr
my $timestring = POSIX::strftime("%Y-%m-%d 13:00:00",localtime(time)) }

## $timestring ist die Basis, auf die man dann noch z.B. 24 h addiert
my $timestamp = POSIX::strftime("%Y-%m-%d %H:00:00",localtime(time_str2num($timestring) +1*24*60*60))
/code]

Man könnte z.B. auch den Vormittag mit dem Nachmittag vergleichen
[code]
my $VALUE_morgens      = DbReadingsVal("LogDBRep_select_PV_Forecast","PV_Anlage_1:Solar_Calculation_fc0",POSIX::strftime("%Y-%m-%d 09:00:00",localtime(time),0);
my $VALUE_nachmittags  = DbReadingsVal("LogDBRep_select_PV_Forecast","PV_Anlage_1:Solar_Calculation_fc0",POSIX::strftime("%Y-%m-%d 14:00:00",localtime(time),0);
if ( $VALUE_morgens <  $VALUE_nachmittags)
...


Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Oktober 2020, 09:17:41
Hallo zusammen,
ich denke nun wird jeder die letzen Umstellungen gemacht haben. Ich werde dann nun das Wiki bei Zeiten aufräumen. Ansonsten wäre nun der Zeitpunkt für eine Rückmeldung.
Übrigens ist es hier so still, weil momentan der Service per Mail gelaufen ist ;-)
Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 28 Oktober 2020, 13:37:48
Hallo ch.eick
sehr geile Sache, die du hier aufgebaut hast.
Bin sehr beeindruckt aber auch sehr erschlagen von der Informationsdichte.
Ich würde das gerne umsetzen, was du hier beschreibst, aber ich bin da gerade etwas überfordert.
Als Besonderheit bei mir ist, dass ich zwei Wechelrichter habe, einen Plenticore mit Batterie und einen IQ (quasi baugleich, aber ohne Batterie).
Derzeit lese ich Werte über Modbus aus und rechne mir was zusammen. Leider klappt das nicht komplett und ich komme nicht auf die Werte, die ich im Portal sehe.

ZB. ist es so, dass der Plenticore auch über die AC Seite lädt (das was halt der IQ erzeugt). Hier erhalte ich dann falsche Ertragswerte. Denn der Plenticore zählt keine "Yield"-Werte, wenn die Batterie geladen wird, der IQ zählt aber immer "Yield", da es für ihn immer eine Einspeisung ist. Somit zählt der Plenticore dann beim Batterieentladen "Yield", die der IQ aber bereits gezählt hat. Also ist bei mir die "Yield"-Summe zu hoch. Ich habe somit keine korrekten Ertragswerte. Im Portal werden die Etragswerte gezählt, die wirklich vom Dach kommen. Also auch was in die Batterie geht. Da passt das, es muss also dann doch irgendwie errechenbar sein. Ob Ertrag jetzt gezählt wird, beim Laden oder Entladen der Batterie sei mal dahingestellt.

Ich denke, das in der Api Informationen vorhanden sein müssen, die ich im Modbus nicht bekomme.

Um deine Definitonen umzusetzen, habe ich aus dem Wiki das config-device und PV_Anlage_1 angelegt.
Wo finde ich denn die Python Scripte? also das auth_finish und auth_session?
Ich müsste die Devices ja danach dumplizieren. Also für beide Wechelrichter. Und dann irgendwie aufsummieren.
Aber erstmal gucken, welche Daten ich aus dem Api bekomme.
Kannst du mir mit dem Finden der Script-Dateien helfen?

Danke und Gruss
killah78

Edit: ok, habe die Blindenbrille abgenommen und die Dateien im Wiki gefunden :-)

Nochmal Edit: Habe das API Device jetzt eingerichtet. Aber komme nicht weiter. Muss ich "%IP-Address_Plenticore%" mit der IP-Adresse ersetzen oder wird da automatisch irgendwo ersetzt? Wenn ich jetzt die Statistik abrufen möchte, muss ich manuell zuerst get 01... und get 02... ausführen? Im moment bekomme ich immer die Meldung "authentication failed". Das password ist wirklich der Masterkey vom Gehäuse?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Oktober 2020, 17:39:42
Hallo killah78

Zitat von: killah78 am 28 Oktober 2020, 13:37:48
Als Besonderheit bei mir ist, dass ich zwei Wechelrichter habe, einen Plenticore mit Batterie und einen IQ (quasi baugleich, aber ohne Batterie).
Derzeit lese ich Werte über Modbus aus und rechne mir was zusammen. Leider klappt das nicht komplett und ich komme nicht auf die Werte, die ich im Portal sehe.
Okay, das wird interessant :-)
Ich musste mich auch etwas disziplinieren. Als erstes habe ich alle Daten von den Devices gesammelt und aufbereitet.
Danach kann man auf validen Daten aufbauen und die Werte in Relation setzen.
Also eins nach dem anderen.

Zitat
Ich denke, das in der Api Informationen vorhanden sein müssen, die ich im Modbus nicht bekomme.
Die Statistiken bekommst Du nur über die PV_Anlage_1_API

Zitat
Nochmal Edit: Habe das API Device jetzt eingerichtet. Aber komme nicht weiter. Muss ich "%IP-Address_Plenticore%" mit der IP-Adresse ersetzen oder wird da automatisch irgendwo ersetzt? Wenn ich jetzt die Statistik abrufen möchte, muss ich manuell zuerst get 01... und get 02... ausführen? Im moment bekomme ich immer die Meldung "authentication failed". Das password ist wirklich der Masterkey vom Gehäuse?

Bei Dir werden das dann 2 PV_Anlage_*_API devices werden. Deshalb hatte ich versucht generische Namen zu wählen.
Und Du brauchst auch noch die zwei Modbus Devices PV_Anlage_*

Dann solltest Du auch zwei mal PV_Anlage_*-config anlegen, wo Du für jeden WR die Umgebung Konfigurieren kannst.
Dort stehen dann auch die IP-Addressen für die beiden WR drin.

Das Passwort ist wirklich auf dem Gehäuse, wenn der Installateur Dir nicht ein anderes gesetzt hat.

Der Sessionaufbau ist hier beschrieben, damit  man den Ablauf versteht. https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Automatischer_Login_mit_Sessionaufbau (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Automatischer_Login_mit_Sessionaufbau)
Wenn mal alles klappt, dann frgt man meistens nur "20_/processdata/scb_statistic_EnergyFlow" ab und die Session sollte sich bei bedarf selber aufbauen.

Puh, ich hoffe ich habe jetzt alle Fragen im Post gefunden...

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Oktober 2020, 17:56:38
Zitat von: killah78 am 28 Oktober 2020, 13:37:48
ZB. ist es so, dass der Plenticore auch über die AC Seite lädt (das was halt der IQ erzeugt). Hier erhalte ich dann falsche Ertragswerte. Denn der Plenticore zählt keine "Yield"-Werte, wenn die Batterie geladen wird, der IQ zählt aber immer "Yield", da es für ihn immer eine Einspeisung ist. Somit zählt der Plenticore dann beim Batterieentladen "Yield", die der IQ aber bereits gezählt hat. Also ist bei mir die "Yield"-Summe zu hoch. Ich habe somit keine korrekten Ertragswerte. Im Portal werden die Etragswerte gezählt, die wirklich vom Dach kommen. Also auch was in die Batterie geht. Da passt das, es muss also dann doch irgendwie errechenbar sein. Ob Ertrag jetzt gezählt wird, beim Laden oder Entladen der Batterie sei mal dahingestellt.

Wir haben letztens noch am Yield_NoBat als userreading gearbeitet ;-)

Statistic_Yield_Day 10582.2136888631
Statistic_Yield_Month 364870.665684594
Statistic_Yield_Total 9987915.14037154
Statistic_Yield_Year 9539125.0240609

Statistic_Yield_NoBat_Day 8194.41
Statistic_Yield_NoBat_Month 240118.95
Statistic_Yield_NoBat_Year 8210359.43


Ich denke Du solltest Dir mal ein Bild malen, was wo gezählt und gerechnet wird. Das hat mir auch geholfen, als ich die Zahlen versucht habe deckungsgleich zu bekommen.

Welche Leistung hast Du denn pro Anlage?
Hast Du EEG Umlage?

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 28 Oktober 2020, 21:07:54
Also irgendwie klappt das nicht mit dem Api abfragen. Ist es denn tatsächlich der masterkey vom Etikett des Gehäuses? Das ist das einzige was ich da finde. Oder ist es das vergeben Passwort für das webinterface?
Ich bekomme jetzt immer "user locked" .

Ich denke, das ja keine andere Daten als wir aus dem Modbus bzw Api bekommen, auch ans Portal gehen. Im Portal können die Werte auf mit zwei Wechelrichtern korrekt aufsummiert werden. Daher denke ich, sollte das im FHEM auch klappen. Nur mit Modbus bekomme ich es aber nicht hin.
Aber ja, wie du sagst, erstmal Schritt für Schritt.

Sind übrigens 9,9kwp auf 3 Dachflächen bzw 4 Strings aufgeteilt.

Edit: Ok, User war tatsächlich gesperrt und musste über das Webinterface "freigeschaltet" werden. Passwort ist in dem Kontext also das Passwort "Anlagenbetreiber" aus dem Webinterface. Damit klappt jetzt auch der Datenabruf. Jetzt muss ich mir erstmal den Kopf zerbrechen zu den ganzen Zahlen die ich bekomme.

Aber es klappt erstmal. Schonmal vielen Dank. Werde bestimmt weitere Fragen haben.... :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Oktober 2020, 23:01:32
Zitat von: killah78 am 28 Oktober 2020, 21:07:54
Also irgendwie klappt das nicht mit dem Api abfragen. Ist es denn tatsächlich der masterkey vom Etikett des Gehäuses? Das ist das einzige was ich da finde. Oder ist es das vergeben Passwort für das webinterface?
Ich bekomme jetzt immer "user locked" .

Edit: Ok, User war tatsächlich gesperrt und musste über das Webinterface "freigeschaltet" werden. Passwort ist in dem Kontext also das Passwort "Anlagenbetreiber" aus dem Webinterface. Damit klappt jetzt auch der Datenabruf. Jetzt muss ich mir erstmal den Kopf zerbrechen zu den ganzen Zahlen die ich bekomme.
Okay, dann wurde das Passwort also neu gesetzt. Ich habe es bei mir auf dem Standard gelassen.
Die API verwendet den selben Benutzer, wie das Web Interface :-)

Zitat
Ich denke, das ja keine andere Daten als wir aus dem Modbus bzw Api bekommen, auch ans Portal gehen. Im Portal können die Werte auf mit zwei Wechelrichtern korrekt aufsummiert werden. Daher denke ich, sollte das im FHEM auch klappen. Nur mit Modbus bekomme ich es aber nicht hin.
Aber ja, wie du sagst, erstmal Schritt für Schritt.
Das Portal rechnet auch mit den Statistik Werten, man muss nur halt erstmal die kompletten Daten haben und dann mal drauf schauen, was das Portal daraus macht.

Zitat
Sind übrigens 9,9kwp auf 3 Dachflächen bzw 4 Strings aufgeteilt.
Okay, wenn die so weit auseinander sind. Ich habe drei Seiten an zwei Strings, wobei eine Seite mit Leistungsoptimierern aufgeteilt ist.

Zitat
Aber es klappt erstmal. Schon mal vielen Dank. Werde bestimmt weitere Fragen haben.... :-)
Frag ruhig, wenn was unklar ist. Ich habe ja auch userreadings wegen der Batterie hinzugefügt ;-) Das ist manchmal etwas verwirrend, aber ich denke das es so stimmen müsste.
Bisher hat niemand etwas gegenteiliges geschrieben.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Oktober 2020, 18:09:48
Hallo zusammen,
ich räume da so gerade meine Datenbank auf und habe folgendes festgestellt.

Bei Einträgen wie Statistic_*_[day|Month|Year] kommt es vor, dass morgens vor 01:00:00 der letzte Wert des Vortages eingetragen wird.
Dies ist bereits ein bekanntes Problem, weil der Kostal Plenticore manchmal wohl erst um 01:00 Uhr die Statistiken beendet. Kostal hat dazu noch nichts geantwortet.

Aufgefallen ist das, als ich ein DbRep erstellt habe, um den maxValue zu ermitteln.
Startet man dann die Aggregierung mit Display, werden readings angezeigt, die die besagten 00:* Uhrzeiten haben.

defmod LogDBRep_Test DbRep LogDB
attr LogDBRep_Test DbLogExclude .*
attr LogDBRep_Test aggregation day
attr LogDBRep_Test allowDeletion 0
attr LogDBRep_Test comment Version 2020.10.23 15:00\
Test für die Logdb
attr LogDBRep_Test device PV_Anlage_1_API
attr LogDBRep_Test reading Statistic_TotalConsumption_Day
attr LogDBRep_Test room Strom->Energie,System
attr LogDBRep_Test timestamp_begin current_year_begin
attr LogDBRep_Test timestamp_end previous_month_end



Ich habe dann mal SQL geschrieben, um das in kompakter Weise zu sehen

## hiermit seht Ihr den letzten Eintrag vom Vortag und den ersten des Folgetages. Eventuell müsst Ihr die Uhrzeit etwas anpassen, das kommt auf Eure 00:* Uhrzeiten an.
SELECT TIMESTAMP,DEVICE,READING,VALUE FROM history
   WHERE DEVICE='PV_Anlage_1_API' AND READING='Statistic_TotalConsumption_Day' AND
                 TIMESTAMP > '2020-01-01 00:00:00' AND
                (TIMESTAMP LIKE '% 23:%' OR TIMESTAMP LIKE '% 00:0%' OR TIMESTAMP LIKE '% 00:5%')
  ORDER BY TIMESTAMP  LIMIT 500;

## So bekommt Ihr eine Liste, um daraus ein UPDATE zu erstellen und die Einträge zum Vortag zu verschieben
SELECT TIMESTAMP,DEVICE,READING,VALUE FROM history
   WHERE DEVICE='PV_Anlage_1_API' AND READING='Statistic_TotalConsumption_Day' AND
                 (TIMESTAMP LIKE '2020-%-% 00:0%' OR TIMESTAMP LIKE '2020-%-% 00:5%')
   ORDER BY TIMESTAMP;


Bei mir waren es ca. 130 Einträge, bei denen ich dann aus der erzeugten Liste, mit Notepad++ (okay, dafür verwende ich auch Win :-) ), in updates umgeschrieben habe.
Kennt Ihr schon im Notepad++ die Tastenkombination Shift+Alt+Kursernavigation zum Markieren von Spalten? Das vereinfacht diese Bearbeitung ungemein ;-)

Denkt bitte daran, Ihr könnt ganze Spalten markieren und an anderer Stelle wieder einfügen!!!

## aus dieser Zeile
| 2020-07-31 00:05:00 | PV_Anlage_1_API | Statistic_TotalConsumption_Day | 13320 |

## wird dann
UPDATE history SET TIMESTAMP='2020-07-30 23:59:00' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_TotalConsumption_Day' AND TIMESTAMP = '2020-07-31 00:05:00';

Und schon passen die Einträge wieder.

Das Ganze dann bitte für alle readings, die zu beginn des Tages neu anfangen hoch zu zählen.

Viele Grüße und bleibt fasziniert :-)
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 November 2020, 23:01:59
Hallo zusammen,

im Wiki ist nun auch ein Testablauf (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Testablauf_zum_PV_Anlage_1_API) für die Inbetriebnahme des PV_Anlage_1_API Device.
Danke für Eure Rückmeldungen, die hoffentlich alle dort zu finden sind.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 November 2020, 11:31:40
Moin zusammen,
hat außer mir schon jemand mit Grafana angefangen?

Das erste Diagramm habe ich nun im Test auf Grafana umgesetzt.

Besonders schön ist die Stapel Funktion, bei der im Beispiel folgende Werte angegeben wurden:

- Home_own_consumption_from_PV
- Home_own_consumption_from_Bat
- Home_own_consumption_from_Grid

Verwendet man dann noch die Möglichkeit einen Bereich mit der Maus zu markieren, kann man sehr schön (Im Anhang) sehen, wie sich die Verbrauchte Leistung zusammensetzt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 November 2020, 14:48:54
Für Wünsche und Ideen wäre jetzt der richtige Zeitpunkt.
Die Namen sind noch schall und Rauch, das ist nur zur Orientierung so Kryptisch :-)
Man kann natürlich auch rein zoomen oder einzelne Kurven ausblenden oder durch einen Klick nur die Kurve von Interesse anzeigen lassen.
siehe Anhang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 November 2020, 16:00:59
Hallo zusammen,
es scheint jetzt ja bei allen Verfolgern soweit zu laufen. Danke nochmals für die extra Motivation, es hat auch mich viel weiter gebracht :-)

Hier nochmal zum Wochenende eine Motivation für Euch. Ich habe seit wenigen Tagen die LWP auf Tagesanhebung und Nachtabsenkung eingestellt.
Jetzt wird zwischen 10:00 und 16:00 Uhr um 2° mehr geheizt und in der Zeit dazwischen 5° weniger, als die Heizkurve mit Außentemperatur es vorgibt.
Den Effekt, den ich haben wollte sind gehäufte Heizzykluen in der PV-Leistungszeit und nach Möglichkeit sehr wenige in der Nacht, im Diagramm sieht
man den einen Heizzyklus in der Nacht davor nicht. Das erste Ergebnis davon könnt Ihr im Grafana Diagramm erkennen, das grüne ist der direkte
Verbrauch und das gestapelte rote kam aus der Batterie.
Zwischen der blauen Linie und der grünen Fläche befindet sich die Leistung, die in den Speicher gegangen ist. Die gelbe Linie zeigt den rechnerischen
Ladezustand der Batterie.

Die großen Säulen mit zusätzlicher Batterieunterstützung sind die LWP.
Gegen 9:00 Uhr musste leider nochmal die abgesenkte Temperatur nachgeheizt werden, aber es gab schon PV-Leistung.
Um 10:00 Uhr ging es auf Tagesanhebung, was auch direkt mit einer langen Betriebszeit der LWP los ging.
Somit habe ich bereits drei, anstelle von nur einem Heizzyklus in der PV-Leistungs Zeit.
Gegen 13:00 Uhr nachheizen, da der Pufferspeicher dann zu kühl war und um 14:00 Uhr ist die Sperrzeit für WW rum.

Durch die Eigenverbrauchsteuerung der PV_Anlage Implementierung würde zusätzlich noch der PV-Modus der LWP aktiviert werden, sobald die Parameter passen.

Viele Grüße und bleibt interessiert.
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 07 November 2020, 17:17:31
Hi Christian,

ich bin weiterhin am Thema dran und sammle noch, da mein KSEM noch nicht installiert ist. Ich habe die ersten Grafana-Dashboards erstellt und merke jetzt was mir wo noch fehlt. Ist halt ein iterativer Prozess...

Auch beim Forecast habe ich noch Verbesserungspotential. Aktuell nutze ich noch dwdforecast von kilianknoll. Mein Plenticore Plus sowie meine Heckert Module sind aber nicht in der pvlib-db. Mein Dach hat eine absolute Süd-West-Ausrichtung. Ab einem Azimuth von -41 Grad geht die Post ab. Das scheint berücksichtigt zu sein. Dummerweise wohne ich im Hang und merke, dass um die Jahreszeit die Sonne tief steht und ab einer Altitude von 14.568 die Abschattung beginnt. Das ist ein Faktor der im dwdforecast nicht eingegeben werden kann. Außerdem schießt mein Ertrag oftmals über die dwdforecast-Progonse hinaus.

Es gibt also noch viel zu tun.

VG Peter

P.S. Ich habe ein Thema zu NILM aufgemacht. Bin mal gespannt, ob jemand dazu etwas sagen kann.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 November 2020, 18:06:52
Zitat
ich bin weiterhin am Thema dran und sammle noch, da mein KSEM noch nicht installiert ist. Ich habe die ersten Grafana-Dashboards erstellt und merke jetzt was mir wo noch fehlt. Ist halt ein iterativer Prozess...
Stütz Dich doch einfach auf meine gesammelten Werke, da sind 1,5 Jahre Erfahrung drin und die Lösung von Kilian und mir ist auch drin aufgegangen ;-)

Hast Du schon das Button Problem gelöst, um einen Verbrauche vom Grafana heraus einzuschalten? Da komme ich nicht weiter.
Diagramme und on/off war nicht so schwierig.


Zitat
Auch beim Forecast habe ich noch Verbesserungspotential. Aktuell nutze ich noch dwdforecast von kilianknoll.
Das kannst Du recht simpel nach meiner Anleitung direkt in Fhem integrieren. Das DWD Modul liefert bereits Rad1h Werte.

[/quote]
Mein Dach hat eine absolute Süd-West-Ausrichtung. Ab einem Azimuth von -41 Grad geht die Post ab. Das scheint berücksichtigt zu sein. Dummerweise wohne ich im Hang und merke, dass um die Jahreszeit die Sonne tief steht und ab einer Altitude von 14.568 die Abschattung beginnt.
Das ist ein Faktor der im dwdforecast nicht eingegeben werden kann. Außerdem schießt mein Ertrag oftmals über die dwdforecast-Progonse hinaus.
Zitat
Das kannst Du auch bei meiner Umsetzung anpassen. Ich habe mit Kilian zusammen gefachsimpelt, bis ich die Lösung auf Fhem optimiert habe und er die pvlib eingeführt hat.
Die Besonderheit der Module kannst Du auf die Nennleistung und den Temperaturkoeffizienten runter brechen.
Für die Sonnenstände könntest Du mit einfachen Mitteln in der Solar_plain Funktion weitere Einschränkungen vornehmen.
Ein generelles zu hoch/niedrig der Werte stellst Du über den fixen Faktor in der PV_Anlage_1_config ein.
Regen und Wolken mit den anderen Anpassungskurven alla "Heizungskurve".
Das Ergebnis findest Du für heute im Anhang.

Über Prognose und NILM wurde bereits häufiger philosophiert und Prognose war dort schon weit vorne. Ich habe es nun bereits implementiert und bin sehr zufrieden.
Du musst auch berücksichtigen, wieviel geeignete Verbraucher Du hast, wo es sich lohnt sie zu verschieben.
Ich habe da den Pool mit einer Zeitverschiebung für Herbst/Winter und die LWP, die bei hoher Leistung im PV-Modus schon eher starten darf.

Die bunten Linien unter der Prognose Kurve sind die Einzelprognosen der drei Seitenausrichtung.

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 November 2020, 09:11:15
Hallo zusammen,
in einem anderen Thread wurde die Komplexität angesprochen, was ich hier nochmal wiederholen möchte.

Zitat
PV_Anlage ist aktuell ein Sammlung von verschiedenen Elementen und Programmiersprachen. Da könnte man ein schönes Modul draus machen ...

Also, die Basis ist FHEM mit folgenden Standard Modulen:

HTTPMOD
MODBUS
DOIF
DUMMY
HourCounter
readingsGroup
DbLog
DbRep

Zähler (nicht unbedingt notwendig)
SMAEM (bei mir für den Starkverbraucher LWP)
KSEM über MODBUS (nicht notwendig beim Plenticore)
Lesekopf für den EVU
Shelly (intern)

Diagramme:
SVG Muster (wird nicht mehr weiter entwickelt)
Grafana (jetzt neu)

Für den Forecast:
ASTRO
DWD_OpenData
wunderground über HTTPMOD (nur für Radiation in der Nachbarschaft, zum Vergleich)

Verbraucher Anschluss bei mir:
Shelly mit Leistungsmessern


Eventueller Code ist das in Fhem verwendete Perl, was direkt in den einzelnen Devices sichtbar ist. Weiterhin gibt es zwei Funktionen in der myUtils, ebenfalls in Perl.

Momentan existieren zwei Python Skripte, für die Berechnung von Anmelde Keys zum Plenticore, mit einem extra Thread im Forum (https://forum.fhem.de/index.php/topic,115530.0.html) für eine eventuelle Migration zu Perl. Leider scheint es niemanden im Forum zu geben, der dafür Zeit investieren könnte.

Bei der Umsetzung dieser Lösung wurde bewusst auf die standard Module von Fhem gesetzt, um nicht wieder ein neues Modul zu erstellen, für das es eventuell keine Unterstützung gibt.
Somit kann auch ohne Maintainer zu jeder einzelnen Komponente im Forum Hilfe gefunden werden.
Ich sehe es eher als kritisch an daraus ein Modul zu erstellen, da dafür der Ersteller auch Service leisten sollte. Der modulare Aufbau ermöglicht es dem Endanwender seine Gerätschaften flexibel anzubinden.
Die Vielzahl von Modulen kommt dadurch zu stande, dass ja jedes einzelne Gerät Konfiguriert werden muss und jeder Hersteller eine andere Schnittstelle hat. Das alles müsste in einem Modul versteckt und
supported werden.

Die wenigsten werden Shellys für die Ansteuerung haben und könnten dann z.B. einfach durch austausch von

SetCmdOff set shelly02 off 0
SetCmdOn set shelly02 on 0

das eigene Endgerät ansteuern.

Falls jedoch jemand bereit wäre das ganze in ein Modul zu gießen, bin ich auf jeden Fall unterstützend dabei.

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 November 2020, 14:03:08
Zitat von: plin am 08 November 2020, 12:14:08
Bei mir sieht es durchwachsen aus. Mein Prod-FHEM hat Probleme. In meiner Dev-Instanz habe ich die PV_Anlage_1_API gelöscht und neu eingerichtet. Nach kurzer Zeit ging es, die auth-Readings wurden gesetzt, es erschienen Werte in der Status-Tabelle.
"update all" der Prod-Instanz => keine Änderung
"update all" der Dev-Instanz => jetzt geht's auch da nicht mehr
Achtung, die letzten Versionen vom HTTPMOD scheinen nicht 100% okay zu sein, weshalb ich keinen Update gemacht habe!
Momentan habe ich FVERSION 98_HTTPMOD.pm:0.228400/2020-09-24 , die könnte ich Dir nochmal schicken.


Zitat
Der Knackpunkt scheint die Erzeugung des auth_randomString64  zu sein. Im Log erscheint folgende Meldung


2020.11.08 12:02:46 5: PV_Anlage_1_API: get called with 01_/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: get found option 01_/auth/start in attribute get01Name
2020.11.08 12:02:46 4: PV_Anlage_1_API: get will now request 01_/auth/start, no optional value
2020.11.08 12:02:46 5: PV_Anlage_1_API: AddToQueue adds type get01 to URL http://%IP-Address_Plenticore%/api/v1/auth/start, data {"nonce": "%randomString64%","username": "user"}, header Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive, retry 0, initial queue len: 0
2020.11.08 12:02:46 5: PV_Anlage_1_API: HandleSendQueue called from HTTPMOD::AddToSendQueue, qlen = 1
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_transactionId%), mode reading, value auth_transactionId input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_proof%), mode reading, value auth_proof input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%randomString64%), mode expression, value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_token%), mode reading, value auth_token input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_authtag%), mode reading, value auth_authtag input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_payload%), mode reading, value auth_payload input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_iv%), mode reading, value auth_iv input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: {"nonce": "%randomString64%","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_transactionId%), mode reading, value auth_transactionId input: {"nonce": "%randomString64%","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_proof%), mode reading, value auth_proof input: {"nonce": "%randomString64%","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%randomString64%), mode expression, value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} input: {"nonce": "%randomString64%","username": "user"}
2020.11.08 12:02:46 3: PV_Anlage_1_API: Replacement 04 with expression {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} (s/(?^:%randomString64%)/{my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;}/gee) created warning: Use of uninitialized value in substitution iterator at ./FHEM/98_HTTPMOD.pm line 877.

2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace: match for type get01, regex (?^:%randomString64%), mode expression, value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;}, input: {"nonce": "%randomString64%","username": "user"}, result is {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_token%), mode reading, value auth_token input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_authtag%), mode reading, value auth_authtag input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_payload%), mode reading, value auth_payload input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_iv%), mode reading, value auth_iv input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: http://%IP-Address_Plenticore%/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace: match for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")}, input: http://%IP-Address_Plenticore%/api/v1/auth/start, result is http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_transactionId%), mode reading, value auth_transactionId input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_proof%), mode reading, value auth_proof input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%randomString64%), mode expression, value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_token%), mode reading, value auth_token input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_authtag%), mode reading, value auth_authtag input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_payload%), mode reading, value auth_payload input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_iv%), mode reading, value auth_iv input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 4: PV_Anlage_1_API: HandleSendQueue sends get01 with timeout 7 to http://192.168.3.71/api/v1/auth/start,
data: {"nonce": "","username": "user"},
header: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: ReadCallback called from __ANON__
2020.11.08 12:02:46 4: PV_Anlage_1_API: Read callback: request type was get01 retry 0,
header: HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Sun, 08 Nov 2020 11:02:46 GMT
Content-Type: application/json
Content-Length: 154
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, body length 154
2020.11.08 12:02:46 5: PV_Anlage_1_API: Read callback: body
{"nonce":"zDrc7AMVkr8JWEJH","salt":"v89J\/Ggdnq0GW8mh","rounds":29000,"transactionId":"6310d6d61e9e201bf2f1e739a358426f3abaea4a69339df5a520fdf80d862d30"}


Das hier sieht komisch aus...
ndomString64 ".$r);; $r;;}/gee)
Woher kommt das "/gee)" ist das ein Copy/Paste Fehler?
Durch den Fehler wird an dieser Stelle das Replacement nicht gemacht.

2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: {"nonce": "","username": "user"}

>>>> {"nonce": "","username": "user"}
>>>> da müsste z.B.  {"nonce": "I4G54dSPVX3YPPQ9","username": "user"} stehen.


>>>> in der Kommandozeile kannst Du auch folgendes Testen

{my $NAME = "PV_Anlage_1_API";; my @chars=('a'..'z','A'..'Z','0'..'9');; my $r;; foreach(1..16) {$r.=$chars[rand @chars];;};; fhem("setreading ".$NAME." test_auth_randomString64 ".$r);; $r;;}
>>>> Auf dem Bildschirm kommt 5sUrso8HnWoDXLzd
>>>> Und im PV_Anlage_1 kommt ein neues raeding
>>>> test_auth_randomString64 5sUrso8HnWoDXLzd

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 08 November 2020, 14:18:28
Zitat von: ch.eick am 08 November 2020, 14:03:08
Das hier sieht komisch aus...
ndomString64 ".$r);; $r;;}/gee)
Woher kommt das "/gee)" ist das ein Copy/Paste Fehler?
Durch den Fehler wird an dieser Stelle das Replacement nicht gemacht.
Das /gee habe ich gesehen aber nicht hinterfragt (habe die '}' übersehen und gedacht das wäre der Ersatzcode).

Ich habe das replacement04Value noch mal alleine übernommen und nun klappt's.

Vielleicht ist der Fehler beim Upload passiert. Ich hatte die raw-Defintion in ein separates File kopiert und via telnet hochgeladen. Bisher hatte ich damit noch keine Probleme. Aber es gibt für alles ein erste Mal.

Als nächstes brauche ich jetzt noch die DWD_Forecast-Daten. Bisher hole ich mir Regen und Bewölkung aus den Proplanata-Daten, die DWD-Daten sind aber granularer.

Ciao
Peter

UPDATE (damit man's schnell im Kontext findet):
98_HTTPMOD.pm:            $match = eval {$string =~ s/$regex/$value/gee};
98_HTTPMOD.pm:                Log3 $name, 3, "$name: Replace: invalid regex / expression: /$regex/$value/gee - $@";

Der Fehler liegt also im 98_HTTPMOD.pm und wird im entsprechenden Forum gemeldet.
https://forum.fhem.de/index.php/topic,45176.msg1100077.html#msg1100077 (https://forum.fhem.de/index.php/topic,45176.msg1100077.html#msg1100077)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 November 2020, 14:26:06
Zitat von: plin am 08 November 2020, 14:18:28
Das "/gee" habe ich gesehen aber nicht hinterfragt (habe die '}' übersehen und gedacht das wäre der Ersatzcode).
Ich habe das replacement04Value noch mal alleine übernommen und nun klappt's.
Vielleicht ist der Fehler beim Upload passiert. Ich hatte die raw-Defintion in ein separates File kopiert und via telnet hochgeladen. Bisher hatte ich damit noch keine Probleme. Aber es gibt für alles ein erste Mal.
Kann passieren ;-) Okay, dann läuft es wenigstens.

Zitat
Als nächstes brauche ich jetzt noch die DWD_Forecast-Daten. Bisher hole ich mir Regen und Bewölkung aus den Proplanata-Daten, die DWD-Daten sind aber granularer.
Das ist ja bereits im Wiki dokumentiert. Da habe ich Krukis Python Skript einfach durch das DWD_Opendata Modul ersetzt. Aber Vorsicht beim Kopieren :-) :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 November 2020, 17:06:42
Das ist von plin:

Zitat
Ich glaube die HttpUtils_NonblockingGet  müssen in einem FHEM-Modul ausgeführt werden. Jedenfalls braucht man $hash für die Antwort. Mit dem Wissen kann ich einen neuen Versuch starten. Was erforderlich ist ist in meinen python-Skipten drin. Ich hoffe es so aufbauen zu können, dass man es als function in die 99_myUtils.pm übernehmen kann.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 08 November 2020, 20:56:29
Zitat von: ch.eick am 08 November 2020, 17:06:42
Das ist von plin:
tja, aber ich habe das falsche Problem hochgeladen ;D. Als Anlage das richtige Script zum Auslesen von "/processdata/scb:statistic:EnergyFlow".

Und ich habe erfolgreich den ersten Schritt (Step1) in perl realisiert, einige Grundsatzfragen sind damit geklärt, der Rest ist nur noch Arbeit.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 November 2020, 21:57:43
Zitat von: plin am 08 November 2020, 20:56:29
Und ich habe erfolgreich den ersten Schritt (Step1) in perl realisiert, einige Grundsatzfragen sind damit geklärt, der Rest ist nur noch Arbeit.
??? Das sieht nach dem Python Skript aus, das ich bereits ausgebaut habe ???
In der alten Implementierung gab es diese http Aufrufe mit Python bereits, inklusive der Übergabe an Fhem.
Das verstehe ich jetzt nicht.

Ich bin sehr gespannt auf die Perl Umsetzung.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 November 2020, 23:29:27
Hallo nochmal,
das ist nun nochmal passiert, jedoch steht es im Wiki korrekt drin.
Irgendwo auf dem Weg vom Wiki zum RAW Device im Fhem scheint etwas schief zu laufen.
Bitte achtet deshalb besonders darauf, was wirklich im Fhem Device hin kopiert wurde.
Ich arbeite direkt auf einem RPI mit Desktop und habe somit  keine Win Tools dazwischen.

Im Log seht Ihr dann diese Zeile und ziemlich am Ende das "/gee)"

2020.11.08 20:55:47 3: PV_Anlage_1_API: Replacement 04 with expression {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} (s/(?^:%randomString64%)/{my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;}/gee) created warning: Use of uninitialized value in substitution iterator at ./FHEM/98_HTTPMOD.pm line 877.

2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: {"nonce": "","username": "user"}

>>>> {"nonce": "","username": "user"}
>>>> da müsste z.B.  {"nonce": "I4G54dSPVX3YPPQ9","username": "user"} stehen.


>>>> in der Kommandozeile kann manauch folgendes Testen

{my $NAME = "PV_Anlage_1_API";; my @chars=('a'..'z','A'..'Z','0'..'9');; my $r;; foreach(1..16) {$r.=$chars[rand @chars];;};; fhem("setreading ".$NAME." test_auth_randomString64 ".$r);; $r;;}
>>>> Auf dem Bildschirm kommt 5sUrso8HnWoDXLzd
>>>> Und im PV_Anlage_1 kommt ein neues reading
>>>> test_auth_randomString64 5sUrso8HnWoDXLzd


Zitat von: plin am 08 November 2020, 14:18:28
Das "/gee" habe ich gesehen aber nicht hinterfragt (habe die '}' übersehen und gedacht das wäre der Ersatzcode).
Ich habe das replacement04Value noch mal alleine übernommen und nun klappt's.
Vielleicht ist der Fehler beim Upload passiert. Ich hatte die raw-Defintion in ein separates File kopiert und via telnet hochgeladen. Bisher hatte ich damit noch keine Probleme. Aber es gibt für alles ein erste Mal.
Kann passieren ;-) Okay, dann läuft es wenigstens.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 09 November 2020, 07:17:14
Zitat von: ch.eick am 08 November 2020, 21:57:43
??? Das sieht nach dem Python Skript aus, das ich bereits ausgebaut habe ???
In der alten Implementierung gab es diese http Aufrufe mit Python bereits, inklusive der Übergabe an Fhem.
Das verstehe ich jetzt nicht.

Ich bin sehr gespannt auf die Perl Umsetzung.
Ok, das ist lustig. Ich bin ja spät eingestiegen (erst Ende Oktober) und habe anscheinend einen Programmrumpf von Dir gefunden (Anfang des Programms) und den Code wieder ergänzt, den Du entfernt hast (ich brauchte ja eine Übergangslösung für mein \gee-Problem). Das Ende stammt eindeutig von mir  :).

Anyway: Die Logik und der Ablauf passen, daran kann ich mich orientieren.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 November 2020, 09:13:54
Zitat von: plin am 09 November 2020, 07:17:14
Ok, das ist lustig. Ich bin ja spät eingestiegen (erst Ende Oktober) und habe anscheinend einen Programmrumpf von Dir gefunden (Anfang des Programms) und den Code wieder ergänzt, den Du entfernt hast (ich brauchte ja eine Übergangslösung für mein \gee-Problem). Das Ende stammt eindeutig von mir  :).

Anyway: Die Logik und der Ablauf passen, daran kann ich mich orientieren.
Ahh, so wird ein Schuh draus.

Wenn Du hier aktive würdest und den Code zu Perl transferieren Könntest wäre das echt toll.
Bitte bearbeite das aber dann in diesem HTTPMOD komplexes Anmeldeverfahren Python Keygenerator (https://forum.fhem.de/index.php/topic,115530.0.html) Thread, den ich dafür aufgemacht habe. Da gibt es auch noch Zusatzinformationen und den isolierten Code.

Auch hierfür wäre es schön, wenn Du die Posts, die dorthin gehören einfach rüber kupierst und danach hier wieder löscht. Dann bleibt es übersichtlicher.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: KölnSolar am 09 November 2020, 13:16:09
Hi Christian,

das https://forum.fhem.de/index.php/topic,115702.msg1099652.html#msg1099652 wär doch noch was für Dich. Scheinbar eine etwas feinere Prognose.
Meine Meinung kennst Du ja zu Prognosen.  ;)
Grüße Markus
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 November 2020, 13:30:41
Zitat von: KölnSolar am 09 November 2020, 13:16:09
das https://forum.fhem.de/index.php/topic,115702.msg1099652.html#msg1099652 wär doch noch was für Dich. Scheinbar eine etwas feinere Prognose.
Meine Meinung kennst Du ja zu Prognosen.  ;)
Danke schön, da bin ich doch schon dabei :-)

Ich habe bereits eine zufriedenstellende Prognose etabliert und verschiebe die mögliche Startzeit einzelner Verbraucher.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 10 November 2020, 19:58:49
Hallo zusammen

Ich habe den Forecast ebenfalls integriegriet und zum laufen bekommen.
Nun ist es so dass alle berechneten Werte ausführlich in das Fhem Log geschrieben werden. Kann man das irgendwie einfach unterbinden? Mir würde es reichen wenn die entsprechenden Readings geschrieben werden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 November 2020, 20:23:50
Zitat von: Mumpitz am 10 November 2020, 19:58:49
Ich habe den Forecast ebenfalls integriegriet und zum laufen bekommen.
Nun ist es so dass alle berechneten Werte ausführlich in das Fhem Log geschrieben werden. Kann man das irgendwie einfach unterbinden? Mir würde es reichen wenn die entsprechenden Readings geschrieben werden.

Du hast vergessen, das Debugging wieder herunter zu setzen

attr global verbose 2
verbose in den Devices auf 0


Wenn Du bei "attr global verbose 3" bleiben möchtest, müsstest Du in der 99_myUtils in den Funktionen Solar_* entweder das Logging auskommentieren oder z.B. Level 3 in 4 ändern.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 November 2020, 19:30:03
Hallo zusammen,
bevor jetzt noch jemand viel Arbeit in das PV_Anlage_1_API Device steckt möchte ich Euch stoppen.

Dank der Arbeit von plin , der die Python Skripte zu Perl migriert hat, überarbeite ich gerade das Komplette Device.
Die readings werden natürlich identisch bleiben, jedoch wird der Anmeldeprozess sich im Hintergrund ändern.

Manuell läuft es bereits und ich arbeite am Automatismus.

Viele Grüße und besonderen Dank an plin
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 14 November 2020, 11:02:17
Moin. Hat sich nach dem Firmwareupdate eigentlich was am API verändert oder ist was hinzugekommen? Im Modbus gibts ein paar neue Werte, die mir bei meinen zwei Wechselrichtern hoffentlich helfen. ZB wird die Lade- und Entladenergie gezählt.
Naja, bin immer noch dabei die Zahlen zu beobachten und die Enden zusammenzubekommen.
Echt sehr gute Arbeit die Du/ihr hier leistet. :-)
Gruss
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 November 2020, 11:45:02
Zitat von: killah78 am 14 November 2020, 11:02:17
Hat sich nach dem Firmwareupdate eigentlich was am API verändert oder ist was hinzugekommen? Im Modbus gibts ein paar neue Werte, die mir bei meinen zwei Wechselrichtern hoffentlich helfen. ZB wird die Lade- und Entladenergie gezählt.
Naja, bin immer noch dabei die Zahlen zu beobachten und die Enden zusammenzubekommen.
Echt sehr gute Arbeit die Du/ihr hier leistet. :-)
Moin,
mit dem Update hatte ich noch gewartet, weil ich dank plin die Python Skripte nun endlich weg bekommen habe. An zwei Stellen gleichzeitig zu ändern ist keine gute Idee :-)
Ich denke ich schaffe es heute noch das Wiki zu ändern, damit Ihr das Update machen könnt. Ändern wird sich dann folgendes:

PV_Anlage_1_API
  - Die Anmeldung ist dann besser integriert und verwendet das mehrstufige "sid" Verfahren
  - Die userreadings wurden bereinigt
  - Es gibt eine plenticor_auth() Funktion, die das Python ersetzt
  - Die Funktion erfüllt die drei Stufen der Anmeldung (start/finish/session)
  - Das Passwort wird im KeyStore abgelegt

  - Es sieht jetzt schön sauber aus und ich schüttele keine Verfolger mehr ab ;-) :-)

99_myUlils
  - KeyValue()
  - plenticore_auth()

Python Skripte entfallen
fhem@raspberrypi:~$ ls -l python/bin/plenticore
-rwxr----- 1 fhem fhem 1929 Nov 13 15:22 python/bin/plenticore_auth_finish.py
-rwxr----- 1 fhem fhem 2264 Nov 13 15:23 python/bin/plenticore_auth_session.py

Passwort json Files entfallen
fhem@raspberrypi:~$ ls -l python/pwd*
-rw-r----- 1 fhem fhem 53 Aug 19 10:52 python/pwd_fhem.json
-rw-r----- 1 fhem fhem 59 Mär 26  2020 python/pwd_plenticore.json

-rw-r----- 1 fhem fhem 61 Jul 30 16:01 python/pwd_byd.json  <<< falls Ihr einen BYD HV habt, daran arbeite ich noch


Anschließend werde ich die neu Plenticore FW aktualisieren. Im anderen Forum wurde bisher nichts negatives berichtet.

Hierbei muss folgendes geprüft werden:
  - Modbus/TCP PV_Anlage_1
      Werden hier alle bereits definierten readings noch gelesen? <<< Das könnte schon mal jemand anderes bitte prüfen
      Weitere neue Register identifizieren, die ich dann einbaue   <<< Hier wäre es schön, wenn ich eine Liste bekommen würde, dann kann ich mir die Sucherei sparen

  - PV_Anlage_1_API
     Es gibt wohl neue API Aufrufe, die für die Batterie Steuerung verwendbar sind, auch hier wäre ich über eine Liste Dankbar.
     Das wäre dann auch etwas für die Betreiber anderer Speicher Typen interessant.
     http://<IP-Address_Plenticore>/api/v1

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: KölnSolar am 14 November 2020, 12:46:25
ZitatDank der Arbeit von plin , der die Python Skripte zu Perl migriert hat
Prima. Ein externer Fremdzugriff mit Fremdsoftware weniger.
Grüße Markus
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 November 2020, 14:11:51
Zitat von: KölnSolar am 14 November 2020, 12:46:25
Prima. Ein externer Fremdzugriff mit Fremdsoftware weniger.
Das hatte mich schon extrem gestört, aber ich habe das mit den ganzen Key gedöns nicht verstanden ;-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 November 2020, 16:46:34
Hallo zusammen,
ich möchte nun mit Stolz verkünden, dass Ihr jetzt das PV_Anlage_1_API Device umstellen könnt.
Die Dokumentation steht bereits im Wiki und ich betrachte das als eine wichtige Änderung, die Ihr auf jeden Fall machen solltet. Wie bereits von KölnSolar angemerkt wurde ist damit ein Fremdsoftware Zugriff eliminiert worden. Ich meine auch subjektiv festgestellt zu haben, dass die Anmeldung jetzt auch schneller läuft. Zumindest ist das device jetzt massiv übersichtlicher.

Falls Ihr bereits an den Firmware update des Plenticor gedacht habt, dann macht bitte zuerst diese Umstellung, damit Ihr auch wisst woher die Fehler kommen :-)
Bei mir steht der Update jetzt auch an, damit ich mal nach den Kostal Verbesserungen schauen kann.

Und wie immer nehme ich gerne Hinweise zum Wiki an, damit es auch für alle verständlich wird.

Viele Grüße
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 15 November 2020, 09:14:20
Ich habe ein Problem mit dem Statement
setreading PV_Anlage_1_API replacement01Value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")}

Beim Aufruf von 01_/auth/start kriege ich in meiner Test-Instanz (Raspi4 mit Debian Buster) ein
gethostbyname {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} failed

Wenn ich {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} in der FHEMWEB Kommandozeile eingebe erhalte ich die korrekte IP-Adresse.

Auf meiner Prod-Instanz (x86 mit openSUSE Leap 15.2) erhalte ich eine
info_message      The method is not allowed for the requested URL.

Das zugehörige Log von der Prod-Instanz als Anlage.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 November 2020, 10:30:17
EDIT: Hallo plin, eventuell könnte es ja mit der Korrektur von plenticore_auth() nun besser laufen. Ich würde mich freuen, wenn Du das noch testen könntest.


Zitat von: plin am 15 November 2020, 09:14:20
Ich habe ein Problem mit dem Statement
setreading PV_Anlage_1_API replacement01Value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")}

Beim Aufruf von 01_/auth/start kriege ich in meiner Test-Instanz (Raspi4 mit Debian Buster) ein
gethostbyname {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} failed
Da musst Du leider die beiden Umgebungen miteinander vergleichen. Hast Du das PV_Anlage_1_API vollständig ersetzt?
An dem PV_Anlage_1_config hat sich soweit nichts verändert.

Zitat
Wenn ich {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} in der FHEMWEB Kommandozeile eingebe erhalte ich die korrekte IP-Adresse.
Das wäre der richtige Test und sollte auf beiden Umgebungen die IP-Adresse liefern.

Hast Du das neueste HTTPMOD schon drauf? Ich bin noch immer bei der alten Version, weil bei der neuen noch Merkwürdigkeiten auftreten, wie ich im Forum gelesen habe.
Ich könnte Dir die alte Version nochmal schicken, falls Du kein Backup hast.

Zitat
Auf meiner Prod-Instanz (x86 mit openSUSE Leap 15.2) erhalte ich eine
info_message      The method is not allowed for the requested URL.

Zitat
Das zugehörige Log von der Prod-Instanz

snip..
http://192.168.3.71/api/v1/processdata/scb:statistic:EnergyFlow
2020.11.15 09:40:48 4: PV_Anlage_1_API: HandleSendQueue sends get20 with timeout 7 to http://192.168.3.71/api/v1/processdata/scb:statistic:EnergyFlow, No Data,
header: authorization: Session
2020.11.15 09:40:48 5: PV_Anlage_1_API: ReadCallback called from __ANON__
2020.11.15 09:40:48 4: PV_Anlage_1_API: Read callback: request type was get20 retry 0,
header: HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Sun, 15 Nov 2020 08:40:48 GMT
Content-Type: application/json
Content-Length: 59
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, body length 59
2020.11.15 09:40:48 5: PV_Anlage_1_API: Read callback: body
[{"processdata":[],"moduleid":"scb:statistic:EnergyFlow"}]

2020.11.15 09:40:48 4: PV_Anlage_1_API: BodyDecode found no charset header (bodyDecode was set to auto)
2020.11.15 09:40:48 4: PV_Anlage_1_API: extracted JSON values to internal
2020.11.15 09:40:48 5: PV_Anlage_1_API: GetCookies is looking for Cookies
2020.11.15 09:40:48 5: PV_Anlage_1_API: ExtractSid called, context get, num 20
2020.11.15 09:40:48 4: PV_Anlage_1_API: checking for redirects, code=200, ignore=0
2020.11.15 09:40:48 4: PV_Anlage_1_API: no redirects to handle
2020.11.15 09:40:48 5: PV_Anlage_1_API: Read callback sets LAST_REQUEST to get20
2020.11.15 09:40:48 5: PV_Anlage_1_API: CheckAuth is checking buffer with ReAuthRegex (?^:"authenticated":false|"processdata":\[\]|wrong credentials|Not authorized)
2020.11.15 09:40:48 4: PV_Anlage_1_API: CheckAuth decided new authentication required

Das ist korrekt und der Plenticore liefert keine Information, weil das Login noch fehlt.
HTTPMOD hat dies auch erkannt und geht jetzt zur Anmeldung über



2020.11.15 09:40:48 4: PV_Anlage_1_API: DoAuth called with Steps: 01 02 03
2020.11.15 09:40:48 5: PV_Anlage_1_API: AddToQueue prepends type auth03 to URL http://%IP-Address_Plenticore%/api/v1/auth/create_session, data %SESSION%, header Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive, retry 0, initial queue len: 0
2020.11.15 09:40:48 5: PV_Anlage_1_API: AddToQueue prepends type auth02 to URL http://%IP-Address_Plenticore%/api/v1/auth/finish, data %FINISH%, header Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive, retry 0, initial queue len: 1
2020.11.15 09:40:48 5: PV_Anlage_1_API: AddToQueue prepends type auth01 to URL http://%IP-Address_Plenticore%/api/v1/auth/start, data %START%, header Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive, retry 0, initial queue len: 2
2020.11.15 09:40:48 5: PV_Anlage_1_API: HandleSendQueue called from HTTPMOD::DoAuth, qlen = 3
>>> drei Anmeldeschritte sind in die Queue gestellt

2020.11.15 09:40:48 5: PV_Anlage_1_API: StartQueueTimer called from HTTPMOD::ReadyForSending sets internal timer to process queue in 1.000 seconds, minSendDelay 0.2 not over
2020.11.15 09:40:48 5: PV_Anlage_1_API: AddToQueue adds type get20 to URL http://%IP-Address_Plenticore%/api/v1/processdata/scb:statistic:EnergyFlow, no data, header authorization: Session %auth_sessionId%, retry 1, initial queue len: 3
2020.11.15 09:40:48 5: PV_Anlage_1_API: HandleSendQueue called from HTTPMOD::AddToSendQueue, qlen = 4
>>> die original Anfrage kommt ans Ende der Queue

>>> Jetzt geht es mid sid01 los
2020.11.15 09:40:48 5: PV_Anlage_1_API: StartQueueTimer called from HTTPMOD::ReadyForSending sets internal timer to process queue in 1.000 seconds, minSendDelay 0.2 not over
2020.11.15 09:40:48 4: PV_Anlage_1_API: CheckAuth requeued request get20 after auth, retryCount 0 ...
2020.11.15 09:40:49 5: PV_Anlage_1_API: HandleSendQueue called from HandleTimeout, qlen = 4
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} input: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%FINISH%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("finish","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"))} input: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%SESSION%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("session","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"),ReadingsVal("$NAME","auth_token","missed"))} input: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%auth_signature%), mode reading, value auth_signature input: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive

>>> Hier kommt das replacement für %START%
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: %START%
2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace called for type auth01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} input: %START%

>>> Diese Meldung habe ich auch und stheht auch im Wiki
2020.11.15 09:40:49 3: PV_Anlage_1_API: Replacement 02 with expression {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} (s/(?^:%START%)/{my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")}/gee) created warning: Use of uninitialized value in substitution iterator at ./FHEM/98_HTTPMOD.pm line 878.
>>> Du verwendest eine aktuellere HTTPMOD Version, denn da kommt wieder die Meldung mit dem "/gee)" !!!

2020.11.15 09:40:49 5: PV_Anlage_1_API: Replace: match for type auth01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")}, input: %START%, result is
>>> Und hier ist die Auswirkung davon, das result ist leer !!!

snip...

2020.11.15 09:40:49 4: PV_Anlage_1_API: HandleSendQueue sends auth01 with timeout 7 to http://192.168.3.71/api/v1/auth/start, No Data,
header: Accept-Encoding: gzip,deflate
Content-type: application/json, Accept: application/json, Connection: keep-alive
>>> die Konsequenz ist ein "No Data"
>>> Ein Beispiel von plenticore_auth("start","user","PV_Anlage_1_API") findet sich im Wiki

2020.11.15 09:40:49 5: PV_Anlage_1_API: StartQueueTimer called from HTTPMOD::HandleSendQueue sets internal timer to process queue in 1.000 seconds
2020.11.15 09:40:49 5: PV_Anlage_1_API: ReadCallback called from __ANON__
2020.11.15 09:40:49 4: PV_Anlage_1_API: Read callback: request type was auth01 retry 0,
header: HTTP/1.1 405 METHOD NOT ALLOWED
Server: nginx/1.15.2
Date: Sun, 15 Nov 2020 08:40:49 GMT
Content-Type: application/json
Content-Length: 63
Connection: close
Allow: POST, OPTIONS
Access-Control-Allow-Origin: *, body length 63
2020.11.15 09:40:49 5: PV_Anlage_1_API: Read callback: body
{"message":"The method is not allowed for the requested URL."}

>>> Ohne das data Statement meldet der Plenticore einen Fehler.


Bei diesem Problem kann nur der HTTPMOD Thread helfen.

Ich empfehle einen restore vom HTTPMOD auf eine ältere version, bis das Problem mit dem "/gee)" gelöst ist.

FVERSION 98_HTTPMOD.pm:0.228400/2020-09-24
ModuleVersion 3.5.22 - 7.2.2020

Ich habe diesen Tread im HTTPMOD verlinkt.

Viele Grüße
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 November 2020, 12:22:34
EDIT: plin und ich haben die neueste Version gerade bereits getestet. Ich vermute mit dem nächsten Update sollte es dann auch mit der aktuellen Version laufen, sobald Stefan es eingechecked hat.

Zitat
Im HTTPMOD scheinen noch Probleme zu bestehen, bitte aktualisiert dieses Modul noch nicht!!!
Diese Version funktioniert noch.

FVERSION 98_HTTPMOD.pm:0.228400/2020-09-24
ModuleVersion 3.5.22 - 7.2.2020

Nach einer Wiederherstellung der alten Version ist ein "shutdown restart" notwendig !
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 November 2020, 15:54:26
Hallo zusammen,
ich weiß zwar nicht mehr wer es gefragt hatte, aber es ist bald soweit.

Es ging um die zu erwartende gesamt Leistung aus der Prognose Solar_Calculation_fc[0|1] , die direkt in die Datenbank geschrieben wird, damit sie dann in den Diagrammen eingezeichnet wird.
Im PV_Anlage_1 Device steht immer nur der aktuelle Wert  der laufenden Stunde.

Nun war Heiko so nett und hat eine neue Begin- und Endezeit ins DbRep eingefügt. Vielen Dank dafür an Heiko :-) , auch wenn wir die ersten sind, die schon Werte für den nächsten Tag haben.

Hier ein Beispiel für die Definition des DbRep für eine Prognoseabfrage vom nächsten Tag.

defmod LogDBRep_Test DbRep LogDB
attr LogDBRep_Test DbLogExclude .*
attr LogDBRep_Test aggregation day
attr LogDBRep_Test allowDeletion 0
attr LogDBRep_Test device PV_Anlage_1
attr LogDBRep_Test reading Solar_Calculation_fc1
attr LogDBRep_Test room Strom->Energie,System
attr LogDBRep_Test timestamp_begin next_day_begin
attr LogDBRep_Test timestamp_end next_day_end


Hiermit kann man nun den Wert im Device erstellen lassen

set LogDBRep_Test sumValue display

und es entsteht ein reading

2020-11-15__PV_Anlage_1__Solar_Calculation_fc1__SUM__2020-11-15     8240.0000      2020-11-15 15:37:07

dies kann man noch etwas umbenennen lassen

attr LogDBRep_Test readingNameMap Solar_Calculation_fc1_Sum


2020-11-15__Solar_Calculation_fc1_Sum__2020-11-15     8240.0000      2020-11-15 15:39:07


oder man schreibt den Wert wieder in die Datenbank.

Die Genauigkeit von diesem Wert kann man nur als grobe Schätzung bezeichnen und soll letztendlich das ergeben, was auf jeden Fall zu erwarten ist.
Am Diagramm von heute kann man sehen, das es über der Prognose noch einiges an Ertrag gegeben hat
Hier mal die Summen für den heutigen Tag.

Laut Plenticore Statistik 10.01 KWh Bezug von PV.
Summe Forecast fc_1  8.24 KWh (wurde gestern berechnet)
Dazu noch das passende Diagram


Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 November 2020, 16:32:08
Und nun der Bericht zum Plenticore FW update.

Die FW und das PDF mit der Beschreibung von der Webseite runterladen.
Im Web Gui des Plenticore den update nach der Anleitung ausführen.
Nach dem Neustart dauert es einige Zeit, bis man sich wieder am Plenticore anmelden kann, nur Geduld.

Ich vermute, durch die Erweiterung im Bereich der Batteriesteuerung wurden die Einstellungen nicht sauber übernommen.
Bitte überprüft die Einstellungen im Servicemenü/Batterieeinstellungen.
Die neue Option Batteriesteuerung intern ist für den Anwender nicht zu verstellen.
"MinSoc" und "Intelligente Batteriesteuerung aktivieren" waren wohl auf einem Default Wert.

Die Abfrage von ModBus mit dem PV_Anlage_1 lief problemlos weiter.

Leider passen die Abfragen vom PV_Anlage_1_API Statistic_* nicht mehr, die ich dann noch anpassen werde.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 November 2020, 17:29:01
Hallo zusammen,

ich werde gleich noch die PV_Anlage_1_API für Firmware 01.16.05025 des Plenticore ins Wiki stellen.
Diese beinhaltet dann schon mal einige neue Statistiken und die bisherigen natürlich auch.
Neu sind dann bisher diese, die als day, month, year und total verfügbar sind.

Diese hier sind für die Batterie recht interessant und werden dann sicherlich einige userreadings ablösen.
Das dürfte dann auch weiterhin mit Vermutungen über die Batterie Energieflüsse aufräumen.
Statistic_EnergyChargeGrid_Day
Statistic_EnergyChargeInvIn_Day
Statistic_EnergyChargePv_Day
Statistic_EnergyDischarge_Day
Statistic_EnergyDischargeGrid_Day

Das spart dann noch das Aufsummieren
Statistic_EnergyHomeOwn_Total

Und hier kommt noch die Leistung pro String.
Der String, an dem der Speicher hängt ist dann auf Null.
Statistic_EnergyPv1_Day
Statistic_EnergyPv2_Day
Statistic_EnergyPv3_Day


Mit den nacharbeiten mach ich dann die Woche weiter.

EDIT: Die bisherigen get/set Möglichkeiten habe ich getestet und sie funktionieren mit der Version 1.16 des Plenticore weiterhin.

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 16 November 2020, 12:19:29
Hi ch.eick

die neuen Modbus Register habe ich so eingebunden:

attr Plenticore dev-type-Fl_R2-format %.2f
attr Plenticore dev-type-Fl_R2-len 2
attr Plenticore dev-type-Fl_R2-revRegs 1
attr Plenticore dev-type-Fl_R2-unpack f>

attr Plenticore obj-h1046-poll 1
attr Plenticore obj-h1046-reading TotalDCChargeEnergy(DC-sideToBattery)
attr Plenticore obj-h1046-type Fl_R2
attr Plenticore obj-h1048-poll 1
attr Plenticore obj-h1048-reading TotalDCDischargeEnergy(DC-sideFromBattery)
attr Plenticore obj-h1048-type Fl_R2
attr Plenticore obj-h1050-poll 1
attr Plenticore obj-h1050-reading TotalACChargeEnergy(AC-sideToBattery)
attr Plenticore obj-h1050-type Fl_R2
attr Plenticore obj-h1052-poll 1
attr Plenticore obj-h1052-reading TotalACDischargeEnergy(batteryToGrid)
attr Plenticore obj-h1052-type Fl_R2
attr Plenticore obj-h1054-poll 1
attr Plenticore obj-h1054-reading TotalACChargeEnergy(gridToBattery)
attr Plenticore obj-h1054-type Fl_R2
attr Plenticore obj-h1056-poll 1
attr Plenticore obj-h1056-reading TotalDCPVEnergy(sumOfAllPVInputs)
attr Plenticore obj-h1056-type Fl_R2
attr Plenticore obj-h1058-poll 1
attr Plenticore obj-h1058-reading TotalDCEnergyFromPV1
attr Plenticore obj-h1058-type Fl_R2
attr Plenticore obj-h1060-poll 1
attr Plenticore obj-h1060-reading TotalDCEnergyFromPV2
attr Plenticore obj-h1060-type Fl_R2
attr Plenticore obj-h1062-poll 1
attr Plenticore obj-h1062-reading TotalDCEnergyFromPV3
attr Plenticore obj-h1062-type Fl_R2
attr Plenticore obj-h1064-poll 1
attr Plenticore obj-h1064-reading TotalEnergyAC-sideToGrid
attr Plenticore obj-h1064-type Fl_R2
attr Plenticore obj-h1066-poll 1
attr Plenticore obj-h1066-reading TotalDCPower(sumOfAllPVInputs)
attr Plenticore obj-h1066-type Fl_R2


So werden die Werte gelesen.
Ich habe bisher noch nicht verstanden, was der Unterschied zwischen TotalACChargeEnergy(AC-sideToBattery) und TotalACChargeEnergy(gridToBattery) ist. Wird bei euch vermutich 0 sein, da mit einem Wechserichter ja nicht aus AC geladen wird.
Gewünscht hätte ich mir sowas wie, Laden aus EVU Netz und Laden aus anderer AC Quelle, aber nicht aus EVU Netz. Ist es bei mir aber nicht. GridToBattery ist geringfügig niedriger als AC-sideToBattery.
Viele Grüße
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 November 2020, 14:12:56
Zitat von: killah78 am 16 November 2020, 12:19:29
die neuen Modbus Register habe ich so eingebunden:

So werden die Werte gelesen.
Ich habe bisher noch nicht verstanden, was der Unterschied zwischen TotalACChargeEnergy(AC-sideToBattery) und TotalACChargeEnergy(gridToBattery) ist. Wird bei euch vermutich 0 sein, da mit einem Wechserichter ja nicht aus AC geladen wird.
Gewünscht hätte ich mir sowas wie, Laden aus EVU Netz und Laden aus anderer AC Quelle, aber nicht aus EVU Netz. Ist es bei mir aber nicht. GridToBattery ist geringfügig niedriger als AC-sideToBattery.

Hallo und vielen Dank,
dann kann ich die jetzt ja so übernehmen.

Ich deute jetzt mal, unter der Prämisse, dass es dort einen KSEM gibt, die Glaskugel.
   TotalACChargeEnergy(AC-sideToBattery)
        Hier wird die Energie von der AC Seite genommen, ohne das es aus dem Grid kommt. Dafür muss ein zweiter WR da sein, der die Energie liefert.
        Speicher wird geladen, aber KSEM sagt kein Bezug aus dem Netz und kein Bezug über PV

   TotalACChargeEnergy(gridToBattery)
        Hier wurde mit dem KSEM festgestellt, dass die Energie aus dem Grid kam
        Speicher wird geladen und KSEM meldet Netzbezug. Wird gleichzeitig PV Energie geliefert, müsste diese natürlich mit berücksichtigt werden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 16 November 2020, 15:14:24
Ja genauso hätte ich es mir auch vorgestellt.
So funktioniert es aber leider nicht. Es wird von AC Seite geladen, aber eben nicht aus dem Netz. Trotzdem werden diese beiden Register gefüllt.
Der eine eben nur einen Tick geringer als der andere.
Und ja, KSEM ist Netzseitig verbaut.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 November 2020, 17:29:28
Zitat von: killah78 am 16 November 2020, 15:14:24
Ja genauso hätte ich es mir auch vorgestellt.
So funktioniert es aber leider nicht. Es wird von AC Seite geladen, aber eben nicht aus dem Netz. Trotzdem werden diese beiden Register gefüllt.
Der eine eben nur einen Tick geringer als der andere.
Und ja, KSEM ist Netzseitig verbaut.
Dann würde ich das direkt bei Kostal melden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 November 2020, 18:07:36
So, auf der Wiki Seite gibt es eine aktualisierte Versin des PV_Anlage_1_API für v1.16


- Die Benennung der get und set Aufrufe hat sich geändert
- interne/externe Batterie Abfragen
- Batterie Abfrage ist nun nach intern/extern gruppiert, sodass gleichzeitig mehrere Werte gelesen werden
- interne Batterie Steuerung mit set Befehlen (ging bisher auch schon)
- Statistic_ Werte sind nun mit zwei Nachkommastellen Formatiert
- Es gibt zusätzliche Statistic_* Werte


Natürlich wird hier noch einiges kommen um die neuen Werte mit ein zu bauen. Dafür muss ich sie aber erstmal sichten.
Eigene userreadings können wahrscheinlich entfernt werden, so wie das bisher gesehen habe.

Bei der Batteriesteuerung könnte man sich noch sinnvolle Szenarien überlegen. Bitte seit etwas vorsichtig und schreibt Euch die bisherige Konfiguration auf, bevor Ihr dort Werte ändert.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 November 2020, 18:14:40
Hallo zusammen,
mal wieder ein Randthema. Wer die Prognosekurve für Morgen schon mal sehen möchte, der das in Grafana mit der Angabe einer Absoluten Zeit erreichen.

Im DbRep ist nun auch ein next_day_[begin|end] enthalten, mit dem man nun auch die daten wieder abfragen und z.B. ein sumValue durchführen kann.
Genaueres siehe hier: Prognose vom nächsten Tag sehen (https://forum.fhem.de/index.php/topic,114849.msg1101391.html#msg1101391)

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 17 November 2020, 19:47:54
done  :D
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 17 November 2020, 20:10:00
Zitat von: ch.eick am 17 November 2020, 18:14:40
Wer die Prognosekurve für Morgen schon mal sehen möchte, der das in Grafana mit der Angabe einer Absoluten Zeit erreichen.

Nicht nur. Ich verwende dafür den Zeitraum now/d to now+7d. Dann sieht man den aktuellen Tag sowie die nächsten x Tage.

VG Peter
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 18 November 2020, 09:24:44
Kurze Zwischenfrage:
Ich habe bei mir bemerkt, dass wenn ich apptime starte, keine Aktualisierung der Modbus Devices mehr stattfindet.
Ich muss dann fhem restarten, dann geht es weiter.
Betroffen sind bei mir beide Wechelrichter und auch der KSEM.
Kann das mal jemand probieren, ob das bei mir ein lokales Problem ist?
Danke und Gruss
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 November 2020, 09:34:48
Hallo zusammen,
ich glaube es war unser Schweizer Mitglied, der diese Frage mal hatte.
Es geht um die eventuell zu erreichende Leistung für den nächsten Tag aus dem Forecast. Daraus habe ich nun zumindest die Summe der Stundenprognose gebildet.
Zumindest bekommt man einen Wert, der mindestens erreicht werden sollt. Es ist natürlich ein Glaskugellesen, da der Himmel auch mal schnell aufreißen kann. Die Qualität
hängt natürlich auch von Eurem fine Tuning mit den Parametern von Solar_forecast() ab. Für meinen Fall bin ich zumindest zufrieden.


defmod LogDBRep_Test DbRep LogDB
attr LogDBRep_Test DbLogExclude .*
attr LogDBRep_Test comment Version 2020.11.18 09:00
attr LogDBRep_Test device PV_Anlage_1
attr LogDBRep_Test reading Solar_Calculation_fc1
attr LogDBRep_Test room Strom->Energie,System

setstate LogDBRep_Test 2020-11-17 19:59:17 sqlCmd SELECT sum(VALUE) AS 'Solar_calculation_fc1_tomorrow' FROM history WHERE DEVICE = 'PV_Anlage_1' AND READING = 'Solar_Calculation_fc1' AND TIMESTAMP > DATE_ADD(DATE(now()),INTERVAL 1 DAY) AND TIMESTAMP < DATE_ADD(DATE(now()),INTERVAL 2 DAY);;

Das Ergebnis sähe dann z.B. so aus und Ihr könnt über das reading SqlResultRow_2 den Wert abfragen.

SqlResultRow_1 SOLAR_CALCULATION_FC1_TOMORROW
SqlResultRow_2 9288


Generisch betrachtet gibt es so die Möglichkeit mit SQL jeden beliebigen Wert zu errechnen und das Ergebnis mit dieser Abfrage weiter zu verarbeiten.

ReadingVal("LogDBRep_Test","SqlResultRow_2","error")


Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 November 2020, 09:39:02
Zitat von: killah78 am 18 November 2020, 09:24:44
Kurze Zwischenfrage:
Ich habe bei mir bemerkt, dass wenn ich apptime starte, keine Aktualisierung der Modbus Devices mehr stattfindet.
Ich muss dann fhem restarten, dann geht es weiter.
Betroffen sind bei mir beide Wechelrichter und auch der KSEM.
Kann das mal jemand probieren, ob das bei mir ein lokales Problem ist?
Danke und Gruss
Hi killah78,
das solltest Du besser im Thread für Modbus platzieren, da wird es von den passenden Fachleuten gesehen.

Das ist jedoch wieder ein gutes Beispiel, warum ich kein Modul erstellt habe :-)

EDIT: Ich habe das apptime noch nie verwendet, aber gerade mal ein "apptime max" ausgeführt
          Bei mir läuft das PV_Anlage_1 Device mit den reading updates ganz normal weiter.
          Was möchtest Du bitte genau als Aufruf getestet haben?

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 November 2020, 18:20:47
Hallo zusammen,
jetzt habe ich auch mal eine Frage.
Hat schon mal jemand die neuen readings gedeutet? Ich hab da momentan eine Gedanken Blockade und bekomme die Werte im Kopf nicht zugeordnet.

Der Hintergrund ist, dass ich gerne einige userreadings, die ich erstellt habe ablösen möchte.
Bitte erhellt mich mit Euren Erklärungen :-)

PV_Anlage_1_API

Das ist neu für die Batterie
Statistic_EnergyChargeGrid_Day 0.00          <<< Wenn aus dem Netz geladen wird
Statistic_EnergyChargeInvIn_Day 0.02          <<< Was soll das sein?
Statistic_EnergyChargePv_Day 4483.88          <<< Das ist dann von PV in die Batterie geladen worden

Statistic_EnergyDischargeGrid_Day 0.17         <<< Leider kann wohl auch mal was ins Netz entladen werden.
Statistic_EnergyDischarge_Day 1711.62          <<< Das wird dann über den Tag aus der Batterie entnommen

Statistic_EnergyPv1_Day 7837.86                <<< Leistung aus den einzelnen Strings zusammen 15,9 KW
Statistic_EnergyPv2_Day 8067.02
Statistic_EnergyPv3_Day 0 <<< da ist die Batterie dran


PV_Anlage_1

Total ist immer ein Statistik Wert

Battery_Total_AC_Charge_Energy_(AC-sideToBattery) 2.33                   <<< Das war ein Test mit MinSoc, da wurde aus dem Netz geladen
Battery_Total_AC_Charge_Energy_(gridToBattery) 0.00                      <<< aber dann sollte das ja eigentlich hier stehen. Ich habe keine zweite AC Quelle

Battery_Total_AC_Discharge_Energy_(batteryToGrid) 8.79                   <<< Wo das her kommt verstehe ich auch nicht. Das könnten 8.79 KWh seit betrieb der Anlage sein, die ins Netz gelaufen sind.
Battery_Total_DC_Charge_Energy_(DC-sideToBattery) 9468.69                <<< Brutto in die Batterie
Battery_Total_DC_Discharge_Energy_(DC-sideFromBattery) 7917.56          <<< Netto wieder raus    Wirkungsgrad wäre dann 84 % auf die Gesamtzeit des Speichers

Battery_charge_current 20.00                                            <<< Das ist der Entladestrom, ich laufe gerade auf Batterie
Battery_gross_capacity 1638400


Nun sind folgende userreadings im PV_Anlage_1

Power_DC_Sum:Total_DC_Power.* { ReadingsVal($NAME,"Power_DC1","0")+ReadingsVal($NAME,"Power_DC2","0") },

Total_PV_Power_reserve:Total_DC_Power.* {my $reserve = ReadingsVal($NAME,"Power_DC_Sum","0") * 0.90 - ReadingsVal($NAME,"Home_own_consumption_from_PV","0");; ($reserve lt 0)?0:round($reserve,3)  },

Total_DC_Power_Max:Total_DC_Power.* { my $Bat_out = (ReadingsVal($NAME,"Actual_battery_charge_-minus_or_discharge_-plus_current","0")*ReadingsVal($NAME,"Battery_voltage","0"));; ($Bat_out gt 0)?ReadingsVal($NAME,"Power_DC_Sum","0") + $Bat_out :ReadingsVal($NAME,"Power_DC_Sum","0") },

Actual_battery_charge_-minus_or_discharge_-plus_Power:Actual_battery_charge_-minus_or_discharge_-plus_current.* {round((ReadingsVal($NAME,"Actual_battery_charge_-minus_or_discharge_-plus_current","0")*ReadingsVal($NAME,"Battery_voltage","0")),0)},

Actual_battery_charge_usable_Power:Act_state_of_charge.* {my $x = (ReadingsVal($NAME."_config","Battery_Total_Power","0")*(ReadingsVal($NAME,"Act_state_of_charge","0")-10)/100);; ($x lt 0)?0:round($x,0) }


und im PV_Anlage_1_API sind diese

Statistic_EnergyHomePvSum_Day:Statistic_EnergyHomePv_Day.* {round( (ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day", "0")+ReadingsVal("$NAME","Statistic_EnergyHomePv_Day", "0")) ,2)},

Statistic_EnergyFeedInGrid_Day:Statistic_Yield_Day.* {round((ReadingsVal("$NAME","Statistic_Yield_Day", "")-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day", "0")-ReadingsVal("$NAME","Statistic_EnergyHomePv_Day", "0")),2)},

Statistic_TotalConsumption_Day:Statistic_EnergyHomePv_Day.* {round( (ReadingsVal("$NAME","Statistic_EnergyHomePv_Day","0")+ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day","0")+ReadingsVal("$NAME","Statistic_EnergyHomeGrid_Day","0") ) ,2)},

Statistic_Yield_NoBat_Day:Statistic_Yield_Day.* {round((ReadingsVal("$NAME","Statistic_Yield_Day", "0")-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day", "0")),2)},


Es wäre toll, wenn sich da mal jemand ran setzen könnte um zu schauen, welche von den Werten nun überflüssig wären?

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 18 November 2020, 20:33:51
Zitat von: ch.eick am 18 November 2020, 09:34:48
Hallo zusammen,
ich glaube es war unser Schweizer Mitglied, der diese Frage mal hatte.
Es geht um die eventuell zu erreichende Leistung für den nächsten Tag aus dem Forecast. Daraus habe ich nun zumindest die Summe der Stundenprognose gebildet.
Zumindest bekommt man einen Wert, der mindestens erreicht werden sollt. Es ist natürlich ein Glaskugellesen, da der Himmel auch mal schnell aufreißen kann. Die Qualität
hängt natürlich auch von Eurem fine Tuning mit den Parametern von Solar_forecast() ab. Für meinen Fall bin ich zumindest zufrieden.


defmod LogDBRep_Test DbRep LogDB
attr LogDBRep_Test DbLogExclude .*
attr LogDBRep_Test comment Version 2020.11.18 09:00
attr LogDBRep_Test device PV_Anlage_1
attr LogDBRep_Test reading Solar_Calculation_fc1
attr LogDBRep_Test room Strom->Energie,System

setstate LogDBRep_Test 2020-11-17 19:59:17 sqlCmd SELECT sum(VALUE) AS 'Solar_calculation_fc1_tomorrow' FROM history WHERE DEVICE = 'PV_Anlage_1' AND READING = 'Solar_Calculation_fc1' AND TIMESTAMP > DATE_ADD(DATE(now()),INTERVAL 1 DAY) AND TIMESTAMP < DATE_ADD(DATE(now()),INTERVAL 2 DAY);;

Das Ergebnis sähe dann z.B. so aus und Ihr könnt über das reading SqlResultRow_2 den Wert abfragen.

SqlResultRow_1 SOLAR_CALCULATION_FC1_TOMORROW
SqlResultRow_2 9288


Generisch betrachtet gibt es so die Möglichkeit mit SQL jeden beliebigen Wert zu errechnen und das Ergebnis mit dieser Abfrage weiter zu verarbeiten.

ReadingVal("LogDBRep_Test","SqlResultRow_2","error")


Gruß
    Christian

Funktioniert 1A! Vielen Dank. Ich bin gespannt auf den Vergleich zwischen Forecast und tatsächliche Werte!
Gruss aus der Schweiz

Jetzt bleibt mir nur noch die Umstellung auf das neue API Device.. Leider happerts da noch, ich erhalte beim RAW Import immer eine Fehlermeldung...
mal schauen...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 November 2020, 23:22:18
Zitat von: Mumpitz am 18 November 2020, 20:33:51
Jetzt bleibt mir nur noch die Umstellung auf das neue API Device.. Leider happerts da noch, ich erhalte beim RAW Import immer eine Fehlermeldung...
mal schauen...
Schick mir doch mal die Meldungen, ich hatte heute noch updates gemacht. Es war leider wieder sehr viel Arbeit und d leidet die Konzentration :-(
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 November 2020, 18:43:59
Hey Mitstreiter,
für die unter uns, die noch einen BYD HV Speicher Ihr eigen nennen können habe ich das BYD_Speicher Device umgebaut.
Die Anmeldung war nicht wirklich schön und mit etwas Mühe habe ich das nun umgestellt.

- KeyValue() wird nun auch hier verwendet, wodurch das Passwort nun nicht mehr im Device zu sehen ist.
- Die Anmeldung erfolgt nun über den sid Mechanismus vom HTTPMOD
- Es konnten einige replacements entfernt werden
- Das userreading ist nun aufgeräumt
- Ein frisches Login kann man durch "deletereading BYD_Status .*" erzwingen
- Eine beliebige Abfrage fürt ein eventuell notwendiges Login automatisch durch

Momentan gibt es noch Probleme mit der aktuellen HTTPMOD Version, wodurch diverse zwischen readings, die bisher gelöscht wurden nun leider stehen bleiben.
Als workaround kann man diese so löschen:

deletereading BYD_Status .*-.*


Um diese Neuerung nutzen zu können sollte man zuerst auf die Plenticore v1.16 und die PV_Anlage_1* Devices umgestellt haben, da dort z.B. die KeyVakue() Installation durchgeführt wird.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 November 2020, 09:54:36
Moin, moin.
Gestern hatten wir mal wieder ein undercover Thema, was dann auch in der Prognoseanpassung mündete. Hier mal ein Beispiel, wie man Solar_Plain() im Grenzbereich für sich anpassen kann.
Der Grenzbereich ist morgens und abends, da wird aufgrund vom elevation Stand der Funktionswert auf 0.001 gesetzt, wenn es unwahrscheinlich ist, das der errechnete Wert sinn macht.

Wir testen nun noch einwenig und ich würde dann diesen Wert mit in PV_Anlage_1_config mit aufnehmen.

An welchen Parametern muss ich da schrauben ?

attr global verbose 3
https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Solar_plain.28.29_Test

Um 08:00 Uhr regelt die Funktion noch ab., da die Sonne zu tief steht
{Solar_plain(45,40,"2020-11-19 08:00:00") }
2020.11.19 10:59:15.530 3: get Astro text SunAz 2020-11-19 08:00:00 : 123
2020.11.19 10:59:15.537 3: get Astro text SunAlt 2020-11-19 08:00:00 : 1.6
2020.11.19 10:59:15.538 3: Solar_plain: azimuth = 123, orientation=-1.89296285953644, elevation=0.0279251605696733, angle=0.785395141022061
2020.11.19 10:59:15.538 3: Solar_plain: factor = 0.001

Ab 09:00 Uhr geht es dann los
{Solar_plain(45,40,"2020-11-19 09:00:00") } => 1.091
2020.11.19 11:00:27.433 3: get Astro text SunAz 2020-11-19 09:00:00 : 135
2020.11.19 11:00:27.438 3: get Astro text SunAlt 2020-11-19 09:00:00 : 9.1
2020.11.19 11:00:27.438 3: Solar_plain: azimuth = 135, orientation=-1.48352415526389, elevation=0.158824350740017, angle=0.785395141022061
2020.11.19 11:00:27.439 3: Solar_plain: factor = 1.09189342979292

=========== code Zeilen
    # avoid unrealistic values (normally formula should only be used within boundaries of orientation +/- 90 degrees)
    if ($elevation <= 0.14) {
      Log 3, "Solar_plain: factor = $factor";
      return($factor);
    };
==================

Änderung des Gültigkeitbereiches
=========== code Zeilen
    # avoid unrealistic values (normally formula should only be used within boundaries of orientation +/- 90 degrees)
#    if ($elevation <= 0.14) {
    if ($elevation <= 0.02792) {
      Log 3, "Solar_plain: factor = $factor";
      return($factor);
    };
==================

Danach testen und schauen, ob es passt
{Solar_forecast("LogDB","LogDBRep_delete_PV_Forecast","PV_Anlage_1","Solar_Calculation_fc","DWD_Forecast",0)}

Die neue Kurve wird dann um 7:00 Uhr auf Null sein und für 8:00 Uhr einen Wert liefern.

Das ist dann aber ein experimentelles Tuning, wenn es klappt bitte bescheid geben, dann könnte ich den Wert mit in PV_Anlage_1_config aufnehmen.

Das eine Diagramm zeigt den Forecast mit einem letzten Null Wert um 8:00 Uhr und einer Teilverschattung um 14:45 durch ein Nachbarhaus im Winter.
Deim zweiten Diagramm von heute Morgen sieht man den neuen Null Wert um 07:00 Uhr und den ersten Prognose Wert um 08:00 Uhr. Dadurch bekommt die Kurve einen leichten Knick am frühen Morgen. Dieser Knick müsste nun noch mit den Sommerdaten verglichen werden, was sich dann nächstes Jahr zeigen wird. Ich denke Jürgen wird uns heute Abend nochmal einen Update schicken ;-)

Nun zur Teilverschattung, der eigentlichen Frage. Hier hat der Solarteur keine Leistungsoptimierer verbaut und auch nur einen String1 verdrahtet, obwohl es am WR noch einen freien String2 gibt. Hätte man die verschatteten Module separat verdrahtet und von den unverschatteten getrennt, wäre nur dieser String eingebrochen und der zweite könnte noch länger produzieren. Dies wird wahrscheinlich nun noch korrigiert.

Im dritten Diagramm sind mal die drei Prognosen meiner Anlage für Ost/Süd/West und der daraus resultierende gesamt Forecast zu sehen. Bei dieser Anlage sind Ost und West die größten Flächen und der Süden ist hälftig mit Leistungsoptimierern zu Ost und West im jeweiligen String aufgenommen. Der Plenticore 10 hat drei Strings , wobei einer für die batterie verwendet wird und somit nur zwei Strings für die Module verwendet werden konnten.

VG
   Christian
und dank an Jürgen für diesen Einblick.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 20 November 2020, 09:55:39
Hallo ch.eick
Also zu den Deutungen:
die neuen API Werte sind analog zu den neuen Modbuswerten. Nur halt kumulierte Tageswerte.
Derzeit lese ich per Modbus und kumuliere per statistics Modul.


TotalACChargeEnergy(AC-sideToBattery)
TotalACChargeEnergy(gridToBattery)

Das sind Zählwerte, wenn die Batterie über AC geladen wird. Dazu gibt es ja auch die Option im Wechselrichter, dass man das explizit erlauben muss.
Ich habe einen zweiten Wechselrichter, daher kommen bei mir Werte an.
Allerding habe ich immer beide Readings gefüllt. GridToBattery immer einen Tick weniger als AC-sideToBattery. Wenn die Idee dahinter ist zwischen "interner" AC Ladung und Ladung über EVU zu unterscheiden, funktioniert sie leider nicht.


TotalACDischargeEnergy(batteryToGrid) -> Einspeisung aus Batterie. Wird ja immer minimal anfallen, weil Wechselrichter ja nicht so schnell auf ändernden Energiebedarf reagieren kann. Werte sind bei mir auch immer minimal.

TotalDCChargeEnergy(DC-sideToBattery) -> Laden aus DC Seite. Allerdings scheint nicht das Laden der AC Seite eingeschlossen zu sein. Mein Wert für DCCharge ist deutlich geringer als der DCDischarge. Da kann man nicht mit Effizienz erklären. Wenn ich ACCharge und DCCharge addiere hätte ich gegen das DCDischarge einen Verlust von 7%

TotalDCDischargeEnergy(DC-sideFromBattery) -> Entladen der Batterie
TotalDCEnergyFromPV1
TotalDCEnergyFromPV2
TotalDCEnergyFromPV3
TotalDCPVEnergy(sumOfAllPVInputs) -> DC Energiezähler der Photovoltaikstrings. Also das was wirklich vom Dach reinkommt.

TotalDCPower(sumOfAllPVInputs) -> DC Leistung vom Dach.
TotalEnergyAC-sideToGrid -> Einspeisung ins EVU Netz. Im Gegensatz zu Yield scheint das die Energie zu sein, die tatsächlich eingespeist wird, wogegen Yield die über AC abgegebene Energie ist, die gegebenfalls auch selbst verbraucht werden kann.




Zu den userReadings:
Power_DC_Sum ist jetzt TotalDCPower(sumOfAllPVInputs).
Statistic_EnergyFeedInGrid ist TotalEnergyAC-sideToGrid.
Die anderen sollten beibehalten werden denke ich.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 November 2020, 10:06:57
Zitat von: killah78 am 20 November 2020, 09:55:39
TotalACChargeEnergy(AC-sideToBattery)
TotalACChargeEnergy(gridToBattery)

Das sind Zählwerte, wenn die Batterie über AC geladen wird. Dazu gibt es ja auch die Option im Wechselrichter, dass man das explizit erlauben muss.
Ich habe einen zweiten Wechselrichter, daher kommen bei mir Werte an.
Allerding habe ich immer beide Readings gefüllt. GridToBattery immer einen Tick weniger als AC-sideToBattery. Wenn die Idee dahinter ist zwischen "interner" AC Ladung und Ladung über EVU zu unterscheiden, funktioniert sie leider nicht.
Das sehe ich auch als Fehler an. Wenn Du Muße hast, kannst Du es ja mal bei Kostal melden.

[/quote]
TotalACDischargeEnergy(batteryToGrid) -> Einspeisung aus Batterie. Wird ja immer minimal anfallen, weil Wechselrichter ja nicht so schnell auf ändernden Energiebedarf reagieren kann. Werte sind bei mir auch immer minimal.
Zitat
Sehe ich auch so.

Zitat
TotalDCChargeEnergy(DC-sideToBattery) -> Laden aus DC Seite. Allerdings scheint nicht das Laden der AC Seite eingeschlossen zu sein. Mein Wert für DCCharge ist deutlich geringer als der DCDischarge. Da kann man nicht mit Effizienz erklären. Wenn ich ACCharge und DCCharge addiere hätte ich gegen das DCDischarge einen Verlust von 7%
Okay, dann nehme ich eine Statistic_Effizienz aus diesen Werten mit auf.

DCDischarge * 100 / (ACCharge + DCCharge)


Zitat
TotalDCDischargeEnergy(DC-sideFromBattery) -> Entladen der Batterie
TotalDCEnergyFromPV1
TotalDCEnergyFromPV2
TotalDCEnergyFromPV3
TotalDCPVEnergy(sumOfAllPVInputs) -> DC Energiezähler der Photovoltaikstrings. Also das was wirklich vom Dach reinkommt.

TotalDCPower(sumOfAllPVInputs) -> DC Leistung vom Dach.
TotalEnergyAC-sideToGrid -> Einspeisung ins EVU Netz. Im Gegensatz zu Yield scheint das die Energie zu sein, die tatsächlich eingespeist wird, wogegen Yield die über AC abgegebene Energie ist, die gegebenfalls auch selbst verbraucht werden kann.

Zitat
Zu den userReadings:
Power_DC_Sum ist jetzt TotalDCPower(sumOfAllPVInputs).
Statistic_EnergyFeedInGrid ist TotalEnergyAC-sideToGrid.
Die anderen sollten beibehalten werden denke ich.
Okay, wenn dann kein Widerspruch kommt werde ich die zwei userreading raus nehmen und wider SQL für die Migration der Daten in in der DbLog bereitstellen.

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 November 2020, 10:41:46
Bei diesen Werten ist jedoch noch eine Diskrepanz von 120 Watt.
Die Batterie wird momentan weder geladen, noch entladen!

Power_DC1 540.41
Power_DC2 523.15
Total_DC_Power 1058.02                     <<< das ist auch vom Plenticore, jedoch mit Batterie
Home_own_consumption_from_PV 1051.04

Power_DC_Sum 1027.96                       <<< mein userreading
Total_DC_Power_(sumOfAllPVInputs) 932.58   <<< Und das von Kostal


EDIT:
Es wird wohl ein Lesezeitfehler sein, da die ModBus Register zeitlich versetzt aktualisiert werde. => Das userreading fliegt raus :-)

Geändert wurde hierdurch:

https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#RAW_Definition_PV_Anlage_1
- DbLogInclude
- event-on-change-reading
- stateFormat
- userreading
- delete des reading
    deletereading PV_Anlage_1 Power_DC_Sum

- verschieben der alten Werte in der Datenbank
   UPDATE history SET TIMESTAMP=TIMESTAMP, READING='Total_DC_Power_(sumOfAllPVInputs)' WHERE DEVICE='PV_Anlage_1' and READING='Power_DC_Sum' AND TIMESTAMP > '2019-09-01 00:00:00';

- Diagramm eventuell korrigieren
https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#GPLOTFILE_SVG_LogDB_Photovoltaik_4.gplot
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 November 2020, 11:14:57
Und jetzt auch noch das Thema des Tages :-) , die Batterie Steuerung.

Die Steuerung von MinSoc und MinHomeConsumtion ist bereits über das device PV_Anlage_1_API auch für den Betreiber möglich.
Für den Herbst/Winter habe ich nun einen Vorschlag aus dem Photovoltaikform umgesetzt.

Hintergrund:

Meine Batterie wurde bisher am Tag immer kurz geladen, dann wieder durch die LWP geleert und das immer im Wechsel.
Da ich ja eh Strom zukaufen muss lasse ich die Batterie einfach stetig mit dem Überschuss, den ich nicht sofort verbrauchen kann, laden.
Nun ist Ruhe eingekehrt :-),

Laut dem EFT Service ist es zwar kein Problem die Batterie einfach immer wieder kurz zu laden und sofort wieder zu entladen, doch die jetzige Variante sieht mir schonender aus.
Ich hoffe, dass macht sich dann in längerer Lebenszeit bemerkbar, aber davon kann ich erst in 10 Jahren berichten :-)


Umsetzung:

Bei MinSoc 15% wird MinHomeConsumtion auf den Wert Battery_Info_SoC gesetzt und die Batterie kann schön den ganzen Tag laden, oder im Forum vorgeschlagen bis SoC 90% .
Dadurch, dass MinHomeConsumtion auf die Maximalleistung gesetzt wurde würde die Batterie erst bei diesem Wert entladen dürfen, was eher unwahrscheinlich ist. Wichtig ist nur, dass der gesetzte Wert höher ist, als der zu erwartende Maximalverbrauch des Hauses. Setzt man MinHomeConsumtion auf einen Wert, der den Verbrauch eines Großverbrauchers im Haus nahe kommt, dann würde nur dieser unterstützt. Das nur als Randbemerkung.


Nebeneffekte:

- Das Laden der Batterie kann somit auch mal Tage dauern, wenn zu wenig PV Leistung vom Dach kommt.
- Es wird vermutet, dass der MinSoC Wert bei geringer Leistung in der Batterie ungenau wird,
   aber bei Ladung bis 100% exacter berechnet wird. MinSoC ist keine exakte Wissenschaft.
- Stellt der Kontroller der Batterie fest, das die Leistung in der Batterie einen Grenzwert unterschritten hat,
   wird der MinSoC korrigiert und es kommt zu dem Effekt, das mitten in der Nacht der MinSoC auf einmal
   nach unten fällt. Damit wird dem Wechselrichter signalisiert, das nachgeladen werden muss, um MinSoC
   wieder zu erreichen. Das Resultat ist die bekannte Notladung in der Nacht aus dem Netz.


Meine Umsetzung ist nun im Wiki im PV_Schedule Device (cmd_6 und cmd_7) zu finden. Für die Rosinen Picker, beachtet auch das wait Attribut.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 20 November 2020, 11:25:10
wegen der Diskrepanz:

2020-11-20 11:19:02 DC_Power1 374.53
2020-11-20 11:19:02 DC_Power2 348.59
2020-11-20 11:19:02 DC_Power_Total_W_sum 723.12
2020-11-20 11:19:01 TotalDCPower(sumOfAllPVInputs) 723.12


Passt bei mir ganz gut. Vielleicht "ungünstig" gelesen (zeitlich). Hast du die Abweichung über längere Zeit? Ab und an habe ich auch minimale Abweichungen, aber das wird die Lesezeitfolge sein.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 November 2020, 11:54:47
Die Änderung für Power_DC_Sum ist hier beschrieben.
https://forum.fhem.de/index.php/topic,114849.msg1102811.html#msg1102811 (https://forum.fhem.de/index.php/topic,114849.msg1102811.html#msg1102811)

Und hier nochmal ein SQL Query, um alle readings von einem Device zu listen, die in den letzten 24 Stunden aktualisiert wurden.

SET @device = 'PV_Anlage_1';

SELECT t1.TIMESTAMP,t1.DEVICE,t1.READING,t1.VALUE
  FROM history t1
  INNER JOIN
   (SELECT max(TIMESTAMP) AS TIMESTAMP,DEVICE,READING
      FROM history
      WHERE DEVICE    = @device AND
            TIMESTAMP > NOW() - INTERVAL 1 DAY
      GROUP BY READING) x
  ON x.TIMESTAMP = t1.TIMESTAMP AND
     x.DEVICE    = t1.DEVICE    AND
     x.READING   = t1.READING;
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: billy-boy am 21 November 2020, 02:21:06
Hallo Zusammen

Seit 2 Wochen habe ich nun meine Anlage auf dem Dach und wollte diese jetzt in Fhem integrieren.
Auslesen des KSEM funktioniert.
Einloggen mit Python3 funktioniert.
Beim Einloggen mit API habe ich keine Chance irgendwelche Werte auslesen zu können.
Der KeyValue() Test klappt noch, aber der plenticore_auth() Test mit {plenticore_auth("finish","user","PV_Anlage_1_API","TESMUWZnwkJZbnpF","TE2MUWZnwkJZbnpFQ5ulCfolNNdAD0vT","DbAC0R85jwF0rh+r","29000","1376720346bea40cdf770a8f84b5975cfeb20c5e6ac6d89b7862df3ca9695e43")}
ergibt: "Undefined subroutine &main::derive called at ./FHEM/99_myUtils.pm line 179."

Desweiteren habe ich mal eine Frage zur Einrichtung der PV_Anlage_1_API.
Warum steht im stateFormat nur "PV_Anlage_1" anstatt $name (also PV_Anlage_1_API)?
Das sind doch dann die Werte aus dem Einloggen mit Python.
Da ich diese Abfrage nicht disabled hatte wurden mir die Werte angezeigt.

Es wäre schön wenn mir einer einen Tipp geben könnte.

Danke

Gruß Rainer

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 November 2020, 08:26:10
Hallo Rainer,
willkommen im Team.


Zitat von: billy-boy am 21 November 2020, 02:21:06
Einloggen mit Python3 funktioniert.
Python wurde bereits aus dem PV_Anlage_1_API entfernt.

Du solltest beim Wechselrichter direkt mit der FW 1.16 beginnen. Da ich schon umgestellt habe werden im weiteren nur noch die aktuellen Funktionen unterstützt.
Im Thread kannst Du die ganzen Neuerungen bereits mitverfolgen.
Solltest Du auch einen Speicher haben, dann wird es sicher die neue Generation sein. Meine Speicher direkt Abfrage funktioniert nur mit dem BYD HV, dann
kannst Du das überspringen.

Zitat
Der KeyValue() Test klappt noch.
das ist gut, dann hast Du die Funktionen schon mal in der 99_myUtils und geladen.

Zitat
aber der plenticore_auth() Test mit {plenticore_auth("finish","user","PV_Anlage_1_API","TESMUWZnwkJZbnpF","TE2MUWZnwkJZbnpFQ5ulCfolNNdAD0vT","DbAC0R85jwF0rh+r","29000","1376720346bea40cdf770a8f84b5975cfeb20c5e6ac6d89b7862df3ca9695e43")}
ergibt: "Undefined subroutine &main::derive called at ./FHEM/99_myUtils.pm line 179."
Hast Du auch das hier in 99_myUtils aufgenommen?

use Encode qw(decode encode);
use PBKDF2::Tiny qw/derive verify/;                   <<< Das fehlt Dir definitiv
use Digest::SHA qw(sha256 hmac_sha256);
use Crypt::URandom qw( urandom );
use Crypt::AuthEnc::GCM;


Zitat
Desweiteren habe ich mal eine Frage zur Einrichtung der PV_Anlage_1_API.
Warum steht im stateFormat nur "PV_Anlage_1" anstatt $name (also PV_Anlage_1_API)?

Da ich diese Abfrage nicht disabled hatte wurden mir die Werte angezeigt.
Damit werden aus dem PV_Anlage_1 Device die aktuellen Werte ergänzt., um sie den Statistischen Werten gegenüber zu stellen.

Zitat
Das sind doch dann die Werte aus dem Einloggen mit Python.
Nein ,das ist falsch. Bitte nutze nicht mehr die Python Implementierung. Die Skripte kann man zwar noch verwenden, aber achte bitte auf Wechselwirkungen.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 November 2020, 10:44:42
Guten Morgen und ein schönes Wochenende Euch allen.

Gerade, wenn man eine PV Anlage betreibt, fallen eine sehr große Menge an Daten an und zu beginn weiß man nicht immer, was man brauchen kann und möchte.
Wenn Ihr die Implementierung nach meinem Muster gemacht habt, habe ich bereits zu beginn das Logging ziemlich eingeschränkt und trotzdem ist die Datenbank gewachsen.


SELECT table_schema "DB Name",
    ->        Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"
    ->   FROM  information_schema.tables
    ->   GROUP BY table_schema;
+--------------------+---------------+
| DB Name            | DB Size in MB |
+--------------------+---------------+
| fhem               |        4651.0 |
| information_schema |           0.0 |
+--------------------+---------------+

Bei diesem Datenvolumen habe ich bereits ziemlich aufgeräumt und werde es auch noch weiter tun.

In den Threads  vom DbRep/DbLog findet man dann auch noch etwas zur Spalte EVENT, die wohl historischer Art ist. Wenn man sich sicher ist, dass die Spalte von keinem Device in Fhem genutzt wird, kann diese gelehrt werden und im DbLog deaktiviert werden. Diesen Schritt habe ich nun auch durchgeführt und möchte ihn hier kurz beschreiben.
Wir beginnen mit rund 4.6 GB Datenbank Größe.

Vorgehensweise:

## Immer zuerst einen backup durchführen!

## Im Datenbank Device das füllen der EVENT Spalte deaktivieren
attr LogDB colEvent 0

## Danach ein paar events abwarten und nachschauen, dass die Spalte leer bleibt.
select * from history where DEVICE='PV_Anlage_1_API' and READING='Statistic_EnergyHomePvSum_Day' and TIMESTAMP >= '2020-11-20 18:00:00';
+---------------------+-----------------+---------+-------+-------------------------------+---------+------+
| TIMESTAMP           | DEVICE          | TYPE    | EVENT | READING                       | VALUE   | UNIT |
+---------------------+-----------------+---------+-------+-------------------------------+---------+------+
| 2020-11-20 18:57:04 | PV_Anlage_1_API | HTTPMOD |       | Statistic_EnergyHomePvSum_Day | 4320.29 |      |
+---------------------+-----------------+---------+-------+-------------------------------+---------+------+

## Nun wird die Spalte aus der Tabelle entfernt, oder man könnte auch jeden Eintrag mit NULL überschreiben
## Je nach Leistung des Datenbank Servers kann dies einige Zeit laufen und auch, wie bei mir zum Timeout führen. Dann einfach etwas Geduld haben und nicht panisch werden.
ALTER TABLE history DROP COLUMN EVENT;
ERROR 2006 (HY000): MySQL server has gone away
## geraume Zeit später... :-)

## Nun wird die Spalte wieder erzeugt, damit das Daten Model stimmig ist, obwohl wir ja das Befüllen von EVENT abgeschaltet haben.
ALTER TABLE history ADD COLUMN EVENT VARCHAR(512) NULL DEFAULT NULL AFTER Type;
## Auch das wird einige Zeit laufen...

## Nun kann man nachschauen, wieviel die Tabelle kleiner geworden ist
SELECT table_schema "DB Name",        Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"   FROM  information_schema.tables   GROUP BY table_schema;
+--------------------+---------------+
| DB Name            | DB Size in MB |
+--------------------+---------------+
| fhem               |        2707.0 |
| information_schema |           0.0 |
+--------------------+---------------+

## 4651 GB - 2707 GB = 1944 GB => ~ 42 %
## Die prozentuale Größe hängt hierbei sehr stark von der Länge der reading Namen ab. Da meine Namen aufgrund der Lesbarkeit etwas länger sind ist die Ersparnis sehr groß.
## Auch ein dumpMySQL wird nun wesentlich kleiner sein und eventuell auch schneller laufen.

## Nun sollte noch ein Backup mit "optimizeTablesBeforeDump 1" erfolgen, damit die Datenbank Files optimiert werden.


Und enden mit rund 2.7 GB !!! Der Tag ist gerettet :-) , auch wenn das nur eine einmalige Aktion ist, wird diese in Zukunft das Datenbank Volumen nicht mehr so schnell wachsen lassen.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 21 November 2020, 14:02:50
Zitat von: ch.eick am 21 November 2020, 08:26:10

Hast Du auch das hier in 99_myUtils aufgenommen?

use Encode qw(decode encode);
use PBKDF2::Tiny qw/derive verify/;                   <<< Das fehlt Dir definitiv
use Digest::SHA qw(sha256 hmac_sha256);
use Crypt::URandom qw( urandom );
use Crypt::AuthEnc::GCM;



Das verstehe ich ebenfalls nicht ganz. Wo muss man das in der 99_myUtils eintragen? Im Wiki sind die beiden Routinen ja beschrieben welche in die 99_myUtils müssen. Dort finde ich den obigen Teil jedoch nicht. Kanns tu das etwas präzisieren?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 November 2020, 14:05:58
Zitat von: Mumpitz am 21 November 2020, 14:02:50
Das verstehe ich ebenfalls nicht ganz. Wo muss man das in der 99_myUtils eintragen? Im Wiki sind die beiden Routinen ja beschrieben welche in die 99_myUtils müssen. Dort finde ich den obigen Teil jedoch nicht. Kannst Du das etwas präzisieren?
Das kann entweder an den Anfang der 99_myUtils, oder vor die erste Funktion, die es benutzt, was ich gemacht habe.

Mit diesen Einträgen lädt man zusätzliche Funktionen aus Perl Bibliotheken in ein Modul.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 21 November 2020, 14:15:09
Zitat von: ch.eick am 21 November 2020, 14:05:58
Mit diesen Einträgen lädt man zusätzliche Funktionen aus Perl Bibliotheken in ein Modul.

Beispiel:
my $r = derive( 'SHA-256', $PASSWD, $bitSalt, $rounds );

derive ist keine Standard-perl-Funktion sondern wird erst durch laden der Bibliothek
use PBKDF2::Tiny qw/derive verify/;                   <<< Das fehlt Dir definitiv
verfügbar.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: billy-boy am 21 November 2020, 22:44:27
Zitat
Hast Du auch das hier in 99_myUtils aufgenommen?
Code: [Auswählen]
use Encode qw(decode encode);
use PBKDF2::Tiny qw/derive verify/;                   <<< Das fehlt Dir definitiv
use Digest::SHA qw(sha256 hmac_sha256);
use Crypt::URandom qw( urandom );
use Crypt::AuthEnc::GCM;

Autsch war wohl gestern schon zu spät. Steht ganz groß im Wiki.
Na ja die Tests klappen jetzt alle.
Allerdings bekomme ich keine Werte angezeigt.
Im Log steht folgendes


2020.11.21 22:33:26 5: PV_Anlage_1_API: get called with 01_auth_start
2020.11.21 22:33:26 5: PV_Anlage_1_API: get found option 01_auth_start in attribute get01Name
2020.11.21 22:33:26 4: PV_Anlage_1_API: get will now request 01_auth_start, no optional value
2020.11.21 22:33:26 5: PV_Anlage_1_API: AddToQueue adds type get01 to URL http://%IP-Address_Plenticore%/api/v1/auth/start, data %START%, header Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive, retry 0, initial queue len: 0
2020.11.21 22:33:26 5: PV_Anlage_1_API: HandleSendQueue called from HTTPMOD::AddToSendQueue, qlen = 1
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%FINISH%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("finish","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%SESSION%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("session","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"),ReadingsVal("$NAME","auth_token","missed"))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: %START%
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} input: %START%
2020.11.21 22:33:26 3: ====Start plenticore_auth==============================
2020.11.21 22:33:26 3: auth_step         : start
2020.11.21 22:33:26 3: auth_user         : user
2020.11.21 22:33:26 3: auth_device       : PV_Anlage_1_API
2020.11.21 22:33:26 3: ====End arguments======================================
2020.11.21 22:33:26 3: auth_nonce        : R3lmNTA3QVJ4RmZ0
2020.11.21 22:33:26 3: auth_return       : {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 3: ====End output=========================================
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: match for type get01, regex (?^:%START%), mode expression, value package main; {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")}, input: %START%, result is {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%FINISH%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("finish","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"))} input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%SESSION%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("session","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"),ReadingsVal("$NAME","auth_token","missed"))} input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: http://%IP-Address_Plenticore%/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: match for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value package main; {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")}, input: http://%IP-Address_Plenticore%/api/v1/auth/start, result is http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%FINISH%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("finish","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"))} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%SESSION%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("session","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"),ReadingsVal("$NAME","auth_token","missed"))} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 4: PV_Anlage_1_API: HandleSendQueue sends get01 with timeout 7 to http://192.168.169.250/api/v1/auth/start,
data: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"},
header: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: ReadCallback called from __ANON__
2020.11.21 22:33:26 4: PV_Anlage_1_API: Read callback: request type was get01 retry 0,
header: HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Sat, 21 Nov 2020 21:33:26 GMT
Content-Type: application/json
Content-Length: 169
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, body length 169
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read callback: body
{"rounds":29000,"transactionId":"e9eae38f13a16cbae3db3342db5124d4cd65902317ed5b055e843df328b8f7f5","salt":"FU3StUbSOhvJMesZ","nonce":"R3lmNTA3QVJ4RmZ06ZIGHOZ3ykUSR0Hv"}

2020.11.21 22:33:26 4: PV_Anlage_1_API: BodyDecode found no charset header (bodyDecode was set to auto)
2020.11.21 22:33:26 4: PV_Anlage_1_API: extracted JSON values to internal
2020.11.21 22:33:26 5: PV_Anlage_1_API: GetCookies is looking for Cookies
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractSid called, context get, num 01
2020.11.21 22:33:26 4: PV_Anlage_1_API: checking for redirects, code=200, ignore=0
2020.11.21 22:33:26 4: PV_Anlage_1_API: no redirects to handle
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read callback sets LAST_REQUEST to get01
2020.11.21 22:33:26 5: PV_Anlage_1_API: CheckAuth is checking buffer with ReAuthRegex (?^:"authenticated":false|"processdata":\[\]|wrong credentials|Not authorized)
2020.11.21 22:33:26 5: PV_Anlage_1_API: CheckAuth decided no authentication required
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for context get, num 01 - no individual parse definition
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read starts parsing response to get01 with defined readings: 0101,0102,0103,0104,0201,0202,03,0301,0302
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_nonce with json nonce ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for reading0101-1 sets auth_nonce to R3lmNTA3QVJ4RmZ06ZIGHOZ3ykUSR0Hv
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading value as hex is 52336c6d4e54413351564a34526d5a30365a4947484f5a33796b555352304876
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_rounds with json rounds ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for reading0102-1 sets auth_rounds to 29000
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading value as hex is 3239303030
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_salt with json salt ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for reading0103-1 sets auth_salt to FU3StUbSOhvJMesZ
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading value as hex is 46553353745562534f68764a4d65735a
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_transactionId with json transactionId ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for reading0104-1 sets auth_transactionId to e9eae38f13a16cbae3db3342db5124d4cd65902317ed5b055e843df328b8f7f5
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading value as hex is 65396561653338663133613136636261653364623333343264623531323464346364363539303233313765643562303535653834336466333238623866376635
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_signature with json signature ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_signature with json signature did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_signature with json /^signature/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_signature did not match
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_token with json token ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_token with json token did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_token with json /^token/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_token did not match
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_sessionId with json sessionId ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_sessionId with json sessionId did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_sessionId with json /^sessionId/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_sessionId did not match
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_message with json message ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_message with json message did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_message with json /^message/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_message did not match
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_error with json error ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_error with json error did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_error with json /^error/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_error did not match
2020.11.21 22:33:26 4: PV_Anlage_1_API: Read response matched 4, unmatch 5 Reading(s)
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read response to get01 matched auth_nonce auth_rounds auth_salt auth_transactionId
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read response to get01 did not match auth_signature auth_token auth_sessionId info_message info_error
2020.11.21 22:33:26 5: PV_Anlage_1_API: HandleSendQueue called from HTTPMOD::ReadCallback, qlen = 0
2020.11.21 22:33:26 5: PV_Anlage_1_API: HandleSendQueue found no usable entry in queue


Zitat

Zitat
Desweiteren habe ich mal eine Frage zur Einrichtung der PV_Anlage_1_API.
Warum steht im stateFormat nur "PV_Anlage_1" anstatt $name (also PV_Anlage_1_API)?

Da ich diese Abfrage nicht disabled hatte wurden mir die Werte angezeigt.
Damit werden aus dem PV_Anlage_1 Device die aktuellen Werte ergänzt., um sie den Statistischen Werten gegenüber zu stellen.


Was nützen diese Werte wenn das Device PV_Anlage_1 später deinstaliert werden. Es handelt sich ja um die mit Python abgefragten Werte.

Fragen über Fragen.
Ich hoffe ich nerve nicht.

Rainer
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 November 2020, 12:26:58
Alles wird gut :-)
Zitat
Was nützen diese Werte wenn das Device PV_Anlage_1 später deinstaliert werden. Es handelt sich ja um die mit Python abgefragten Werte.
Das ist auch nicht richtig. Das PV_Anlage_1 fragt den Wr über ModBus/TCP ab und bekommt die Momentanwerte, sowie auch einige wenige Statistiken und Batterie Informationen.
Das PV_Anlage_1_API holt die Statistiken und alle Settings über die API Schnittstelle ab. Weiterhin werden dort auf Einstellungen verändert.
Für den betrieb bleiben beide Devices aktiv.

Das Python wurde vorher für die Anmeldung des PV_Anlage_1_API verwendet und ist jetzt vollständig zu Perl migriert worden.
In einigen Wochen nehme ich das aus dem Wiki, sobald frühere Einsteigen umgestiegen sind.


Dein Log sieht schon mal toll aus :-) , jedoch bedeutet 01_auth_start nicht, das Du das ganze ankurbelst wie ein altes Auto und dann geht der Rest alleine.

Ruf einfach mal 20_Statistic_EnergyFlow auf, den dann sollte die Anmeldung komplett durchlaufen und auch Werte liefern. Ich denk als Einsteiger ist man von der Menge an Information im Wiki einfach etwas überfordert.
Ablaufbeschreibung_PV_Anlage_1_API (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Ablaufbeschreibung_PV_Anlage_1_API)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ujaudio am 01 Dezember 2020, 10:39:40
Hallo Christian,

du bist ja überaus fleißig und sehr gründlich mit deinen Beiträgen inkl. Wiki. Da werde ich einiges für mich herausholen können, auch wenn ich eine andere Anlage habe (SMA Tripower 6000 und Varta Engion Family). DIe beiden Geräte habe ich schon in FHEM eingebunden, somit kann ich loslegen, den Eigenverbrauch zu optimieren. Meine Sicht der Dinge: Die erste Herausforderung ist, dass der Energiespeicher nur eine sehr begrenzte Menge Energie speichern kann und auch nur begrenzt Leistung abgeben kann. Die zweite Herausforderung ist, dass die Zukunftswerte der PV-Anlage unbekannt und kaum abschätzbar sind. Die dritte Herausforderung ist, dass ich nicht alle Energieverbraucher komplett in FHEM abbilden kann. Das Ganze ist also bestenfalls ein "qualifizierter Blick" in die Glaskugel.

Trotzdem werde ich mich damit beschäftigen, ich sehe das Ganze mehr als Hobby. Dennoch hier mal die Frage: wie stark konntest du die Eigenverbrauchsquote mit deiner Applikation denn erhöhen?

Einen lieben Gruß
Jürgen
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Dezember 2020, 11:30:29
Zitat von: ujaudio am 01 Dezember 2020, 10:39:40
Trotzdem werde ich mich damit beschäftigen, ich sehe das Ganze mehr als Hobby. Dennoch hier mal die Frage: wie stark konntest du die Eigenverbrauchsquote mit deiner Applikation denn erhöhen?
Hallo Jürgen,
herzlich willkommen im Club :-)
Leider kann ich Dir nicht sagen wie die Quote gewesen wäre, ohne etwas zu tun, da ich schon 3/4 Jahr vor Lieferung des WR das Grundgerüst angelegt habe.
Die Jahres Werte sind wie folgt

74 % Autarkiequote   <<< bevor der Winter kam hatte ich da auch schon mal 80 %, was mein persönliches Ziel aus dem Bauch raus gewesen ist :-)
47 % Eigenverbrauchsquote   <<< das liegt am Sommer, weil man da nicht alles verbrauchen kann was vom Dach kommt.


Ich könnte Dir auch gerne bei der Integration behilflich sein.
Am einfachsten wäre es jedoch, wenn Du vorher Deine Devices auf die hier verwendeten Namen änderst, da Du ansonsten sehr viel anpassen musst. Es wird auch schwierig die passenden readings
bei SMA zu finden, da der Plenticore sehr viele Statistiken und vorberechnete Werte liefert.
Weiterhin wäre zu beachten, das der Speicher beim Plenticore als String im DC Bereich angeschlossen und die Varta Engion Family auf der AC Seite betrieben wird.
Die Prinzipien kannst Du aber alle adaptieren, jedoch solltest Du mir dann eine PN schicken, damit dieser Thread hier nicht zu sehr abweicht.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kanenas am 04 Dezember 2020, 06:37:10
Servus Zusammen,

Ich war auf der Suche nach dem vorletzten update des Plenticore und bin auf das Photovoltaik-forum (https://www.photovoltaikforum.com/thread/141431-gemessene-kapazit%C3%A4t-der-byd-b-box-hv/?pageNo=1 (https://www.photovoltaikforum.com/thread/141431-gemessene-kapazit%C3%A4t-der-byd-b-box-hv/?pageNo=1)) gelandet.
Es geht um die Kapazität von BYD Batterien und die reale/gemessene Effektivität.

Dank Christian bin ich hier gelandet und freue mich über die Zusammenarbeit.

LG
Dio
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Dezember 2020, 11:04:48
Zitat von: kanenas am 04 Dezember 2020, 06:37:10
Es geht um die Kapazität von BYD Batterien und die reale/gemessene Effektivität.
Und es gibt noch eine Variante, von kanenas, den BYD HV (nicht HVS) direkt abzufrage, was ich dann ins Wiki mit einbauen werde.

defmod BYD HTTPMOD http://installer:password@192.168.xxx.xxx/asp/StatisticInformation.asp 900

attr BYD userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex
attr BYD enableControlSet 1
attr BYD event-on-change-reading Difference_Charge_Energy:0.1,Total_Charge_Energy:0.1,Total_Discharge_Energy:0.1,Efficiency:0.05
attr BYD icon measure_battery_100
attr BYD reading01Name Total_Charge_Energy
attr BYD reading01Regex (?s)Total Charge Energy.*?">([\d.]+[\d]+)
attr BYD reading02Name Total_Discharge_Energy
attr BYD reading02Regex (?s)Total Discharge Energy.*?([\d.]+[\d]+)
attr BYD reading03Name Total_Cycle_Counts
attr BYD reading03Regex (?s)Total Cycle Counts.*?([\d.]+[\d]+)
attr BYD stateFormat {sprintf("Charge: %.0f kWh - Efficiency: %.1f %%", ReadingsVal($name,"Total_Charge_Energy","0"), ReadingsVal($name,"Efficiency","2"))}
attr BYD userReadings Difference_Charge_Energy {ReadingsVal($name,"Total_Charge_Energy",0) - ReadingsVal($name,"Total_Discharge_Energy",0);;;;},\
Efficiency {((ReadingsVal($name,"Total_Discharge_Energy",0)+((ReadingsVal("Kostal","Battery_charge_state",0)/100)*11)) / ReadingsVal($name,"Total_Charge_Energy",0))*100;;;;}

Der Unterschied zum BYD_Status Device ist die Anmeldung mit den login Daten in der URL, was mal mit replacement key noch etwas verschleiern könnte und die userreadings.
Das passt jedoch noch nicht in die hier bisher verteilte gesamt Konfiguration.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 05 Dezember 2020, 19:48:36
Hey Team :-)
ich habe da mal wieder etwas eingebaut.

Diese Änderung erstellt ein neues get und fragt den Batterie Status ab, das OMap zeigt es dann im Klartext an.

attr PV_Anlage_1_API get25Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API get25Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API get25Name 25_Battery_EM_State
attr PV_Anlage_1_API get25URL http://%IP-Address_Plenticore%/api/v1/processdata/devices:local/EM_State


attr PV_Anlage_1_API reading25Name Battery_EM_State
attr PV_Anlage_1_API reading25OMap 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz
attr PV_Anlage_1_API reading25Regex EM_State.*value":(\d+)


Wer das dann auch ins DbLog haben möchte, muss es regelmäßig im PV_Schedule mit einbauen. Im event-on-change-reading ist es bereits in der Maske "Battery_.*" mit drin.
Ein mal pro Stunde wäre sicherlich schon häufig.

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Dezember 2020, 10:51:19
Eine schöne neue Woche Euch allen.

Wir haben wieder zwei neue interessierte in der Runde und da ist mir noch was aufgefallen.

Im PV_Anlage_1_config könnt Ihr noch folgendes reading setzen:

setreading PV_Anlage_1_config forecast_factor 1

Das ist ein generischer Faktor, der in die Prognose mit eingeht und direkt eine Dämpfung oder Erhöhung der Prognosewerte bewirkt. Der Default ist 1.
Sollte also Eure Prognose immer zu hoch/niedrig sein ist das die richtige Stelle.
Möchtet Ihr z.B. je nach Jahreszeit oder Monat  den Faktor anders setzen, dann macht man das in meinem Konstrukt im PV_Schedule Device mit einem DOELSEIF.

Aus unserer Erfahrung passt die Prognose im Sommer ja ziemlich gut, jedoch fehlen im Herbst/Winter die Einflüsse von Niesel, Nebel und Schnee oder in den Bergen, wo im Winter die Sonne nicht rein kommt.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Dezember 2020, 11:41:30
Hallo zusammen, sorry Bernd.

Ich habe noch kleinere Aktualisierungen in folgenden devices gemacht:

PV_Anlage_1_API
BYD_Status
PV_Anlage_1_config <<< setstate forecast_factor , also nur bei der ersten Übernahme der Defaults
PV_Scheduling

Die Änderungen beziehen sich auf die hier im Thread bereits angekündigten Dinge.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Dezember 2020, 18:51:18
Nabäääänd,

der Fehlerteufel hat sich eingeschlichen. Beim Regen Forecast kommt die Regenwarscheinlichkeit R600 nur alle sechs Stunden, für den Zeitraum der Stunden davor.

Ich habe das mit folgenden Zeilen in der Funktion Solar_forecast() nun berücksichtigt. Sehen konnte man es an Regentagen, da alle sechs Stunden eine Delle in der Kurve :-)

          $Solar_Rain = 0;
          for (my $r600 = $i+5; $r600 >= $i; $r600--) {
            $Solar_Rain        += ReadingsVal($wetter,"fc".$fc."_".($r600+$timeshift)."_R600" ,0);
          };

Die Position des Codes seht Ihr dann wie immer im Wiki, oder Ihr tauscht die ganze Funktion einfach aus.
Danach ein "reload 99_myUtils" und den fc0 und fc1 im PV_Schedule einmal aufrufen.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 08 Dezember 2020, 05:23:01
Guten Morgen zusammen

Ich wollte mal bei euch nachfragen wie sich die Batterie im Moment verhält. Ich habe die Implementierung genau so vorgenommen. Unteranderem wird dabei ja die Batterie zuerst auf 90% geladen bevor sie wieder entladen wird. Im Moment steht sie seit Tagen auf ca. 54%. Die Batterie befindet sich dabei im Normal Modus. Ist das bei euch auch so oder ist sie bei euch im Ruhemodus?
Gruss aus der Schweiz

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Dezember 2020, 09:39:17
Zitat von: Mumpitz am 08 Dezember 2020, 05:23:01
Unteranderem wird dabei ja die Batterie zuerst auf 90% geladen bevor sie wieder entladen wird. Im Moment steht sie seit Tagen auf ca. 54%. Die Batterie befindet sich dabei im Normal Modus. Ist das bei euch auch so oder ist sie bei euch im Ruhemodus?
Ein herzliches Gruezi wohl  an den Bodensee :-)

Das ist bei mir auch so, wobei sich der Modus "Ruhe1" auch bereits einmal aktiviert hat. Dies war nach der Entladung und mehreren Tagen von fehlender PV Leistung.
Zu diesem Zeitpunkt habe ich dann im PV_Anlage_1_API die Erweiterung mit EM_State eingebaut und zum Testen im WR den Ruhemodus beendet.

Das was ich hier umgesetzt habe ist nur ein Batterieschonen aus dem Bauch heraus, also nicht wissenschaftlich fundiert, aber wenn der Speicher dann 15 Jahre alt wird mach ich ne Party.

Für weitere Informationen kannst Du auch in diesem Forum viel dazu lesen:
plenticore-plus-und-byd-hvs-unklar (https://www.photovoltaikforum.com/thread/149267-plenticore-plus-und-byd-hvs-unklar/)
tägliche-notladungen-des-plenticore-durch-fehlerhafte-software (https://www.photovoltaikforum.com/thread/149765-t%C3%A4gliche-notladungen-des-plenticore-durch-fehlerhafte-software)
programmatischer-lesender-und-schreibender-zugriff-auf-kostal-plenticore-z-b-min (https://www.photovoltaikforum.com/thread/142261-programmatischer-lesender-und-schreibender-zugriff-auf-kostal-plenticore-z-b-min)

Auch sollten wir dort dann darüber diskutieren, damit dieser Thread nicht auch so platzt.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Dezember 2020, 12:16:09
Hallo zusammen,
ich wollte mal zur Motivation etwas erfolgreiches zeigen. Durch die Geißelung der LWP habe ich die Temperaturanhebung am Tag umgesetzt. Der Tag läuft per Zeiteinstellung in der Heizung von 10:00-16:00 Uhr !

Trotz der schlechten Wetterprognose vom DWD kam dann heute die Sonne raus :-)
Im ersten Diagramm sieht man sehr schön, dass die LWP sich schön mit PV Leistung versorgt und somit einen hohen Sofortverbrauch gönnt.
Darunter die miese DWD Prognose, die dann mit fc0 nochmal etwas nachgebessert wurde, das wäre aber auch noch besser gegangen.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 14 Dezember 2020, 16:06:21
Hallo Christian, @all,

vielleicht hast du/ihr schon gesehen dass ich gerade an einem Solar Forecast Modul baue.
Grundlage ist wie bei deiner Lösung auch DWD_OpenData.

Nun meine Frage. Gibt es schon Erfahrungen wie gut die Strahlungserwartung des DWD ist ?
Heute zum Beispiel habe ich eine starke Abweichung des tatsächlichen Geschehens von der Vorhersage festgestellt.
Vielleicht war es einfach nur ein ungünstiger Fall. Ich schaue mir DWD Data erst seit kurzem an. Wie sind eure Erfahrungen ?

Grüße,
Heiko
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Dezember 2020, 18:03:50
Zitat von: DS_Starter am 14 Dezember 2020, 16:06:21
vielleicht hast du/ihr schon gesehen dass ich gerade an einem Solar Forecast Modul baue.
Grundlage ist wie bei deiner Lösung auch DWD_OpenData.

Nun meine Frage. Gibt es schon Erfahrungen wie gut die Strahlungserwartung des DWD ist ?
Heute zum Beispiel habe ich eine starke Abweichung des tatsächlichen Geschehens von der Vorhersage festgestellt.
Vielleicht war es einfach nur ein ungünstiger Fall. Ich schaue mir DWD Data erst seit kurzem an. Wie sind eure Erfahrungen ?

Hallo Heiko,
ich habe mal ein Prognose Diagramm von heute angehängt, was die normalen Abweichungen aus der Solar_forcast() Funktion wiederspiegelt.
Das es hier einige im Forum gibt, die generell eine Leistungsprognose für sinnfrei erachten stellt sich die Frage, ob Du nicht meine Version verwenden möchtest.

Aber zurück zur Frage. Es gibt einige tage, bei denen der DWD ziemlich daneben liegt, was sie dann zaghaft versuchen zu korrigieren :-) Aber es ist halt Glaskugel lesen und das bleibt es auch.
Meine Näherung habe ich erreicht, indem Wolken,Regen, und die Modultemperatur, sowie die Ausrichtung der Module eingeflossen ist.
Ganz zum Schluss kann man noch einen eigenen Faktor definieren, den man auch zB mit den Jahreszeiten wechseln könnte.

Was noch fehlt ist Schnee und Rauhreif auf den Modulen, da fehlen mir noch die Forecast Daten und der sssssittt, bum Faktor, wenn der Belag von den Modulen gerutscht ist :-)

Im großen und ganzen kann man aber sagen, das mein Forecast konservativ ist. Man kann mit DbRep die Tagessumme berechnen und als kWh (weil Rad1h zugrunde liegt) nehmen.
Das gibt einen Richtwert für Entscheidungen und alles was drüber liegt da kann man sich freuen.

Für die Anpassung habe ich eine "Heizungskurve" für die Werte zugrunde gelegt, wodurch man die Aggressivität der Korrektur einstellen kann.

Ob sich dafür ein Modul lohnt, was Du dann Maintainen musst ist echt die Frage. Ich liefer Dir aber gerne weitere Tips, meiner fast zweijährigen Arbeit.

Im Photovoltaik Forum gibt es von kilian auch noch die Phyton Implementierung, die mit der pvlib arbeitet, aber wie gesagt, man sollte es nicht übertreiben.

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 15 Dezember 2020, 17:07:45
Hallo Christian,

danke für die Infos.
Das Forecast-Modul ist eigentlich nur ein "Abfallprodukt" des SMAPortal-Moduls welches durch die SMA Strategie leider zu den Akten gelegt werden musste.
Wir hatte seinerzeit viel Arbeit in die Grafik investiert und das wollte ich einfach nur retten und etwas brauchbares damit der Community zur Verfügung stellen. In diesem Forecast Device soll aber nicht nur die Prognose für den Standort vorausgesagt werden, sondern auch andere Mehrwerte die man für eine Steuerung auswerten kann. Zum Beispiel eine 4h Forecast bzw. eine Empfehlung per Reading, wann man planen könnte zusätzliche Verbraucher einzuschalten und solche Dinge.

Nur sollte es etwas mehr als ein bloßer Blick in die Glaskugel sein.  ;)

Jetzt frage ich mich natürlich, der rad1h Wert nicht bereits die prognostizierten Wetterverhältnisse (Bewölkung, Regen usw.) beinhaltet ?
Und was ist mit einer Direktstrahlung, gibt es diese Angabe im DWD_OpenData ? Der Rad1h Wert ist doch nur die diffuse Globalstrahlung oder sehe ich das falsch ?

Grüße,
Heiko
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Dezember 2020, 17:46:28
Zitat von: DS_Starter am 15 Dezember 2020, 17:07:45
Das Forecast-Modul ist eigentlich nur ein "Abfallprodukt" des SMAPortal-Moduls welches durch die SMA Strategie leider zu den Akten gelegt werden musste.
Wir hatte seinerzeit viel Arbeit in die Grafik investiert und das wollte ich einfach nur retten und etwas brauchbares damit der Community zur Verfügung stellen. In diesem Forecast Device soll aber nicht nur die Prognose für den Standort vorausgesagt werden, sondern auch andere Mehrwerte die man für eine Steuerung auswerten kann. Zum Beispiel eine 4h Forecast bzw. eine Empfehlung per Reading, wann man planen könnte zusätzliche Verbraucher einzuschalten und solche Dinge.

Nur sollte es etwas mehr als ein bloßer Blick in die Glaskugel sein.  ;)

Jetzt frage ich mich natürlich, der rad1h Wert nicht bereits die prognostizierten Wetterverhältnisse (Bewölkung, Regen usw.) beinhaltet ?
Und was ist mit einer Direktstrahlung, gibt es diese Angabe im DWD_OpenData ? Der Rad1h Wert ist doch nur die diffuse Globalstrahlung oder sehe ich das falsch ?
Nach meiner Kenntnis ist rad1h die direkt und diffuse Strahlung. Ich hatte nur nach einem strahlungsabhängigen Wert gesucht, der auch optimaler weise Stündlich sein sollte.
Wolken und Regen scheinen da nicht mit drin zu sein, zumindest hat meine Korrektur zu einem besseren Ergebnis geführt, da der rad1h Wert doch immer sehr hoch ist.
Ein Forecastsignal vom Forecast habe ich bisher als nicht notwendig empfunden.

Ich verändere bisher nur die erlaubte Startzeit nach dem Forecast für zB 12:00 Uhr wodurch das Gerät bei schlechter Prognose schon früher starten darf.
Oder man fragt die Summe der zuerwartenden Leistung ab und man startet dann halt auch die starken Verbraucher sofort, wenn eh nichts zu erwarten ist.

Das ist aber alles sehr Verbraucher spezifisch, sodass ich das direkt in den DOIFs der Geräte erledige.

Generell hat sich nun in zwei Jahren Entwicklung gezeigt, dass es bei den Verbrauchern ausreichend ist, wenn sie nach den aktuellen Werten der PV Anlage gesteuert werden,
was in meinen Muster Geräten umgesetzt ist. Durch Mindestlaufzeiten und Wartezeiten puzzeln sich die Verbraucher jetzt unter die Leistungskurve.
Im Winter hat man eh immer zu wenig, da schalten die Geräte sich auch nachts ein, wie zB der Wirlpool, damit der Temperaturverlust aufgeholt werden kann.
Beim Pool habe ich auch ein aWattar Beispiel eingebaut, wenn man schwankende Strompreise hätte, oder wenn der Energiemarkt das mal ermöglichen wird. Das wird besonders interessant, wen ein BEV dazu kommt.
Im Sommer schiebt der Kostal die Batterieladung ziemlich gut in die Mittagszeit, damit die dynamischen 70% genutzt werden können, was ja bei SMA wohl nicht so ist. Aber auch da würde man mit meiner recht simplen Prognose einen maxValue abfragen und dann die Ladezeit des Speichers dort hin verlagern können.

Mit einer WallBox und einem passenden BEV wäre es gut, wenn man die Ladehöhe vorwählen könnte, aber auch da würde man sich dann an der Leistungskurve entlang hangeln und den Überschuss jeweils in Stufen der WallBox mitteilen. Wenn die WallBox am KSEM mitliest erkennt sie ja auch, wann eingespeist würde und kann dann die Ladung des BEV daran anpassen.

Lange Rede kurzer Sinn, es ist weniger Prognose notwendig als man denkt. Einfach alles sofort verbrauchen, was man hat, das hat man :-)

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 15 Dezember 2020, 17:58:51
Danke Christian und ich gebe dir der Sinnhaftigkeit von Vorhersagen weitgehend Recht.
Aber du hast etwas wichtiges vergessen zu erwähnen ... den Spieltrieb  :D

LG,
Heiko
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Dezember 2020, 18:13:38
Zitat von: DS_Starter am 15 Dezember 2020, 17:58:51
Danke Christian und ich gebe dir der Sinnhaftigkeit von Vorhersagen weitgehend Recht.
Aber du hast etwas wichtiges vergessen zu erwähnen ... den Spieltrieb  :D
Da bin ich wieder dabei :D
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Dezember 2020, 08:59:08
Guten morgen zusammen,

der Fehlerteufel hat wieder zugeschlagen. In der API von Kostal ist ein Schreibfehler, den ich durch Copy/Paste der Wertenamen einfach mit übernommen habe.

Es lässt sich recht einfach korrigieren, da dieser Wert in meiner Implementierung nicht in die Datenbank geht.

## Achtung, beim http Aufruf der API muss der Rechtschreibfehler bestehen bleiben, da Kostal ja die API noch nicht korrigiert hat.
attr PV_Anlage_1_API get22-3Name Battery_InternControl_MinHomeConsumption
attr PV_Anlage_1_API set223Name 22_3_Battery_MinHomeConsumption

## Im PV_Schedule müssen ebenfalls zwei Zeilen im DEF korrigiert werden, aber nur wenn Ihr die Batteriesteuerung im Herbst/Winter einsetzt.

1.) (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption [PV_Anlage_1_API:Battery_Info_WorkCapacity])
2.) (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption 50)


Viele Grüße
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Dezember 2020, 09:03:13
Und noch eine Nachricht.

Unter diesem Link Frevel: Die Idee einheitlicher Devicenamen und Readings (https://forum.fhem.de/index.php/topic,116747.0.html) versuchen wir etwas Ordnung in die Namensvergabe bei Solaranlagenkomponenten zu bringen. Die Diskussion hat gerade mit dem Sammeln von Ideen begonnen.

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 16 Dezember 2020, 09:09:16
Zitat von: ch.eick am 16 Dezember 2020, 08:59:08
Guten morgen zusammen,

der Fehlerteufel hat wieder zugeschlagen. In der API von Kostal ist ein Schreibfehler, den ich durch Copy/Paste der Wertenamen einfach mit übernommen habe.

Es lässt sich recht einfach korrigieren, da dieser Wert in meiner Implementierung nicht in die Datenbank geht.

## Achtung, beim http Aufruf der API muss der Rechtschreibfehler bestehen bleiben, da Kostal ja die API noch nicht korrigiert hat.
attr PV_Anlage_1_API get22-3Name Battery_InternControl_MinHomeConsumption
attr PV_Anlage_1_API set223Name 22_3_Battery_MinHomeConsumption

## Im PV_Schedule müssen ebenfalls zwei Zeilen im DEF korrigiert werden, aber nur wenn Ihr die Batteriesteuerung im Herbst/Winter einsetzt.

1.) (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption [PV_Anlage_1_API:Battery_Info_WorkCapacity])
2.) (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption 50)


Viele Grüße
    Christian

Einmal mehr ein grosses Dankeschön für deinen unermüdlichen Einsatz für uns alle!!! Echt unglaublich wie du uns alle immer wieder sofort von deiner grossen Arbeit profitieren lässt!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Dezember 2020, 09:16:54
Zitat von: Mumpitz am 16 Dezember 2020, 09:09:16
Einmal mehr ein grosses Dankeschön für deinen unermüdlichen Einsatz für uns alle!!! Echt unglaublich wie du uns alle immer wieder sofort von deiner grossen Arbeit profitieren lässt!
Danke für die Anerkennung.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: knuddli am 18 Dezember 2020, 17:16:52
Hallo Christian,

erst mal ein riesen Danke für die tolle Arbeit. Mir fällt die ganze Programmiererei ziemlich schwer und ich verstehe wenig von dem Ganzen.
Nun habe ich alles aus dem Wiki abgeschrieben und bekomme dennoch viele Fehlermeldungen.

Messages collected while initializing FHEM:
configfile: PV_Anlage_1_API: unknown attribute DbLogExclude. Type 'attr PV_Anlage_1_API ?' for a detailed list.
PV_Anlage_1_API: unknown attribute DbLogInclude. Type 'attr PV_Anlage_1_API ?' for a detailed list.
PV_KSEM: unknown attribute DbLogExclude. Type 'attr PV_KSEM ?' for a detailed list.
BYD_Status: unknown attribute DbLogExclude. Type 'attr BYD_Status ?' for a detailed list.
PV_Schedule: unknown attribute DbLogExclude. Type 'attr PV_Schedule ?' for a detailed list.
The specified DbLog-Device "LogDB" doesn't exist.
The specified DbLog-Device "LogDB" doesn't exist.
The specified DbLog-Device "LogDB" doesn't exist.
The specified DbLog-Device "LogDB" doesn't exist.
DB_Service_Schedule: unknown attribute DbLogExclude. Type 'attr DB_Service_Schedule ?' for a detailed list.
DWD_Forecast: unknown attribute DbLogExclude. Type 'attr DWD_Forecast ?' for a detailed list.
Astro: unknown attribute DbLogExclude. Type 'attr Astro ?' for a detailed list.
Astro: unknown attribute DbLogInclude. Type 'attr Astro ?' for a detailed list.
Can't open ./db.conf: No such file or directory
The specified DbLog-Device "LogDB" doesn't exist.
Invalid characters in name (not A-Za-z0-9._): wetter_
Unknown command
, try help. Unknown command ====, try help. Unknown command
, try help.
[Shelly] Invalid IP address  of Shelly device
[Shelly] Invalid IP address  of Shelly device

Autosave deactivated


Das FHEM (6) ist frisch auf Debian 10 installiert und ich habe auch die ganzen geforderten *perl*.deb installiert. Dennoch scheint da was mit der Datenbank (welche Datenbank eigentlich?) falsch zu sein. Den Plenticore und den KSEM sehe ich. Einen BYD habe ich nicht.
Ist es möglich einfach mal die fhem.cfg, 99_myUtils.pm und ggf. noch weitere fehlende Dateien anzuhängen. Damit hat man erst mal die initiale Konfiguration. Trotz copy & paste hab ich sicher was falsch gemacht. Die Schellys gibt es allerdings nicht! Welche Voraussetzungen muss das FHEM schon vorher mitbringen (Datenbank?).

So groß brauche ich das im Prinzip auch nicht. Mir reicht es schon einen Dummy (oder MQTT*dingens) bei 2000W DC ein und bei 1000W wieder aus zu schalten.


danke und Grüße
Andi
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Dezember 2020, 10:18:02
Zitat von: knuddli am 18 Dezember 2020, 17:16:52
Messages collected while initializing FHEM:
configfile: PV_Anlage_1_API: unknown attribute DbLogExclude. Type 'attr PV_Anlage_1_API ?' for a detailed list.
PV_Anlage_1_API: unknown attribute DbLogInclude. Type 'attr PV_Anlage_1_API ?' for a detailed list.
PV_KSEM: unknown attribute DbLogExclude. Type 'attr PV_KSEM ?' for a detailed list.
BYD_Status: unknown attribute DbLogExclude. Type 'attr BYD_Status ?' for a detailed list.
PV_Schedule: unknown attribute DbLogExclude. Type 'attr PV_Schedule ?' for a detailed list.
The specified DbLog-Device "LogDB" doesn't exist.
The specified DbLog-Device "LogDB" doesn't exist.
The specified DbLog-Device "LogDB" doesn't exist.
The specified DbLog-Device "LogDB" doesn't exist.
DB_Service_Schedule: unknown attribute DbLogExclude. Type 'attr DB_Service_Schedule ?' for a detailed list.
DWD_Forecast: unknown attribute DbLogExclude. Type 'attr DWD_Forecast ?' for a detailed list.
Astro: unknown attribute DbLogExclude. Type 'attr Astro ?' for a detailed list.
Astro: unknown attribute DbLogInclude. Type 'attr Astro ?' for a detailed list.
Can't open ./db.conf: No such file or directory
The specified DbLog-Device "LogDB" doesn't exist.
Invalid characters in name (not A-Za-z0-9._): wetter_
Unknown command
, try help. Unknown command ====, try help. Unknown command
, try help.
[Shelly] Invalid IP address  of Shelly device
[Shelly] Invalid IP address  of Shelly device

Autosave deactivated


Das FHEM (6) ist frisch auf Debian 10 installiert und ich habe auch die ganzen geforderten *perl*.deb installiert. Dennoch scheint da was mit der Datenbank (welche Datenbank eigentlich?) falsch zu sein. Den Plenticore und den KSEM sehe ich. Einen BYD habe ich nicht.
Ist es möglich einfach mal die fhem.cfg, 99_myUtils.pm und ggf. noch weitere fehlende Dateien anzuhängen. Damit hat man erst mal die initiale Konfiguration. Trotz copy & paste hab ich sicher was falsch gemacht. Die Schellys gibt es allerdings nicht! Welche Voraussetzungen muss das FHEM schon vorher mitbringen (Datenbank?).

So groß brauche ich das im Prinzip auch nicht. Mir reicht es schon einen Dummy (oder MQTT*dingens) bei 2000W DC ein und bei 1000W wieder aus zu schalten.

Hallo Andi,

der Appetit kommt beim Essen.

Als erstes fällt mir auf, dass Du wahrscheinlich die DbLog nicht installiert hast. Dazu findest Du im Fhem eine entsprechende Anleitung.
Das ist eine Datenbank, in der die ganzen Daten gesammelt werde, die die PV Anlage liefert, um später Diagramme zeichnen zu können.

Wenn Du das weg lässt, dann kannst Du nur auf Momentanwerte reagieren, aber hast keine Diagramme und der Forecast fällt dann auch weg.
Dazu musst Du Dich entscheiden. Von Filelog rate ich Dir ab, da es ein ziemliches Datenvolumen werden wird, das man in einer Datenbank besser händeln kann.

Am Anfang lege bitte zuerst das PV_Anlage_1 Device an später würde dann PV_Anlage_1_API dazu kommen, um die Statistiken abzufragen.
Die Konfiguration erfolgt über das PV_Anlage_1_config Device, dort kommt z.B. die IP-Adresse des Plenticore rein. Bitte lade das als RAW mit den setstate Befehlen, das sind einige defaults.

Die Geräte Devices brauchst Du am Anfang noch nicht, da schauen wir mal was für Dein 2000W Gerät am besten passen würde.
Wenn Du keine Shellys für die Ansteuerung der Geräte verwendest, musst Du in den Devices entsprechend Änderungen vornehmen. Da Du aber nur ein Gerät schalten möchtest ist das überschaubar.
Was ist das für ein Gerät, das Du schalten möchtest?

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: knuddli am 19 Dezember 2020, 13:07:00
Hallo Christian,

danke für die schnelle Antwort. Die Datenbank ist angelegt und scheint zu funktionieren. Zumindest sind nun keine Fehlermeldungen mehr da.
Ist das Normal das die PV_Anlage_1_API nur "? ? ?" anzeigt? Die API meines Plenticore ist aber auch nur 0.2.0! Firmware 1.42/1.43.

Wie schon erwähnt, ich hab schon alles abgeschrieben. Mittlerweile hab ich auch Astro und DWD richtig eingestellt.

Deine Shellys sind fast baugleich mit meien sonoffs (ESP8266). Allerdings hab ich da Tasmota (MQTT) drauf, da bei mir nix nachhause telefonieren darf. Das passe ich mir noch an...


Noch mal einen riesen Dank für die wahnsinns Arbeit!
VG
Andi
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Dezember 2020, 15:57:28
Zitat von: knuddli am 19 Dezember 2020, 13:07:00
danke für die schnelle Antwort. Die Datenbank ist angelegt und scheint zu funktionieren. Zumindest sind nun keine Fehlermeldungen mehr da.
Ist das Normal das die PV_Anlage_1_API nur "? ? ?" anzeigt? Die API meines Plenticore ist aber auch nur 0.2.0! Firmware 1.42/1.43.
Schau dazu mal die einzelnen Tests im Wiki an.
Ein FW update des Plenticore würde auch sinn machen, da die Speichersteuerung verbessert wurde.

Zitat
Wie schon erwähnt, ich hab schon alles abgeschrieben. Mittlerweile hab ich auch Astro und DWD richtig eingestellt.
Okay, wenn das DWP Device läuft, solltest Du ja auch Werte bekommen. Die schreibe ich nicht in die DB. Lies einfach man in rufe den Teil dazu im Wiki.
Auch das Solat_forecast() kann man manuell aufrufen, um zu testen.
Die DWD Station muss natürlich Rad1h Werte liefern.

Zitat
Deine Shellys sind fast baugleich mit meien sonoffs (ESP8266). Allerdings hab ich da Tasmota (MQTT) drauf, da bei mir nix nachhause telefonieren darf. Das passe ich mir noch an...
Das ist bei meiner Konfiguration relativ egal. Das Kommando steht im entsprechenden Dummy zum Gerät, dort kannst Du eins für an und eins für aus hinterlegen.

SetCmdOff set shelly02 off 0
SetCmdOn set shelly02 on 0
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 22 Dezember 2020, 23:05:33
Hallo zusammen

Ich habe die Batterie Steuerung wie im Wiki beschrieben umgesetzt. So bin ich zumindest der Meinung. Nun habe ich aber das Problem, dass die Umstellung auf nur Laden oder nicht mehr laden alle 3 Sekunden ausgeführt wird. Weiss jemand woran das das liegt?

Hier die Meldungen im Fhemlog ( geht so seitenweise weiter)

2020.12.22 18:57:10 2: PV Überschuss wird in Batterie geladen. Keine Entladung
2020.12.22 18:57:06 2: PV Überschuss wird in Batterie geladen. Keine Entladung
2020.12.22 18:57:03 2: PV Überschuss wird in Batterie geladen. Keine Entladung


Am Morgen, als die Batterie freigegeben wurde:
2020.12.22 12:57:03 2: Batterie über 90%, Entlademodus freigegeben
2020.12.22 11:57:03 2: Batterie über 90%, Entlademodus freigegeben
2020.12.22 10:57:03 2: Batterie über 90%, Entlademodus freigegeben


Mein PV_Schedule Device
################################################################################################################
## 1 Plenticore Status aktualisieren Dies geschieht über das WR_Plenticore_API Device
##
([:57] and [05:00-23:59])
   (get WR_Plenticore_API 21_Battery_Information)(get WR_Plenticore_API 20_Statistic_EnergyFlow)(get WR_Plenticore_API 22_Battery_InternControl)(get WR_Plenticore_API 25_Battery_EM_State)

################################################################################################################
## 2 PV Prognose vom aktuellen Tag aktualisieren
##     zwischen 7 und 19 Uhr zur vollen Stunde
DOELSEIF
([07:00-20:00] and [:00])   ({Solar_forecast("DBLogging","LogDBRep_delete_PV_Forecast","WR_Plenticore","Solar_Calculation_fc","DWD_Forecast",0)})

################################################################################################################
## 3 PV Prognose für den nächsten Tag aktualisieren
##
DOELSEIF
([06:55] or [19:11]) ({Solar_forecast("DBLogging","LogDBRep_delete_PV_Forecast","WR_Plenticore","Solar_Calculation_fc","DWD_Forecast",1)})

################################################################################################################
## 4 regelmäßig die Bilanz aktualisieren
##
DOELSEIF
([+:10] and ![:00]) ## alle 10 Minuten außer um :00
  (get WR_Plenticore_API 04_auth_me)

################################################################################################################
## 5 Wenn die Ladung im Herbst Winter unter MinSoc geht allen PV Überschuss in die Batterie laden
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
[WR_Plenticore_API:Battery_Info_SoC] <= [WR_Plenticore_API:Battery_InternControl_MinSoc])
(set WR_Plenticore_API 22_3_Battery_MinHomeConsumption [WR_Plenticore_API:Battery_Info_WorkCapacity])(get WR_Plenticore_API 22_Battery_InternControl, {Log 2, "PV Überschuss wird in Batterie geladen. Keine Entladung"})

################################################################################################################
## 6 Beim erreichen von 90% Soc die Entladung wieder frei geben
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
[WR_Plenticore_API:Battery_Info_SoC] >= 90 and ([07:00-16:00|8] or [00:00-23:59|7]))
(set WR_Plenticore_API 22_3_Battery_MinHomeConsumption 50)(get WR_Plenticore_API 22_Battery_InternControl, {Log 2, "Batterie über 90%, Entlademodus freigegeben"})


wait  0,3,3,3:0:0:0:0,3:0,3
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Dezember 2020, 08:44:01
Moin Mumpitz,
ich hatte hier eben einige Möglichkeiten eingetragen, die ich jedoch schon alle getestet und ausgeschlossen habe.

Hast Du einen verschieden teuren Strom Tarif, oder warum machst Du noch zusätzlich eine Freigabezeit?
Ich glaube Du hattest da mal etwas in einer Mail geschrieben. Ich würde das dann auch gerne ins Wiki als Hinweis mit aufnehmen.

Schau Dir bitte mal den Event Monitor an, welches Event da immer wieder kommt und das dann auslöst.

attr PV_Anlage_1_API event-on-update-reading auth_.*,Battery_.*,Statistic_Autarky.*,Statistic_Energy_.*arge.*,Statistic_EnergyFeedIn.*,Statistic_EnergyHome.*, Statistic_EnergyPv[1|2].*,Statistic_.*Consumption.*,Statistic_Yield.*

attr Astro event-on-change-reading SunAlt,SunAz,ObsSeason,ObsSeasonN,.*Twilight.*
attr Astro interval 600

Wenn es so nicht zu finden ist, dann frag mal bitte im DOIF Thread nach.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 Dezember 2020, 14:03:30
Hallo zusammen,
ich habe gestern noch das letzte Update für den KSEM geladen und es lief ohne Probleme.
Für die nächste Zeit versuche ich noch ein Grafana Dashboard zu adaptieren, damit Ihr schöne Diagramme und etwas Überblick bekommt :-)
Viele Grüße und ein schönes Fest
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 25 Dezember 2020, 19:27:08
Zitat von: ch.eick am 23 Dezember 2020, 08:44:01

Hast Du einen verschieden teuren Strom Tarif, oder warum machst Du noch zusätzlich eine Freigabezeit?
Ich glaube Du hattest da mal etwas in einer Mail geschrieben. Ich würde das dann auch gerne ins Wiki als Hinweis mit a


Ja genau, wir haben hier von Montag bis Freitag, 0700 - 1900 Uhr, einen Hochtarif und die restliche Zeit einen Niedertarif. Darum habe ich das PV_Schedule so abgeändert, dass er sicher nur im Hochtarif die Batterie entlädt. Muss das allerdings genau beobachten, ob es dadurch dann Eintritt, dass die Batterie voll wird und wir ins Netz einspeisen... Bis jetzt ist das aber noch nie passiert. Dank deiner grossartigen Grafiken würde ich das jedoch sofort merken.

Das DOIF Problem mit dem mehrmaligen Triggern habe ich inzwischen mit einem Hilfs-DOIF gelöst:
defmod di_hilfsDOIF_Batterieladung DOIF ([WR_Plenticore_API:Battery_Info_SoC] <= [WR_Plenticore_API:Battery_InternControl_MinSoc])() DOELSEIF \
([WR_Plenticore_API:Battery_Info_SoC] >= 90)()
attr di_hilfsDOIF_Batterieladung DbLogExclude .*
attr di_hilfsDOIF_Batterieladung alias Batterielademodus
attr di_hilfsDOIF_Batterieladung cmdState laden|entladen
attr di_hilfsDOIF_Batterieladung devStateIcon laden:measure_battery_25 entladen:measure_battery_100
attr di_hilfsDOIF_Batterieladung icon measure_battery_0
attr di_hilfsDOIF_Batterieladung room PV


Nun frage ich im PV_Schedule nur noch den Status dieses Hilfs-DOIF ab. Dadurch kann es keine mehrfach Triggerung mehr geben:
################################################################################################################\
## 5 Wenn die Ladung im Herbst Winter unter MinSoc geht allen PV Überschuss in die Batterie laden\
##\
DOELSEIF\
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and [di_hilfsDOIF_Batterieladung] eq "laden") \
(set WR_Plenticore_API 22_3_Battery_MinHomeConsumption [WR_Plenticore_API:Battery_Info_WorkCapacity])(get WR_Plenticore_API 22_Battery_InternControl, {Log 2, "PV Überschuss wird in Batterie geladen. Keine Entladung"})\
\
################################################################################################################\
## 6 Beim erreichen von 90% Soc die Entladung wieder frei geben\
##\
DOELSEIF\
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and \
[di_hilfsDOIF_Batterieladung] eq "entladen" and ([07:00-16:00|8] or [00:00-23:59|7]))\
(set WR_Plenticore_API 22_3_Battery_MinHomeConsumption 50)(get WR_Plenticore_API 22_Battery_InternControl, {Log 2, "Batterie über 90%, Entlademodus freigegeben"})


Sobald das Wetter wieder besser wird sehe ich ob es funktioniert....
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Dezember 2020, 22:55:20
Zitat von: Mumpitz am 25 Dezember 2020, 19:27:08
Das DOIF Problem mit dem mehrmaligen Triggern habe ich inzwischen mit einem Hilfs-DOIF gelöst:
Nun frage ich im PV_Schedule nur noch den Status dieses Hilfs-DOIF ab. Dadurch kann es keine mehrfach Triggerung mehr geben:
Das sollte aber nicht die Lösung sein, Hast Du Dir die Trigger mal angesehen und dazu das Log verglichen?
Ich hatte bereits Dein DOIF mal nachgebaut und bei mir ist das nicht aufgetreten.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Dezember 2020, 23:00:17
@Mumpitz: Vielen Dank für Deine anerkennende Spende, das hat mich sehr gefreut.
                    Auf eine gute weitere Zusammenarbeit :-)
Viele Grüße und ein frohes Fest
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 25 Dezember 2020, 23:13:26
Zitat von: ch.eick am 25 Dezember 2020, 22:55:20
Das sollte aber nicht die Lösung sein, Hast Du Dir die Trigger mal angesehen und dazu das Log verglichen?
Ich hatte bereits Dein DOIF mal nachgebaut und bei mir ist das nicht aufgetreten.

Gruß
    Christian

Nein, weil der Akku im Moment bei 52% steht und daher vorläufig nicht mehr geladen wird. Ich müsste dann genau in dem Moment am Event Monitor sitzen wo es triggert!

Darum habe ich mir damit beholfen!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Dezember 2020, 09:03:48
Zitat von: Mumpitz am 25 Dezember 2020, 23:13:26
Darum habe ich mir damit beholfen!
Das ist manchmal schwierig.
Wenn Du MinSoc auf 80% setzt, wird er zwangsweise geladen, eventuell kannst Du da ja den Event erwischen.

EDIT: Mir ist da noch eine Idee gekommen.

Lass doch eventuell meine DOELSEIF bestehen und füge noch weitere für die Preissteuerung hinzu, wie zB

DOELSEIF
(  [PV_Anlage_1_API:Battery_Info_SoC] >= 50 and ([07:00-16:00|8] or [00:00-23:59|7]) )

  (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption 50)
  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 2, "Batterie über 90%, Entlademodus freigegeben"})

Dann könntest Du die reine Wintersteuerung zur Vermeidung der Notladung von der Tarifsteuerung trennen. Das wäre dann etwas für's Wiki.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Snakebyte91 am 30 Dezember 2020, 20:30:37
Welche Firmwareversion hat euer Wechselrichter?

Meiner wurde letzte Woche wegen eines Fehlers mit dem BYD Speicher auf die Firmware 1.46/1.45 aktualisiert. Als API Version wird mir 0.2.0 angezeigt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Dezember 2020, 23:47:39
Hallo erstmal, und willkommen im Team :-)

Zitat von: Snakebyte91 am 30 Dezember 2020, 20:30:37
Welche Firmwareversion hat euer Wechselrichter?

Meiner wurde letzte Woche wegen eines Fehlers mit dem BYD Speicher auf die Firmware 1.46/1.45 aktualisiert. Als API Version wird mir 0.2.0 angezeigt.


Software-Version_IO-Controller_(IOC) 01.45
Software-Version_Maincontroller_(MC) 01.46

info_api_version 0.2.0
info_hostname scb
info_name PUCK RESTful API
info_sw_version 01.16.05025


Falls Du auch meine Implementierung verwendest wäre somit die v1.16 Variante die Richtige.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Dezember 2020, 23:52:18
Dank der letzten Anfrage habe ich festgestellt, das im PV_Anlage_1_API die Ausgabe für info_* etwas vertauscht ist.
Hier noch die Korrektur zum Überschreiben.

attr PV_Anlage_1_API get05-1Name info_api_version
attr PV_Anlage_1_API get05-2Name info_hostname
attr PV_Anlage_1_API get05-3Name info_name
attr PV_Anlage_1_API get05-4Name info_sw_version


Hat jetzt noch jemand eine kleinere Version als die 1.16 für den Plenticore im Einsatz?
Ich werde ansonsten im Wiki die andere Version entfernen und auch alles was mit dem Umstieg zu tun hat, also bitte alsbald kurz melden.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 31 Dezember 2020, 12:37:02
Hallo zusammen,
für die, die gerne auch Grafana verwenden möchten, stelle ich hier mal meine momentanen Diagramme hier ein.
Ich verwende Grafana 7.3.1 als Docker Image auf einem RPI4 32Bit, was sich problemlos integrieren ließ. Also einfach das .json importieren und es sollte dann so aussehen wie im Bild.

VG und einen guten Rutsch
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Januar 2021, 14:32:12
EDIT 15:43: Ich habe den Eintrag nochmals überarbeitet. Bei Bedarf bitte nochmals lesen.

Hallo Mumpitz,

ich hatte nun auch den Loop im PV_Schedule

2021.01.01 10:59:16.089 2: PV Überschuss wird in Batterie geladen. Keine Entladung
2021.01.01 10:59:22.835 2: PV Überschuss wird in Batterie geladen. Keine Entladung
...

Das hat folgende Bewandtnis:

Das entsprechende DOELSEIF reagiert auf den Trigger [PV_Anlage_1_API:Battery_InternControl_MinSoc]
dann erfolgt ein "get PV_Anlage_1_API 22_Battery_InternControl" , was wiederum den Status abfragt und wieder einen event-on-update erzeugt.


Um das nun abzustellen wäre eine Änderung der Events im PV_Anlage_1_API ,notwendig, was ich bereits getestet habe.

attr PV_Anlage_1_API event-on-change-reading Battery_.*
attr PV_Anlage_1_API event-on-update-reading auth_.*,Statistic_Autarky.*,Statistic_Energy_.*arge.*,Statistic_EnergyFeedIn.*,Statistic_EnergyHome.*, Statistic_EnergyPv[1|2].*,Statistic_.*Consumption.*,Statistic_Yield.*


Weiterhin habe ich auch die Logmeldung im PV_Schedule etwas verändert, damit man sieht aus welchem Device die Meldung kommt.

snip...
################################################################################################################
## 6 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] <= [PV_Anlage_1_API:Battery_InternControl_MinSoc])
  (get BYD_Status BatteryInformation)
  (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption [PV_Anlage_1_API:Battery_Info_WorkCapacity])
  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 2, "PV_Schedule cmd_6 : PV Überschuss wird in Batterie geladen. Keine Entladung"})

################################################################################################################
## 7 Beim erreichen von 90% Soc die Entladung wieder frei geben
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] >= 90)

  (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption 50)
  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 2, "PV_Schedule cmd_7 : Batterie über 90%, Entlademodus freigegeben"})


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 01 Januar 2021, 20:13:07
Zitat von: ch.eick am 01 Januar 2021, 14:32:12
EDIT 15:43: Ich habe den Eintrag nochmals überarbeitet. Bei Bedarf bitte nochmals lesen.

Hallo Mumpitz,

ich hatte nun auch den Loop im PV_Schedule

2021.01.01 10:59:16.089 2: PV Überschuss wird in Batterie geladen. Keine Entladung
2021.01.01 10:59:22.835 2: PV Überschuss wird in Batterie geladen. Keine Entladung
...

Das hat folgende Bewandtnis:

Das entsprechende DOELSEIF reagiert auf den Trigger [PV_Anlage_1_API:Battery_InternControl_MinSoc]
dann erfolgt ein "get PV_Anlage_1_API 22_Battery_InternControl" , was wiederum den Status abfragt und wieder einen event-on-update erzeugt.


Um das nun abzustellen wäre eine Änderung der Events im PV_Anlage_1_API ,notwendig, was ich bereits getestet habe.

attr PV_Anlage_1_API event-on-change-reading Battery_.*
attr PV_Anlage_1_API event-on-update-reading auth_.*,Statistic_Autarky.*,Statistic_Energy_.*arge.*,Statistic_EnergyFeedIn.*,Statistic_EnergyHome.*, Statistic_EnergyPv[1|2].*,Statistic_.*Consumption.*,Statistic_Yield.*


Weiterhin habe ich auch die Logmeldung im PV_Schedule etwas verändert, damit man sieht aus welchem Device die Meldung kommt.

VG
   Christian

Hallo Christian

Zuerst ein Frohes neues Jahr und alles gute!

Habe es bei mir eingebaut und das Hilfs DOIF vorerst disabled. Sobald die Batterie zum erstenmal voll ist werde ich berichten ob es geklappt hat!

Einmal mehr: DANKE!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Januar 2021, 22:30:11
Zitat von: Mumpitz am 01 Januar 2021, 20:13:07
Habe es bei mir eingebaut und das Hilfs DOIF vorerst disabled. Sobald die Batterie zum erstenmal voll ist werde ich berichten ob es geklappt hat!
Du kannst es ja eher testen, wenn Du den Schwellwert in DOIF änderst ;-)

Alles Gute
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 01 Januar 2021, 22:52:52
Zitat von: ch.eick am 01 Januar 2021, 22:30:11
Du kannst es ja eher testen, wenn Du den Schwellwert in DOIF änderst ;-)

Alles Gute
  Christian

Ich bin eher der Typ des Live Testers und warte gespannt auf den Tag wo der Speicher wieder voll wird... :-)

Habe mir vorhin überlegt das wir durch die Schaltung ja im Herbst und Winter den Speicher schonen. So zumindest die Theorie. Ob es so ist werden wir wohl erst bei der Pensionierung erfahren :-)

Nun, was könnten wir im Frühling und Sonmer optimieren?
Meinen Akku Kenntnissen zur Folge hat es der Speicher ja ungern, wenn er auf 100% geladen wird. Das würde bedeuten, dass wir die maximale Kapazität begrenzen sollten auf 80-90%. Aber nur, wenn das Wetter am Tag darauf mitspielen wird. Was hältst du davon?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Januar 2021, 11:22:14
Zitat von: Mumpitz am 01 Januar 2021, 22:52:52
Habe mir vorhin überlegt das wir durch die Schaltung ja im Herbst und Winter den Speicher schonen. So zumindest die Theorie. Ob es so ist werden wir wohl erst bei der Pensionierung erfahren :-)
Ich bin auch mal gespannt, wie fitt der Speicher nach 15 Jahren sein wird.

Zitat
Nun, was könnten wir im Frühling und Sonmer optimieren?
Meinen Akku Kenntnissen zur Folge hat es der Speicher ja ungern, wenn er auf 100% geladen wird. Das würde bedeuten, dass wir die maximale Kapazität begrenzen sollten auf 80-90%. Aber nur, wenn das Wetter am Tag darauf mitspielen wird. Was hältst du davon?
Das hatte ich auch bereits angedacht, das Problem ist nur, dass dafür der Speicher weg konfiguriert werden muss und später wieder dazu. Das ist etwas unschön und ich hatte die Hoffnung, das da von Kostal noch eine FW Änderung kommen würde. Das, was gekommen ist, ist eine Zeitsteuerung bei der man man folgendes konfigurieren kann.


Intelligente Batteriesteuerung aktivieren   <<< zuerst deaktivieren
Zeitgesteuerte Batterienutzung      <<<< dann aktivieren

## Dann bestehen folgende Möglichkeiten
- Keine Einschränkung
- Batterieladung gesperrt, -entladung bei Hausbedarf erlaubt
  Das wäre dann die Option für den Sommer ab 90% Soc

- Batterieentladung gesperrt, -ladung bei Energieüberschuss erlaubt
  Hier wäre die Option, die wir bereits dynamisch nachgebaut haben


Die Zeitsteuerung wäre gut für Deine Tarif Zeiten zu nutzen. Um jedoch dynamisch zu reagieren finde ich das recht umständlich, man müsste jedesmal die Zeitsteuerung umprogrammieren und könnte nur im Zeitraster reagieren. Das war der Grund, warum ich mich für die jetzige Variante entschieden hatte.
Einen MaxSoc gibt es wohl noch nicht, genau so wenig wie eine vorgewählte Ladeleistung.

Ich möchte hier jedoch keine erneute Diskussion über die FW vom Plenticore starten. Das wurde bereits in diversen Threads im Photovoltaikforum (https://www.photovoltaikforum.com/board/171-kostal-solar-electric) besprochen.

Über folgende Einstellung kann man die Batterie weg konfigurieren:
Achtung, bitte zuerst den eigenen Batterie Typ auslesen und merken. Die Zuordnung der Ziffern zum Batterie Typ dann bitte hier melden, damit ich es im Wiki eintragen kann.

get PV_Anlage_1_API 22_Battery_InternControl
set PV_Anlage_1_API 22_7_Battery_Type 0

Mit diesem Eingriff übernimmt man jedoch auch die Verantwortung für die Batterieladung! Vergisst man die Batterie wieder zu aktivieren kann es z.B. zu einer Tiefentladung kommen.

Mit diesem Hintergrund empfehle ich also die Nutzung der Zeitsteuerung, die vom Hersteller bereit gestellt wurde, auch wenn ich mir etwas anderes wünschen würde.
Die Einstellung lässt sich bereits abfragen, jedoch habe ich es noch nicht über die API gesetzt. Auch wird die Rückmeldung noch nicht in einem reading aufbereitet.

attr PV_Anlage_1_API showBody 1
get PV_Anlage_1_API 23_Battery_TimeControl

[{"id":"Battery:TimeControl:ConfFri","value":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},
{"id":"Battery:TimeControl:ConfMon","value":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},
{"id":"Battery:TimeControl:ConfSat","value":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},
{"id":"Battery:TimeControl:ConfSun","value":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},
{"id":"Battery:TimeControl:ConfThu","value":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},
{"id":"Battery:TimeControl:ConfTue","value":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},
{"id":"Battery:TimeControl:ConfWed","value":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},
{"id":"Battery:TimeControl:Enable","value":"0"}]

Wenn jemand eine sinnvolle Verwendung erarbeitet, würde ich das gerne mit einbauen. Die verwendete Theorie würde mir reichen um die Logik dann umzusetzen.
Also her mit den Ideen ;-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 08 Januar 2021, 21:01:52
Hallo Freunde der gepflegten Diskussion

Ich nehme an bei euch ist der Ertrag im Moment echt beschissen. Ich habe in diesem Jahr knapp 2kWh per kWp. Unterirdisch ... Nichtsdestotrotz soll es weitergehen...

Folgende Idee zum aufräumen der Logs:
Dank Christian haben wir ja wunderbare Bezeichnungen, welche sich ideal anbieten mittels Wildcards zum aufräumen. Mache ich einen Denkfehler in meiner Theorie? Falls nein würde ich die entsprechenden DbRep Devices mal erstellen, hier einstellen und anschliessend fürs Wiki aufbereiten:

1. DbRep Device:
Alle Readings im PV_Anlage_1_API welche auf %_Day lauten können alle Werte bis auf den höchsten pro Tag gelöscht werden

2. DbRep Device:
Alle Readings im PV_Anlage_1_API welche auf %_Month lauten können alle Werte bis auf den höchsten pro Monat gelöscht werden

3. DbRep Device:
Alle Readings im PV_Anlage_1_API welche auf %_Year lauten können alle Werte bis auf den höchsten pro Jahr gelöscht werden

Anschliessend ein DOIF, welches monatlich am 2ten Tag des Monat die obigen 3 DbRep's ausführt. Ich würde vorschlagen dies dann das in das DB_Service_Schedule zu überführen.

Was haltet ihr von dieser Idee?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Januar 2021, 22:28:58
EDIT: 2021.01.09

Hi Mumpitz,

ich habe bereits auch einiges erstellt.

LogDBRep_Statistic_EnergyFeedInGrid_Year_diff_Week
LogDBRep_Statistic_EnergyHomePvSum_Year_diff_Week
LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month
LogDBRep_Statistic_Yield_Month_max_Month
LogDBRep_Statistic_Yield_Year_diff_Week
LogDBRep_delete_PV_Forecast
LogDBRep_delete_Statistic_EnergyHomeBat_Day_max_Day
LogDBRep_delete_Statistic_EnergyHomePvSum_Day_max_Day
LogDBRep_delete_Statistic_TotalConsumption_Day_max_Day

Somit müssten Deine Vorschläge bereits teilweise erledigt sein.

Ich stell das dann mal ins Wiki. <<< erledigt.

Um keine Werte durch Wildcards zu verlieren verwende ich momentan für jedes reading ein einzelnes DbRep. Gelöscht ist leider manchmal sehr schnell :-)

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 10 Januar 2021, 12:33:17
So, heute morgen hatte ich etwas Zeit, das erste DbRep Device für die regelmässige Löschung der Tageswerte, bis auf den höchsten, zu löschen:

defmod LogDBRep_Statistic_Day_max_Day DbRep DBLogging
attr LogDBRep_Statistic_Day_max_Day DbLogExclude .*
attr LogDBRep_Statistic_Day_max_Day aggregation day
attr LogDBRep_Statistic_Day_max_Day allowDeletion 1
attr LogDBRep_Statistic_Day_max_Day comment Version 2021.01.10\
Dieses DbRep device löscht alle Werte des PV_Anlage_1_API Reading welche Day im Namen haben bis auf den höchsten Wert pro Tag.
attr LogDBRep_Statistic_Day_max_Day device PV_Anlage_1_API
attr LogDBRep_Statistic_Day_max_Day reading %_Day
attr LogDBRep_Statistic_Day_max_Day showproctime 1
attr LogDBRep_Statistic_Day_max_Day devStateIcon connected:10px-kreis-gelb .*disconnect:10px-kreis-rot .*done:10px-kreis-gruen
attr LogDBRep_Statistic_Day_max_Day room Log
attr LogDBRep_Statistic_Day_max_Day sortby 05
attr LogDBRep_Statistic_Day_max_Day timestamp_begin previous_year_begin
attr LogDBRep_Statistic_Day_max_Day timestamp_end previous_month_end


Nach der erstmaligen Ausführung könnte man dies mit einem monatlichen DOIF, jeweils am zweiten Tag des Monats, ausführen. Dabei könnte man
attr LogDBRep_Statistic_Day_max_Day timestamp_begin previous_year_begin

durch
attr LogDBRep_Statistic_Day_max_Day timestamp_begin previous_month_begin
ersetzen.

Ich selber habe es bei mir noch nicht ausgeführt. Was haltet ihr davon? Meiner Meinung nach sollten keine Werte gelöscht werden, welche wir irgendwo benötigen, oder?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2021, 14:13:08
Zitat von: Mumpitz am 10 Januar 2021, 12:33:17
So, heute morgen hatte ich etwas Zeit, das erste DbRep Device für die regelmässige Löschung der Tageswerte, bis auf den höchsten, zu löschen:

Ich selber habe es bei mir noch nicht ausgeführt. Was haltet ihr davon? Meiner Meinung nach sollten keine Werte gelöscht werden, welche wir irgendwo benötigen, oder?
Bei den Tages Werten sollte das so okay sein, es sei denn Du möchtest eventuell noch den Durchschnitts Wert. Das ist der Grund, warum ich da eher selektiv vor gehe, weg ist weg :-)

Für die Monats und Jahres Werte solltest Du eventuell berücksichtigen, das diese Werte Tages, Wochen oder Monatsweise steigen und auch wieder sinken können.
Dies gilt insbesondere für die Autarkie und den Eigenverbrauch, der ja sogar innerhalb des Tages schwankt und somit nicht als maxValue zu verwenden wäre.
Aus den Monat oder Jahr Werten bilde ich dann auch noch Werte für die Woche.

Mein Resümee ist, also besser nochmal darüber diskutieren, ansonsten hätte ich das bereits einfach ins Wiki eingetragen, aber mir fehlt noch die Erfahrung, was ich brauche.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 10 Januar 2021, 20:11:00
Zitat von: ch.eick am 10 Januar 2021, 14:13:08
Dies gilt insbesondere für die Autarkie und den Eigenverbrauch, der ja sogar innerhalb des Tages schwankt und somit nicht als maxValue zu verwenden wäre.

ok, den Autarky_Day ist nun berücksichtigt:
defmod LogDBRep_Statistic_Day_max_Day DbRep DBLogging
attr LogDBRep_Statistic_Day_max_Day DbLogExclude .*
attr LogDBRep_Statistic_Day_max_Day aggregation day
attr LogDBRep_Statistic_Day_max_Day allowDeletion 1
attr LogDBRep_Statistic_Day_max_Day comment Version 2021.01.10\
Dieses DbRep device löscht alle Werte des PV_Anlage_1_API Reading welche Day im Namen haben bis auf den höchsten Wert pro Tag.
attr LogDBRep_Statistic_Day_max_Day device PV_Anlage_1_API
attr LogDBRep_Statistic_Day_max_Day reading %_Day EXCLUDE=Statistic_Autarky_Day,Statistic_OwnConsumptionRate_Day
attr LogDBRep_Statistic_Day_max_Day showproctime 1
attr LogDBRep_Statistic_Day_max_Day devStateIcon connected:10px-kreis-gelb .*disconnect:10px-kreis-rot .*done:10px-kreis-gruen
attr LogDBRep_Statistic_Day_max_Day room Log
attr LogDBRep_Statistic_Day_max_Day sortby 05
attr LogDBRep_Statistic_Day_max_Day timestamp_begin previous_year_begin
attr LogDBRep_Statistic_Day_max_Day timestamp_end previous_month_end


Brauchst du für die Bestimmung der Mittelwerte wirklich die einzelnen Stände für jeden Zeitpunkt des Tages? Würde nicht der Mittelwert aller Tages Maximal Werte reichen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 10 Januar 2021, 20:17:02
Ich schon wieder. Jetzt noch etwas zum Thema Forecast. Heute war bei uns endlich mal wieder ein Tag, bei welchem die Sonne durchgehend auf die Module brannte. Daher habe ich nun noch eine Frage zum Forecast. Die Berechnung gestern hat für den heutigen Tag 19677 Wh ergeben. Tatsächlich waren es 10900 Wh. Also fast die Hälfte daneben. Beim Diagramm sieht es ähnlich aus. Obwohl die Sonne nie durch Wolken getrübt wurde, erreicht die Produktion nie die Werte aus dem Forecast. Ich habe die entsprechende Grafik angehängt. An welchen Werten in der Config würdest du schrauben?

setstate WR_Plenticore_config 2020-12-15 15:49:14 forecast_cloudk 25
setstate WR_Plenticore_config 2020-11-07 16:53:44 forecast_cloudk_base 0
setstate WR_Plenticore_config 2020-12-26 22:24:59 forecast_factor 1.5
setstate WR_Plenticore_config 2020-11-07 16:53:57 forecast_raink 20
setstate WR_Plenticore_config 2020-11-07 16:54:11 forecast_raink_base 0
setstate WR_Plenticore_config 2020-11-07 16:48:53 forecast_tempk 48
setstate WR_Plenticore_config 2020-11-07 16:50:47 forecast_tempk_base 25
setstate WR_Plenticore_config 2020-09-10 21:23:35 module_1_count 16
setstate WR_Plenticore_config 2020-09-10 21:32:30 module_1_direction -90
setstate WR_Plenticore_config 2020-09-10 21:32:42 module_1_name East
setstate WR_Plenticore_config 2020-09-10 21:37:19 module_1_plain 29
setstate WR_Plenticore_config 2020-09-10 21:32:04 module_1_power 330
setstate WR_Plenticore_config 2020-09-10 21:24:07 module_2_count 16
setstate WR_Plenticore_config 2020-09-10 21:33:04 module_2_direction 90
setstate WR_Plenticore_config 2020-09-10 21:33:29 module_2_name West
setstate WR_Plenticore_config 2020-09-10 21:37:27 module_2_plain 29
setstate WR_Plenticore_config 2020-09-10 21:33:56 module_2_power 330
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2021, 08:46:48
Zitat von: Mumpitz am 10 Januar 2021, 20:17:02
Ich schon wieder. Jetzt noch etwas zum Thema Forecast. Heute war bei uns endlich mal wieder ein Tag, bei welchem die Sonne durchgehend auf die Module brannte. Daher habe ich nun noch eine Frage zum Forecast. Die Berechnung gestern hat für den heutigen Tag 19677 Wh ergeben. Tatsächlich waren es 10900 Wh. Also fast die Hälfte daneben. Beim Diagramm sieht es ähnlich aus. Obwohl die Sonne nie durch Wolken getrübt wurde, erreicht die Produktion nie die Werte aus dem Forecast. Ich habe die entsprechende Grafik angehängt. An welchen Werten in der Config würdest du schrauben?

Moin Mumpitz,
als erstes sieht Dein Wert für SolarRadiationPrognose merkwürdig aus, wurden vom DWD so sehr unterschiedliche Werte geliefert? Ab 11:45 ist da ja ein richtiger Sprung drin.

Dann hast u den allgemeinen Korrektur Faktor gesetzt, der Dir die Prognose um 1,5 verstärkt. Setz den mal wieder auf 1

setstate WR_Plenticore_config 2020-12-26 22:24:59 forecast_factor 1.5


Wenn Du einen festen Faktor erkennen kannst, dann könnte man dort etwas eintragen, oder diesen auch pro Jahreszeit verändern, dafür müsste man das ganze aber auch längere Zeit auswerten.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 11 Januar 2021, 09:58:00
Zitat von: ch.eick am 11 Januar 2021, 08:46:48
Wenn Du einen festen Faktor erkennen kannst, dann könnte man dort etwas eintragen, oder diesen auch pro Jahreszeit verändern, dafür müsste man das ganze aber auch längere Zeit auswerten.
Kennt sich jemand mit KI aus? Wenn man auf Basis der eigenen Aufzeichnungen (Forecast Rad1h, Sonne, Bedeckung, ... , Ist-Werte) die KI die Abhängigkeiten und Faktoren ermitteln lässt wäre das die Gold-Lösung.

Andererseits gilt der Spruch: erstens kommt es anders und zweitens als man denkt

VG Peter
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2021, 12:30:31
Zitat von: plin am 11 Januar 2021, 09:58:00
Kennt sich jemand mit KI aus? Wenn man auf Basis der eigenen Aufzeichnungen (Forecast Rad1h, Sonne, Bedeckung, ... , Ist-Werte) die KI die Abhängigkeiten und Faktoren ermitteln lässt wäre das die Gold-Lösung.

Andererseits gilt der Spruch: erstens kommt es anders und zweitens als man denkt
Ich wollte es einfach halten und hatte mich für den Faktor entschieden ;-) Bisher brauchte ich diesen jedoch noch nie und hatte ihn auf 1 gelassen. Der Sinn dahinter war einfach, dass man eine Möglichkeit hat den Forecast etwas anzuheben oder zu verringern, wenn man feststellt, dass er immer insgesamt zu hoch/niedrig ist.

@Mumpitz versuch einfach mal 1 und beobachte es. Du verwendest ja, nach meiner Erinnerung, auch die Gesamtsumme des Forecast vom ganzen Tag, was bei einem ein Stunden Rhythmus einen ungefähren kWh Wert liefert. Da steckt natürlich nochmals eine Ungenauigkeit drin! Für das fine Tuning sollte man sich auf die Optik verlassen und schauen, dass die Kurven so gut es geht beieinander liegen. Wenn man dann zufrieden ist, könnte man die Tagessumme als Trigger verwenden.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2021, 12:36:45
Zitat von: plin am 11 Januar 2021, 09:58:00
Wenn man auf Basis der eigenen Aufzeichnungen (Forecast Rad1h, Sonne, Bedeckung, ... , Ist-Werte) die KI die Abhängigkeiten und Faktoren ermitteln lässt wäre das die Gold-Lösung.
Hallo Peter,

hast Du eventuell noch eine Prognose für Schnee gefunden. Und eventuell einen Sittt Bum Faktor, wenn der Schnee, je nach Dachneigung , mit einem Bum, die PV Module wieder frei gibt? :-)
Das fände ich noch eine Änderung im Solar_forecast() für würdig.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 11 Januar 2021, 13:31:25
Zitat von: ch.eick am 11 Januar 2021, 12:36:45
hast Du eventuell noch eine Prognose für Schnee gefunden. Und eventuell einen Sittt Bum Faktor, wenn der Schnee, je nach Dachneigung , mit einem Bum, die PV Module wieder frei gibt? :-)
Das fände ich noch eine Änderung im Solar_forecast() für würdig.
Ich stecke noch bei Rad1h, R600, Neff, coud, ChOfRain, Sun etc. fest. Selbst das sind schon zu viele Faktoren.
Ich glaube egal was man ansetzt und als Faktor mit einbaut, man liegt immer falsch - zumindest wenn es sich um Stundenprofile handelt. Den Tagesertrag könnte man vielleicht noch auf Basis statistischer Auswerungen ermitteln, aber es gibt halt viele Einflussfaktoren. KI wäre dann der faule Weg. Ich denke nicht selbst drüber nach sondern die KI sagt's mir einfach.

P.S. DWD MOSMIX:
Schnee-Regen-Äquivalent (1-stündig)  letzte 1 Stunde    RRS1c
Schnee-Regen-Äquivalent (3-stündig)  letzte 3 Stunden   RRS3c
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2021, 14:18:00
Zitat von: plin am 11 Januar 2021, 13:31:25
P.S. DWD MOSMIX:
Schnee-Regen-Äquivalent (1-stündig)  letzte 1 Stunde    RRS1c
Schnee-Regen-Äquivalent (3-stündig)  letzte 3 Stunden   RRS3c
Dann frage ich mal diese Werte ab und füge es eventuell in die Prognose mit ein.

EDIT: Für heute steht alles auf 0 :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 11 Januar 2021, 16:06:26
Bei uns war mehr angekündigt ...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2021, 17:11:12
Zitat von: plin am 11 Januar 2021, 16:06:26
Bei uns war mehr angekündigt ...
Macht es da Sinn, auch den Ertrag zu reduzieren, oder liegt dann wirklich schon Schnee auf den Modulen und es kommt gar nichts mehr?
Ich bräuchte mehr Informationen, ab wann der Ertrag leidet.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 11 Januar 2021, 18:45:13
Zitat von: ch.eick am 11 Januar 2021, 17:11:12
Macht es da Sinn, auch den Ertrag zu reduzieren, oder liegt dann wirklich schon Schnee auf den Modulen und es kommt gar nichts mehr?
Ich bräuchte mehr Informationen, ab wann der Ertrag leidet.
Dazu müsste der Schnee bei uns erst mal liegen bleiben. Das nächste Mal gehe ich raus und werfe einen Blick auf's Dach. Auf dem Rasen lagen vielleicht 2 cm.
Bei der Dicke kann man beim Effekt wahrscheinlich noch nicht zwischen Bewölkung und Schnee unterscheiden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2021, 09:19:50
Zitat von: plin am 11 Januar 2021, 18:45:13
Dazu müsste der Schnee bei uns erst mal liegen bleiben. Das nächste Mal gehe ich raus und werfe einen Blick auf's Dach. Auf dem Rasen lagen vielleicht 2 cm.
Bei der Dicke kann man beim Effekt wahrscheinlich noch nicht zwischen Bewölkung und Schnee unterscheiden.
Heute Morgen sind bei mir auch Werte für RRS1c gekommen und auch tatsächlich etwas Schnee.
Gleichzeitig ist die Bewölkung und die Regenwahrscheinlichkeit auch gestiegen, sowie die Rad1h Werte sehr niedrig. Die berechneten Solar_Calculation Werte sind so grottig niedrig, das eine weitere Senkung wegen. Schnee nicht notwendig wäre.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2021, 13:15:44
Hallo zusammen,
ich habe mir ein Herz genommen und mal wieder etwas Copy/Past gemacht. Nach einer Stunde Arbeit ist nun über das Device PV_Anlage_1_API die externe Batterie Steuerung verfügbar, bisher war nur eine Abfrage möglich.
Leider habe ich noch keine praktische Erfahrung mit der externen Batterie Steuerung.
Nach Aussage aus einem anderen Forum werden hierdurch jedoch einzelne interne Werte, für eine Zeit von 3 Minuten überschrieben. Dies hat den Hintergrund, das die externe Steuerung regelmäßig die Werte setzen muss, um den Zustand zu erhalten. Es soll verhindert werden, dass sich die externe Steuerung eventuell aufgehängt hat und somit die Kontrolle über die Batterie verloren geht.

Ein Szenario wäre z.B. die Begrenzung der Batterieladung auf MaxSoc 80%

- Bei meiner Anlage bin ich im Sommer mit ca 40% Batterieladung aus der Nacht gekommen.
- in Phasen von langem Top Wetter konnte die Batterie niemals einen Wert von z.B. MinSoc 10% erreichen.

- Es könnte eine Langfristige Speicherung verhindert werden
- Bei einer schlechten Prognose für den nächsten Tag soll die Batterie auf Soc 100% geladen werden
- Bei sehr guter Prognose soll die Batterie am Abend z.B. nur 70% geladen sein. Das hängt natürlich vom jeweiligen Haushalt und der Batteriegröße ab.
- Die Ladezeit soll natürlich im dynamischen 70% Bereich liegen, damit es keine Abriegelung gibt.

Vorteile:
- weniger Stress für den Speicher
- geringfügig mehr Einspeisung am Morgen und Nachmittag
- Der Plenticore bekommt eine externe Prognose und trifft für die Ladezeit besser das Maximum.
- Die Speicherladung kann besser auf den Haushalt angepasst werden.


Damit Ihr kein komplett Update des Devices machen müsst habe ich hier mal die delta Befehle aufgelistet. Bitte prüft das jedoch nochmal, bevor Ihr das Löschen durchführt.

attr PV_Anlage_1_API comment Version 2021.01.12 12:30\
Passworte für die Abfrage des PV_Anlage_1_API werden im storeKeyValue abgelegt:\
   {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
   {KeyValue("store","PW_PV_Anlage_1_API_user","<passwort>")}

###################################################################################################
## An dieser Stelle werden alte Attribute entfernt, die dann später mit einer zweistelligen Nummerierung neu erstellt werden.
##
deleteattr PV_Anlage_1_API set221Data
deleteattr PV_Anlage_1_API set221Header01
deleteattr PV_Anlage_1_API set221Header02
deleteattr PV_Anlage_1_API set221Hint
deleteattr PV_Anlage_1_API set221Method
deleteattr PV_Anlage_1_API set221Name
deleteattr PV_Anlage_1_API set221URL
deleteattr PV_Anlage_1_API set223Data
deleteattr PV_Anlage_1_API set223Header01
deleteattr PV_Anlage_1_API set223Header02
deleteattr PV_Anlage_1_API set223Hint
deleteattr PV_Anlage_1_API set223Method
deleteattr PV_Anlage_1_API set223Name
deleteattr PV_Anlage_1_API set223URL
deleteattr PV_Anlage_1_API set224Data
deleteattr PV_Anlage_1_API set224Header01
deleteattr PV_Anlage_1_API set224Header02
deleteattr PV_Anlage_1_API set224Hint
deleteattr PV_Anlage_1_API set224Method
deleteattr PV_Anlage_1_API set224Name
deleteattr PV_Anlage_1_API set224URL
deleteattr PV_Anlage_1_API set225Data
deleteattr PV_Anlage_1_API set225Header01
deleteattr PV_Anlage_1_API set225Header02
deleteattr PV_Anlage_1_API set225Hint
deleteattr PV_Anlage_1_API set225Method
deleteattr PV_Anlage_1_API set225Name
deleteattr PV_Anlage_1_API set225URL
deleteattr PV_Anlage_1_API set226Data
deleteattr PV_Anlage_1_API set226Header01
deleteattr PV_Anlage_1_API set226Header02
deleteattr PV_Anlage_1_API set226Hint
deleteattr PV_Anlage_1_API set226Method
deleteattr PV_Anlage_1_API set226Name
deleteattr PV_Anlage_1_API set226URL
deleteattr PV_Anlage_1_API set227Data
deleteattr PV_Anlage_1_API set227Header01
deleteattr PV_Anlage_1_API set227Header02
deleteattr PV_Anlage_1_API set227Hint
deleteattr PV_Anlage_1_API set227Method
deleteattr PV_Anlage_1_API set227Name
deleteattr PV_Anlage_1_API set227URL

###################################################################################################
##  Hier kommen die neuen Set Attribute für die zweistellige Nummerierung
##
attr PV_Anlage_1_API set2201Data [{"moduleid":"devices:local","settings":[{"id":"Battery:DynamicSoc:Enable","value":"$val"}]}]
attr PV_Anlage_1_API set2201Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2201Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2201Hint 0,1
attr PV_Anlage_1_API set2201Method PUT
attr PV_Anlage_1_API set2201Name 22_01_Battery_DynamicSoc_Enable
attr PV_Anlage_1_API set2201URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2203Data [{"moduleid":"devices:local","settings":[{"id":"Battery:MinHomeComsumption","value":"$val"}]}]
attr PV_Anlage_1_API set2203Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2203Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2203Hint slider,50,50,8000
attr PV_Anlage_1_API set2203Method PUT
attr PV_Anlage_1_API set2203Name 22_03_Battery_MinHomeConsumption
attr PV_Anlage_1_API set2203URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2204Data [{"moduleid":"devices:local","settings":[{"id":"Battery:MinSoc","value":"$val"}]}]
attr PV_Anlage_1_API set2204Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2204Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2204Hint slider,10,5,100
attr PV_Anlage_1_API set2204Method PUT
attr PV_Anlage_1_API set2204Name 22_04_Battery_MinSoc
attr PV_Anlage_1_API set2204URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2205Data [{"moduleid":"devices:local","settings":[{"id":"Battery:SmartBatteryControl:Enable","value":"$val"}]}]
attr PV_Anlage_1_API set2205Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2205Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2205Hint 0,1
attr PV_Anlage_1_API set2205Method PUT
attr PV_Anlage_1_API set2205Name 22_05_Battery_SmartBatteryControl_Enable
attr PV_Anlage_1_API set2205URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2206Data [{"moduleid":"devices:local","settings":[{"id":"Battery:Strategy","value":"$val"}]}]
attr PV_Anlage_1_API set2206Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2206Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2206Hint 1,2
attr PV_Anlage_1_API set2206Method PUT
attr PV_Anlage_1_API set2206Name 22_06_Battery_Strategy
attr PV_Anlage_1_API set2206URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2207Data [{"moduleid":"devices:local","settings":[{"id":"Battery:Type","value":"$val"}]}]
attr PV_Anlage_1_API set2207Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2207Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2207Hint 0,4
attr PV_Anlage_1_API set2207Method PUT
attr PV_Anlage_1_API set2207Name 22_07_Battery_Type
attr PV_Anlage_1_API set2207URL http://%IP-Address_Plenticore%/api/v1/settings

###################################################################################################
## Diese Set Attribute sind neu für die "Battery:ExternControl"
## Nach dem setzen eines Wertes ist das Ergebnis mit "get 23_Battery:_ExternControl" erneut abzufragen, um die Readings zu aktualisieren.
attr PV_Anlage_1_API set2300Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl","value":"$val"}]}]
attr PV_Anlage_1_API set2300Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2300Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2300Hint 0,1
attr PV_Anlage_1_API set2300Method PUT
attr PV_Anlage_1_API set2300Name 23_00_Battery_ExternControl
attr PV_Anlage_1_API set2300URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2301Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:AcPowerAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2301Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2301Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2301Method PUT
attr PV_Anlage_1_API set2301Name 23_01_Battery_ExternControl_AcPowerAbs
attr PV_Anlage_1_API set2301URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2302Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:AcPowerRel","value":"$val"}]}]
attr PV_Anlage_1_API set2302Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2302Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2302Method PUT
attr PV_Anlage_1_API set2302Name 23_02_Battery_ExternControl_AcPowerRel
attr PV_Anlage_1_API set2302URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2303Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcCurrentAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2303Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2303Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2303Method PUT
attr PV_Anlage_1_API set2303Name 23_03_Battery_ExternControl_DcCurrentAbs
attr PV_Anlage_1_API set2303URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2304Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcCurrentRel","value":"$val"}]}]
attr PV_Anlage_1_API set2304Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2304Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2304Method PUT
attr PV_Anlage_1_API set2304Name 23_04_Battery_ExternControl_DcCurrentRel
attr PV_Anlage_1_API set2304URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2305Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcPowerAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2305Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2305Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2305Method PUT
attr PV_Anlage_1_API set2305Name 23_05_Battery_ExternControl_DcPowerAbs
attr PV_Anlage_1_API set2305URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2306Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcPowerRel","value":"$val"}]}]
attr PV_Anlage_1_API set2306Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2306Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2306Method PUT
attr PV_Anlage_1_API set2306Name 23_06_Battery_ExternControl_DcPowerRel
attr PV_Anlage_1_API set2306URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2307Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxChargePowerAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2307Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2307Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2307Method PUT
attr PV_Anlage_1_API set2307Name 23_07_Battery_ExternControl_MaxChargePowerAbs
attr PV_Anlage_1_API set2307URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2308Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxDischargePowerAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2308Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2308Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2308Method PUT
attr PV_Anlage_1_API set2308Name 23_08_Battery_ExternControl_MaxDischargePowerAbs
attr PV_Anlage_1_API set2308URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2309Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxSocRel","value":"$val"}]}]
attr PV_Anlage_1_API set2309Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2309Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2309Hint slide,30,5,100
attr PV_Anlage_1_API set2309Method PUT
attr PV_Anlage_1_API set2309Name 23_09_Battery_ExternControl_MaxSocRel
attr PV_Anlage_1_API set2309URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2310Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MinSocRel","value":"$val"}]}]
attr PV_Anlage_1_API set2310Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2310Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2310Hint slider,5,5,30
attr PV_Anlage_1_API set2310Method PUT
attr PV_Anlage_1_API set2310Name 23_10_Battery_ExternControl_MinSocRel
attr PV_Anlage_1_API set2310URL http://%IP-Address_Plenticore%/api/v1/settings


Für die unter Euch, die bereits in die Batteriesteuerung eingegriffen haben ist dann auch eine Änderung im PV_Schedule notwendig, um die Namensänderung nachzuvollziehen.
Es geht um diese Zeilen "set PV_Anlage_1_API 22_3_Battery* " , wo aus der "3" eine "03" wird.

################################################################################################################
## 6 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] <= [PV_Anlage_1_API:Battery_InternControl_MinSoc])

  (get BYD_Status BatteryInformation)
  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption [PV_Anlage_1_API:Battery_Info_WorkCapacity])
  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 2, "PV_Schedule cmd_6 : PV Überschuss wird in Batterie geladen. Keine Entladung"})

################################################################################################################
## 7 Beim erreichen von 90% Soc die Entladung wieder frei geben
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] >= 90)

  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption 50)
  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 2, "PV_Schedule cmd_7 : Batterie über 90%, Entlademodus freigegeben"})
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 12 Januar 2021, 13:22:38
Zitat von: ch.eick am 12 Januar 2021, 13:15:44
Hallo zusammen,
ich habe mir ein Herz genommen und mal wieder etwas Copy/Past gemacht. Nach einer Stunde Arbeit ist nun über das Device PV_Anlage_1_API die externe Batterie Steuerung verfügbar, bisher war nur eine Abfrage möglich.

Auch jetzt wieder besten Dank. Kurze Verständnisfrage: Muss dafür die externe Batteriesteuerung durch den Installateur freigegeben werden?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2021, 14:54:16
EDIT: Der Beitrag wurde überarbeitet.

Zitat von: Mumpitz am 12 Januar 2021, 13:22:38
Auch jetzt wieder besten Dank. Kurze Verständnisfrage: Muss dafür die externe Batteriesteuerung durch den Installateur freigegeben werden?
Das wäre noch zu testen. Ich verwende die v1.16 auf dem Plenticore.
Bei mir konnte ich "23_02_Battery_ExternControl"  setzen und es wurde nach einem Browser Refresh in der Oberfläche angezeigt.
Bitte nicht vergessen, den Wert anschließend wieder zu lesen, damit das Reading gesetzt wird.

Was ich noch vergessen hatte. Das reading von "Battery_ExternControl" ist als "Battery_Control" im Device eingetragen.
Hierbei bedeutet:

0 intern
1 extern über Digital I/O
2 extern über Protokoll (Modbus / TCP)

Wenn die externe Steuerung aktiviert ist, kann man in der Web Oberfläche auch als Anlagenbetreiber einen Timeout setzen, das ist dann eine Art Totmannschalter für die externe Steuerung.
Aktualisiert wird es mit "get 22_Battery_InternControl" und mit "get 23_Battery_ExternControl" , da es ja auch zwischen den beiden hin und her schaltet.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 12 Januar 2021, 20:03:02
Zitat von: ch.eick am 12 Januar 2021, 13:15:44

Es geht um diese Zeilen "set PV_Anlage_1_API 22_3_Battery* " , wo aus der "3" eine "03" wird.

################################################################################################################
## 6 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] <= [PV_Anlage_1_API:Battery_InternControl_MinSoc])
## and
##  [$SELF:cmd_nr] ne "6" )     ## wurde dieser Zweig bereits ausgeführt ?

  (get BYD_Status BatteryInformation)
  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption [PV_Anlage_1_API:Battery_Info_WorkCapacity])
  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 2, "PV_Schedule cmd_6 : PV Überschuss wird in Batterie geladen. Keine Entladung"})



Ich habe alle deine Änderungen bei mir aktualisiert. Eine Frage habe ich zum obigen PV_Schedule:
Du hast die Prüfung ob der gleiche Zweig schon ausgeführt wurde maskiert. Absichtlich oder ein Copy Paste Fehler? Oder anders gefragt, machst du diese Prüfung
## and
##  [$SELF:cmd_nr] ne "6" )     ## wurde dieser Zweig bereits ausgeführt ?


bei dir?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Januar 2021, 08:15:20
Zitat von: Mumpitz am 12 Januar 2021, 20:03:02
Du hast die Prüfung ob der gleiche Zweig schon ausgeführt wurde maskiert. Absichtlich oder ein Copy Paste Fehler? Oder anders gefragt, machst du diese Prüfung
Moin,
das ist ein Rest von dem Test, als der Loop mit der Batterie noch drin war. Bitte lösch die Zeile.
VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Januar 2021, 12:10:01
Hallo zusammen,
wie das so ist hat sich vor lauter Begeisterung der Fehlerteufel beim Copy/Paste eingeschlichen.

Bei diesen Attributen war bei der ID ein "_" anstelle eines ":" , ich bitte um Entschuldigung.

attr PV_Anlage_1_API set2302Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:AcPowerRel","value":"$val"}]}]
attr PV_Anlage_1_API set2303Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcCurrentAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2304Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcCurrentRel","value":"$val"}]}]
attr PV_Anlage_1_API set2305Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcPowerAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2306Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcPowerRel","value":"$val"}]}]
attr PV_Anlage_1_API set2307Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxChargePowerAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2308Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxDischargePowerAbs","value":"$val"}]}]
attr PV_Anlage_1_API set2309Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxSocRel","value":"$val"}]}]
attr PV_Anlage_1_API set2310Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MinSocRel","value":"$val"}]}]

EDIT:  Das Wiki ist auch bereits korrigiert

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Januar 2021, 13:14:33
Damit wir nicht alles doppelt machen...

Ich habe gerade mit den ersten Tests für die Begrenzung der Speicherladung begonnen.
Das Ziel ist im Frühjahr/Sommer den Speicher zu begrenzen, damit er am Morgen in der Nähe von MinSoc aus der Nacht kommt.
Dies war bei meinem Speicher im letzten Sommer nicht der Fall, wodurch er Monate lang nicht unter 40% gekommen ist.

Wenn Ihr noch Ideen für Steuerungsparameter habt, dann könnt Ihr die jetzt kund tun :-)

- ASTRO Frühlahr/Sommer
- Uhrzeit zwischen 7:00 und 20:00 Uhr (In der Nacht kommt ja eh kein PV)
- Timeout für die Externe Steuerung 180 Sekunden (default im Plenticore)

PV_Anlage_1_config zum konfigurieren von
- MaxSoc
- Schwellwert für Prognose vom nächsten Tag


Erste Testergebnisse mit Plenticore v1.16

- Battery:ExternControl lässt sich als Anlagenbetreiber über die API setzen.
- Für die Steuerung muss der Wert zwei (2 = extern über Protokoll (Modbus / TCP) ) gesetzt werden
- Die bisherige Regelung des Speichers scheint bis hierher nicht beeinflusst zu werden

- Der Wert Battery:ExternControl:MaxSocRel muss innerhalb des Timeouts immer wieder holt werden, ansonsten wird der Default 100% wieder gesetzt

- Nach dem setzen und wiederholen von MaxSocRel auf einen Wert kleiner Battery_Info_SoC wurde das Laden unterbrochen und der Überschuss ging ins Netz


Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 14 Januar 2021, 20:51:17
Zitat von: ch.eick am 14 Januar 2021, 13:14:33

Wenn Ihr noch Ideen für Steuerungsparameter habt, dann könnt Ihr die jetzt kund tun :-)

- ASTRO Frühlahr/Sommer
- Uhrzeit zwischen 7:00 und 20:00 Uhr (In der Nacht kommt ja eh kein PV)
- Timeout für die Externe Steuerung 180 Sekunden (default im Plenticore)


Ich habe mir diese Frage auch schon gestellt, siehe den entsprechenden Beitrag. Das wären genau die Punkte welche ich gerne umsetzen würden. Allerdings hat es mich ein bisschen verunsichert, dass du geschrieben hast:

Mit diesem Eingriff übernimmt man jedoch auch die Verantwortung für die Batterieladung! Vergisst man die Batterie wieder zu aktivieren kann es z.B. zu einer Tiefentladung kommen.

Kann man das irgendwie absichern das das sicher nicht passieren kann? Ich meine wir reden hier von einer Steuerung, dessen Erfolg wir allenfalls in ca. 15 Jahren zu sehen bekommen. Nur, was ist in 15 Jahren? Bis dann sieht unser BYD Speicher aus wie in etwa das erste mobile Telefon!

Daher hat für mich die erste Priorität, dass es aufgrund der Übernahme der Steuerung durch fhem nicht zu einer Tiefenentladung kommen kann (z.B. Ausfall von fhem oder ähnlich)....

Was mir allenfalls noch einfällt ist, dass wir die Steuerung nicht von den Jahreszeiten abhängig machen sollten, sondern nur von der prognostizierten PV Leistung. Wenn ich Rückblickend schaue wären im letzten Jahr noch ca. 10 Tage besser gewesen die Steuerung beim WR zu lassen als unsere aktuelle Config mit nur Laden und Entladen. Daher sollte das Flexibel sein..

Ansonsten fällt mir nicht mehr viel mehr ein!

Gruss vom tief verschneiten Bodensee
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Januar 2021, 22:32:00
Zitat von: Mumpitz am 14 Januar 2021, 20:51:17
Ich habe mir diese Frage auch schon gestellt, siehe den entsprechenden Beitrag. Das wären genau die Punkte welche ich gerne umsetzen würden. Allerdings hat es mich ein bisschen verunsichert, dass du geschrieben hast:
Mit diesem Eingriff übernimmt man jedoch auch die Verantwortung für die Batterieladung! Vergisst man die Batterie wieder zu aktivieren kann es z.B. zu einer Tiefentladung kommen.
Das hat sich darauf bezogen den Speicher im WR weg zu konfigurieren, das wird beim jetzigen Ansatz nicht gemacht!
Die Entwicklung geht selbst bei Kostal weiter :-) :-) Mit den jetzigen Möglichkeiten kann man den MaxSocRel Wert setzen und somit das Laden gezielt anhalten, Selbst wenn Fhem aussteigen sollte, setzt der WR nach 180 Sekunden einfach wieder den Maximalen Wert. Im vergleich zur ersten Idee ist somit keine Tiefentladung möglich. Die anderen Parameter habe ich bei dieser Aussage natürlich noch nicht mit berücksichtigt.

Das was wir zwei bereits machen, macht nur im Herbst/Winter Sinn und die Ladungsbegrenzung nur im Frühling/Sommer, aber das hängt alles noch zusätzlich vom eigenen Haushalt und der Speichergröße ab. Es ist also noch fine tuning notwendig und Erfahrungen sammeln. Eventuell werde ich die Jahreszeiten noch gegen exaktere Monatsangaben ersetzen, das war ja nur der erste Schuss.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 15 Januar 2021, 08:24:16
Hallo Christian

Ich habe noch einen Fehler gefunden:

attr PV_Anlage_1_API comment Version 2021.01.12 12:30\
Passworte für die Abfrage des PV_Anlage_1_API werden im storeKeyValue abgelegt:\
   {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
   {KeyValue("store","PW_PV_Anlage_1_API_user","<passwort>")}

###################################################################################################
## An dieser Stelle werden alte Attribute entfernt, die dann später mit einer zweistelligen Nummerierung neu erstellt werden.
##
deleteattr PV_Anlage_1_API set221Data
deleteattr PV_Anlage_1_API set221Header01
deleteattr PV_Anlage_1_API set221Header02
deleteattr PV_Anlage_1_API set221Hint
deleteattr PV_Anlage_1_API set221Method
deleteattr PV_Anlage_1_API set221Name
deleteattr PV_Anlage_1_API set221URL
deleteattr PV_Anlage_1_API set223Data
deleteattr PV_Anlage_1_API set223Header01
deleteattr PV_Anlage_1_API set223Header02
deleteattr PV_Anlage_1_API set223Hint
deleteattr PV_Anlage_1_API set223Method
deleteattr PV_Anlage_1_API set223Name
deleteattr PV_Anlage_1_API set223URL
deleteattr PV_Anlage_1_API set224Data
deleteattr PV_Anlage_1_API set224Header01
deleteattr PV_Anlage_1_API set224Header02
deleteattr PV_Anlage_1_API set224Hint
deleteattr PV_Anlage_1_API set224Method
deleteattr PV_Anlage_1_API set224Name
deleteattr PV_Anlage_1_API set224URL
deleteattr PV_Anlage_1_API set225Data
deleteattr PV_Anlage_1_API set225Header01
deleteattr PV_Anlage_1_API set225Header02
deleteattr PV_Anlage_1_API set225Hint
deleteattr PV_Anlage_1_API set225Method
deleteattr PV_Anlage_1_API set225Name
deleteattr PV_Anlage_1_API set225URL
deleteattr PV_Anlage_1_API set226Data
deleteattr PV_Anlage_1_API set226Header01
deleteattr PV_Anlage_1_API set226Header02
deleteattr PV_Anlage_1_API set226Hint
deleteattr PV_Anlage_1_API set226Method
deleteattr PV_Anlage_1_API set226Name
deleteattr PV_Anlage_1_API set226URL
deleteattr PV_Anlage_1_API set227Data
deleteattr PV_Anlage_1_API set227Header01
deleteattr PV_Anlage_1_API set227Header02
deleteattr PV_Anlage_1_API set227Hint
deleteattr PV_Anlage_1_API set227Method
deleteattr PV_Anlage_1_API set227Name
deleteattr PV_Anlage_1_API set227URL

###################################################################################################
##  Hier kommen die neuen Set Attribute für die zweistellige Nummerierung
##
attr PV_Anlage_1_API set2201Data [{"moduleid":"devices:local","settings":[{"id":"Battery:DynamicSoc:Enable","value":"$val"}]}]
attr PV_Anlage_1_API set2201Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2201Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2201Hint 0,1
attr PV_Anlage_1_API set2201Method PUT
attr PV_Anlage_1_API set2201Name 22_01_Battery_DynamicSoc_Enable
attr PV_Anlage_1_API set2201URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2203Data [{"moduleid":"devices:local","settings":[{"id":"Battery:MinHomeComsumption","value":"$val"}]}]
attr PV_Anlage_1_API set2203Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2203Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2203Hint slider,50,50,8000
attr PV_Anlage_1_API set2203Method PUT
attr PV_Anlage_1_API set2203Name 22_30_Battery_MinHomeConsumption
attr PV_Anlage_1_API set2203URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2204Data [{"moduleid":"devices:local","settings":[{"id":"Battery:MinSoc","value":"$val"}]}]
attr PV_Anlage_1_API set2204Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2204Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2204Hint slider,10,5,100
attr PV_Anlage_1_API set2204Method PUT
attr PV_Anlage_1_API set2204Name 22_04_Battery_MinSoc
attr PV_Anlage_1_API set2204URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2205Data [{"moduleid":"devices:local","settings":[{"id":"Battery:SmartBatteryControl:Enable","value":"$val"}]}]
attr PV_Anlage_1_API set2205Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2205Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2205Hint 0,1
attr PV_Anlage_1_API set2205Method PUT
attr PV_Anlage_1_API set2205Name 22_05_Battery_SmartBatteryControl_Enable
attr PV_Anlage_1_API set2205URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2206Data [{"moduleid":"devices:local","settings":[{"id":"Battery:Strategy","value":"$val"}]}]
attr PV_Anlage_1_API set2206Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2206Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2206Hint 1,2
attr PV_Anlage_1_API set2206Method PUT
attr PV_Anlage_1_API set2206Name 22_06_Battery_Strategy
attr PV_Anlage_1_API set2206URL http://%IP-Address_Plenticore%/api/v1/settings
attr PV_Anlage_1_API set2207Data [{"moduleid":"devices:local","settings":[{"id":"Battery:Type","value":"$val"}]}]
attr PV_Anlage_1_API set2207Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API set2207Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API set2207Hint 0,4
attr PV_Anlage_1_API set2207Method PUT
attr PV_Anlage_1_API set2207Name 22_07_Battery_Type
attr PV_Anlage_1_API set2207URL http://%IP-Address_Plenticore%/api/v1/settings



Zeile
attr PV_Anlage_1_API set2203Name 22_30_Battery_MinHomeConsumption
müsste durch
attr PV_Anlage_1_API set2203Name 22_03_Battery_MinHomeConsumption

ersetzt werden!

Gruss
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Januar 2021, 10:44:49
Zitat von: Mumpitz am 15 Januar 2021, 08:24:16
Zeile
attr PV_Anlage_1_API set2203Name 22_30_Battery_MinHomeConsumption
müsste durch
attr PV_Anlage_1_API set2203Name 22_03_Battery_MinHomeConsumption
ersetzt werden!
Danke, ist im Post und Wiki erledigt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 15 Januar 2021, 16:54:53
Moin, bin etwas spät dran und wollte das API Device auf die neueste Version umstellen.
Habe die Änderung so aus dem Wiki übernommen.
Aber ich bekomme die Meldung:
"The method is not allowed for the requested URL."
Diese Meldung wurde schonmal gemeldet und liegt wohl an HTTPMOD, ich bekomme aktuell aber immernoch die Meldung.
Ist das noch nicht behoben?
Und wenn nein, kann jeman eine alte Version anhängen mit der es klappt?
Danke und Gruss
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Januar 2021, 17:55:42
Zitat von: killah78 am 15 Januar 2021, 16:54:53
Aber ich bekomme die Meldung:
"The method is not allowed for the requested URL."
Diese Meldung wurde schonmal gemeldet und liegt wohl an HTTPMOD, ich bekomme aktuell aber immernoch die Meldung.
Ich denke Du meinst die HTTPMOD Version, da habe ich momentan folgende in Verwendung.

FVERSION 98_HTTPMOD.pm:0.233300/2020-12-12
ModuleVersion 4.0.16 - 5.12.2020

Sollte es da mit einer neueren Version Probleme geben, dann mach bitte direkt im passenden Thread einen Post auf.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 15 Januar 2021, 21:09:42
Also irgendetwas stimmt nicht mehr seit den Änderungen. Ich habe wieder regelmässig diese Meldung im Log und die Bilanz wird nicht mehr aktualisiert. Wie sieht es bei dir aus?

2021.01.15 20:57:03 2: PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung
2021.01.15 19:57:03 2: PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung
2021.01.15 08:57:03 2: PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Januar 2021, 21:23:11
Zitat von: Mumpitz am 15 Januar 2021, 21:09:42
Also irgendetwas stimmt nicht mehr seit den Änderungen. Ich habe wieder regelmässig diese Meldung im Log und die Bilanz wird nicht mehr aktualisiert. Wie sieht es bei dir aus?

2021.01.15 20:57:03 2: PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung
2021.01.15 19:57:03 2: PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung
2021.01.15 08:57:03 2: PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung

Das scheint wieder der Loop zu sein...

attr PV_Anlage_1_API event-on-change-reading Battery_.*
attr PV_Anlage_1_API event-on-update-reading auth_.*,Statistic_Autarky.*,Statistic_Energy_.*arge.*,Statistic_EnergyFeedIn.*,Statistic_EnergyHome.*, Statistic_EnergyPv[1|2].*,Statistic_.*Consumption.*,Statistic_Yield.*

Bitte check das mal. Wenn für die Battery_.* readings bei jedem update ein Evebt erzeugt wird, dann looped das DOIF, da es jedesmal den neuen Status abfragt und somiet wieder ein reading update gemacht wird.
Deshalb habe ich für die Battery_.* readings ein event-on-change-reading eingerichtet.
Im Wiki ist es bereits richtig drin.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 15 Januar 2021, 22:17:11
Zitat von: ch.eick am 15 Januar 2021, 21:23:11
Das scheint wieder der Loop zu sein...

Ja genau. Die beiden Readings sind gesetzt!
Was mich auch stark verunsichert ist der Umstand, dass ich MinSoC auf 20 gestellt habe, der Batteriestand jedoch heute über den Tag von 22% auf nun 14% abgenommen hat...
Keine Ahnung was ihn entladen hat..

Update:
Dann wäre es allerdings auch klar warum immer getriggert wird. Der MinSoC ist ja jedesmal tiefer und darum triggert er. Hmm, nur warum entlädt sich meine Batterie derart?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 15 Januar 2021, 22:28:42
Zitat von: ch.eick am 15 Januar 2021, 10:44:49
Danke, ist im Post und Wiki erledigt.

Noch was habe ich entdeckt:
Müsste
attr PV_Anlage_1_API get24Name 23_Battery_TimeControl
Nicht durch
attr PV_Anlage_1_API get24Name 24_Battery_TimeControl
ersetzt werden?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Januar 2021, 22:54:08
Zitat von: Mumpitz am 15 Januar 2021, 22:17:11
Ja genau. Die beiden Readings sind gesetzt!
Was mich auch stark verunsichert ist der Umstand, dass ich MinSoC auf 20 gestellt habe, der Batteriestand jedoch heute über den Tag von 22% auf nun 14% abgenommen hat...
Keine Ahnung was ihn entladen hat..

Update:
Dann wäre es allerdings auch klar warum immer getriggert wird. Der MinSoC ist ja jedesmal tiefer und darum triggert er. Hmm, nur warum entlädt sich meine Batterie derart?
Eventuell kannst Du hier KOSTAL - Speicherlösungen (https://www.photovoltaikforum.com/board/174-kostal-speicherl%C3%B6sungen/) mal forschen, da bin ich auch unterwegs ;-)
In einige Dinge steige ich nicht immer in voller Tiefe ein.
Es wurde ja auch im Stunden Abstand getriggert, was wirklich auf eine Entladung hindeuten würde. Das mit der Soc Bestimmung ist nicht immer so exact, wie man es sich wünschen würde, aber dazu findest Du dann auch in den anderen Forum spannende Diskussionen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Januar 2021, 22:55:40
Zitat von: Mumpitz am 15 Januar 2021, 22:28:42
attr PV_Anlage_1_API get24Name 24_Battery_TimeControl
Erledigt. Danke, das Du so exakt mit prüfst.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Januar 2021, 15:35:33
Hallo zusammen,
Stefan war mit dem HTTPMOD Modul mal wieder fleißig un bietet ab der Version 4.1.00 ein neues Attribut an, was wir hier gut gebrauchen können.
set[0-9]*FollowGet (https://forum.fhem.de/index.php/topic,45176.msg1122340.html#msg1122340) dieses Attribut ermöglicht es nach einem Set als nächstes ein Get automatisch zu starten, um das Ergebnis direkt abzuholen. Dadurch können wir dann im PV_Schedule die Aufrufe für die Aktualisierung der Readings wieder entfernen. Das macht das ganze dann wieder übersichtlicher, weil man innerhalb der HTTPMOD direkt sehen kann, wie es aktualisiert wird.

Hier schon mal die zusätzlichen Attribute.

attr PV_Anlage_1_API set2201FollowGet 22_Battery_InternControl
attr PV_Anlage_1_API set2203FollowGet 22_Battery_InternControl
attr PV_Anlage_1_API set2204FollowGet 22_Battery_InternControl
attr PV_Anlage_1_API set2205FollowGet 22_Battery_InternControl
attr PV_Anlage_1_API set2206FollowGet 22_Battery_InternControl
attr PV_Anlage_1_API set2207FollowGet 22_Battery_InternControl


attr PV_Anlage_1_API set2300FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2301FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2302FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2303FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2304FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2305FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2306FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2307FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2308FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2309FollowGet 23_Battery_ExternControl
attr PV_Anlage_1_API set2310FollowGet 23_Battery_ExternControl

Der erste Test hat bereits geklappt.
Ich werde im Wiki noch ein aktualisiertes PV_Schedule ablegen, da sich bei mir einiges geändert hat.
Dies wären die Attribute wait, webCmd, webCmdLabel und cmdState , da ich bei dieser Gelegenheit etwas mehr aufgeräumt habe. Da nicht jeder einen BYD HV Speicher hat, habe ich mein cmd_1 ganz nach hinten verschoben, wodurch dann alle weiteren nun mit euren übereinstimmen sollten. Auch die anderen Speicher cmd_* befinden sich nach den allgemein gültigen Aufrufen. Bitte vergleicht einfach Euer PV_Schedule mit dem Wiki, den es hat sich insbesondere das wait verändert, den die Aktualisierung wird nun mit dem get Aufruf direkt vom PV_Anlage_1_API (optimiert) erledigt.

@Mumpitz: Wenn Du das bereits nachvollziehen möchtest, achte bitte auch auf das PV_Schedule Device, weil Du ja auch die Batterie Steuerung mit aktiv hast.

Viele Grüße
     Christian

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 18 Januar 2021, 15:29:27
Zitat von: ch.eick am 15 Januar 2021, 17:55:42
Ich denke Du meinst die HTTPMOD Version, da habe ich momentan folgende in Verwendung.

Auch mit der von dir angehangenen HTTPMOD Version bekomme ich den Fehler.
Kannst du mal einen Blick auf mein Log werfen, ob dir da was auffällt?
Danke und Gruss
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Januar 2021, 16:46:08
Zitat von: killah78 am 18 Januar 2021, 15:29:27
Auch mit der von dir angehangenen HTTPMOD Version bekomme ich den Fehler.
Kannst du mal einen Blick auf mein Log werfen, ob dir da was auffällt?

Hier fehlt die Rückmeldung von plenticore_auth() teilweise, eventuell ist die Funktion in der 99_myUtils defekt.

2021.01.18 15:12:32.981 3: ====Start plenticore_auth==============================
2021.01.18 15:12:32.981 3: auth_step         : finish
2021.01.18 15:12:32.981 3: auth_user         : user
2021.01.18 15:12:32.981 3: auth_device       : PV_Anlage_1_API
2021.01.18 15:12:32.981 3: PV_Anlage_1_API: Replacement 04 with expression package main; {my $NAME="PV_Anlage_1_API"; plenticore_auth("finish","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"))} and regex (?^:%FINISH%) created warning: Use of uninitialized value in substitution iterator at ./FHEM/98_HTTPMOD.pm line 888.
......


Bitte führe nochmal die Tests aus dem Wiki durch

{plenticore_auth("finish","user","PV_Anlage_1_API","TESMUWZnwkJZbnpF","TE2MUWZnwkJZbnpFQ5ulCfolNNdAD0vT","DbAC0R85jwF0rh+r","29000","1376720346bea40cdf770a8f84b5975cfeb20c5e6ac6d89b7862df3ca9695e43")}

Da sollte sowas raus kommen
{"transactionId": "1376720346bea40cdf770a8f84b5975cfeb20c5e6ac6d89b7862df3ca9695e43", "proof": "5xZeOxoyR0hzPCVqvD/BPMqscQbT57wSONl049xiLjE="}


Bei einem Login sollte im Step finish dann folgendes im Log stehen

2021.01.18 16:39:03.108 3: ====Start plenticore_auth==============================
2021.01.18 16:39:03.108 3: auth_step         : finish
2021.01.18 16:39:03.108 3: auth_user         : user
2021.01.18 16:39:03.108 3: auth_device       : PV_Anlage_1_API

### Bei Dir bricht es hier bereits ab...
2021.01.18 16:39:03.383 3: auth_randomString : gshgjfhdgjhfg
2021.01.18 16:39:03.383 3: auth_nonce        : dll2OTlaVUluNFpq30LG5PMATDV5uagQ
2021.01.18 16:39:03.383 3: auth_salt         : P1ekSf2dizLjJa8V
2021.01.18 16:39:03.383 3: auth_rounds       : 29000
2021.01.18 16:39:03.383 3: auth_transactionId: 1a13d0f3579cf111abd6b8a77fb821f3d50ed6421917797414c12055afc4dfee
2021.01.18 16:39:03.383 3: ====End arguments======================================
2021.01.18 16:39:03.384 3: auth_proof        : UKmNE5KIu5PPF7OQ3ZTTYoi0RKXUbfrzdaw5SQlhuxE=
2021.01.18 16:39:03.384 3: auth_return       : {"transactionId": "1a13d0f3579cf111abd6b8a77fb821f3d50ed6421917797414c12055afc4dfee", "proof": "UKmNE5KIu5PPF7OQ3ZTTYoi0RKXUbfrzdaw5SQlhuxE="}
2021.01.18 16:39:03.384 3: ====End output=========================================


VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 18 Januar 2021, 17:37:48
Das ist verrückt. Kaum macht man es richtig, schon funktioniert es. :-D
Du hattest recht, die "use"-Zeilen hatte ich nicht übernommen in der 99_myUtils und die Funktionen waren dadurch unbekannt.
Danke für die Hilfe.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Januar 2021, 17:47:00
Zitat von: killah78 am 18 Januar 2021, 17:37:48
Das ist verrückt. Kaum macht man es richtig, schon funktioniert es. :-D
Du hattest recht, die "use"-Zeilen hatte ich nicht übernommen in der 99_myUtils und die Funktionen waren dadurch unbekannt.
Danke für die Hilfe.
Gerne, es kommt die Zeit, da läuft die Hilfe hier gegenseitig :-)
Oder es kommen Ideen, die ich noch nicht umgesetzt habe.
Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 18 Januar 2021, 20:43:11
Hallo Christian, @all,

vielleicht hast du/ihr schon gesehen dass ich ein Modul SolarForecast gebaut habe (https://forum.fhem.de/index.php/topic,102112.msg1123116.html#msg1123116) was auch eine informative Grafik (Anhang) enthält.
Es ist aus dem Projekt SMAPortal hervorgegangen und ist jetzt aber unabhängig vom Hersteller. Es sollte also auch mit einem Kostal gefüttert werden können.

Die hervorragende Arbeit in eurem Projekt hat mir viele Anregungen gegeben. Top !  :)

Interessant wäre nun im Sinne weiterer Verbesserungen inwieweit beide Lösungen annähernd gleiche Ergebnisse bei identischen Voraussetzungen bringen.
Würde mich freuen wenn du Christian oder ein anderer Interessent mein Modul mal parallel zu eurem Projekt installiert und die Ergebnisse vergleicht. Eine gewisse Einschwingzeit (1 Woche) nach der Ausführung von set <> pvCorrectionFactor_Auto on sollte man dem Modul aber erstmal gönnen.

Grüße,
Heiko
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Januar 2021, 22:09:33
Zitat von: DS_Starter am 18 Januar 2021, 20:43:11
vielleicht hast du/ihr schon gesehen dass ich ein Modul SolarForecast gebaut habe (https://forum.fhem.de/index.php/topic,102112.msg1123116.html#msg1123116) was auch eine informative Grafik (Anhang) enthält.
Es ist aus dem Projekt SMAPortal hervorgegangen und ist jetzt aber unabhängig vom Hersteller. Es sollte also auch mit einem Kostal gefüttert werden können.
Hallo Heiko,
ich werde es mir mir genauer anschauen, schön dass Du an uns gedacht hast.

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 19 Januar 2021, 09:27:35
Zitat von: DS_Starter am 18 Januar 2021, 20:43:11
vielleicht hast du/ihr schon gesehen dass ich ein Modul SolarForecast gebaut habe (https://forum.fhem.de/index.php/topic,102112.msg1123116.html#msg1123116) was auch eine informative Grafik (Anhang) enthält.
Gibt es da schon ein HowTo, wie das ganze aufgesetzt wird?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 19 Januar 2021, 10:21:08
Moin,

die Vorgehensweise habe ich unter dem Punkt Definition in der Hilfe zum Modul (help solarforecast de) beschrieben.
Außerdem werden nach der Definition des Devices im Grafikteil Hinweise gezeigt wenn etwas fehlen sollte.

Die Definition ist simpel:

   define <name> SolarForecast

Alles andere wird dann über Set-Kommandos hinterlegt. Die Grafik ist umfangreich mit Attributen konfigurierbar.
Ich habe soeben die Hilfe noch etwas überarbeitet und ins contrib geladen.

Zum Download in der FHEMWEB Kommandozeile inklusive der Ausführungszeichen angeben und danach FHEM restarten:


"wget -qO ./FHEM/76_SolarForecast.pm https://svn.fhem.de/fhem/trunk/fhem/contrib/DS_Starter/76_SolarForecast.pm"


Fragen und Hinweise zum Modul wären dann sicherlich besser in diesem (https://forum.fhem.de/index.php/topic,102112.0.html) Thread aufgehoben damit das Thema hier nicht dadurch gestört wird.

LG,
Heiko
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 20 Januar 2021, 21:59:47
Zitat von: plin am 11 Januar 2021, 09:58:00
Kennt sich jemand mit KI aus? Wenn man auf Basis der eigenen Aufzeichnungen (Forecast Rad1h, Sonne, Bedeckung, ... , Ist-Werte) die KI die Abhängigkeiten und Faktoren ermitteln lässt wäre das die Gold-Lösung.

Ich habe mich etwas schlau gemacht und gebastelt.  Aktuell lasse ich die DWD-Forcast-Werte 'Rad1h','Neff','R600','Azimuth','Altitude','SunD1','VV' sowie den Durchschnitt der erzeugten Leistung in das Modell einfließen.

In den Grafiken seht Ihr
- die erzeugte Leistung (Total_AC_active_power mit hoher zeitlcher Auflösung, gelbe Linie)
- den Mittelwert der verstrichenen Stunde dieser Leistung (yield, orangefarbene Linie)
- die Vorhersage des Modells (Forecast, Stundenbasis, blaue Linie)

Jetzt heißt es abwarten, denn meine Anlage ist erste Ende Oktober live gegangen und ich habe ca. 1.700 Datensätze als Basis für die Analyse. Aktuell kann die PV-Erzeung bei schlechtem Wetter schon recht gut vorhergesagt werden. Sommer muss noch trainiert werden  :).
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Januar 2021, 09:42:12
Zitat von: plin am 20 Januar 2021, 21:59:47
Ich habe mich etwas schlau gemacht und gebastelt.  Aktuell lasse ich die DWD-Forcast-Werte 'Rad1h','Neff','R600','Azimuth','Altitude','SunD1','VV' sowie den Durchschnitt der erzeugten Leistung in das Modell einfließen.

In den Grafiken seht Ihr
- die erzeugte Leistung (Total_AC_active_power mit hoher zeitlcher Auflösung, gelbe Linie)
- den Mittelwert der verstrichenen Stunde dieser Leistung (yield, orangefarbene Linie)
- die Vorhersage des Modells (Forecast, Stundenbasis, blaue Linie)

Jetzt heißt es abwarten, denn meine Anlage ist erste Ende Oktober live gegangen und ich habe ca. 1.700 Datensätze als Basis für die Analyse. Aktuell kann die PV-Erzeung bei schlechtem Wetter schon recht gut vorhergesagt werden. Sommer muss noch trainiert werden  :).
Super, ich denke das wäre eine Bereicherung für Heiko, der in dem anderen Thread an einem DWD_Forecast Modul arbeitet.
Magst Du diesen Beitrag dort nochmal rein stellen, ich bin dort auch schon aktiv.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 22 Januar 2021, 13:06:26
Zitat von: ch.eick am 01 Januar 2021, 14:32:12
EDIT 15:43: Ich habe den Eintrag nochmals überarbeitet. Bei Bedarf bitte nochmals lesen.

Hallo Mumpitz,

ich hatte nun auch den Loop im PV_Schedule

2021.01.01 10:59:16.089 2: PV Überschuss wird in Batterie geladen. Keine Entladung
2021.01.01 10:59:22.835 2: PV Überschuss wird in Batterie geladen. Keine Entladung
...

Das hat folgende Bewandtnis:

Das entsprechende DOELSEIF reagiert auf den Trigger [PV_Anlage_1_API:Battery_InternControl_MinSoc]
dann erfolgt ein "get PV_Anlage_1_API 22_Battery_InternControl" , was wiederum den Status abfragt und wieder einen event-on-update erzeugt.


Um das nun abzustellen wäre eine Änderung der Events im PV_Anlage_1_API ,notwendig, was ich bereits getestet habe.

attr PV_Anlage_1_API event-on-change-reading Battery_.*
attr PV_Anlage_1_API event-on-update-reading auth_.*,Statistic_Autarky.*,Statistic_Energy_.*arge.*,Statistic_EnergyFeedIn.*,Statistic_EnergyHome.*, Statistic_EnergyPv[1|2].*,Statistic_.*Consumption.*,Statistic_Yield.*


Weiterhin habe ich auch die Logmeldung im PV_Schedule etwas verändert, damit man sieht aus welchem Device die Meldung kommt.

snip...
################################################################################################################
## 6 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] <= [PV_Anlage_1_API:Battery_InternControl_MinSoc])
  (get BYD_Status BatteryInformation)
  (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption [PV_Anlage_1_API:Battery_Info_WorkCapacity])
  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 2, "PV_Schedule cmd_6 : PV Überschuss wird in Batterie geladen. Keine Entladung"})

################################################################################################################
## 7 Beim erreichen von 90% Soc die Entladung wieder frei geben
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] >= 90)

  (set PV_Anlage_1_API 22_3_Battery_MinHomeConsumption 50)
  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 2, "PV_Schedule cmd_7 : Batterie über 90%, Entlademodus freigegeben"})


VG
   Christian

Nun ist endlich mal wieder der Fall eingetroffen, dass die Batterie über 90% gekommen ist und den Entlademodus freigegeben hat. Leider komme ich dadurch wieder in den Loop und die Bilanz wird nicht mehr aktualisiert:


2021.01.22 12:57:03 2: PV_Schedule cmd_6 : Batterie über 90%, Entlademodus freigegeben
2021.01.22 11:57:03 2: PV_Schedule cmd_6 : Batterie über 90%, Entlademodus freigegeben


Hast du eine Idee wie wir diesen rausbringen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 Januar 2021, 16:59:05
Zitat von: Mumpitz am 22 Januar 2021, 13:06:26
Nun ist endlich mal wieder der Fall eingetroffen, dass die Batterie über 90% gekommen ist und den Entlademodus freigegeben hat. Leider komme ich dadurch wieder in den Loop und die Bilanz wird nicht mehr aktualisiert:

2021.01.22 12:57:03 2: PV_Schedule cmd_6 : Batterie über 90%, Entlademodus freigegeben
2021.01.22 11:57:03 2: PV_Schedule cmd_6 : Batterie über 90%, Entlademodus freigegeben

Hast du eine Idee wie wir diesen rausbringen?

Ich hatte hier schon fast alles fertig geschrieben und dann ist es mir aufgefallen :-)

Der DOELSEIF Pfad von cmd_5 und cmd_6 wird genau von zwei Events ausgelöst, die aus dem PV_Anlage_1_API Device kommen
- Battery_Info_SoC
- Battery_InternControl_MinSoc

Diese sollten im PV_Anlage_1_API wie folgt gesetzt sein
- event-on-change-reading Battery_.*
- Achtung, vorher war das mal bei event-on-update-reading eingetragen, da muss Battery_.* raus

Die Ursache sehe ich jedoch einfach darin, dass der Plenticore ja noch weiter Läd, als nur bis Soc 90 und somit natürlich noch mehr Events kommen.
Auch beim Entladen stoppt er ja auch nicht sofort und der Eigenverbrauch in der Nacht geht ja auch aus der Batterie.

Versuche es einfach mal mit den zwei zusätzlichen and Statements, die stellen einfach Fest, ob Battery_MinHomeConsumption bereits gesetzt wurde oder noch nicht.
Das sollte so klappen.

Ich hatte bereits bei mir die cmd_* Reihenfolge angepasst, so dass es jetzt mit Deiner Reihenfolge übereinstimmen sollte.
Ich verwende bereits im PV_Anlage_1_API Device die HTTPMOD Version 4.0.17, diese bietet das Attribut "set2204FollowGet 22_Battery_InternControl" , was nach dem set Aufruf als nächstes direkt ein get ermöglicht.
Das hatte ich im Forum bereits geschrieben. Deshalb steht im PV_Schedule das get bereits auf Kommentar.

################################################################################################################
## 5 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] <= [PV_Anlage_1_API:Battery_InternControl_MinSoc] and
  [PV_Anlage_1_API:Battery_MinHomeConsumption] <= 100 )

  (get BYD_Status BatteryInformation)
  ({Log 3, "PV_Schedule cmd_6 : PV Überschuss wird in Batterie geladen. Keine Entladung"})
  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption [PV_Anlage_1_API:Battery_Info_WorkCapacity])

##  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 3, "PV_Schedule cmd_6 : PV Überschuss wird in Batterie geladen. Keine Entladung"})

################################################################################################################
## 6 Beim erreichen von 90% Soc die Entladung wieder frei geben
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] >= 90 AND
  [PV_Anlage_1_API:Battery_MinHomeConsumption] > 100)

  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption 50)
  ({Log 3, "PV_Schedule cmd_7 : Batterie über 90%, Entlademodus freigegeben"})

##  (get PV_Anlage_1_API 22_Battery_InternControl, {Log 3, "PV_Schedule cmd_7 : Batterie über 90%, Entlademodus freigegeben"})



VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Januar 2021, 13:26:08
@Mumpitz
Beim PV_Schedule war der Fehlerteufel da das "> 100" muss ein "gt 100" sein, sorry.

################################################################################################################
## 6 Beim erreichen von 90% Soc die Entladung wieder frei geben
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] >= 90 and
  [PV_Anlage_1_API:Battery_MinHomeConsumption] gt 100 )

  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption 50)
  ({Log 3, "PV_Schedule cmd_7 : Batterie über 90%, Entlademodus freigegeben"})
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 25 Januar 2021, 16:55:46
Zitat von: ch.eick am 25 Januar 2021, 13:26:08
@Mumpitz
Beim PV_Schedule war der Fehlerteufel da das "> 100" muss ein "gt 100" sein, sorry.

################################################################################################################
## 6 Beim erreichen von 90% Soc die Entladung wieder frei geben
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] >= 90 and
  [PV_Anlage_1_API:Battery_MinHomeConsumption] gt 100 )

  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption 50)
  ({Log 3, "PV_Schedule cmd_7 : Batterie über 90%, Entlademodus freigegeben"})


Bist du sicher? Aus meiner bescheidenen Sicht stimmt das >. Es haben sich eher folgende Fehler eingeschlichen:

bei cmd_5:
{Log 2, "PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung"}



bei cmd_6:
{Log 2, "PV_Schedule cmd_6 : PV Überschuss wird in Batterie geladen. Keine Entladung"}


Sowie bei beiden heisst das Reading nicht mehr Battery_MinHomeConsumption sondern Battery_InternControl_MinHomeConsumption

stimmts?
Gruess
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Januar 2021, 18:23:47
Zitat von: Mumpitz am 25 Januar 2021, 16:55:46
Bist du sicher? Aus meiner bescheidenen Sicht stimmt das >. Es haben sich eher folgende Fehler eingeschlichen:

bei cmd_5:
{Log 2, "PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung"}
bei cmd_6:
{Log 2, "PV_Schedule cmd_6 : PV Überschuss wird in Batterie geladen. Keine Entladung"}
Sowie bei beiden heisst das Reading nicht mehr Battery_MinHomeConsumption sondern Battery_InternControl_MinHomeConsumption

Hey, Du bist echt gut.
Dann habe ich es jetzt so verschlimmbessert :-)

################################################################################################################
## 5 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] <= [PV_Anlage_1_API:Battery_InternControl_MinSoc] and
  [PV_Anlage_1_API:Battery_InternControl_MinHomeConsumption] <= 100 )

  (get BYD_Status BatteryInformation)
  ({Log 3, "PV_Schedule cmd_5 : PV Überschuss wird in Batterie geladen. Keine Entladung"})
  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption [PV_Anlage_1_API:Battery_Info_WorkCapacity])

################################################################################################################
## 6 Beim erreichen von 90% Soc die Entladung wieder frei geben
##
DOELSEIF
(([Astro:ObsSeason] eq "Herbst" or [Astro:ObsSeason] eq "Winter") and
  [PV_Anlage_1_API:Battery_Info_SoC] >= 90 and
  [PV_Anlage_1_API:Battery_InternControl_MinHomeConsumption] > 100 )

  (set PV_Anlage_1_API 22_03_Battery_MinHomeConsumption 50)
  ({Log 3, "PV_Schedule cmd_6 : Batterie über 90%, Entlademodus freigegeben"})

################################################################################################################
## 7 Test zur Begrenzung des MaxSoc
##
DOELSEIF
(([Astro:ObsSeason] eq "Frühjahr" or [Astro:ObsSeason] eq "Sommer") and
[07:00-20:00|1234] and [+180] )
 
  (set PV_Anlage_1_API 23_09_Battery_ExternControl_MaxSocRel 90)
  ({Log 3, "PV_Schedule cmd_7 : Batterie MaxSoc halten"})


unter cmd_7 findest Du zur Entschädigung schon mal die nächste Idee.
Von 7-20 Uhr wird alle 180 Minuten der Ladezustand der Batterie auf Soc 90 begrenzt, damit sie nicht permanent auf Soc 100 geladen wird.
Bei mir komme ich im Sommer noch mit 40% aus der Nacht und denke so, dass ich dann zwischen 30 und 90 pendle.
Das gilt dann für Montags bis Donnerstags und am Wochenende kann man es dann mal richtig krachen lassen :-)

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 25 Januar 2021, 20:30:56
Zitat von: ch.eick am 25 Januar 2021, 18:23:47



################################################################################################################
## 7 Test zur Begrenzung des MaxSoc
##
DOELSEIF
(([Astro:ObsSeason] eq "Frühjahr" or [Astro:ObsSeason] eq "Sommer") and
[07:00-20:00|1234] and [+180] )
 
  (set PV_Anlage_1_API 23_09_Battery_ExternControl_MaxSocRel 90)
  ({Log 3, "PV_Schedule cmd_7 : Batterie MaxSoc halten"})


unter cmd_7 findest Du zur Entschädigung schon mal die nächste Idee.
Von 7-20 Uhr wird alle 180 Minuten der Ladezustand der Batterie auf Soc 90 begrenzt, damit sie nicht permanent auf Soc 100 geladen wird.
Bei mir komme ich im Sommer noch mit 40% aus der Nacht und denke so, dass ich dann zwischen 30 und 90 pendle.
Das gilt dann für Montags bis Donnerstags und am Wochenende kann man es dann mal richtig krachen lassen :-)

Gruß
    Christian

Herrlich, genau wegen solchen Ideen bin ich hier aktiv!
Nun, denken wir mal etwas weiter. Meiner Meinung nach wäre hier zb auch die richtige Stelle, den Forecast einzubauen. Denn auch im Sommer, wenn er schlechtes Wetter hat am nächsten Tag, ist irgendwann Ende Feuer der Batterie. Da reuen mich dann die 10%, bei mir 1kWh. Daher schlage ich vor, dieses cmd_7 nur zu triggern, wenn der Forecast am nächsten Tag mehr als 15 kWh oder bis 12 Uhr 8 kWh prognostiziert. Die Werte müsste man dann noch einstellen könne, z.B. in der config.

Weiter würde ich vorschlagen, das PV_Schedule DOIF auseinanderzunehmen und die Batteriesteuerung in ein eigenes DOIF zu übernehmen. Denke es wäre übersichtlicher!

Nächste Idee was mir schon länger im Kopf herum geistert. Du hast bei dir die Begrenzung am Wochenende ausser Kraft gesetzt. Ich finde das etwas undynamisch. Es wäre doch viel besser, Wochentagsprofile zu erstellen, nicht?

Bei mir zu Hause z.b ist die ganze Familie an einzelnen Wochentagen grösstenteils abwesend. An meistens den gleichen Tagen wird gewaschen. Dies könnte man doch ebenfalls berücksichtigen mit der Lademenge...

Zum anfangen würde ich gerne mal erheben, welchen Gesamtenergie Verbrauch ich pro Wochentag hatte? Hast du als SQL Freak hier einen Ansatz?

Falls nein, würde ich mal mit einem Dummy und einem DOIF beginnen, welches mir jeden Abend in ein Reading im Wochentagsdummy den Wert um 23:59 schreibt und addiert.

Ich bin gespannt auf deine Meinung!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Januar 2021, 22:11:56
Hi,
ich schau mal was mir dazu morgen so alles einfällt.
Leider geht es hier beim Nonintrusive Load Monitoring (NILM) (https://forum.fhem.de/index.php/topic,115648.msg1099193.html#msg1099193) nicht so richtig weiter, bzw los. Es ist halt mega komplex.

cmd_7 war ja nur ein Test für die Externe Batterie Kontrolle, wie es überhaupt geht, da arbeite ich ja gerade dran, wenn es bei der Leistungsprognose stockt ;-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Januar 2021, 12:28:29
Zitat von: Mumpitz am 25 Januar 2021, 20:30:56
Nun, denken wir mal etwas weiter.
Meiner Meinung nach wäre hier zb auch die richtige Stelle, den Forecast einzubauen. Denn auch im Sommer, wenn er schlechtes Wetter hat am nächsten Tag, ist irgendwann Ende Feuer der Batterie.
Da reuen mich dann die 10%, bei mir 1kWh.
Das sehe ich auch so
Zitat
Weiter würde ich vorschlagen, das PV_Schedule DOIF auseinanderzunehmen und die Batteriesteuerung in ein eigenes DOIF zu übernehmen. Denke es wäre übersichtlicher!
Da habe ich Dir den ersten Entwurf zugesendet. Das ist also so gut wie erledigt.

Zitat
Nächste Idee was mir schon länger im Kopf herum geistert. Du hast bei dir die Begrenzung am Wochenende ausser Kraft gesetzt. Ich finde das etwas undynamisch.
Es wäre doch viel besser, Wochentagsprofile zu erstellen, nicht?
Daher schlage ich vor, dieses cmd_7 nur zu triggern, wenn der Forecast am nächsten Tag mehr als 15 kWh oder bis 12 Uhr 8 kWh prognostiziert.
Die Werte müsste man dann noch einstellen könne, z.B. in der config.
In die _config werde ich dann Prozent Werte einarbeiten, die dann die Limitierung im Verhältnis zur Speichergröße darstellen. Das passt eventuell besser zum Haushaltsverbrauch, da der je die Grundlage der Speichergöße sein sollte.

Zitat
Bei mir zu Hause z.b ist die ganze Familie an einzelnen Wochentagen grösstenteils abwesend. An meistens den gleichen Tagen wird gewaschen. Dies könnte man doch ebenfalls berücksichtigen mit der Lademenge...
Das wären dann Lademengen, anhand von Verbrauchsstatistiken plus einen Sicherheitszuschlag, wenn man es Tageunabhängig betrachtet.

Zitat
Zum Anfangen würde ich gerne mal erheben, welchen Gesamtenergie Verbrauch ich pro Wochentag hatte? Hast du als SQL Freak hier einen Ansatz?
Falls nein, würde ich mal mit einem Dummy und einem DOIF beginnen, welches mir jeden Abend in ein Reading im Wochentagsdummy den Wert um 23:59 schreibt und addiert.
Natürlich holen wir das aus der Datenbank :-) Bitte keine separaten Statistiken über DUMMYs anfertigen, das macht keinen Sinn.
Wiederkehrende Reports kann man dann als DbRep einbauen.

Ich vermute, Du hast keinen EVU Zähler, den Du abliest, dann wäre das eine DB Abfrage des readings Statistic_EnergyHome_Day im Device PV_Anlage_1_API als maxValue .
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Januar 2021, 13:56:21
Zitat
Zitat
Nächste Idee was mir schon länger im Kopf herum geistert. Du hast bei dir die Begrenzung am Wochenende ausser Kraft gesetzt. Ich finde das etwas undynamisch.
Es wäre doch viel besser, Wochentagsprofile zu erstellen, nicht?
Daher schlage ich vor, dieses cmd_7 nur zu triggern, wenn der Forecast am nächsten Tag mehr als 15 kWh oder bis 12 Uhr 8 kWh prognostiziert.
Die Werte müsste man dann noch einstellen könne, z.B. in der config.
In die _config werde ich dann Prozent Werte einarbeiten, die dann die Limitierung im Verhältnis zur Speichergröße darstellen.
Das passt eventuell besser zum Haushaltsverbrauch, da der je die Grundlage der Speichergöße sein sollte.

Ich habe da mal folgende Werte aus den Devices zusammen gesucht:

Inverter_Max_Power 6999   aus dem WR Device die 70% Grenze in Deutschland, für andere Länder wird da 100%
Power_class 10            Das ist ein Plenticore 10 mit 10kWp Leistung ==> 10000 Wp * 70% => 7000 Wp

(round(Inverter_Max_Power / 1000 , 0)) * 100 / Power_class = > 70
    70 wäre dann Deutschland
  100 für Länder ohne 70 % Regelung

Für Deutschland müsste man die Spitze über 70 % zum Laden des Speichers treffen, was im Plenticore als "inteligente Batteriesteuerung" bezeichnet wird.
Der Netzbetreiber freut sich natürlich auch, wenn man die PV Spitze im Haus zurück behält, das wird in den nächsten Jahren noch ein größeres Problem werden.

=================================================================
Battery_Info_WorkCapacity 9252   aus dem API Device
Durchschnittlicher Hausverbrauch in der Nacht von 20:00 - 08:00 Uhr = 12h * 500 Watt = > 6 kWh
Bei mir 60% von 9252 also rund 5,5 kWh , was ich letzten Sommer beobachtet hatte.

Nun sollte es dann in der PV_Anlage_1_Speicher_1_ExternControl readings geben, die mit dem Verbrauch auf Tagesbasis des jeweiligen Haushaltes gefüllt werden.
z.B.
Home_own_consumption_from_battery_plan_[0-9]      [0-9] entspricht der DOIF commandref
Home_own_consumption_from_battery_plan_start      ist die Startzeit HH:mm
Home_own_consumption_from_battery_plan_end       ist die end Zeit HH:mm
Ich denke eine start/end Zeit pro Tag wäre etwas drüber :-)

=================================================================
Das wären dann die Prognosezeiten, bzw. die Werte pro Stunde, wenn man noch detaillierter entscheiden mag
Solar_Calculation_fc0_4h 2381
Solar_Calculation_fc0_day 4401
Solar_Calculation_fc0_rest 2381

Solar_Calculation_fc1_day 3195


Das wären dann mal meine ersten Gedanken, wobei ich das Tarifmodel der Schweiz mit teurem Strom am Morgen und am Abend nicht mit drin hätte :-) Bitte schick mir das doch auch nochmal.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 27 Januar 2021, 08:32:30
Zitat von: ch.eick am 26 Januar 2021, 13:56:21

Das wären dann mal meine ersten Gedanken, wobei ich das Tarifmodel der Schweiz mit teurem Strom am Morgen und am Abend nicht mit drin hätte :-) Bitte schick mir das doch auch nochmal.

VG
   Christian

Also die Schweiz, zumindest in den Gemeinde in welchen ich wohnhaft war, kennt einen Normaltarif (T1) und einen Niedertarif (T2). Dieser setzt sich wie folgt zusammen:

Montag - Freitag: 07:00 - 19:00 durchgehend T1, Rest T2
Samstag & Sonntag: durchgehend T2

Der Preisunterschied beträgt dabei ca. 4 Rappen per kWh
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 Januar 2021, 17:12:50
Zitat von: Mumpitz am 25 Januar 2021, 20:30:56
Bei mir zu Hause z.b ist die ganze Familie an einzelnen Wochentagen grösstenteils abwesend. An meistens den gleichen Tagen wird gewaschen. Dies könnte man doch ebenfalls berücksichtigen mit der Lademenge...

Zum anfangen würde ich gerne mal erheben, welchen Gesamtenergie Verbrauch ich pro Wochentag hatte? Hast du als SQL Freak hier einen Ansatz?
Hallo Mumpitz,
ich fühlte mich da noch einer Antwort schuldig.

Letztes Jahr hatte ich da mal ein SQL geliefert, dass als sqlSpecial in DbRep eingegangen ist.
Die PV_Anlage_1_API readings werden ja regelmäßig in die DbLog geschrieben und Statistic_EnergyHome_Day wächst über den Tag an.

Mit diesem DbRep Device bekommst Du dann nun den Zähler und in einer weiteren Spalte noch die Differenzen berechnet :-)
Die letzte Spalte gibt dann noch die Zeitdifferenz in Minuten an,  weil es nicht immer regelmäßig ist.

Das reading kannst Du ja auf den gewünschten Zählerwert *[Bat|Grid|Pv|PvSum] setzen.

set LogDBRep_select_Tagesverbrauch  sqlSpecial ReadingsDifferenceByTimeDelta

defmod LogDBRep_select_Tagesverbrauch DbRep LogDB
attr LogDBRep_select_Tagesverbrauch DbLogExclude .*
attr LogDBRep_select_Tagesverbrauch device PV_Anlage_1_API
attr LogDBRep_select_Tagesverbrauch reading Statistic_EnergyHome_Day
attr LogDBRep_select_Tagesverbrauch room System
attr LogDBRep_select_Tagesverbrauch timestamp_begin previous_week_begin
attr LogDBRep_select_Tagesverbrauch timestamp_end previous_week_end


Mit aggregation und maxValue bekommst Du dann z.B. auch die Tageswerte.

set LogDBRep_select_Tagesverbrauch  maxValue display

defmod LogDBRep_select_Tagesverbrauch DbRep LogDB
attr LogDBRep_select_Tagesverbrauch DbLogExclude .*
attr LogDBRep_select_Tagesverbrauch aggregation day
attr LogDBRep_select_Tagesverbrauch device PV_Anlage_1_API
attr LogDBRep_select_Tagesverbrauch reading Statistic_EnergyHome_Day
attr LogDBRep_select_Tagesverbrauch room System
attr LogDBRep_select_Tagesverbrauch timestamp_begin previous_week_begin
attr LogDBRep_select_Tagesverbrauch timestamp_end previous_week_end


Die zugrundeliegenden SQLs lassen sich natürlich auch, mit kleiner Anpassung, in Grafana anwenden ;-)

Viele Grüße
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 29 Januar 2021, 22:46:08
Zitat von: ch.eick am 29 Januar 2021, 17:12:50
Hallo Mumpitz,
ich fühlte mich da noch einer Antwort schuldig.

Letztes Jahr hatte ich da mal ein SQL geliefert, dass als sqlSpecial in DbRep eingegangen ist.
Die PV_Anlage_1_API readings werden ja regelmäßig in die DbLog geschrieben und Statistic_EnergyHome_Day wächst über den Tag an.

Mit diesem DbRep Device bekommst Du dann nun den Zähler und in einer weiteren Spalte noch die Differenzen berechnet :-)
Die letzte Spalte gibt dann noch die Zeitdifferenz in Minuten an,  weil es nicht immer regelmäßig ist.

Das reading kannst Du ja auf den gewünschten Zählerwert *[Bat|Grid|Pv|PvSum] setzen.

set LogDBRep_select_Tagesverbrauch  sqlSpecial ReadingsDifferenceByTimeDelta

defmod LogDBRep_select_Tagesverbrauch DbRep LogDB
attr LogDBRep_select_Tagesverbrauch DbLogExclude .*
attr LogDBRep_select_Tagesverbrauch device PV_Anlage_1_API
attr LogDBRep_select_Tagesverbrauch reading Statistic_EnergyHome_Day
attr LogDBRep_select_Tagesverbrauch room System
attr LogDBRep_select_Tagesverbrauch timestamp_begin previous_week_begin
attr LogDBRep_select_Tagesverbrauch timestamp_end previous_week_end


Mit aggregation und maxValue bekommst Du dann z.B. auch die Tageswerte.

set LogDBRep_select_Tagesverbrauch  maxValue display

defmod LogDBRep_select_Tagesverbrauch DbRep LogDB
attr LogDBRep_select_Tagesverbrauch DbLogExclude .*
attr LogDBRep_select_Tagesverbrauch aggregation day
attr LogDBRep_select_Tagesverbrauch device PV_Anlage_1_API
attr LogDBRep_select_Tagesverbrauch reading Statistic_EnergyHome_Day
attr LogDBRep_select_Tagesverbrauch room System
attr LogDBRep_select_Tagesverbrauch timestamp_begin previous_week_begin
attr LogDBRep_select_Tagesverbrauch timestamp_end previous_week_end


Die zugrundeliegenden SQLs lassen sich natürlich auch, mit kleiner Anpassung, in Grafana anwenden ;-)

Viele Grüße
    Christian

Ich habe bei mir ja bereits die täglichen Werte über einen Monat aus mit einem Chart visualisiert. Was ich bei meinem Post angesprochen habe ist, dass ich gerne auswerten würde, welchen Verbrauch ich an allen Montagen, allen Dienstagen, allen Mittwochen und so weiter hatte. Mit Hilfe dieser Erkenntnis könnte man auch die nötige Ladung der Batterie berechnen.

Mit deinem DbRep Device bekomme ich einfach die täglichen Werte. Weisst Du was ich meine?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Januar 2021, 10:34:19
Zitat von: Mumpitz am 29 Januar 2021, 22:46:08
Ich habe bei mir ja bereits die täglichen Werte über einen Monat aus mit einem Chart visualisiert. Was ich bei meinem Post angesprochen habe ist, dass ich gerne auswerten würde, welchen Verbrauch ich an allen Montagen, allen Dienstagen, allen Mittwochen und so weiter hatte. Mit Hilfe dieser Erkenntnis könnte man auch die nötige Ladung der Batterie berechnen.

Mit deinem DbRep Device bekomme ich einfach die täglichen Werte. Weisst Du was ich meine?
Moin,
dann sag das doch :-) :-) , das geht natürlich auch.

Hier mal ein SQL für einen Monat, mit dem Durchschnitt pro Wochentag (0 = So)

MySQL [fhem]>
SELECT
       READING,
       cast(avg(VALUE) AS DECIMAL(6,2)) AS AVG,
       WEEKDAY
  FROM
    (
     SELECT DATE_FORMAT(TIMESTAMP, '%Y-%m-%d') AS DATE,
            READING,max(VALUE)                 AS VALUE,
            weekday(TIMESTAMP)                 AS WEEKDAY
     FROM history
     WHERE DEVICE    = 'PV_Anlage_1_API'
       AND READING   = 'Statistic_EnergyHome_Day'
       AND TIMESTAMP > '2021-01-01 00:00:00'
       AND TIMESTAMP < '2021-02-01 00:00:00'
     GROUP BY DATE
    ) t1
  GROUP BY WEEKDAY;
+--------------------------+---------+---------+
| READING                  | AVG     | WEEKDAY |
+--------------------------+---------+---------+
| Statistic_EnergyHome_Day | 6108.50 |       0 |
| Statistic_EnergyHome_Day | 7115.97 |       1 |
| Statistic_EnergyHome_Day | 8058.25 |       2 |
| Statistic_EnergyHome_Day | 4665.92 |       3 |
| Statistic_EnergyHome_Day | 8954.76 |       4 |
| Statistic_EnergyHome_Day | 7835.43 |       5 |
| Statistic_EnergyHome_Day | 6654.06 |       6 |
+--------------------------+---------+---------+


Oder halt alle Tageswerte sortiert nach Wochentagen

MySQL [fhem]>
SELECT DATE,
       READING,
       VALUE,
       WEEKDAY
  FROM
    (
     SELECT DATE_FORMAT(TIMESTAMP, '%Y-%m-%d') AS DATE,
            READING,max(VALUE)                 AS VALUE,
            weekday(TIMESTAMP)                 AS WEEKDAY
     FROM history
     WHERE DEVICE    = 'PV_Anlage_1_API'
       AND READING   = 'Statistic_EnergyHome_Day'
       AND TIMESTAMP > '2021-01-01 00:00:00'
       AND TIMESTAMP < '2021-02-01 00:00:00'
     GROUP BY DATE
    ) t1
  ORDER BY WEEKDAY;
+------------+--------------------------+---------+---------+
| DATE       | READING                  | VALUE   | WEEKDAY |
+------------+--------------------------+---------+---------+
| 2021-01-04 | Statistic_EnergyHome_Day | 9916.82 |       0 |
| 2021-01-18 | Statistic_EnergyHome_Day | 5325.27 |       0 |
| 2021-01-11 | Statistic_EnergyHome_Day | 958.09  |       0 |
| 2021-01-25 | Statistic_EnergyHome_Day | 8233.81 |       0 |
| 2021-01-05 | Statistic_EnergyHome_Day | 958.07  |       1 |
| 2021-01-19 | Statistic_EnergyHome_Day | 9985.62 |       1 |
| 2021-01-12 | Statistic_EnergyHome_Day | 8113.84 |       1 |
| 2021-01-26 | Statistic_EnergyHome_Day | 9406.36 |       1 |
| 2021-01-20 | Statistic_EnergyHome_Day | 7488.43 |       2 |
| 2021-01-13 | Statistic_EnergyHome_Day | 7071.45 |       2 |
| 2021-01-27 | Statistic_EnergyHome_Day | 7723.69 |       2 |
| 2021-01-06 | Statistic_EnergyHome_Day | 9949.42 |       2 |
| 2021-01-21 | Statistic_EnergyHome_Day | 893.56  |       3 |
| 2021-01-14 | Statistic_EnergyHome_Day | 984.37  |       3 |
| 2021-01-28 | Statistic_EnergyHome_Day | 9932.60 |       3 |
| 2021-01-07 | Statistic_EnergyHome_Day | 6853.16 |       3 |
| 2021-01-01 | Statistic_EnergyHome_Day | 9533.68 |       4 |
| 2021-01-15 | Statistic_EnergyHome_Day | 8134.20 |       4 |
| 2021-01-29 | Statistic_EnergyHome_Day | 8335.38 |       4 |
| 2021-01-08 | Statistic_EnergyHome_Day | 9116.93 |       4 |
| 2021-01-22 | Statistic_EnergyHome_Day | 9653.61 |       4 |
| 2021-01-02 | Statistic_EnergyHome_Day | 9987.33 |       5 |
| 2021-01-16 | Statistic_EnergyHome_Day | 5114.72 |       5 |
| 2021-01-30 | Statistic_EnergyHome_Day | 6828.49 |       5 |
| 2021-01-09 | Statistic_EnergyHome_Day | 7374.64 |       5 |
| 2021-01-23 | Statistic_EnergyHome_Day | 9871.96 |       5 |
| 2021-01-03 | Statistic_EnergyHome_Day | 990.86  |       6 |
| 2021-01-17 | Statistic_EnergyHome_Day | 8195.89 |       6 |
| 2021-01-10 | Statistic_EnergyHome_Day | 8728.49 |       6 |
| 2021-01-24 | Statistic_EnergyHome_Day | 8701.01 |       6 |
+------------+--------------------------+---------+---------+


Wenn Du das eingebaut haben möchtest, dann müssten wir nochmal überlegen, wie und wo das rein passt.
Ein DbRep mit eigener SQL wäre das einfachste.

Viele Grüße
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 30 Januar 2021, 13:57:33
Zitat von: ch.eick am 30 Januar 2021, 10:34:19
Moin,
dann sag das doch :-) :-) , das geht natürlich auch.


Gratuliere, echt kompliment wie schnell du das jeweils hinkriegst....

Hier mal meine Werte des Durchschnittlichen Totalverbrauchs im Januar:

"2021-01-04" "Statistic_TotalConsumption_Day" "46426.59" "0"
"2021-01-05" "Statistic_TotalConsumption_Day" "42894.41" "1"
"2021-01-06" "Statistic_TotalConsumption_Day" "41022.96" "2"
"2021-01-07" "Statistic_TotalConsumption_Day" "41720.25" "3"
"2021-01-01" "Statistic_TotalConsumption_Day" "43064.02" "4"
"2021-01-02" "Statistic_TotalConsumption_Day" "41856.10" "5"
"2021-01-03" "Statistic_TotalConsumption_Day" "47740.83" "6"


Wenn ich die Werte so sehe macht es kaum Sinn, pro Wochentag andere Ladeprofile für die Batterie zu erstellen...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Januar 2021, 14:54:25
Zitat von: Mumpitz am 30 Januar 2021, 13:57:33
Hier mal meine Werte des Durchschnittlichen Totalverbrauchs im Januar:
Das DATE kannst Du übrigens raus nehmen, das macht beim avg über einen Monat keinen Sinn.

Hier mal mein Januar.

+--------------------------------+----------+---------+
| READING                        | AVG      | WEEKDAY |
+--------------------------------+----------+---------+
| Statistic_TotalConsumption_Day | 21375.33 |       0 |
| Statistic_TotalConsumption_Day | 23539.65 |       1 |
| Statistic_TotalConsumption_Day | 21291.04 |       2 |
| Statistic_TotalConsumption_Day | 23754.45 |       3 |
| Statistic_TotalConsumption_Day | 20600.56 |       4 |
| Statistic_TotalConsumption_Day | 22537.18 |       5 |
| Statistic_TotalConsumption_Day | 28151.07 |       6 |
+--------------------------------+----------+---------+

Was hast Du denn da für Energieschleudern in Betrieb?
Bei läuft LWP HZ für 180m² 2 Wohnungen + WW für einen Haushalt, KWL, Pool, TV ganztägig, 4 Router, Home Office und der Rest vom Haushalt.
Du hast ja gut 20 kW höheren Verbrauch, ist da ein E-Auto dabei, ansonsten solltest Du das mal untersuchen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Januar 2021, 16:01:47
Tach zusammen,

da wir jetzt ja das Batterie Device getrennt im DOIF ansteuern müssten wir mal festlegen, was jetzt über ExternControl angesteuert werden soll.

Offen wäre momentan

die Ladebegrenzung im Sommer, wenn der Haushalt während der Nacht nicht alles verbrauchen würde.
Hier muss geprüft werden, ob es morgen, also fc1 eine schlechte Leistungsprognose gibt. Dann soll natürlich 100% geladen werden.
Bei mir müsste ich den MaxSoc in % angeben können, da ich momentan mit 40% Soc aus der Nacht komme, was den gesamten Sommer über schlecht für den Speicher ist.
Ab und zu müsste dann jedoch der Speicher auch mal voll gemacht werden, damit er es nicht verlernt :-)

Dann müsste der Leistungshügel um die Mittagszeit ermittelt werden, der in Deutschland > 70% ist. Für andere Lände würde das nicht schaden, weil man da das E-Auto gut laden könnte.
Bis zum Leistungshügel könnte man dann eine Maximale Ladung vorgeben, damit mittags noch platz ist um nicht in die Abschaltung zu kommen. Das versucht der Plenticore bei der intelligenten Steuerung ja auch bereits.

Von Mumpitz habe ich mir noch die zwei Tarif Problematik gemerkt.

Bei einem E-Auto wählt man dann eventuell noch einen Tarif von aWattar oder ähnlichem Anbieter. Da sollte der Speicher dann ja auch nicht zum billigsten Arbeitspreis entladen werden.
Bei einem negativen Preis könnte man ihn hingegen zusätzlich laden, dann kann man Tagsüber lieber PV Einspeisen.


Dann habe ich hier noch folgendes gefunden, was sich me
iner Vorstellung auch deckt.

batterieeinstellungen-kostal (https://www.photovoltaikforum.com/thread/146039-batterieeinstellungen-kostal/?postID=2177947#post2177947)
Zitat
Ich habe heute mal folgende Steuerung eingebaut und getestet:

- Während die Batterie geladen wird teste ich auf den SOC, ab 90% limitiere ich das
  MaxChargeLimit auf 800 Watt, ab 95% auf 400 Watt. Meine Zellen zeigen bei über 90% SOC während
  dem Laden extreme Abweichungen, einzelne gehen auf über 3600 mV (die anderen sind dabei um 3430 mV),
  das kann nicht gut sein. Je geringer der Ladestrom desto geringer die Ausreißer.

- Nachdem einmal 100% erreicht sind (gut fürs Balancing und was wir hier sonst schon alles an
  Empfehlungen gelesen haben) setze ich den MaxSOC auf 90%, d.h. der Speicher wird nicht ständig
  auf 100% gehalten und lädt ständig im obersten Bereich wieder nach. Erst wenn der SOC wieder mal
  unter 90% gefallen ist, setze ich MaxSOC wieder auf 100.

Damit wird der Speicher regelmäßig durchgeladen aber nicht permanent nachgeladen und nicht
auf 100% gehalten. Ich denke, das sollte schonender sein...

Ich bitte um Rückmeldung, damit alles mit einfließen kann.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 30 Januar 2021, 17:14:31
Zitat von: ch.eick am 30 Januar 2021, 14:54:25

Was hast Du denn da für Energieschleudern in Betrieb?
Bei läuft LWP HZ für 180m² 2 Wohnungen + WW für einen Haushalt, KWL, Pool, TV ganztägig, 4 Router, Home Office und der Rest vom Haushalt.
Du hast ja gut 20 kW höheren Verbrauch, ist da ein E-Auto dabei, ansonsten solltest Du das mal untersuchen?

Das weiss ich eben auch nicht. Ich vermute, nein ich weiss es eigentlich, dass meine LWP offenbar einen sehr hohen Verbrauch hat. Wieso weiss ich leider nicht. Allenfalls muss ich mal einen Techniker bemühen, welcher die Einstellungen kontrollieren muss. Leider habe ich 0,0 Möglichkeit einer externen Steuerung. Meine Umstände:

300m2 verteilt auf 3 Stockwerke
5 Personen
Keine E Auto
Keine sonstigen Verbraucher, ausser das Übliche (Geschirrspüler, Tiefkühltruhe usw)
Waschmaschine, Tumbler und Entfeuchter (wird jeden 2ten Tag gebraucht da Outdoor Aktive Kinder)
HomeOffice 50%

Gruss
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Januar 2021, 18:21:24
Zitat von: Mumpitz am 30 Januar 2021, 17:14:31
Das weiss ich eben auch nicht. Ich vermute, nein ich weiss es eigentlich, dass meine LWP offenbar einen sehr hohen Verbrauch hat. Wieso weiss ich leider nicht. Allenfalls muss ich mal einen Techniker bemühen, welcher die Einstellungen kontrollieren muss. Leider habe ich 0,0 Möglichkeit einer externen Steuerung. Meine Umstände:
Das wurde in Mails weiter bearbeitet, da es hier Offtopic ist.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Februar 2021, 10:19:38
EDIT 2010.02.05 : Wenn man diese Änderung durchführen möchte, kann man in der fhem.cfg mal nach den zuändernden Namen suchen. Es sollte nach der Änderung natürlich nichts mehr zu finden sein :-)
    Die Verschiebung der Datenbank Einträge wurde ja auch bereits in früheren Posts beschrieben. Bei mir geht es dann mit dem Einbau der neuen Geräte weiter :-)

Hallo zusammen,
in eigener Sache möchte ich ankündigen, dass sich die PV_* Device Namen ändern werden. Dadurch verändert sich nicht die Funktionalität, sodass Ihr natürlich bei den bisherigen Namen bleiben könnt.
- Der Hintergrund ist, das mich bei PV_Anlage_1 das "Anlage_" schon länger stört, es wird deshalb kürzer zu PV_1 .
- Beim Speicher Namen wurde es einfach zu lang. PV_Anlage_1_Speicher_1 ==> PV_1_Speicher_1 . Hat hier jemand eine Ideeum "Speicher" noch einzukürzen?
- PV_Anlage_1_API wird dann PV_1_API

Des weiteren werde ich noch aufrüsten und bekommen einen zweiten WR und zwei WallBoxen ( die werden gerade noch gefördert!!! )
- Es wird somit zu einer Schwarm PV Anlage und einige Devices kommen dazu.
- Kostal ist noch nicht soweit, dass der Hausverbrauch richtig berechnet wird.
- Somit erwarte ich auch, dass Autarkie und Eigenverbrauchrate nicht korrekt sein werden.
- Es wird einige neue userreadings geben müssen, die die Berechnung vom Hausverbrauch, Autarki und Eigenverbrauchquote übernehmen.

- Die "intelligente Batterie Steuerung" scheint dann auch nicht mehr korrekt zu laufen und soll deaktiviert werden.
- Dadurch wird der Bereich PV_1_Speicher_1_ExternControl wichtiger werden und die Intelligenz bereitstellen

- Bei den Starkverbrauchern kommen die zwei WallBoxen dazu

Alles in allem wird es somit viele Veränderungen und Weiterentwicklungen geben.
Wer also in den nächsten 5 Jahren in eine änliche Richtung gehen möchte, der sollte dann bereits jetzt sein Umfeld mit verändern.

Aktuell habe ich bereits folgende Schritte in Bearbeitung:
Die durchgestrichenen sind bereits erledigt.
- Umbenennung der Devices
- Anpassung der DOIF mit den neuen Namen der Devices
- Korrektur der DbRep Devices mit den neuen Namen
- Umzug der Daten in der DB auf die neuen Namen
- Anpassung der Namen in Grafana
- Definition des neuen WR << der WR wird ende März geliefert, das Device ist schon vorhanden.
- Erweiterung der Leistungsprognose << ist in Arbeit

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 06 Februar 2021, 19:41:06
Zitat von: ch.eick am 17 Januar 2021, 15:35:33
Hallo zusammen,
Stefan war mit dem HTTPMOD Modul mal wieder fleißig un bietet ab der Version 4.1.00 ein neues Attribut an, was wir hier gut gebrauchen können.
set[0-9]*FollowGet (https://forum.fhem.de/index.php/topic,45176.msg1122340.html#msg1122340) dieses Attribut ermöglicht es nach einem Set als nächstes ein Get automatisch zu starten, um das Ergebnis direkt abzuholen. Dadurch können wir dann im PV_Schedule die Aufrufe für die Aktualisierung der Readings wieder entfernen. Das macht das ganze dann wieder übersichtlicher, weil man innerhalb der HTTPMOD direkt sehen kann, wie es aktualisiert wird.

Da die neue HTTPMOD Version nun offiziell verfügbar ist, habe ich diese Änderungen implementiert! Sollten also wieder auf dem selben Stand sein!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Februar 2021, 16:22:48
Zitat von: Mumpitz am 06 Februar 2021, 19:41:06
Sollten also wieder auf dem selben Stand sein!
Abgesehen von der bestellten Aufrüstung und der Umbenennung, um das zu berücksichtigen;-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 09 Februar 2021, 21:06:35
Kennt jemand eine Quelle für  MOSMIX Files des DWD der letzten Monate? Habe mir meine Datenbank verhunzt und dann festgestellt, dass die Dasi ein Problem hat ...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Februar 2021, 22:59:36
Zitat von: plin am 09 Februar 2021, 21:06:35
Kennt jemand eine Quelle für  MOSMIX Files des DWD der letzten Monate? Habe mir meine Datenbank verhunzt und dann festgestellt, dass die Dasi ein Problem hat ...
Ich nutze nur das DWD Modul, aber logge die Wetterdaten nicht mit.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Februar 2021, 17:48:25
EDIT: Ich habe dann mal einen Graphen von gestern und heute angehängt.
Gestern sieht man die vormittags eingedrückte Prognose, die durch die Teilabdeckung der Module mit einem Schneefaktor 0.1 (frei wählbar) gemacht wurde.
Gegen 14:30 ist der Schnee vom Dach gerutscht und sofort die Leistung der Ost Module angestiegen.
Heute war der Stromfluss um 9:00 Uhr > 0.88 A , sodass der Schneefaktor auf 1 gesetzt wurde.
Hierdurch wurde im Vergleich zum Vortag die Kurve nicht mehr eingedrückt.

Das zweite Bild zeigt die Prognose für heute ohne die Autokorrektur.
===================================================

Hallo zusammen,

es ist mal wieder Zeit für die Nachrichten.

Momentan habe ich mich mit dem Solar_forecast() und der Autokorrektur beschäftigt. Ihr habt eventuell in den anderen Threads schon Teile davon gesehen.
Es besteht noch ein DbRep Problem, was ich bereits gemeldet habe.
Dann bestand das Problem, wie bei vielen Anderen, dass ich Schnee auf den Modulen hatte und deshalb der Forecast total daneben lag.

Die Ideen dazu sind:
- Autokorrektur mit Faktoren auf Stundenbasis, aus dem Durchschnitt der letzten Tage
- Ein Faktor, wenn die Module mit Schnee bedeckt sind. Da hatte ich >700V aber nur 0.88 A .
  Sollte das der Fall sein, setze ich den String auf Faktor 0.1 , was ich bisher nur an einem String testen konnte.
  Nun sind heute die Reste ins Rutschen gekommen und es gab einen Sprung um Modul Strom, einerseits gut, jedoch schlecht zum Testen :-)

Ich denke der Ansatz ist gemacht und kann beim nächsten Schnee mit anschließenden Sonnenschein verfeinert werden.

Somit habe ich nun zusätzliche readings in der PV_1_config, die einiges in dieser Richtung abbilden. Es wird noch verfeinert...

Die Funktion Solar_forecast() ist bei dieser Gelegenheit auch etwas geändert worden.
Setzt man das Device PV_1_config auf verbose >3 , so reagiert die Funktion mit den bekannten Loggingmeldungen.
Deshalb kann man dann wieder "attr global verbose 3" setzen, ohne ungewollt mit Logging überflutet zu werden.

Dann wurden ja auch noch eine Vielzahl von get und set Meldungen im Log erzeugt, die ich ebenfalls beseitigen konnte.

Es stehen jetzt noch viele Tests und die Korrektur im DbRep an, bis ich das dann hier vorstelle.

@alle Habt Ihr eventuell noch weitere Ideen, oder Wünsche in die Richtung Forecast/Leistungsprognose ?
   Natürlich bin ich in dem anderen Thread auch dabei, jedoch war die Abweichung in der Basis, ohne Autokorrektur immer noch recht hoch.
   Deshalb habe ich auch mal hier mit einer Autokorrektur begonnen. Der Algorithmus sollte der gleiche sein, bei geht es jedoch aus der
   Datenbank, was viele readings im Device vermeidet.

Viele Grüße
    Christian

P.S. Die Batteriesteuerung (https://forum.fhem.de/index.php/topic,114849.msg1129000.html#msg1129000) ist noch nicht vergessen ;-) Durch meine Aufrüstung mit einem zweiten WR kann Kostal wohl den Hausverbrauch nicht mehr
richtig berechnen und auch die "inteligente Batterie Steuerung" klappt wohl auch nicht mehr. Da muss ich dann wohl auch etwas nachhelfen :-) Der Post wurde auch heute aktualisiert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Februar 2021, 12:50:46
Moin, irgend jemand hatte mal geschrieben, ich solle meine Ergebnisse doch etwas besser verkaufen ;-)
So seih es nun, für die Leistungsprognose.

In der Forecast Grafik sieht man gestern eine starke Spitze um die Mittagszeit, die man so nicht vorhersagen konnte.
In der Mitte ist die rote Linie der Forecast für heute ohne die Autokorrektur, die der DWD grundlegend beeinflusst hat.

Die grüne Linie ist dann die aktuelle Prognose inklusive der Autokorrektur.
Man erkennt sogar etwas die Spitze vom Vortag, wobei diese durch den drei Tage Durchschnitt etwas abgemildert wurde.
Der Autokorrekturfaktor lag hierbei bei 1.2 bis 1.5 für die Mittagszeit.

Auf der rechten Seite ist dann bereits die erste Prognose für morgen, ebenfalls inklusive der Autokorrektur.

Die bald kommende Version beinhaltet dann auch noch die folgenden Werte, die man optimal für die Tagesplanung verwenden kann:

Solar_Calculation_fc0_4h   7010 2021-02-16 12:08:19
Solar_Calculation_fc0_day  9999 2021-02-16 12:08:19
Solar_Calculation_fc0_rest 7796 2021-02-16 12:08:19


Auch eine Reaktion auf Abdeckung durch Schnee ist in den Grundzügen eingebaut und drückt die Prognose pro String mit einem Faktor von 0.1 .
Leider konnte das nur noch am letzten Tag beobachtet werden, aber wer will schon Schnee auf den Modulen :-)

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Februar 2021, 17:16:44
Und nochmal hallo, es bleibt spannend.

In Vorbereitung auf die Speicher Steuerung habe ich dann auch noch das Erkennen der Leistungsspitze zur Mittagszeit eingebaut.
Die deutschen Anwender haben ja in Ihrem Wechselrichter eine 70 % Grenze eingestellt. Damit wird im PV_1 Device im reading Inverter_Max_Power eine Leistung angezeigt, ab der der WR abregelt.
Bei Nutzung der dynamischen 70% Regelung wird hier jedoch noch der Hausverbrauch zusätzlich zur Verfügung gestellt. Kostal versucht dann die Batterieladung auch in diesen Bereich zu legen, was mehr schlecht als recht funktioniert. Bei meiner zukünftigen Schwarm Installation mit zwei WR steht diese Funktion nicht mehr zur Verfügung, weshalb ich diese gerade nachbaue :-)

Durch den Forecast werden nun weitere readings geschrieben

Solar_middayhigh_fc0 1
Solar_middayhigh_fc0_start 11:00
Solar_middayhigh_fc0_stop 15:00
Solar_middayhigh_fc1 1
Solar_middayhigh_fc1_start 11:00
Solar_middayhigh_fc1_stop 14:00


Auf die 70% habe ich noch 500W als durchschnittlichen Hausverbrauch addiert.
Die 1 gibt an, dass es eine Überschreitung geben wird. Mit _start und _stop bekommt man die Triggerzeiten für ein entsprechendes DOIF

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 16 Februar 2021, 20:18:32
Ich habe heute zum Beispiel die Situation, dass meine Batterie heute Abend auf 76% geladen wurde. Morgen sind knapp 14000Wh angesagt. Dies dürfte bedeuten, dass ich vermutlich in die Entladung komme gegen Mittag. Nun wäre es natürlich sinnvoll, die Entladung bereits am Morgen um 7 Uhr frei zugeben.

Hast du eine Idee für eine schlaue Logik dafür. Es müsste der aktuelle Ladestand, die Prognose fc1 sowie der Beginn der Solarleistung, sprich Sonnenaufgang und allenfalls Tarifzeiten berücksichtigt werden. Ich bin gespannt auf Ideen  :)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Februar 2021, 08:33:48
Zitat von: Mumpitz am 16 Februar 2021, 20:18:32
Ich habe heute zum Beispiel die Situation, dass meine Batterie heute Abend auf 76% geladen wurde. Morgen sind knapp 14000Wh angesagt. Dies dürfte bedeuten, dass ich vermutlich in die Entladung komme gegen Mittag. Nun wäre es natürlich sinnvoll, die Entladung bereits am Morgen um 7 Uhr frei zugeben.

Hast du eine Idee für eine schlaue Logik dafür. Es müsste der aktuelle Ladestand, die Prognose fc1 sowie der Beginn der Solarleistung, sprich Sonnenaufgang und allenfalls Tarifzeiten berücksichtigt werden. Ich bin gespannt auf Ideen  :)
Sind die 14000Wh bei Dir viel?
Du mast doch eh schon morgens die Freigabe zum Entladen wes Deines Tarifs.
Dann könntest Du das ja eher frei geben. Also Deine Tarifsteuerung flexibler gestalten.
Schau Dir mal die Pool Steuerung an, da verschiebe ich z.B. im Winter die Startzeit nach vorne, wenn mittags wenig Leistung zu erwarten ist.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 17 Februar 2021, 08:42:47
Zitat von: ch.eick am 17 Februar 2021, 08:33:48
Sind die 14000Wh bei Dir viel?


Ja, leider ist das in den Winterwochen bereits viel. Es ist erst der 4te Tag in diesem Jahr, welcher mehr als 12 kWh zu erwarten sind...
Da wir ziemlich nah am Bodensee wohnen haben wir recht häufig Nebel, welcher knapp oberhalb von uns jedoch aufgelöst ist. Hochnebel heisst jeweils das Zauberwort, welcher normalerweise in der Wohngemeinde überuns aufhört. Ja ich weiss, am falschen Ort gebaut :-)
Aber dieses Jahr ist es wiedermal schlimm, genau im ersten PV Jahr!  >:(

Ich schau mir die Poolsteuerung mal an...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Februar 2021, 12:29:48
Zitat von: Mumpitz am 17 Februar 2021, 08:42:47
Ich schau mir die Poolsteuerung mal an...
Das wesentliche ist, dass ich im DOIF die Uhrzeit nicht direkt eingetragen habe, sondern diese aus dem Pool Dummy indirekt auslese.
Im Pool Dummy steht dann eine Sommer und eine Winterzeit, die im Pool DOIF um 07:17 je nach Prognose als Start Zeit umkopiert wird.
Ist der Ertrag um 12:00 Uhr <4000W wird die Winter zeit genommen, ansonsten halt die Sommerzeit.

Du könntest dann im übertragenen Sinne die Startzeit für deinen Hochtarif vorverlegen und somit die Batterie eher aufgebraucht haben.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Februar 2021, 12:17:13
Hallo zusammen, hallo Mumpitz.

@Mumpitz: Wie ist denn der Stand auf Deiner Seite des Bodensees :-) Konntest Du schon etwas mehr die Tarif Steuerung einbauen und Testen?

Die Batteriesteuerung kommt mit großen Schritte, denn der Sommer naht :-)
Momentan befinde ich mich in den Tests der weitern Speicher Steuerung. Folgendes wird dann als nächstes kommen und auf die bisherigen
Änderungen aufsetzen.

1. Berechnung eines niedrigeren MaxSOC, wenn man mit zuviel Reserve aus der Nacht gekommen ist. Dies soll bewirken, das der Speiche zu beginn der
   Nacht nicht zu 100% geladen worden ist. Das schont den Speicher, da er dann nicht immer zwischen z.B. 40% - 100% pendelt, sondern z.B. 2x MinSOC
   am Morgen also 10% um 7:00 Uhr und einem errechneten MaxSOC z.B. 80% am Abend. Permanentes 100% Laden im Sommer ist Stress für den Speicher.
  Einmal pro Woche würde dann der Speicher trotzdem auf 100% geladen werden, damit die SOC Berechnung sich kalibrieren kann und auch die
  Ausgleichsladung die Zellspannung korrigieren kann.

2. Der nächste Punkt betrifft die Schweizer nicht direkt, da in der Schweiz ja alles ins Netzt eingespeisen werden darf. Wir haben ja diese
   70% Regel, was das verbietet.  Trotzdem kann man damit die Ladung des Speichers in ein bestimmtes Zeitfenster verschieben.
   Der Mechanismuss ist wie folgt und lehnt sich an die "inteligente Batterie Steuerung" vom Plenticore an. Bei einer Schwarm PV Installation klappt ja
   die Speicher Steuerung nicht mehr so optimal, das der WR1 nicht richtig mit dem WR2 kommuniziert.

2.1 Die Solar_forecast() Funktion ermittelt anhand des PV_1:Inverter_Max_Power ein Zeitfenster, in dem dieser Wert überschritten wird, was nur im
  Frühling/Sommer auftritt und mit der möglichen Überschreitung der 70% Grenze einhergeht. Darauf wird dann auch noch ein durchschnittlicher
  Hausverbrauch von 500 Watt addiert, da dieser ja auch eine Einspeisung verhindert.

2.2 Vor diesem Fenster wird dann ein MaxSOC von 40% limitiert und die Ladeleistung auf 500 Watt begrenzt, was ein langsames Laden bewirkt und genügend
  Platz im Speicher für das Ladefenster lässt. Die Werte müssen noch getestet und angepasst werden. Eventuell lässt sich das ja auch dynamisch aus den
  Speicher Werten ermitteln.

2.3 Innerhalb des Ladefensters wird dann die Ladeleistung wieder hoch gesetzt, aber trotzdem der MaxSOC begrenzt.

2.4 Nach dem Ladefenster könnte man dann noch die Ladeleistung wieder begrenzen und es wird weiter bis zum MaxSOC geladen, der dann für die Nacht reichen soll.
  Sollte es nachts starke schwnkungen im Verbrauch geben, muss man die Berechnung am Morgen für den MaxSOC noch anpassen.

2.5 Nach der PV Zeit wird täglich wieder die Steuerung zurück gesetzt.

Der Mechanismuss ist etwas komplexer, da der Speicher spätestens alle 180 Sekunden die Wiederholung der Befehle erwartet, damit er weiß, dass die Steuerung noch lebt.
Es gibt ein Dummy, das die Rahmenparameter beinhaltet und auch für die Signalisierung, welche externe Steuerung durchgeführt werden soll, beinhaltet.
Im PV_1 Device wird wie bereits etabliert der Forecast mit eingetragen und die Steuerung ist im PV_1_Speicher_1_ExternControl beinhaltet.

@Mumpitz: Wie Du bereits bemerkt hast ist die Abfrage vom Astro Device für die Jahreszeiten nun nicht mehr im PV_1_Speicher_1_ExternControl . Stattdessen wird auf
den Forecast reagiert und technische Situationen abgefragt, das macht es weitaus flexibler.
Sobald Du mit der Tarif Implementierung durch bist und es getestet hast, würde ich Dir die weiteren Schritte schicken.

Viele Grüße
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Februar 2021, 18:17:15
Nochmal kurz zur Information,
ich habe begonnen das Wiki zu überarbeiten. Es wurden fast alle Devices aktualisiert, da es ja eine Namensveränderung gegeben hat.
Damit alles konsistent bleibt, solltest Ihr dort auf jeden Fall mal rein schauen und vergleichen. Für die neuen Funktionalitäten ist dies besonders wichtig.

Es dürfen natürlich auch Fehler gesucht und beseitigt werden :-)

Die Speichersteuerung werde ich in den nächsten Tagen dann auch dort ablegen.
Auch zur Tarif Steuerung und später noch zu aWATTar wird etwas kommen.

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 23 Februar 2021, 18:39:23
Zitat von: ch.eick am 23 Februar 2021, 18:17:15
Nochmal kurz zur Information,
ich habe begonnen das Wiki zu überarbeiten. Es wurden fast alle Devices aktualisiert, da es ja eine Namensveränderung gegeben hat.
Damit alles konsistent bleibt, solltest Ihr dort auf jeden Fall mal rein schauen und vergleichen. Für die neuen Funktionalitäten ist dies besonders wichtig.

Es dürfen natürlich auch Fehler gesucht und beseitigt werden :-)

Die Speichersteuerung werde ich in den nächsten Tagen dann auch dort ablegen.
Auch zur Tarif Steuerung und später noch zu aWATTar wird etwas kommen.

Viele Grüße
     Christian

Wie finden wir am einfachsten raus was sich alles geändert hat?

Bezüglich dem Test hoffe ich, dass ich heute das geschriebene übernehmen und morgen im Einsatz testen kann!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Februar 2021, 18:46:29
Zitat von: Mumpitz am 23 Februar 2021, 18:39:23
Wie finden wir am einfachsten raus was sich alles geändert hat?

Bezüglich dem Test hoffe ich, dass ich heute das geschriebene übernehmen und morgen im Einsatz testen kann!
Wenn im comment ein aktuelleres Datum als bei Euch steht, wird sich etwas geändert haben.
Ich habe keine Liste mit einzel Kommandos erstellt, da es einfach zu viele Änderungen gegeben hat.
Im Thread hatte ich jeweils einzelne Schritte angekündigt und beschrieben.

Das beste wäre natürlich sich mal jedes Device einzeln anzuschauen, denn es kann ja sein, dass Ihr eigene Erweiterungen gemacht habt oder die Devices umbenannt habt.

EDIT: Im Wiki habe ich auch Informationen eingetragen, was z.B. neu ist und was sich verändert hat.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 Februar 2021, 13:27:47
Moin,
ich habe gerade im Wiki noch eine Tabelle eingefügt, die der Orientierung dienen soll.
Das sind die Devices aufgelistet und essenzielle reading mit deren Funktion erklärt.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Februar 2021, 17:49:57
Hallo zusammen,
es gibt mal wieder etwas aufzuräumen :-)

Im PV_1 Device kommen weitere ModBus Register hinzu und einige ändern sich vom Namen, damit es wieder etwas aufgeräumter ist.
Ich versuche hier mal die FHEM Kommandos zusammen zu fassen, aber bitte checked das nochmal, damit ich nichts vergesse.

Achtung, bei den neuen Registern sind nun auch welche schreibbar. Das ganze ist noch nicht wirklich getestet, deshalb seit vorsichtig, wenn Ihr nicht wisst was Ihr tut. Das ist alles auf eigene Verantwortung und ich übernehme keine Verantwortung.
Die neuen Register sind noch nicht alle korrekt decodiert, aber die meisten haben bereits plausible Werte, durch den Default. Sobald ich etwas raus gefunden habe gibt's hier natürlich einen Update :-)
ein "set PV_1 Battery_MaxSOC 80" hat bei mir bereits funktioniert, da ich die externe Batterie Steuerung aktiviert habe. Wenn das auch ohne die Aktivierung klappt, bitte ich um Rückmeldung.

PV_1

attr PV_1 obj-h1024-reading Battery_ChargeAcPowerSetpoint
attr PV_1 obj-h1024-set 1
attr PV_1 obj-h1025-reading Battery_PowerScaleFactor
attr PV_1 obj-h1026-reading Battery_ChargeAcPowerSetpointAbs
attr PV_1 obj-h1026-set 1
attr PV_1 obj-h1028-reading Battery_ChargeDcCurrentSetpointRel
attr PV_1 obj-h1028-set 1
attr PV_1 obj-h1030-reading Battery_ChargeAcPowerSetpointRel
attr PV_1 obj-h1030-set 1
attr PV_1 obj-h1032-reading Battery_ChargeDcCurrentSetpointAbs
attr PV_1 obj-h1032-set 1
attr PV_1 obj-h1034-reading Battery_ChargeDcPowerSetpointAbs
attr PV_1 obj-h1034-set 1
attr PV_1 obj-h1036-reading Battery_ChargeDcPowerSetpointRel
attr PV_1 obj-h1036-set 1
attr PV_1 obj-h1038-reading Battery_MaxChargePowerLimitAbs
attr PV_1 obj-h1038-set 1
attr PV_1 obj-h1040-reading Battery_MaxDischargePowerLimitAbs
attr PV_1 obj-h1040-set 1
attr PV_1 obj-h1042-reading Battery_MinSOC
attr PV_1 obj-h1042-set 1
attr PV_1 obj-h1044-reading Battery_MaxSOC
attr PV_1 obj-h1044-set 1
attr PV_1 obj-h1068-reading Battery_work_capacity
attr PV_1 obj-h1070-reading Battery_serial_number
attr PV_1 obj-h1072-reading Battery_Reserved_1072
attr PV_1 obj-h1074-reading Battery_Reserved_1074
attr PV_1 obj-h1076-reading Battery_Maximum_ChargePowerLimit_(read-outFromBattery)
attr PV_1 obj-h1078-reading Battery_Maximum_DischargePowerLimit_(read-outFromBattery)
attr PV_1 obj-h1080-reading Battery_management_mode
attr PV_1 obj-h1080-set 1
attr PV_1 obj-h1081-reading Battery_Reserved_1081
attr PV_1 obj-h1082-reading Installed_sensor_type

deleteattr PV_1 obj-h1046-reading Battery_Total_DC_Charge_Energy_(DC-sideToBattery)
deleteattr PV_1 obj-h1048-reading Battery_Total_DC_Discharge_Energy_(DC-sideFromBattery)
deleteattr PV_1 obj-h1050-reading Battery_Total_AC_Charge_Energy_(AC-sideToBattery)
deleteattr PV_1 obj-h1052-reading Battery_Total_AC_Discharge_Energy_(batteryToGrid)
deleteattr PV_1 obj-h1054-reading Battery_Total_AC_Charge_Energy_(gridToBattery)

attr PV_1 obj-h1046-reading Battery_TotalDcChargeEnergy_(DC-sideToBattery)
attr PV_1 obj-h1048-reading Battery_TotalDcDischargeEnergy_(DC-sideFromBattery)
attr PV_1 obj-h1050-reading Battery_TotalAcChargeEnergy_(AC-sideToBattery)
attr PV_1 obj-h1052-reading Battery_TotalAcDischargeEnergy_(batteryToGrid)
attr PV_1 obj-h1054-reading Battery_TotalAcChargeEnergy_(gridToBattery)


Dann noch readings aufräumen

deletereading PV_1 Battery_Total_.*
set PV_1 reread


Viele Grüße
      Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 25 Februar 2021, 20:49:29
Zitat von: ch.eick am 25 Februar 2021, 17:49:57

ein "set PV_1 Battery_MaxSOC 80" hat bei mir bereits funktioniert, da ich die externe Batterie Steuerung aktiviert habe. Wenn das auch ohne die Aktivierung klappt, bitte ich um Rückmeldung.


Rückmeldung: Funktioniert bei nicht aktivierter Externer Batteriesteuerung nicht!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Februar 2021, 11:06:14
Hallo zusammen,
mir schwebt da noch eine Umbenennung der readings im PV_1 Device vor, um eine Geräte spezifische Gruppierung anhand der reading Namen zu bekommen.
Hierzu hätte ich gerne Eure Meinung.
Der Plenticore gibt ja auch Werte von anderen Geräten weiter.

1. Energy Manager
Hier gibt es verschiedene Geräte Typen, die kompatibel sind und die readings werden laut der Kostal Specification mit "(powermeter)" markiert.
- Alle diese readings würde ich mit "EM_" beginnen lassen und das "_(powermeter)" verschwindet.
- Den Begriff Phase/phase würde ich zum genormten L1/L2/L3 umsetzen
- Apparent/Absolut/Relative rutscht ans Ende als Abs/Rel/App
- Ac/Dc und andere Varianten möchte ich durchgängig mit AC/DC vereinheitlichen und eventuell wieder mit "_" klarer sichtbar machen.
2. Speicher
Bei diesen readings habe ich bereits Battery als Prefix eingearbeitet.
- Das würde ich gerne in "Bat_"  einkürzen.
- Dazu gibt es noch vereinzelte Batterie spezifische readings, die dem Plenticore zuzuordnen sind, welche ich dann auch mit Bat_ gruppieren möchte.
  z.B. Actual_battery_charge_-minus_or_discharge_-plus_Power; Actual_battery_charge_-minus_or_discharge_-plus_current; Actual_battery_charge_usable_Power; Number_of_battery_cycles
- Den Begriff Phase/phase würde ich zum genormten L1/L2/L3 umsetzen
- Apparent/Absolut/Relative rutscht ans Ende als Abs/Rel/App
- Ac/Dc und andere Varianten möchte ich durchgängig mit AC/DC vereinheitlichen und eventuell wieder mit "_" klarer sichtbar machen.
3. Plenticore selber
- Den Begriff Phase/phase würde ich zum genormten L1/L2/L3 umsetzen
- Apparent/Absolut/Relative rutscht ans Ende als Abs/Rel/App
- Ac/Dc und andere Varianten möchte ich durchgängig mit AC/DC vereinheitlichen und eventuell wieder mit "_" klarer sichtbar machen.

- Voltage,Current, Power könnte man zu U, I, P , also den genormten Bezeichnungen umsetzen Energy wäre dann mit E auch denkbar.
   Einheiten:
        Spannung U in Volt (V)
        Strom I in A (A)
        Leistung P in Watt (W)
        Energie E in Watt/Zeit

Ihr habt ja sicher bereits mitbekommen, dass meine installation einen zweiten Wechselrichter bekommen wird. Da stellt sich die Herausforderung, dass einige Werte, wie Hausverbrauch, Autarkie und Eigenverbrauchsfaktor
momentan noch nicht korrekt berechnet werden. Kostal soll da bereits dran arbeiten, aber das wird sicher noch etwas Zeit brauchen.

Deshalb werde ich eventuell entweder ein weiteres Device für den Schwarm (SW) verwenden müssen, oder im PV_1 eine Gruppe mit "SW_" als weiteres Untergerät einführen. Wie wäre da Eure Meinung.

Generell gilt natürlich, wenn keine Rückmeldung kommt mache ich einfach und Ihr zieht nach oder auch nicht ;-)
Bei denen, die Ihre Devices bereits anders benannt haben merke ich, dass ein Nachziehen und Erweitern mit mehr Arbeit verbunden ist. Das darf natürlich jeder selber für sich entscheiden.
Anfänglich hatte ich auch gedacht, dass da nicht mehr so viel neues kommen wird, aber da geht anscheinend doch noch was ;-)

Viele Grüße
     Christian

Und hier wäre der bisherige Vorschlag, bei dem man bereits die Sortierung sehen kann

Bat_Act_State_of_Charge 16.00
Bat_Charge_Current 20.00
Bat_E_AC_Total_Charge_(AC-sideToBat) 1077.02
Bat_E_AC_Total_Charge_(gridToBat) 944.98
Bat_E_AC_Total_Discharge_(BatToGrid) 132.97
Bat_E_DC_Total_Charge_(DC-sideToBat) 191783.84
Bat_E_DC_Total_Discharge_(DC-sideFromBat) 156643.06
Bat_I_DC_Charge_SetpointAbs 0.00
Bat_I_DC_Charge_SetpointRel 0.00
Bat_Info_Gross_Capacity 1638400
Bat_Info_Maincontroller_(MC) 4587521
Bat_Info_Management_Mode 0.00
Bat_Info_Manufacturer BYD             
Bat_Info_Model_ID 0
Bat_Info_Serial_Number 0.00
Bat_Info_Work_Capacity 9252.45
Bat_MaxSOC      100.00
Bat_Maximum_Charge Power Limit_(read-outFromBat) 7896.00
Bat_Maximum_Discharge_Power_Limit_(read-outFromBat) 18106.58
Bat_MinSOC      5.00
Bat_Number_of_Cycles 197
Bat_PSSB_Fuse_State 0.00
Bat_P_AC_Charge_Setpoint 0.00
Bat_P_AC_Charge_SetpointAbs 0.00
Bat_P_AC_Charge_SetpointRel 0.00
Bat_P_ChargeMax_LimitAbs 4707.91
Bat_P_Charge_usable_Actual 0
Bat_P_DC_Charge_SetpointAbs 0.00
Bat_P_DC_Charge_SetpointRel 0.00
Bat_P_DischargeMax_LimitAbs 4707.91
Bat_Ready_Flag  1.00
Bat_Reserved_1072 0.00
Bat_Reserved_1074 0.00
Bat_SOC_Actual  0.00
Bat_State       NaN
Bat_T           15.50
Bat_V           362.14
Bat_charge_-minus_or_discharge_-plus_P_Actual 0
Bat_charge_-minus_or_discharge_-plus_current_Actual 0.01
EM_Cos_phi      1.00
EM_Frequency    50.00
EM_I_L1         5.10
EM_I_L2         0.46
EM_I_L3         0.51
EM_Info_State_of_Energy_Manager 0
EM_P_L1_Active  1125.40
EM_P_L1_Apparent 1143.10
EM_P_L1_Reactive 195.80
EM_P_L2_Active  -70.10
EM_P_L2_Apparent -93.60
EM_P_L2_Reactive -63.60
EM_P_L3_Active  -64.70
EM_P_L3_Apparent -95.90
EM_P_L3_Reactive -68.60
EM_P_Total_Active 1008.40
EM_P_Total_Apparent 997.90
EM_P_Total_Reactive 63.80
EM_U_L1         231.19
EM_U_L2         233.30
EM_U_L3         231.70
Home_cons_Total 10111532.00
Home_cons_Total_Bat 1687574.50
Home_cons_Total_Grid 4496943.50
Home_cons_Total_PV 3942742.00
Home_cons_Total_Rate 51.76
Home_cons_own_from_PV 325.47
Home_cons_own_from_battery 3.53
Home_cons_own_from_grid 999.00
Inv_AC_P_Total_Active 329.00
Inv_AC_P_Total_Apparent 429.25
Inv_AC_P_Total_Reactive 270.55
Inv_Actual_cos_phi 1.00
Inv_E_AC_Total_(AC-sideToGrid) 5246518.00
Inv_E_DC_Total_From_PV1 382110.62
Inv_E_DC_Total_From_PV2 397331.75
Inv_E_DC_Total_From_PV3 0.00
Inv_E_DC_Total_PV_(sumOfAllPVInputs) 779442.38
Inv_Generation_Energy 4154589349.00
Inv_Generation_Power_Actual 0.00
Inv_Grid_Frequency 50.02
Inv_I_DC1       0.32
Inv_I_DC2       0.33
Inv_I_DC3       0.00
Inv_I_L1        0.62
Inv_I_L2        0.58
Inv_I_L3        0.63
Inv_Info_Article_Number 10335959
Inv_Info_IP-DNS1 192.168.178.x
Inv_Info_IP-DNS2
Inv_Info_IP-address 192.168.178.x
Inv_Info_IP-gateway 192.168.178.x
Inv_Info_IP-subnetmask 255.255.255.0
Inv_Info_Installed_sensor_type 0.00
Inv_Info_Isolation_Resistance 44230000.00
Inv_Info_Max_Power 6999
Inv_Info_Power_Class 10
Inv_Info_Productname PLENTICORE plus
Inv_Info_Serial_Number xxxxxxxxxxxxx
Inv_Info_Software-Version_IO-Controller_(IOC) 01.45
Inv_Info_Software-Version_Maincontroller_(MC) 01.46
Inv_Info_State  6
Inv_Info_Work_Capacity 6999.00
Inv_Info_Worktime 28553208.00
Inv_Info_network_name scb
Inv_P_DC1       179.68
Inv_P_DC2       188.44
Inv_P_DC3       0.00
Inv_P_DC_Total  372.92
Inv_P_DC_Total_(sumOfAllPVInputs) 367.48
Inv_P_Info_limit_from_EVU 100.00
Inv_P_L1_Active 116.49
Inv_P_L2_Active 105.76
Inv_P_L3_Active 107.64
Inv_U_DC1       563.76
Inv_U_DC2       563.82
Inv_U_DC3       0.00
Inv_U_L1        230.46
Inv_U_L2        232.29
Inv_U_L3        230.88
Inv_Yield_Daily 4879.80
Inv_Yield_Monthly 321133.94
Inv_Yield_Total 10876835.00
Inv_Yield_Yearly 462743.34
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Februar 2021, 17:18:58
Es gab einen Update bei den Namensvorschlägen
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 27 Februar 2021, 10:41:46
Hallo

Also ich bin da sehr pragmatisch unterwegs. Mir ist es egal wie die Readings heissen. Weil die die relevant sind werden visualisiert mit einer entsprechenden Beschriftung. Die welche ich für entsprechende Berechnungen brauche kennt fhem mit dem aktuellen Namen. Daher finde ich es nicht nötig den Aufwand zu betreiben alles zu renamen...

Aber wenn du es machst ziehe ich natürlich nach...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 März 2021, 20:22:44
Ich habe schon mal begonnen im Wiki die PV_1_Speicher_1_ExternControl zu beschreiben, wer mag kann schon mal nach Fehlern suchen und das Schlimmste verhindern.
Work in progress :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 März 2021, 13:29:52
Hallo zusammen,
heute gab es einen Meilenstein bei der Speicher Steuerung, wodurch folgende Komponenten betroffen sind:

Solar_forecast()
PV_1_Speicher_1_ExternControl
PV_1_Speicher_1_ExternTrigger

Auch wenn Ihr die ExternControl im Plenticore nicht freigegeben habt solltet Ihr das trotzdem mit in Eure Installation übernehmen.
Mit den setstate in der RAW Definition wäre alles per Default deaktiviert.

setstate PV_1_Speicher_1_ExternTrigger 2021-03-03 09:15:36 SpeicherMaxSOCControlActive 0
setstate PV_1_Speicher_1_ExternTrigger 2021-03-03 07:13:00 SpeicherMiddayControlActive 0

setstate PV_1_Speicher_1_ExternTrigger 2021-03-03 11:35:19 SpeicherCmdRepeatActive 1     <<< Ist nur für ein manuelles zusätzliches Sperren gedacht, obwohl ExternControl aktiv ist.


VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 März 2021, 11:17:18
Moin,
im Wiki st nun die Beschreibung für die Speicher Steuerung eingfügt. Sollte etwas unklar sein meldet Euch einfach.
Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 07 März 2021, 12:09:03
Zitat von: ch.eick am 03 März 2021, 13:29:52
Hallo zusammen,
heute gab es einen Meilenstein bei der Speicher Steuerung, wodurch folgende Komponenten betroffen sind:


PV_1_Speicher_1_ExternControl




Ich hätte hierzu noch einen Änderungsvorschlag sowie ein etwas unschönes Verhalten zu melden:
Also, grundsätzlich habe ich deinen Umsetzungsvorschlag seit ein paar Tagen in Gebrauch. Ich möchte dir daher zuerst ein grosses Kompliment aussprechen. Es funktioniert alles wunderbar!

Im cmd_10 führst du die Befehle erst um 10:07 Uhr aus. Gibt es einen Grund das du dies so spät machst? Hier würde ich vorschlagen, dies Abhängig vom Sunrise zu machen. Daher schlage ich vor,

[10:07] durch
[{sunrise_abs("HORIZON=+20.0",0,"6:00","10:00")}]

zu ersetzen. Was meinst du dazu?

Weiter war es so, dass am Donnerst, die Prognose ziemlich mies gewesen ist für Freitag. Dadurch hat cmd_9 gegriffen und den MinSoc auf 20% gesetzt. Zudem wurde das Entladen verhindert. Am Samstag war dann aber der Forecast und das Wetter so gut, dass eigentlich bereits am morgen wieder hätte das Entladen erlaubt werden. Das hat es jedoch nicht getan. Das hat sich so ausgewirkt, dass der Speicher genug Reserve gehabt hätte, die Waschmaschine der Frau, als kurz Wolken gekommen sind, zu betreiben. Stattdessen wurde jedoch bei Speicherstand 39% Strom zu gekauft. Der Speicher hätte erst bei 90% wieder entladen (mit cmd_3)

Könnte dies nicht irgendwie früher eingeleitet werden wenn das Wetter und damit auch der Forecast an diesem Tag so gut ist?

Danke und Gruess aus der Schweiz
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 März 2021, 16:42:28
Zitat von: Mumpitz am 07 März 2021, 12:09:03
Ich hätte hierzu noch einen Änderungsvorschlag sowie ein etwas unschönes Verhalten zu melden:
Also, grundsätzlich habe ich deinen Umsetzungsvorschlag seit ein paar Tagen in Gebrauch. Ich möchte dir daher zuerst ein grosses Kompliment aussprechen. Es funktioniert alles wunderbar!

Im cmd_10 führst du die Befehle erst um 10:07 Uhr aus. Gibt es einen Grund das du dies so spät machst? Hier würde ich vorschlagen, dies Abhängig vom Sunrise zu machen. Daher schlage ich vor,

[10:07] durch
[{sunrise_abs("HORIZON=+20.0",0,"6:00","10:00")}]
zu ersetzen. Was meinst du dazu?
Der Zeitpunkt ist ziemlich egal, da das ganze nicht auf aktuelle Ereignisse reagieren soll.
Wichtig ist der Schwellwert PV_1_Speicher_1_ExternTrigger:SpeicherMinSOC_fc1_Limit , der auf Deine Anlage passen sollte. Da musst Du etwas experimentieren.

Das ist auch der Grund dafür, dass cmd_9 auf Winter gestellt hat :-)
Zitat
Weiter war es so, dass am Donnerst, die Prognose ziemlich mies gewesen ist für Freitag. Dadurch hat cmd_9 gegriffen und den MinSoc auf 20% gesetzt.

Zitat
Zudem wurde das Entladen verhindert. Am Samstag war dann aber der Forecast und das Wetter so gut, dass eigentlich bereits am morgen wieder hätte das Entladen erlaubt werden. Das hat es jedoch nicht getan. Das hat sich so ausgewirkt, dass der Speicher genug Reserve gehabt hätte, die Waschmaschine der Frau, als kurz Wolken gekommen sind, zu betreiben. Stattdessen wurde jedoch bei Speicherstand 39% Strom zu gekauft. Der Speicher hätte erst bei 90% wieder entladen (mit cmd_3)
Könnte dies nicht irgendwie früher eingeleitet werden wenn das Wetter und damit auch der Forecast an diesem Tag so gut ist?
Auch das reagiert auf PV_1_Speicher_1_ExternTrigger:SpeicherMinSOC_fc1_Limit]

Versuche es mal mit einem etwas niedrigerem Schwellwert.
Bei meiner 10 kWp mit 9,3 kW Speicher steht der Wert derzeit bei SpeicherMinSOC_fc1_Limit 14000

Ansonsten müsste ich exakt wissen, an welchem Wert eine Umschaltung festgelegt werden kann.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2021, 09:49:40
Hallo Mumpitz,
ich habe das Umschaltverhalten zwischen Sommer/Winter nun nochmal beobachten können.
Durch die schlechte Prognose für heute ist bei mir auch der MinSOC nochmal auf 20% Winter umgeschaltet worden und smart_laden hat sich ebenfalls aktiviert.
Bei mir finde ich das jadoch vollkommen korrekt.

Ich hatte es letzte Tage zum Testen nochmal manuell aufgehoben, also auf MinSOC 5% und laden_beendet. Die folge war, das der Speicher in der Nacht durch meine LWP auf leicht unter MinSOC 5% entladen wurde. Danach hat der Plenticore auch noch etwas entnommen und es kam zu einer Notladung, was ich ja eigentlich vermeiden möchte.

Somit war die externe Speichersteuerung im Vorgehen korrekt und es wäre nicht zu einer Notladung gekommen.

Gerade jetzt im Winter/Frühjahr kann es ja mal schnell zu starken Schwankungen kommen, da sollten wir versuchen das optimale SpeicherMinSOC_fc1_Limit , passend zur Anlage zu finden. Der Winter ist halt noch nicht vorbei :-)

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 15 März 2021, 19:17:30
Heute ist mein Plenticore mit BYD-Box in Betrieb gegangen. Ich habe mir die Modbus-Daten, wie im Wiki beschrieben, angelegt. Jetzt brauch ich mal kurz Hilfe, bei den Readings.
Für meine Auswertung hätte ich gern die für einen Tag durch die PV erzeugte Energie. Beim SMA (der ist jetzt erst mal aus bis die neuen Strings in Betrieb gehen) war hier für das Reading SPOT_ETODAY da. Die gesamte durch PV erzeugte Energie konnte ich im Reading SPOT_ETOTAL auslesen. Welche Readings sind das beim Kostal ? Ich dachte erst Daily_yield & Total_yield - aber da ist ja auch die aus der Batterie erzeugte Energie mit dabei.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 März 2021, 23:07:39
Zitat von: papa am 15 März 2021, 19:17:30
Heute ist mein Plenticore mit BYD-Box in Betrieb gegangen. Ich habe mir die Modbus-Daten, wie im Wiki beschrieben, angelegt. Jetzt brauch ich mal kurz Hilfe, bei den Readings.
Für meine Auswertung hätte ich gern die für einen Tag durch die PV erzeugte Energie. Beim SMA (der ist jetzt erst mal aus bis die neuen Strings in Betrieb gehen) war hier für das Reading SPOT_ETODAY da. Die gesamte durch PV erzeugte Energie konnte ich im Reading SPOT_ETOTAL auslesen. Welche Readings sind das beim Kostal ? Ich dachte erst Daily_yield & Total_yield - aber da ist ja auch die aus der Batterie erzeugte Energie mit dabei.
Wenn Du auch noch das PV_1_API Device definierst, dann bekommst Du auch noch die Statistiken vom Plenticore.
Bitte lies Dich da mit allen Tests der myUtils Funktionen durch das Wiki. Es wird ein Login benötigt.
Dort habe ich noch ein userreading untergebracht, was Deinem gewünschten Wert entspricht.

Statistic_Yield_NoBat_Day 13921.64
Statistic_Yield_NoBat_Month 251190.83
Statistic_Yield_NoBat_Year 660844.58

Das Scheduling wird mit dem DOIF PV_Schedule erledigt, das mit cmd_1 jede Stunde um 57' die Statistiken abruft.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 16 März 2021, 08:13:02
Vielen Dank für die schnelle Reaktion. Das API-Dingens wollte ich mir eigentlich sparen. Na dann werde ich mir das mal ansehen. Mit Batterie ist halt doch noch mal ne andere Logik dahinter.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 März 2021, 09:19:54
Zitat von: papa am 16 März 2021, 08:13:02
Vielen Dank für die schnelle Reaktion. Das API-Dingens wollte ich mir eigentlich sparen. Na dann werde ich mir das mal ansehen. Mit Batterie ist halt doch noch mal ne andere Logik dahinter.
Nur keine Angst davor :-) Ich denke auch die Speicher Steuerung lohnt sich auf die Jahre gesehen.
Ich habe jedoch keine Kopplung zum SolarForecast Modul, weil der Forecast in dieser Implementierung mit Datenbank noch immer genauer ist, obwohl die Berechnungen bereits im Modul mit eingeflossen sind.
Aber es darf ja ruhig auch zwei Implementierungen geben :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Darryl B am 17 März 2021, 21:29:45
Hallo zusammen

Ich schreibe in diese Rubrik da Sie direkt mit der wiki/Kostal_Plenticore_10_Plus verlinkt ist.
Vor lauter informationen weiss man gar nicht wo anfangen.

Ich habe die Device eingepflegt aber es funktioniert nicht.
Mein Plenticore 10 plus arbeitet seit 8 Monaten. Hat noch keine Batterien werden aber in den nàchsten Jahren nachgerüstet.
Wenn die Device erstellt werden hat es einen Einfluss ob die Batterien vorhanden sind oder nicht?
Bleiben die direkten Batterie-Werte leer und beeinflussen sie die anderen nicht?
Mein KSEM ist am Plenticore angeschlossen, wo muss ich dies definieren?

Ich habe noch einen 3 String voregesehen aber noch nicht realisiert. Sobald ich die Batterien realisiere muss für diesen String ein neuer Wechselrichter her. Wahrscheinlich ein kleiner Kostal. Was kann man vorplanen um die Umstellung in Grenzen zu halten?

danke im voraus





Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 März 2021, 08:39:15
Zitat von: Darryl B am 17 März 2021, 21:29:45
Ich habe die Device eingepflegt aber es funktioniert nicht.
Mein Plenticore 10 plus arbeitet seit 8 Monaten. Hat noch keine Batterien werden aber in den nàchsten Jahren nachgerüstet.
Wenn die Device erstellt werden hat es einen Einfluss ob die Batterien vorhanden sind oder nicht?
Bleiben die direkten Batterie-Werte leer und beeinflussen sie die anderen nicht?
Mein KSEM ist am Plenticore angeschlossen, wo muss ich dies definieren?

Ich habe noch einen 3 String vorgesehen aber noch nicht realisiert. Sobald ich die Batterien realisiere muss für diesen String ein neuer Wechselrichter her. Wahrscheinlich ein kleiner Kostal. Was kann man vorplanen um die Umstellung in Grenzen zu halten?
Hallo Darryl,
zuerst mal herzlich willkommen.

1.) Der KSEM sollte am Netzanschlusspunkt, also direkt hinter dem EVU Zähler. Das macht der Elektriker.
2.) Die Konfiguration des KSEM erfolgt ebenfalls durch den Elektriker, da der Installateur Key benötigt wird.
     Wenn ein Speicher dazu kommt muss der KSEM zusätzlich mit der RS485 Schnittstelle mit dem Plenticore verbunden sein.
     Das solltest Du jetzt schon machen, dann wird es später einfacher.

3) Für den Speicher wird später ein Freischaltkey im Plenticore eingetragen, der den String 3 umschaltet. Bis dahin sollte er als String für Module verwendet werden können.
    Dieser Fall wurde mir bisher noch nicht gemeldet, aber die Werte im Device sollten passen. Das werden wir dann ja bald sehen, wenn es bei Dir läuft.
    Ansonsten können wir das ja korrigieren.

4) Bei mir wird nächste Woche ebenfalls ein zweiter Kostal Plenticore in Betrieb genommen, was die Installation dann zu einem kleinen Schwarm werden lässt.
    Kostal hat da noch Probleme mit den korrekten Verbrauchswerten, was ich mir aber erst dann anschauen kann. Es wird also wieder spannend, aber das bekommen wir schon hin.

5) Nach dem Umbau des String 3 wirst Du eventuell einige historische Werte in der Datenbank verschieben wollen, damit in den Diagrammen die Zuordnung von den Modulen
     an String 3 rüber zum zweiten WR kommen. Aber nur wenn Du dann noch soweit zurück schauen möchtest. Das fällt aber unter Aufräumen der Datenbank.

6) Eventuell werde ich wegen des Schwarms nochmal einige Devices umbenenne, was sich jedoch ergeben wird und dann erkläre ich auch wie man umsteigen kann. Das hat bisher immer geklappt.
    Eine Vermischung der Hersteller könnte etwas komplexer werden, falls Dein zweiter WR kein Kostal wird, da Du dann die unterschiedlichen readings selber zusammen fassen müsstest, um sie in
    den Diagrammen darstellen zu können. Auch die Verbrauchswerte in einem Schwarm werden viel Arbeit werden, da die WR nichts voneinander wissen und wie oben bereits geschrieben klappt das
    bisher ja bei Kostal auch noch nicht korrekt. Im Kostal Portal soll es jedoch bereits korrekt dargestellt werden. Das hat aber gut 1 Jahr gedauert ;-)


Als erstes sollte das PV_1 Device die Werte per ModBus korrekt anzeigen.

Das PV_1_API liest noch zusätzlich die Statistiken aus und kann auch den Speicher steuern. Es gibt für den Speicher jetzt auch die Möglichkeit das über das PV_1 Device zu machen,
was ich jedoch noch nicht verwende. Die API war bei Kostal halt eher da, aber im PV_1 Device ist es bereits mit drin und kann auch verwendet werden.

Für das PV_1_API werden die Funktionen zur Anmeldung, wie im Wiki benötigt. Als in die myUtils einfügen und dann schritt für schritt testen, was auch beschrieben ist.

Der Rest kommt dann erst später :-)

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 März 2021, 14:11:30
Hallo zusammen,
seit Freitag ist mein zweiter WR in Betrieb :-) , jedoch noch ohne Strings :-( .
Falls noch jemand eine Schwarm Installation hat, wäre jetzt der richtige Moment die Erfahrungen mit einfließen zu lassen.
Wie bereits berichtet werden ja einige Werte, z.B. der Hausverbrauch und somit auch Autarkie und Verbrausrate falsch angezeigt.

Dies habe ich nun begonnen mit einer readingsGroup als zusätzliches Device zu korrigieren. Wer also mehr als eine AC Quelle, abgesehen vom Grid, hat wird nun ein weteres Device bekommen. Die Devices WR_1 und WR_2 zeigen dann die von Kostal berechneten Werte an und SW_1 die Werte für den Schwarm.
EDIT: die readingsGroup und das DUMMY habe ich wieder verworfen. Dafür kommen zusätzliche readings in das WR_1 (PV_1) Device.
Auch den Forecast für den Schwarm belasse ich besser dort, damit die DOIFs nicht geändert werden müssen. Mit den momentan 5 Strings im Forecast kommt man recht weit und somit erhöht sich dort einfach die Leistung.


Bei den Diagrammen in Grafana wird dann auch eine Korrektur erfolgen, damit man nicht in der Datenbank alle Werte dreifach loggen muss. Ich denke so wird es am einfachsten sein ein PV Umfeld mit einem oder mehr AC Quellen zu betreiben, bis Kostal es geschaft haben wird das Manko zu beseitigen.

Für andere Vorschläge bin offen
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Darryl B am 26 März 2021, 09:43:24
Hallo Christian

Danke für deine Antwort.  Der Plenticore läuft bei mir seit September 2020 und der Ksem ist an de Plenticore gekoppelt.
Wenn ich richtig verstanden habe muss ich den Installationkey in Deine Aray einfügen.

Eine Anregung. Ich habe in ein paar Foren festgestellt, dass ich nicht der einzige bin der in der Abfrage des Modbuses etwas Mühe mit den Bezeichnungen hat. Wäre es hilfreich mit einem Alias eine Deutsche Bezeichnung anzuhängen.

Danke gruss Darryl
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 März 2021, 11:51:25
Hallo Darryl,
Zitat von: Darryl B am 26 März 2021, 09:43:24
Wenn ich richtig verstanden habe muss ich den Installationkey in Deine Aray einfügen.
Für die Abfrage über die API habe ich den Key im FHEM KeyStore abgelegt.
Der Key ist auf dem Gehäuse des Plenticore angegeben und hier als <passwort> einzutragen.
{KeyValue("store","PW_WR_1_API_user","<passwort>")}

PW_WR_1_API_user ist als syntax beizubehalten, wobei WR_1 Dein Device Name ist.

@alle
Für die zukünftigen Umbenennungen wäre es sehr wichtig, dass Du das Device direkt auf WR_1 benennst und nicht wie im Wiki als PV_1 . Ich habe vor zwei Jahren da einen denkfehler gehabt,
der mit jetzt gerade auf die Füße gefallen ist. Hierbei muss natürlich für das WR_1_API Device auch der Key neu abgelegt werden (Syntax siehe oben).

PV ist die gesamte Anlage
WR_[1-n] sind die Wechselrichter der PV-Anlage
WR_1_Speicher_1 ist der Speicher am WR_1
PV_1_Speicher_2 wäre dann ein zweiter Speicher, der z.B. direkt im AC Netz der PV-Anlage angeschlossen wird. Das könnte auch ein bidirektionales E-Auto sein.
....
Das wird alles in den nächsten Wochen/Monaten noch kommen und im Wiki erscheinen.


Zitat
Eine Anregung. Ich habe in ein paar Foren festgestellt, dass ich nicht der einzige bin der in der Abfrage des Modbuses etwas Mühe mit den Bezeichnungen hat. Wäre es hilfreich mit einem Alias eine Deutsche Bezeichnung anzuhängen.
Es wird sogar noch schlimmer :-( Ich habe seit gestern den zweiten WR aktiv, wodurch die Werte, die Kostal liefert nicht mehr stimmen.
Bei dieser Aktion werde ich einige readings direkt umbenennen, was ich schon länger plane.
Mit dem Schwarm (SW) kommen also noch mehr readings dazu, aber ich versuche es passend für die bisherige und die Schwarm Installation hin zu bekommen.

Bisher habe ich versucht mich so nah wie möglich an der englischen ModBus Beschreibung von Kostal zu halten, was aber echt ein mega Durcheinander ist.
Deshalb hatte ich mit v1.16 bereits begonnen z.B. die Batterie Werte neu zu ordnen, aber da ist noch viel Arbeit zu erledigen.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 März 2021, 09:10:21
Hey, in einem anderen Thread war noch eine Frage zur Komplexität, die ich hier nochmal posten möchte.

Zitat von: Dynalon am 28 März 2021, 23:41:29
Kurz: Der Kostal Plenticore erscheint mir als Laie sehr schwer einzurichten, SMA Wechselrichter hingegen eher einfach: Einfach die Anleitung im Wiki abtippen und läuft. Ist das so, oder irre ich mich?).

- Größe der Anlage wird Dachbedingt irgendwo zwischen 6 und 9kW liegen, ein Akku ist noch nicht vorgesehen, könnte aber in einigen Jahren nachgerüstet werden.
- Das Dach immer ganz voll machen und wenn es möglich wäre auch die Garage/Carport dazu nehmen.
- Wenn es ein Speicher sein soll (haben will ;-) ) , dann am besten sofort dazu. Mein Finanzamt hat ihn beim Plenticore als Gesamtkonzept (70%) Regelung anerkannt und die Mehrwertsteuer mit erstattet.
  Er sollte zum Hausverbrauch passen, aber auch im Winter noch genug bekommen, damit er wenigstens am Tag noch beisteuern kann.
  Ob sich ein Speicher amortisiert ist immer ein Diskussionspunkt :-)
- Lies Dir z.B. auf photovoltaikforum.com (https://www.photovoltaikforum.com/wissen/entry/2-faq-wertvolle-informationen-zu-pv-anlagengr%C3%B6%C3%9Fe-stromspeicher-wirtschaftlichkeit/#25c7c7c0-faq-teil-2) die FAQs vorher noch durch. Der Link ist nur ein Einstieg.
- Kostal ist glaube ich in der Preis/Leistung recht gut.

Nun zu FHEM:
- Der Plenticore erscheint Dir nur als komplex, weil ich auch alles drum herum für mich dort abgelegt habe.
- Die Basis Installation umfasst nur die Device definition für den ModBus, über den man auch gleichzeitig die KSEM Informationen geliefert bekommt. Somit braucht der KSEM nicht separat abgefragt werden.
- Etwas umfangreicher ist die Abfrage der Statistiken, die der Plenticore direkt von hause aus liefert, was nicht jeder WR macht.
  Bei der SMA Implementation hatte ich im FHEM noch diverse Statistiken für die Bilanz als separate Devices gesehen. Ob das dort momentan noch notwendig ist weiß ich nicht.
- Die Abfrage der Statistiken geht dann über ein zweites Device mit der API Schnittstelle, die aber gleichzeitig auch noch die externe Speicher Steuerung ermöglicht.

Bis hierher sind es also zwei Devices, für den WR inklusive Statistiken, den KSEM und den Speicher.
Ein Portal und eine APP gibt es auch. In der APP bekommt man einen Hinweis, was ein Speicher bringen würde, dann wäre es jedoch für die Mehrwertsteuer zu spät, da der Speicher nicht als Gesamtkonzept gekauft wurde.

- Alle anderen Funktionalitäten sind genau wie bei allen anderen WR ein Zusatz, der die Hausoptimierung betrifft.

- DbLog: Nach meiner Meinung fallen im laufe von mindestens 20 Jahren ziemlich viele Daten an, was ich nicht in einzelnen Dateien aufbereiten möchte.
- Eigenverbrauchsoptimierung ist recht wichtig, da sich dadurch die Amortisierung der Anlage verbessern lässt.  Hier habe ich diverse Beispiele dazu im Wiki bereit gestellt.
- Leistungsprognose geht schon in die Richtung der Königsdisziplin und ist nicht zwingend notwendig.
  Dafür braucht man auch Geräte, die man zuschalten kann und die große Mengen von Leistung aufnehmen können, oder man hat einfach Spaß daran :-)

Momentan arbeite ich an der Schwarm Steuerung mit zwei WR, da scheint es bei den Herstellern noch nicht so weit zu sein, denn die Statistiken und der Hausverbrauch wird nicht richtig berechnet.
Die Lieferung von zwei openWB Ladepunkten steht kurz bevor und wird somit auch noch mit einfließen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 April 2021, 10:11:01
Moin zusammen,
da ich nun schon mehrfach per PN angeschrieben wurde und es bei den Benutzernamen/Passworten fragen gegeben hat, kommt hier nochmal ein Versuch der Aufklärung:

in FHEM kann man den Device Namen frei wählen, wenn man meine Implementierung nachbaut, wäre es gut den Namen beizubehalten.

z.B. PV_1 oder WR_1, da ich in der Zwischenzeit bereits einen zweiten Wechselrichter habe. Meine heißen somit jetzt WR_1 und WR_2.
Manchmal stellt sich heraus, dass der Device Name oder readings doch besser anders genannte werden sollten, dann beschreibe ich im
Forum, wie man das ändern kann und Dman könnte dann fast 1zu1 die Komandos übernehmen.

>>  dass ich Dich richtig verstanden habe <Passwort> = key auf dem Gehäuse

Genau so ist es.

>>  Device Name wäre ablesbar auf der internen Wechselrichter Seite?  (Problem mein Plenticore blockiert Unterstriche)

Den Netzwerk Namen im Wechselrichter kann man so lassen wie er ist. Bei zwei Wechselrichtern sollte man unterschiedliche Namen wählen. Hierbei habe ich WR-1 und WR-2 gewählt, das der "_" und auch Umlaute nicht genommen werden hängt mit der Namensauflösung im TCP/IP vorwiegend in Windows Netzwerken zusammen.

>> und für "user" muß ich den aus dem Portal (..@ .. ) oder den "Anlagenbetreiber" nehmen  ?

Am Plenticore verwendt man für die Oberfläche den "Anlagenbetreiber". Dies ist eine interne Rolle des Benutzernamens "user", was man dort aber nicht sehen kann.
Für die Anmeldung mit dem WR_1_API Device im FHEM wird deshalb auch der Benutzername "user" verwendet.

Die Anmeldung im Portal oder mit der Handy APP ist eine vollständig separate Angelegenheit. Dort hat man einen eigenen Benutzernamen vergeben, der oft einer E-Mail Adresse entspricht. Das Passwort ist auch frei wählbar und hat nichts mit der Weboberfläche des Plenticore zu tun.


VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 April 2021, 10:15:46
Und nun noch ein Punkt.
Die neu hinzugekommenen Anwender, die also einen frisch ausgelieferten Wechselrichter haben sollten bitte als erstes einen Firmware Update machen. Stand heute sind wir bei v1.18 . Der Hintergrund ist, dass mit einer der letzten Versionen zusätzliche Register dazu gekommen sind. Dies betrifft insbesondere die API , die ansonsten zuwenig Register liefert und dann bei der Auswertung im FHEM nicht alles anzeigt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 April 2021, 16:49:34
Soooo, Ihr stillen Mitleser  ;D
Ich habe heute das komplette Wiki überarbeitet und auf meine letzte Implementierung aktualisiert.
Natürlich kann das ganze auch weiterhin mit einem einzelnen Wechselrichter verwendet werden. Solltet Ihr da Probleme erkennen, dann meldet Euch bitte.

Für alle die, die gerne auf die aktuelle Benennung der Devices und readings folgen möchten werde ich noch Beispiele für die Umbenennung in der Datenbank bereitstellen. Einiges ist schon weiter vorne in diesem Thread zu finden.

Das ist übrigens auch eine Vorbereitung für die Integration meiner bestellten openWB Ladepunkte, falls Ihr da auch etwas geplant habt.

Es lohnt sich auf jeden Fall die Wiki Seite nochmals zu  lesen, da auch hier und da neue Tips aus dem bisherigen Support eingeflossen sind.

Viele Grüße
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 April 2021, 10:36:09
Hallo zusammen,
ich habe mal im Wiki die Links zur Hersteller Dokumentation und Firmware aktualisiert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 April 2021, 12:42:18
Hallo zusammen,
im Photovoltaik Forum werden es immer mehr, die einen zweiten WR und Speicher haben. Ich denke der Weg für Euch mit der Umbenennung wäre keine schlechte Idee.
Seit gestern habe ich im Wiki auch schon etwas für die Umbenennungen im Allgemeinen aufgenommen. Das ist aber noch work in progress :-)
Wenn_man_mal_etwas_umbenennen_möchte (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Wenn_man_mal_etwas_umbenennen_m.C3.B6chte)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 April 2021, 12:44:16
Für die Umfrage zum Stammtisch wäre es schön, wenn Ihr mir Euro Wünsche/Ideen als PN schickt. Ich fasse es dann zusammen und Poste es dann hier wieder als sortierte Zusammenfassung.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 April 2021, 16:45:47
Und noch etwas Kosmetik...
in der Solar-forecast() Funktion lief der Forcast nur bis 19:00 Uhr, das habe ich auf 20:00 Uhr verlängert, dann geht die Kurve im Sommer auch wieder bis 0 runter :-)
Hier ist die Stelle im Code

     # Es werden Stundenwerte von 07:00 bis 20:00 Uhr berechnet
     for ($i = 7; $i <= 20; $i++) {


EDIT:
Und noch eine kleine Änderung, für die die das Mittagshoch verwenden.
Heute war die Situation, das es ein kleines Hoch in der Prognose gab, danach war die nächste Stunde wieder niedrig und dann kam nochmal eine Überschreitung hinterher.
Das Mittagshoch hat hier nur die Zeit von 11-15 Uhr angegeben. Durch die Änderung setze ich es bei einem weiteren Hoch nochmal zurück und nehme das nächste auch noch mit rein.
So kommt dann für heute eine zeit von 11-17 Uhr raus, in der der Speicher dann mit 1000 Watt (ist in der Konfig einstellbar) geladen wird. Hierdurch verringert sich die steile Ladestufe nach 15:00 Uhr im angehängten Diagramm.

Hier sind die Code Zeilen, die auch schon im Wiki sind.

       if ( $logdb ne "none" ) {
         CommandSet(undef, $logdb." addCacheLine ".$timestamp."|".$logdevice."|addlog|".$reading.": ".$logentry1h."|".$reading."|".$logentry1h."|") ;

         if ( $middayhigh == 0 and $logentry1h > $Inverter_Max_Power ) {
           $middayhigh       = 1;
           $middayhigh_start = sprintf("%02d:00",$i-1);
           CommandSetReading(undef, $logdevice." Solar_middayhigh_fc".$fc." ".$middayhigh) ;
           CommandSetReading(undef, $logdevice." Solar_middayhigh_fc".$fc."_start ".$middayhigh_start) ;
         };
         if ( $middayhigh == 1 and $logentry1h < $Inverter_Max_Power and $middayhigh_stop eq "00:00" )  {
           $middayhigh_stop  = sprintf("%02d:00",$i);
           CommandSetReading(undef, $logdevice." Solar_middayhigh_fc".$fc."_stop ".$middayhigh_stop) ;
         };
         if ( $middayhigh == 1 and $logentry1h > $Inverter_Max_Power and $middayhigh_stop ne "00:00" )  {
           $middayhigh_stop  = "00:00";                             # da war ein kurzer Einbruch, es sollte noch länger sein.
         };
         ##   print($i." ".$logentry1h." ".$middayhigh." ".$middayhigh_start." ".$middayhigh_stop."\n");
       };
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 April 2021, 11:16:17
Hallo zusammen,
ich räume gerade die Datenbank bezüglich des Übergangs von einem WR zum Schwarm auf. Wie ja jetzt bekannt ist stimmen einige Werte dann nicht mehr, die ich mit den SW_* readings korrigiert habe.
Nun solltet Ihr euch fragen, ob Ihr Eure Installation so lasst  wie sie ist, oder ob Ihr im zuge der Vereinheitlichung auch auf die SW_* readings wechselt. Meine zukünftigen Anpassunge beziehen sich nun natürlich im weiteren auf die SW_* readings.

Schaut man sich die SW_* userreadings an, so sieht man, dass dort der WR_2 mit einem Default Wert 0 verrechnet wird. Somit hat es keinen Einfluss, wenn Ihr nur einen WR habt. Somit könnte die Implementierung für zwei oder auch nur für einen WR verwendet werden, was ich gedanklich auch so beibehalten möchte. Die Auswirkungen gehen natürlich bis in alle anderen Devices herein. Im Wiki habe ich ein Kapitel "Wenn man mal etwas umbenennen möchte" (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Wenn_man_mal_etwas_umbenennen_m.C3.B6chte) begonnen, wo alles zu diesem Thema eingepflegt werden soll. Dort werde ich dann auch Beispiele für die Datenbank Bereinigungen ablegen.

Ihr habt nun halt die Wahl, alle zukünftigen Änderungen jeweils wieder auf Eure alte Implementierung zurück zu führen, oder jetzt schon vorzusehen, dass es eventuell auch mal zwei AC-Quellen geben wird.
Einige von Euch haben ja auch schon gemerkt, wieviel Mehraufwand es ist auch nur schon den Device Namen bei jedem Update auf einen eigenen zurück zu führen. Leute es ist Frühjahrsputz angesagt :-)

Wann Kostal das mal in der Firmware gerade zieht und welche Änderungen daraus wieder entstehen kann ich natürlich nicht vorhersagen.

Für die zukunft bin ich mir noch nicht ganz sicher, ob ich nur die SW_* readings in die Datenbank schreiben möchte, oder ob ich auch jeden einzelnen Wechselrichter sehen möchte. Durch das DbLogInclude laufen momentan beide Werte in Datenbank, also z.B. Home_own_consumption.* und SW_Home_own_consumption.* , was bei nur einem einzelnen Wechselrichter identisch ist und somit doppelt.

DbLogInclude
Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Home_own_consumption.*,P_DC1,P_DC2,Total_DC_P.*,Total_DC_PV_Energy.*,Total_PV_P_reserve,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*


Eure Meinung dazu wäre mir auch wichtig.

EDIT:
Grundlegende SQLs sind nun bereits im Wiki

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 April 2021, 16:51:08
Hallo zusammen,
wer außer mir steuert denn noch in das Schwarm Problem?
Oder schreibe ich hier mitlerweile nur noch für mich :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 14 April 2021, 19:22:24
Ich werde im Laufe des Jahres auch 2 WRs haben - den Kostal mit Batterie und nen SMA. Dann wird die Berechnung der Produktion / Verbrauch auch komplexer. Aber ich habe nicht Dein volles Setup. War mit zuviel Kram. Allerdings wäre es schon interessant, wenn es ein Template gibt, um mehrere Quellen/Senken zu verrechnen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 April 2021, 21:45:16
Zitat von: papa am 14 April 2021, 19:22:24
Ich werde im Laufe des Jahres auch 2 WRs haben - den Kostal mit Batterie und nen SMA. Dann wird die Berechnung der Produktion / Verbrauch auch komplexer. Aber ich habe nicht Dein volles Setup. War mit zuviel Kram. Allerdings wäre es schon interessant, wenn es ein Template gibt, um mehrere Quellen/Senken zu verrechnen.
Wenn da nur nicht das Problem mit dem Namensstandard gäbe :-) Das war mit ein Grund, warum ich nicht zwei Hersteller haben wollte.
Aber ja, ich verfeinere noch und das Prinzip sollte man verwenden können.
Bei Dir wäre es dann eventuell sinnvoll z.B. in einem Dummy den Schwarm abzubilden und dort von den AC-Quellen beide WR zu vereinen.
Aus der DB kann man natürlich auch alles mit SQL berechnen, das wäre aber für die sofort Bilanz ein overkill.

Das volle Setup ist ja auch nicht nur Wechselrichter :-) Im Prinzip habe ich meine Dokumentation ins Wiki verlagert.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 April 2021, 19:11:27
Hallo zusammen,
ich habe das Wiki nun mit den Erweiterungen für den Schwarm oder mehrere AC-Quellen aktualisiert. Für diejenigen, die nur einen Wechselrichter betreiben gibt es auch einige Hinweise, falls Ihr nicht die komplette Definition übernehmen möchtet. Dann entsteht jedoch bei jedem Update wieder erneuter Aufwand, es sollte allerdings auch mit der vollen Definition für nur einen WR laufen, da die SW_* Definitionen dann halt die Werte vom WR_1 beinhalten.

Schaut es Euch bitte an und gebt mir bescheid, wenn ich wirres Zeug geschrieben habe.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 April 2021, 19:16:30
Zitat von: papa am 14 April 2021, 19:22:24
Ich werde im Laufe des Jahres auch 2 WRs haben - den Kostal mit Batterie und nen SMA. Dann wird die Berechnung der Produktion / Verbrauch auch komplexer. Aber ich habe nicht Dein volles Setup. War mit zuviel Kram. Allerdings wäre es schon interessant, wenn es ein Template gibt, um mehrere Quellen/Senken zu verrechnen.
Wenn Du im WR_1 und WR_1_API die Stellen im userReading, die auf den WR_2 und WR_2_API zeigen mit den passenden readings vom SMA anpasst, dann sollte das auch mit unterschiedlichen Herstellern funktionieren.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 19 April 2021, 20:46:42
Zitat von: ch.eick am 19 April 2021, 19:16:30
Wenn Du im WR_1 und WR_1_API die Stellen im userReading, die auf den WR_2 und WR_2_API zeigen mit den passenden readings vom SMA anpasst, dann sollte das auch mit unterschiedlichen Herstellern funktionieren.
Puuh ... muss ich mir mal bei Gelegenheit in Ruhe ansehen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 April 2021, 22:34:01
Zitat von: papa am 19 April 2021, 20:46:42
Puuh ... muss ich mir mal bei Gelegenheit in Ruhe ansehen.
Gerne :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 April 2021, 14:56:07
Grüezi :-)
Ich habe die Speicher Steuerung nochmals etwas verfeinert. Da meine Anlage nun ziemlich Power hat beginnt der Speicher bereits um 07:00 Uhr zu laden, was ich nun durch eine Zeitvorgabe auf 09:00 Uhr verschoben habe.
Die Zeit ist variabel im WR_1_Speicher_1_ExternTrigger:SpeicherMidday_NotBefore einstellbar. Änderungen sind wie immer im Wiki, aber hier nochmals eine Zusammenfassung.


attr WR_1_Speicher_1_ExternTrigger readingList ExternTrigger SpeicherCmdRepeatActive SpeicherZeitStart SpeicherZeitEnde SpeicherEntladung SpeicherTrigger SpeicherMiddayControlActive SpeicherMidday_Inverter_Max_Power SpeicherMidday_MaxChargePowerAbs_morning SpeicherMidday_MaxChargePowerAbs_midday SpeicherMidday_MaxSOC SpeicherMidday_NotBefore SpeicherMinSOC_Sommer SpeicherMinSOC_Winter SpeicherMinSOC_fc1_Limit SpeicherMaxSOCControlActive SpeicherMaxSOC_Actual SpeicherMaxSOC_DayBefore SpeicherMaxSOC_fc1_Limit


attr WR_1_Speicher_1_ExternTrigger setList ExternTrigger:frei,gesperrt SpeicherCmdRepeatActive:0,1 SpeicherZeitStart:time SpeicherZeitEnde:time SpeicherEntladung:Automatik,Zeit,Trigger SpeicherTrigger:entladen,gesperrt,none SpeicherMiddayControlActive:0,1 SpeicherMidday_Inverter_Max_Power:slider,3000,500,20000 SpeicherMidday_MaxChargePowerAbs_morning:slider,0,100,4700 SpeicherMidday_MaxChargePowerAbs_midday:slider,100,100,4700 SpeicherMidday_MaxSOC:slider,20,5,50 SpeicherMidday_NotBefore:time SpeicherMinSOC_Sommer:slider,5,1,20 SpeicherMinSOC_Winter:slider,5,1,20 SpeicherMinSOC_fc1_Limit:slider,7000,500,17000 SpeicherMaxSOCControlActive:0,1 SpeicherMaxSOC_Actual:slider,60,5,100 SpeicherMaxSOC_DayBefore:slider,15,5,100 SpeicherMaxSOC_fc1_Limit:slider,10000,2000,50000

setreading WR_1_Speicher_1_ExternTrigger SpeicherMidday_NotBefore 09:00

Die Verschiebung wirkt sich nur aus, wenn das Mittagshoch verwendet wird, weil dann sehr viel Leistung erwartet wird.
Im WR_1_Speicher_1_ExternControl ist es diese Stelle beim cmd_6

< snip >

if ([WR_1_Speicher_1_ExternTrigger:SpeicherMiddayControlRunning] == 1 ) {    ## Wurde ein Mittagshoch ermittelt und aktiviert?

      if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1_Speicher_1_ExternTrigger:SpeicherMidday_NotBefore]") ) {
        CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");     ## nicht vor 09:00 Uhr starten. Ladung auf 0 Watt setzen
        if (AttrVal("$SELF","verbose",0) >=3) {                            ## Es wird nur langsam geladen und MaxSOC limitiert.
          Log 3, "WR_1_Speicher_1_ExternControl cmd_6  : SpeicherMiddayControl vor 09:00 Uhr noch nicht laden";
        };
      } else {
        if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_start]") ) {   ## Ist noch Vormittag?
          CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs [WR_1_Speicher_1_ExternTrigger:SpeicherMidday_MaxChargePowerAbs_morning]");
          CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [WR_1_Speicher_1_ExternTrigger:SpeicherMidday_MaxSOC]");
          if (AttrVal("$SELF","verbose",0) >=3) {                            ## Es wird nur langsam geladen und MaxSOC limitiert.
            Log 3, "WR_1_Speicher_1_ExternControl cmd_6  : SpeicherMiddayControl vor [WR_1:Solar_middayhigh_fc0_start] limitieren";
            Log 3, "WR_1_Speicher_1_ExternControl cmd_6  : Battery_ExternControl_MaxChargePowerAbs auf [WR_1_Speicher_1_ExternTrigger:SpeicherMidday_MaxChargePowerAbs_morning] limitiert";
            Log 3, "WR_1_Speicher_1_ExternControl cmd_6  : Battery_ExternControl_MaxSOC auf [WR_1_Speicher_1_ExternTrigger:SpeicherMidday_MaxSOC] % limitiert";
          };
        };
      };

< snip >


Beispiel:
Wir ein Mittagshoch von 11:00 - 16:00 Uhr ermittelt und die SpeicherMidday_NotBefore Zeit steht auf 09:00 Uhr, dann wird bis 09:00 Uhr nicht geladen, danach bis um 11:00 mit geringer Leistung.
Zwischen 11:00 und 16:00 Uhr mit höherer Leistung und danach ohne Limitierung bis MaxSOC erreicht ist. Die MaxSOC Limitierung kann aktiviert werden, muss aber nicht.

Bitte denkt daran, dass die Werte im Wiki auf meine Anlage angepasst sind und Ihr diese dann einstellen müsst. Ich habe jetzt 18 kWp mit einem Speicher von 9,3 kW. Die Wärmepumpe spielt momentan keine Rolle.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 24 April 2021, 08:03:08
Guten Morgen allerseits!

Christian, hast du eigentlich schon ein Angebot für einen Jobwechsel von/zu Kostal erhalten?  ;)
Ist ja gewaltig was du hier auf die Beine gestellt hast!

Ich hätte noch eine Frage, oder Anliegen, oder Bedürfnis zur Umsetzung an dich:
Wäre es möglich, einen Wochentag Abhängigen Min_MaxSOC einzubauen?
Hintergrund:

Meine Frau arbeitet immer an den gleichen Wochentagen und die Kinder haben immer am gleichen Tag Fussballtraining und bringen Dreckwäsche nach Hause. Sprich sie mach z.B. am Dienstagabend spät noch eine Wäsche und lässt den Tumbler laufen. Dies kann sie nicht am Mittwoch bei Sonne mache, da sie dann wiederum arbeiten muss den ganzen Tag. Daher wäre es schlecht, wenn am Dienstag der MaxSOC z.B auf 70% berechnet werden würde...

Ich würde daher gerne einstellen können im ExternTrigger dummy:
Min_MaxSOC Montag: z.B. 70
Min_MaxSOC Dienstag: z.B. 95
Min_MaxSOC Mittwoch: z.B. 70
Min_MaxSOC Donnerstag: z.B. 70
Min_MaxSOC Freitag: z.B. 90 (auch erfahrungsgemäss ein Waschabend)

Weisst du was ich meine? Lässt sich das irgendwie umsetzen?

Gruss und bis bald

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 April 2021, 08:56:12
Zitat von: Mumpitz am 24 April 2021, 08:03:08
Christian, hast du eigentlich schon ein Angebot für einen Jobwechsel von/zu Kostal erhalten?  ;)
Ist ja gewaltig was du hier auf die Beine gestellt hast!
Danke für das Lob, aber in meinem Alter wechselt man nicht einfach nur aus Spaß ;-)

Zitat
Ich hätte noch eine Frage, oder Anliegen, oder Bedürfnis zur Umsetzung an dich:
Wäre es möglich, einen Wochentag Abhängigen Min_MaxSOC einzubauen?
Hintergrund:

Meine Frau arbeitet immer an den gleichen Wochentagen und die Kinder haben immer am gleichen Tag Fussballtraining und bringen Dreckwäsche nach Hause. Sprich sie mach z.B. am Dienstagabend spät noch eine Wäsche und lässt den Tumbler laufen. Dies kann sie nicht am Mittwoch bei Sonne mache, da sie dann wiederum arbeiten muss den ganzen Tag. Daher wäre es schlecht, wenn am Dienstag der MaxSOC z.B auf 70% berechnet werden würde...

Ich würde daher gerne einstellen können im ExternTrigger dummy:
Min_MaxSOC Montag: z.B. 70
Min_MaxSOC Dienstag: z.B. 95
Min_MaxSOC Mittwoch: z.B. 70
Min_MaxSOC Donnerstag: z.B. 70
Min_MaxSOC Freitag: z.B. 90 (auch erfahrungsgemäss ein Waschabend)
Wenn wir bei Dir die Mittagshoch und MaxSoc Konfiguration eingerichtet haben, wird gegen 7:00 Uhr ein neuer MaxSoc berechnet, der sich nach dem Vortag und dem Überschuss um diese Uhrzeit richtet.
Diesen MaxSoc kannst Du natürlich jeder Zeit z.B. mit einem weekDayTimer wieder überschreiben, oder noch dynamischer z.B. 5% für Waschmaschine und Trockner aufaddieren.
Werte von über 100% sollten auf 100% gesetzt werden, ich habe jedoch gerade auch das WR_1_Speicher_1_ExternControl korrigiert, dass das nicht zum WR geschickt würde.
Das kommt dann in einem größeren Update ins Wiki, da ich gerade die MaxSoc Limitierung noch teste ;-)

Am nächsten Tag wird dann wieder neu berechnet.
Hier der schematische Ablauf

06:53 Berechnung des MaxSoc
09:00 setreading WR_1_Speicher_1_ExternTrigger SpeicherMaxSOC_Actual [WR_1_Speicher_1_ExternTrigger:SpeicherMaxSOC_Actual] +5
          Dies kann durch einen weeDayTimer oder auch mit einem DOELSEIF im WR_1_Speicher_1_ExternControl erfolgen, am besten dann ganz aum Ende, damit es zu keiner Verschiebung der cmd_* kommt
20:07 Reset durch WR_1_Speicher_1_ExternControl cmd_8 auf "SpeicherMaxSOC_Actual 100"

Nächster Tag:
06:53 Berechnung des MaxSoc wieder auf Basis von 100% zum Delta um diese Uhrzeit und dem Wert vom Vortag, der dann aber nicht die +5% beinhaltet
09:00 hier kommt wieder Dein Waschtag zum Zuge
20:07 Reset ...


Ist also alles schon drin, nur eine Frage der Konfiguration :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 27 April 2021, 16:04:41
Hallo an alle geneigten Mitleser :-)

Momentan laufen die Speicher Steuerung Tests und es sieht schon sehr gut aus.

Nebenbei habe ich mal geschaut, wie man das Schattenmanagement über die API verwenden kann:
Im WR_1_API Device gibt es nun ein weiteres get und set für das Schattenmanagement.
Weiterhin kann man es dann nun variabel aktivieren und deaktivieren, was ich momentan im WR_1_Speicher_1_ExternControl untergebracht habe.
In diesem Beispiel wird um 21:00 Uhr das Schattenmanagement für den Ost String (1) aktiviert, was dann um 8:00 Uhr morgens wieder abgeschaltet wird. Zu diesem Zeitpunkt ist bei mir dann alles Schattenfrei.
Ab 18:00 Uhr kommt dann der Schatten vom Nachbarhaus auf den unteren String im Westen, bei dem ich dann das Schattenmanagement aktiviere.

################################################################################################################
## 1 Speicher Status vom WR_1_Speicher_1 aktualisieren.
##   Dies geschieht über das WR_1_API Device, da der Speicher direkt am Wechselrichter angeschlossen ist.
##
([:58])

   ({
     CommandGet(undef, "WR_1_API 21_Battery_Information");
     CommandGet(undef, "WR_1_API 22_Battery_InternControl");
     CommandGet(undef, "WR_1_API 23_Battery_ExternControl");
     CommandGet(undef, "WR_1_API 25_Battery_EM_State");

     ## Schattenmanagement
     if ($hour == 8)   {
       CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 0");                             ## Komplett aus
     };
     if ($hour == 18) {
       CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 2");                             ## Im Westen unten einschalten
     };
     if ($hour == 21) {
       CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 1");                             ## Schattenmanagement für den Osten vorbereiten
     };
    };
   )

Bei einer Schwarm installation muss man das natürlich dann für alle Wechselrichter einrichten und die Steuerung dann auf die Strings anpassen.
Die Aktivierung kann natürlich auch nach dem Astro Device erfolgen, oder man stellt es einmal ein und lässt es dann bestehen. Dann bekommt man aber ca alle 10 Minuten einen kurzen mess Peak im Diagramm.

In den angehängten Diagrammausschnitten sieht man dann den Unterschied am Morgen. Am Abend ist leider kein Effekt zu sehen, weil dort mein Dach horizontal in zwei Strings geteilt ist.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 27 April 2021, 16:51:31
Zitat von: ch.eick am 27 April 2021, 16:04:41
Hallo an alle geneigten Mitleser :-)

Momentan laufen die Speicher Steuerung Tests und es sieht schon sehr gut aus.

Nebenbei habe ich mal geschaut, wie man das Schattenmanagement über die API verwenden kann:
Im WR_1_API Device gibt es nun ein weiteres get und set für das Schattenmanagement.
Weiterhin kann man es dann nun variabel aktivieren und deaktivieren, was ich momentan im WR_1_Speicher_1_ExternControl untergebracht habe.
In diesem Beispiel wird um 21:00 Uhr das Schattenmanagement für den Ost String (1) aktiviert, was dann um 8:00 Uhr morgens wieder abgeschaltet wird. Zu diesem Zeitpunkt ist bei mir dann alles Schattenfrei.
Ab 18:00 Uhr kommt dann der Schatten vom Nachbarhaus auf den unteren String im Westen, bei dem ich dann das Schattenmanagement aktiviere.

################################################################################################################
## 1 Speicher Status vom WR_1_Speicher_1 aktualisieren.
##   Dies geschieht über das WR_1_API Device, da der Speicher direkt am Wechselrichter angeschlossen ist.
##
([:58])

   ({
     CommandGet(undef, "WR_1_API 21_Battery_Information");
     CommandGet(undef, "WR_1_API 22_Battery_InternControl");
     CommandGet(undef, "WR_1_API 23_Battery_ExternControl");
     CommandGet(undef, "WR_1_API 25_Battery_EM_State");

     ## Schattenmanagement
     if ($hour == 8)   {
       CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 0");                             ## Komplett aus
     };
     if ($hour == 18) {
       CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 2");                             ## Im Westen unten einschalten
     };
     if ($hour == 21) {
       CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 1");                             ## Schattenmanagement für den Osten vorbereiten
     };
    };
   )

Bei einer Schwarm installation muss man das natürlich dann für alle Wechselrichter einrichten und die Steuerung dann auf die Strings anpassen.
Die Aktivierung kann natürlich auch nach dem Astro Device erfolgen, oder man stellt es einmal ein und lässt es dann bestehen. Dann bekommt man aber ca alle 10 Minuten einen kurzen mess Peak im Diagramm.

In den angehängten Diagrammausschnitten sieht man dann den Unterschied am Morgen. Am Abend ist leider kein Effekt zu sehen, weil dort mein Dach horizontal in zwei Strings geteilt ist.

VG
   Christian

Kannst du uns unwissenden erklären was das Schattenmanagement genau macht?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 27 April 2021, 17:04:21
Zitat von: Mumpitz am 27 April 2021, 16:51:31
Kannst du uns unwissenden erklären was das Schattenmanagement genau macht?
Das Schattenmanagement ist eine Funktionalität des Plenticore, dass versucht den jeweiligen String bei Beschattung zu optimieren.
In meinen Diagrammen kannst Du sehen, das morgens gegen 8:00 Uhr ein richtiger Sprung in der DC Leistung gewesen ist. Das war als der Schatten vom Nachbarhaus von den untersten Modulen verschwunden ist.
Ein Schatten auf einem Modul in einem String kann den ganzen String in der Leistung runterziehen. Das Schattenmanagement versucht das auszugleichen.
Dazu wird jedoch ca alle 10 Minuten eine Messung in den Strings gemacht, während derer natürlich die Leistung kurz weg ist. Bei Anlagen mit starker Verschattung kann die Anlage jedoch mit Schattenmanagement in Summe mehr liefern als ohne.
Ich habe es nur mit eingebaut, damit halt manchmal was neues kommt :-) , die 2kWh bei 9ct bringen bei mir in 30 Jahren nicht so sehr viel mehr an Einnahmen.

2kWh x 100 Tage/a x30 Jahre x 0,09 => 54€  :-) :-) :-) die eine Hälfte lege ich gewinnbringend an und von der Anderen gehe ich in 30 Jahren mal ein Eis Essen ;-) oder auch schon eher.

Du kannst es auch als Anlagenbetreiber über das Web Interface einschalten, oder jetzt auch mit dem WR_1_API Device.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 April 2021, 15:08:18
Moin zusammen,
heute war ein blöder PV Tag, zuerst hatte ich durch Tests den Speicher zu wenig geladen und dann auch noch das Wetter :-)

Positiv ist jedoch, dass durch die Prognose keine Speicherbeeinflussung vorgenommen wurde.

2021.04.29 06:53:00.005 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_Actual wird nicht begrenzt            <<<<<<<<< klar, ich habe es kaput gespielt ;-) und der Speicher war leer.
2021.04.29 06:53:00.006 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMiddayControl es wird kein Middayhigh geben

Das hat dann zur folge, dass von schlechtem Wetter ausgegangen wird und der Speicher mit jedem Überschuss bis zu Soc 100% geladen wird.
Hierbei ist die "inteligente Speichersteuerung" von Kostal abgeschaltet. Wäre sie aktiv würde wahrscheinlich erst ab mittags geladen wodurch der Speicher, als er gebraucht wurde noch leer gewesen wäre.

Die vielen Spitzen im Diagramm sind wechselnde Bewölkung und Regen, sowie der Herd in der Küche.
Zwischen grün und orange ist die Einspeisung für die Nachbarn.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 29 April 2021, 15:57:03
Zitat von: ch.eick am 29 April 2021, 15:08:18

Hierbei ist die "inteligente Speichersteuerung" von Kostal abgeschaltet. Wäre sie aktiv würde wahrscheinlich erst ab mittags geladen wodurch der Speicher, als er gebraucht wurde noch leer gewesen wäre.


Ist eigentlich die intelligente Batteriesteuerung per Befehl aus fhem heraus aktivier- / dekativerbar? Wenn ja wäre das allenfalls noch etwas was man einbauen könnte....
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 April 2021, 16:28:26
Ich habe mal wieder etwas aufgeräumt, da man ja nie auslernt.

Der Hintergrund ist, dass ich im DOIF den FHEM Modus mit Perl gemischt verwende und dadurch zuviel Klammern verwendet habe.
WR_1_Speicher_1_ExternControl (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#RAW_Definition_des_WR_1_Speicher_1_ExternControl)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 April 2021, 16:44:59
Zitat von: Mumpitz am 29 April 2021, 15:57:03
Ist eigentlich die intelligente Batteriesteuerung per Befehl aus fhem heraus aktivier- / deaktivierbar? Wenn ja wäre das allenfalls noch etwas was man einbauen könnte....
Ist bereits drin ;-)

set WR_1_API 22_06_Battery_Strategy [1|2]                     ### Automatisch | Automatisch ökonomisch
set WR_1_API 22_05_Battery_SmartBatteryControl_Enable [0|1]   ### intelligente Steuerung aktiv | deaktiv

Dieses get wird automatisch nach einem set ausgeführt. Wurde am WR geändert kann man es mit einem get aktualisieren.
get WR_1_API 22_Battery_InternControl
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Mai 2021, 10:44:30
Hallo zusammen,
es gibt im Wiki eine Korrektur für das WR_1_API Device: WR_1_API_Master (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#RAW_Definition_des_WR_1_API_Master_ab_v1.16)
Im userreadings fehlten noch einige Trigger bei den SW_* , wodurch es in der Folge zu einer Vielzahl von DbLog Einträgen gekommen ist und in einigen Fällen auch zu einer Division durch Null.

Für die, die später auch das Grafana Dashboard verwenden möchten besteht weiterhin die Empfehlung auf die letzte Namensgebung im Wiki zu migrieren.
Der Aufwand das im Grafana JSON File zu adaptieren ist schon recht hoch und ich werde mich auch dort auf die SW_* readings beziehen.
Das Original muss für unsere Zwecke auch noch auf MySQL umgeschrieben werden, wo ich momentan dran bin. Desweiteren gibt es auch noch von anderen Nutzern eine Abwandlung mit anderen Bildern und anderer Anordnung.

Das Dashboard wurde im Photovoltaik Forum von Bogeyof veröffentlicht, dem mein besonderer Dank gilt.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: xerion am 17 Mai 2021, 13:48:52
Moin zusammen,

ich hätte ein Frage zu den Readings. Was ist genau der Unterschied zwischen Current_SelfConsumptionRate undCurrent_AutarkyRate?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Mai 2021, 14:49:28
Zitat von: xerion am 17 Mai 2021, 13:48:52
Moin zusammen,

ich hätte ein Frage zu den Readings. Was ist genau der Unterschied zwischen Current_SelfConsumptionRate undCurrent_AutarkyRate?
Hallo xerion,

Current kann Strom bedeuten, aber diese readings habe ich nicht erstellt.
currently oder current als Adjektiv bedeutet momentan, was als Werte im stateFormat errechnet wird aber nicht als reading vorhanden ist.

Es gibt:

SW_Statistic_OwnConsumptionRate_Day - Der anteilige Eigenverbrauch an diesem Tag
SW_Statistic_Autarky_Day - Die anteilige Unabhängigkeit vom Netz

Beide Werte verändern sich über den Tag/Monat/Jahr (Day/Month/Year), wobei der letzte Wert in der entsprechenden Periode dann der Maßgebliche ist und alle anderen in der DbLog dann aufgeräumt werden sollten.
Achtung: es ist nicht unbedingt der Maximumwert der Periode.
Wenn ich z.B. am Mittag 100% autark bin, was nur mit einem Speicher geht, dann kann ich am ende des Tages auch nur 80% autark sein, weil eventuell Leistung aus dem Netz bezogen wurde und der Speicher leer war.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: xerion am 17 Mai 2021, 16:04:55
Zitat von: ch.eick am 17 Mai 2021, 14:49:28
Hallo xerion,

Current kann Strom bedeuten, aber diese readings habe ich nicht erstellt.
currently oder current als Adjektiv bedeutet momentan, was als Werte im stateFormat errechnet wird aber nicht als reading vorhanden ist.

Es gibt:

SW_Statistic_OwnConsumptionRate_Day - Der anteilige Eigenverbrauch an diesem Tag
SW_Statistic_Autarky_Day - Die anteilige Unabhängigkeit vom Netz

Beide Werte verändern sich über den Tag/Monat/Jahr (Day/Month/Year), wobei der letzte Wert in der entsprechenden Periode dann der Maßgebliche ist und alle anderen in der DbLog dann aufgeräumt werden sollten.
Achtung: es ist nicht umbedingt der Maximumwert der Periode.
Wenn ich z.B. am Mittag 100% autark bin, was nur mit einem Speicher geht, dann kann ich am ende des Tages auch nur 80% autark sein, weil eventuell Leistung aus dem Netz bezogen wurde und der Speicher leer war.

VG
   Christian

Sorry für die Verwirrung....falscher Thread.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Mai 2021, 16:14:11
Zitat von: xerion am 17 Mai 2021, 16:04:55
Sorry für die Verwirrung....falscher Thread.
Kein Problem, ist aber übertragbar ;-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Mai 2021, 11:08:15
Hallo zusammen,
nur damit Ihr nicht auch bei null anfangt. Ich adaptiere gerade ein Dashborad für Grafana mit der DbLog.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 19 Mai 2021, 13:35:54
Zitat von: ch.eick am 19 Mai 2021, 11:08:15
Hallo zusammen,
nur damit Ihr nicht auch bei null anfangt. Ich adaptiere gerade ein Dashborad für Grafana mit der DbLog.

VG
   Christian
Sieht hübsch aus. Sind die €3.48 die Einsparung der Energiekosten durch Speisung aus der PV-Anlage?

Was mir noch fehlen würde wäre eine Vorhersage des PV-Ertrags der nächsten 1/2/3 Stunden, damit man entscheiden kann, ob man die Waschmaschine und/oder den Trockner anschmeißt bzw. die Zoe auflädt.

VG Peter
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Mai 2021, 18:10:12
Zitat von: plin am 19 Mai 2021, 13:35:54
Sieht hübsch aus. Sind die €3.48 die Einsparung der Energiekosten durch Speisung aus der PV-Anlage?

Was mir noch fehlen würde wäre eine Vorhersage des PV-Ertrags der nächsten 1/2/3 Stunden, damit man entscheiden kann, ob man die Waschmaschine und/oder den Trockner anschmeißt bzw. die Zoe auflädt.
Hallo Peter,
ja, die 3.48 sind der Eigenverbrauch * EVU Preis, jedoch noch ohne Abzug der Erstehungskosten, also schön gerechnet für den WAF :-)
Den Bereich habe ich erst mal nur adaptiert, aber noch nicht weiter ausgebaut.

Von der Prognose ist bisher nur die Gesamt Prognose Leistung drin, die anderen Werte müsst eich noch platzieren, sind aber schon vorhanden.

Generell läuft bei mir alles erstmal automatisch, ohne dass ich eingreifen müsste.
Die WallBoxen kommen erst am Freitag, die würde ich als zusätzlichen Großverbraucher integrieren, aber da fehlt mir noch die Erfahrung und das E-Auto.
Wenn Du gute Regelungen aus der Erfahrung hast würde ich mich freuen. Also was sind die Kriterien für das Laden des Autos aus dem Verwendungsumfeld?
Beim Pool wäre es z.B.
- wann er warm sein soll
- im Winter alles an Energie rein
- und nachts z.B. mit AWattar zusätzlich Heizen
- Im Sommer nicht so lange, damit er nicht zu warm wird

Für jeden Verbraucher habe ich jetzt noch den Tagesverbrauch mit SQL vom shelly ermittelt.

Heute habe ich noch Bilder verändert und auf dem Dashboard platz geschaffen, um alles unterzukriegen.
Das ist ganz schön viel Arbeit...puuuuh.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 20 Mai 2021, 13:56:54
Zitat von: ch.eick am 19 Mai 2021, 18:10:12
Wenn Du gute Regelungen aus der Erfahrung hast würde ich mich freuen. Also was sind die Kriterien für das Laden des Autos aus dem Verwendungsumfeld?
Schau in den Himmel  ;)

Spaß beiseite. Ich versuche ja über KI eine bessere Vorhersage als die mehr oder weniger statische, auf Basis der DWD-Daten, Ausrichtung, Neigung etc. errechnete  hinzukriegen. Fazit: Erstens kommt es anders und zweitens als man denkt. Es kann immer noch passieren, dass ungeplant Wolken aufkommen oder sich der Himmel trübt. Heute hätte laut errechneter Vorhersage ein guter Ladetag sein sollen. Meine Zoe hängt am Strom und die Bedeckung drückt die Solarleistung auf einmal unter 1 kW. Stabile Wetterlagen mit durchgängig sonnigen Tagen ohne Wolken/Bedeckung sind zuverlässiger.

Ein gedanklicher Ansatz, den ich aber noch nicht ausprobiert habe (weil ich dachte der DWD würde bei seinen Daten derartige Effekte berücksichtigen): Windrichtung und Sonnenschein an umliegenden Orten. Das Modell ist aber komplizierter und man muss etwas rechnen. Stell Dir vor Du hast Messdaten von vielen wunderground-Wetterstationen im Umfeld Deines Wohnortes. Du kennst die Windrichtung und -gesschwindigkeit. Dann müsste man doch wissen welche Wolke in etwa bei mir vorbeikommt, wenn diese xx Minuten vorher bei einer anderen Wetterstation in Windrichtung vorbeikam und dort die Sonnenstrahlung reduziert hat. Ein Problem bilden natürlich Wolken die erst zwischen der anderen Wetterstation und Deinem Wohnort entstehen.

Ich laboriere also immer noch an einer brauchbaren Vorhersage herum die für eine automatische Entscheidung brauchbar wäre.

Angehängt ist mein aktueller Stand. Seit dem letzten Wochenende habe ich als zusätzlichen Messwert den Ertrag der letzten Stunde mit drin. Da alle Berechnungen auf den Stundentakt ausgerichtet sind, brauche ich neben der Zack-Zack-Kurve der aktuellen PV-Leisung einen Wert der mit dem der Vorhersage vergleichbar ist.

Die beiden aktuellen Modelle sind multiple lineare Regression (Forecast) und Random Forrest (Forecast1). Es fließen folgende Parameter in die Kalkulation ein:
Forecast:   ['Rad1h','Neff','Azimuth','Altitude','SunD1','VV']
Forecast1: ['Rad1h','Neff','R101','Azimuth','Altitude','SunD1','VV','N','DD','RRS1c']

Durch einen kleinen Fehler meinerseits habe ich nur ab Anfang Februar Ist-Werte. Die KI muss also noch weiter lernen ...

VG Peter



Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Mai 2021, 15:12:35
Zitat von: plin am 20 Mai 2021, 13:56:54
Ein gedanklicher Ansatz, den ich aber noch nicht ausprobiert habe (weil ich dachte der DWD würde bei seinen Daten derartige Effekte berücksichtigen): Windrichtung und Sonnenschein an umliegenden Orten. Das Modell ist aber komplizierter und man muss etwas rechnen. Stell Dir vor Du hast Messdaten von vielen wunderground-Wetterstationen im Umfeld Deines Wohnortes. Du kennst die Windrichtung und -gesschwindigkeit. Dann müsste man doch wissen welche Wolke in etwa bei mir vorbeikommt, wenn diese xx Minuten vorher bei einer anderen Wetterstation in Windrichtung vorbeikam und dort die Sonnenstrahlung reduziert hat. Ein Problem bilden natürlich Wolken die erst zwischen der anderen Wetterstation und Deinem Wohnort entstehen.

Ich laboriere also immer noch an einer brauchbaren Vorhersage herum die für eine automatische Entscheidung brauchbar wäre.
Okay, das wäre dann noch Prognose.
Durch die Automatische Korrektur aus der Datenbank bin ich schon sehr zufrieden, aber Du hast recht, die Schwankungen kann ich gerade im Frühjahr nicht abfangen.
Da wollte ich noch die Abriegelung vom WR mit rein bringen, die wird aber durch die FW beim Plenticore anscheinen nicht übermittelt. Es kommt nahezu immer der selbe Wert.
Das wäre jedoch nur ein Reagieren und keine Prognose.

Zitat
Angehängt ist mein aktueller Stand. Seit dem letzten Wochenende habe ich als zusätzlichen Messwert den Ertrag der letzten Stunde mit drin. Da alle Berechnungen auf den Stundentakt ausgerichtet sind, brauche ich neben der Zack-Zack-Kurve der aktuellen PV-Leisung einen Wert der mit dem der Vorhersage vergleichbar ist.

Die beiden aktuellen Modelle sind multiple lineare Regression (Forecast) und Random Forrest (Forecast1). Es fließen folgende Parameter in die Kalkulation ein:
Forecast:   ['Rad1h','Neff','Azimuth','Altitude','SunD1','VV']
Forecast1: ['Rad1h','Neff','R101','Azimuth','Altitude','SunD1','VV','N','DD','RRS1c']

Durch einen kleinen Fehler meinerseits habe ich nur ab Anfang Februar Ist-Werte. Die KI muss also noch weiter lernen ...
Das klinngt spannend :-)
Es wird also eine weiterführende Vorhersage der letzten Stunden. Da ich den Forecast fc0 stündlich mit dem DWD aktualisiere könnte man das als Korrektur aus den letzten Stunden noch drüberrechnen. Dadurch wäre dann meine Autokorrektur etwas agressiver.
Wenn ich bei mir den Zeitraum von 30 Tagen auf 7 Tage verkürze könnte die Autokorrektur auch schneller reagieren. Das wäre mal einen Versuch wert.

Ein zweiter Gedanke wäre die Tagessumme der Prognose mit der Tagessumme des WR auch noch mit rein zu nehmen, da die Schwankungen in den letzten Wochen doch sehr starke Spitzen hatte.


Das war jedoch nicht die Antwort auf  meine Frage ;-) Mir ging es eher in die Nutzungsdefinition des E-Autos und Kriterien anden man das fest machen kann.

- Arbeitsplan meiner Frau aus dem Kalender
- Ein Signal, dass man morgen spontan einen Ausflog plant und die Karre voll sein soll.
- ...

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 20 Mai 2021, 15:14:02
Noch eine ganz kühne Idee:

Eine Webcam in den Himmel richten,
- aufgrund der Farben (blau, hellgrau, dunkelgrau, ...) und Helligkeit feststellen wie das Wetter ist,
- auf Grund der Wechselgeschwindigkeit der Farben die Windgeschwidigkeit und somit die Qualität der Vorhersage
ermitteln.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 20 Mai 2021, 15:17:52
Zitat von: ch.eick am 20 Mai 2021, 15:12:35
Das war jedoch nicht die Antwort auf  meine Frage ;-) Mir ging es eher in die Nutzungsdefinition des E-Autos und Kriterien anden man das fest machen kann.

- Arbeitsplan meiner Frau aus dem Kalender
- Ein Signal, dass man morgen spontan einen Ausflog plant und die Karre voll sein soll.
- ...
Ah, das ist Deine Erwartungshaltung. Die ist bei mir einfach: Home Office seit März letzten Jahres. Ich bin somit relaiv frei in der Wahl des Ladezeitfensters, da stehen genug zur Verfügung. Und wenn's Auto gebraucht wird ist halt Schluss mit Laden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Mai 2021, 15:25:47
Zitat von: plin am 20 Mai 2021, 15:14:02
Noch eine ganz kühne Idee:

Eine Webcam in den Himmel richten,
- aufgrund der Farben (blau, hellgrau, dunkelgrau, ...) und Helligkeit feststellen wie das Wetter ist,
- auf Grund der Wechselgeschwindigkeit der Farben die Windgeschwidigkeit und somit die Qualität der Vorhersage
ermitteln.

Ich bräuchte eine Analysefunktion, die eine Zackige Kurve mit Peaks von einer norml glatten Kurve unterscheidet.
Oder wie beim NILM aus den Messwerten ein Gerät identifiziert. Dabei wäre wechselhaftes Wetter besagte zackige Kurve aus der PV Leistung.
Ich habe da schon einiges zu gelesen, jedoch fehlt mir die Mathematik dazu, wie man aus Messpunkten sowas abliest.
Eine Idee wäre die Messwerte über die Zeit als Hash abzulegen. Aber kann man Hash Codes vergleichen, ob sie z.B 90% nah dran sind?
Bei mp3s habe ich sowas früher schon mal in einer Freeware angewendet um Ablen zu erkennen und den ID3 Tag zu setzen.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Mai 2021, 15:28:54
Zitat von: plin am 20 Mai 2021, 15:17:52
Ah, das ist Deine Erwartungshaltung. Die ist bei mir einfach: Home Office seit März letzten Jahres. Ich bin somit relaiv frei in der Wahl des Ladezeitfensters, da stehen genug zur Verfügung. Und wenn's Auto gebraucht wird ist halt Schluss mit Laden.
Das ist bei mir auch so, aber die Frau hat halt noch Besorgungen zu erledigen. Da hoffte ich auf noch weitere Entscheidungskriterien.
Nach meiner Aufrüstung wäre das E-Auto eh schnell voll ;-) , aber man möchte ja den Accu schonen.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Mai 2021, 15:31:46
Zitat
Stell Dir vor Du hast Messdaten von vielen wunderground-Wetterstationen im Umfeld Deines Wohnortes. Du kennst die Windrichtung und -gesschwindigkeit.
Das nutze ich bereits mit drei Stationen für die Beschattung mit den Rollos. Nur ist das ja keine Prognose, also nur reaktiv.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 20 Mai 2021, 17:42:27
Zitat von: ch.eick am 20 Mai 2021, 15:31:46
Das nutze ich bereits mit drei Stationen für die Beschattung mit den Rollos. Nur ist das ja keine Prognose, also nur reaktiv.
So war's nicht gedacht. Die Stationen müssen weit genug entfernt sein, um eine Prognose für einen Vorhersagezeitraum von z.B. 3 Stunden zu geben. Das reicht dann zunächst mal für die Waschmaschine, den Trockner etc. .
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Mai 2021, 19:29:54
Zitat von: plin am 20 Mai 2021, 17:42:27
So war's nicht gedacht. Die Stationen müssen weit genug entfernt sein, um eine Prognose für einen Vorhersagezeitraum von z.B. 3 Stunden zu geben. Das reicht dann zunächst mal für die Waschmaschine, den Trockner etc. .
Okay, jetzt kann ich folgen.

Das ist bei mir jedoch nicht sooo relevant, da ich bei der Steuerung eine Verzögerungszeit für einen stabilen Wert habe, die sich bei nicht erfüllen jeweils verschiebt und den Rest glättet der Speicher.
Durch eine früheste Start und eine Stoppzeit laufen die Geräte sobald es passt los. Für eine manuellen Start gibt es den WAF Taster neben der Steckdose, der jedoch noch nie zum Einsatz kam :-)

Ich versuche immer die Logiken und die Prognose so simpel wie möglich zu halten. Durch Eure Ideen mit der Leistung für 4h, Day und Rest of Day sind ja jetzt schon die Möglichkeiten sehr vielfältig.
Bisher konnte ich jede Anfrage vom Typ - Wie kann ich das denn umsetzen - beantworten. Meistens hat man gar nicht die Gerät, die man für eine bestimmte Verbrauchskurve benötigen würde im Haushalt.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 21 Mai 2021, 09:32:38
Zitat von: plin am 20 Mai 2021, 15:14:02
Noch eine ganz kühne Idee:

Eine Webcam in den Himmel richten,
- aufgrund der Farben (blau, hellgrau, dunkelgrau, ...) und Helligkeit feststellen wie das Wetter ist,
- auf Grund der Wechselgeschwindigkeit der Farben die Windgeschwidigkeit und somit die Qualität der Vorhersage
ermitteln.

http://www.nubiscope.de/

Es gibt auch eine Beschreibung auf der DWD-Seite. Es bleibt also zu hoffen, dass die Informationen in die DWD-MOSMIX-Daten einfließen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ozwo am 24 Mai 2021, 18:38:04
Hallo in die Runde,

vielen Dank an Christian für die tolle Arbeit im Umgang mit FHEM und Plenticore!

Ich nutze die Infos aus dem Wiki nun auch seit einigen Wochen für meine PV-Anlage (Kostal Plenticore Plus 8.5 mit BVD Speicher und KSEM).
Bisher konnte ich alle Schritte nachvollziehen und es hat auch prima funktioniert.

Allerdings habe ich seit dem letzten Update im Wiki folgenden Fehler im Log:
2021.05.24 18:25:04.402 3: WR_1: CreateDataObjects unpack of 0038 with f> for Battery_Actual_SOC resulted in undefined value
2021.05.24 18:25:04.802 3: WR_1: CreateDataObjects unpack of 017f with f> for Inverter_Generation_P_Actual resulted in undefined value
2021.05.24 18:25:04.949 3: WR_1: CreateDataObjects unpack of 0004 with N for Battery_Type resulted in undefined value


Hat jemand eine Idee, warum es für diese drei Objekte mit dem Lesen nicht mehr klappt? Da ich meine FHEM-Konfig in Github aufbewahre, konnte ich diesbzgl. auch keine Änderung in der Konfiguration nachvollziehen. Beim Plenticore habe ich die neue FW installiert, die nun auch automatische Updates macht - kann sich auf Seiten des WR etwas geänderten haben?

Anderes Thema:
In dem Grafana Dashboard aus dem Wiki werden für "Forecast/Prognose" die beiden Readings "Solar_Calculation_fc0" und "Solar_Calculation_fc1" referenziert. Diese gibt es aber in WR_1 gar nicht. Wie komme ich an die Werte? Oder habe ich hier etwas falsch verstanden?

Danke und Grüße
Oliver

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 Mai 2021, 19:10:31
Hallo Oliver,
herzlich willkommen :-)

Zitat von: ozwo am 24 Mai 2021, 18:38:04
Ich nutze die Infos aus dem Wiki nun auch seit einigen Wochen für meine PV-Anlage (Kostal Plenticore Plus 8.5 mit BVD Speicher und KSEM).
Bisher konnte ich alle Schritte nachvollziehen und es hat auch prima funktioniert.

Allerdings habe ich seit dem letzten Update im Wiki folgenden Fehler im Log:
2021.05.24 18:25:04.402 3: WR_1: CreateDataObjects unpack of 0038 with f> for Battery_Actual_SOC resulted in undefined value
2021.05.24 18:25:04.802 3: WR_1: CreateDataObjects unpack of 017f with f> for Inverter_Generation_P_Actual resulted in undefined value
2021.05.24 18:25:04.949 3: WR_1: CreateDataObjects unpack of 0004 with N for Battery_Type resulted in undefined value


Hat jemand eine Idee, warum es für diese drei Objekte mit dem Lesen nicht mehr klappt? Da ich meine FHEM-Konfig in Github aufbewahre, konnte ich diesbzgl. auch keine Änderung in der Konfiguration nachvollziehen. Beim Plenticore habe ich die neue FW installiert, die nun auch automatische Updates macht - kann sich auf Seiten des WR etwas geänderten haben?
Ich habe noch die Version 1.18 , ab der ein Autoupdate eingeführt wurde.

Software-Version_IO-Controller_IOC 01.45 2021-05-24 19:06:00
Software-Version_Maincontroller_MC 01.47 2021-05-24 19:06:00

Schau mal bitte nach Deiner Version, da gerade die 1.19 raus gekommen ist. Die habe ich mir noch nicht angesehen.
Falls Du einen downgrade machen möchtest, habe ich die alten Versionen noch bei mir auf dem Rechner. Dann bitte eine PN.


Zitat
Anderes Thema:
In dem Grafana Dashboard aus dem Wiki werden für "Forecast/Prognose" die beiden Readings "Solar_Calculation_fc0" und "Solar_Calculation_fc1" referenziert. Diese gibt es aber in WR_1 gar nicht. Wie komme ich an die Werte? Oder habe ich hier etwas falsch verstanden?
Die readings Solar_* werden durch die Leistungsprognose mit der Funktion Solar_forecast(), erzeugt, die Du dann wohl noch nicht verwendest.

Toll, dass Du schon so weit gekommen bist.

Bitte beachte, dass ich bereits eine Schwarm Installation habe und mich somit immer auf die SW_* readings beziehe. Die sollten dann bei Dir die selben Werte beinhalten, wie die reading Namen ohne "SW_" .

Kannst Du mir dazu mal eine Rückmeldung geben, da nicht alle Anwender den wechsel bereits gemacht haben.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ozwo am 24 Mai 2021, 20:48:33
Hallo Christian,
vielen Dank für die ersten Ausführungen.

ZitatSchau mal bitte nach Deiner Version, da gerade die 1.19 raus gekommen ist. Die habe ich mir noch nicht angesehen.
Falls Du einen downgrade machen möchtest, habe ich die alten Versionen noch bei mir auf dem Rechner. Dann bitte eine PN.
Ich bin schon auf 1.19.
Software-Version_IO-Controller_IOC 01.55
Software-Version_Maincontroller_MC 01.55

Das schaue ich mir dann noch gesondert an - ich würde beim WR erstmal bei der 1.19 bleiben. Falls der Zusammenhang hier überhaupt stimmt und ich nicht einen anderen Fehler habe.

ZitatDie readings Solar_* werden durch die Leistungsprognose mit der Funktion Solar_forecast(), erzeugt, die Du dann wohl noch nicht verwendest.
Doch - ich verwende auch die Solar_forecast()-Funktion. Die Readings sind auch im WR_1 (Solar_Calculation, Solar_Calculation_f0_07/08/usw.). Also die kompletten Stunden/4h/Tageswerte. Aber die in Grafana benutzten Solar_Calculation_fc0/1 genau nicht...

Im Zusammenhang mit der Solar_forecast() habe ich auch noch ein interessantes Phänomen:
Es wird ja pro Durchlauf des Forecasts der "Solar_Correction_Faktor_auto" in die DB geschrieben - als Stundenwert. Bei mir wird aber der Zeileneintrag nicht überschrieben, sondern jeweils ein neuer Eintrag erzeugt. Hänge ich mal als Screenshot an.

Das gibt dann natürlich in Solar_forecast() an folgender Stelle einen Fehler, weil immer alle Werte für die ausgewählte Stunde zurückgegeben werden:
       if ($autocorrection ne 0) {
         $Solar_Correction_Faktor_auto = CommandGet(undef, $logdbrep." sqlCmdBlocking SELECT VALUE FROM history WHERE DEVICE='".$logdevice."' AND READING='Solar_Correction_Faktor_auto' AND TIMESTAMP='".sprintf("%4d-%02d-%02d %02d:00:00",$year,$mon,$mday,$i)."';") ;
       if($Solar_Correction_Faktor_auto eq "") { $Solar_Correction_Faktor_auto = 1; };
       };


Mein Workaround dazu ist aktuell ein "SELECT DISTINCT" an dieser Stelle. Tut nicht so weh, füllt aber unnötig die DB...
Dazu habe ich aber auch noch keine Ursache finden können...ist ja immer so eine Sache mit dem Reverse-Engineering...

ZitatBitte beachte, dass ich bereits eine Schwarm Installation habe und mich somit immer auf die SW_* readings beziehe. Die sollten dann bei Dir die selben Werte beinhalten, wie die reading Namen ohne "SW_" .

Kannst Du mir dazu mal eine Rückmeldung geben, da nicht alle Anwender den wechsel bereits gemacht haben.

Klar, gerne: Die SW_*-Readings sind bei mir mit einem Wechselrichter anscheinend alle identisch zu den passenden Readings ohne SW_ gefüllt. Das scheint also prima zu passen und man muss offenbar die Konfig nicht weiter anpassen. WR_2 habe ich gar nicht angelegt.



Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 Mai 2021, 21:43:08
Zitat von: ozwo am 24 Mai 2021, 20:48:33
Doch - ich verwende auch die Solar_forecast()-Funktion. Die Readings sind auch im WR_1 (Solar_Calculation, Solar_Calculation_f0_07/08/usw.). Also die kompletten Stunden/4h/Tageswerte. Aber die in Grafana benutzten Solar_Calculation_fc0/1 genau nicht...

Im Zusammenhang mit der Solar_forecast() habe ich auch noch ein interessantes Phänomen:
Es wird ja pro Durchlauf des Forecasts der "Solar_Correction_Faktor_auto" in die DB geschrieben - als Stundenwert. Bei mir wird aber der Zeileneintrag nicht überschrieben, sondern jeweils ein neuer Eintrag erzeugt. Hänge ich mal als Screenshot an.

Das gibt dann natürlich in Solar_forecast() an folgender Stelle einen Fehler, weil immer alle Werte für die ausgewählte Stunde zurückgegeben werden:
       if ($autocorrection ne 0) {
         $Solar_Correction_Faktor_auto = CommandGet(undef, $logdbrep." sqlCmdBlocking SELECT VALUE FROM history WHERE DEVICE='".$logdevice."' AND READING='Solar_Correction_Faktor_auto' AND TIMESTAMP='".sprintf("%4d-%02d-%02d %02d:00:00",$year,$mon,$mday,$i)."';") ;
       if($Solar_Correction_Faktor_auto eq "") { $Solar_Correction_Faktor_auto = 1; };
       };


Mein Workaround dazu ist aktuell ein "SELECT DISTINCT" an dieser Stelle. Tut nicht so weh, füllt aber unnötig die DB...
Dazu habe ich aber auch noch keine Ursache finden können...ist ja immer so eine Sache mit dem Reverse-Engineering...
Prüfe mal, ob Du auch einen primary Key definiert hast, damit sollte es keine doppelten Einträge in der DB geben.
EDIT: Du hast definitiv die Definition bezüglich duplicate key nicht gemacht, bzw Du hast keinen primary Key definiert. Das kann man nachholen, ist jedoch etwas Arbeit.


Dann schau Dir das LogDBRep_PV_Forecast_SQL Device nochmal an, denn das ist das Bindeglied für Solar_forecast() zur Datenbank.
In der Solar_forecast() Funktion ist etwas SQL drin, das mit einem "INSERT INTO ...... ON DUPLICATE KEY UPDATE" die Einträge über das LogDBRep_PV_Forecast_SQL Device berechnet und einträgt.
Die Parametrisierung ist über dieses Attribut möglich.
@reading2 ist der reading Name, den Du vermisst.

sqlCmdVars
SET @days:=30, @corr:=0.7, @diff:=0, @temp:=0, @device:='WR_1', @reading1:='SW_Total_DC_P_sumOfAllPVInputs', @reading2:='Solar_Calculation_fc0', @readingname:='Solar_Correction_Faktor_auto' ;


In einer mysql Session kannst Du den Vorgang testen

## Auswertung WR_1 Prognose der letzten 30 Tage
## Differenz und Faktor zwischen fc0 und Realit\u00e4t mit D\u00e4mpfung von *0.7 und Limitierung bei 1.6
##
## Das wird einmal gesetzt
MySQL [fhem]> SET @device='WR_1';
MySQL [fhem]> SET @reading1='SW_Total_DC_P_sumOfAllPVInputs';
MySQL [fhem]> SET @reading2='Solar_Calculation_fc0';
MySQL [fhem]> SET @readingname='Solar_Correction_Faktor_auto';

## Ein List der Solar_Calculation_fc0 , die durch die Solar_forecast() Funktion geschrieben werden, was am addlog zu erkennen ist.
## Bei der DbLog muss der cache aktive sein!
 
MySQL [fhem]> SELECT * FROM history WHERE DEVICE=@device AND READING=@reading2 AND TIMESTAMP >= CURDATE();
+---------------------+--------+--------+-------+-----------------------+-------+------+
| TIMESTAMP           | DEVICE | TYPE   | EVENT | READING               | VALUE | UNIT |
+---------------------+--------+--------+-------+-----------------------+-------+------+
| 2021-05-24 07:00:00 | WR_1   | addlog |       | Solar_Calculation_fc0 | 2447  |      |
| 2021-05-24 08:00:00 | WR_1   | addlog |       | Solar_Calculation_fc0 | 5013  |      |
| 2021-05-24 09:00:00 | WR_1   | addlog |       | Solar_Calculation_fc0 | 6872  |      |
< snip >
| 2021-05-24 18:00:00 | WR_1   | addlog |       | Solar_Calculation_fc0 | 2183  |      |
| 2021-05-24 19:00:00 | WR_1   | addlog |       | Solar_Calculation_fc0 | 1706  |      |
| 2021-05-24 20:00:00 | WR_1   | addlog |       | Solar_Calculation_fc0 | 251   |      |
+---------------------+--------+--------+-------+-----------------------+-------+------+
14 rows in set (0.097 sec)

## Vor jedem Durchlauf werden diese Variablen gesetzt
MySQL [fhem]> SET @diff=0;SET @temp=0;SET @corr=0.7;SET @days=30;

## Eine Abfrage der aktuellen Einträge ginge so
MySQL [fhem]> SELECT * FROM history WHERE DEVICE=@device AND READING=@readingname AND TIMESTAMP >= CURDATE();
+---------------------+--------+------+-------+------------------------------+-------+------+
| TIMESTAMP           | DEVICE | TYPE | EVENT | READING                      | VALUE | UNIT |
+---------------------+--------+------+-------+------------------------------+-------+------+
| 2021-05-24 06:00:00 | WR_1   | NULL | NULL  | Solar_Correction_Faktor_auto | 1.3   | NULL |
| 2021-05-24 07:00:00 | WR_1   | NULL | NULL  | Solar_Correction_Faktor_auto | 0.8   | NULL |
< snip >
| 2021-05-24 20:00:00 | WR_1   | NULL | NULL  | Solar_Correction_Faktor_auto | 0.3   | NULL |
+---------------------+--------+------+-------+------------------------------+-------+------+
15 rows in set (0.138 sec)
>>>>> hier darf jeder Eintrag nur einmal vorhanden sein, ansonsten ist in der DB kein primary key definiert!!!

## Eine Aktualisierung wird mit dem SQL aus der Solar_forecast() gemacht. Achtung, die Formatierung innerhalb von Perl ist etwas anders wegen der Sonderzeichen.

## Hier der original SQL Code
INSERT INTO history
(TIMESTAMP,DEVICE,READING,VALUE)
  SELECT
    TIMESTAMP,DEVICE,READING,VALUE
  FROM (
    SELECT
      DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP,
      t2.DEVICE,
      @readingname                              AS READING,
      cast(if(avg(t2.FACTOR) > 1.6, 1.6,
              avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE
    FROM (
      SELECT * FROM (
        SELECT
          t1.TIMESTAMP,
          t1.HOUR,
          t1.DEVICE,
          t1.READING,
          t1.VALUE,
          if(@diff  = 0,NULL, @temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF,
          cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(2,1))         AS FACTOR,
          @diff:=t1.VALUE                                                    AS curr_V
        FROM (
          SELECT
            TIMESTAMP,
            date(TIMESTAMP) AS DATE,
            hour(TIMESTAMP) AS HOUR,
            DEVICE,
            READING,
            VALUE
          FROM history
          WHERE DEVICE    =  @device
            AND (READING  =  @reading1 OR READING = @reading2)
            AND TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY)
            AND TIMESTAMP <= CURDATE()
            AND MINUTE(TIMESTAMP) = 0
            AND VALUE >= 0
          GROUP BY DATE,HOUR,READING
         )t1
       )tx
        WHERE
          READING != @reading2
     )t2
      GROUP BY t2.HOUR
   )t3
    WHERE
      t3.VALUE != 0
    ON DUPLICATE KEY UPDATE
      VALUE=t3.VALUE;

Query OK, 0 rows affected, 27 warnings (5.708 sec)
Records: 15  Duplicates: 0  Warnings: 27

## Dann wieder den SELECT zum Anschauen

## Für einen neuen Lauf zuerst wieder die Variablen setzen ( s.o.)

Das wäre dann jetzt ein Test für die Berechnung der Autokorrektur.


[/quote]
Klar, gerne: Die SW_*-Readings sind bei mir mit einem Wechselrichter anscheinend alle identisch zu den passenden Readings ohne SW_ gefüllt. Das scheint also prima zu passen und man muss offenbar die Konfig nicht weiter anpassen. WR_2 habe ich gar nicht angelegt.
[/quote]
Okay super, dann klappt das ja so wie ich es mir gedacht hatte. Wenn WR_2 nicht da ist zieht der Default von 0 in den userreadings.

Ich teste dann mal bald die v1.19, denn Kostal ändert schon gerne mal die ModBus Register. Wenn Du da fit bist, kannst Du natürlich gerne auch die richtigen unpack suchen und dann posten.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Mai 2021, 17:32:44
Hallo Oliver,
es geht nochmal um diese readings
Zitat

2021.05.24 18:25:04.402 3: WR_1: CreateDataObjects unpack of 0038 with f> for Battery_Actual_SOC resulted in undefined value
2021.05.24 18:25:04.802 3: WR_1: CreateDataObjects unpack of 017f with f> for Inverter_Generation_P_Actual resulted in undefined value
2021.05.24 18:25:04.949 3: WR_1: CreateDataObjects unpack of 0004 with N for Battery_Type resulted in undefined value


Das Register Battery_Actual_SOC scheint bisher nur in der Dokumentation aufgenommen worden zu sein.
Der gewünschte Wert ist jedoch im reading Act_state_of_charge zu finden und wird momentan dort auch von mir verwendet.
Dieses Register lasse ich ermal noch definiert, da Kostal in den letzten Versionen für die Batterie einiges geändert hat. Eventuell kommt da ja noch was.
Die BA_KOSTAL_Interface_MODBUS-TCP_SunSpec.pdf Dokumentation wurde zu letzt im Dezember aktualisiert.


Das Register Inverter_Generation_P_Actual scheint es noch zu geben, es kommt jedoch immer 0.00

Wenn man das löscht bekommt man die 0.00
deleteattr WR_1 obj-h575-len 1

Dann sollte das reading entstehen:
Inverter_Generation_P_Actual 0.00

Ich werde es jedoch im Wiki einfach löschen:

deleteattr WR_1 obj-h575-len
deleteattr WR_1 obj-h575-reading



Bei diesem Register kommt kein Wert: Battery_Type
Jedoch ist die Information im WR_1_API:Battery_InternControl_Type verfügbar.

deleteattr WR_1 obj-h588-format
deleteattr WR_1 obj-h588-len
deleteattr WR_1 obj-h588-reading
deleteattr WR_1 obj-h588-unpack


Leider beinhalten die ModBus Register und die API Abfragen teilweise falsche und auch unterschiedliche Inhalte, obwohl sie gleich sein sollten. Ich hatte dazu in Bezug auf die Batterie bereits mal eine Anfrage an Kostal geschickt, die auch mit einer Nachfrage beantwortet wurde, nur konnte es wohl dort niemand nachvollziehen :-)

Bei der nächsten Version der Kostal Dokumentation werde ich dann mal wieder aufräumen.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ozwo am 25 Mai 2021, 17:47:13
Hallo Christian,

hab' gerade Feierabend und wollte mich später nochmal an das Thema setzen - jetzt kommst Du mir netterweise zuvor.

Zitates geht nochmal um diese readings

Interessant - vielen Dank für die Infos dazu. Wundern tut mich aber schon, dass die Readings ja so schon auch (zumindest seit ich die Lösung nutze) im WR_1 eingetragen sind, bisher aber keine Fehlermeldungen dazu kamen...
...solange die (fehlenden) Readings keine Auswirkungen auf den Rest der Konfig haben, passt es ja...

Was die Datenbankeinträge angeht:
ZitatPrüfe mal, ob Du auch einen primary Key definiert hast, damit sollte es keine doppelten Einträge in der DB geben.
EDIT: Du hast definitiv die Definition bezüglich duplicate key nicht gemacht, bzw Du hast keinen primary Key definiert. Das kann man nachholen, ist jedoch etwas Arbeit.
Ich hatte bereits vor dem Einrichten des Plenticore nach Deiner Anleitung eine LogDB im Einsatz, mich aber bisher nie weiter mit dem Thema beschäftigt bzw. nur mal rudimentär grafisch ausgewertet, wann es bei unserer lokalen Tanke besonders günstig ist...
...jetzt mit Photovoltaik und Grafana beginnt das Thema ja erst richtig spannend zu werden.
Die Doku zum DBLog habe ich mir aber nie tiefer angeschaut und in Deinem Wiki steht ja auch nur "sollte vorhanden sein"...

Lange Rede, kurzer Sinn: hast Du einen Hinweis, wie ich die DB bzgl. Primary Key auf Stand bringen kann? Ggf. lege ich auch eine neue DB an, falls das einfacher sein sollte. Daten kann man dann ja per Export/Import immer noch übertragen.

Danke und Grüße
Oliver
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Mai 2021, 18:51:16
Zitat von: ozwo am 25 Mai 2021, 17:47:13
Was die Datenbankeinträge angeht:Ich hatte bereits vor dem Einrichten des Plenticore nach Deiner Anleitung eine LogDB im Einsatz, mich aber bisher nie weiter mit dem Thema beschäftigt bzw. nur mal rudimentär grafisch ausgewertet, wann es bei unserer lokalen Tanke besonders günstig ist...
...jetzt mit Photovoltaik und Grafana beginnt das Thema ja erst richtig spannend zu werden.
Die Doku zum DBLog habe ich mir aber nie tiefer angeschaut und in Deinem Wiki steht ja auch nur "sollte vorhanden sein"...

Lange Rede, kurzer Sinn: hast Du einen Hinweis, wie ich die DB bzgl. Primary Key auf Stand bringen kann? Ggf. lege ich auch eine neue DB an, falls das einfacher sein sollte. Daten kann man dann ja per Export/Import immer noch übertragen.

Zuerst immer ein Backup machen :-)

Hiermit kannst Du prüfen, ob Du duplicate keys hast:

SELECT
  TIMESTAMP, COUNT(TIMESTAMP),
  DEVICE, COUNT(DEVICE),
  READING, COUNT(READING)
FROM history
GROUP BY
  TIMESTAMP,
  DEVICE,
  READING
HAVING COUNT(TIMESTAMP)>1
  AND COUNT(DEVICE)>1
  AND COUNT(READING)>1;

## So kannst Du den Key abfragen

MySQL [fhem]> show index from history where Key_name = 'PRIMARY' ;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| history |          0 | PRIMARY  |            1 | TIMESTAMP   | A         |    10658576 |     NULL | NULL   |      | BTREE      |         |               |
| history |          0 | PRIMARY  |            2 | DEVICE      | A         |    10658576 |     NULL | NULL   |      | BTREE      |         |               |
| history |          0 | PRIMARY  |            3 | READING     | A         |    10658576 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+


Dann noch den Key über mehrere Spalten eintragen

ALTER TABLE history ADD PRIMARY KEY(TIMESTAMP,DEVICE,READING);

Nun werden Fehler auftreten, wenn vorher nicht die doppelten Einträge gelöscht wurden.

Dann müssen natürlich noch die doppelten Einträge gelöscht werden, was die meiste Zeit brauchen wird.

Beim Export/Import musst Du aber auch manuell tausende Einträge löschen.
Wenn es nur die Solar_* Einträge sind, auf die kannst Du sicherlich einfach verzichten. Was interessiert schon die Prognose der letzten Wochen :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Mai 2021, 19:18:54
Nabääänd,

ich habe jetzt bereits auf die Version 1.19 aktualisiert und bisher keine Probleme festgestellt.

Sollte übrigens mal der WR den Zugang sperren, so steht folgendes reading auf 1

auth_me_locked 1

Dann einfach auf das Web Gui des Plenticore und das Passwort wieder zurück setzen. Gefragt wird nach dem Master Key, den ich dann auch wieder als Passwort setze.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ozwo am 25 Mai 2021, 20:59:31
Hi Christian,

vielen Dank für's Vorkauen...

Ich habe es nun wie folgt gelöst (falls noch jemand anders mal in die Verlegenheit kommt):

Alles ohne Gewähr - ich bin kein DB-Spezi.
Denkt immer dran: Kein Backup, kein Mitleid...

## 1. Doppelte Einträge finden:
SELECT
  TIMESTAMP, COUNT(TIMESTAMP),
  DEVICE, COUNT(DEVICE),
  READING, COUNT(READING)
FROM history
GROUP BY
  TIMESTAMP,
  DEVICE,
  READING
HAVING COUNT(TIMESTAMP)>1
  AND COUNT(DEVICE)>1
  AND COUNT(READING)>1;

## 2.) Temporäre history-Tabelle anlegen

CREATE TABLE temp_history LIKE history;

## 3.) Primary Key für temp_history erstellen

ALTER TABLE temp_history ADD PRIMARY KEY(TIMESTAMP,DEVICE,READING);

## 4.) Daten ohne Duplikate kopieren:

INSERT INTO temp_history
(SELECT * FROM history
GROUP BY
  timestamp,
  device,
  reading
);

## 4a.) temp_history mit Kommando aus 1.) auf doppelte Einträge checken => es sollte keine geben...

## 5.) Original-history löschen
DROP TABLE history;

## 6.) Temp-history zu history machen
RENAME TABLE temp_history TO history;


Nochmal dank an Christian,

Grüße
Oliver

P.S.: ich habe die Chance genutzt und zwischendrin noch einige Uralt-Einträge aus der DB gelöscht...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Mai 2021, 11:56:22
Moin,
ich habe in der plenticore_auth() einen kleinen Schönheitsfehler beseitigt.
Ihr könnt die Zeile auch einzeln austauschen. Das beseitigt eine Fehlermeldung im Log bei einer Neuanmeldung am WR.

fhem "setreading ".$logdevice."  auth_randomString64 ".$u ;

ersetzen durch...

CommandSetReading(undef, $logdevice." auth_randomString64 ".$u) ;

Danach ein "reload 99_myUtils"

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Mai 2021, 12:03:31
Und noch eine Frage für einen Stammtisch:

1. Wann würdet Ihr es bevorzugen? Innerhalb der Woche oder am WE
2. Welches Tool für Videopräsentationen ist Euch geläufig?

Rückmeldung bitte per PN, ich fasse das Ergebnis dann zusammen.

EDIT: Die Entscheidung für's Tool ist gefallen, es wird Zoom
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 27 Mai 2021, 12:37:45
Moin,

es wieder Zeit etwas aufzuräumen. Alle, die bereits die letzte WR_1 Device Definition laufen haben werden sicher bemerkt haben, dass nun einige Werte doppelt in der DbLog erscheinen.
Dies hatte ich so gemacht, um festzustellen ob die SW_* Werte okay sind auch wenn man nur einen WR betreibt.
Durch Oliver ist dies ja nun bestätigt worden, sodass das Logging der nicht mehr verwendeten readings nun abgeschaltet werden kann.

Hierbei müsst Ihr natürlich vorher prüfen, ob alle Werte aus der Zeit bevor die SW_* readings eingeführt wurden auch entsprechend umbenannt wurden.
Meine Grafana Diagramme und das Dashboard beziehen sich nur noch auf die SW_* readings, was also auch bei nur einem WR funktionieren sollte.

Aktuelle Definition

attr WR_1 DbLogInclude Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Home_own_consumption.*,P_DC1,P_DC2,Total_DC_P.*,Total_DC_PV_Energy.*,Total_PV_P_reserve,Total_Active_P_EM,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*,Inverter_state.*


SW_* readings

SW_Home_own_consumption
SW_Home_own_consumption_from_Battery
SW_Home_own_consumption_from_PV
SW_Home_own_consumption_from_grid
SW_Total_AC_Active_P
SW_Total_DC_P
SW_Total_DC_P_Max
SW_Total_DC_P_sumOfAllPVInputs
SW_Total_PV_P_reserve
SW_Yield_Daily
SW_Yield_Monthly
SW_Yield_Total
SW_Yield_Yearly


Doppelte readings

Home_own_consumption.*
Total_DC_P
Total_DC_P_Max
Total_DC_P_sumOfAllPVInputs
Total_PV_P_reserve       


Neue DbLogInclude definition

attr WR_1 DbLogInclude Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,P_DC1,P_DC2,Total_DC_PV_Energy_sumOfAllPVInputs,Total_Active_P_EM,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*


mysql Abfrage aller readings eines Devices innerhalb eines Tages

SET @device = 'WR_1';
SELECT t1.TIMESTAMP,t1.DEVICE,t1.READING,t1.VALUE
  FROM history t1
  INNER JOIN
   (SELECT max(TIMESTAMP) AS TIMESTAMP,DEVICE,READING
      FROM history
      WHERE DEVICE    = @device AND
            TIMESTAMP > NOW() - INTERVAL 1 DAY
      GROUP BY READING) x
  ON x.TIMESTAMP = t1.TIMESTAMP AND
     x.DEVICE    = t1.DEVICE    AND
     x.READING   = t1.READING;

+---------------------+--------+----------------------------------------------------+------------+
| TIMESTAMP           | DEVICE | READING                                            | VALUE      |
+---------------------+--------+----------------------------------------------------+------------+
| 2021-05-27 11:29:02 | WR_1   | Actual_Battery_charge_-minus_or_discharge_-plus_P  | 11         |
| 2021-05-27 10:59:00 | WR_1   | Actual_Battery_charge_usable_P                     | 5914       |
| 2021-05-27 10:00:05 | WR_1   | Act_state_of_charge                                | 76.00      |
| 2021-05-27 11:25:02 | WR_1   | Battery_temperature                                | 21.20      |
| 2021-05-27 09:21:06 | WR_1   | Battery_Total_AC_ChargeEnergy_ACsideToBattery      | 1720.42    |
| 2021-05-27 09:21:06 | WR_1   | Battery_Total_AC_ChargeEnergy_gridToBattery        | 1369.31    |
| 2021-05-27 11:26:07 | WR_1   | Battery_Total_AC_DischargeEnergy_BatteryToGrid     | 899685.38  |
| 2021-05-27 11:26:07 | WR_1   | Battery_Total_DC_ChargeEnergy_DCsideToBattery      | 711192.31  |
| 2021-05-27 11:26:07 | WR_1   | Battery_Total_DC_DischargeEnergy_DCsideFromBattery | 645357.38  |
| 2021-05-27 11:30:01 | WR_1   | Home_own_consumption_from_Battery                  | 0.80       |
| 2021-05-27 10:39:01 | WR_1   | Home_own_consumption_from_grid                     | 0.00       |
| 2021-05-27 11:30:01 | WR_1   | Home_own_consumption_from_PV                       | 273.20     |
| 2021-05-27 11:30:03 | WR_1   | P_DC1                                              | 1659.09    |
| 2021-05-27 11:30:03 | WR_1   | P_DC2                                              | 1412.15    |
| 2021-05-27 11:00:01 | WR_1   | Solar_Calculation                                  | 2539       |
| 2021-05-27 20:00:00 | WR_1   | Solar_Calculation_fc0                              | 347        |
| 2021-05-27 11:00:02 | WR_1   | Solar_Calculation_fc0_4h                           | 11128      |
| 2021-05-27 07:00:02 | WR_1   | Solar_Calculation_fc0_day                          | 28133      |
| 2021-05-27 11:00:02 | WR_1   | Solar_Calculation_fc0_rest                         | 21649      |
| 2021-05-28 20:00:00 | WR_1   | Solar_Calculation_fc1                              | 603        |
| 2021-05-27 11:00:01 | WR_1   | Solar_Cloud                                        | 88         |
| 2021-05-27 11:00:01 | WR_1   | Solar_Correction_Cloud                             | 0.604      |
| 2021-05-27 20:00:00 | WR_1   | Solar_Correction_Faktor_auto                       | 0.5        |
| 2021-05-27 08:00:01 | WR_1   | Solar_Correction_Rain                              | 0.660      |
| 2021-05-27 11:00:01 | WR_1   | Solar_Correction_Temp                              | 1.007      |
| 2021-05-27 08:00:01 | WR_1   | Solar_Rain                                         | 170        |
| 2021-05-27 11:00:01 | WR_1   | Solar_SolarRadiation                               | 353        |
| 2021-05-27 11:00:01 | WR_1   | Solar_Temp                                         | 23.2       |
| 2021-05-27 11:00:01 | WR_1   | Solar_WR_1_Ost                                     | 1291       |
| 2021-05-27 11:00:01 | WR_1   | Solar_WR_1_West                                    | 260        |
| 2021-05-27 11:00:01 | WR_1   | Solar_WR_2_Sued                                    | 792        |
| 2021-05-27 11:00:01 | WR_1   | Solar_WR_2_West                                    | 196        |
| 2021-05-27 11:30:02 | WR_1   | SW_Home_own_consumption                            | 2818       |
| 2021-05-27 11:30:02 | WR_1   | SW_Home_own_consumption_from_Battery               | 0.80       |
| 2021-05-27 10:39:02 | WR_1   | SW_Home_own_consumption_from_grid                  | 0.00       |
| 2021-05-27 11:30:02 | WR_1   | SW_Home_own_consumption_from_PV                    | 2817.2     |
| 2021-05-27 11:30:02 | WR_1   | SW_Total_AC_Active_P                               | 5261       |
| 2021-05-27 11:30:07 | WR_1   | SW_Total_DC_P                                      | 5432       |
| 2021-05-27 11:30:07 | WR_1   | SW_Total_DC_P_Max                                  | 5455       |
| 2021-05-27 11:30:07 | WR_1   | SW_Total_DC_P_sumOfAllPVInputs                     | 5444       |
| 2021-05-27 11:30:07 | WR_1   | SW_Total_PV_P_reserve                              | 2082       |
| 2021-05-27 11:26:04 | WR_1   | SW_Yield_Daily                                     | 11744      |
| 2021-05-27 11:26:04 | WR_1   | SW_Yield_Monthly                                   | 1828693    |
| 2021-05-27 11:26:04 | WR_1   | SW_Yield_Total                                     | 15965035   |
| 2021-05-27 11:26:04 | WR_1   | SW_Yield_Yearly                                    | 5550944    |
| 2021-05-27 11:30:03 | WR_1   | Total_Active_P_EM                                  | -2473.60   |
| 2021-05-27 11:30:01 | WR_1   | Total_DC_P                                         | 3070.14    |
| 2021-05-27 11:26:07 | WR_1   | Total_DC_PV_Energy_sumOfAllPVInputs                | 3984855.25 |
| 2021-05-27 11:30:07 | WR_1   | Total_DC_P_Max                                     | 3090       |
| 2021-05-27 11:30:07 | WR_1   | Total_DC_P_sumOfAllPVInputs                        | 3078.61    |
| 2021-05-27 11:30:07 | WR_1   | Total_PV_P_reserve                                 | 2498       |
+---------------------+--------+----------------------------------------------------+------------+


Für das finden der Überschneidung habe ich einfach mal die Anzahl der Einträge durchgezählt

MySQL [fhem]> select date(TIMESTAMP) AS DATE from history where DEVICE='WR_1' and READING='SW_Home_own_consumption_from_PV' and TIMESTAMP>'2021-03-22' group by DATE limit 100;
MySQL [fhem]> select date(TIMESTAMP) AS DATE from history where DEVICE='WR_1' and READING='Home_own_consumption_from_PV' and TIMESTAMP>'2021-03-22' group by DATE limit 100;

Danach nochmals kurz die Einträge angeschaut und anschließende gelöscht, oder halt wie früher schon mal beschrieben umbenannt (achtet auf TIMESTAMP=TIMESTAMP ;-) )

MySQL [fhem]> delete from history where DEVICE='WR_1' and READING='Home_own_consumption_from_PV';

Das dann für alle doppelten Loggings und schon ist wieder Ordnung.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 31 Mai 2021, 20:18:51
Zitat von: plin am 20 Mai 2021, 15:14:02
Noch eine ganz kühne Idee:

Eine Webcam in den Himmel richten,
- aufgrund der Farben (blau, hellgrau, dunkelgrau, ...) und Helligkeit feststellen wie das Wetter ist,
- auf Grund der Wechselgeschwindigkeit der Farben die Windgeschwidigkeit und somit die Qualität der Vorhersage
ermitteln.

Erfahrungsbericht

Ich habe die Daten mehrerer wunderground-Wetterstationen im 5 Minuten-Takt erfasst (am Ort sowie jeweils 30 km im Norden, Westen, Osten, Süden) und die Anzahl der solarRadiation-Änderungen der letzten Stunde ermittelt. Die "Volatilität" ergibt sich aus der kleineren Zahl der Nulldurchgänge (eine Richtung) geteilt durch die größere Zahl der Nulldurchgänge (andere Richtung). Der Mittelwert ist dann als "Volatilität" im Diagramm dargestellt. Erwartung: stabile Wetterlagen führen zu einer niedrigen Volatilität, stark wechselnde Bewölkung zu hohen Werten). Ich hatte diese Lösung heute den ersten Tag laufen, bin aber damit nicht wirklich zufrieden. Ich kann im Diagramm nicht die erhoffte Wechselwirkung zischen Volatilität und stabilem Total AC Active Power erkennen. Die Total AC Active Power war trotz hoher Volatilität brauchbar.

Mittlerweile habe ich aus der Statistic_Yield_Total eine Statistic_Yield_1hour abgeleitet (orangefarbene Linie). Die, in Kombination mit der Total AC Active Power, habe ich heute für die automatische Steuerung des Ladevorgangs genutzt.  Meine Zoe lade ich mit 3,4 kW, das Haus braucht 300-400 W. Als Schwellwert habe ich

  • Statistic_Yield_1hour  > 3000
  • Total_AC_active_power > 4000
verwendet. Das hat ganz gut funktioniert. Es gab wenige Phasen in denen die PV-Leistung so stark absank, dass ich zukaufen musste. Da fehlt jetzt der Aspekt der Vorschau, aber wenn man auf die Wetterlage schaut und das Gefühl hat "heute wird's gut", kann man die Zoe anschließen ([Zoe:plugStatus] eq 1) und warten bis die Schwellwerte überschritte sind, dann startet der Ladevorgang.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Juni 2021, 08:33:54
Moin,
Das hört sich echt spannend an. Bitte achte ein wenig auf die Abfragefrequenz bei wunderground, die sperren schon mal gerne den Zugang oder verändern auch das Angebot. 5 Minuten  über viele Stationen in einem Bereich wird da schon zuviel sein.

Ich verwende diese readings aus der Solar_forecast() Funktion und fahre damit recht gut.

Solar_Calculation_fc0_*
Solar_Calculation_fc0_4h
Solar_Calculation_fc0_day
Solar_Calculation_fc0_rest


Mein letzter Ansatz, der noch in Bearbeitung ist, ist eine zusätzliche Korrektur wenn SW_Total_DC_P_sumOfAllPVInputs sehr stark schwankt zwischen den Updates. Diese Steilheit ergibt dann wieder zusammengefast auf Stundenbasis einen Korrekturfaktor. An guten Tagen, wo die Kurve nicht schwankt kommen dann auch keine Korrekturen heraus, wodurch man die typischen Frühjahrestage erkennen kann. Im Endergebnis wird dann die Solar_Calculation_fc0 höher ausfallen.

Das schöne ist, dass ich das wieder in SQL über meine eigenen Daten laufen lassen kann.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 01 Juni 2021, 20:18:25
Meine KI hat sich heute (bei recht stabilen Lichtverhältnissen) wacker geschlagen. So wie es aussieht macht RandomForestRegressor (rote Linie forecast1) wohl das Rennen gegenüber multiple-linear Regression (blaue Linie Forecast).

Einflussgrößen fürs Training waren historische Werte für
     columns = ['Rad1h','Neff','R101','Azimuth','Altitude','SunD1','VV','N','DD','RRS1c']   vom DWD
und
     Total AC active power)     

Einflussgrößen für die Vorhersage (Quelle: Vorhersagedaten des DWD)
     columns = ['Rad1h','Neff','R101','Azimuth','Altitude','SunD1','VV','N','DD','RRS1c']   
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Juni 2021, 08:32:08
Zitat von: plin am 01 Juni 2021, 20:18:25
Meine KI hat sich heute (bei recht stabilen Lichtverhältnissen) wacker geschlagen. So wie es aussieht macht RandomForestRegressor (rote Linie forecast1) wohl das Rennen gegenüber multiple-linear Regression (blaue Linie Forecast).
Das ist doch schon ziemlich nah dran.
Hast Du viel Schatten auf der Anlage, weil die Kurve so komisch aussieht?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 02 Juni 2021, 09:04:32
Zitat von: ch.eick am 02 Juni 2021, 08:32:08
Das ist doch schon ziemlich nah dran.
Hast Du viel Schatten auf der Anlage, weil die Kurve so komisch aussieht?
Ich wohne im Hang, Tal in Richtung Osten. Die PV-Anlage ist in Richtung SW ausgerichtet und Nachmittags schlägt irgendwann der Schatten des Berges zu.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Juni 2021, 09:40:18
Zitat von: plin am 02 Juni 2021, 09:04:32
Ich wohne im Hang, Tal in Richtung Osten. Die PV-Anlage ist in Richtung SW ausgerichtet und Nachmittags schlägt irgendwann der Schatten des Berges zu.
Okay, das ist suboptimal für PV :-(
Da musste auf die andere Seite auch noch PV drauf bauen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Juni 2021, 14:56:54
Es gab mal wieder ein kleines Update beim WR_[1|2]

jetzt ist Inverter_Generation_P_Actual auch definiert

attr WR_1 comment Version 2021.06.02 14:00\
Kostal Plenticore 10 Plus mit BYD Speicher

attr WR_1 event-on-change-reading Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_I,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Home_own_consumption.*,P_DC1,P_DC2,Total_DC_P.*,Total_DC_PV_Energy.*,Total_PV_P_reserve,Solar_.*,Total_.*,SW_.*,.*_yield,Inverter_state.*,Inverter_Generation_P_Actual.*

attr WR_1 obj-h575-reading Inverter_Generation_P_Actual
attr WR_1 obj-h575-unpack N

attr WR_1 userReadings Total_PV_P_reserve:Total_DC_P.* {my $reserve = ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs","0") * 0.90 - ReadingsVal($NAME,"Home_own_consumption_from_PV",0);;;; ($reserve lt 0)? 0 : round($reserve,0)  },\
\
Total_DC_P_Max:Total_DC_P.* { my $Bat_out = (ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I","0")*ReadingsVal($NAME,"Battery_voltage",0));;;; ($Bat_out gt 0)? round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0) + $Bat_out,0) : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) },\
\
Actual_Battery_charge_-minus_or_discharge_-plus_P:Actual_Battery_charge_-minus_or_discharge_-plus_I.* {round((ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I",0)*ReadingsVal($NAME,"Battery_voltage","0")),0)},\
\
Actual_Battery_charge_usable_P:Act_state_of_charge.* {my $x = (ReadingsVal($NAME,"Battery_work_capacity",0)*(ReadingsVal($NAME,"Act_state_of_charge",0)-10)/100);;;; ($x lt 0)? 0 : round($x,0) },\
\
SW_Inverter_Generation_P_Actual:Inverter_Generation_P_Actual.* {round(ReadingsVal($NAME,"Inverter_Generation_P_Actual",0)+ReadingsVal("WR_2","Inverter_Generation_P_Actual",0),0) },\
\
SW_Home_own_consumption:Total_AC_Active_P.* {round(ReadingsVal($NAME,"Total_Active_P_EM",0)+ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)},\
SW_Total_AC_Active_P:Total_AC_Active_P.*  {round(ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)},\
\
\
SW_Total_DC_P:Total_DC_P.* {round(ReadingsVal($NAME,"Total_DC_P",0)+ReadingsVal("WR_2","Total_DC_P",0),0) },\
\
SW_Total_DC_P_sumOfAllPVInputs:Total_DC_P.* {round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0)+ReadingsVal("WR_2","Total_DC_P_sumOfAllPVInputs",0),0) },\
\
SW_Total_PV_P_reserve:SW_Total_DC_P.* {my $reserve = ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs","0") * 0.90 - ReadingsVal($NAME,"SW_Home_own_consumption",0);;;; ($reserve lt 0)? 0 : round($reserve,0)  },\
\
SW_Total_DC_P_Max:SW_Total_DC_P.* { my $Bat_out = (ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I","0")*ReadingsVal($NAME,"Battery_voltage",0));;;; ($Bat_out gt 0)? round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0) + $Bat_out,0) : round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0),0) },\
\
SW_Yield_Daily:Daily_yield.* { round(ReadingsVal($NAME,"Daily_yield",0)+ReadingsVal("WR_2","Daily_yield",0),0) },\
SW_Yield_Monthly:Monthly_yield.* { round(ReadingsVal($NAME,"Monthly_yield",0)+ReadingsVal("WR_2","Monthly_yield",0),0) },\
SW_Yield_Yearly:Yearly_yield.* { round(ReadingsVal($NAME,"Yearly_yield",0)+ReadingsVal("WR_2","Yearly_yield",0),0) },\
SW_Yield_Total:Total_yield.* { round(ReadingsVal($NAME,"Total_yield",0)+ReadingsVal("WR_2","Total_yield",0),0) },\
\
SW_Home_own_consumption_from_PV:SW_Home_own_consumption.* { (ReadingsVal($NAME,"Total_Active_P_EM",0) ge 0) ? ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_grid",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) :  ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0);;;; },\
\
SW_Home_own_consumption_from_Battery:SW_Home_own_consumption_from_PV.* { ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) },\
SW_Home_own_consumption_from_grid:SW_Home_own_consumption_from_PV.* { ReadingsVal($NAME,"Home_own_consumption_from_grid",0) }\

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Juni 2021, 16:53:44
Hallo zusammen,
wer von der 70% Abregelung betroffen ist kann dies nun mit P_limit_from_EVU loggen und erkennen.
Ob das bei einem einzelnen WR auch geht kann ich leider nicht mehr rausfinden, da wäre es schön, wenn Ihr Euch meldet.


attr WR_1 DbLogInclude Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,P_DC1,P_DC2,Total_DC_PV_Energy_sumOfAllPVInputs,Total_Active_P_EM,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*,P_limit_from_EVU.*

attr WR_1 event-on-change-reading Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_I,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Home_own_consumption.*,P_DC1,P_DC2,Total_DC_P.*,Total_DC_PV_Energy.*,Total_PV_P_reserve,Solar_.*,Total_.*,SW_.*,.*_yield,Inverter_state.*,Inverter_Generation_P_Actual.*,P_limit_from_EVU.*

attr WR_1 obj-h122-reading P_limit_from_EVU


attr WR_2 DbLogInclude P_DC1,P_DC2,P_DC3,Total_DC_P.*,P_limit_from_EVU.*

attr WR_2 event-on-change-reading P_DC1,P_DC2,P_DC3,Total_DC_P.*,Total_DC_PV_Energy.*,Total_AC_Active_P.*,Inverter_state.*,Inverter_Generation_P_Actual.*,P_limit_from_EVU.*

attr WR_2 obj-h122-reading P_limit_from_EVU


Im DbLog sieht man dann wieviel Prozent der WR Leistung freigegeben sind WR_1 hat bei mit 10 kWp und WR_2 hat 7 kWp

MySQL [fhem]> SELECT TIMESTAMP,DEVICE,READING,VALUE   FROM history WHERE DEVICE like 'WR_%' AND READING='P_limit_from_EVU' AND  TIMESTAMP > curdate();
+---------------------+--------+------------------+--------+
| TIMESTAMP           | DEVICE | READING          | VALUE  |
+---------------------+--------+------------------+--------+
| 2021-06-08 08:39:01 | WR_1   | P_limit_from_EVU | 100.00 |
| 2021-06-08 08:49:01 | WR_2   | P_limit_from_EVU | 100.00 |
| 2021-06-08 12:04:01 | WR_1   | P_limit_from_EVU | 84.00  |
| 2021-06-08 12:04:01 | WR_2   | P_limit_from_EVU | 84.00  |
| 2021-06-08 12:05:01 | WR_1   | P_limit_from_EVU | 57.00  |
| 2021-06-08 12:05:01 | WR_2   | P_limit_from_EVU | 57.00  |
| 2021-06-08 12:06:08 | WR_1   | P_limit_from_EVU | 39.00  |     <<< 10000 * 0.39 = 3900
| 2021-06-08 12:06:08 | WR_2   | P_limit_from_EVU | 39.00  |     <<<  7000 * 0.39 = 2730    => 6630 - 1630 (Hausverbrauch) = 5000 W (was ich testweise eingestellt hatte)
| 2021-06-08 12:07:01 | WR_1   | P_limit_from_EVU | 100.00 |
| 2021-06-08 12:07:01 | WR_2   | P_limit_from_EVU | 100.00 |
+---------------------+--------+------------------+--------+


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ozwo am 08 Juni 2021, 17:05:10
Hallo Christian,

ZitatOb das bei einem einzelnen WR auch geht kann ich leider nicht mehr rausfinden, da wäre es schön, wenn Ihr Euch meldet.

Ich habe zwar nur einen WR und sehe auch den Wert (100.00) im Reading. Da ich aber 9,9kWp auf einem Ost-West-Dach habe, wird das Reading auch wahrscheinlich keine anderen Werte als 100 annehmen...

Grüße
Oliver
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Juni 2021, 19:01:13
Zitat von: ozwo am 08 Juni 2021, 17:05:10
Ich habe zwar nur einen WR und sehe auch den Wert (100.00) im Reading. Da ich aber 9,9kWp auf einem Ost-West-Dach habe, wird das Reading auch wahrscheinlich keine anderen Werte als 100 annehmen...
Wenn Du unter Info im WR ein Event für Abriegelung siehst, dann sollte der wert auch unter 100% gehen.
Ich henke Du hast sicher 7000 W als Abregelungsgrenze im WR eingetragen. Die Regelung über den KSEM ist nur bei mehreren WR notwendig.
Testen könntes Du es wenn im WR z.B. 3000 W eingetragen wird.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 11 Juni 2021, 09:40:52
Hi Christian,

meine KI-Vorhersage liefert jetzt zwar bei stabilen Wetterlagen richtig schöne Vorhersagen, ich realisere aber gerade, dass die ja die PV-Leistung bei 70% Drosselung gelernt hat ...

Gibt es bei den vielden Messwerten die Plenticore/KSEM liefern einen Wert für "Drosselung aktiv"?

VG Peter
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Juni 2021, 15:18:35
Zitat von: plin am 11 Juni 2021, 09:40:52
meine KI-Vorhersage liefert jetzt zwar bei stabilen Wetterlagen richtig schöne Vorhersagen, ich realisere aber gerade, dass die ja die PV-Leistung bei 70% Drosselung gelernt hat ...

Gibt es bei den vieldn Messwerten die Plenticore/KSEM liefern einen Wert für "Drosselung aktiv"?
Hallo Peter,
Du bist gerade im Programmiertunnel :-) :-)
Das hatte ich gerade aktiviert und getestet GuckstDuHier (https://forum.fhem.de/index.php/topic,114849.msg1161558.html#msg1161558)

EDIT: Eigentlich wäre die Prognose inklusieve der Drosselung doch richtig, da ja eh nicht mehr kommen würde.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 11 Juni 2021, 15:54:20
Zitat von: ch.eick am 11 Juni 2021, 15:18:35
EDIT: Eigentlich wäre die Prognose inklusive der Drosselung doch richtig, da ja eh nicht mehr kommen würde.

Da muss ich wiedersprechen, da die Drosselung die Netzeinspeisung steuert und nicht die Erzeugung.

Im "Normalbetrieb" sehe ich Drosselung bei 4,3 kW + 300-400 W = ca. 4,8 kW. Wenn ich meine Zoe lade (die zieht 3,4 kW) habe ich schon eine PV-Leistung von 6,2 kW gesehen.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Juni 2021, 18:42:22
Zitat von: plin am 11 Juni 2021, 15:54:20
Da muss ich wiedersprechen, da die Drosselung die Netzeinspeisung steuert und nicht die Erzeugung.

Im "Normalbetrieb" sehe ich Drosselung bei 4,3 kW + 300-400 W = ca. 4,8 kW. Wenn ich meine Zoe lade (die zieht 3,4 kW) habe ich schon eine PV-Leistung von 6,2 kW gesehen.
Wo er recht hat, hat er recht :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 13 Juni 2021, 22:10:06
Hallo PV-Freunde,
ich möchte mich auch mal hier in die interessierten Leser und auch mal als Frager einreihen. FHEM benutze ich schon einige Jahre auf div. Raspberrys und dank diesen Forums habe ich schon einiges zum Laufen gebracht.
Das Thema finde ich echt spannend da ich aktuell eine PV-Anlage in Betrieb genommen, mit Komponenten die fast haargenau hier passen.
- PV mit 10,2 KWp
- Kostal Plenticore plus 10
- KSEM
- BYD B-Box HVS 12.8 - im Moment noch nicht geliefert, kommt aber hoffentlich bald.
- go-eCharger für Elektroauto
- FHEM auf Raspi 4

Meiner kurzen Vorstellung hänge ich noch eine Frage an:
Ich habe die Module aus dem Wiki installiert und das WR_1_API zeigt bei "aktuelle Werte" komisch unsinnige Werte an, bei  "heute", "dieser Monat", "dieses Jahr" scheint es gut zu passen.
Frage: Hat sich durch Updates im Kostal möglicherweise etwas in der Struktur verändert, oder habe ich nicht das aktuelle Modul in FHEM installiert?
Das habe ich:
- Kostal Plenticore: IOC = 01.55, MC =01.55, UI = 01.19.05650
- FHEM ModuleVersion = 4.1.08 - 1.4.2021
welche Versionsnummern sind den wichtig, was ist den aktuell?
Danke für ein paar Tipps.

immer sonnige Grüße
Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Juni 2021, 08:19:25
Zitat von: zwölfgang am 13 Juni 2021, 22:10:06
Ich habe die Module aus dem Wiki installiert und das WR_1_API zeigt bei "aktuelle Werte" komisch unsinnige Werte an, bei  "heute", "dieser Monat", "dieses Jahr" scheint es gut zu passen.
Frage: Hat sich durch Updates im Kostal möglicherweise etwas in der Struktur verändert, oder habe ich nicht das aktuelle Modul in FHEM installiert?
Das habe ich:
- Kostal Plenticore: IOC = 01.55, MC =01.55, UI = 01.19.05650
- FHEM ModuleVersion = 4.1.08 - 1.4.2021
welche Versionsnummern sind den wichtig, was ist den aktuell?
Hallo Wolfgang, herzlich willkommen.

Hier handelt es sich nicht um ein Modul, sondern die Verwendung verschiedener Module aus FHEM, die entsprechend für die Kommunikation mit den Geräten konfiguriert wurden.

Ich entnehme Deinem Schreiben, dass Du die Kommunikation zum Plenticore bereits inklusive Anmeldung geschafft hast. Dann läuft die Grundlage bereits.
Zu den Versionen:
- Kostal Plenticore ist mit v1.19 aktuell und verwende ich auch
- Das HTTPMOD hat 4.1.08 - 1.4.2021 und passt somit auch.

Du hast einen einzelnen Plenticore und somit noch keine Schwarm Installation.
Bitte schau Dir zuerst mal die readings ohne SW_* an, denn das sind die, die direkt vom Plenticore kommen.
Ein "list WR_1_API" könntest Du bitte als .txt Datei hier anhängen, dann schau ich da mal rein.
Die WR_* reading sollten die gleichen Werte haben wie die entsprechenden Plenticore reading.
Wie die readings mit Batterie aussehen kann ich nicht sagen, da ich sofort einen Speicher dran hatte. Das schau ich mir dann in Deinem List an.

Aktuelle Werte sind im WR_1_API keine zu sehen, da es die Statistiken abfragt, mit Ausnahme des stateFormat, was dann diese Werte aus dem WR_1 Device sind

my $WR="WR_1";

my $pvt   = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",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 $gfi  =  sprintf("%04d W",(ReadingsVal($WR,"Total_Active_P_EM",0)<=0 ? abs(round(ReadingsVal($WR,"Total_Active_P_EM",0),0)):  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 $pvb   = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",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 $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("%3.0f %%",(($calcVal > 100) ? 100 : $calcVal) );


Auch hier könntest Du ein "list WR_1" als .txt Datei anhängen.

VG bis später
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Juni 2021, 15:43:46
Hallo zusammen,

in der Funktion Solar_forecast() hat es eine Änderung gegeben.

Hintergrund:

Das Mittagshoch wurde von 09:00 bis 18:00 Uhr ermittelt, was natürlich viel zu lang ist, wenn man eine MaxSoc Begrenzung macht.
Im Speicher ist dann nicht so viel Platz und das Laden würde je nach weiterer Konfiguration schon um 09:00 Uhr beginnen.
Dadurch wäre der Speiche im Sommer eventuell um 12:00 Uhr bereits komplett gefüllt und das Mittagshoch läuft ins leere.

Weitere Faktoren

SpeicherMidday_NotBefore
Bei MaxSoc Begrenzung und Mittagshoch wird generell bereits auf 12:00 Uhr verschoben.


Die Zeiten könne ja auch für eigene Steuerungen verwendet werden, wodurch eine ermittelte Zeit auch vor 12:00 Uhr sinn macht,
obwoh sie für die Speichersteuerung durch WR_1_Speicher_1_ExternControl  noch verschoben werden kann.

Umsetzung:

Bei einem Mittagshoch von > 4h wird die Start- und Endezeit dynamisch verschoben.


Beispiel:

18 - 9 => 9 / 4 => 2,25 => 2
09:00 + 2:00 => 11:00 Uhr
18:00 -  2:00 => 16:00 Uhr


Code Änderungen sind bereits im Wiki, aber hier noch ein Ausschnitt...

< snip >

=============================================
     my $middayhigh           = 0 ; # Ein Merker, ob das Tagesmaximum überschritten wird
     my $middayhigh_start     = "00:00";
     my $middayhigh_stop      = "00:00";
     my $middayhigh_tmp       = 0;
     my $middayhigh_start_tmp = 0;
     my $middayhigh_stop_tmp  = 0;

     my $Inverter_Max_Power = ReadingsVal($logdevice."_Speicher_1_ExternTrigger","SpeicherMidday_Inverter_Max_Power","unused");  # Überschreiben des middayhigh
=============================================

< snip >

=============================================
       # Alle Forecast Werte für die jeweilige Stunde in die DbLog schreiben (Es wird der Cache verwendet)

       if ( $logdb ne "none" ) {
         CommandSet(undef, $logdb." addCacheLine ".$timestamp."|".$logdevice."|addlog|".$reading.": ".$logentry1h."|".$reading."|".$logentry1h."|") ;

         if ( $middayhigh == 0 and $logentry1h > $Inverter_Max_Power ) {
           $middayhigh           = 1;
           $middayhigh_start_tmp = $i-1;
         };
         if ( $middayhigh == 1 and $logentry1h < $Inverter_Max_Power and $middayhigh_stop_tmp == 0 )  {
           $middayhigh_stop_tmp = $i;
         };
         if ( $middayhigh == 1 and $logentry1h > $Inverter_Max_Power and $middayhigh_stop != 0 )  {
           $middayhigh_stop_tmp = 0;                                # da war ein kurzer Einbruch, es sollte noch länger sein.
         };
         if ($middayhigh == 1 and
             $middayhigh_stop_tmp != 0 and
             $middayhigh_stop_tmp == $i ) {                                    # das Ende des Middayhigh wurde gefunden

           $middayhigh_tmp = $middayhigh_stop_tmp - $middayhigh_start_tmp;
           if ( $middayhigh_tmp > 4 )  {                                       # das Middayhigh wird zu lang
             if ($verbose >= 3 ) {                                             # die bisherigen Zeiten ausgeben
               Log 3, "Solar_middayhigh_fc".$fc."_start   : ".sprintf("%02d:00",$middayhigh_start_tmp);
               Log 3, "Solar_middayhigh_fc".$fc."_stop    : ".sprintf("%02d:00",$middayhigh_stop_tmp) ;
             }
             $middayhigh_tmp       = round(($middayhigh_tmp/4)-0.2 ,0);        # die Rundung der Zeit zum Abziehen etwas verschieben
             $middayhigh_start_tmp = $middayhigh_start_tmp + $middayhigh_tmp;  # es wird um ganze Stunden verkürzt
             $middayhigh_stop_tmp  = $middayhigh_stop_tmp  - $middayhigh_tmp;
             if ($verbose >= 3) {                                              # melde die Verkürzung
               Log 3, "Solar_middayhigh_fc".$fc."         : verkürzt um ".($middayhigh_tmp *2)." Stunden";
             }
           };
           $middayhigh_start = sprintf("%02d:00",$middayhigh_start_tmp);
           $middayhigh_stop  = sprintf("%02d:00",$middayhigh_stop_tmp);
           if ($verbose >= 3) {                                                # gib die finalen Zeiten aus
             Log 3, "Solar_middayhigh_fc".$fc."_start   : ".$middayhigh_start;
             Log 3, "Solar_middayhigh_fc".$fc."_stop    : ".$middayhigh_stop ;
           }
         };
         CommandSetReading(undef, $logdevice." Solar_middayhigh_fc".$fc." ".$middayhigh) ; # setz die Zeiten im Device
         CommandSetReading(undef, $logdevice." Solar_middayhigh_fc".$fc."_start ".$middayhigh_start) ;
         CommandSetReading(undef, $logdevice." Solar_middayhigh_fc".$fc."_stop ".$middayhigh_stop) ;
       };
=============================================
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 14 Juni 2021, 18:43:24
Hi Christian,

ich mache die Entscheidung "Zoe kann jetzt geladen werden" von der aktuellen PV-Leistung (Total AC active power in kW) und dem Delta der letzten Stunde (Ertrag in kWh) abhängig. Durch den aktuellen Peak-Wert kann ich sicherstellen, dass ich aktuell Ladeleistung+Hausverbrauch erzeuge und durch das Stundenmittel der letzten Stunde weiß ich auch, dass diese Leistung relativ stabil/sicher erzeugt wird. So brauche ich keine Uhrzeiten vorzugeben.

VG Peter
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Juni 2021, 08:02:19
Zitat von: plin am 14 Juni 2021, 18:43:24
ich mache die Entscheidung "Zoe kann jetzt geladen werden" von der aktuellen PV-Leistung (Total AC active power in kW) und dem Delta der letzten Stunde (Ertrag in kWh) abhängig. Durch den aktuellen Peak-Wert kann ich sicherstellen, dass ich aktuell Ladeleistung+Hausverbrauch erzeuge und durch das Stundenmittel der letzten Stunde weiß ich auch, dass diese Leistung relativ stabil/sicher erzeugt wird. So brauche ich keine Uhrzeiten vorzugeben.

Hallo Peter,
Mit den Beispielen aus dem Wiki für Pool oder LWP habe ich da auch ein Minimum und eine Zeit, die die Leistung stabil anstehen muss. Zusätzlich gibt es noch Zeiten, wann es frühestens, wie lange, eine Mindestzeit und bis wann freigeschaltet werden soll. Das hangelt sich dann schön an der PV-Kurve entlang oder schaltet auch ab, wenn es einen Verbraucher mit Vorrang gibt.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Juni 2021, 12:13:58
Hier mal wieder ein Sceenshot vom Dashboard.
Bald sollte es soweit sein eine Beschreibung anzufertigen...

Es sind jetzt nahezu alle Verbraucher mit Zähler im Haushalt (oben) und im Keller (unten) dargestellt.
Die Restverbraucher wurden berechnet.
Der Gesamt Hausverbrauch von 1.3 kW sollte sich je nach PV oder Netzbezug von grün nach rot ändern.
Die WallBoxen sind noch im Karton und der Getränkekühlschrank muss auch noch angeschlossen werden :-)
Durch ausgelesene Energiewerte des Wärmespeichers konnte auch ein Cop errechnet werden, der unterhalb der WP angezeigt wird.

Was mir noch fehlt sind die Planzahlen für die Batterie mit MaxSoc und Mittagshoch, da habe ich noch keine Idee für die Darstellung.

Ob ich auch noch Wetter Werte loggen möchte bin ich mir auch noch nicht so ganz im klaren.

Gerne nehme ich auch noch Eure Ideen entgegen

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Juni 2021, 10:34:20
EDIT: Bei der Gelegenheit habe ich im WR_1 userreading auch die Trigger noch weiter präzisiert, wodurch ich mir verspreche, dass die berechneten readings besser zusammen passen.
Im Dashboard war mir aufgefallen, das es manchmal zu kleinen Abweichungen gekommen ist. Ich lege das im Wiki ab und Ihr könntet dann das userreading komplett neu setzen.


Hallo zusammen,
Ihr müsst aber bitte mal besser aufpassen :-) Ich habe schon wieder etwas gefunden, was nicht so ganz passt.

Im WR_1 userreading ist eine Berechnung falsch. Das kommt noch aus der ersten Version, bei der es das reading Battery_work_capacity noch nicht gab.
Battery_work_capacity ist bei mir fest auf der Brutto Leistung des Speichers -5% und dieser Wert verändert sich auch nicht wenn man den MinSoc verändert. Somit nehme ich an, dass das fest von Kostal so vorgegeben ist.
Für die Schätzung der nutzbaren Leistung in Wh habe ich nun den MinSoc mit berücksichtigt, anstell wie bisher einen fixen Wert.
Ist nun der Act_state_of_charge <= Battery_MinSOC wird für Actual_Battery_charge_usable_P dann 0 angezeigt.

Actual_Battery_charge_usable_P:[Act_state_of_charge|Battery_MinSOC].* {my $x = (ReadingsVal($NAME,"Battery_work_capacity",0)*(ReadingsVal($NAME,"Act_state_of_charge",0)-ReadingsVal($NAME,"Battery_MinSOC",0))/100);; ($x lt 0)? 0 : round($x,0) },

Bisher habe ich diesen Wert zwar noch nicht für Entscheidungen verwendet, jedoch wird er bei mir im Diagramm angezeigt, damit ich sehen kann wie viel  kWh noch verwendet werden können.
Achtung, die Verluste von DC/AC sind dabei nicht berücksichtigt, es müssen so ca. 10-15 % abgezogen werden.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 20 Juni 2021, 09:19:02
Hallo Christian,
danke für das herzliche Willkommen, freue mich dass ich als Nutznieser hier teilhaben darf. Bin hier halt noch ganz weit vorne am Anfang.
Ich habe wie im wiki beschrieben die Definitionen genau so verwendet und werde eins ums andere hinzufügen (und versuchen zu verstehen:-))

Ja, die Verbindung und login zum Kostal WR, scheint so weit zu funktionieren, auch der KSEM aktuallisiert die Readings.

Ich habe mal die Dateien mit meinen Definitionen von WR_1 und WR_1_API angehängt, vielleicht siehst du mit einem Blick was zu den unpassenden Zahlen führt.
Schau doch mal bitte bei Gelegenheit drüber. Danke

sonnige Grüßle
Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Juni 2021, 07:59:26
Zitat von: zwölfgang am 20 Juni 2021, 09:19:02
Ich habe mal die Dateien mit meinen Definitionen von WR_1 und WR_1_API angehängt, vielleicht siehst du mit einem Blick was zu den unpassenden Zahlen führt.
Schau doch mal bitte bei Gelegenheit drüber.
Hallo Wolfgang,
die readings im ModBus passen nicht und ich habe in einem anderen Forum gelesen, das man die Register Reihenfolge jetzt verändern kann.
Ich habe mal meine Einstellung angehängt, die ich jedoch nie verändert habe.

Im WR_1_API hat es letzte Woche auch Änderungen gegeben, die Du später noch aktualisieren kannst. https://forum.fhem.de/index.php/topic,114849.msg1162883.html#msg1162883

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 21 Juni 2021, 21:39:59
Hallo Christian,
ich habe soeben nachgeschaut, meine Einstellung im Modbus / Sunspec (TCP) stand auf - "big-endian (ABCD) Sunspec". Habe umgestellt auf "little-endian (CDAB) Standard Modbus" und siehe da, das wars. Das schaut schon mal ganz anders aus. Die Werte passen mit dem was ich vom WR angezeigt wird. Damit kann ich jetzt mal gut weiter machen. Ich werde berichten.
Das userReading habe ich auch gleich angpasst.

Danke dir.

VG
Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 Juni 2021, 07:28:04
Zitat von: zwölfgang am 21 Juni 2021, 21:39:59
Meine Einstellung im Modbus / Sunspec (TCP) stand auf - "big-endian (ABCD) Sunspec". Habe umgestellt auf "little-endian (CDAB) Standard Modbus" und siehe da, das wars.
Dann kannst Du nun das bisherige Logging in der DbLog bereinigen und die ganzen falschen Werte löschen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Juli 2021, 12:41:23
Heute ist mal wieder so ein Tag, wo es knapp werden könnte...
- aber die Prognose trifft es ziemlich genau.
- Die Speichersteuerung kam mit SOC 20 % aus der Nacht und hat aufgrund der Prognose entschieden mal wieder auf 100 % zu laden.

Bei der Verbrauchern habe ich mich nun entschieden die Diagramme in zwei Gruppen aufzuteilen.
- Hauptverbraucher ist alles so ab 800 Wh, also Brunnenpumpe, Wirlpool, Wärmepumpe
- Kleinverbraucher geht dann bis 800 Wh (mit Stacking), also die
   Heizungssteuerung mit Pumpen und KWL, Multimedia, Akkus Laden (Shaun), Gartenkühlschrank und alles was sonst noch an einem Shelly
Durch diese Gruppierung kann man die Skala aufteilen und sieht mehr Details der einzelnen Geräte sehen.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Juli 2021, 12:53:38
Hallo zusammen,
bitte kein update von FHEM starten, da scheint es ein Problem mit dem setreading aus dem HTTPMOD Modul zu geben, das ich für die WR_1_API Abfrage verwende.
Nach dem update ist dann kein login zum Plenticore mehr möglich.

EDIT: Alles wieder gut :-)
  Es lag daran, dass es bei dem update wohl zu einer wiederholten falschen Anmeldung am Plenticore kam und dieser dann den user gesperrt hat.
  Also schaut in diesem Fall bitte auf das reading "auth_me_locked 1" und setzt in diesem Fall auf der Web GUI des Plenticore das Passwort zurück.
  Bitte verwendet in diesem Fall das selbe Passwort, das bisher gesetzt war!
  Anschließend habe ich mit "deletereading WR_1_API auth.*" die Reste der gescheiterten Anmeldung entfernt.
  Eine erneute Abfrage der Statistiken führt automatisch wieder eine Anmeldung durch.
  Mit "get WR_1_API 04_auth_me" kann der Anmeldestatus zusätzlich abgefragt werden und sollte dann wie folgt aussehen.


auth_me_active 1
auth_me_anonymous 0
auth_me_authenticated 1
auth_me_locked 0
auth_me_role USER


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 11 Juli 2021, 10:13:08
Hallo Christian,
ich habe Fehlermeldungen im Logfile und weiß da nicht mehr weiter.

2021.07.11 05:55:00 1: PERL WARNING: Argument "Error evaluating WR_1_API userReading SW_Statistic_OwnCo..." isn't numeric in sprintf at (eval 464067) line 47.   (Fehler kommt im 5 min Takt)
2021.07.11 05:57:00 1: Error evaluating WR_1_API userReading SW_Statistic_OwnConsumptionRate_Day: Illegal division by zero at (eval 464574) line 1.  (Fehler kommt jede Stunde)

Dieser Fehler kommt immer  nachts exakt ab 00:57 Uhr. Sobald die PV wieder Strom produziert verschwindetder Fehler. Das userReading SW_Statistic_OwnConsumptionRate_Day macht scheinbar das Problem. Mir ist dabei aufgefallen dass der WR komplett abschaltet und damit evtl. keine readings mehr aktuallisiert. Die Batterie ist leider immer noch nicht da und vielleicht gibt es da einen Zusammenhang weil die dann auf Eingang drei liefern würde und der WR dann nicht mehr aus geht. (Vermutung)

Wäre schön wenn Du eine Idee dazu hättest.

VG
Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Juli 2021, 11:07:39
Zitat von: zwölfgang am 11 Juli 2021, 10:13:08
Hallo Christian,
ich habe Fehlermeldungen im Logfile und weiß da nicht mehr weiter.

2021.07.11 05:55:00 1: PERL WARNING: Argument "Error evaluating WR_1_API userReading SW_Statistic_OwnCo..." isn't numeric in sprintf at (eval 464067) line 47.   (Fehler kommt im 5 min Takt)
2021.07.11 05:57:00 1: Error evaluating WR_1_API userReading SW_Statistic_OwnConsumptionRate_Day: Illegal division by zero at (eval 464574) line 1.  (Fehler kommt jede Stunde)

Dieser Fehler kommt immer nachts exakt ab 00:57 Uhr. Sobald die PV wieder Strom produziert verschwindet der Fehler. Das userReading SW_Statistic_OwnConsumptionRate_Day macht scheinbar das Problem. Mir ist dabei aufgefallen dass der WR komplett abschaltet und damit evtl. keine readings mehr aktualisiert. Die Batterie ist leider immer noch nicht da und vielleicht gibt es da einen Zusammenhang weil die dann auf Eingang drei liefern würde und der WR dann nicht mehr aus geht. (Vermutung)
Hallo Wolfgang
Okay, den Fall, dass der WR komplett abschaltet habe ich nicht.

Versuche mal die Division durch Null so zu vermeiden.
Ansonsten schau mal bitte ob SW_Statistic_Yield_Day zu dem Zeitpunkt Null ist, dann müssten wir das ansonsten abfangen.
Den Wert müsstest Du zu diesem Zeitpunkt in der Datenbank abfragen.

SW_Statistic_OwnConsumptionRate_Day:SW_Statistic_EnergyHomePvSum_Day.* { round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Day"  ,0) / ReadingsVal("$NAME","SW_Statistic_Yield_Day",1)*100,0) },
SW_Statistic_OwnConsumptionRate_Month:SW_Statistic_EnergyHomePvSum_Month.* { round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Month"  ,0) / ReadingsVal("$NAME","SW_Statistic_Yield_Month",1)*100,0) },
SW_Statistic_OwnConsumptionRate_Year:SW_Statistic_EnergyHomePvSum_Year.* { round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Year"  ,0) / ReadingsVal("$NAME","SW_Statistic_Yield_Year",1)*100,0) },


Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Juli 2021, 13:39:06
Hallo zusammen,

ich werde in den nächsten zwei Wochen im Flut Katastrophengebiet im Ahrtal im Einsatz sein und somit Eure Anfragen nicht bearbeiten können.
Unter Ahrtal@infinity-staging.de wird Eure Bewerbung für den Katastropheneinsatz entgegen genommen.


Besonderen Dank auch an meinen Arbeitgeber, der diesen Einsatz ermöglicht!

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 05 August 2021, 14:13:20
Hallo zusammen,
und schon geht es weiter.

Im Photovoltaikforum ist folgendes aufgetaucht.

Sobald der Speicher nicht verwendet wird kommt es zu minimalen Entladungen, die ich im Dashboard mit 10-14 W Entladung ebenfalls bereits gesehen habe.
Ist nun der Speicher bei 100 % SOC angelangt kann man nach einiger Zeit einen leichten Knick im Diagramm sehen und der Speicher wird wiederum auf 100 % nachgeladen.
Dies ist etwas unschön, da gerade in diesem Bereich "gefühlt" ziemlich viel Leistung benötigt wird, um den kleinen letzten Rest in den Speicher zu bekommen.

Aus diesem Grund habe ich bei der externen Speichersteuerung ein weiteres DOELSEIF eingefügt, was bei 100 % SOC eine MaxSOC Begrenzung auf 95 % durchführt.
Dadurch wird das Nachladen auf 100 % vermieden und ich werde mal beobachten, wieviel denn über den Tag verloren geht. Verloren ist hierbei natürlich nicht richtig, da ja die 10-15 W ins Haus gehen :-)

Das Nachladen kann man im Diagramm bei 17:20 Uhr an der gelben Linie sehen.

Aktualisiert: 2021 08 06

################################################################################################################
## 11 Der Speicher ist voll geladen. Hier wird das ständige nachladen auf 100 % vermieden.
##
DOELSEIF
( [WR_1:Solar_Calculation_fc0_day] > [WR_1_Speicher_1_ExternTrigger:SpeicherMaxSOC_fc1_Limit] and          ## 1) sobald viel Leistung erwartet wird und der Speicher voll ist
   [WR_1:Act_state_of_charge] == 100 or                                                                     ##    den MaxSOC wieder reduzieren, damit nicht immer nachgeladen wird
  ([WR_1_Speicher_1_ExternTrigger:SpeicherMaxSOC_Actual] == 95 and                                          ## 2) oder das Nachladen gestoppt wurde
   [WR_1:Act_state_of_charge] <  98  and                                                                    ##    und der SOC unte 98 % gefallen ist
   [{sunset_abs("HORIZON=+8.0",-7200,"15:00","21:00")}]) )                                                  ##    zwei Stunden vor Sonnenuntergang eventuell wieder nachladen

  {
   if ([WR_1:Act_state_of_charge] < 98) {
     CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherMaxSOC_Actual 100");                   ## Eventuell noch mal nachladen
     if (AttrVal("$SELF","verbose",0) >=3) {
       Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 100 % nachladen";
     };
   } else {
     CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherMaxSOC_Actual 95");
     CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherCmdRepeatRunning 1");                  ## Start regelmäßiges senden der Kommandos
     CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherMaxSOCControlRunning 1");              ## MaxSOC Begrenzung weil Speicher bereits 100 % hat
     if (AttrVal("$SELF","verbose",0) >=3) {
       Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 95 % reduziert";
     };
   }
  }


Solltet Ihr noch weitere Ideen haben, dann meldet Euch einfach bei mir.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 05 August 2021, 14:59:33
Zitat von: ch.eick am 05 August 2021, 14:13:20
Hallo zusammen,
und schon geht es weiter.

Im Photovoltaikforum ist folgendes aufgetaucht.

Sobald der Speicher nicht verwendet wird kommt es zu minimalen Entladungen, die ich im Dashboard mit 10-14 W Entladung ebenfalls bereits gesehen habe.
Ist nun der Speicher bei 100 % SOC angelangt kann man nach einiger Zeit einen leichten Knick im Diagramm sehen und der Speicher wird wiederum auf 100 % nachgeladen.
Dies ist etwas unschön, da gerade in diesem Bereich "gefühlt" ziemlich viel Leistung benötigt wird, um den kleinen letzten Rest in den Speicher zu bekommen.


Ich finde den Ansatz grundsätzlich gut. Allerdings würde ich es eingrenzen das er diese Beschränkung auf 95% nur durchführt, solang die erwartete, ausstehende Tagesleistung über z.b. 3000Wh liegt. Weil ich möchte ungern in Nächten, wo ich grad so knapp durchkomme, die 5% verschenken. Was meinst du?

Ich habe das übrigens auch bei einem Korrektur DOIF so eingebaut, welche den Actual_Soc auf min 80% korrigiert. Dieses wird auch erst ausgeführt, wenn die erwartete Tagesleistung unter 10000 Wh liegt...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 05 August 2021, 15:22:13
Zitat von: Mumpitz am 05 August 2021, 14:59:33
Ich habe das übrigens auch bei einem Korrektur DOIF so eingebaut, welche den Actual_Soc auf min 80% korrigiert. Dieses wird auch erst ausgeführt, wenn die erwartete Tagesleistung unter 10000 Wh liegt...
Das ist doch bereits mit einem dynamisch berechneten MaxSOC vorhanden.
cmd_7 berechnet den Soc
cmd_6 führt es alle drei Minuten aus

Zitat
Ich finde den Ansatz grundsätzlich gut. Allerdings würde ich es eingrenzen das er diese Beschränkung auf 95% nur durchführt, solang die erwartete, ausstehende Tagesleistung über z.b. 3000Wh liegt. Weil ich möchte ungern in Nächten, wo ich grad so knapp durchkomme, die 5% verschenken. Was meinst du?
Das ist mir gerade auch noch aufgefallen und ich habe im vorherigen Post den Code nochmal erweitert. Die Tests laufen noch.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 05 August 2021, 16:17:31
Zitat von: ch.eick am 05 August 2021, 14:13:20
Hallo zusammen,
und schon geht es weiter.

I

################################################################################################################
## 11 Der Speicher ist voll geladen. Hier wird das ständige nachladen auf 100 % vermieden.
##
DOELSEIF
( [WR_1:Act_state_of_charge] == 100 or                           ## wenn der Speicher voll ist den MaxSOC wieder reduzieren, damit nicht immer nachgeladen wird
  ([WR_1_Speicher_1_ExternTrigger:SpeicherMaxSOC_Actual] == 95 and
   [WR_1:Act_state_of_charge] <  97  and [17:55]) )               ## ab 18:00 Uhr eventuell wieder nachladen

  {
   if ([WR_1:Act_state_of_charge] < 97) {
     CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherMaxSOC_Actual 100");                   ## Eventuell noch mal nachladen
     if (AttrVal("$SELF","verbose",0) >=3) {
       Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 100 % nachladen";
     };
   } else {
     CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherMaxSOC_Actual 95");
     CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherCmdRepeatRunning 1");                  ## Start regelmäßiges senden der Kommandos
     CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherMaxSOCControlRunning 1");              ## MaxSOC Begrenzung weil Speicher bereits 100 % hat
     if (AttrVal("$SELF","verbose",0) >=3) {
       Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 95 % reduziert";
     };
   }
  }




Wieso so statisch um 17:55 Uhr? Ich habe sehr gute Erfahrungen mit dem Wert "WR_1:Solar_Calculation_fc0_rest" gemacht! Dann ist das ganze etwas dynamischer. Die 5% sind doch vorallem im Winterhalbjahr wichtig, da ist vermutlich 17:55 zu spät!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 05 August 2021, 16:36:16
Zitat von: Mumpitz am 05 August 2021, 16:17:31
Wieso so statisch um 17:55 Uhr? Ich habe sehr gute Erfahrungen mit dem Wert "WR_1:Solar_Calculation_fc0_rest" gemacht! Dann ist das ganze etwas dynamischer. Die 5% sind doch vor allem im Winterhalbjahr wichtig, da ist vermutlich 17:55 zu spät!
Das war nur der erste Test, natürlich wird das dann noch dynamisch und "WR_1:Solar_Calculation_fc0_rest" finde ich einen guten Vorschlag,
jedoch berücksichtigt der Wert nicht den zu erwartenden Hausverbrauch. Ich schau es mir morgen mal in der Datenbank genauer an.

Im Winter wird es keine MaxSoc Begrenzung geben, da eh nicht genug vom Dach kommt. Dann ziehen unsere anderen Regelungen z.B. smart Laden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 August 2021, 11:01:38
Moin,
ich habe den code in diesem https://forum.fhem.de/index.php/topic,114849.msg1169307.html#msg1169307 (https://forum.fhem.de/index.php/topic,114849.msg1169307.html#msg1169307) Post wieder aktualisiert.

Das Nachladen auf 100% sollte somit 2 Stunden vor Sonnenuntergang erfolgen.
Und wie gesagt, im Winter soll das ganze nicht erfolgen, also immer auf 100% gehalten werden, wenn es die Sonne zulässt.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 06 August 2021, 19:31:50
Zitat von: ch.eick am 06 August 2021, 11:01:38
Moin,
ich habe den code in diesem https://forum.fhem.de/index.php/topic,114849.msg1169307.html#msg1169307 (https://forum.fhem.de/index.php/topic,114849.msg1169307.html#msg1169307) Post wieder aktualisiert.

Das Nachladen auf 100% sollte somit 2 Stunden vor Sonnenuntergang erfolgen.
Und wie gesagt, im Winter soll das ganze nicht erfolgen, also immer auf 100% gehalten werden, wenn es die Sonne zulässt.

VG
   Christian

Bin es am testen, bin gespannt!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 August 2021, 17:28:11
Hallo zusammen,
aus gegebenem Anlass möchte ich Euch bitte mal die Total_Efficiency Eurer Speicher zu überprüfen. Leider liegt dies bei meinem Speicher schon nach nicht ganz zwei Jahren um fast 10 % unter der bei der Inbetriebnahme. Ich habe bei EFT bereits ein Ticket aufgemacht und sollte natürlich zuerst mal die FW auf den letzten Stand bringen und einige Vollzyklen zwischen MinSOC und 100% fahren. Das hat bisher allerdings nichts gebracht und die Total_Efficiency ist innerhalb von 14 Tagen immer weiter gefallen.
Also achtet alle bitte auf Eure Garantiezeit.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 September 2021, 14:42:25
Vorankündigung: Ich habe das stateFormat nun bei mir bereits im WR_1_Speicher_1_ExternControl übernommen und auch alle readings aus dem WR_1_Speicher_1_ExternTrigger
      Hierdurch wird das DUMMY WR_1_Speicher_1_ExternTrigger überflüssig werden und es verschwindet komplett.
      Das konfigurieren der Einstellungen , wie es mit den Pull Downs im WR_1_Speicher_1_ExternTrigger erfolgt ist beim DOIF auch möglich, man lernt ja nie aus :-)

EDIT 2021 09 03: Nun ist auch die Zeitsteuerung im Status, was die Schweizer unter uns freuen wird ;-)
EDIT 2021 09 03: Die Abhängigkeiten der Parameter wurden weiter verfeinert
EDIT 2021 09 03: Der Fehler
ZitatPERL WARNING: Argument "30000 Wh" isn't numeric in numeric ge (>=) at (eval 2565240) line 33.
wurde korrigiert.
EDIT 2021 09 03: Auf dem zweiten Bild sieht man jetzt, dass z.B. nach 15:00 Uhr die Mittagssteuerung von grünen Werten wieder auf schwarz gewechselt hat.
                   Somit ist diese Steuerung abgelaufen und man sieht nur die konfigurierten Einstellungen.
                   Rechts oben hat sich die Ladeleistung noch nicht erhöht, was wahrscheinlich durch die WR Steuerung entschieden wurde. Das beobachte ich noch weiter, denn
                   die Limitierung der Leistung ist jetzt länger als drei Minuten her.
EDIT 2021 09 03: Es ist noch Farbe zu den Werten gekommen, um zu sehen was aktiv ist und wie die Werte zusammenspielen. <<< Das ist noch experimentell
EDIT 2021 09 03: Die Werte wurden in der Tabelle nochmal anders angeordnet

EDIT 2021 09 02: jetzt mit noch mehr Information, Einheiten und aktuellen Werten aus dem WR
EDIT 2021 09 02: noch ein kleines Update

Hallo Ihr Freunde der Speichersteuerung :-)

Ich habe mir mal Gedanken zum stateFormat von WR_1_Speicher_1_ExternTrigger gemacht, da dort ja sehr viele Konfigurations- und Laufzeit Parameter abgelegt sind.
Das hat mich schon die Ganze Zeit beschäftigt, wie man das übersichtlicher anzeigen könnte. hier nun mein momentaner Stand für den RAW Editor, also ersatz für das stateFormat.


attr WR_1_Speicher_1_ExternTrigger stateFormat {\
my $WR     = "WR_1";;\
my $DUMMY  = "";;\
\
my $Entladung                        = ReadingsVal($name,"SpeicherEntladung","n/a");;\
\
my $Power                            = ReadingsVal($WR,"Actual_Battery_charge_-minus_or_discharge_-plus_P","0");;\
my $Status                           = ($Power < -10) ? "<span style='color:#00FF00'>Laden</span>" : ($Power > 15)?  "<span style='color:#FF0000'>Entladen</span>"  : "<span style='color:orange'>Standby</span>";;\
    $Power                            = $Power." W";;\
\
my $Solar_Calculation_fc0_day        = ReadingsVal($WR,"Solar_Calculation_fc0_day","0");;\
\
my $Trigger                          = ReadingsVal($name,"SpeicherTrigger","none");;\
my $ExternTrigger                    = ReadingsVal($name,"SpeicherExternTrigger","none");;\
my $ZeitStart                        = ReadingsVal($name,"SpeicherZeitStart","n/a");;\
my $ZeitEnde                         = ReadingsVal($name,"SpeicherZeitEnde","n/a");;\
     \
my $CmdRepeatActive                  = ReadingsVal($name,"SpeicherCmdRepeatActive","0");;\
my $CmdRepeatRunning                 = ReadingsVal($name,"SpeicherCmdRepeatRunning","0");;\
\
my $MaxSOCControlActive              = ReadingsVal($name,"SpeicherMaxSOCControlActive","0");;\
my $MaxSOCControlRunning             = ReadingsVal($name,"SpeicherMaxSOCControlRunning","0");; \
\
my $MiddayControlActive              = ReadingsVal($name,"SpeicherMiddayControlActive","0");;\
my $MiddayControlRunning             = ReadingsVal($name,"SpeicherMiddayControlRunning","0");;\
\
my $Solar_middayhigh_fc0_start       = ReadingsVal($WR,"Solar_middayhigh_fc0_start","00:00");;\
    $Solar_middayhigh_fc0_start       = ($MaxSOCControlRunning == 1 and $MiddayControlRunning == 1) ? "12:00" : $Solar_middayhigh_fc0_start ;;\
\
my $Solar_middayhigh_fc0_stop        = ReadingsVal($WR,"Solar_middayhigh_fc0_stop","00:00");;\
my $MaxSOC_Actual                    = ReadingsVal($name,"SpeicherMaxSOC_Actual","0");;\
my $Act_state_of_charge              = sprintf("%d",ReadingsVal($WR,"Act_state_of_charge","0"));;\
my $MaxSOC_DayBefore                 = sprintf("%d %%",ReadingsVal($name,"SpeicherMaxSOC_DayBefore","0"));;\
my $MaxSOC_fc1_Limit                 = ReadingsVal($name,"SpeicherMaxSOC_fc1_Limit","0");;\
my $MaxSOC_MinSOC_Time               = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SpeicherMaxSOC_MinSOC_MinSOC",0))));;\
my $MaxSOC_MinSOC_MinSOC             = sprintf("%d %%",ReadingsVal($name,"SpeicherMaxSOC_MinSOC_MinSOC","0"));;\
\
my $Midday_NotBefore                 = ReadingsVal($name,"SpeicherMidday_NotBefore","0");;\
my $Midday_MaxSOC                    = ReadingsVal($name,"SpeicherMidday_MaxSOC","0");;\
\
my $Midday_MaxChargePowerAbs_morning = sprintf("%d W"   ,ReadingsVal($name,"SpeicherMidday_MaxChargePowerAbs_morning","0"));;\
\
    $Midday_MaxChargePowerAbs_morning = ( $MiddayControlRunning == 1 and\
                                      time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore") and\
                                          time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          $Midday_MaxSOC > $Act_state_of_charge ) ? "<span style='color:#00FF00'>$Midday_MaxChargePowerAbs_morning</span>" : $Midday_MaxChargePowerAbs_morning ;;\
\
my $Midday_MaxChargePowerAbs_midday  = sprintf("%d"   ,ReadingsVal($name,"SpeicherMidday_MaxChargePowerAbs_midday","0"));;\
    $Midday_MaxChargePowerAbs_midday  = ( $Midday_MaxChargePowerAbs_midday == 0) ? "dynamisch" : $Midday_MaxChargePowerAbs_midday." W" ;; \
    $Midday_MaxChargePowerAbs_midday  = ( $MiddayControlRunning == 1 and\
                                      time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Midday_MaxChargePowerAbs_midday</span>" : $Midday_MaxChargePowerAbs_midday ;;\
\
    $Midday_NotBefore                 = ( $MiddayControlRunning == 1 and\
                                      time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore") and\
                                      time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $MaxSOC_MinSOC_MinSOC")) ? "< <span style='color:#FF0000'>$Midday_NotBefore</span>" :\
                                        ( $MiddayControlRunning == 1 and\
                                      time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") ) ? "> <span style='color:#00FF00'>$Midday_NotBefore</span>" : $Midday_NotBefore ;;\
\
    $Midday_MaxSOC                    = ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore")) ? $Midday_MaxSOC." %" :\
                                    ( $MiddayControlRunning == 1 and\
                                      time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          $Midday_MaxSOC > $Act_state_of_charge ) ? "<span style='color:#00FF00'>$Midday_MaxSOC %</span>" : \
( time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start")) ? $Midday_MaxSOC." %" : "<span style='color:#FF0000'>$Midday_MaxSOC %</span>" ;;\
\
    $Solar_middayhigh_fc0_start       = ( $MiddayControlRunning == 1 and\
                                      time >= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Solar_middayhigh_fc0_start</span>" : $Solar_middayhigh_fc0_start ;;\
    $Solar_middayhigh_fc0_stop        = ( $MiddayControlRunning == 1 and\
                                      time >= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Solar_middayhigh_fc0_stop</span>" : $Solar_middayhigh_fc0_stop ;;\
\
\
my $Midday_Inverter_Max_Power        = sprintf("%d W"   ,ReadingsVal($name,"SpeicherMidday_Inverter_Max_Power","0"));;\
    $Midday_Inverter_Max_Power        = ($MiddayControlRunning      == 1                ) ? ">= <span style='color:#00FF00'> $Midday_Inverter_Max_Power</span>" : $Midday_Inverter_Max_Power ;;\
\
my $MinSOC_fc1_Limit                 = ReadingsVal($name,"SpeicherMinSOC_fc1_Limit","0");;\
my $MinSOC_Sommer                    = sprintf("%d %%"  ,ReadingsVal($name,"SpeicherMinSOC_Sommer","0"));;\
    $MinSOC_Sommer                    = ($Solar_Calculation_fc0_day >= $MinSOC_fc1_Limit) ? "<span style='color:#00FF00'>$MinSOC_Sommer</span>"             : $MinSOC_Sommer ;;\
\
my $MinSOC_Winter                    = sprintf("%d %%"  ,ReadingsVal($name,"SpeicherMinSOC_Winter","0"));;\
    $MinSOC_Winter                    = ($Solar_Calculation_fc0_day <  $MinSOC_fc1_Limit) ? "<span style='color:#00FF00'>$MinSOC_Winter</span>"             : $MinSOC_Winter ;;\
\
    $MinSOC_fc1_Limit                 = ($Solar_Calculation_fc0_day >= $MinSOC_fc1_Limit) ? ">= <span style='color:#00FF00'>$MinSOC_fc1_Limit Wh</span>"    : $MinSOC_fc1_Limit." Wh" ;;\
    $MaxSOC_fc1_Limit                 = ($Solar_Calculation_fc0_day >= $MaxSOC_fc1_Limit) ? ">= <span style='color:#00FF00'>$MaxSOC_fc1_Limit Wh</span>" : $MaxSOC_fc1_Limit." Wh" ;;\
\
    $MaxSOC_Actual                    = ($MaxSOCControlRunning == 1) ? "<span style='color:#00FF00'>$MaxSOC_Actual %</span>"      : $MaxSOC_Actual." %" ;;\
    $Act_state_of_charge              = $Act_state_of_charge." %";;\
    $CmdRepeatRunning                 = ($CmdRepeatRunning     == 1) ? "<span style='color:#00FF00'>$CmdRepeatRunning</span>"     : $CmdRepeatRunning ;;\
    $MaxSOCControlRunning             = ($MaxSOCControlRunning == 1) ? "<span style='color:#00FF00'>$MaxSOCControlRunning</span>" : $MaxSOCControlRunning ;;\
    $MiddayControlRunning             = ($MiddayControlRunning == 1) ? "<span style='color:#00FF00'>$MiddayControlRunning</span>" : $MiddayControlRunning ;;\
\
    $ZeitStart                        = ($Entladung eq "Zeit") ? "<span style='color:#00FF00'>$ZeitStart</span>" : $ZeitStart ;;\
    $ZeitEnde                         = ($Entladung eq "Zeit") ? "<span style='color:#00FF00'>$ZeitEnde</span>"  : $ZeitEnde  ;;\
\
"<html><table border=2 bordercolor='darkgreen' cellspacing=0>\
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Speicher<dd>Steuerung / Status / Leistung / aktueller SOC</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Entladung."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Status."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Trigger<dd>Status / ExternTrigger / Start / Ende</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Trigger."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ExternTrigger."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ZeitStart."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ZeitEnde."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Kommando Wiederholung<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$CmdRepeatActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$CmdRepeatRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MaxSOC Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOCControlActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOCControlRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / aktuell</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_fc1_Limit."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$MaxSOC_MinSOC_Time."<br>".$MaxSOC_MinSOC_MinSOC."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_DayBefore."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_Actual."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Mittags Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MiddayControlActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MiddayControlRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br><br>MaxSOC morgens / Power morgens / Power mittags</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Midday_Inverter_Max_Power."<br><br>".$Midday_MaxSOC."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Midday_NotBefore."<br><br>".$Midday_MaxChargePowerAbs_morning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_middayhigh_fc0_start."<br><br>".$Midday_MaxChargePowerAbs_midday."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_middayhigh_fc0_stop."<br><br><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MinSOC Steuerung<dd>fc1_Limit / Winter / Sommer</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_fc1_Limit."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_Winter."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_Sommer."</td></tr>\
</table>\
</html>"\
}\



Das passt dann jetzt auch zum WR_1_API . Eure Meinung ist wie immer willkommen

VG
   Christian

Im Anhang auch mal ein Screenshot vom Ergebnis
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 September 2021, 14:58:31
Hallo zusammen,
damit im FHEMWEB alles gleich aussieht habe ich für das WR_1 Device jetzt auch das Tabellen Design erstellt


attr WR_1 stateFormat {\
my $DUMMY  = "";;\
\
my $Power          = ReadingsVal($name,"Actual_Battery_charge_-minus_or_discharge_-plus_P",0);;\
my $StatusSpeicher = ($Power < -10) ? "<span style='color:#00FF00'>Laden</span>" : ($Power > 15)?  "<span style='color:#FF0000'>Entladen</span>"  : "<span style='color:orange'>Standby</span>";;\
    $Power          = $Power." W";;\
\
\
my $Battery_temperature                  = sprintf("%.1f °C",ReadingsVal($name,"Battery_temperature",0));;\
my $Actual_Battery_charge_usable_P       = sprintf("%d W",ReadingsVal($name,"Actual_Battery_charge_usable_P",0));;\
         \
my $Act_state_of_charge                  = sprintf("%d %%",ReadingsVal($name,"Act_state_of_charge","0"));;\
my $SW_Total_DC_P_sumOfAllPVInputs       = sprintf("%d W",ReadingsVal($name,"SW_Total_DC_P_sumOfAllPVInputs","0"));;\
my $SW_Total_PV_P_reserve                = sprintf("%d W",ReadingsVal($name,"SW_Total_PV_P_reserve","0"));;\
\
my $SW_Home_own_consumption_from_PV      = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_PV",0));;\
my $SW_Home_own_consumption_from_Battery = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_Battery",0));;\
my $SW_Home_own_consumption_from_grid    = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_grid",0));;\
my $SW_Home_own_consumption              = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption",0)+ReadingsVal($name,"Home_own_consumption_from_grid",0));;\
\
my $Total_Active_P_EM  = ReadingsVal($name,"Total_Active_P_EM",0);;\
my $StatusNetz         = ($Total_Active_P_EM < 0) ? "<span style='color:#00FF00'>Einspeisen</span>" : "<span style='color:#FF0000'>Netzbezug</span>";;\
    $Total_Active_P_EM  = $Total_Active_P_EM." W";;\
\
my $SW_Yield_Daily   = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Daily",0)/1000 ,0));;\
my $SW_Yield_Monthly = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Monthly",0)/1000 ,0));;\
my $SW_Yield_Yearly  = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Yearly",0)/1000 ,0));;\
my $SW_Yield_Total   = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Total",0)/1000 ,0));;\
\
my $Solar_Calculation_fc0_4h   = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_4h",0)/1000 ,0));;\
my $Solar_Calculation_fc0_day  = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_day",0)/1000 ,0));;\
my $Solar_Calculation_fc0_rest = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_rest",0)/1000 ,0));;\
\
"<html><table border=2 bordercolor='darkgreen' cellspacing=0>\
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Wechselrichter / KSEM<dd>Max DC / PV Reserve / Netz Leistung</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_DC_P_sumOfAllPVInputs."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_PV_P_reserve."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusNetz."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Total_Active_P_EM."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Leistung<dd>von PV / von Batterie / vom Netz / ins Haus</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_PV."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_Battery."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_grid."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Ertrag<dd>Tag / Monat / Jahr / Total</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Daily."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Monthly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Yearly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Total."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Prognose<dd>Tag / 4 Stunden / Resttag</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_day."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_4h."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_rest."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Speicher<dd>Temperatur / nutzbare Ladung / Leistung / aktueller SOC</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Battery_temperature."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Actual_Battery_charge_usable_P."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusSpeicher."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>\
</table>\
</html>"\
}\



Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 September 2021, 16:19:53
Hallo zusammen,

hier nochmal ein Update zum aktuellen Stand.

Neu, also noch nicht im Wiki ist die Status Tabelle
(siehe Bild 1)
und die dynamische Berechnung mit welcher Stärke der Speicher mittags geladen werden soll. Hier kann man aber auch einen festen Wert vorgeben, wobei ich jedoch letzte Tage festgestellt hatte, das es abhängig von der Länge des Mittagshochs dann doch noch zu einer weiteren Ladung am Nachmittag kommt. Mit der jetzigen dynamic verändert sich die Ladeleistung und soll zum Ende des Mittagshochs den Speicher nahezu auf den gewünschten SOC gebracht haben. Somit hat schlechtes Wetter am Nachmittag kaum noch eine Chance.

Die Prognose aktualisiert sich natürlich stündlich und hätte somit auch sofort Einfluss auf das Ladeverhalten.

Das Bild 2 ist mal ein Graph von gestern und heute.

- Gestern war kein Mittagshoch, also hat er schon morgens sofort geladen, unterbrochen von der Wärmepumpe, weil die Frau putzen wollte :-)
- Heute war wieder wärmeres Wasser gefordert, deshalb blieb ab 9 Uhr fast nichts für den Speicher übrig
- Ab 12 wurde dann stärker geladen, also in Abhängigkeit der Zeit 12:00 - 15:00 Uhr und der zu erreichenden SOC Differenz (das fine Tuning ist noch im Gange, weil ich das erst gestern eingebaut habe)

Bild 2 unten ist die Prognose in hell grün für heute und rot, was bereits gestern berechnet wurde.
Das zackige grüne ist die aktuelle Leistung.

Bild 3
zeigt das Ladefenster vom Mittag, bei dem um 15:00 Uhr das Mittagshoch beendet war.
Von 14:00 - 15:00 Uhr wurde die Ladekurve nicht mehr so aggressiv nachgeführt, damit am Nachmittag auch noch etwas geladen wird.
Dadurch lief die orange- und die blaue Kurve aufeinander zu und verengte sich.
Ab 15:00 Uhr wurde dann die Limitierung aufgehoben und der Plenticore hat wieder selber entschieden.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 September 2021, 14:44:51
Zitat von: Mumpitz am 09 September 2021, 14:14:09
Ist es möglich das sich hier ein Fehler eingeschlichen hat? Im WR_1 Device habe ich doch die Werte des Ertrags von heute, Tag, Monat, Jahr und Total nicht, oder? Die müssten doch vom API Device stammen?
Moin,
ich hatte das neue stateFormat noch nicht gepostet :-)

Und im WR_1 werden diese Werte über modBus geliefert, jedoch nicht alle Statistiken. Es kommt dabei auch schon mal zu Abweichungen, je nachdem wann man drauf schaut.
Diese vier Statistiken lasse ich jedoch im Device, da nicht jeder das API Device verwenden möchte.

VG
   Christian

Hier kommen dann mal alle drei stateFormat als RAW, so wie ich sie nun verwende und getestet habe.

WR_1

attr WR_1 stateFormat {\
my $DUMMY  = "";;\
\
my $Power          = ReadingsVal($name,"Actual_Battery_charge_-minus_or_discharge_-plus_P",0);;\
my $StatusSpeicher = ($Power < -10) ? "<span style='color:#00FF00'>Laden</span>" : ($Power > 15)?  "<span style='color:#FF0000'>Entladen</span>"  : "<span style='color:orange'>Standby</span>";;\
    $Power          = $Power." W";;\
\
\
my $Battery_temperature                  = sprintf("%.1f °C",ReadingsVal($name,"Battery_temperature",0));;\
my $Actual_Battery_charge_usable_P       = sprintf("%d W",ReadingsVal($name,"Actual_Battery_charge_usable_P",0));;\
         \
my $Act_state_of_charge                  = sprintf("%d %%",ReadingsVal($name,"Act_state_of_charge","0"));;\
my $SW_Total_DC_P_sumOfAllPVInputs       = sprintf("%d W",ReadingsVal($name,"SW_Total_DC_P_sumOfAllPVInputs","0"));;\
my $SW_Total_PV_P_reserve                = sprintf("%d W",ReadingsVal($name,"SW_Total_PV_P_reserve","0"));;\
\
my $SW_Home_own_consumption_from_PV      = sprintf("%d",ReadingsVal($name,"SW_Home_own_consumption_from_PV",0));;\
    $SW_Home_own_consumption_from_PV = ($SW_Home_own_consumption_from_PV >= 0) ? $SW_Home_own_consumption_from_PV." W" : "0 W";;\
my $SW_Home_own_consumption_from_Battery = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_Battery",0));;\
my $SW_Home_own_consumption_from_grid    = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_grid",0));;\
my $SW_Home_own_consumption              = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption",0)+ReadingsVal($name,"Home_own_consumption_from_grid",0));;\
\
my $Total_Active_P_EM  = ReadingsVal($name,"Total_Active_P_EM",0);;\
my $StatusNetz         = ($Total_Active_P_EM < -10) ? "<span style='color:#00FF00'>Einspeisen</span>" : ($Total_Active_P_EM > 15)?  "<span style='color:#FF0000'>Netzbezug</span>"  : "<span style='color:orange'>Standby</span>";;\
    $Total_Active_P_EM  = $Total_Active_P_EM." W";;\
\
my $SW_Yield_Daily   = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Daily",0)/1000 ,0));;\
my $SW_Yield_Monthly = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Monthly",0)/1000 ,0));;\
my $SW_Yield_Yearly  = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Yearly",0)/1000 ,0));;\
my $SW_Yield_Total   = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Total",0)/1000 ,0));;\
\
my $Solar_Calculation_fc0_4h   = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_4h",0)/1000 ,0));;\
my $Solar_Calculation_fc0_day  = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_day",0)/1000 ,0));;\
my $Solar_Calculation_fc0_rest = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_rest",0)/1000 ,0));;\
\
"<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'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Wechselrichter / KSEM<dd>Max DC / PV Reserve / Netz Leistung</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_DC_P_sumOfAllPVInputs."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_PV_P_reserve."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusNetz."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Total_Active_P_EM."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Leistung<dd>von PV / von Batterie / vom Netz / ins Haus</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_PV."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_Battery."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_grid."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Ertrag<dd>Tag / Monat / Jahr / Total</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Daily."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Monthly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Yearly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Total."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Prognose<dd>Tag / 4 Stunden / Resttag</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_day."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_4h."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_rest."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Speicher<dd>Temperatur / nutzbare Ladung / Leistung / aktueller SOC</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Battery_temperature."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Actual_Battery_charge_usable_P."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusSpeicher."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>\
</table>\
</html>"\
}\


WR_1_API

attr WR_1_API stateFormat {\
my $calcVal=0;;\
my $WR="WR_1";;\
\
my $pvt   = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",0) );;\
my $pvtd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Day",0)/1000 );;\
my $pvtm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Month",0)/1000 );;\
my $pvty  = sprintf("%05d kWh",ReadingsVal("$name","SW_Statistic_Yield_Year",0)/1000 );;\
\
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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Day",0)/1000 );;\
my $pvm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Month",0)/1000 );;\
my $pvy  = sprintf("%05d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Year",0)/1000 );;\
\
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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Day",0)/1000 );;\
my $gfim = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Month",0)/1000 );;\
my $gfiy = sprintf("%05d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Year",0)/1000 );;\
\
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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Day",0)/1000 );;\
my $ebm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Month",0)/1000 );;\
my $eby  = sprintf("%05d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000 );;\
\
my $pvb   = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0));;\
my $pvbd  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Day",0)/1000 );;\
my $pvbm  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Month",0)/1000 );;\
my $pvby  = sprintf("%05d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Year",0)/1000 );;\
\
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 kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Day",0)/1000 );;\
my $etm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Month",0)/1000 );;\
my $ety  = sprintf("%05d kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Year",0)/1000 );;\
\
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))));;\
my $cy   = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Year",0))));;\
\
"<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</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</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>Jahr</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>"\
}\


WR_1_Speicher_1_ExternControl
Hierfür bitte vorher noch alle readings aus dem alten, nicht mehr verwendeten DUMMY übernehmen.
Da die readings nun direkt im DOIF sind, sind natürlich auch die Code Stements anzupassen.

attr WR_1_Speicher_1_ExternControl stateFormat {\
my $WR     = "WR_1";;\
my $DUMMY  = "";;\
\
my $Entladung                        = ReadingsVal($name,"SpeicherEntladung","n/a");;\
\
my $Power                            = ReadingsVal($WR,"Actual_Battery_charge_-minus_or_discharge_-plus_P","0");;\
my $Status                           = ($Power < -10) ? "<span style='color:#00FF00'>Laden</span>" : ($Power > 15) ?  "<span style='color:#FF0000'>Entladen</span>" : "<span style='color:orange'>Standby</span>";;\
    $Power                            = $Power." W";;\
\
my $Solar_Calculation_fc0_day        = ReadingsVal($WR,"Solar_Calculation_fc0_day","0");;\
        \
my $Trigger                          = ReadingsVal($name,"SpeicherTrigger","none");;\
my $ExternTrigger                    = ReadingsVal($name,"SpeicherExternTrigger","none");;\
my $ZeitStart                        = ReadingsVal($name,"SpeicherZeitStart","n/a");;\
my $ZeitEnde                         = ReadingsVal($name,"SpeicherZeitEnde","n/a");;\
                                                                                                             \
my $CmdRepeatActive                  = ReadingsVal($name,"SpeicherCmdRepeatActive","0");;\
my $CmdRepeatRunning                 = ReadingsVal($name,"SpeicherCmdRepeatRunning","0");;\
        \
my $MaxSOCControlActive              = ReadingsVal($name,"SpeicherMaxSOCControlActive","0");;\
my $MaxSOCControlRunning             = ReadingsVal($name,"SpeicherMaxSOCControlRunning","0");; \
        \
my $MiddayControlActive              = ReadingsVal($name,"SpeicherMiddayControlActive","0");;\
my $MiddayControlRunning             = ReadingsVal($name,"SpeicherMiddayControlRunning","0");;\
        \
my $Solar_middayhigh_fc0_start       = ReadingsVal($WR,"Solar_middayhigh_fc0_start","00:00");;\
    $Solar_middayhigh_fc0_start       = ($MaxSOCControlRunning == 1 and $MiddayControlRunning == 1) ? "12:00" : $Solar_middayhigh_fc0_start ;;\
\
my $Solar_middayhigh_fc0_stop        = ReadingsVal($WR,"Solar_middayhigh_fc0_stop","00:00");;\
my $MaxSOC_Actual                    = ReadingsVal($name,"SpeicherMaxSOC_Actual","0");;\
my $Act_state_of_charge              = sprintf("%d",ReadingsVal($WR,"Act_state_of_charge","0"));;\
my $MaxSOC_DayBefore                 = sprintf("%d %%",ReadingsVal($name,"SpeicherMaxSOC_DayBefore","0"));;\
my $MaxSOC_fc1_Limit                 = ReadingsVal($name,"SpeicherMaxSOC_fc1_Limit","0");;\
my $MaxSOC_MinSOC_Time               = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SpeicherMaxSOC_MinSOC_MinSOC",0))));;\
my $MaxSOC_MinSOC_MinSOC             = sprintf("%d %%",ReadingsVal($name,"SpeicherMaxSOC_MinSOC_MinSOC","0"));;\
\
my $Midday_NotBefore                 = ReadingsVal($name,"SpeicherMidday_NotBefore","0");;\
my $Midday_MaxSOC                    = ReadingsVal($name,"SpeicherMidday_MaxSOC","0");;\
\
my $Midday_MaxChargePowerAbs_morning = sprintf("%d W"   ,ReadingsVal($name,"SpeicherMidday_MaxChargePowerAbs_morning","0"));;\
\
    $Midday_MaxChargePowerAbs_morning = ( $MiddayControlRunning == 1 and\
                                              time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore") and\
                                          time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          $Midday_MaxSOC > $Act_state_of_charge ) ? "<span style='color:#00FF00'>$Midday_MaxChargePowerAbs_morning</span>" : $Midday_MaxChargePowerAbs_morning ;;\
\
my $Midday_MaxChargePowerAbs_midday  = sprintf("%d"   ,ReadingsVal($name,"SpeicherMidday_MaxChargePowerAbs_midday","0"));;\
    $Midday_MaxChargePowerAbs_midday  = ( $Midday_MaxChargePowerAbs_midday == 0) ? "dynamisch" : $Midday_MaxChargePowerAbs_midday." W" ;; \
    $Midday_MaxChargePowerAbs_midday  = ( $MiddayControlRunning == 1 and\
                                              time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Midday_MaxChargePowerAbs_midday</span>" : $Midday_MaxChargePowerAbs_midday ;;\
\
    $Midday_NotBefore                 = ( $MiddayControlRunning == 1 and\
                                              time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore") and\
                                              time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $MaxSOC_MinSOC_Time")) ? "< <span style='color:#FF0000'>$Midday_NotBefore</span>" :\
                                        ( $MiddayControlRunning == 1 and\
                                              time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") ) ? "> <span style='color:#00FF00'>$Midday_NotBefore</span>" : $Midday_NotBefore ;;\
\
    $Midday_MaxSOC                    = ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore")) ? $Midday_MaxSOC." %" :\
                                            ( $MiddayControlRunning == 1 and\
                                              time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          $Midday_MaxSOC > $Act_state_of_charge ) ? "<span style='color:#00FF00'>$Midday_MaxSOC %</span>" : \
                                                                                ( time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start")) ? $Midday_MaxSOC." %" : "<span style='color:#FF0000'>$Midday_MaxSOC %</span>" ;;\
\
    $Solar_middayhigh_fc0_start       = ( $MiddayControlRunning == 1 and\
                                              time >= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Solar_middayhigh_fc0_start</span>" : $Solar_middayhigh_fc0_start ;;\
    $Solar_middayhigh_fc0_stop        = ( $MiddayControlRunning == 1 and\
                                              time >= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Solar_middayhigh_fc0_stop</span>" : $Solar_middayhigh_fc0_stop ;;\
\
\
my $Midday_Inverter_Max_Power        = sprintf("%d W"   ,ReadingsVal($name,"SpeicherMidday_Inverter_Max_Power","0"));;\
    $Midday_Inverter_Max_Power        = ($MiddayControlRunning      == 1                ) ? ">= <span style='color:#00FF00'> $Midday_Inverter_Max_Power</span>" : $Midday_Inverter_Max_Power ;;\
\
my $MinSOC_fc1_Limit                 = ReadingsVal($name,"SpeicherMinSOC_fc1_Limit","0");;\
my $MinSOC_Sommer                    = sprintf("%d %%"  ,ReadingsVal($name,"SpeicherMinSOC_Sommer","0"));;\
    $MinSOC_Sommer                    = ($Solar_Calculation_fc0_day >= $MinSOC_fc1_Limit) ? "<span style='color:#00FF00'>$MinSOC_Sommer</span>"             : $MinSOC_Sommer ;;\
\
my $MinSOC_Winter                    = sprintf("%d %%"  ,ReadingsVal($name,"SpeicherMinSOC_Winter","0"));;\
    $MinSOC_Winter                    = ($Solar_Calculation_fc0_day <  $MinSOC_fc1_Limit) ? "<span style='color:#00FF00'>$MinSOC_Winter</span>"             : $MinSOC_Winter ;;\
\
    $MinSOC_fc1_Limit                 = ($Solar_Calculation_fc0_day >= $MinSOC_fc1_Limit) ? ">= <span style='color:#00FF00'>$MinSOC_fc1_Limit Wh</span>"    : $MinSOC_fc1_Limit." Wh" ;;\
    $MaxSOC_fc1_Limit                 = ($Solar_Calculation_fc0_day >= $MaxSOC_fc1_Limit) ? ">= <span style='color:#00FF00'>$MaxSOC_fc1_Limit Wh</span>" : $MaxSOC_fc1_Limit." Wh" ;;\
\
    $MaxSOC_Actual                    = ($MaxSOCControlRunning == 1) ? "<span style='color:#00FF00'>$MaxSOC_Actual %</span>"      : $MaxSOC_Actual." %" ;;\
    $Act_state_of_charge              = $Act_state_of_charge." %";;\
    $CmdRepeatRunning                 = ($CmdRepeatRunning     == 1) ? "<span style='color:#00FF00'>$CmdRepeatRunning</span>"     : $CmdRepeatRunning ;;\
    $MaxSOCControlRunning             = ($MaxSOCControlRunning == 1) ? "<span style='color:#00FF00'>$MaxSOCControlRunning</span>" : $MaxSOCControlRunning ;;\
    $MiddayControlRunning             = ($MiddayControlRunning == 1) ? "<span style='color:#00FF00'>$MiddayControlRunning</span>" : $MiddayControlRunning ;;\
\
    $ZeitStart                        = ($Entladung eq "Zeit") ? "<span style='color:#00FF00'>$ZeitStart</span>" : $ZeitStart ;;\
    $ZeitEnde                         = ($Entladung eq "Zeit") ? "<span style='color:#00FF00'>$ZeitEnde</span>"  : $ZeitEnde  ;;\
\
"<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'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Speicher<dd>Steuerung / Status / Leistung / aktueller SOC</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Entladung."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Status."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Trigger<dd>Status / ExternTrigger / Start / Ende</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Trigger."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ExternTrigger."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ZeitStart."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ZeitEnde."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Kommando Wiederholung<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$CmdRepeatActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$CmdRepeatRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MaxSOC Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOCControlActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOCControlRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / Ziel</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_fc1_Limit."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$MaxSOC_MinSOC_Time."<br>".$MaxSOC_MinSOC_MinSOC."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_DayBefore."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_Actual."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Mittags Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MiddayControlActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MiddayControlRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br><br>MaxSOC morgens / Power morgens / Power mittags</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Midday_Inverter_Max_Power."<br><br>".$Midday_MaxSOC."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Midday_NotBefore."<br><br>".$Midday_MaxChargePowerAbs_morning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_middayhigh_fc0_start."<br><br>".$Midday_MaxChargePowerAbs_midday."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_middayhigh_fc0_stop."<br><br><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MinSOC Steuerung<dd>fc1_Limit / Winter / Sommer</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_fc1_Limit."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_Winter."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_Sommer."</td></tr>\
</table>\
</html>"\
}\
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 September 2021, 15:07:26
Und hier noch etwas zum Testen, für die ganz verwegenen Anwender ;-)

Hier sind alle Änderungen des WR_1_Speicher_1_ExternControl beinhaltet.
- aktuelles stateFormat
- Code Korrekturen
   * kleinere Änderung von readings Namen
   * uiTable Events beim DOELSEIF
   * dynamische Leistungsberechnung für die Speicherladung im Mittagshoch
   * Einige überflüssige Wiederholungen von Speicher Kommandos wurden entfernt
   * In diesem Listing habe ich cmd_12 für die direkte Abfrage des BYD HV bereits herausgenommen, da den wohl außer mir keiner hat :-)

- uiTable Definitionen, die eine zweite Tabelle im FHEMWEB erzeugen, um die Konfiguration von WR_1_Speicher_1_ExternControl direkt zu verändern.
   Das Layout entpricht in Grundzügen der stateFormat Definition, ist aber noch lange nicht fertig.

   * Man kann z.B. auch einen DOIF Zweig aus einem Pull Down Menü ausführen lassen.
   * Die Unterfunktionen werden über 0/1 deaktiviert/aktiviert
   * Werte lassen sich verändern
   * Uhrzeiten sind Einstellbar

Aber Achtung, das ist mein Lernstand von gestern Nacht!
Ich möchte jetzt noch stateFormat und uiTable in eine Tabelle überführen, wo ich jedoch noch nicht genügend Kenntnisse habe.

VG
   Christian

WR_1_Speicher_1_ExternControl

defmod WR_1_Speicher_1_ExternControl DOIF ################################################################################################################\
## 1 Speicher Status vom WR_1_Speicher_1 aktualisieren.\
##   Dies geschieht über das WR_1_API Device, da der Speicher direkt am Wechselrichter angeschlossen ist.\
##\
([:58])\
  {\
   CommandGet(undef, "WR_1_API 21_Battery_Information");;\
   CommandGet(undef, "WR_1_API 22_Battery_InternControl");;\
   CommandGet(undef, "WR_1_API 23_Battery_ExternControl");;\
   CommandGet(undef, "WR_1_API 25_Battery_EM_State");;\
\
   ## Schattenmanagement \
   if ($hour == 8)   {\
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 0");;                             ## Komplett aus\
   };;\
   if ($hour == 18) {\
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 2");;                             ## Im Westen unten einschalten\
   };;\
   if ($hour == 21) {\
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 1");;                             ## Schattenmanagement für den Osten vorbereiten\
   };;\
  }\
\
################################################################################################################\
## 2 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden\
##\
## Im Winter kann der MinSoc, durch den WR Eigenverbrauch, unterschritten werden, deshalb wird vorher auf\
## smarte_laden umgeschaltet, bis die Batterie wieder einen hohen Soc erreicht hat. Siehe cmd_3 laden_beendet\
##\
DOELSEIF\
([$SELF:ui_command] eq "smart_laden start" or\
  [WR_1:Solar_Calculation_fc0_day] < [$SELF:SpeicherMinSOC_fc1_Limit] and       ## Im Herbst/Winter ist wenig zu erwarten\
  [WR_1:Act_state_of_charge] <= [WR_1_API:Battery_InternControl_MinSoc] and     ## Achtung der Speicherstand wird zu niedrig\
  [WR_1_API:Battery_InternControl_MinHomeConsumption] <= 100 )                  ## Der Speicher steht auf Entladen\
  {\
   CommandGet(undef, "WR_1_Speicher_1 BatteryInformation");;\
   CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption [WR_1_API:Battery_Info_WorkCapacity]");; ## Speicher für Entladung sperren\
   if (AttrVal("$SELF","verbose",0) >=3)\
       {Log 3, "$SELF cmd_2  : smart_laden aktiviert"};;\
   CommandSetReading(undef, "$SELF SpeicherExternTrigger gesperrt");;            ## Externe Trigger verriegeln \
   if (AttrVal("$SELF","verbose",0) >=3)\
       {Log 3, "$SELF cmd_2  : SpeicherExternTrigger, Entlademodus gesperrt"};;\
  }\
\
################################################################################################################\
## 3 Beim erreichen von 90% Soc die Entladung wieder frei geben oder\
##   bei Zeitsteuerung und guter Prognose auch schon bei 40%\
DOELSEIF\
([$SELF:ui_command] eq "smart_laden beenden" or\
  [WR_1_API:Battery_InternControl_MinHomeConsumption] > 100 and                 ## Der Speicher wird voll und wieder\
  ([WR_1:Act_state_of_charge] >= 90                                             ## zum Entladen frei gegeben\
   or\
   [$SELF:SpeicherEntladung]  eq "Zeit" and                                     ## Bei Zeitsteuerung\
   [WR_1:Act_state_of_charge] >= 40 and                                         ## und einem Stand von Soc 40%\
   ([WR_1:Solar_Calculation_fc0_day] > [$SELF:SpeicherMaxSOC_fc1_Limit]         ## wenn es heute oder \
    or\
    [WR_1:Solar_Calculation_fc1_day] > [$SELF:SpeicherMaxSOC_fc1_Limit])        ## morgen viel Leistung gibt\
  )\
)\
\
{\
  if ( ReadingsVal("$SELF","SpeicherEntladung","Automatik") eq "Automatik" ) {  ## Bei Automatik sofort auf Entladen\
    if (AttrVal("$SELF","verbose",0) >=3)\
      {Log 3, "$SELF cmd_3  : Batterie auf [WR_1:Act_state_of_charge] %, Entlademodus freigegeben"};;\
    CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");;\
    CommandSetReading(undef, "$SELF SpeicherExternTrigger none");;\
  } else {                                                                      ## Ansonsten die Zeitsteuerung oder den\
    if (AttrVal("$SELF","verbose",0) >=3)\
      {Log 3, "$SELF cmd_3  : Batterie auf [WR_1:Act_state_of_charge] %, SpeicherExternTrigger, freigegeben"};;\
    CommandSetReading(undef, "$SELF SpeicherExternTrigger frei");;               ## Trigger freigeben\
    CommandSetReading(undef, "$SELF SpeicherTrigger entladen");;                 ## Signalisiere entladen im stateFormat\
  }\
}\
\
################################################################################################################\
## 4 Freigabe der Batterie mit externem Trigger\
##   z.B. ([07:00-16:00]\
DOELSEIF\
([$SELF:SpeicherExternTrigger] eq "frei" and                                   ## Verriegelung, wenn zwangsgeladen werden muss\
\
   ([$SELF:SpeicherEntladung] eq "Trigger" and                                  ## Triggersteuerung\
    [$SELF:SpeicherTrigger]   eq "entladen"                                     ## also Speicherentladung freigeben\
    or                                                                         \
    [$SELF:SpeicherEntladung] eq "Zeit" and                                     ## oder bei Zeitsteuerung wenn das\
    [[$SELF:SpeicherZeitStart]-[$SELF:SpeicherZeitEnde]])                       ## Zeitfenster aktiv ist\
\
  )\
{\
  CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");;            ## Speicher für Entladung freigeben\
  CommandSetReading(undef, "$SELF SpeicherTrigger entladen");;                   ## Signalisiere entladen im stateFormat\
  if (AttrVal("$SELF","verbose",0) >=3)\
    {Log 3, "$SELF cmd_4  : SpeicherExternTrigger, Entlademodus freigegeben"};;\
}\
\
################################################################################################################\
## 5 Sperren der Batterie mit externem Trigger\
##   z.B. [16:00-07:00]\
DOELSEIF\
([$SELF:SpeicherExternTrigger] eq "frei" and                                   ## Verriegelung, wenn zwangsgeladen werden muss\
                               \
   ([$SELF:SpeicherEntladung]  eq "Trigger" and                                 ## Triggersteuerung\
    [$SELF:SpeicherTrigger]    eq "gesperrt"                                    ## also Speicherentladung sperren\
    or                                                                         \
    [$SELF:SpeicherEntladung]  eq "Zeit" and                                    ## oder bei Zeitsteuerung wenn das\
    [[$SELF:SpeicherZeitEnde]-[$SELF:SpeicherZeitStart]])                       ## Zeitfenster verlassen wurde\
\
  )\
{\
  CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption [WR_1_API:Battery_Info_WorkCapacity]");;  ## Speicher für Entladung sperren\
  CommandSetReading(undef, "$SELF SpeicherTrigger gesperrt");;                   ## Signalisiere gesperrt im stateFormat\
  if (AttrVal("$SELF","verbose",0) >=3)\
    {Log 3, "$SELF cmd_5  : SpeicherExternTrigger, Entlademodus gesperrt (Tarif oder Trigger)"};;\
}\
\
################################################################################################################\
## 6 Wiederhole alle 180s die Kommandos der ExternControl Steuerung\
##\
DOELSEIF\
([$SELF:ui_command] eq "3 Minuten Wiederholung" or\
  [WR_1_API:Battery_Control] > 0 and                                            ## Wenn die ExternControl am WR konfiguriert ist\
  [$SELF:SpeicherCmdRepeatActive]  == 1 and                                     ## Wenn die ExternControl Aktiviert ist\
  [$SELF:SpeicherCmdRepeatRunning] == 1 and                                     ## Wenn es  ExternControl Kommandos zum Senden gibt\
  [  {sunrise_abs("HORIZON=+5.0",0,"6:00","08:35")}                             \
   - {sunset_abs("HORIZON=+8.0",0,"15:00","21:00")} ] and [+180] )              ## alle 3 Minuten den Befehl wiederholen\
  \
  {\
   CommandSetReading(undef, "$SELF ui_command ---");;\
   my $MaxChargePowerTime = 0;;\
   my $MaxChargePowerAbs_midday = 0;;\
\
   if ([$SELF:SpeicherMiddayControlRunning] == 1 ) {                            ## Wurde ein Mittagshoch ermittelt und aktiviert?\
\
     if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [$SELF:SpeicherMidday_NotBefore]") and\
           [WR_1:Act_state_of_charge] >= [WR_1_API:Battery_InternControl_MinSoc] *3 ) {\
       CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");;     ## nicht vor z.B. 09:00 Uhr starten. Ladung auf 0 Watt setzen\
       if (AttrVal("$SELF","verbose",0) >=3) {                                  ## Es wird nur langsam geladen und MaxSOC limitiert.\
         Log 3, "$SELF cmd_6  : SpeicherMiddayControl vor [$SELF:SpeicherMidday_NotBefore] Uhr noch nicht laden";;\
       };;\
     } else { \
       if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_start]") ) {   ## Ist noch Vormittag?\
         CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs [$SELF:SpeicherMidday_MaxChargePowerAbs_morning]");;\
         CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [$SELF:SpeicherMidday_MaxSOC]");;\
         if (AttrVal("$SELF","verbose",0) >=3) {                                ## Es wird nur langsam geladen und MaxSOC limitiert.\
           Log 3, "$SELF cmd_6  : SpeicherMiddayControl vor [WR_1:Solar_middayhigh_fc0_start] limitieren";;\
           Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxChargePowerAbs auf [$SELF:SpeicherMidday_MaxChargePowerAbs_morning] limitiert";;\
           Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxSOC auf [$SELF:SpeicherMidday_MaxSOC] % limitiert";;\
         };;\
       };;\
     };;\
\
     if (time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_start]") <= time and  ## Es ist Mittag\
         time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_stop]") ) {\
\
       if ([$SELF:SpeicherMaxSOCControlRunning] == 1 and                                                             ## Somit bleibt weniger Platz im Speicher und es ist\
           time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 12:00") ) {                             ##    besser nicht vor 12:00 Uhr zu beginnen.\
         CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");;\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_6  : SpeicherMiddayControlActive laden wegen MaxSoc von [WR_1:Solar_middayhigh_fc0_start] auf 12:00 Uhr verschoben"};;\
       } else {                                                                                                      ## auch jetzt nicht mit voller Leistung laden\
\
         if ([$SELF:SpeicherMidday_MaxChargePowerAbs_midday] == 0) {                                                 ## dynamische Leistungsermittlung oder vorgewählter Wert\
           $MaxChargePowerTime = round((time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_stop]") - time) / 3600 , 2);;  ## Mittags Ladezeit bestimmen\
           if ( $MaxChargePowerTime < 1 ) { $MaxChargePowerTime = 1;;};;\
           $MaxChargePowerAbs_midday  = round( [WR_1:Battery_work_capacity] * ([$SELF:SpeicherMaxSOC_Actual] - [WR_1:Act_state_of_charge]) / 100 / $MaxChargePowerTime , 0);;\
           if ($MaxChargePowerAbs_midday < 0) { $MaxChargePowerAbs_midday = 0 };;                                     ## Nicht unter 0\
           Log 3, "$SELF Test   : Mittags $MaxChargePowerTime h mit $MaxChargePowerAbs_midday W laden";;\
         } else {\
           $MaxChargePowerAbs_midday = [$SELF:SpeicherMidday_MaxChargePowerAbs_midday];;                              ## Nimm den vorgewählten Wert\
         };;\
\
         CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs $MaxChargePowerAbs_midday");;\
         CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual]");;\
         if (AttrVal("$SELF","verbose",0) >=3) {\
           Log 3, "$SELF cmd_6  : SpeicherMiddayControlActive laden von [WR_1:Solar_middayhigh_fc0_start] bis [WR_1:Solar_middayhigh_fc0_stop] freigegeben";;\
           Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxChargePowerAbs auf $MaxChargePowerAbs_midday limitiert";;\
           Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual] % halten"\
         };;\
       };;\
     };;\
\
     if (time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_stop]") ) {    ## Es ist Nachmittag und die\
       CommandSetReading(undef, "$SELF SpeicherMiddayControlRunning 0");;                                             ## Mittagssteuerung wird abgeschaltet\
       CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual]");;\
       if (AttrVal("$SELF","verbose",0) >=3) {\
         Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual] % halten";;\
         Log 3, "$SELF cmd_6  : SpeicherMiddayControl nach [WR_1:Solar_middayhigh_fc0_stop] beendet";;\
       };;\
     };;\
   };;\
\
   if ([$SELF:SpeicherMaxSOCControlRunning] == 1 and                                           ## Nur MaxSOC soll begrenzt werden\
       [$SELF:SpeicherMaxSOC_Actual] <= 100      and                                          \
       [$SELF:SpeicherMiddayControlRunning] == 0) {                                            ##  sobald die Mittagssteuerung fertig ist\
     CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual]");;\
     if (AttrVal("$SELF","verbose",0) >=3)\
       {Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual] % halten"};;\
   };;\
\
   if (AttrVal("$SELF","verbose",0) >=4)\
     {Log 3, "$SELF cmd_6  : ExternControl Kommandowiederholung erledigt"};;\
  }\
\
################################################################################################################\
## 7 Bestimmung eines möglichen SOC für den nächsten Morgen und\
##   Vorbereitung für ein Leistungshoch am Mittag\
##\
DOELSEIF\
([WR_1_API:Battery_Control] > 0 and                                                           ## Ist die ExternControl am WR aktiviert\
  ([$SELF:SpeicherMaxSOCControlActive] == 1 or                                                 ## Ist MaxSOC Limit konfiguriert\
   [$SELF:SpeicherMiddayControlActive] == 1 ) and                                              ## Ist Midday Kontrolle konfiguriert\
   [$SELF:SpeicherMaxSOC_MinSOC_Time] eq "NULL" and                                            ## Wurde ein minimum SOC bereits ermittelt\
   [{sunrise_abs("HORIZON=+4.0",0,"5:50","08:35")} - 10:00 ] and\
   [WR_1:SW_Home_own_consumption_from_PV] == [WR_1:SW_Home_own_consumption] )                  ## Die PV Leistung reicht für's Haus\
\
  {\
   my $MinSOC_Time   = "gefunden";;                                                             ## Nur einmal am Tag bearbeiten\
   my $MinSOC_MinSOC = round(ReadingsVal("WR_1","Act_state_of_charge", 0),0);;                  ## Festgestellter MinSOC am Morgen\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_MinSOC_Time ".$MinSOC_Time);;\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_MinSOC_MinSOC ".$MinSOC_MinSOC);;\
   if (AttrVal("$SELF","verbose",0) >=3) {                                                     ## merken und melden\
     Log 3, "$SELF cmd_7  : SpeicherMaxSOC_MinSOC_Time ".$MinSOC_Time." ".$MinSOC_MinSOC." %";;\
   };;\
\
#############\
\
   if ([$SELF:SpeicherMaxSOCControlActive] ==   1 and\
       [WR_1_API:Battery_InternControl_MinHomeConsumption]         <  100 and                  ## Der Speicher darf nicht im smart_laden sein\
       [Pool_Counter:countsPerDay] == 0 and                                                    ## Achtung der Pool und auch die LWP\
       [LWP_Counter:countsPerDay]  == 0 ) {                                                    ##    sollten nicht mehr früh morgens laufen\
\
     my $SpeicherSOCMinimum = [WR_1_API:Battery_InternControl_MinSoc]*3;;                       ## 3x MinSOC als reserve vorsehen\
     my $SpeicherSOCDayBefore = round(ReadingsVal("$SELF","SpeicherMaxSOC_DayBefore", 100),0);; ## wie voll war er gestern noch?\
     my $SpeicherSOCNew       = 0;;\
     my $SpeicherSOCDelta     = 0;;\
\
     if ([WR_1:Solar_Calculation_fc1_day] > [$SELF:SpeicherMaxSOC_fc1_Limit] and\
         $MinSOC_MinSOC                   > $SpeicherSOCMinimum ) {                            ## Ist der Speicher voller als er müsste?\
\
       if (AttrVal("$SELF","verbose",0) >=3){\
         Log 3, "$SELF cmd_7  : SpeicherMaxSOC_DayBefore ".$SpeicherSOCDayBefore." %";;\
         Log 3, "$SELF cmd_7  : Leistung Prognose [WR_1:Solar_Calculation_fc1_day] wh > Schwellwert [$SELF:SpeicherMaxSOC_fc1_Limit] wh";;\
         Log 3, "$SELF cmd_7  : Speicherladung aktuell $MinSOC_MinSOC % > Minimum $SpeicherSOCMinimum %";;\
       };;\
       $SpeicherSOCDelta = $MinSOC_MinSOC - $SpeicherSOCMinimum;;                               ## Was wäre noch übrig?\
       if ($SpeicherSOCDelta <= 10) {                                                          ## Das lohnt sich nicht\
         $SpeicherSOCNew = $SpeicherSOCDayBefore;;                                              ## den Wert von gestern einfach beibehalten\
         CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual ".$SpeicherSOCDayBefore);;\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_DayBefore ".$SpeicherSOCDayBefore." % gesichert"};;\
       } else {\
         $SpeicherSOCNew = round(($SpeicherSOCDayBefore+$SpeicherSOCDayBefore-$SpeicherSOCDelta)/2 ,0);;  ## um den Durchschnitt verringern\
##         CommandSetReading(undef, "$SELF SpeicherMaxSOC_DayBefore ".$SpeicherSOCNew);;          ## den neuen Wert für morgen merken\
         CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual ".$SpeicherSOCNew);;             ## Das soll heute in den Speicher\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_DayBefore ".$SpeicherSOCNew." % neu berechnet und gesichert"};;\
       };;\
\
       if ($SpeicherSOCNew > 0) {                                                              ## Es gibt einen neuen MaxSoc\
         CommandSetReading(undef, "$SELF SpeicherMaxSOCControlRunning 1");;                     ## Senden starten\
         CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 1");;                         ## Wiederholung starten\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_Actual ".$SpeicherSOCNew." % geplant"};;\
       } else {                                                                                ## MaxSoc wird nicht begrenzt\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_Actual wird nicht begrenzt"};;\
       };;\
\
     } else {                                                                                  ## MaxSoc wird nicht begrenzt\
       if ($MinSOC_MinSOC  < $SpeicherSOCMinimum ) {                                           ## MaxSoc leicht erhöhen, da er etwas zu niedrig war\
         $SpeicherSOCNew   = round($SpeicherSOCDayBefore+$SpeicherSOCMinimum-$MinSOC_MinSOC ,0);;\
         $SpeicherSOCDelta = round($SpeicherSOCMinimum-$MinSOC_MinSOC ,0);;\
         CommandSetReading(undef, "$SELF SpeicherMaxSOC_DayBefore ".$SpeicherSOCNew);;\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_DayBefore wurde um ".$SpeicherSOCDelta." erhöht"};;\
       }\
       if (AttrVal("$SELF","verbose",0) >=3)\
         {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_Actual wird nicht begrenzt, da die Prognose zu schlecht ist"};;\
     };;\
   };;\
\
   if ([$SELF:SpeicherMiddayControlActive] == 1 and                                            ## Soll für mittags noch Platz gehalten werden?\
       [WR_1:Solar_middayhigh_fc0] == 1 ) {                                                    \
                           \
     CommandSetReading(undef, "$SELF SpeicherMiddayControlRunning 1");;                         ## Die Mittagskontrolle aktivieren\
     CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 1");;\
     if (AttrVal("$SELF","verbose",0) >=3){                      ## (die Uhrzeiten wurden bereits durch Solar_forecast() im WR_1 Device eingetragen)\
       Log 3, "$SELF cmd_7  : Batterie SpeicherMiddayControlRunning vorbereitet";;\
       Log 3, "$SELF cmd_7  : Batterie Solar_middayhigh_fc0_start [WR_1:Solar_middayhigh_fc0_start] gesetzt";;\
       Log 3, "$SELF cmd_7  : Batterie Solar_middayhigh_fc0_stop  [WR_1:Solar_middayhigh_fc0_stop] gesetzt";;\
     };;\
   } else {                                                                                    ## Kein Mittagshoch\
     Log 3, "$SELF cmd_7  : SpeicherMiddayControl es wird kein Middayhigh geben";;\
   };;\
\
#############\
\
  }\
\
################################################################################################################\
## 8 Reset der ExternControl Kommandos\
##\
DOELSEIF\
([{sunset_abs("HORIZON=+8.0",0,"15:00","21:00")}])                                            ## hier sollte das Ende der PV-Zeit sein\
\
  {\
   CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 0");;                               ## Stop das regelmäßige senden der Kommandos\
                   \
   CommandSetReading(undef, "$SELF SpeicherMaxSOCControlRunning 0");;                           ## Midday Steuerung zurücksetzen\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual 100");;                                ## SpeicherMaxSOC_Actual auf Default\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_DayBefore [WR_1:Act_state_of_charge]");;      ## Den vor Tages Wert merken\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_MinSOC_Time NULL");;                          ## Die MinSOC Time löschen\
       \
   CommandSetReading(undef, "$SELF SpeicherMiddayControlRunning 0");;                           ## Midday Steuerung zurücksetzen\
\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc0 0");;\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc0_start 00:00");;\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc0_stop 00:00");;\
\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc1 0");;\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc1_start 00:00");;\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc1_stop 00:00");;\
\
   if (AttrVal("$SELF","verbose",0) >=3)\
     {Log 3, "$SELF cmd_8  : ExternControl zurückgesetzt"};;\
  }\
\
################################################################################################################\
## 9 Umschaltung des MinSOC wenn zu wenig Leistung erwartet wird, das ist dann im Herbst/Winter\
##\
DOELSEIF\
([WR_1:Solar_Calculation_fc1_day]        < [$SELF:SpeicherMinSOC_fc1_Limit] and               ## Wenn morgen das Minimum an Leistung nicht erreicht wird\
  [WR_1_API:Battery_InternControl_MinSoc] < [$SELF:SpeicherMinSOC_Winter]    and               ## und der MinSoc unter der Winter Wert eingestellt ist\
  [$SELF:SpeicherMaxSOC_MinSOC_Time] eq "gefunden" )\
\
  {\
   CommandSet(undef, "WR_1_API 22_04_Battery_MinSoc [$SELF:SpeicherMinSOC_Winter]");;           ## Den MinSOC anheben, um eine eventuelle\
   if (AttrVal("$SELF","verbose",0) >=3)\
     {Log 3, "$SELF cmd_9  : Batterie MinSoc auf Winterbetrieb"};;                              ## Notladung zu verhindern\
   CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 0");;                               ## Stop das regelmäßige senden der Kommandos\
   CommandSetReading(undef, "$SELF SpeicherMaxSOCControlRunning 0");;                           ## Im Winter Betrieb keine MaxSOC Begrenzung\
   CommandSetReading(undef, "$SELF SpeicherMiddayControlRunning 0");;                           ## und keine Midday Steuerung\
   if (AttrVal("$SELF","verbose",0) >=3)\
     {Log 3, "$SELF cmd_9  : MaxSOC Begrenzung und Midday Steuerung im Winterbetrieb deaktiviert"};;\
  }\
\
################################################################################################################\
## 10 Umschaltung des MinSoc wenn viel Leistung erwartet wir, das wäre dann Frühling/Sommer\
##\
DOELSEIF\
([WR_1:Solar_Calculation_fc1_day]        > [$SELF:SpeicherMinSOC_fc1_Limit] and               ## sobald viel Ladung erwartet wird und der MinSoc noch\
  [WR_1_API:Battery_InternControl_MinSoc] > [$SELF:SpeicherMinSOC_Sommer]    and               ## noch im Winter Modus ist\
  [10:09] )                                                                                   \
          \
  {                                                                                           \
   CommandSet(undef, "WR_1_API 22_04_Battery_MinSoc [$SELF:SpeicherMinSOC_Sommer]");;           ## den MinSOC auf Sommerbetrieb herabsetzen, es kann\
   if (AttrVal("$SELF","verbose",0) >=3)\
     {Log 3, "$SELF cmd_10 : Batterie MinSoc auf Sommerbetrieb"};;                              ## wieder mehr Leistung genutzt werden\
  }\
\
################################################################################################################\
## 11 Der Speicher ist voll geladen. Hier wird das ständige nachladen auf 100 % vermieden.\
##\
DOELSEIF\
( [WR_1:Solar_Calculation_fc0_day] > [$SELF:SpeicherMaxSOC_fc1_Limit] and                     ## 1) sobald viel Leistung erwartet wird und der Speicher voll ist\
   [WR_1:Act_state_of_charge] == 100 or                                                        ##    den MaxSOC wieder reduzieren, damit nicht immer nachgeladen wird\
  ([$SELF:SpeicherMaxSOC_Actual] == 95 and                                                     ## 2) oder das Nachladen gestoppt wurde\
   [WR_1:Act_state_of_charge] <  98  and                                                       ##    und der SOC unte 98 % gefallen ist\
   [{sunset_abs("HORIZON=+8.0",-7200,"15:00","21:00")}]) )                                     ##    zwei Stunden vor Sonnenuntergang eventuell wieder nachladen\
\
  {\
   if ([WR_1:Act_state_of_charge] < 98) {\
     CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual 100");;                              ## Eventuell noch mal nachladen\
     if (AttrVal("$SELF","verbose",0) >=3) {\
       Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 100 % nachladen";;\
     };;\
   } else {\
     CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual 95");;\
     CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 1");;                             ## Start regelmäßiges senden der Kommandos\
     CommandSetReading(undef, "$SELF SpeicherMaxSOCControlRunning 1");;                         ## MaxSOC Begrenzung weil Speicher bereits 100 % hat\
     if (AttrVal("$SELF","verbose",0) >=3) {\
       Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 95 % reduziert";;\
     };;\
   }\
  }\
\

attr WR_1_Speicher_1_ExternControl DbLogExclude .*
attr WR_1_Speicher_1_ExternControl alias WR_1_Speicher_1_ExternControl
attr WR_1_Speicher_1_ExternControl comment Version 2021.09.09 14:50\
\
Hier können externe Trigger für die Ladung und Entladung Der Batterie gesetzt werden.\
Die Zeiten können z.B. durch den WeekDayTimer entsprechend an einen Stromtarif angepasst werden.\
Das reading SpeicherEntladung Automatik/Zeit/SpeicherTrigger ermöglicht es die Zeitsteuerung zu überschreiben.\
\
ExternTrigger\
Das reading dient dem Freigeben und Sperren der externen Trigger, z.B. um im Herbst/Winter das smart_laden zu steuern.\
Es verriegelt somit die Zeitsteuerung oder den SpeicherTrigger.\
\
SpeicherEntladung:Automatik,Zeit,SpeicherTrigger \
Automatik - Der Speicher wird vom Wechselrichter gesteuert, oder über die eigene ExternControl der API\
Zeit - Das Laden und Entladen wird mit den Zeitwerten beeinflusst\
SpeicherTrigger - beeinflusst das Laden und Entladen direkt ohne die Zeitsteuerung\
\
SpeicherTrigger:entladen,gesperrt\
Dieser Trigger kann durch ander Logik gesetzt werden.\
Auch hier wäre eine Zeitsteuerung denkbar, die entladen/gesperrt entsprechend umschaltet.\
\
SpeicherZeitStart/SpeicherZeitEnde\
Die Zeitangaben können manuell fest gesetzt werden, oder über zusätzliche Timer täglich neu überschrieben werden.\
Eine gültige Zeit und entsprechendes Timeing obliegt dem Anwender.\
Zwischen Start und Ende wird der Speicher zum Entladen freigegeben und zwischen Ende und Start gesperrt.\
\
Speicher*ControlActive\
Das jeweilige reading aktiviert diese Teilkomponente für die Steuerung.\
Ein jeweiliges Speicher*ControlRunning signalisiert, ob gerade die Bedingungen erfüllt sind.\
\
SpeicherCmdRepeatActive\
Es muss im WR die externe Speicher Steuerung aktiviert sein.\
Möchte man trotzdem die Sendung der ExternControl Kommandos stoppen, obwohl die Bedingungen erfüllt sind,\
kann man dieses reading zum Deaktivieren auf 0 setzen.\
\
SpeicherMiddayControl\
Über die Solar_forecast() Funktion wird ein Middayhigh ermittelt, wenn der WR nur 70% einspeisen darf.\
\
SpeicherMaxSOCControl\
Es wird versucht den Speicher am Abend nicht zu 100% zu laden, aber morgens noch mit 3* MinSOC aus der Nacht zu kommen.\
\
SpeicherMinSOC\
Dies gehört zur Basis Steuerung und schaltet den MinSOC von Sommer auf Winter Betrieb,\
um eine Notladung aus dem Netz zu vermeiden.
attr WR_1_Speicher_1_ExternControl do always
attr WR_1_Speicher_1_ExternControl group PV Eigenverbrauch
attr WR_1_Speicher_1_ExternControl icon measure_battery_100
attr WR_1_Speicher_1_ExternControl readingList SpeicherExternTrigger SpeicherCmdRepeatActive SpeicherZeitStart SpeicherZeitEnde SpeicherEntladung SpeicherTrigger SpeicherMiddayControlActive SpeicherMidday_Inverter_Max_Power SpeicherMidday_MaxChargePowerAbs_morning SpeicherMidday_MaxChargePowerAbs_midday SpeicherMidday_MaxSOC SpeicherMidday_NotBefore SpeicherMinSOC_Sommer SpeicherMinSOC_Winter SpeicherMinSOC_fc1_Limit SpeicherMaxSOCControlActive SpeicherMaxSOC_Actual SpeicherMaxSOC_DayBefore SpeicherMaxSOC_fc1_Limit
attr WR_1_Speicher_1_ExternControl room Strom->Photovoltaik
attr WR_1_Speicher_1_ExternControl setList SpeicherExternTrigger:frei,gesperrt SpeicherCmdRepeatActive:0,1 SpeicherZeitStart:time SpeicherZeitEnde:time SpeicherEntladung:Automatik,Zeit,Trigger SpeicherTrigger:entladen,gesperrt,none SpeicherMiddayControlActive:0,1 SpeicherMidday_Inverter_Max_Power:slider,3000,500,20000 SpeicherMidday_MaxChargePowerAbs_morning:slider,0,50,4700 SpeicherMidday_MaxChargePowerAbs_midday:slider,0,100,4700 SpeicherMidday_MaxSOC:slider,20,5,50 SpeicherMidday_NotBefore:time SpeicherMinSOC_Sommer:slider,5,1,20 SpeicherMinSOC_Winter:slider,5,1,20 SpeicherMinSOC_fc1_Limit:slider,7000,500,17000 SpeicherMaxSOCControlActive:0,1 SpeicherMaxSOC_Actual:slider,60,5,100 SpeicherMaxSOC_DayBefore:slider,15,5,100 SpeicherMaxSOC_fc1_Limit:slider,10000,2000,50000
attr WR_1_Speicher_1_ExternControl sortby 122


Hier fehlen noch stateFormat und uiTable, aber der Post war zu lang :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 September 2021, 15:17:55
Zitat von: ch.eick am 09 September 2021, 15:07:26
Und hier noch etwas zum Testen, für die ganz verwegenen Anwender ;-)

Hier sind alle Änderungen des WR_1_Speicher_1_ExternControl beinhaltet.
- aktuelles stateFormat
- Code Korrekturen
   * kleinere Änderung von readings Namen
   * uiTable Events beim DOELSEIF
   * dynamische Leistungsberechnung für die Speicherladung im Mittagshoch
   * Einige überflüssige Wiederholungen von Speicher Kommandos wurden entfernt
   * In diesem Listing habe ich cmd_12 für die direkte Abfrage des BYD HV bereits herausgenommen, da den wohl außer mir keiner hat :-)

- uiTable Definitionen, die eine zweite Tabelle im FHEMWEB erzeugen, um die Konfiguration von WR_1_Speicher_1_ExternControl direkt zu verändern.
   Das Layout entpricht in Grundzügen der stateFormat Definition, ist aber noch lange nicht fertig.

   * Man kann z.B. auch einen DOIF Zweig aus einem Pull Down Menü ausführen lassen.
   * Die Unterfunktionen werden über 0/1 deaktiviert/aktiviert
   * Werte lassen sich verändern
   * Uhrzeiten sind Einstellbar

Aber Achtung, das ist mein Lernstand von gestern Nacht!
Ich möchte jetzt noch stateFormat und uiTable in eine Tabelle überführen, wo ich jedoch noch nicht genügend Kenntnisse habe.

VG
   Christian

WR_1_Speicher_1_ExternControl

defmod WR_1_Speicher_1_ExternControl DOIF ################################################################################################################\
## 1 Speicher Status vom WR_1_Speicher_1 aktualisieren.\
##   Dies geschieht über das WR_1_API Device, da der Speicher direkt am Wechselrichter angeschlossen ist.\
##\
([:58])\
  {\
   CommandGet(undef, "WR_1_API 21_Battery_Information");;\
   CommandGet(undef, "WR_1_API 22_Battery_InternControl");;\
   CommandGet(undef, "WR_1_API 23_Battery_ExternControl");;\
   CommandGet(undef, "WR_1_API 25_Battery_EM_State");;\
\
   ## Schattenmanagement \
   if ($hour == 8)   {\
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 0");;                             ## Komplett aus\
   };;\
   if ($hour == 18) {\
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 2");;                             ## Im Westen unten einschalten\
   };;\
   if ($hour == 21) {\
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 1");;                             ## Schattenmanagement für den Osten vorbereiten\
   };;\
  }\
\
################################################################################################################\
## 2 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden\
##\
## Im Winter kann der MinSoc, durch den WR Eigenverbrauch, unterschritten werden, deshalb wird vorher auf\
## smarte_laden umgeschaltet, bis die Batterie wieder einen hohen Soc erreicht hat. Siehe cmd_3 laden_beendet\
##\
DOELSEIF\
([$SELF:ui_command] eq "smart_laden start" or\
  [WR_1:Solar_Calculation_fc0_day] < [$SELF:SpeicherMinSOC_fc1_Limit] and       ## Im Herbst/Winter ist wenig zu erwarten\
  [WR_1:Act_state_of_charge] <= [WR_1_API:Battery_InternControl_MinSoc] and     ## Achtung der Speicherstand wird zu niedrig\
  [WR_1_API:Battery_InternControl_MinHomeConsumption] <= 100 )                  ## Der Speicher steht auf Entladen\
  {\
   CommandGet(undef, "WR_1_Speicher_1 BatteryInformation");;\
   CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption [WR_1_API:Battery_Info_WorkCapacity]");; ## Speicher für Entladung sperren\
   if (AttrVal("$SELF","verbose",0) >=3)\
       {Log 3, "$SELF cmd_2  : smart_laden aktiviert"};;\
   CommandSetReading(undef, "$SELF SpeicherExternTrigger gesperrt");;            ## Externe Trigger verriegeln \
   if (AttrVal("$SELF","verbose",0) >=3)\
       {Log 3, "$SELF cmd_2  : SpeicherExternTrigger, Entlademodus gesperrt"};;\
  }\
\
################################################################################################################\
## 3 Beim erreichen von 90% Soc die Entladung wieder frei geben oder\
##   bei Zeitsteuerung und guter Prognose auch schon bei 40%\
DOELSEIF\
([$SELF:ui_command] eq "smart_laden beenden" or\
  [WR_1_API:Battery_InternControl_MinHomeConsumption] > 100 and                 ## Der Speicher wird voll und wieder\
  ([WR_1:Act_state_of_charge] >= 90                                             ## zum Entladen frei gegeben\
   or\
   [$SELF:SpeicherEntladung]  eq "Zeit" and                                     ## Bei Zeitsteuerung\
   [WR_1:Act_state_of_charge] >= 40 and                                         ## und einem Stand von Soc 40%\
   ([WR_1:Solar_Calculation_fc0_day] > [$SELF:SpeicherMaxSOC_fc1_Limit]         ## wenn es heute oder \
    or\
    [WR_1:Solar_Calculation_fc1_day] > [$SELF:SpeicherMaxSOC_fc1_Limit])        ## morgen viel Leistung gibt\
  )\
)\
\
{\
  if ( ReadingsVal("$SELF","SpeicherEntladung","Automatik") eq "Automatik" ) {  ## Bei Automatik sofort auf Entladen\
    if (AttrVal("$SELF","verbose",0) >=3)\
      {Log 3, "$SELF cmd_3  : Batterie auf [WR_1:Act_state_of_charge] %, Entlademodus freigegeben"};;\
    CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");;\
    CommandSetReading(undef, "$SELF SpeicherExternTrigger none");;\
  } else {                                                                      ## Ansonsten die Zeitsteuerung oder den\
    if (AttrVal("$SELF","verbose",0) >=3)\
      {Log 3, "$SELF cmd_3  : Batterie auf [WR_1:Act_state_of_charge] %, SpeicherExternTrigger, freigegeben"};;\
    CommandSetReading(undef, "$SELF SpeicherExternTrigger frei");;               ## Trigger freigeben\
    CommandSetReading(undef, "$SELF SpeicherTrigger entladen");;                 ## Signalisiere entladen im stateFormat\
  }\
}\
\
################################################################################################################\
## 4 Freigabe der Batterie mit externem Trigger\
##   z.B. ([07:00-16:00]\
DOELSEIF\
([$SELF:SpeicherExternTrigger] eq "frei" and                                   ## Verriegelung, wenn zwangsgeladen werden muss\
\
   ([$SELF:SpeicherEntladung] eq "Trigger" and                                  ## Triggersteuerung\
    [$SELF:SpeicherTrigger]   eq "entladen"                                     ## also Speicherentladung freigeben\
    or                                                                         \
    [$SELF:SpeicherEntladung] eq "Zeit" and                                     ## oder bei Zeitsteuerung wenn das\
    [[$SELF:SpeicherZeitStart]-[$SELF:SpeicherZeitEnde]])                       ## Zeitfenster aktiv ist\
\
  )\
{\
  CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");;            ## Speicher für Entladung freigeben\
  CommandSetReading(undef, "$SELF SpeicherTrigger entladen");;                   ## Signalisiere entladen im stateFormat\
  if (AttrVal("$SELF","verbose",0) >=3)\
    {Log 3, "$SELF cmd_4  : SpeicherExternTrigger, Entlademodus freigegeben"};;\
}\
\
################################################################################################################\
## 5 Sperren der Batterie mit externem Trigger\
##   z.B. [16:00-07:00]\
DOELSEIF\
([$SELF:SpeicherExternTrigger] eq "frei" and                                   ## Verriegelung, wenn zwangsgeladen werden muss\
                               \
   ([$SELF:SpeicherEntladung]  eq "Trigger" and                                 ## Triggersteuerung\
    [$SELF:SpeicherTrigger]    eq "gesperrt"                                    ## also Speicherentladung sperren\
    or                                                                         \
    [$SELF:SpeicherEntladung]  eq "Zeit" and                                    ## oder bei Zeitsteuerung wenn das\
    [[$SELF:SpeicherZeitEnde]-[$SELF:SpeicherZeitStart]])                       ## Zeitfenster verlassen wurde\
\
  )\
{\
  CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption [WR_1_API:Battery_Info_WorkCapacity]");;  ## Speicher für Entladung sperren\
  CommandSetReading(undef, "$SELF SpeicherTrigger gesperrt");;                   ## Signalisiere gesperrt im stateFormat\
  if (AttrVal("$SELF","verbose",0) >=3)\
    {Log 3, "$SELF cmd_5  : SpeicherExternTrigger, Entlademodus gesperrt (Tarif oder Trigger)"};;\
}\
\
################################################################################################################\
## 6 Wiederhole alle 180s die Kommandos der ExternControl Steuerung\
##\
DOELSEIF\
([$SELF:ui_command] eq "3 Minuten Wiederholung" or\
  [WR_1_API:Battery_Control] > 0 and                                            ## Wenn die ExternControl am WR konfiguriert ist\
  [$SELF:SpeicherCmdRepeatActive]  == 1 and                                     ## Wenn die ExternControl Aktiviert ist\
  [$SELF:SpeicherCmdRepeatRunning] == 1 and                                     ## Wenn es  ExternControl Kommandos zum Senden gibt\
  [  {sunrise_abs("HORIZON=+5.0",0,"6:00","08:35")}                             \
   - {sunset_abs("HORIZON=+8.0",0,"15:00","21:00")} ] and [+180] )              ## alle 3 Minuten den Befehl wiederholen\
  \
  {\
   CommandSetReading(undef, "$SELF ui_command ---");;\
   my $MaxChargePowerTime = 0;;\
   my $MaxChargePowerAbs_midday = 0;;\
\
   if ([$SELF:SpeicherMiddayControlRunning] == 1 ) {                            ## Wurde ein Mittagshoch ermittelt und aktiviert?\
\
     if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [$SELF:SpeicherMidday_NotBefore]") and\
           [WR_1:Act_state_of_charge] >= [WR_1_API:Battery_InternControl_MinSoc] *3 ) {\
       CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");;     ## nicht vor z.B. 09:00 Uhr starten. Ladung auf 0 Watt setzen\
       if (AttrVal("$SELF","verbose",0) >=3) {                                  ## Es wird nur langsam geladen und MaxSOC limitiert.\
         Log 3, "$SELF cmd_6  : SpeicherMiddayControl vor [$SELF:SpeicherMidday_NotBefore] Uhr noch nicht laden";;\
       };;\
     } else { \
       if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_start]") ) {   ## Ist noch Vormittag?\
         CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs [$SELF:SpeicherMidday_MaxChargePowerAbs_morning]");;\
         CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [$SELF:SpeicherMidday_MaxSOC]");;\
         if (AttrVal("$SELF","verbose",0) >=3) {                                ## Es wird nur langsam geladen und MaxSOC limitiert.\
           Log 3, "$SELF cmd_6  : SpeicherMiddayControl vor [WR_1:Solar_middayhigh_fc0_start] limitieren";;\
           Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxChargePowerAbs auf [$SELF:SpeicherMidday_MaxChargePowerAbs_morning] limitiert";;\
           Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxSOC auf [$SELF:SpeicherMidday_MaxSOC] % limitiert";;\
         };;\
       };;\
     };;\
\
     if (time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_start]") <= time and  ## Es ist Mittag\
         time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_stop]") ) {\
\
       if ([$SELF:SpeicherMaxSOCControlRunning] == 1 and                                                             ## Somit bleibt weniger Platz im Speicher und es ist\
           time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 12:00") ) {                             ##    besser nicht vor 12:00 Uhr zu beginnen.\
         CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");;\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_6  : SpeicherMiddayControlActive laden wegen MaxSoc von [WR_1:Solar_middayhigh_fc0_start] auf 12:00 Uhr verschoben"};;\
       } else {                                                                                                      ## auch jetzt nicht mit voller Leistung laden\
\
         if ([$SELF:SpeicherMidday_MaxChargePowerAbs_midday] == 0) {                                                 ## dynamische Leistungsermittlung oder vorgewählter Wert\
           $MaxChargePowerTime = round((time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_stop]") - time) / 3600 , 2);;  ## Mittags Ladezeit bestimmen\
           if ( $MaxChargePowerTime < 1 ) { $MaxChargePowerTime = 1;;};;\
           $MaxChargePowerAbs_midday  = round( [WR_1:Battery_work_capacity] * ([$SELF:SpeicherMaxSOC_Actual] - [WR_1:Act_state_of_charge]) / 100 / $MaxChargePowerTime , 0);;\
           if ($MaxChargePowerAbs_midday < 0) { $MaxChargePowerAbs_midday = 0 };;                                     ## Nicht unter 0\
           Log 3, "$SELF Test   : Mittags $MaxChargePowerTime h mit $MaxChargePowerAbs_midday W laden";;\
         } else {\
           $MaxChargePowerAbs_midday = [$SELF:SpeicherMidday_MaxChargePowerAbs_midday];;                              ## Nimm den vorgewählten Wert\
         };;\
\
         CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs $MaxChargePowerAbs_midday");;\
         CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual]");;\
         if (AttrVal("$SELF","verbose",0) >=3) {\
           Log 3, "$SELF cmd_6  : SpeicherMiddayControlActive laden von [WR_1:Solar_middayhigh_fc0_start] bis [WR_1:Solar_middayhigh_fc0_stop] freigegeben";;\
           Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxChargePowerAbs auf $MaxChargePowerAbs_midday limitiert";;\
           Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual] % halten"\
         };;\
       };;\
     };;\
\
     if (time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." [WR_1:Solar_middayhigh_fc0_stop]") ) {    ## Es ist Nachmittag und die\
       CommandSetReading(undef, "$SELF SpeicherMiddayControlRunning 0");;                                             ## Mittagssteuerung wird abgeschaltet\
       CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual]");;\
       if (AttrVal("$SELF","verbose",0) >=3) {\
         Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual] % halten";;\
         Log 3, "$SELF cmd_6  : SpeicherMiddayControl nach [WR_1:Solar_middayhigh_fc0_stop] beendet";;\
       };;\
     };;\
   };;\
\
   if ([$SELF:SpeicherMaxSOCControlRunning] == 1 and                                           ## Nur MaxSOC soll begrenzt werden\
       [$SELF:SpeicherMaxSOC_Actual] <= 100      and                                          \
       [$SELF:SpeicherMiddayControlRunning] == 0) {                                            ##  sobald die Mittagssteuerung fertig ist\
     CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual]");;\
     if (AttrVal("$SELF","verbose",0) >=3)\
       {Log 3, "$SELF cmd_6  : Battery_ExternControl_MaxSocRel [$SELF:SpeicherMaxSOC_Actual] % halten"};;\
   };;\
\
   if (AttrVal("$SELF","verbose",0) >=4)\
     {Log 3, "$SELF cmd_6  : ExternControl Kommandowiederholung erledigt"};;\
  }\
\
################################################################################################################\
## 7 Bestimmung eines möglichen SOC für den nächsten Morgen und\
##   Vorbereitung für ein Leistungshoch am Mittag\
##\
DOELSEIF\
([WR_1_API:Battery_Control] > 0 and                                                           ## Ist die ExternControl am WR aktiviert\
  ([$SELF:SpeicherMaxSOCControlActive] == 1 or                                                 ## Ist MaxSOC Limit konfiguriert\
   [$SELF:SpeicherMiddayControlActive] == 1 ) and                                              ## Ist Midday Kontrolle konfiguriert\
   [$SELF:SpeicherMaxSOC_MinSOC_Time] eq "NULL" and                                            ## Wurde ein minimum SOC bereits ermittelt\
   [{sunrise_abs("HORIZON=+4.0",0,"5:50","08:35")} - 10:00 ] and\
   [WR_1:SW_Home_own_consumption_from_PV] == [WR_1:SW_Home_own_consumption] )                  ## Die PV Leistung reicht für's Haus\
\
  {\
   my $MinSOC_Time   = "gefunden";;                                                             ## Nur einmal am Tag bearbeiten\
   my $MinSOC_MinSOC = round(ReadingsVal("WR_1","Act_state_of_charge", 0),0);;                  ## Festgestellter MinSOC am Morgen\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_MinSOC_Time ".$MinSOC_Time);;\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_MinSOC_MinSOC ".$MinSOC_MinSOC);;\
   if (AttrVal("$SELF","verbose",0) >=3) {                                                     ## merken und melden\
     Log 3, "$SELF cmd_7  : SpeicherMaxSOC_MinSOC_Time ".$MinSOC_Time." ".$MinSOC_MinSOC." %";;\
   };;\
\
#############\
\
   if ([$SELF:SpeicherMaxSOCControlActive] ==   1 and\
       [WR_1_API:Battery_InternControl_MinHomeConsumption]         <  100 and                  ## Der Speicher darf nicht im smart_laden sein\
       [Pool_Counter:countsPerDay] == 0 and                                                    ## Achtung der Pool und auch die LWP\
       [LWP_Counter:countsPerDay]  == 0 ) {                                                    ##    sollten nicht mehr früh morgens laufen\
\
     my $SpeicherSOCMinimum = [WR_1_API:Battery_InternControl_MinSoc]*3;;                       ## 3x MinSOC als reserve vorsehen\
     my $SpeicherSOCDayBefore = round(ReadingsVal("$SELF","SpeicherMaxSOC_DayBefore", 100),0);; ## wie voll war er gestern noch?\
     my $SpeicherSOCNew       = 0;;\
     my $SpeicherSOCDelta     = 0;;\
\
     if ([WR_1:Solar_Calculation_fc1_day] > [$SELF:SpeicherMaxSOC_fc1_Limit] and\
         $MinSOC_MinSOC                   > $SpeicherSOCMinimum ) {                            ## Ist der Speicher voller als er müsste?\
\
       if (AttrVal("$SELF","verbose",0) >=3){\
         Log 3, "$SELF cmd_7  : SpeicherMaxSOC_DayBefore ".$SpeicherSOCDayBefore." %";;\
         Log 3, "$SELF cmd_7  : Leistung Prognose [WR_1:Solar_Calculation_fc1_day] wh > Schwellwert [$SELF:SpeicherMaxSOC_fc1_Limit] wh";;\
         Log 3, "$SELF cmd_7  : Speicherladung aktuell $MinSOC_MinSOC % > Minimum $SpeicherSOCMinimum %";;\
       };;\
       $SpeicherSOCDelta = $MinSOC_MinSOC - $SpeicherSOCMinimum;;                               ## Was wäre noch übrig?\
       if ($SpeicherSOCDelta <= 10) {                                                          ## Das lohnt sich nicht\
         $SpeicherSOCNew = $SpeicherSOCDayBefore;;                                              ## den Wert von gestern einfach beibehalten\
         CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual ".$SpeicherSOCDayBefore);;\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_DayBefore ".$SpeicherSOCDayBefore." % gesichert"};;\
       } else {\
         $SpeicherSOCNew = round(($SpeicherSOCDayBefore+$SpeicherSOCDayBefore-$SpeicherSOCDelta)/2 ,0);;  ## um den Durchschnitt verringern\
##         CommandSetReading(undef, "$SELF SpeicherMaxSOC_DayBefore ".$SpeicherSOCNew);;          ## den neuen Wert für morgen merken\
         CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual ".$SpeicherSOCNew);;             ## Das soll heute in den Speicher\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_DayBefore ".$SpeicherSOCNew." % neu berechnet und gesichert"};;\
       };;\
\
       if ($SpeicherSOCNew > 0) {                                                              ## Es gibt einen neuen MaxSoc\
         CommandSetReading(undef, "$SELF SpeicherMaxSOCControlRunning 1");;                     ## Senden starten\
         CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 1");;                         ## Wiederholung starten\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_Actual ".$SpeicherSOCNew." % geplant"};;\
       } else {                                                                                ## MaxSoc wird nicht begrenzt\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_Actual wird nicht begrenzt"};;\
       };;\
\
     } else {                                                                                  ## MaxSoc wird nicht begrenzt\
       if ($MinSOC_MinSOC  < $SpeicherSOCMinimum ) {                                           ## MaxSoc leicht erhöhen, da er etwas zu niedrig war\
         $SpeicherSOCNew   = round($SpeicherSOCDayBefore+$SpeicherSOCMinimum-$MinSOC_MinSOC ,0);;\
         $SpeicherSOCDelta = round($SpeicherSOCMinimum-$MinSOC_MinSOC ,0);;\
         CommandSetReading(undef, "$SELF SpeicherMaxSOC_DayBefore ".$SpeicherSOCNew);;\
         if (AttrVal("$SELF","verbose",0) >=3)\
           {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_DayBefore wurde um ".$SpeicherSOCDelta." erhöht"};;\
       }\
       if (AttrVal("$SELF","verbose",0) >=3)\
         {Log 3, "$SELF cmd_7  : SpeicherMaxSOC_Actual wird nicht begrenzt, da die Prognose zu schlecht ist"};;\
     };;\
   };;\
\
   if ([$SELF:SpeicherMiddayControlActive] == 1 and                                            ## Soll für mittags noch Platz gehalten werden?\
       [WR_1:Solar_middayhigh_fc0] == 1 ) {                                                    \
                           \
     CommandSetReading(undef, "$SELF SpeicherMiddayControlRunning 1");;                         ## Die Mittagskontrolle aktivieren\
     CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 1");;\
     if (AttrVal("$SELF","verbose",0) >=3){                      ## (die Uhrzeiten wurden bereits durch Solar_forecast() im WR_1 Device eingetragen)\
       Log 3, "$SELF cmd_7  : Batterie SpeicherMiddayControlRunning vorbereitet";;\
       Log 3, "$SELF cmd_7  : Batterie Solar_middayhigh_fc0_start [WR_1:Solar_middayhigh_fc0_start] gesetzt";;\
       Log 3, "$SELF cmd_7  : Batterie Solar_middayhigh_fc0_stop  [WR_1:Solar_middayhigh_fc0_stop] gesetzt";;\
     };;\
   } else {                                                                                    ## Kein Mittagshoch\
     Log 3, "$SELF cmd_7  : SpeicherMiddayControl es wird kein Middayhigh geben";;\
   };;\
\
#############\
\
  }\
\
################################################################################################################\
## 8 Reset der ExternControl Kommandos\
##\
DOELSEIF\
([{sunset_abs("HORIZON=+8.0",0,"15:00","21:00")}])                                            ## hier sollte das Ende der PV-Zeit sein\
\
  {\
   CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 0");;                               ## Stop das regelmäßige senden der Kommandos\
                   \
   CommandSetReading(undef, "$SELF SpeicherMaxSOCControlRunning 0");;                           ## Midday Steuerung zurücksetzen\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual 100");;                                ## SpeicherMaxSOC_Actual auf Default\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_DayBefore [WR_1:Act_state_of_charge]");;      ## Den vor Tages Wert merken\
   CommandSetReading(undef, "$SELF SpeicherMaxSOC_MinSOC_Time NULL");;                          ## Die MinSOC Time löschen\
       \
   CommandSetReading(undef, "$SELF SpeicherMiddayControlRunning 0");;                           ## Midday Steuerung zurücksetzen\
\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc0 0");;\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc0_start 00:00");;\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc0_stop 00:00");;\
\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc1 0");;\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc1_start 00:00");;\
   CommandSetReading(undef, "WR_1 Solar_middayhigh_fc1_stop 00:00");;\
\
   if (AttrVal("$SELF","verbose",0) >=3)\
     {Log 3, "$SELF cmd_8  : ExternControl zurückgesetzt"};;\
  }\
\
################################################################################################################\
## 9 Umschaltung des MinSOC wenn zu wenig Leistung erwartet wird, das ist dann im Herbst/Winter\
##\
DOELSEIF\
([WR_1:Solar_Calculation_fc1_day]        < [$SELF:SpeicherMinSOC_fc1_Limit] and               ## Wenn morgen das Minimum an Leistung nicht erreicht wird\
  [WR_1_API:Battery_InternControl_MinSoc] < [$SELF:SpeicherMinSOC_Winter]    and               ## und der MinSoc unter der Winter Wert eingestellt ist\
  [$SELF:SpeicherMaxSOC_MinSOC_Time] eq "gefunden" )\
\
  {\
   CommandSet(undef, "WR_1_API 22_04_Battery_MinSoc [$SELF:SpeicherMinSOC_Winter]");;           ## Den MinSOC anheben, um eine eventuelle\
   if (AttrVal("$SELF","verbose",0) >=3)\
     {Log 3, "$SELF cmd_9  : Batterie MinSoc auf Winterbetrieb"};;                              ## Notladung zu verhindern\
   CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 0");;                               ## Stop das regelmäßige senden der Kommandos\
   CommandSetReading(undef, "$SELF SpeicherMaxSOCControlRunning 0");;                           ## Im Winter Betrieb keine MaxSOC Begrenzung\
   CommandSetReading(undef, "$SELF SpeicherMiddayControlRunning 0");;                           ## und keine Midday Steuerung\
   if (AttrVal("$SELF","verbose",0) >=3)\
     {Log 3, "$SELF cmd_9  : MaxSOC Begrenzung und Midday Steuerung im Winterbetrieb deaktiviert"};;\
  }\
\
################################################################################################################\
## 10 Umschaltung des MinSoc wenn viel Leistung erwartet wir, das wäre dann Frühling/Sommer\
##\
DOELSEIF\
([WR_1:Solar_Calculation_fc1_day]        > [$SELF:SpeicherMinSOC_fc1_Limit] and               ## sobald viel Ladung erwartet wird und der MinSoc noch\
  [WR_1_API:Battery_InternControl_MinSoc] > [$SELF:SpeicherMinSOC_Sommer]    and               ## noch im Winter Modus ist\
  [10:09] )                                                                                   \
          \
  {                                                                                           \
   CommandSet(undef, "WR_1_API 22_04_Battery_MinSoc [$SELF:SpeicherMinSOC_Sommer]");;           ## den MinSOC auf Sommerbetrieb herabsetzen, es kann\
   if (AttrVal("$SELF","verbose",0) >=3)\
     {Log 3, "$SELF cmd_10 : Batterie MinSoc auf Sommerbetrieb"};;                              ## wieder mehr Leistung genutzt werden\
  }\
\
################################################################################################################\
## 11 Der Speicher ist voll geladen. Hier wird das ständige nachladen auf 100 % vermieden.\
##\
DOELSEIF\
( [WR_1:Solar_Calculation_fc0_day] > [$SELF:SpeicherMaxSOC_fc1_Limit] and                     ## 1) sobald viel Leistung erwartet wird und der Speicher voll ist\
   [WR_1:Act_state_of_charge] == 100 or                                                        ##    den MaxSOC wieder reduzieren, damit nicht immer nachgeladen wird\
  ([$SELF:SpeicherMaxSOC_Actual] == 95 and                                                     ## 2) oder das Nachladen gestoppt wurde\
   [WR_1:Act_state_of_charge] <  98  and                                                       ##    und der SOC unte 98 % gefallen ist\
   [{sunset_abs("HORIZON=+8.0",-7200,"15:00","21:00")}]) )                                     ##    zwei Stunden vor Sonnenuntergang eventuell wieder nachladen\
\
  {\
   if ([WR_1:Act_state_of_charge] < 98) {\
     CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual 100");;                              ## Eventuell noch mal nachladen\
     if (AttrVal("$SELF","verbose",0) >=3) {\
       Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 100 % nachladen";;\
     };;\
   } else {\
     CommandSetReading(undef, "$SELF SpeicherMaxSOC_Actual 95");;\
     CommandSetReading(undef, "$SELF SpeicherCmdRepeatRunning 1");;                             ## Start regelmäßiges senden der Kommandos\
     CommandSetReading(undef, "$SELF SpeicherMaxSOCControlRunning 1");;                         ## MaxSOC Begrenzung weil Speicher bereits 100 % hat\
     if (AttrVal("$SELF","verbose",0) >=3) {\
       Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 95 % reduziert";;\
     };;\
   }\
  }\
\

attr WR_1_Speicher_1_ExternControl DbLogExclude .*
attr WR_1_Speicher_1_ExternControl alias WR_1_Speicher_1_ExternControl
attr WR_1_Speicher_1_ExternControl comment Version 2021.09.09 14:50\
\
Hier können externe Trigger für die Ladung und Entladung Der Batterie gesetzt werden.\
Die Zeiten können z.B. durch den WeekDayTimer entsprechend an einen Stromtarif angepasst werden.\
Das reading SpeicherEntladung Automatik/Zeit/SpeicherTrigger ermöglicht es die Zeitsteuerung zu überschreiben.\
\
ExternTrigger\
Das reading dient dem Freigeben und Sperren der externen Trigger, z.B. um im Herbst/Winter das smart_laden zu steuern.\
Es verriegelt somit die Zeitsteuerung oder den SpeicherTrigger.\
\
SpeicherEntladung:Automatik,Zeit,SpeicherTrigger \
Automatik - Der Speicher wird vom Wechselrichter gesteuert, oder über die eigene ExternControl der API\
Zeit - Das Laden und Entladen wird mit den Zeitwerten beeinflusst\
SpeicherTrigger - beeinflusst das Laden und Entladen direkt ohne die Zeitsteuerung\
\
SpeicherTrigger:entladen,gesperrt\
Dieser Trigger kann durch ander Logik gesetzt werden.\
Auch hier wäre eine Zeitsteuerung denkbar, die entladen/gesperrt entsprechend umschaltet.\
\
SpeicherZeitStart/SpeicherZeitEnde\
Die Zeitangaben können manuell fest gesetzt werden, oder über zusätzliche Timer täglich neu überschrieben werden.\
Eine gültige Zeit und entsprechendes Timeing obliegt dem Anwender.\
Zwischen Start und Ende wird der Speicher zum Entladen freigegeben und zwischen Ende und Start gesperrt.\
\
Speicher*ControlActive\
Das jeweilige reading aktiviert diese Teilkomponente für die Steuerung.\
Ein jeweiliges Speicher*ControlRunning signalisiert, ob gerade die Bedingungen erfüllt sind.\
\
SpeicherCmdRepeatActive\
Es muss im WR die externe Speicher Steuerung aktiviert sein.\
Möchte man trotzdem die Sendung der ExternControl Kommandos stoppen, obwohl die Bedingungen erfüllt sind,\
kann man dieses reading zum Deaktivieren auf 0 setzen.\
\
SpeicherMiddayControl\
Über die Solar_forecast() Funktion wird ein Middayhigh ermittelt, wenn der WR nur 70% einspeisen darf.\
\
SpeicherMaxSOCControl\
Es wird versucht den Speicher am Abend nicht zu 100% zu laden, aber morgens noch mit 3* MinSOC aus der Nacht zu kommen.\
\
SpeicherMinSOC\
Dies gehört zur Basis Steuerung und schaltet den MinSOC von Sommer auf Winter Betrieb,\
um eine Notladung aus dem Netz zu vermeiden.
attr WR_1_Speicher_1_ExternControl do always
attr WR_1_Speicher_1_ExternControl group PV Eigenverbrauch
attr WR_1_Speicher_1_ExternControl icon measure_battery_100
attr WR_1_Speicher_1_ExternControl readingList SpeicherExternTrigger SpeicherCmdRepeatActive SpeicherZeitStart SpeicherZeitEnde SpeicherEntladung SpeicherTrigger SpeicherMiddayControlActive SpeicherMidday_Inverter_Max_Power SpeicherMidday_MaxChargePowerAbs_morning SpeicherMidday_MaxChargePowerAbs_midday SpeicherMidday_MaxSOC SpeicherMidday_NotBefore SpeicherMinSOC_Sommer SpeicherMinSOC_Winter SpeicherMinSOC_fc1_Limit SpeicherMaxSOCControlActive SpeicherMaxSOC_Actual SpeicherMaxSOC_DayBefore SpeicherMaxSOC_fc1_Limit
attr WR_1_Speicher_1_ExternControl room Strom->Photovoltaik
attr WR_1_Speicher_1_ExternControl setList SpeicherExternTrigger:frei,gesperrt SpeicherCmdRepeatActive:0,1 SpeicherZeitStart:time SpeicherZeitEnde:time SpeicherEntladung:Automatik,Zeit,Trigger SpeicherTrigger:entladen,gesperrt,none SpeicherMiddayControlActive:0,1 SpeicherMidday_Inverter_Max_Power:slider,3000,500,20000 SpeicherMidday_MaxChargePowerAbs_morning:slider,0,50,4700 SpeicherMidday_MaxChargePowerAbs_midday:slider,0,100,4700 SpeicherMidday_MaxSOC:slider,20,5,50 SpeicherMidday_NotBefore:time SpeicherMinSOC_Sommer:slider,5,1,20 SpeicherMinSOC_Winter:slider,5,1,20 SpeicherMinSOC_fc1_Limit:slider,7000,500,17000 SpeicherMaxSOCControlActive:0,1 SpeicherMaxSOC_Actual:slider,60,5,100 SpeicherMaxSOC_DayBefore:slider,15,5,100 SpeicherMaxSOC_fc1_Limit:slider,10000,2000,50000
attr WR_1_Speicher_1_ExternControl sortby 122
attr WR_1_Speicher_1_ExternControl verbose 3

setstate WR_1_Speicher_1_ExternControl 2021-09-08 17:49:10 SpeicherCmdRepeatActive 1
setstate WR_1_Speicher_1_ExternControl 2021-09-09 13:00:01 SpeicherCmdRepeatRunning 1
setstate WR_1_Speicher_1_ExternControl 2021-09-08 19:41:33 SpeicherEntladung Automatik
setstate WR_1_Speicher_1_ExternControl 2021-09-07 14:49:53 SpeicherExternTrigger none
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:23:15 SpeicherMaxSOCControlActive 1
setstate WR_1_Speicher_1_ExternControl 2021-09-09 13:00:01 SpeicherMaxSOCControlRunning 1
setstate WR_1_Speicher_1_ExternControl 2021-09-09 13:00:01 SpeicherMaxSOC_Actual 95
setstate WR_1_Speicher_1_ExternControl 2021-09-08 19:00:47 SpeicherMaxSOC_DayBefore 77.00
setstate WR_1_Speicher_1_ExternControl 2021-09-09 07:37:02 SpeicherMaxSOC_MinSOC_MinSOC 26
setstate WR_1_Speicher_1_ExternControl 2021-09-09 07:37:02 SpeicherMaxSOC_MinSOC_Time gefunden
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:23:44 SpeicherMaxSOC_fc1_Limit 30000
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:26:55 SpeicherMiddayControlActive 1
setstate WR_1_Speicher_1_ExternControl 2021-09-08 19:00:47 SpeicherMiddayControlRunning 0
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:22:22 SpeicherMidday_Inverter_Max_Power 8500
setstate WR_1_Speicher_1_ExternControl 2021-09-05 15:00:35 SpeicherMidday_MaxChargePowerAbs_midday 0
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:24:57 SpeicherMidday_MaxChargePowerAbs_morning 450
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:26:39 SpeicherMidday_MaxSOC 30
setstate WR_1_Speicher_1_ExternControl 2021-09-05 09:02:56 SpeicherMidday_NotBefore 09:00
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:26:15 SpeicherMinSOC_Sommer 5
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:26:03 SpeicherMinSOC_Winter 20
setstate WR_1_Speicher_1_ExternControl 2021-09-02 16:24:08 SpeicherMinSOC_fc1_Limit 14000
setstate WR_1_Speicher_1_ExternControl 2021-09-03 12:16:08 SpeicherTrigger entladen
setstate WR_1_Speicher_1_ExternControl 2021-09-03 12:15:57 SpeicherZeitEnde 16:00
setstate WR_1_Speicher_1_ExternControl 2021-09-03 12:06:33 SpeicherZeitStart 07:00

setstate WR_1_Speicher_1_ExternControl 2021-09-09 15:09:37 ui_command ---



Hier fehlen noch stateFormat und uiTable, aber der Post war zu lang :-)

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 September 2021, 15:22:13
Und hier kommt der Rest vom RAW...


attr WR_1_Speicher_1_ExternControl stateFormat {\
my $WR     = "WR_1";;\
my $DUMMY  = "";;\
\
my $Entladung                        = ReadingsVal($name,"SpeicherEntladung","n/a");;\
\
my $Power                            = ReadingsVal($WR,"Actual_Battery_charge_-minus_or_discharge_-plus_P","0");;\
my $Status                           = ($Power < -10) ? "<span style='color:#00FF00'>Laden</span>" : ($Power > 15) ?  "<span style='color:#FF0000'>Entladen</span>" : "<span style='color:orange'>Standby</span>";;\
    $Power                            = $Power." W";;\
\
my $Solar_Calculation_fc0_day        = ReadingsVal($WR,"Solar_Calculation_fc0_day","0");;\
        \
my $Trigger                          = ReadingsVal($name,"SpeicherTrigger","none");;\
my $ExternTrigger                    = ReadingsVal($name,"SpeicherExternTrigger","none");;\
my $ZeitStart                        = ReadingsVal($name,"SpeicherZeitStart","n/a");;\
my $ZeitEnde                         = ReadingsVal($name,"SpeicherZeitEnde","n/a");;\
                                                                                                             \
my $CmdRepeatActive                  = ReadingsVal($name,"SpeicherCmdRepeatActive","0");;\
my $CmdRepeatRunning                 = ReadingsVal($name,"SpeicherCmdRepeatRunning","0");;\
        \
my $MaxSOCControlActive              = ReadingsVal($name,"SpeicherMaxSOCControlActive","0");;\
my $MaxSOCControlRunning             = ReadingsVal($name,"SpeicherMaxSOCControlRunning","0");; \
        \
my $MiddayControlActive              = ReadingsVal($name,"SpeicherMiddayControlActive","0");;\
my $MiddayControlRunning             = ReadingsVal($name,"SpeicherMiddayControlRunning","0");;\
        \
my $Solar_middayhigh_fc0_start       = ReadingsVal($WR,"Solar_middayhigh_fc0_start","00:00");;\
    $Solar_middayhigh_fc0_start       = ($MaxSOCControlRunning == 1 and $MiddayControlRunning == 1) ? "12:00" : $Solar_middayhigh_fc0_start ;;\
\
my $Solar_middayhigh_fc0_stop        = ReadingsVal($WR,"Solar_middayhigh_fc0_stop","00:00");;\
my $MaxSOC_Actual                    = ReadingsVal($name,"SpeicherMaxSOC_Actual","0");;\
my $Act_state_of_charge              = sprintf("%d",ReadingsVal($WR,"Act_state_of_charge","0"));;\
my $MaxSOC_DayBefore                 = sprintf("%d %%",ReadingsVal($name,"SpeicherMaxSOC_DayBefore","0"));;\
my $MaxSOC_fc1_Limit                 = ReadingsVal($name,"SpeicherMaxSOC_fc1_Limit","0");;\
my $MaxSOC_MinSOC_Time               = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SpeicherMaxSOC_MinSOC_MinSOC",0))));;\
my $MaxSOC_MinSOC_MinSOC             = sprintf("%d %%",ReadingsVal($name,"SpeicherMaxSOC_MinSOC_MinSOC","0"));;\
\
my $Midday_NotBefore                 = ReadingsVal($name,"SpeicherMidday_NotBefore","0");;\
my $Midday_MaxSOC                    = ReadingsVal($name,"SpeicherMidday_MaxSOC","0");;\
\
my $Midday_MaxChargePowerAbs_morning = sprintf("%d W"   ,ReadingsVal($name,"SpeicherMidday_MaxChargePowerAbs_morning","0"));;\
\
    $Midday_MaxChargePowerAbs_morning = ( $MiddayControlRunning == 1 and\
                                              time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore") and\
                                          time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          $Midday_MaxSOC > $Act_state_of_charge ) ? "<span style='color:#00FF00'>$Midday_MaxChargePowerAbs_morning</span>" : $Midday_MaxChargePowerAbs_morning ;;\
\
my $Midday_MaxChargePowerAbs_midday  = sprintf("%d"   ,ReadingsVal($name,"SpeicherMidday_MaxChargePowerAbs_midday","0"));;\
    $Midday_MaxChargePowerAbs_midday  = ( $Midday_MaxChargePowerAbs_midday == 0) ? "dynamisch" : $Midday_MaxChargePowerAbs_midday." W" ;; \
    $Midday_MaxChargePowerAbs_midday  = ( $MiddayControlRunning == 1 and\
                                              time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Midday_MaxChargePowerAbs_midday</span>" : $Midday_MaxChargePowerAbs_midday ;;\
\
    $Midday_NotBefore                 = ( $MiddayControlRunning == 1 and\
                                              time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore") and\
                                              time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $MaxSOC_MinSOC_Time")) ? "< <span style='color:#FF0000'>$Midday_NotBefore</span>" :\
                                        ( $MiddayControlRunning == 1 and\
                                              time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") ) ? "> <span style='color:#00FF00'>$Midday_NotBefore</span>" : $Midday_NotBefore ;;\
\
    $Midday_MaxSOC                    = ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore")) ? $Midday_MaxSOC." %" :\
                                            ( $MiddayControlRunning == 1 and\
                                              time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          $Midday_MaxSOC > $Act_state_of_charge ) ? "<span style='color:#00FF00'>$Midday_MaxSOC %</span>" : \
                                                                                ( time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start")) ? $Midday_MaxSOC." %" : "<span style='color:#FF0000'>$Midday_MaxSOC %</span>" ;;\
\
    $Solar_middayhigh_fc0_start       = ( $MiddayControlRunning == 1 and\
                                              time >= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Solar_middayhigh_fc0_start</span>" : $Solar_middayhigh_fc0_start ;;\
    $Solar_middayhigh_fc0_stop        = ( $MiddayControlRunning == 1 and\
                                              time >= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and\
                                          time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Solar_middayhigh_fc0_stop</span>" : $Solar_middayhigh_fc0_stop ;;\
\
\
my $Midday_Inverter_Max_Power        = sprintf("%d W"   ,ReadingsVal($name,"SpeicherMidday_Inverter_Max_Power","0"));;\
    $Midday_Inverter_Max_Power        = ($MiddayControlRunning      == 1                ) ? ">= <span style='color:#00FF00'> $Midday_Inverter_Max_Power</span>" : $Midday_Inverter_Max_Power ;;\
\
my $MinSOC_fc1_Limit                 = ReadingsVal($name,"SpeicherMinSOC_fc1_Limit","0");;\
my $MinSOC_Sommer                    = sprintf("%d %%"  ,ReadingsVal($name,"SpeicherMinSOC_Sommer","0"));;\
    $MinSOC_Sommer                    = ($Solar_Calculation_fc0_day >= $MinSOC_fc1_Limit) ? "<span style='color:#00FF00'>$MinSOC_Sommer</span>"             : $MinSOC_Sommer ;;\
\
my $MinSOC_Winter                    = sprintf("%d %%"  ,ReadingsVal($name,"SpeicherMinSOC_Winter","0"));;\
    $MinSOC_Winter                    = ($Solar_Calculation_fc0_day <  $MinSOC_fc1_Limit) ? "<span style='color:#00FF00'>$MinSOC_Winter</span>"             : $MinSOC_Winter ;;\
\
    $MinSOC_fc1_Limit                 = ($Solar_Calculation_fc0_day >= $MinSOC_fc1_Limit) ? ">= <span style='color:#00FF00'>$MinSOC_fc1_Limit Wh</span>"    : $MinSOC_fc1_Limit." Wh" ;;\
    $MaxSOC_fc1_Limit                 = ($Solar_Calculation_fc0_day >= $MaxSOC_fc1_Limit) ? ">= <span style='color:#00FF00'>$MaxSOC_fc1_Limit Wh</span>" : $MaxSOC_fc1_Limit." Wh" ;;\
\
    $MaxSOC_Actual                    = ($MaxSOCControlRunning == 1) ? "<span style='color:#00FF00'>$MaxSOC_Actual %</span>"      : $MaxSOC_Actual." %" ;;\
    $Act_state_of_charge              = $Act_state_of_charge." %";;\
    $CmdRepeatRunning                 = ($CmdRepeatRunning     == 1) ? "<span style='color:#00FF00'>$CmdRepeatRunning</span>"     : $CmdRepeatRunning ;;\
    $MaxSOCControlRunning             = ($MaxSOCControlRunning == 1) ? "<span style='color:#00FF00'>$MaxSOCControlRunning</span>" : $MaxSOCControlRunning ;;\
    $MiddayControlRunning             = ($MiddayControlRunning == 1) ? "<span style='color:#00FF00'>$MiddayControlRunning</span>" : $MiddayControlRunning ;;\
\
    $ZeitStart                        = ($Entladung eq "Zeit") ? "<span style='color:#00FF00'>$ZeitStart</span>" : $ZeitStart ;;\
    $ZeitEnde                         = ($Entladung eq "Zeit") ? "<span style='color:#00FF00'>$ZeitEnde</span>"  : $ZeitEnde  ;;\
\
"<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'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Speicher<dd>Steuerung / Status / Leistung / aktueller SOC</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Entladung."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Status."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Trigger<dd>Status / ExternTrigger / Start / Ende</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Trigger."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ExternTrigger."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ZeitStart."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$ZeitEnde."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Kommando Wiederholung<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$CmdRepeatActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$CmdRepeatRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MaxSOC Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOCControlActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOCControlRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / Ziel</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_fc1_Limit."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$MaxSOC_MinSOC_Time."<br>".$MaxSOC_MinSOC_MinSOC."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_DayBefore."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MaxSOC_Actual."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Mittags Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MiddayControlActive."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MiddayControlRunning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br><br>MaxSOC morgens / Power morgens / Power mittags</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Midday_Inverter_Max_Power."<br><br>".$Midday_MaxSOC."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Midday_NotBefore."<br><br>".$Midday_MaxChargePowerAbs_morning."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_middayhigh_fc0_start."<br><br>".$Midday_MaxChargePowerAbs_midday."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_middayhigh_fc0_stop."<br><br><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>MinSOC Steuerung<dd>fc1_Limit / Winter / Sommer</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_fc1_Limit."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_Winter."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$MinSOC_Sommer."</td></tr>\
</table>\
</html>"\
}\

attr WR_1_Speicher_1_ExternControl uiTable {\
package ui_Table;;\
$TC{1..5}="align='center'";;         ## Spalten 1 bis 5 werden zentriert\
}\
\
"Kommando<dd>Auswahl</dd>" | widget([$SELF:ui_command],"uzsuDropDown,---,smart_Laden start,smart_Laden beenden,3 Minuten Wiederholung")\
\
"Speicher<dd>Steuerung</dd>" | widget([$SELF:SpeicherEntladung],"uzsuDropDown,Automatik,Trigger,Zeit")\
\
"Trigger<dd>Status / ExternTrigger / Start / Ende</dd>" | widget([$SELF:SpeicherTrigger],"uzsuDropDown,entladen,gesperrt,none") | | widget([$SELF:SpeicherExternTrigger],"uzsuDropDown,frei,none") | widget([$SELF:SpeicherZeitStart],"time") | widget([$SELF:SpeicherZeitEnde],"time")\
\
"Kommando Wiederholung<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherCmdRepeatActive],"uzsuToggle,0,1") | widget([$SELF:SpeicherCmdRepeatRunning],"uzsuToggle,0,1")\
\
"MaxSOC Kontrolle<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherMaxSOCControlActive],"uzsuToggle,0,1") | widget([$SELF:SpeicherMaxSOCControlRunning],"uzsuToggle,0,1")\
\
"MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / Ziel</dd>" | widget([$SELF:SpeicherMaxSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin") | widget([$SELF:SpeicherMaxSOC_MinSOC_Time],"time")."<br>". widget([$SELF:SpeicherMaxSOC_MinSOC_MinSOC],"selectnumbers,5,1,100,0,lin") | "<br><br>".widget([$SELF:SpeicherMaxSOC_DayBefore],"selectnumbers,5,1,100,0,lin") | "<br><br>".widget([$SELF:SpeicherMaxSOC_Actual],"selectnumbers,5,1,100,0,lin")\
\
"Mittags Kontrolle<dd>aktiviert / läuft</dd>" |widget([$SELF:SpeicherMiddayControlActive],"uzsuToggle,0,1") | widget([$SELF:SpeicherMiddayControlRunning],"uzsuToggle,0,1")\
\
"Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br><br>MaxSOC morgens / Power morgens / Power mittags</dd>" |\
widget([$SELF:SpeicherMidday_Inverter_Max_Power],"selectnumbers,1000,250,15000,0,lin")."<br><br>".widget([$SELF:SpeicherMidday_MaxSOC],"selectnumbers,5,1,100,0,lin") | widget([$SELF:SpeicherMidday_NotBefore],"time")."<br><br>".widget([$SELF:SpeicherMidday_MaxChargePowerAbs_morning],"selectnumbers,0,50,2000,0,lin") | widget([WR_1:Solar_middayhigh_fc0_start],"time")."<br><br>".widget([$SELF:SpeicherMidday_MaxChargePowerAbs_midday],"selectnumbers,0,1,5000,0,lin") | widget([WR_1:Solar_middayhigh_fc0_stop],"time")."<br><br><br>"\
\
"MinSOC Steuerung<dd>fc1_Limit / Winter / Sommer</dd>" | widget([$SELF:SpeicherMinSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin") | |widget([$SELF:SpeicherMinSOC_Winter],"selectnumbers,10,1,30,0,lin") | widget([$SELF:SpeicherMinSOC_Sommer],"selectnumbers,5,1,10,0,lin")\

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 September 2021, 17:33:52
Hallo zusammen,
ich hätte gerne mal Eure Meinung zum Design , das ich jetzt mit uiTable erstellt habe.
Es vereint das stateFormat mit der Konfiguration über uiTable und widgets nun in einer Tabelle, sogar mit bunten Ladebalken :-)
Auch die anderen Devices würden dann bei begeisterten Rückmeldungen auch angepasst werden ;-) :-) :-)
VG
   Christian

P.S. zuerst mal nur als Bild und nicht als RAW, da es da noch einiges im Device zu tun gibt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ozwo am 20 September 2021, 17:49:10
Zitatich hätte gerne mal Eure Meinung zum Design , das ich jetzt mit uiTable erstellt habe.
Sieht total super aus! Vielen Dank schonmal.

Eine Frage noch zum aktuellen Stand:
ZitatHierdurch wird das DUMMY WR_1_Speicher_1_ExternTrigger überflüssig werden und es verschwindet komplett.
Mit aktuellem Stand kann ich das WR_1_Speicher_1_ExternTrigger schon rauswerfen, oder?

Nochmal Danke und viele Grüße
Oliver
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 September 2021, 19:12:54
Zitat von: ozwo am 20 September 2021, 17:49:10
Sieht total super aus! Vielen Dank schonmal.
Vielen Dank

Zitat
Eine Frage noch zum aktuellen Stand:Mit aktuellem Stand kann ich das WR_1_Speicher_1_ExternTrigger schon rauswerfen, oder?
Nur wenn Du alles ins WR_1_Speicher_1_ExternControl übernommen hast, was ich hier im Thread beschrieben hatte.
Das Wiki hat noch den alten Stand!

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 September 2021, 11:02:57
Das neue WR_1_Speicher_1_ExternControl ist jetzt im Wiki zu finden.

Bitte achtet darauf, dass es auch im cmd_* Bereich diverse Anpassungen gegeben hat. Auch heute habe ich noch einiges korrigiert, was insbesondere mit den pull down Menüs zu tun hat. Einige reading Namen wurden angepasst und aus 0/1 wurde An/Aus und einiges was ich selber nicht mehr weis :-)
Im Anhang ist dann das Erscheinungsbild zu erkennen, das dann auch zu den anderen Devices passt.

Bitte beachtet, das ich bald auch mal Urlaub habe und es dann mit dem Support etwas warten muss...
Das alte Konstrukt mit dem WR_1_Speicher_1_ExternTrigger Device ist jetzt raus.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 21 September 2021, 11:16:17
HI!

Ist es möglich vom Kostal Plenticore 10Plus einfach nur die aktuellen Daten abzufassen und im FHEM als Reading darzustellen? Also ohne ein dblog zu erstellen?

Ich würde gerne NUR die Aktuellen Wertr abgreifen (PV Leistung/Einspeisung/Eigenverbrauch/BAtterieladezustand). Viel mehr brauche ich nicht, möchte es nur in der FTUI Visualisieren...

Geht das relativ einfach?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 September 2021, 12:45:27
Zitat von: misux am 21 September 2021, 11:16:17
HI!

Ist es möglich vom Kostal Plenticore 10Plus einfach nur die aktuellen Daten abzufassen und im FHEM als Reading darzustellen? Also ohne ein dblog zu erstellen?

Ich würde gerne NUR die Aktuellen Wertr abgreifen (PV Leistung/Einspeisung/Eigenverbrauch/BAtterieladezustand). Viel mehr brauche ich nicht, möchte es nur in der FTUI Visualisieren...

Geht das relativ einfach?
Hallo Misux,

mit diesen beiden Attributen wird gesteuert, was ins DbLog geht.
Wenn Du das DbLogInclude Attribut löscht, dann wird auch nichts weg geschrieben.
Man kann natürlich auch ins FileLog schreiben.
Das selbe gilt natürlich auch für die Statistiken mit dem Device WR_1_API.

DbLogExclude .*

DbLogInclude Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Battery_MaxChargePowerLimitAbs,Battery_.*SOC,P_DC1,P_DC2,Total_DC_PV_Energy_sumOfAllPVInputs,Total_Active_P_EM,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*,P_limit_from_EVU.*


Die Autokorrektur vom Solar_forecast() geht dann natürlich auch nicht mehr, da sie aus der DbLog die letzten Tage analysiert.
Auch das Dashboard und die Graphen mit Grafana fallen dann weg.
Für TableUI könnte man einen Link über share einbinden.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 September 2021, 12:49:57
Und nochmal hallo,

ich habe heute beim Testen mal die Sommer/Winter Umschaltung bei niedriger Prognose ausprobiert und diesem Moment im Grapgen Leistungsbezug festgehalten.
Anhand der gelben Linie Actual_battery_charge_usable_P sieht man wie sich die verwendbare Leistung reduziert hat.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 21 September 2021, 19:55:20
Hi!

Vielen Dank für deine schnelle Antwort... Aber ich bin irgendwie zu blöd...

Wenn ich
define WP ModbusAttr 71 60 192.168.178.122:1502 TCP
eingebe, bekomme ich irgendwie keine readings.
Nicht einmal die 5 die ich brauche...

Was mache ich falsch?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 September 2021, 21:29:24
Zitat von: misux am 21 September 2021, 19:55:20
Wenn ich
define WP ModbusAttr 71 60 192.168.178.122:1502 TCP
eingebe, bekomme ich irgendwie keine readings.

Was mache ich falsch?
Du machst den RAW Editor auf und kopierst die komplette Definition von WR_1 in des Fenster. Das sind sehr viele Definitionen!

Bitte halte erstmal auch die Namen der Devices bei, bis Du alle Zusammenhänge überblicken kannst.

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 September 2021, 18:23:16
Hallo zusammen,

für die Liebhaber der Datenbank habe ich da nochmal etwas vorbereitet :-)

Das Jahr ist bald rum und dann kommt zumindest in Deutschland wieder das Finanzamt um die Ecke und möchte wissen, was wir so erzeugt haben :-(
Was haltet Ihr da von einer geänderten Jahresspalte in WR_1_API Device ?
Mit einem Doppel Klick auf die Zahl kann man die dann direkt in die Steuererklärung übernehmen.
Nebenbei sieht man auch, ob das Jahr besser oder schlechter wird.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 23 September 2021, 19:10:15
Hallo Christian,
gerne, wäre dabei obwohl es bei mir ein letztes Jahr erst nächstes Jahr gibt.  :)

Grüssle Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 September 2021, 19:25:41
Zitat von: zwölfgang am 23 September 2021, 19:10:15
gerne, wäre dabei obwohl es bei mir ein letztes Jahr erst nächstes Jahr gibt.  :)

Grüssle Wolfgang
Hallo Wolfgang,
dann brauchst Du es ja im Januar :-)
Hast Du schon DbRep mit eingerichtet? Das wird zb. beim Solar_forecast() verwendet für die Autokorrektur.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 September 2021, 19:50:20
Hallo zusammen,
ich fange einfach mal an das Vorjahr mit ins stateFormat vom WR_1_API aufzunehmen


In der 99_myutils.pm muss noch eine Funktion rein, die die Ausgabe vom SQL SELECT zerlegt und in readings umwandelt.
Das habe ich versucht generisch zu halten, damit es auch für andere Abfragen passt.

############################################################################################################
########           DbRep readings separieren und erstellen
############################################################################################################
sub splitReading {
my ($name,$reading,$value) = @_;
my $hash = $defs{$name};

if($reading =~ /^.*SqlResultRow_.*$/ and
    $value   =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)\|(.*)\|(.*)/ ) {

     my $TIMESTAMP = "$1-$2-$3 $4:$5:$6";
     my $READING   = "$7";
     my $VALUE     = "$8";

     setReadingsVal($hash,$READING,$VALUE,$TIMESTAMP);
}
return;
}


Das wäre dann das DbRep Device, das später aus einem Scheduling Device mit "set LogDBRep_Statistic_previous_Year  sqlCmd SELECT...." aufgerufen wird.
An der Verwendung der §Variablen§ arbeitet Heiko im Moment noch, was später eine kleinere Änderung wäre, sie stehen aber schon als "device" und "reading" in den Attributen.

defmod LogDBRep_Statistic_previous_Year DbRep LogDB
attr LogDBRep_Statistic_previous_Year DbLogExclude .*
attr LogDBRep_Statistic_previous_Year allowDeletion 0
attr LogDBRep_Statistic_previous_Year comment Version 2021.09.23 15:00
attr LogDBRep_Statistic_previous_Year device WR_1_API
attr LogDBRep_Statistic_previous_Year reading Statistic_%Year  EXCLUDE=%Autarky%,%Rate%
attr LogDBRep_Statistic_previous_Year room System
attr LogDBRep_Statistic_previous_Year userExitFn splitReading .*:.*
attr LogDBRep_Statistic_previous_Year verbose 0

setstate LogDBRep_Statistic_previous_Year 2021-09-23 15:17:36 sqlCmd SELECT * FROM (SELECT TIMESTAMP,READING,cast(VALUE/1000 AS decimal(6)) AS VALUE FROM history WHERE DEVICE='WR_1_API' AND READING LIKE 'Statistic_%Year' AND READING NOT LIKE '%Autarky%' AND READING NOT LIKE '%Rate%' 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') ORDER BY TIMESTAMP DESC ) AS x1 GROUP BY x1.READING



Danach fehlt nur noch das geänderte stateFormat im WR_1_API, dass die readings aus dem LogDBRep_Statistic_previous_Year Device liest

{
my $calcVal=0;
my $WR="WR_1";
my $YearBefore='LogDBRep_Statistic_previous_Year';

my $pvt   = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",0) );
my $pvtd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Day",0)/1000 );
my $pvtm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Month",0)/1000 );
my $pvty  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_Yield_Year",0)/1000, ReadingsVal("$YearBefore","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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Day",0)/1000 );
my $pvm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Month",0)/1000 );
my $pvy  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomePv_Year",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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Day",0)/1000 );
my $gfim = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Month",0)/1000 );
my $gfiy = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyFeedInGrid_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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Day",0)/1000 );
my $ebm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Month",0)/1000 );
my $eby  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomeGrid_Year",0) );

my $pvb   = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0));
my $pvbd  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Day",0)/1000 );
my $pvbm  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Month",0)/1000 );
my $pvby  = sprintf("%05d / %05d",ReadingsVal("$name","Statistic_EnergyHomeBat_Year",0)/1000, 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 kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Day",0)/1000 );
my $etm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Month",0)/1000 );
my $ety  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Year",0)/1000, ReadingsVal("$YearBefore","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))));
my $cy   = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Year",0))));

"<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</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</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Jahr / 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>"
}


Ich habe noch festgestellt, das ich in der Datenbank noch alte readings Namen habe, da ich Anfang diesen Jahres zur Schwarm Installation umgebaut habe.
Dadurch könnten die readings von Euren abweichen, je nach dem wann Ihr eingestiegen seid und wie gut Ihr die Aufräumaktionen mitgemacht habt.
Ich werde das natürlich noch in der Datenbank bereinigen und dann die readings in den Definitionen vereinheitlichen.
Wie man aufräumt wurde hier im Thread bereits mehrfach mit Beispielen beschrieben und ist auch im Wiki zu finden.

Generell habt Ihr sicher gemerkt, dass ich alles auf SW_* umgebaut habe, was auch funktioniert wenn man nur einen WR hat. Aber das hat sich bei mir ja auch schnell geändert, solange man noch platz auf dem Dach hat :-)

Einen Schwarm hat man übrigens auch, wenn man eine Kraft-Wärme-Kopplung, ein altes Balkon Modul oder eine andere AC Quelle betreibt. Also immer schön wach die Veränderungen beobachten.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 September 2021, 10:52:21
Moin,
ich habe noch einen kleinen Darstellungsfehler im WR_1_Speicher_1_ExternControl gefunden. Da wurde der Füllstand des Speichers nicht richtig graphisch dargestellt.

Im uiTable diese Funktion korrigieren.

sub FUNC_batt {
    my($val)=@_;
    my $ret="position:absolute;left:".(90*$val/100)."px;width:90px;height:20px;background:linear-gradient( to right,#F8F8E0 ".(90-(90*$val/100))."px,rgba(0,0,0,0) ".(90-(90*$val/100))."px);";
    return $ret;
  }

Das Wiki ist schon aktualisiert.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 September 2021, 14:50:34
Irgend Jemand hat mal geschrieben, ich solle mehr Eigenwerbung machen :-) :-)

Hier mal etwas Eigenlob zur Speicher Steuerung

- Es wurde kein Mittaghoch gefunden, also direkt morgens einfach voll Laden.
- Durch die gute Prognose >30000 wh ist MaxSOC Limitierung aktiv gewesen

- Dann habe ich jetzt geplant den Pool heute Abend zu nutzen und einfach durch das neue ExternControl GUI die MaxSOC Limitierung mit einem Klick abgeschaltet.
   Im Diagramm sieht man dann auch die reaktion, dass der Speicher ab 13:00 Uhr wieder weiter geladen wurde.

- Jetzt ist die 100% Limitierung aktiv, damit er nicht permanent weiter geladen wird, das erfolgt mit MaxSOC 95%. Ist der SOC < 98% oder es sind nur noch 2h bis zum Sonnenuntergang,
  dann wird wieder einmal bis 100% geladen. Hier kann es jedoch passieren, dass dann doch die Sonne zu schwach ist und die 100% nicht erreicht werden, was bei mir meist > 100 wh ausmacht.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 September 2021, 09:47:37
EDIT: Ich habe noch din Graphen mit angehängt.

Hallo zusammen,

hier habe ich mal ein Beispiel der Speicher Steuerung, wenn es heute ziemlich schön wird, aber für morgen die Prognose schlecht ist.

- Ein Mittagshoch wurde für heute erkannt
- MaxSOC Limitierung findet nicht stett weil fc1 < 30000 ist
- vor 9:00 Uhr wurde nichtgeladen
- jetzt ist der Speicher noch mit 41 % geladen, also > 30% , weshalb immer noch gewartet wird.
- es wird jetzt noch bis 11:00 Uhr gewartet und da MaxSOC nicht limitiert wird erfolgt dann auch der Ladebeginn.
  Ansonsten würde nochmals bis 12:00 Uhr verschoben werden, da ja dann nicht so viel rein passt.
- mit "Power mittags 0 W" ist die dynamische Ladeleistung aktiviert

- Die Ladebalken werden nun auch richtig dargestellt

VG
   Christian
(ich habe nächste Woche mal eine Sabbat Woche ;-) )
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 25 September 2021, 20:17:44
Hallo Christian,
ja, DbRep habe ich eingerichtet, Solar_forecast() scheint auch zu funktionieren, ich arbeite dran auch die WR_1_Speicher_1_ExternControl zu verstehen und auch verwenden.
Sieht gut aus.
Bei dem geänderte stateFormat im WR_1_API hat sich einen Buchstabendreher eingeschlichen, bei "$YearBefor"e," siehe in der Zeile unten.
my $eby  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000, ReadingsVal("$YearBefor"e,"Statistic_EnergyHomeGrid_Year",0) );
Wünsche dir eine schöne Sabbatwoche. :-)

Gruß Wolfgang



Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 September 2021, 22:52:12
Zitat von: zwölfgang am 25 September 2021, 20:17:44
Hallo Christian,
ja, DbRep habe ich eingerichtet, Solar_forecast() scheint auch zu funktionieren, ich arbeite dran auch die WR_1_Speicher_1_ExternControl zu verstehen und auch verwenden.
Sieht gut aus.
Bei dem geänderte stateFormat im WR_1_API hat sich einen Buchstabendreher eingeschlichen, bei "$YearBefor"e," siehe in der Zeile unten.
my $eby  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000, ReadingsVal("$YearBefor"e,"Statistic_EnergyHomeGrid_Year",0) );
Wünsche dir eine schöne Sabbatwoche. :-)

Gruß Wolfgang
Das liegt an meiner voll Legasthenie :-) das e muss natürlich an den Variablen namen ran, ich habe es im Post geändert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Oktober 2021, 09:05:22
Hallo zusammen,
der herbst kommt mit großen Schritten und ich habe mal wieder was mit Schattenmanagement (https://www.photovoltaikforum.com/core/article/13-wie-wirkt-sich-verschattung-auf-pv-module-aus/) gelesen.
Solltet Ihr von Schatten betroffen sein, so könnt Ihr den sogar zeitgesteuert aktivieren und somit das Maximum aus dem WR heraus holen. Wieviel das ausmacht kann ich Euch nicht sagen, aber ich mache ja manchmal auch Dinge, weil ich es kann :-) :-)


## Schattenmanagement
   if ($hour == 8)   {
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 0");                ## Komplett aus          <<< um 8 Uhr ist es nicht mehr notwendig
   };
   if ($hour == 18) {
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 2");                ## Im Westen unten einschalten      <<< Da kommt der Schatten vom Nachbarhaus, wenn die Sonne untergeht
   };
   if ($hour == 21) {
     CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 1");                ## Schattenmanagement für den Osten vorbereiten     <<< abends wird dann schon für den nächsten Tag vorbereitet
   };


Die Nummern [0-n] richten sich nach Euren Strings und deren Position auf dem Dach. Dazu muss man natürlich mal den Schattenwurf auf dem Dach beobachten.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Oktober 2021, 12:45:09
Hey, Ihr Mitleser,

bitte helft dem FHEM Verein und gebt Eure Stimme ab https://forum.fhem.de/index.php/topic,123357.msg1179056.html#ratethis (https://forum.fhem.de/index.php/topic,123357.msg1179056.html#ratethis)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Oktober 2021, 11:39:58
Hallo zusammen, ich bin hier (https://www.photovoltaikforum.com/thread/161776-wapu-nur-tags%C3%BCber-mit-pv-oder-duchlaufen-lassen-in-%C3%BCbergangszeit) bezüglich PV mit WP mal wieder unterwegs.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Oktober 2021, 10:46:14
Für interessierte Leser,

Auf PHOTOVOLTAIC GEOGRAPHICAL INFORMATION SYSTEM (PV GIS) bekommt man sehr schöne monatliche Ertragsprognosen, wenn man sein System realistisch einträgt.
Bei mir passt das mit geringer Abweichung zu den tatsächlichen Monatserträgen.
Man kann das Jahr im Überblick sehen und bekommt auch die restlichen Monate des Jahres angezeigt.
Die Datenbasis scheint jedoch vom Zeitraum 2005 - 2016 zu sein. Was dann allerdings die letzen Jahre mit trockenen Sommern nicht beinhaltet.

Hat jemand eine Idee, was wir damit anfangen können ???
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Oktober 2021, 11:12:57
EDIT: Sorry, ich musste nochmal aktualisieren, da noch ein unnützer Wert zum Testen drin stand.

Hallo zusammen,
der Winter naht und mein Speicher macht das erste mal "smart_Laden" :-(

Hier kommt dann ein aktualisiertes uiTable:
- rechts oben wird das "smart_Laden aktiv" in rot angezeigt
- in der untersten Zeile sind die SOC Einstellungen für Sommer/Winter zusammen gerutscht und in der rechten Spalte wird der aktuell eingestellte SOC angezeigt.


{
package ui_Table;
##  $TR{0} = "style='color:yellow;text-align:left;font-weight:bold;font-size:18px'";                                                         ## Reihe 0 für Überschrift
  $TABLE = "style='width:100%;'";

  $TD{0..9}{0}     = "align='center' style='font-size:16px;border-right-style:solid;border-color:darkgreen;border-right-width:2px;width:26%'";

  $TD{0..9}{1} = "style='border-top-style:solid;border-bottom-style:solid;border-right-style:solid;border-color:darkgreen;border-top-width:2px;border-bottom-width:2px;border-right-width:1px;width:36%;font-weight:bold;'";
  $TD{0..9}{2..4} = "style='border-top-style:solid;border-bottom-style:solid;border-right-style:solid;border-color:darkgreen;border-top-width:2px;border-bottom-width:2px;border-right-width:1px;width:8%;text-align:center;'";
  $TD{0..9}{5} = "style='border-top-style:solid;border-bottom-style:solid;border-right-style:solid;border-color:darkgreen;border-top-width:2px;border-bottom-width:2px;border-right-width:2px;width:8%;text-align:center;'";

sub FUNC_batt {
    my($val)=@_;
    my $ret="position:absolute;left:".(90*$val/100)."px;width:90px;height:20px;background:linear-gradient( to right,#F8F8E0 ".(90-(90*$val/100))."px,rgba(0,0,0,0) ".(90-(90*$val/100))."px);";
    return $ret;
  }
sub FUNC_Status {
    my($value, $min, $colorMin,  $statusMin,  $colorMiddel, $statusMiddle, $max, $colorMax, $statusMax)=@_;
    my $ret = ($value < $min)? '<span style="color:'.$colorMin.'">'.$statusMin.'</span>' : ($value > $max)? '<span style="color:'.$colorMax.'">'.$statusMax.'</span>' : '<span style="color:'.$colorMiddel.'">'.$statusMiddle.'</span>';
    return $ret;
  }
}

#########################################################
## "Spalte 0"|"Spalte 1"|"Spalte 2"|"Spalte 3"|"Spalte 4"|"Spalte 5"

"$SELF"|"Kommando<dd>Auswahl / DcPowerAbs</dd>" | widget([$SELF:ui_command],"uzsuDropDown,---,smart_Laden start,smart_Laden beenden,3 Minuten Wiederholung,Reset,DC_Power_Abs,Sommer,Winter") | widget([$SELF:SpeicherDcPowerAbs],"selectnumbers,-4500,250,4500,0,lin")."W" |""|([$SELF:SpeicherExternTrigger] eq "gesperrt" and [WR_1_API:Battery_InternControl_MinHomeConsumption] == [WR_1_API:Battery_Info_WorkCapacity])?'<span style="color:red">smart_Laden aktiv</span>':""

|"Speicher<dd>Steuerung</dd>" | widget([$SELF:SpeicherEntladung],"uzsuDropDown,Automatik,Trigger,Zeit") |""|
FUNC_Status([WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],-10,"#00FF00","Laden","orange","Standby",15,"red","Entladen").FUNC_Status([WR_1:Act_state_of_charge],15,"red","Speicher SOC","orange","Speicher SOC",49,"#00FF00","Speicher SOC")|

FUNC_Status([WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],-10,"green",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],"orange",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],15,"red",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P])." W"."<div style='border-width:2px;border-style:solid;border-color:gray;position:relative;width:90px;height:20px;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);'>".STY(" ",FUNC_batt([WR_1:Act_state_of_charge])).STY(::round([WR_1:Act_state_of_charge],0)."%","font-size:16px;position:absolute;top:2px;left:30px")."</div>"


|"Trigger<dd>Status / ExternTrigger / Start / Ende</dd>" | widget([$SELF:SpeicherTrigger],"uzsuDropDown,entladen,gesperrt,none") | widget([$SELF:SpeicherExternTrigger],"uzsuDropDown,frei,gesperrt,none") | widget([$SELF:SpeicherZeitStart],"time") | widget([$SELF:SpeicherZeitEnde],"time")

|"Kommando Wiederholung<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherCmdRepeatActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherCmdRepeatRunning],"uzsuToggle,Aus,An") |""|""

|"MaxSOC Kontrolle<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherMaxSOCControlActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherMaxSOCControlRunning],"uzsuToggle,Aus,An") |""|""

|"MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / geplant</dd>" |
FUNC_Status([WR_1:Solar_Calculation_fc1_day],[$SELF:SpeicherMaxSOC_fc1_Limit],"red","<","","",[$SELF:SpeicherMaxSOC_fc1_Limit]-1,"#00FF00",">="). widget([$SELF:SpeicherMaxSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin") | widget([$SELF:SpeicherMaxSOC_MinSOC_Time],"time"). widget([$SELF:SpeicherMaxSOC_MinSOC_MinSOC],"selectnumbers,5,1,100,0,lin") |
"<div style='border-width:2px;border-style:solid;border-color:gray;position:relative;width:90px;height:20px;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);'>".STY(" ",FUNC_batt([$SELF:SpeicherMaxSOC_DayBefore])).STY("gestern","font-size:12px;position:absolute;top:3px;left:25px")."</div>".widget([$SELF:SpeicherMaxSOC_DayBefore],"selectnumbers,5,1,100,0,lin")."%" |
"<div style='border-width:2px;border-style:solid;border-color:gray;position:relative;width:90px;height:20px;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);'>".STY(" ",FUNC_batt([$SELF:SpeicherMaxSOC_Actual])).STY("geplant","font-size:12px;position:absolute;top:3px;left:25px")."</div>".widget([$SELF:SpeicherMaxSOC_Actual],"selectnumbers,5,1,100,0,lin")."%"

|"Mittags Kontrolle<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherMiddayControlActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherMiddayControlRunning],"uzsuToggle,Aus,An")|""|""

|"Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br>MaxSOC morgens / Power morgens / Power mittags</dd>" | widget([$SELF:SpeicherMidday_Inverter_Max_Power],"selectnumbers,1000,250,15000,0,lin")."W<br>".widget([$SELF:SpeicherMidday_MaxSOC],"selectnumbers,5,1,100,0,lin")."%" | widget([$SELF:SpeicherMidday_NotBefore],"time").widget([$SELF:SpeicherMidday_MaxChargePowerAbs_morning],"selectnumbers,0,50,2000,0,lin")."W" | widget([WR_1:Solar_middayhigh_fc0_start],"time").widget([$SELF:SpeicherMidday_MaxChargePowerAbs_midday],"selectnumbers,0,1,5000,0,lin")."W" | widget([WR_1:Solar_middayhigh_fc0_stop],"time").([$SELF:SpeicherMidday_MaxChargePowerAbs_midday] == 0)?"dynamisch":""

|"MinSOC Steuerung<dd>fc1_Limit / Winter | Sommer /aktuell</dd>"|
FUNC_Status([WR_1:Solar_Calculation_fc1_day],[$SELF:SpeicherMinSOC_fc1_Limit],"red","<","","",[$SELF:SpeicherMinSOC_fc1_Limit]-1,"#00FF00",">=").widget([$SELF:SpeicherMinSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin")."wh" |
widget([$SELF:SpeicherMinSOC_Winter],"selectnumbers,10,1,30,0,lin").widget([$SELF:SpeicherMinSOC_Sommer],"selectnumbers,5,1,10,0,lin")."%" |""|[WR_1_API:Battery_InternControl_MinSoc]." %"


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Oktober 2021, 21:55:30
Hallo

ich denke die nächste Nachricht wird nur für ganz wenige hier von Nutzen sein.
Es ist nun gelungen, dank der Zusammenarbeit mit dem Photovoltaikforum, das man sich auch als Installer/master an der Plenticore API anmelden kann.
Dafür braucht man jedoch einen eigenen "Service Key" für den Installer Zugang.
Wer solch einen Key hat, der kann sich gerne mal bei mir melden, damit wir überlegen können, welche Funktionalität  man damit noch einbauen kann.

Das würde mir soweit einfallen

- Aktivieren/Deaktivieren der AC Laden des Speichers im Schwarm, da im Sommer meist der Master zum Laden reicht.
- Aktivieren/Deaktivieren des Speichers, damit nach einer externen Steuerung wieder die internen defaults verwendet werden

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 27 Oktober 2021, 16:37:54
Moin zusammen und danke für alles bisher Geleistete. Ich hab schon 2 Plenticore mit einmal BYD in Betrieb und die Tage kommt noch ein Fronius dazu. Nun dachte ich, ich setze das Wiki flott um, um ein wenig mit der Speichersteuerung experimentieren zu können und alle 3 WR schön in eine mySQL loggen zu lassen.

Leider scheitert es bereits am
ZitatWenn das Passwort aus dem KeyStore mit read abgeholt wird, wird es im Klartext angezeigt! Dies muss einzeilig und identisch zum "Master Key" erscheinen. Bei etwaigen Sonderzeichen kam es hier schon zu Abweichungen. In solch einem Fall muss man dann leider den "Master Key" im Plenticore ändern.
weil mein Key u. a. ein @ enthält.

Ich hab nun überall gesucht, als Betreiber und Installateur... aber ich finde nichts, wo ich diesen Master Key ändern kann. Wie bekomme ich nun das Teil in den KeyStore von fhem?

Danke
Michael
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 27 Oktober 2021, 19:21:56
Zitat von: MichaelO am 27 Oktober 2021, 16:37:54
Moin zusammen und danke für alles bisher Geleistete. Ich hab schon 2 Plenticore mit einmal BYD in Betrieb und die Tage kommt noch ein Fronius dazu. Nun dachte ich, ich setze das Wiki flott um, um ein wenig mit der Speichersteuerung experimentieren zu können und alle 3 WR schön in eine mySQL loggen zu lassen.

Leider scheitert es bereits am weil mein Key u. a. ein @ enthält.

Ich hab nun überall gesucht, als Betreiber und Installateur... aber ich finde nichts, wo ich diesen Master Key ändern kann. Wie bekomme ich nun das Teil in den KeyStore von fhem?
Hallo Michael,
ich entnehme mal, dass Du das mit dem '@' bereits ausprobiert hast und das es tatsächlich nicht klappt.

Im Plenticore kann man das Passwort unter "Einstellungen|Grundeinstellungen" ändern.
Wenn der Plenticore mal durch zu viele falsche Zugriffe gesperrt war hatte ich bisher immer einfach den "Master Key" erneut überschrieben. Deshalb gehe ich davon aus, dass das Passwort dort der 'Master Key' ist. Eine kurze Bestätigung, wenn es so klappt wäre ganz toll.

Wenn Du den fremd WR so änlich wie möglich zum Plenticore implementierst, wirst Du sicherlich die wenigsten Probleme bekommen.
Vom Slave WR werden ja nicht so viele Werte benötigt, damit er sauber integriert werden kann.
Nur bei den Statistiken solltest Du genau hinschauen, damit diese auch kompatiebel zusammen geführt werden können.
Bei Fragen melde Dich einfach.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 28 Oktober 2021, 13:46:50
Zitat von: ch.eick am 27 Oktober 2021, 19:21:56
Im Plenticore kann man das Passwort unter "Einstellungen|Grundeinstellungen" ändern.
Wenn der Plenticore mal durch zu viele falsche Zugriffe gesperrt war hatte ich bisher immer einfach den "Master Key" erneut überschrieben. Deshalb gehe ich davon aus, dass das Passwort dort der 'Master Key' ist. Eine kurze Bestätigung, wenn es so klappt wäre ganz toll.

Danke für die schnelle Rückmeldung. Leider gibt es hier Begriffsverwirrungen, denn Deine Annahmen passen nicht. Der Plenticore kennt 2 Rollen. Diese sind der Anlagenbetreiber und der Installateur. Jede Rolle hat unterschiedliche Login-Methoden.

Der Anlagenbetreiber wird im Dropdown ausgewählt und muss ein Passwort eingeben. Dieses Passwort ist NICHT der Master Key vom Aufkleber, sondern ein frei zu vergebenes Passwort, dass in den von Dir beschriebenen Grundeinstellungen geändert werden kann.

Der Installateur wird ebenfalls im Dropdown ausgewählt, muss dann aber den Master Key und den Service Code eingeben. Der Master Key steht auf dem Aufkleber (bei mir mit Sonderzeichen) und den Service Code bekommt man von Kostal. Beides lässt sich nicht im Wechselrichter ändern.

Ich habe nach Deinem Posting alles mögliche versucht, aber im Menü der Grundeinstellung konnte ich stets nur das Passwort für den Anlagenbetreiber ändern, egal ob der Menüpunkt im Profil Betreiber oder Installateur ausgewählt wurde.

Leider ist das Wiki derart komplex, dass ich momentan nicht mehr Zeit für Versuche habe. Die Einrichtung beider WR mit BYD klappt jedenfalls nicht auf anhieb, da brauche ich mehr Zeit.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Oktober 2021, 20:58:26
Zitat von: MichaelO am 28 Oktober 2021, 13:46:50
Danke für die schnelle Rückmeldung. Leider gibt es hier Begriffsverwirrungen, denn Deine Annahmen passen nicht. Der Plenticore kennt 2 Rollen. Diese sind der Anlagenbetreiber und der Installateur. Jede Rolle hat unterschiedliche Login-Methoden.

Der Anlagenbetreiber wird im Dropdown ausgewählt und muss ein Passwort eingeben. Dieses Passwort ist NICHT der Master Key vom Aufkleber, sondern ein frei zu vergebenes Passwort, dass in den von Dir beschriebenen Grundeinstellungen geändert werden kann.

Der Installateur wird ebenfalls im Dropdown ausgewählt, muss dann aber den Master Key und den Service Code eingeben. Der Master Key steht auf dem Aufkleber (bei mir mit Sonderzeichen) und den Service Code bekommt man von Kostal. Beides lässt sich nicht im Wechselrichter ändern.

Ich habe nach Deinem Posting alles mögliche versucht, aber im Menü der Grundeinstellung konnte ich stets nur das Passwort für den Anlagenbetreiber ändern, egal ob der Menüpunkt im Profil Betreiber oder Installateur ausgewählt wurde.

Leider ist das Wiki derart komplex, dass ich momentan nicht mehr Zeit für Versuche habe. Die Einrichtung beider WR mit BYD klappt jedenfalls nicht auf anhieb, da brauche ich mehr Zeit.
Ich habe bei mir immer das Passwort des Anlagenbetreibers gleich dem Master Key vom Aufkleber gesetzt, somit kann man es auch nicht vergessen :-)
Leider führen diese Begrifflichkeiten immer wieder zu Verwirrung.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Crawler am 20 November 2021, 22:54:13
Hi
ich weiß jetzt nicht ob ich hier richtig bin  ::)
Ich habe mal die HTTPMOD Geschichte bei mir eingerichtet.
die Raw Def lies sich auch ohne Probleme einbinden und die Anmeldung am Plenticore Plus 4.2 funktioniert.
Leider bekomme ich als Fehler in Last ERROR Reading
Zitat"http:///api/v1/auth/logout: malformed or unsupported URL"
obwohl im Event Monitor
Zitat2021-11-20 22:30:57 ModbusAttr Plenticore Total_DC_Power: 0
2021-11-20 22:30:58 ModbusAttr Plenticore Gesamt_Ertrag: 41.272
2021-11-20 22:30:58 ModbusAttr Plenticore täglicher_Ertrag: 60.308
2021-11-20 22:30:58 ModbusAttr Plenticore Ladezustand: 38
steht.
liegt es an der fehlenden Einbindung der SQL Datenbank?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 November 2021, 09:44:11
Zitat
liegt es an der fehlenden Einbindung der SQL Datenbank?
Die ist komplett raus, Du könntest ja auch FileLog verwenden, wenn Du die anderen Sachen auch nicht verwenden möchtest.


Zitat von: Crawler am 20 November 2021, 22:54:13
Ich habe mal die HTTPMOD Geschichte bei mir eingerichtet.
die Raw Def lies sich auch ohne Probleme einbinden und die Anmeldung am Plenticore Plus 4.2 funktioniert.
Leider bekomme ich als Fehler in Last ERROR Readingobwohl im Event Monitor steht.

Deine Meldungen im Log sind vom ModBus Device, das nichts mit HTTPMOD zu tun hat. Über ModBus bekommst Du aktuelle Werte und einige wenige Statistiken, die Du Dir ja auch schon umbenannt hast. Mit der Umbenennung solltest Du vorsichtig sein, wenn Du später auch noch andere Teil aus dem Wiki übernehmen möchtest, da sich die Namen ja durchziehen. Das hat bei anderen Anwendern zu einem nicht endenden Aufwand bei Neuerungen geführt. Auch bei SQL SELECTs müsstest Du in den Beispielen immer wieder umbenennen.
Weiterhin ist auch der Device Name mit bedacht gewählt und fügt sich in die anderen Devices ein.

Das HTTPMOD ist ein separates Device und greift auf die API zu, um Statistiken abzufragen und um den Plenticore inklusieve Speicher steuern zu können. Einiges würde auch über das ModBus Device gehen, was ich aber noch nicht umgesetzt habe, da es in der Firmware erst später dazu gekommen ist,

Bei dem Login Fehler fehlt Dir noch das WR_1_config Device, wo die IP-Adresse konfiguriert wird, denn die fehlt Dir im http Aufruf, siehe dazu nochmal die Device Benennung oben in der ersten Antwort.
Dann check bitte als nächstes die Funktionen in der 99_myUtils für die Authentification.
Und vergiss nicht das Plenticore Passwort zu hinterlegen und auch zu testen, da es bei Sonderzeichen schon Schwierigkeiten gegeben hat.

Im Wiki habe ich versucht den Aufbau von oben nach unten zu strukturieren, es ist also nicht so gut in der Mitte anzufangen :-)

Die Solar_* Funktionen brauchst Du nur, wenn Du an dem Thema Interesse hast.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Crawler am 21 November 2021, 11:26:40
Hab ich glatt überlesen den Modbus  ::)
Ich finde die Wiki Seite sehr überladen und an manchen stellen komme ich nicht wirklich mit.
Wird es irgendwann nochmal ein fertiges Modul wie für den Piko geben?

Okay hab jetzt config und modbus auf WR_1 umgestellt jetzt kommen auch alle Werte  :)
Konnte bei mir auch die externe Batteriesteuerung über modbus aktivieren.

jetzt die Frage der Steuerung der Batterie. Modbus oder http?

Sonst muss ich dir ein großes Lob ausstellen. Da stecken viele Stunden Arbeit drin  :o

der WR1 sieht noch ein wenig unschön aus.
Ich denke das mach ich dann mal schön
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 November 2021, 13:05:41
Zitat von: Crawler am 21 November 2021, 11:26:40
Hab ich glatt überlesen den Modbus  ::)
Ich finde die Wiki Seite sehr überladen und an manchen stellen komme ich nicht wirklich mit.
Wird es irgendwann nochmal ein fertiges Modul wie für den Piko geben?
Ich stimme zu, es ist extrem viel Information, dafür aber nahezu komplett und an einer Stelle :-) Je weiter Du nach unten kommst, desto mehr könntest Du auch weglassen.

Zitat
Okay hab jetzt config und modbus auf WR_1 umgestellt jetzt kommen auch alle Werte  :)
Okay, das klappt dann schon mal.

Zitat
Konnte bei mir auch die externe Batteriesteuerung über modbus aktivieren.
Bei den Befehlen über ModBus habe ich festgestellt, dass es nicht wieder in den Default zurück fällt, somit müsste man das dann kontinuierlich und voll umfänglich weiter steuern.

Zitat
jetzt die Frage der Steuerung der Batterie. Modbus oder http?
Hier steht erstmal die Frage, was möchtest Du machen und Erreichen?
Bei nur einem WR wäre die erste Wahl die "intelligente Speicher Steuerung" des Plenticore, die hat schon ziemlich gute Treffer und war auch mein Anfang.

Wenn Du auch die Leistungsprognose verwenden möchtest, dann könntest Du die Grundsteuerung des WR verbessern. Für einige Fälle brauchst Du dann aber die Aktivierung der externen Speichersteuerung im Plenticore, was Dir der Installateur aktivieren müsste.

Ich verwende die API mit HTTPMOD und habe es so implementiert, das es das "dead man" Prinzip gibt. Sollte FHEM ausfallen arbeitet der WR einfach mit der internen Steuerung weiter, was auch mit der "intelligenten Speicher Steuerung" funktioniert.

Zitat
Sonst muss ich dir ein großes Lob ausstellen. Da stecken viele Stunden Arbeit drin  :o
Circa 3 Jahre ;-)

Zitat
der WR1 sieht noch ein wenig unschön aus.
Ich denke das mach ich dann mal schön
Hast Du bereits die Tabelle mit mit dem Rahmen als stateFormat ? Ich habe gerade gesehen, dass im Wiki noch ein älterer Stand ist.
Ich aktualisiere das gleich nochmal.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 November 2021, 13:30:32
Eins hatte ich noch vergessen.

Ich werde daraus keim Modul erstellen, da ich dieses dann ja auch supporten muss.
Aus diesem Grund hatte ich mich entschieden die bestehenden Basis Module zu verwenden, wo Ihr auch separat Hilfe bekommen könnt.
Weiterhin verwendet hier auch nicht jeder alles was ich implementiert habe und Ihr könnt die Einzelkomponenten auch an anderer Stelle verwenden.

Das Wiki habe ich gerade noch aktualisiert:

WR_1
WR_2
WR_1_API
WR_2_API
WR_1_Speicher_1_ExternControl

Im Wiki sind jetzt auch wieder aktuelle Bilder zu finden.

Für die Zukunft ist noch eine Layout Überarbeitung geplant, bei der das uiTable Design auf die zu steuernden Geräte übertragen werden soll.
Dadurch werden die DUMMY Devices überflüssig werden. Das Erscheinungsbild wäre dann entsprechend dem WR_1_Speicher_1 oder dem Kia_eNiro_PV Device.
Auch wichtige Aufrufe, die jetzt im DOIF als cmd_* vorhanden sind werden dann als Pull Down im uiTable erscheinen.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 November 2021, 16:08:11
Hey zusammen

ich habe mal hier openWB mit Kia connect (https://wiki.fhem.de/wiki/OpenWB#Komplexe_Anbindung) ein Anwendungsbeispiel mit openWB, Kia connect und sperren des Hausspeichers beim Laden abgelegt.

VG
   Christian
Titel: Batteriestatus (Normal, Ruhemodus 1, Ruhemodus 2) abfragen
Beitrag von: ojb am 25 November 2021, 09:28:22
Hallo Leute,

ich habe eine PV-Anlage mit zwei Plenticore's und einer BYD und soweit alles am Laufen und in FHEM integriert. Vielen Dank für all die Vorleistungen. Grandios.

Das einzige was mir jetzt noch fehlt ist der Batteriestatus, also Normal, Ruhemodus 1, Ruhemodus 2.

In der Weboberfläche vom Plenticore findet man den Status unter Momentanwerte->Batterie.

FHEM liest Batterie_state aus, der steht bei mir aber immer auf NaN, was immer das heißen soll.

Bekommt jemand den Betteriestatus und wenn ja, wie?

Liebe Grüße
Oli
Titel: Antw:Batteriestatus (Normal, Ruhemodus 1, Ruhemodus 2) abfragen
Beitrag von: ch.eick am 25 November 2021, 10:05:23
Zitat von: ojb am 25 November 2021, 09:28:22
Das einzige was mir jetzt noch fehlt ist der Batteriestatus, also Normal, Ruhemodus 1, Ruhemodus 2.

In der Weboberfläche vom Plenticore findet man den Status unter Momentanwerte->Batterie.

FHEM liest Batterie_state aus, der steht bei mir aber immer auf NaN, was immer das heißen soll.

Bekommt jemand den Betteriestatus und wenn ja, wie?

Liebe Grüße
Oli
Hallo Oli,

leider sind einige ModBus Register zwar benannt, aber momentan wohl vom Plenticore noch nicht korret gefüllt oder verwendet.
NaN könnte "not actualy named" bedeuten, aber sicher bin ich mir da nicht.

Hier ist die gewünsche Information

WR_1_API Battery_EM_State Normal

reading25Name    Battery_EM_State
reading25OMap    0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz
reading25Regex   EM_State.*value":(\d+)

Ich werde mal schauen, wo es ins stateFormat noch rein passt.

Gruß
     Christian

EDIT: Der Speicher Status wird jetzt im WR_1 Device mit angezeigt. Das geht aber nur, wenn es das WR_1_API Device ebenfalls gibt, allerdings passte es da nicht so dolle ins stateFormat. Plaziert habe ich es in der letzten Zeile zum Speicher Status (Laden/Entladen/Standby) in eine zusätzliche Unterzeile.
Das neue stateFormat steht dann im Wiki beim WR_1 Device.

Auch im WR_1_Speicher_1_ExternControl ist es jetzt im uiTable mit untergebracht.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 25 November 2021, 11:30:37
Ich hab das API Device noch nicht eingebaut, weil ich eigentlich alles aus dem Nicht-API bekomme.
Hab ich das richtig verstanden, ohne API-Device geht es nicht, oder?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 November 2021, 14:26:33
Zitat von: ojb am 25 November 2021, 11:30:37
Ich hab das API Device noch nicht eingebaut, weil ich eigentlich alles aus dem Nicht-API bekomme.
Hab ich das richtig verstanden, ohne API-Device geht es nicht, oder?
Es geht nicht, da ModBus diesen Wert noch nicht liefert.

Mit der API bekommst Du aber noch die ganzen Statistiken und Du könntest z.B. den Speicher steuern.
Die Screenshots im Wiki hatte ich erst vor kurzem aktualisiert.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 25 November 2021, 16:14:57
Doch das steht im Register 104 - "State of energy manager".
Der Name ist komplett bullshit. Die Werte sind laut Kostal-ModBus-PDF folgende:
0x00 Idle
0x01 n/a
0x02 Emergency Battery Charge
0x04 n/a
0x08 Winter Mode Step 1
0x10 Winter Mode Step 2

Ich habe es so eingebunden:

obj-h104-format     %d
obj-h104-reading    Battery_mode
obj-h104-revRegs   0
obj-h104-unpack    N

Eigentlich wollte ich die Werte auch noch mit einem obj-h104-map entsprechend umsetzen. Das klappt aber komischweise bei mir nicht.

obj-h104-map   0:Idle, 2:Emergency Charge, 8:Sleep1, 16:Sleep2

Sobald ich das drin habe, wird nur noch 0 angezeigt :-(
Jetzt habe ich aktuell gerade eine 8 :-(
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 November 2021, 17:17:19
Zitat von: papa am 25 November 2021, 16:14:57
Doch das steht im Register 104 - "State of energy manager".
Der Name ist komplett bullshit. Die Werte sind laut Kostal-ModBus-PDF folgende:
0x00 Idle
0x01 n/a
0x02 Emergency Battery Charge
0x04 n/a
0x08 Winter Mode Step 1
0x10 Winter Mode Step 2

Ich habe es so eingebunden:

obj-h104-format     %d
obj-h104-reading    Battery_mode
obj-h104-revRegs   0
obj-h104-unpack    N

Eigentlich wollte ich die Werte auch noch mit einem obj-h104-map entsprechend umsetzen. Das klappt aber komischweise bei mir nicht.

obj-h104-map   0:Idle, 2:Emergency Charge, 8:Sleep1, 16:Sleep2

Sobald ich das drin habe, wird nur noch 0 angezeigt :-(
Jetzt habe ich aktuell gerade eine 8 :-(

Hallo papa

Klasse, das hatte ich noch gar nicht gesehen.
Für das WR_1 Device wäre es dann folgende Änderung.
Ich denke das mit dem obj-h104-map könnte an den Blanks liegen. Nimm die mal raus und teste es, da ich bei mir den Ruhe Modus gleich wieder zurück setze.
Ich habe mal die Modie aus dem API Device al Mapping genommen, da stehen etwas mehr drin, aber ob die so passen kann ich nicht sagen.

attr WR_1 obj-h104-format %s
attr WR_1 obj-h104-map 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz
attr WR_1 obj-h104-reading State_of_EM
attr WR_1 obj-h104-revRegs 0
attr WR_1 obj-h104-unpack N


EDIT: Ich habe das mal ins Wiki übernommen, obwohl der Test noch aussteht.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 25 November 2021, 19:06:15
Das format war es
attr WR_1 obj-h104-format %s
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 November 2021, 19:28:24
Zitat von: papa am 25 November 2021, 19:06:15
Das format war es
attr WR_1 obj-h104-format %s
Hast Du die Status auch mal gechecked? Ich habe ja einige mehr in der API definiert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 25 November 2021, 22:27:26
Ich habe meine Map wieder drin. Das sind die Werte aus der ModBus-Doku.
Zur Zeit ist bei mir Sleep1 aktiv :-(
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 November 2021, 05:39:59
Zitat von: papa am 25 November 2021, 22:27:26
Ich habe meine Map wieder drin. Das sind die Werte aus der ModBus-Doku.
Zur Zeit ist bei mir Sleep1 aktiv :-(
Dann passt ja wenigstens die "map" ;-)
Falls Du nachts auch noch Notladung hast, sollte das in der LogDB eventuell auch mal als Stutus zu sehen sein.
Mit dem Installateur Key könntest Du einen Reset des Speichers machen, aber das löst sich auch wieder selber auf. Berichte bitte mal wie lange es gedauert hat.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 26 November 2021, 08:01:47
Notladung habe ich nicht, - Min-Soc staht auf 20 und derzeit hat er den Akku auch schon wieder bis 65% geladen. Er nutzt den Akku halt in Sleep1 halt nicht.
Den magischen Installateur Key habe ich leider nicht.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 26 November 2021, 12:41:05
Hallo Leute, ich habe es eingebaut. Funktioniert super. Danke dafür. Bin jetzt auf 'Ruhemodus 2'. Interessant ist auch dass 'Actual_Battery_charge_usable_P' auch auf 0 ist, was natürlich richtig ist, da im Ruhemodus kein Entladen möglich ist. Ich hatte gestern eine Ladung aus dem Netz, das kommt bestimmt wieder. Werde dann berichten ob alles korrekt angezeigt wird.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 November 2021, 12:54:57
Zitat von: ojb am 26 November 2021, 12:41:05
Hallo Leute, ich habe es eingebaut. Funktioniert super. Danke dafür. Bin jetzt auf 'Ruhemodus 2'. Interessant ist auch dass 'Actual_Battery_charge_usable_P' auch auf 0 ist, was natürlich richtig ist, da im Ruhemodus kein Entladen möglich ist. Ich hatte gestern eine Ladung aus dem Netz, das kommt bestimmt wieder. Werde dann berichten ob alles korrekt angezeigt wird.
Du solltest den MinSOC auf 20% stellen, das ist die Empfehlung von Kostal für den Winter.

Meine externe Speichersteuerung macht das anhand der Leistungsprognose automatisch.
Auch ein smart_Laden erfolgt über die Leistungsprognose und verhindert ein Entladen des Speichers im Winter, wenn zu wenig Leistung vom Dach kommt. Dadurch wird der Speicher dann ab und zu mal wieder auf 100% gefüllt, was für eine korrekte SOC Berechnung wichtig ist. So hast Du auch im Winter mal einen Vollzyklus des Speichers.

Das Actual_Battery_charge_usable_P ist ein von mir berechnetes userReadings. Schau mal ob bei Dir gerade Act_state_of_charge auf 0 steht, das würde die Berechnung dann auch auf 0 setzen.
Der Actual_Battery_charge_usable_P ist nur ein Schätzwert, wieviel man dem Speicher noch entnehmen kann und erleichtert etwas die Planung.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 26 November 2021, 13:44:02
Ich hab die Formel etwas abgeändert:
Actual_Battery_charge_usable_P:[Act_state_of_charge|Battery_MinSOC].* {my $x = (12800*(ReadingsVal($NAME,"Act_state_of_charge",0)-ReadingsVal($NAME,"Battery_MinSOC",0))/100);;;; ($x lt 0)? 0 : round($x,0) },
Und zwar hab ich die Kapa hardgecoded, weiß aber gar nicht mehr genau, warum.
Bei mir steht jetzt Battery_MinSOC = Act_state_of_charge, deshalb 0.
Scheinbar steuert Ruhemodus den Battery_MinSOC. Im Wechselrichter hab ich 10% angegeben.
Aber guter Hinweis, ich stelle mal auf 20%.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 November 2021, 14:01:21
Zitat von: ojb am 26 November 2021, 13:44:02
Ich hab die Formel etwas abgeändert:
Actual_Battery_charge_usable_P:[Act_state_of_charge|Battery_MinSOC].* {my $x = (12800*(ReadingsVal($NAME,"Act_state_of_charge",0)-ReadingsVal($NAME,"Battery_MinSOC",0))/100);;;; ($x lt 0)? 0 : round($x,0) },
Und zwar hab ich die Kapa hardgecoded, weiß aber gar nicht mehr genau, warum.
Bei mir steht jetzt Battery_MinSOC = Act_state_of_charge, deshalb 0.
Scheinbar steuert Ruhemodus den Battery_MinSOC. Im Wechselrichter hab ich 10% angegeben.
Aber guter Hinweis, ich stelle mal auf 20%.
Das mit der festn Kapazität hatte ich am Anfang drin, was dann aber durch die tatsächliche, als Variable, ausgetauscht wurde. Das dient der Portierbarkeit.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 27 November 2021, 09:35:35
Moin zusammen,
auch bei mir ist der Speicher jetzt mal in Ruhe1 gefallen. Ich schau mir dann mal an, wie lange das so bleibt.

EDIT:
Und schon ist wieder alles gut :-) Bei erreichen von 50% und mehr PV Leistung ging der Ruhe1 Modus wieder weg.
Somit ist mein Rückschluss, wenn wir Prognose bedingt das Entladen mit unserer smart_Laden Schaltung unterbinden werden wir weniger Ruhe1 Phasen haben,
da wir ja schon frühzeitig dem Speicher sagen, er solle nur noch laden.

Im Diagramm kann man sehr schön sehen, dass gegen 15:00 Uhr der Ruhe1 Modus beendet wurde.
Ab 11:40 wurde wohl bei 50% Act_state_of_charge wieder angezeigt.
               <<< Korrektur: in der DB ist Act_state_of_charge durchgängig zu sehen, dann muss wohl Battery_work_capacity auf 0 gewesen sein ???
Durch mein smart_Laden wurde jedoch erst noch weiter geladen, da das ja auch noch aktiv war.
Dann muss es gegen 14:58 Uhr noch eine Korrektur des SOC gegeben haben, da der dann auf 100% gesprungen ist. In der PV Leistung war kurz zuvor noch ein Peak nach oben.

Um 15:15 wurde dann die Heizung und das Pool heizen wieder ordentlich unterstützt, genau so liebe ich es :-)

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 27 November 2021, 16:16:50
Hm - meiner ist jetzt wieder bei 93% und immer noch Sleep1.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 27 November 2021, 16:25:31
Zitat von: papa am 27 November 2021, 16:16:50
Hm - meiner ist jetzt wieder bei 93% und immer noch Sleep1.
Das wird wohl mit der Menge der PV-Leistung zusammen hängen, ich hatte durch Sonnenschein gut eine Stunde lang bis zu 3500W als Ladeleistung in den Speicher.
Nach der Definition, die ich mal gelsen hatte geht der Speicher ja wenn es einige Zeit zuwenig Ladung gibt in den Ruhe1 Modus. Kostal schaut ja nur was gewesen ist.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Crawler am 30 November 2021, 22:29:42
hi,
Bei mir funktioniert die Verbrauch Übersicht nicht richtig.
habe den KSEM und den Speicher nicht über Lan eingebunden aber eigentlich liefert der Kostal ja auch die Daten über Netzbezug.
Werden die Daten vom WR nicht komplett abgerufen?
habe noch ein ir Kopf auf dem normalen Zähler über OBIS im FHEM (kleinen Tip vielleicht wie ich die Variablen in die Berechnung rein bekomme?)

Außerdem habe ich im Log
Zitat2021.11.28 23:58:00 2: WR_1_Speicher_1_ExternControl: {    CommandGet(undef, "WR_1_API 21_Battery_Information");    CommandGet(undef, "WR_1_API 22_Battery_InternControl");    CommandGet(undef, "WR_1_API 23_Battery_ExternControl");    CommandGet(undef, "WR_1_API 25_Battery_EM_State");    }: 25_Battery_EM_State requested, watch readings
2021.11.29 00:00:02 1: PERL WARNING: Argument "" isn't numeric in numeric lt (<) at (eval 952425) line 1, <GEN34> line 6585.
und
Zitat2021.11.30 22:09:50 3: WR_1_Speicher_1_ExternControl:Warning in DOIF_RegisterEvalAll:package ui_Table;::DOIF_Widget($hash,$reg,'WR_1_Speicher_1_ExternControl_uiTable_c_5_2_0_0',::DOIF_FUNC_WR_1_Speicher_1_ExternControl_Status(::ReadingValDoIf($hash,'WR_1','Solar_Calculation_fc1_day'),::ReadingValDoIf($hash,'WR_1_Speicher_1_ExternControl','SpeicherMaxSOC_fc1_Limit'),"red","<","","",::ReadingValDoIf($hash,'WR_1_Speicher_1_ExternControl','SpeicherMaxSOC_fc1_Limit')-1,"#00FF00",">="),"")
2021.11.30 22:09:50 1: PERL WARNING: Argument "" isn't numeric in numeric eq (==) at (eval 1181856) line 1.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Dezember 2021, 08:31:49
Zitat von: Crawler am 30 November 2021, 22:29:42
hi,
Bei mir funktioniert die Verbrauch Übersicht nicht richtig.
habe den KSEM und den Speicher nicht über Lan eingebunden aber eigentlich liefert der Kostal ja auch die Daten über Netzbezug.
Werden die Daten vom WR nicht komplett abgerufen?
habe noch ein ir Kopf auf dem normalen Zähler über OBIS im FHEM (kleinen Tip vielleicht wie ich die Variablen in die Berechnung rein bekomme?)
Hallo Crawler,
Vor einem 3/4 Jahr habe ich die Erweiterung zum Schwarm durchgeführt, was auch von einigen anderen benötigt wurde. Dabei werden für die Korrektur der Verbrauchsdaten auch Werte vom KSEM benötigt, was bei Dir jetzt durch die fehlende KSEM Anbindung nicht verfügbar ist. Der Beste Weg wäre den KSEM auch ins LAN zu bringen und mit einzubinden.
Durch ein Telefonat mit Kostal habe ich gestern auch noch erfahren, dass es eine größere Weiterentwicklung beim KSEM geben wird und dieser dann die zentrale lokale Visualisierung übernehmen soll. Wann das kommt wurde noch nicht verraten. Spätestend dann wäre es auch für Dich interessant den KSEM einzubinden.

Im KSEM wird der aktuelle Zähler für den Bezug und die Lieferung benötigt, die Du auch auf Deinen Lesekopf ummappen kannst.
WR_0_KSEM:Active_energy-
WR_0_KSEM:Active_energy+

Die readings mit SW_Meter_init_* werden täglich als initialwerte durch das PV_Schedule DOIF gesichert und dienen der Berechnung für die Statistik.

################################################################################################################
## 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
        }
     }
  }
)


Hier sind die userreadings, die die Tag/Monat/Jahr Werte korrigieren, die im Schwarm vom Plenticore falsch sind.

SW_Statistic_EnergyHomeFeedInGrid_Day:SW_Statistic_Yield_Day.* {   (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Day"  ,0)) * 1000 },
SW_Statistic_EnergyHomeFeedInGrid_Month:SW_Statistic_Yield_Month.* { (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Month",0)) * 1000 },
SW_Statistic_EnergyHomeFeedInGrid_Year:SW_Statistic_Yield_Year.* {  (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Year" ,0)) * 1000 },

SW_Statistic_EnergyHomeGrid_Day:SW_Statistic_Yield_Day.* {   (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Day"  ,0)) * 1000 },
SW_Statistic_EnergyHomeGrid_Month:SW_Statistic_Yield_Month.* { (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Month",0)) * 1000 },
SW_Statistic_EnergyHomeGrid_Year:SW_Statistic_Yield_Year.* {  (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Year" ,0)) * 1000 },

Ein anderer Weg wäre natürlich möglich, wenn Du das wieder zurück baust, jedoch müsstest Du das dann bei jedem Update wieder berücksichtigen.
Die Einspeisung wird vom Plenticore, wenn ich mich recht erinnere gar nicht als Statistik geliefert und müsste dann eh selber berechnet werden.
Also wie ober bereits erläutert wäre es das beste, wenn Du den KSEM anbindest. Es läuft ansonsten bald in das nächste Problem.
Der KSEM und der EVU Zähler laufen ziemlich synchron.


Zum uiTable:
Zitat
2021.11.30 22:09:50 3: WR_1_Speicher_1_ExternControl:Warning in DOIF_RegisterEvalAll:package ui_Table;::DOIF_Widget($hash,$reg,'WR_1_Speicher_1_ExternControl_uiTable_c_5_2_0_0',::DOIF_FUNC_WR_1_Speicher_1_ExternControl_Status(::ReadingValDoIf($hash,'WR_1','Solar_Calculation_fc1_day'),::ReadingValDoIf($hash,'WR_1_Speicher_1_ExternControl','SpeicherMaxSOC_fc1_Limit'),"red","<","","",::ReadingValDoIf($hash,'WR_1_Speicher_1_ExternControl','SpeicherMaxSOC_fc1_Limit')-1,"#00FF00",">="),"")
2021.11.30 22:09:50 1: PERL WARNING: Argument "" isn't numeric in numeric eq (==) at (eval 1181856) line 1.
Aklualisiere da bitte nochmal das uiTable im WR_1_Speicher_1_ExternControl, ich meine das auch schon mal gehabt zu haben.
Dann schau Dir bitte noch die readings an, ob die auch alle gesetzt sind und einen nummerischen Wert haben:
WR_1:Solar_Calculation_fc1_day
WR_1_Speicher_1_ExternControl:SpeicherMaxSOC_fc1_Limit


Log Meldungen CommandGet()
Die Meldungen habe ich leider auch noch im Log und habe noch keinen Weg gefunden sie weg zu bekommen. Die entstehen beim CommandGet() aufruf und der Übergabe des Get Befehls an FHEM.

2021.11.28 23:58:00 2: WR_1_Speicher_1_ExternControl: {    CommandGet(undef, "WR_1_API 21_Battery_Information");    CommandGet(undef, "WR_1_API 22_Battery_InternControl");    CommandGet(undef, "WR_1_API 23_Battery_ExternControl");    CommandGet(undef, "WR_1_API 25_Battery_EM_State");    }: 25_Battery_EM_State requested, watch readings



Bei dieser Meldung fehlen noch die Einträge davor, das gehört irgend wo anders dazu.

2021.11.29 00:00:02 1: PERL WARNING: Argument "" isn't numeric in numeric lt (<) at (eval 952425) line 1, <GEN34> line 6585.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Dezember 2021, 16:48:29
Hey Leute, es ist soweit, ich zitiere mich schon selber :-) Das ist fast wie wenze selbstgespräche führst :-)
Zitat von: ch.eick am 01 Dezember 2021, 08:31:49
Log Meldungen CommandGet()
Die Meldungen habe ich leider auch noch im Log und habe noch keinen Weg gefunden sie weg zu bekommen. Die entstehen beim CommandGet() aufruf und der Übergabe des Get Befehls an FHEM.

2021.11.28 23:58:00 2: WR_1_Speicher_1_ExternControl: {    CommandGet(undef, "WR_1_API 21_Battery_Information");    CommandGet(undef, "WR_1_API 22_Battery_InternControl");    CommandGet(undef, "WR_1_API 23_Battery_ExternControl");    CommandGet(undef, "WR_1_API 25_Battery_EM_State");    }: 25_Battery_EM_State requested, watch readings

Also, zu dieser Meldung habe ich mich jetzt doch erinnert.
Der letzte Aufruf vom CommandGet() gibt den Return Code "25_Battery_EM_State requested, watch readings" raus. Die anderen davor warscheinlich auch, die werden aber wohl von dem nächsten wieder überlagert, da es ja zu dem Perl Aufruf nur einen Return Code am Ende gibt.

Um das nun weg zu bekommen habe ich dahinter noch eine Log Ausgabe, aber direkt auf Log Level 4 , gesetzt.
Bei mir steht WR_1_Speicher_1_ExternControl auf verbose 3 , damit ich die Meldungen sehe um Fehler zu finden.

WR_1_Speicher_1_ExternControl

################################################################################################################
## 1 Speicher Status vom WR_1_Speicher_1 aktualisieren.
##   Dies geschieht über das WR_1_API Device, da der Speicher direkt am Wechselrichter angeschlossen ist.
##
([:58])
  {
   CommandGet(undef, "WR_1_API 21_Battery_Information");
   CommandGet(undef, "WR_1_API 22_Battery_InternControl");
   CommandGet(undef, "WR_1_API 23_Battery_ExternControl");
   CommandGet(undef, "WR_1_API 25_Battery_EM_State");
   if (AttrVal("$SELF","verbose",0) >=4)
       {Log 3, "$SELF cmd_1  : Speicher Status abfrage"};
  }


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 15 Dezember 2021, 11:30:40
Hi zusammen,

ich habe folgendes Problem:

Ich wollte den Kostal, wie im Wiki beschrieben ist, einbinden. Beim Device defmod WR_1 ModbusAttr 71 60 192.168.1.50:1502 TCP habe ich das Problem, dass anscheinend im stateFormat ein Fehler zu sein. Lasse ich den Eintrag sateFormat weg, bekomme ich eine restlichen Werte ausgelesen.

Wenn ich den stateFormat eintrage und auf OK klicke, bekomme ich folgende Fehlermeldung:
"syntax error at (eval 94) line 53, near "userReadings Total_PV_P_reserve:"
syntax error at (eval 94) line 53, near "0 : round($reserve,0)  "
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 55.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 55.
syntax error at (eval 94) line 57, near ") : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) "
syntax error at (eval 94) line 59, near "0 : round($x,0) "
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 61.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 63.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 63.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 64.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 67.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 69.
syntax error at (eval 94) line 71, near "0 : round($reserve,0)  "
(eval 94) has too many errors.
"

hat jemand eine Idee, woran das liegen kann?

LG
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Dezember 2021, 12:40:24
Zitat von: kaiman am 15 Dezember 2021, 11:30:40
ich habe folgendes Problem:

Ich wollte den Kostal, wie im Wiki beschrieben ist, einbinden. Beim Device defmod WR_1_API HTTPMOD http://%IP-WR%/api/v1/auth/me 0 habe ich das Problem, dass anscheinend im stateFormat ein Fehler zu sein. Lasse ich den Eintrag stateFormat weg, bekomme ich eine restlichen Werte ausgelesen.

Wenn ich den stateFormat eintrage und auf OK klicke, bekomme ich folgende Fehlermeldung:
"syntax error at (eval 94) line 53, near "userReadings Total_PV_P_reserve:"
syntax error at (eval 94) line 53, near "0 : round($reserve,0)  "
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 55.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 55.
syntax error at (eval 94) line 57, near ") : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) "
syntax error at (eval 94) line 59, near "0 : round($x,0) "
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 61.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 63.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 63.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 64.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 67.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 94) line 69.
syntax error at (eval 94) line 71, near "0 : round($reserve,0)  "
(eval 94) has too many errors.

Hallo Kaiman,

Das userReadings Total_PV_P_reserve ist im Device WR_1 bitte schau Dir das nochmal genauer an.

Zuerst sollte WR_1 und WR_0_KSEM korrekte Werte liefern. Danach kommen dann die Statistiken mit dem WR_1_API .

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 15 Dezember 2021, 13:01:57
Zitat von: ch.eick am 15 Dezember 2021, 12:40:24
Hallo Kaiman,

Das userReadings Total_PV_P_reserve ist im Device WR_1 bitte schau Dir das nochmal genauer an.

Zuerst sollte WR_1 und WR_0_KSEM korrekte Werte liefern. Danach kommen dann die Statistiken mit dem WR_1_API .

VG
   Christian

Danke für den Input. Ich habe gerade gesehen, dass ich das falsche Device gepostet hatte. Es ist im defmod WR_1 ModbusAttr 71 60 192.168.1.50:1502 TCP.

hab den Fehler gefunden, anscheinend hab ich beim kopieren einen Fehler gemacht ;(
Bekomme die Daten jetzt angezeigt.

Was mir noch aufgefallen ist: der WR_0_KSEM steht immer aus disconnected, obwohl die IP stimmt ...

defmod WR_0_KSEM ModbusAttr 1 60 192.168.1.51:502 TCP
attr WR_0_KSEM alias WR_0_KSEM
attr WR_0_KSEM comment Version 2020.10.19 18:28\
Der KSEM ermittelt nicht alle Werte, welche in der SunSpec spezifiziert sind.\
Alle nicht unterstützen Werte sind mit 0x8000 gekennzeichnet.\
Für die nicht unterstützten Zählerstände wird die 0x800000000 ausgegeben.\
\
Der Summenstrom M_AC_Current (sum of active phases) kann aber durch den Endanwender selber\
berechnet werden aus der Summe der Einzelwerte (Phase A AC current, Phase B AC current Phase C AC current)\
\
Die einzelnen Spannungen zwischen den Phasen können nicht gemessen werden und werden deshalb nicht ausgegeben.
attr WR_0_KSEM dev-h-defPoll 1
attr WR_0_KSEM dev-type-INT16-len 1
attr WR_0_KSEM dev-type-INT16-unpack s>
attr WR_0_KSEM dev-type-INT16_Current-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_Current_SF",0))
attr WR_0_KSEM dev-type-INT16_Current-format %.2f
attr WR_0_KSEM dev-type-INT16_Current-len 1
attr WR_0_KSEM dev-type-INT16_Current-unpack s>
attr WR_0_KSEM dev-type-INT16_Freq-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_Freq_SF",0))
attr WR_0_KSEM dev-type-INT16_Freq-format %.2f
attr WR_0_KSEM dev-type-INT16_Freq-len 1
attr WR_0_KSEM dev-type-INT16_Freq-unpack s>
attr WR_0_KSEM dev-type-INT16_PF-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_PF_SF",0))
attr WR_0_KSEM dev-type-INT16_PF-format %.2f
attr WR_0_KSEM dev-type-INT16_PF-len 1
attr WR_0_KSEM dev-type-INT16_PF-unpack s>
attr WR_0_KSEM dev-type-INT16_Power-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_Power_SF",0))
attr WR_0_KSEM dev-type-INT16_Power-format %.2f
attr WR_0_KSEM dev-type-INT16_Power-len 1
attr WR_0_KSEM dev-type-INT16_Power-unpack s>
attr WR_0_KSEM dev-type-INT16_VA-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_VA_SF",0))
attr WR_0_KSEM dev-type-INT16_VA-format %.2f
attr WR_0_KSEM dev-type-INT16_VA-len 1
attr WR_0_KSEM dev-type-INT16_VA-unpack s>
attr WR_0_KSEM dev-type-INT16_VAR-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_VAR_SF",0))
attr WR_0_KSEM dev-type-INT16_VAR-format %.2f
attr WR_0_KSEM dev-type-INT16_VAR-len 1
attr WR_0_KSEM dev-type-INT16_VAR-unpack s>
attr WR_0_KSEM dev-type-INT16_Voltage-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_Voltage_SF",0))
attr WR_0_KSEM dev-type-INT16_Voltage-format %.2f
attr WR_0_KSEM dev-type-INT16_Voltage-len 1
attr WR_0_KSEM dev-type-INT16_Voltage-unpack s>
attr WR_0_KSEM dev-type-STR32-expr $val =~ s/[\00]+//gr
attr WR_0_KSEM dev-type-STR32-format %s
attr WR_0_KSEM dev-type-STR32-len 16
attr WR_0_KSEM dev-type-STR32-unpack a*
attr WR_0_KSEM dev-type-UINT16-format %s
attr WR_0_KSEM dev-type-UINT16-len 1
attr WR_0_KSEM dev-type-UINT32-format %s
attr WR_0_KSEM dev-type-UINT32-len 2
attr WR_0_KSEM dev-type-UINT64-expr $val/10000
attr WR_0_KSEM dev-type-UINT64-format %s
attr WR_0_KSEM dev-type-UINT64-len 4
attr WR_0_KSEM dev-type-UINT64-unpack Q>
attr WR_0_KSEM disable 0
attr WR_0_KSEM group PV Eigenverbrauch
attr WR_0_KSEM obj-h40072-reading M_AC_Current_A
attr WR_0_KSEM obj-h40072-type INT16_Current
attr WR_0_KSEM obj-h40073-reading M_AC_Current_B
attr WR_0_KSEM obj-h40073-type INT16_Current
attr WR_0_KSEM obj-h40074-reading M_AC_Current_C
attr WR_0_KSEM obj-h40074-type INT16_Current
attr WR_0_KSEM obj-h40075-reading M_AC_Current_SF
attr WR_0_KSEM obj-h40075-type INT16
attr WR_0_KSEM obj-h40077-reading M_AC_Voltage_AN
attr WR_0_KSEM obj-h40077-type INT16_Voltage
attr WR_0_KSEM obj-h40078-reading M_AC_Voltage_BN
attr WR_0_KSEM obj-h40078-type INT16_Voltage
attr WR_0_KSEM obj-h40079-reading M_AC_Voltage_CN
attr WR_0_KSEM obj-h40079-type INT16_Voltage
attr WR_0_KSEM obj-h40084-reading M_AC_Voltage_SF
attr WR_0_KSEM obj-h40084-type INT16
attr WR_0_KSEM obj-h40085-reading M_AC_Freq
attr WR_0_KSEM obj-h40085-type INT16_Freq
attr WR_0_KSEM obj-h40086-reading M_AC_Freq_SF
attr WR_0_KSEM obj-h40086-type INT16
attr WR_0_KSEM obj-h40087-reading M_AC_Power
attr WR_0_KSEM obj-h40087-type INT16_Power
attr WR_0_KSEM obj-h40088-reading M_AC_Power_A
attr WR_0_KSEM obj-h40088-type INT16_Power
attr WR_0_KSEM obj-h40089-reading M_AC_Power_B
attr WR_0_KSEM obj-h40089-type INT16_Power
attr WR_0_KSEM obj-h40090-reading M_AC_Power_C
attr WR_0_KSEM obj-h40090-type INT16_Power
attr WR_0_KSEM obj-h40091-reading M_AC_Power_SF
attr WR_0_KSEM obj-h40091-type INT16
attr WR_0_KSEM obj-h40092-reading M_AC_VA
attr WR_0_KSEM obj-h40092-type INT16_VA
attr WR_0_KSEM obj-h40093-reading M_AC_VA_A
attr WR_0_KSEM obj-h40093-type INT16_VA
attr WR_0_KSEM obj-h40094-reading M_AC_VA_B
attr WR_0_KSEM obj-h40094-type INT16_VA
attr WR_0_KSEM obj-h40095-reading M_AC_VA_C
attr WR_0_KSEM obj-h40095-type INT16_VA
attr WR_0_KSEM obj-h40096-reading M_AC_VA_SF
attr WR_0_KSEM obj-h40096-type INT16
attr WR_0_KSEM obj-h40097-reading M_AC_VAR
attr WR_0_KSEM obj-h40097-type INT16_VAR
attr WR_0_KSEM obj-h40098-reading M_AC_VAR_A
attr WR_0_KSEM obj-h40098-type INT16_VAR
attr WR_0_KSEM obj-h40099-reading M_AC_VAR_B
attr WR_0_KSEM obj-h40099-type INT16_VAR
attr WR_0_KSEM obj-h40100-reading M_AC_VAR_C
attr WR_0_KSEM obj-h40100-type INT16_VAR
attr WR_0_KSEM obj-h40101-reading M_AC_VAR_SF
attr WR_0_KSEM obj-h40101-type INT16
attr WR_0_KSEM obj-h40102-reading M_AC_PF
attr WR_0_KSEM obj-h40102-type INT16_PF
attr WR_0_KSEM obj-h40103-reading M_AC_PF_A
attr WR_0_KSEM obj-h40103-type INT16_PF
attr WR_0_KSEM obj-h40104-reading M_AC_PF_B
attr WR_0_KSEM obj-h40104-type INT16_PF
attr WR_0_KSEM obj-h40105-reading M_AC_PF_C
attr WR_0_KSEM obj-h40105-type INT16_PF
attr WR_0_KSEM obj-h40106-reading M_AC_PF_SF
attr WR_0_KSEM obj-h40106-type INT16
attr WR_0_KSEM obj-h40108-reading M_Exported
attr WR_0_KSEM obj-h40108-type UINT32
attr WR_0_KSEM obj-h40110-reading M_Exported_A
attr WR_0_KSEM obj-h40110-type UINT32
attr WR_0_KSEM obj-h40112-reading M_Exported_B
attr WR_0_KSEM obj-h40112-type UINT32
attr WR_0_KSEM obj-h40114-reading M_Exported_C
attr WR_0_KSEM obj-h40114-type UINT32
attr WR_0_KSEM obj-h40116-reading M_Imported
attr WR_0_KSEM obj-h40116-type UINT32
attr WR_0_KSEM obj-h40118-reading M_Imported_A
attr WR_0_KSEM obj-h40118-type UINT32
attr WR_0_KSEM obj-h40120-reading M_Imported_B
attr WR_0_KSEM obj-h40120-type UINT32
attr WR_0_KSEM obj-h40122-reading M_Imported_C
attr WR_0_KSEM obj-h40122-type UINT32
attr WR_0_KSEM obj-h40125-reading M_Exported_VA
attr WR_0_KSEM obj-h40125-type UINT32
attr WR_0_KSEM obj-h40127-reading M_Exported_VA_A
attr WR_0_KSEM obj-h40127-type UINT32
attr WR_0_KSEM obj-h40129-reading M_Exported_VA_B
attr WR_0_KSEM obj-h40129-type UINT32
attr WR_0_KSEM obj-h40131-reading M_Exported_VA_C
attr WR_0_KSEM obj-h40131-type UINT32
attr WR_0_KSEM obj-h40133-reading M_Imported_VA
attr WR_0_KSEM obj-h40133-type UINT32
attr WR_0_KSEM obj-h40135-reading M_Imported_VA_A
attr WR_0_KSEM obj-h40135-type UINT32
attr WR_0_KSEM obj-h40137-reading M_Imported_VA_B
attr WR_0_KSEM obj-h40137-type UINT32
attr WR_0_KSEM obj-h40139-reading M_Imported_VA_C
attr WR_0_KSEM obj-h40139-type UINT32
attr WR_0_KSEM obj-h512-reading Active_energy+
attr WR_0_KSEM obj-h512-type UINT64
attr WR_0_KSEM obj-h516-reading Active_energy-
attr WR_0_KSEM obj-h516-type UINT64
attr WR_0_KSEM obj-h8192-reading ManufacturerID
attr WR_0_KSEM obj-h8192-type UINT16
attr WR_0_KSEM obj-h8193-reading ProductID
attr WR_0_KSEM obj-h8193-type UINT16
attr WR_0_KSEM obj-h8194-reading ProductVersion
attr WR_0_KSEM obj-h8194-type UINT16
attr WR_0_KSEM obj-h8195-reading FirmwareVersion
attr WR_0_KSEM obj-h8195-type UINT16
attr WR_0_KSEM obj-h8196-reading VendorName
attr WR_0_KSEM obj-h8196-type STR32
attr WR_0_KSEM obj-h8212-reading Productname
attr WR_0_KSEM obj-h8212-type STR32
attr WR_0_KSEM obj-h8228-reading SerialNumber
attr WR_0_KSEM obj-h8228-type STR32
attr WR_0_KSEM obj-h8244-reading MeasuringInterval
attr WR_0_KSEM obj-h8244-type UINT16
attr WR_0_KSEM room Photovoltaik
attr WR_0_KSEM userReadings M_AC_Current:M_AC_Current_.* { ReadingsVal($NAME,"M_AC_Current_A",0) + ReadingsVal($NAME,"M_AC_Current_B",0) + ReadingsVal($NAME,"M_AC_Current_C",0) }
attr WR_0_KSEM verbose 4

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Dezember 2021, 14:25:30
Zitat von: kaiman am 15 Dezember 2021, 13:01:57
Danke für den Input. Ich habe gerade gesehen, dass ich das falsche Device gepostet hatte. Es ist im defmod WR_1 ModbusAttr 71 60 192.168.1.50:1502 TCP.

hier mal die raw definition

defmod WR_1 ModbusAttr 71 60 192.168.1.50:1502 TCP
<..>

Ich kann dort die userReadings Definition nirgends sehen???

Zitat
Was mir noch aufgefallen ist: der WR_0_KSEM steht immer aus disconnected, obwohl die IP stimmt ...
Dann schau mal ob Du im KSEM auch die ModBus Schnittstelle aktiviert hast :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 15 Dezember 2021, 14:35:36
Habe gerade gesehen, bei kopieren, scheint da einiges kaput gegangen zu sein ...

geht jetzt ...


DANKE für die schnelle Hilfe!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Dezember 2021, 14:49:37
Zitat von: kaiman am 15 Dezember 2021, 14:35:36
Habe gerade gesehen, bei kopieren, scheint da einiges kaput gegangen zu sein ...

geht jetzt ...
Dann kommen jetzt die Statistiken mit dem WR_1_API...
Das Finanzamt und der Netzbetreiber möchten ja auch bald Daten haben.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 24 Dezember 2021, 13:35:12
Hallo Leute und frohe Weihnachten euch allen!

Wie soll ich es sagen, ich habe schon eine ordentliche Konfig im Fhem und mit dem einen und anderen ein mine Problmchen gehabt... ABER noch nie so viele wie mit diesem Ding!

Sorry, entwerde bin ich einfach zu blöd oder es ist einfach zu umständlich beschrieben.

Meine Hardware:
Ein Wechselrichter (Kostal Plenticore 10 Plus)(IP:192.168.1.37) eine Batterie BYD(Keine IP) an einem Eingang ein KSEM(IP:192.168.1.41) und die Module die an den letzten beiden Eingängen am Wechselrichter angebunden sind.
Meine Batterie finde ich leider nicht im Netzwerk, ist irgendwie anders verbunden mit dem Wechselrichter.
Im KSEM Webinterface ist kein Wechselrichter eingerichtet, warum auch immer, hat die Firma so eingestellt. Und auch in den MODBUS einstellungen sind nur die RS485 Schnittstellen eingerichtet, die TCP Einstellungen sind Leer

Mein Wunsch: Eine einfache Anzeige später im FTUI über den aktuellen Ladezustand der Batterie sehen, den Status ob sie gerade geladen oder entladen wird, was gerade auf dem Dach erzeugt wird und was die Hütte momentan verbraucht.

Mein Problem:
Ich bekomme es nicht gebacken...

Mit
define WP ModbusAttr 71 60 192.168.1.37:1502 TCP
bekommen ich schon mal meinen WR_1 mit dem Status "opened"

Hier ein List:
Internals:
   CFGFN     
   DEF        71 60 192.168.1.37:1502 TCP
   DeviceName 192.168.1.37:1502
   EXPECT     idle
   FD         47
   FUUID      61c4c04d-f33f-e7ed-2f20-99f2e7ced92c7402
   IODev      WR_1
   Interval   60
   LASTOPEN   1640344432.00982
   MODBUSID   71
   MODE       master
   MODULEVERSION Modbus 4.4.02 - 31.3.2021
   NAME       WR_1
   NOTIFYDEV  global
   NR         569837
   NTFY_ORDER 50-WR_1
   PARTIAL   
   PROTOCOL   TCP
   STATE      opened
   TCPConn    1
   TYPE       ModbusAttr
   devioLoglevel 3
   nextOpenDelay 60
   READ:
   READINGS:
     2021-12-24 12:13:52   state           opened
   defptr:
     WR_1       71
Attributes:
   userattr   obj-h208-format obj-h512-len obj-h515-len


Un danach stehe ich wie ein Elch vorm Wald...

Ich habe keinen Plan was ich noch alles brauche oder welche RAW definition ich nehmen soll..
Die Anleitung beschreibt wirklich sehr viel und ausfürlich, aber ich bekomme es einfach nicht hin...

wenn ich mit dem RAW editor diese RAW definition erstellen möchte :

defmod WR_1 ModbusAttr 71 60 192.168.1.37:1502 TCP
attr WR_1 userattr obj-h208-format obj-h512-len obj-h515-len
attr WR_1 DbLogExclude .*
attr WR_1 DbLogInclude Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Battery_MaxChargePowerLimitAbs,Battery_.*SOC,P_DC1,P_DC2,Total_DC_PV_Energy_sumOfAllPVInputs,Total_Active_P_EM,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*,P_limit_from_EVU.*
attr WR_1 alias WR_1
attr WR_1 alignTime 00:00
attr WR_1 comment Version 2021.06.02 14:00\
Kostal Plenticore 10 Plus mit BYD Speicher
attr WR_1 dev-h-combine 8
attr WR_1 dev-h-defFormat %.2f
attr WR_1 dev-h-defLen 2
attr WR_1 dev-h-defPoll 1
attr WR_1 dev-h-defRevRegs 1
attr WR_1 dev-h-defUnpack f>
attr WR_1 dev-type-STR-format %s
attr WR_1 dev-type-STR-len 8
attr WR_1 dev-type-STR-revRegs 0
attr WR_1 dev-type-STR-unpack a*
attr WR_1 disable 0
attr WR_1 event-on-change-reading Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_I,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Battery_MaxChargePowerLimitAbs,Battery_.*SOC,Home_own_consumption.*,P_DC1,P_DC2,Total_DC_P.*,Total_DC_PV_Energy.*,Total_PV_P_reserve,Solar_.*,Total_.*,SW_.*,.*_yield,Inverter_state.*,Inverter_Generation_P_Actual.*,P_limit_from_EVU.*,Solar_Calculation_fc.*_day
attr WR_1 group PV Eigenverbrauch
attr WR_1 icon sani_solar
attr WR_1 obj-h100-reading Total_DC_P
attr WR_1 obj-h1024-len 1
attr WR_1 obj-h1024-reading Battery_Charge_AC_P_Setpoint
attr WR_1 obj-h1024-set 1
attr WR_1 obj-h1025-len 1
attr WR_1 obj-h1025-reading Battery_P_ScaleFactor
attr WR_1 obj-h1026-reading Battery_Charge_AC_P_SetpointAbs
attr WR_1 obj-h1026-set 1
attr WR_1 obj-h1028-reading Battery_Charge_DC_I_SetpointRel
attr WR_1 obj-h1028-set 1
attr WR_1 obj-h1030-reading Battery_Charge_AC_P_SetpointRel
attr WR_1 obj-h1030-set 1
attr WR_1 obj-h1032-reading Battery_Charge_DC_I_SetpointAbs
attr WR_1 obj-h1032-set 1
attr WR_1 obj-h1034-reading Battery_Charge_DC_P_SetpointAbs
attr WR_1 obj-h1034-set 1
attr WR_1 obj-h1036-reading Battery_Charge_DC_P_SetpointRel
attr WR_1 obj-h1036-set 1
attr WR_1 obj-h1038-reading Battery_MaxChargePowerLimitAbs
attr WR_1 obj-h1038-set 1
attr WR_1 obj-h104-format %s
attr WR_1 obj-h104-map 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz
attr WR_1 obj-h104-reading State_of_EM
attr WR_1 obj-h104-revRegs 0
attr WR_1 obj-h104-unpack N
attr WR_1 obj-h1040-reading Battery_MaxDischargePowerLimitAbs
attr WR_1 obj-h1040-set 1
attr WR_1 obj-h1042-reading Battery_MinSOC
attr WR_1 obj-h1042-set 1
attr WR_1 obj-h1044-reading Battery_MaxSOC
attr WR_1 obj-h1044-set 1
attr WR_1 obj-h1046-reading Battery_Total_DC_ChargeEnergy_DCsideToBattery
attr WR_1 obj-h1048-reading Battery_Total_DC_DischargeEnergy_DCsideFromBattery
attr WR_1 obj-h1050-reading Battery_Total_AC_ChargeEnergy_ACsideToBattery
attr WR_1 obj-h1052-reading Battery_Total_AC_DischargeEnergy_BatteryToGrid
attr WR_1 obj-h1054-reading Battery_Total_AC_ChargeEnergy_gridToBattery
attr WR_1 obj-h1056-reading Total_DC_PV_Energy_sumOfAllPVInputs
attr WR_1 obj-h1058-reading Total_DC_Energy_From_PV1
attr WR_1 obj-h106-reading Home_own_consumption_from_Battery
attr WR_1 obj-h1060-reading Total_DC_Energy_From_PV2
attr WR_1 obj-h1062-reading Total_DC_Energy_From_PV3
attr WR_1 obj-h1064-reading Total_AC_Energy_ACsideToGrid
attr WR_1 obj-h1066-reading Total_DC_P_sumOfAllPVInputs
attr WR_1 obj-h1068-reading Battery_work_capacity
attr WR_1 obj-h1070-reading Battery_serial_number
attr WR_1 obj-h1072-reading Battery_Reserved_1072
attr WR_1 obj-h1074-reading Battery_Reserved_1074
attr WR_1 obj-h1076-reading Battery_Maximum_ChargePLimit_read-outFromBattery
attr WR_1 obj-h1078-reading Battery_Maximum_DischargePLimit_read-outFromBattery
attr WR_1 obj-h108-reading Home_own_consumption_from_grid
attr WR_1 obj-h1080-reading Battery_management_mode
attr WR_1 obj-h1080-set 1
attr WR_1 obj-h1081-reading Battery_Reserved_1081
attr WR_1 obj-h1082-reading Installed_sensor_type
attr WR_1 obj-h110-reading Total_home_consumption_Battery
attr WR_1 obj-h112-reading Total_home_consumption_Grid
attr WR_1 obj-h114-reading Total_home_consumption_PV
attr WR_1 obj-h116-reading Home_own_consumption_from_PV
attr WR_1 obj-h118-reading Total_home_consumption
attr WR_1 obj-h120-reading Isolation_resistance
attr WR_1 obj-h122-reading P_limit_from_EVU
attr WR_1 obj-h124-reading Total_home_consumption_rate
attr WR_1 obj-h14-reading Inverter_serial_number
attr WR_1 obj-h14-type STR
attr WR_1 obj-h144-reading Worktime
attr WR_1 obj-h150-reading Actual_cos_phi
attr WR_1 obj-h152-reading Grid_frequency
attr WR_1 obj-h154-reading I_L1
attr WR_1 obj-h156-reading Active_P_L1
attr WR_1 obj-h158-reading U_L1
attr WR_1 obj-h160-reading I_L2
attr WR_1 obj-h162-reading Active_P_L2
attr WR_1 obj-h164-reading U_L2
attr WR_1 obj-h166-reading I_L3
attr WR_1 obj-h168-reading Active_P_L3
attr WR_1 obj-h170-reading U_L3
attr WR_1 obj-h172-reading Total_AC_Active_P
attr WR_1 obj-h174-reading Total_AC_Reactive_P
attr WR_1 obj-h178-reading Total_AC_Apparent_P
attr WR_1 obj-h190-reading Battery_charge_current
attr WR_1 obj-h194-format %.0f
attr WR_1 obj-h194-reading Number_of_Battery_cycles
attr WR_1 obj-h200-reading Actual_Battery_charge_-minus_or_discharge_-plus_I
attr WR_1 obj-h202-reading PSSB_fuse_state
attr WR_1 obj-h208-reading Battery_ready_flag
attr WR_1 obj-h210-reading Act_state_of_charge
attr WR_1 obj-h212-reading Battery_state
attr WR_1 obj-h214-reading Battery_temperature
attr WR_1 obj-h216-reading Battery_voltage
attr WR_1 obj-h218-reading Cos_phi_EM
attr WR_1 obj-h220-reading Frequency_EM
attr WR_1 obj-h222-reading I_L1_EM
attr WR_1 obj-h224-reading Active_P_L1_EM
attr WR_1 obj-h226-reading Reactive_P_L1_EM
attr WR_1 obj-h228-reading Apparent_P_L1_EM
attr WR_1 obj-h230-reading U_L1_EM
attr WR_1 obj-h232-reading I_L2_EM
attr WR_1 obj-h234-reading Active_P_L2_EM
attr WR_1 obj-h236-reading Reactive_P_L2_EM
attr WR_1 obj-h238-reading Apparent_P_L2_EM
attr WR_1 obj-h240-reading U_L2_EM
attr WR_1 obj-h242-reading I_L3_EM
attr WR_1 obj-h244-reading Active_P_L3_EM
attr WR_1 obj-h246-reading Reactive_P_L3_EM
attr WR_1 obj-h248-reading Apparent_P_L3_EM
attr WR_1 obj-h250-reading U_L3_EM
attr WR_1 obj-h252-reading Total_Active_P_EM
attr WR_1 obj-h254-reading Total_Reactive_P_EM
attr WR_1 obj-h256-reading Total_Apparent_P_EM
attr WR_1 obj-h258-reading I_DC1
attr WR_1 obj-h260-reading P_DC1
attr WR_1 obj-h266-reading U_DC1
attr WR_1 obj-h268-reading I_DC2
attr WR_1 obj-h270-reading P_DC2
attr WR_1 obj-h276-reading U_DC2
attr WR_1 obj-h278-reading I_DC3
attr WR_1 obj-h280-reading P_DC3
attr WR_1 obj-h286-reading U_DC3
attr WR_1 obj-h320-reading Total_yield
attr WR_1 obj-h322-reading Daily_yield
attr WR_1 obj-h324-reading Yearly_yield
attr WR_1 obj-h326-reading Monthly_yield
attr WR_1 obj-h38-reading Software-Version_Maincontroller_MC
attr WR_1 obj-h38-type STR
attr WR_1 obj-h384-len 16
attr WR_1 obj-h384-reading Inverter_network_name
attr WR_1 obj-h384-type STR
attr WR_1 obj-h420-reading IP-address
attr WR_1 obj-h420-type STR
attr WR_1 obj-h428-reading IP-subnetmask
attr WR_1 obj-h428-type STR
attr WR_1 obj-h436-reading IP-gateway
attr WR_1 obj-h436-type STR
attr WR_1 obj-h446-reading IP-DNS1
attr WR_1 obj-h446-type STR
attr WR_1 obj-h454-reading IP-DNS2
attr WR_1 obj-h454-type STR
attr WR_1 obj-h46-reading Software-Version_IO-Controller_IOC
attr WR_1 obj-h46-type STR
attr WR_1 obj-h512-format %s
attr WR_1 obj-h512-reading Battery_gross_capacity
attr WR_1 obj-h512-unpack N
attr WR_1 obj-h514-len 1
attr WR_1 obj-h514-reading Battery_Actual_SOC
attr WR_1 obj-h515-format %s
attr WR_1 obj-h515-reading Battery_Maincontroller_MC
attr WR_1 obj-h515-unpack N
attr WR_1 obj-h517-reading Battery_Manufacturer
attr WR_1 obj-h517-type STR
attr WR_1 obj-h525-format %s
attr WR_1 obj-h525-reading Battery_Model_ID
attr WR_1 obj-h525-unpack N
attr WR_1 obj-h527-format %s
attr WR_1 obj-h527-reading Battery_Serial_Number
attr WR_1 obj-h527-unpack N
attr WR_1 obj-h529-len 4
attr WR_1 obj-h529-reading Work_Capacity
attr WR_1 obj-h529-unpack N
attr WR_1 obj-h531-format %.0f
attr WR_1 obj-h531-reading Inverter_Max_P
attr WR_1 obj-h531-unpack N
attr WR_1 obj-h56-format %.0f
attr WR_1 obj-h56-reading Inverter_state
attr WR_1 obj-h56-unpack N
attr WR_1 obj-h575-reading Inverter_Generation_P_Actual
attr WR_1 obj-h575-unpack N
attr WR_1 obj-h577-reading Generation_Energy
attr WR_1 obj-h577-unpack N
attr WR_1 obj-h578-reading Total_energy
attr WR_1 obj-h582-reading Actual_Battery_charge-discharge_P
attr WR_1 obj-h586-format %s
attr WR_1 obj-h586-reading Battery_Firmware
attr WR_1 obj-h586-unpack N
attr WR_1 obj-h6-reading Inverter_Article_number
attr WR_1 obj-h6-type STR
attr WR_1 obj-h768-len 32
attr WR_1 obj-h768-reading Productname
attr WR_1 obj-h768-type STR
attr WR_1 obj-h800-len 32
attr WR_1 obj-h800-reading Power_class
attr WR_1 obj-h800-type STR
attr WR_1 room Strom->Photovoltaik
attr WR_1 sortby 111
attr WR_1 stateFormat {\
my $DUMMY  = "";;\
\
my $Power          = ReadingsVal($name,"Actual_Battery_charge_-minus_or_discharge_-plus_P",0);;\
my $StatusSpeicher = ($Power < -10) ? "<span style='color:#00FF00'>Laden</span>" : ($Power > 15)?  "<span style='color:#FF0000'>Entladen</span>"  : "<span style='color:orange'>Standby</span>";;\
    $StatusSpeicher = $StatusSpeicher."<br>".ReadingsVal($name,"State_of_EM","n/a");;\
    $Power          = $Power." W";;\
\
\
my $Battery_temperature                  = sprintf("%.1f °C",ReadingsVal($name,"Battery_temperature",0));;\
my $Actual_Battery_charge_usable_P       = sprintf("%d W",ReadingsVal($name,"Actual_Battery_charge_usable_P",0));;\
         \
my $Act_state_of_charge                  = sprintf("%d %%",ReadingsVal($name,"Act_state_of_charge","0"));;\
my $SW_Total_DC_P_sumOfAllPVInputs       = sprintf("%d W",ReadingsVal($name,"SW_Total_DC_P_sumOfAllPVInputs","0"));;\
my $SW_Total_PV_P_reserve                = sprintf("%d W",ReadingsVal($name,"SW_Total_PV_P_reserve","0"));;\
\
my $SW_Home_own_consumption_from_PV      = sprintf("%d",ReadingsVal($name,"SW_Home_own_consumption_from_PV",0));;\
    $SW_Home_own_consumption_from_PV = ($SW_Home_own_consumption_from_PV >= 0) ? $SW_Home_own_consumption_from_PV." W" : "0 W";;\
my $SW_Home_own_consumption_from_Battery = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_Battery",0));;\
my $SW_Home_own_consumption_from_grid    = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_grid",0));;\
my $SW_Home_own_consumption              = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption",0));;\
\
my $Total_Active_P_EM  = sprintf("%d",ReadingsVal($name,"Total_Active_P_EM",0));;\
my $StatusNetz         = ($Total_Active_P_EM < -10) ? "<span style='color:#00FF00'>Einspeisen</span>" : ($Total_Active_P_EM > 15)?  "<span style='color:#FF0000'>Netzbezug</span>"  : "<span style='color:orange'>Standby</span>";;\
    $Total_Active_P_EM  = $Total_Active_P_EM." W";;\
\
my $SW_Yield_Daily   = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Daily",0)/1000 ,0));;\
my $SW_Yield_Monthly = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Monthly",0)/1000 ,0));;\
my $SW_Yield_Yearly  = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Yearly",0)/1000 ,0));;\
my $SW_Yield_Total   = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Total",0)/1000 ,0));;\
\
my $Solar_Calculation_fc0_4h   = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_4h",0)/1000 ,0));;\
my $Solar_Calculation_fc0_day  = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_day",0)/1000 ,0));;\
my $Solar_Calculation_fc0_rest = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_rest",0)/1000 ,0));;\
\
"<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'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Wechselrichter / KSEM<dd>Max DC / PV Reserve / Netz Leistung</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_DC_P_sumOfAllPVInputs."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_PV_P_reserve."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusNetz."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Total_Active_P_EM."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Leistung<dd>von PV / von Batterie / vom Netz / ins Haus</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_PV."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_Battery."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_grid."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Ertrag<dd>Tag / Monat / Jahr / Total</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Daily."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Monthly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Yearly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Total."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Prognose<dd>Tag / 4 Stunden / Resttag</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_day."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_4h."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_rest."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Speicher<dd>Temperatur / nutzbare Ladung / Status / Leistung / akt. SOC</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Battery_temperature."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Actual_Battery_charge_usable_P."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusSpeicher."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>\
</table>\
</html>"\
}\
attr WR_1 userReadings Total_PV_P_reserve:Total_DC_P.* {my $reserve = ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs","0") * 0.90 - ReadingsVal($NAME,"Home_own_consumption_from_PV",0);;;; ($reserve lt 0)? 0 : round($reserve,0)  },\
\
Actual_Battery_charge_-minus_or_discharge_-plus_P:[Battery_voltage|Actual_Battery_charge_-minus_or_discharge_-plus_I].* {round((ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I",0)*ReadingsVal($NAME,"Battery_voltage","0")),0)},\
\
Total_DC_P_Max:[Total_DC_P_sumOfAllPVInputs|Actual_Battery_charge_-minus_or_discharge_-plus_P].* { my $Bat_P = ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_P","0");;;; ($Bat_P gt 0)? round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0) + $Bat_P,0) : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) },\
\
Actual_Battery_charge_usable_P:[Act_state_of_charge|Battery_MinSOC].* {my $x = (ReadingsVal($NAME,"Battery_work_capacity",0)*(ReadingsVal($NAME,"Act_state_of_charge",0)-ReadingsVal($NAME,"Battery_MinSOC",0))/100);;;; ($x lt 0)? 0 : round($x,0) },\
\
SW_Inverter_Generation_P_Actual:Inverter_Generation_P_Actual.* {round(ReadingsVal($NAME,"Inverter_Generation_P_Actual",0)+ReadingsVal("WR_2","Inverter_Generation_P_Actual",0),0) },\
\
SW_Home_own_consumption:[Total_Active_P_EM|Total_AC_Active_P:].* {round(ReadingsVal($NAME,"Total_Active_P_EM",0)+ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)},\
SW_Total_AC_Active_P:Total_AC_Active_P:.*  {round(ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)},\
\
\
SW_Total_DC_P:Total_DC_P:.* {round(ReadingsVal($NAME,"Total_DC_P",0)+ReadingsVal("WR_2","Total_DC_P",0),0) },\
\
SW_Total_DC_P_sumOfAllPVInputs:Total_DC_P_sumOfAllPVInputs.* {round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0)+ReadingsVal("WR_2","Total_DC_P_sumOfAllPVInputs",0),0) },\
\
SW_Total_PV_P_reserve:SW_Total_DC_P_sumOfAllPVInputs.* {my $reserve = ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs","0") * 0.90 - ReadingsVal($NAME,"SW_Home_own_consumption",0);;;; ($reserve lt 0)? 0 : round($reserve,0)  },\
\
SW_Total_DC_P_Max:SW_Total_DC_P_sumOfAllPVInputs.* { my $Bat_out = (ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I","0")*ReadingsVal($NAME,"Battery_voltage",0));;;; ($Bat_out gt 0)? round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0) + $Bat_out,0) : round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0),0) },\
\
SW_Yield_Daily:Daily_yield.* { round(ReadingsVal($NAME,"Daily_yield",0)+ReadingsVal("WR_2","Daily_yield",0),0) },\
SW_Yield_Monthly:Monthly_yield.* { round(ReadingsVal($NAME,"Monthly_yield",0)+ReadingsVal("WR_2","Monthly_yield",0),0) },\
SW_Yield_Yearly:Yearly_yield.* { round(ReadingsVal($NAME,"Yearly_yield",0)+ReadingsVal("WR_2","Yearly_yield",0),0) },\
SW_Yield_Total:Total_yield.* { round(ReadingsVal($NAME,"Total_yield",0)+ReadingsVal("WR_2","Total_yield",0),0) },\
\
SW_Home_own_consumption_from_PV:[Total_Active_P_EM|SW_Home_own_consumption:|Home_own_consumption_from_grid|Home_own_consumption_from_Battery].* { (ReadingsVal($NAME,"Total_Active_P_EM",0) ge 0) ? ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_grid",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) :  ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0);;;; },\
\
SW_Home_own_consumption_from_Battery:[SW_Home_own_consumption_from_PV|Home_own_consumption_from_Battery].* { ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) },\
SW_Home_own_consumption_from_grid:[SW_Home_own_consumption_from_PV|Home_own_consumption_from_grid].* { ReadingsVal($NAME,"Home_own_consumption_from_grid",0) }\

attr WR_1 verbose 0


bekomme ich einen Fehlermeldung: WR_1: unknown attribute DbLogExclude. Type 'attr WR_1 ?' for a detailed list.
Lösche ich aus der Definition das attribute DbLogExclude bekomme ich eine Fehlermeldung das was mit DbLogInclude nicht stimmt, lösche ich dies auch geht nix mehr...

Okay, ignoriere ich die Information und drücke "OK" wird einfach nix erstellt...

Wenn ich die andere Definition nehme:

defmod WR_1_config dummy
attr WR_1_config DbLogExclude .*
attr WR_1_config alias WR_1_config
attr WR_1_config comment Version 2021.04.07 12:00\
Passworte für die Abfrage des WR_1_API werden im storeKeyValue abgelegt:\
   {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
   {KeyValue("store","PW_WR_1_API_user","<passwort>")}\
\
Steht das reading module_*_count auf 0 wird diese Ausrichtung nicht berücksichtigt\
\
Korrekturkurven:\
         Steilheit  Parallel\
                    verschiebung\
tempk      -0.39      25\
cloudk     -0.65       0\
raink      -0.30       0\
Der Slider für die Steilheit wird mit - k/100 umgerechnet. 39 ==> -0.39
attr WR_1_config event-on-change-reading .*
attr WR_1_config group PV Eigenverbrauch
attr WR_1_config icon solar_icon
attr WR_1_config readingList IP-WR_1 IP-WR_1_Speicher_1 IP-WR_1_KSEM IP-FHEM module_1_active module_2_active module_3_active module_1_name module_2_name module_3_name  module_4_name module_5_name module_1_direction module_2_direction module_3_direction module_4_direction module_5_direction module_1_count module_2_count module_3_count module_4_count module_5_count module_1_power module_2_power module_3_power module_4_power module_5_power module_1_plain module_2_plain module_3_plain module_4_plain module_5_plain forecast_cloudk forecast_cloudk_base forecast_raink forecast_raink_base forecast_tempk forecast_tempk_base forecast_factor forecast_factor_autocorrection Forecast_Station
attr WR_1_config room Strom->Photovoltaik
attr WR_1_config setList IP-WR_1 IP-WR_1_Speicher_1 IP-WR_1_KSEM IP-FHEM module_1_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort module_2_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort module_3_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_4_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_5_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_1_direction module_2_direction module_3_direction module_4_direction module_5_direction module_1_count module_2_count module_3_count module_4_count module_5_count module_1_power module_2_power module_3_power module_4_power module_5_power module_1_plain module_2_plain module_3_plain module_4_plain module_5_plain forecast_cloudk forecast_cloudk_base forecast_raink forecast_raink_base forecast_tempk forecast_tempk_base forecast_factor forecast_factor_autocorrection Forecast_Station
attr WR_1_config sortby 113
attr WR_1_config verbose 0

setstate WR_1_config 2020-09-11 07:36:39 Forecast_Station P0178
setstate WR_1_config 2020-08-31 12:39:26 IP-FHEM 192.168.1.80
setstate WR_1_config 2020-08-31 12:39:44 IP-WR_1 192.1.37
setstate WR_1_config 2020-08-31 12:43:27 IP-WR_1_KSEM 192.168.1.41
setstate WR_1_config 2020-09-22 10:03:21 forecast_cloudk 45
setstate WR_1_config 2020-09-22 10:12:17 forecast_cloudk_base 0
setstate WR_1_config 2020-12-07 15:49:18 forecast_factor 1
setstate WR_1_config 2021-03-31 11:45:19 forecast_factor_autocorrection 1
setstate WR_1_config 2020-09-02 18:40:29 forecast_raink 20
setstate WR_1_config 2020-09-01 12:52:40 forecast_raink_base 0
setstate WR_1_config 2020-09-01 12:46:57 forecast_tempk 39
setstate WR_1_config 2020-09-01 12:50:06 forecast_tempk_base 25
setstate WR_1_config 2021-03-23 14:31:19 module_1_count 20
setstate WR_1_config 2020-08-31 12:27:38 module_1_direction -90
setstate WR_1_config 2021-03-23 14:33:27 module_1_name WR_1_Ost
setstate WR_1_config 2020-08-31 12:29:42 module_1_plain 40
setstate WR_1_config 2020-08-31 12:31:09 module_1_power 310
setstate WR_1_config 2021-03-23 14:41:10 module_2_count 16
setstate WR_1_config 2021-03-23 14:54:13 module_2_direction 90
setstate WR_1_config 2021-03-23 14:33:45 module_2_name WR_1_West
setstate WR_1_config 2020-08-31 12:34:14 module_2_plain 40
setstate WR_1_config 2021-02-04 12:23:00 module_2_power 310
setstate WR_1_config 2021-03-23 14:41:40 module_3_count 13
setstate WR_1_config 2021-03-23 14:54:26 module_3_direction 0
setstate WR_1_config 2021-03-23 14:34:09 module_3_name WR_2_Sued
setstate WR_1_config 2020-08-31 12:35:08 module_3_plain 40
setstate WR_1_config 2021-03-23 14:41:55 module_3_power 340
setstate WR_1_config 2021-03-29 12:20:49 module_4_count 11
setstate WR_1_config 2021-03-23 14:54:37 module_4_direction 90
setstate WR_1_config 2021-03-23 14:34:27 module_4_name WR_2_West
setstate WR_1_config 2020-08-31 12:34:14 module_4_plain 40
setstate WR_1_config 2021-02-04 12:23:00 module_4_power 340
setstate WR_1_config 2021-02-04 12:41:15 module_5_count 0
setstate WR_1_config 2021-03-23 14:53:22 module_5_direction 0
setstate WR_1_config 2021-03-23 14:43:38 module_5_name frei
setstate WR_1_config 2021-03-23 14:50:46 module_5_plain 0
setstate WR_1_config 2021-03-23 14:50:39 module_5_power 0


bekomme ich ein Gerät das mir irgendwie auch nix brauchbares liefert...
Hier ein List:
Internals:
   CFGFN     
   DEF       
   FUUID      61c5a7bb-f33f-e7ed-6133-51487f2732f59297
   NAME       WR_1_config
   NR         579014
   STATE      ???
   TYPE       dummy
   READINGS:
     2020-09-11 07:36:39   Forecast_Station P0178
     2020-08-31 12:39:26   IP-FHEM         192.168.1.80
     2020-08-31 12:39:44   IP-WR_1         192.168.1.37
     2020-08-31 12:43:27   IP-WR_1_KSEM    192.168.1.41
     2020-08-31 12:44:46   IP-WR_1_Speicher_1 192.168.178.xyz
     2020-09-22 10:03:21   forecast_cloudk 45
     2020-09-22 10:12:17   forecast_cloudk_base 0
     2020-12-07 15:49:18   forecast_factor 1
     2021-03-31 11:45:19   forecast_factor_autocorrection 1
     2020-09-02 18:40:29   forecast_raink  20
     2020-09-01 12:52:40   forecast_raink_base 0
     2020-09-01 12:46:57   forecast_tempk  39
     2020-09-01 12:50:06   forecast_tempk_base 25
     2021-03-23 14:31:19   module_1_count  20
     2020-08-31 12:27:38   module_1_direction -90
     2021-03-23 14:33:27   module_1_name   WR_1_Ost
     2020-08-31 12:29:42   module_1_plain  40
     2020-08-31 12:31:09   module_1_power  310
     2021-03-23 14:41:10   module_2_count  16
     2021-03-23 14:54:13   module_2_direction 90
     2021-03-23 14:33:45   module_2_name   WR_1_West
     2020-08-31 12:34:14   module_2_plain  40
     2021-02-04 12:23:00   module_2_power  310
     2021-03-23 14:41:40   module_3_count  13
     2021-03-23 14:54:26   module_3_direction 0
     2021-03-23 14:34:09   module_3_name   WR_2_Sued
     2020-08-31 12:35:08   module_3_plain  40
     2021-03-23 14:41:55   module_3_power  340
     2021-03-29 12:20:49   module_4_count  11
     2021-03-23 14:54:37   module_4_direction 90
     2021-03-23 14:34:27   module_4_name   WR_2_West
     2020-08-31 12:34:14   module_4_plain  40
     2021-02-04 12:23:00   module_4_power  340
     2021-02-04 12:41:15   module_5_count  0
     2021-03-23 14:53:22   module_5_direction 0
     2021-03-23 14:43:38   module_5_name   frei
     2021-03-23 14:50:46   module_5_plain  0
     2021-03-23 14:50:39   module_5_power  0
Attributes:
   alias      WR_1_config
   comment    Version 2021.04.07 12:00
Passworte für die Abfrage des WR_1_API werden im storeKeyValue abgelegt:
   {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
   {KeyValue("store","PW_WR_1_API_user","<passwort>")}

Steht das reading module_*_count auf 0 wird diese Ausrichtung nicht berücksichtigt

Korrekturkurven:
         Steilheit  Parallel
                    verschiebung
tempk      -0.39      25
cloudk     -0.65       0
raink      -0.30       0
Der Slider für die Steilheit wird mit - k/100 umgerechnet. 39 ==> -0.39
   event-on-change-reading .*
   group      PV Eigenverbrauch
   icon       solar_icon
   readingList IP-WR_1 IP-WR_1_Speicher_1 IP-WR_1_KSEM IP-FHEM module_1_active module_2_active module_3_active module_1_name module_2_name module_3_name  module_4_name module_5_name module_1_direction module_2_direction module_3_direction module_4_direction module_5_direction module_1_count module_2_count module_3_count module_4_count module_5_count module_1_power module_2_power module_3_power module_4_power module_5_power module_1_plain module_2_plain module_3_plain module_4_plain module_5_plain forecast_cloudk forecast_cloudk_base forecast_raink forecast_raink_base forecast_tempk forecast_tempk_base forecast_factor forecast_factor_autocorrection Forecast_Station
   room       Strom->Photovoltaik
   setList    IP-WR_1 IP-WR_1_Speicher_1 IP-WR_1_KSEM IP-FHEM module_1_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort module_2_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort module_3_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_4_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_5_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_1_direction module_2_direction module_3_direction module_4_direction module_5_direction module_1_count module_2_count module_3_count module_4_count module_5_count module_1_power module_2_power module_3_power module_4_power module_5_power module_1_plain module_2_plain module_3_plain module_4_plain module_5_plain forecast_cloudk forecast_cloudk_base forecast_raink forecast_raink_base forecast_tempk forecast_tempk_base forecast_factor forecast_factor_autocorrection Forecast_Station
   sortby     113
   verbose    0


Und leider auch ohne einen Erfolg..
Dabei stelle ich mir dann schon die Frage wo ich eigentlich die Zugangsdaten vom Wechselrichter und KSEM eingeben muss ...?

Kurz gesagt: Die Anleitung ist brutal gut , aber für echte normalos wirklich megaoverloaded...

Ich würde gerne im meine FHEM einfach nur den aktuellen Ladezustand der Batterie sehen, den Status ob sie gerade geladen oder entladen wird, was gerade auf dem Dach erzeugt wird und was die Hütte momentan verbraucht.
Das wären dann 4 Werte.

Gibt es nicht eine einfache Alternative die mir das "einfacher" darstellen kann um dieser Werte im FTUI dann sich zu integrieren denn mehr brauche ich wirklich nicht.

Oder hat vielleicht einer so eine MINI Konfig und kann mir kurz erläutern wie ich es bei mir einrichten könnte?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 Dezember 2021, 23:53:53
Hallo und willkommen.

Zitat von: misux am 24 Dezember 2021, 13:35:12
Meine Hardware:
Ein Wechselrichter (Kostal Plenticore 10 Plus)(IP:192.168.1.37) eine Batterie BYD(Keine IP) an einem Eingang ein KSEM(IP:192.168.1.41) und die Module die an den letzten beiden Eingängen am Wechselrichter angebunden sind.
Meine Batterie finde ich leider nicht im Netzwerk, ist irgendwie anders verbunden mit dem Wechselrichter.
Im KSEM Webinterface ist kein Wechselrichter eingerichtet, warum auch immer, hat die Firma so eingestellt. Und auch in den MODBUS einstellungen sind nur die RS485 Schnittstellen eingerichtet, die TCP Einstellungen sind Leer

Mein Wunsch: Eine einfache Anzeige später im FTUI über den aktuellen Ladezustand der Batterie sehen, den Status ob sie gerade geladen oder entladen wird, was gerade auf dem Dach erzeugt wird und was die Hütte momentan verbraucht.
Das sollten wir hinbekommen, wenn wir schritt für schritt vorgehen.

1.) KSEM
Solange Du nur einen Wechselrichter hast kannst Du das Device erstmal weg lassen, weil der Plenticore mit dem KSEM mit rs485 kommuniziert. Die Werte werden dann vom Plenticore mit angezeigt.

2.) BYD Speicher
Der Speicher kommuniziert auch über rs485 mit dem Plenticore und wird vom Wechselrichter auch gesteuert. Auch diese Werte zeigt der Plenticore dann direkt mit an.

3.) Wir verwenden in diesem Thread die DbLog Installation, das bedeutet die Werte gehen in eine MySQL Datenbank. Dazu findest Du im Wiki einen kurzen Hinweis, da die Aktivierung für DbLog an anderer Stelle im Wiki ausführlich beschrieben ist. Bitte richte das vorher schon mal ein und schau Dir dann auch die Hinweise im Plenticore Wiki zur Datenbank an. Danach kommen dann auch die Meldungen zum DbLogExclude und
DbLogInclude nicht mehr, denn die Attribute gibt es erst nach der DbLog Einrichtung.

4.) Bitte verwende für den Anfang exakt die Gerätenamen, die im Plenticore Wiki verwendet werden, da sich diese durch alle Devices und myUtils Programme durchziehen.

5.) Das Plenticore Wiki ist von oben nach unten strukturiert, alles was weiter unten ist wird immer weniger zur Pflicht :-)

6.) Jetzt kannst Du mit dem WR_1_config Device beginnen, in dem Konfigurationsparameter abgelegt sind. Dort müssen auch schon mal IP-Adresse eingetragen werden.
Die setstate angaben gehören auch dazu und sind schon mal default Werte.

7.) Nun kommt das WR_1 Device, das mit ModBus die Werte vom Plenticore, dem KSEM und dem Speicher anzeigt.
Die DbLogExclude und DbLogInclude schreiben dann die gängigsten Werte schon mal in die MySQL Datenbank.

8.) Bis hierher brauchst Du keine Zugangsdaten und auch keinen Zugang zum KSEM. Alle Werte werden vom Plenticore per ModBus ins Netz gesendet und mit dem WR_1 ModBus Device im 60 Sekunden Takt gelesen.
Achtung, am Plenticore muss natürlich nach der Kostal Beschreibung auch der ModBus aktiviert worden sein, ansonsten kann ja nichts empfangen werden.

Zitat
Kurz gesagt: Die Anleitung ist brutal gut , aber für echte normalos wirklich megaoverloaded...
Bitte arbeite das Ganze in aller Ruhe durch, ich bin erst wieder am Montag verfügbar ;-)
Die Belohnung wird ein sehr mächtiges Monitoring und Steuerungssystem sein, bis hin zum Grafana Dashboard.

Zitat
Ich würde gerne im meine FHEM einfach nur den aktuellen Ladezustand der Batterie sehen, den Status ob sie gerade geladen oder entladen wird, was gerade auf dem Dach erzeugt wird und was die Hütte momentan verbraucht.
Das wären dann 4 Werte.
Gibt es nicht eine einfache Alternative die mir das "einfacher" darstellen kann um dieser Werte im FTUI dann sich zu integrieren denn mehr brauche ich wirklich nicht.
Sobald die grundlegenden Devices laufen kannst Du natürlich auch FTUI aufsetzen, was ich nicht verwende.

Zitat
Oder hat vielleicht einer so eine MINI Konfig und kann mir kurz erläutern wie ich es bei mir einrichten könnte?
Man kann natürlich die DbLog auch weglassen und die entsprechenden Attribute, die angemäckert werden einfach wieder raus löschen.

Wenn Du etwas damit gearbeitet hast wirst Du auch Statistiken haben wollen und auch mehr als 4 Werte sehen wollen. Das sieht man dann an den uiTable stateFormat, die ich erstellt habe. Also würdest Du es erst abstrippen und dann doch wieder erweitern. Spätestens wenn Du die Jahresend Werte für das Finanzamt brauchst, oder den Monat und das Jahr beobachtest.

9.) Jetzt kommen die Statistiken, die der Plenticore liefert :-) Das geht dann über das WR_1_API Device, mit dem man dann auch den Speicher ansteuern kann.
Aber da schreiben wir dann später mal weiter, wenn Du Deine 4 Werte hast.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Dezember 2021, 09:51:04
Hallo misux,
Zitat von: misux am 25 Dezember 2021, 08:28:53
Hat einer eine Idee welches Attribut für den Aktuellen Hausverbrauch zuständig ist? Also der Wert in Plenticore Weboberfläche welcher von dem Häuschen angezeigt wird... Der gesamte aktuelle Hausverbrauch...

Der Hausverbrauch setzt sich aus dem Netzbezug und der komplett Leistung des Plenticore zusammen. Hier ein Auszug aus dem userreading, was so auch beim Schwarm funktioniert.
Bei Dir, also einem WR wird ReadingsVal("WR_2","Total_AC_Active_P",0) immer mit 0 aufgelöst.

SW_Home_own_consumption:[Total_Active_P_EM:|Total_AC_Active_P:].* {round(ReadingsVal($NAME,"Total_Active_P_EM",0)+ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)}


Du kannst auch folgendes zusammen rechnen, was ich am Anfang auch so gemacht habe. Da jedoch einige hier im Forum auch zwei Wechselrichter haben hat das so nicht mehr funktioniert und ich habe auf die userreadings mit SW_* umgestellt. So können alle das gleiche Device verwenden.

Home_own_consumption_from_Battery
Home_own_consumption_from_PV
Home_own_consumption_from_grid


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 25 Dezember 2021, 09:53:41
Krass, vielen dank für die Erläuterung.

Aber wegen den Statistiken...
ZitatWenn Du etwas damit gearbeitet hast wirst Du auch Statistiken haben wollen und auch mehr als 4 Werte sehen wollen. Das sieht man dann an den uiTable stateFormat, die ich erstellt habe. Also würdest Du es erst abstrippen und dann doch wieder erweitern. Spätestens wenn Du die Jahresend Werte für das Finanzamt brauchst, oder den Monat und das Jahr beobachtest.

Diese Dinge fürs Finanzamt bekomme ich doch auch vom Kostal Portal... oder Irre ich mich..?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Dezember 2021, 10:10:45
Zitat von: misux am 25 Dezember 2021, 09:53:41
Krass, vielen dank für die Erläuterung.

Aber wegen den Statistiken...
Diese Dinge fürs Finanzamt bekomme ich doch auch von Kostal Portal... oder Irre ich mich..?
Wenn Du Dir da alles monatsweise zusammen suchen möchtest? Ich verwende das Portal nicht, da mir die Wartezeit auf Kostal bei Fehlern zu lange war.
Auch wenn Du etwas lokal Steuern möchtest brauchst Du gute lokale Daten. Das geht bis hin zur Leistungsprognose, die am deutlichsten bei der Speichersteuerung wird.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 25 Dezember 2021, 10:26:06
 8) OKAY, das natürlich n Argument! na dann fange ich nochmal von Vorne an...
Zuerst dbLog... dann schauen wir weiter
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Dezember 2021, 10:33:12
Zitat von: misux am 25 Dezember 2021, 10:26:06
8) OKAY, das natürlich n Argument! na dann fange ich nochmal von Vorne an...
Zuerst dbLog... dann schauen wir weiter

EDIT: Das passt gerade zum Thema unklarheit-bei-darstellung (https://www.photovoltaikforum.com/thread/164557-unklarheit-bei-darstellung)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 25 Dezember 2021, 16:01:47
SO, ich versuche es nun weiter...

HAbe soweit mein WR_1 erstellt und zu testzwecken ob überhaupt etwas funktioniert auch dort n paar Attribute gesetzt...

Und ich bin begeistert, es liest tatsächlich die Aktuellen Werte meiner Anlage aus!

Habe nur ein Problem mit dem Log... Die haut mir im Sekundentakt einen Fehler:
2021.12.25 15:53:18 3: 192.168.1.37:1502 disconnected, waiting to reappear (WR_1)
2021.12.25 15:53:18 3: 192.168.1.37:1502 reappeared (WR_1)
2021.12.25 15:53:19 3: 192.168.1.37:1502 disconnected, waiting to reappear (WR_1)
2021.12.25 15:53:19 3: 192.168.1.37:1502 reappeared (WR_1)


hat einer eine Idee wo mein Fehler ist?

Hier ein List von meinem WR_1 (nicht wundern, habe "set WR_1 stop" durchgeführt damit er hier nicht durchdreht... ;D)
Internals:
   DEF        71 15 192.168.1.37:1502 TCP
   DeviceName 192.168.1.37:1502
   EXPECT     idle
   FD         4
   FUUID      61c5cb53-f33f-e7ed-4848-ca7995b3573dd751
   IODev      WR_1
   Interval   15
   LASTOPEN   1640443999.19293
   MODBUSID   71
   MODE       master
   MODULEVERSION Modbus 4.4.02 - 31.3.2021
   NAME       WR_1
   NOTIFYDEV  global
   NR         205
   NTFY_ORDER 50-Plenticore
   PARTIAL   
   PROTOCOL   TCP
   STATE      opened
   TCPConn    1
   TYPE       ModbusAttr
   devioLoglevel 3
   nextOpenDelay 60
   Helper:
     DBLOG:
       Batterieladung:
         logdb:
           TIME       1640443923.11821
           VALUE      100
       Hausverbrauch:
         logdb:
           TIME       1640443922.07015
           VALUE      517
       PV-Leistung:
         logdb:
           TIME       1640443924.17607
           VALUE      576
       state:
         logdb:
           TIME       1640443924.22376
           VALUE      CONNECTED
   QUEUE:
   READ:
     BUFFER     
   READINGS:
     2021-12-25 15:53:18   Batterieladung  100
     2021-12-25 15:53:17   Hausverbrauch   450
     2021-12-25 15:53:19   PV-Leistung     502
     2021-12-25 15:53:19   state           opened
   REMEMBER:
     lid        71
     lname      WR_1
     lrecv      1640443999.1732
     lsend      1640443999.15543
   defptr:
     Plenticore 71
     WR_1       71
   gotReadings:
     PV-Leistung 502
   lastRead:
     h1066      1640443999.17536
     h172       1640443997.08847
     h210       1640443998.12566
Attributes:
   dev-type-Fl_R2-format %.0f
   dev-type-Fl_R2-len 2
   dev-type-Fl_R2-revRegs 1
   dev-type-Fl_R2-unpack f>
   obj-h1066-poll 1
   obj-h1066-reading PV-Leistung
   obj-h1066-type Fl_R2
   obj-h172-poll 1
   obj-h172-reading Hausverbrauch
   obj-h172-type Fl_R2
   obj-h210-poll 1
   obj-h210-reading Batterieladung
   obj-h210-type Fl_R2
   room       PV-Anlage


Die dbLog Geschichte ist eine andere Baustelle.. die zwerbicht mich auch den Kopf.. aber da bin ich im Anfängerforum schon dran...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 25 Dezember 2021, 18:20:59
Hat sich erledigt!

Jetzt lüppt es soweit wieder!

DbLog denke ich auch soweit!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 26 Dezember 2021, 08:48:04
 :o

Naja ist doch nix....

Bekomme beim einfügen von der RAW WR_1 eine mega Error Meldung

syntax error at (eval 23724) line 53, near "userReadings Total_PV_P_reserve:"
syntax error at (eval 23724) line 53, near "0 : round($reserve,0)  "
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 55.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 55.
syntax error at (eval 23724) line 57, near ") : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) "
syntax error at (eval 23724) line 59, near "0 : round($x,0) "
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 61.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 63.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 63.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 64.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 67.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 69.
syntax error at (eval 23724) line 71, near "0 : round($reserve,0)  "
(eval 23724) has too many errors.


und dann dient mein WR_1 (Bild) auch katastrophal aus...

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Dezember 2021, 16:56:43
Zitat von: misux am 26 Dezember 2021, 08:48:04
:o

Naja ist doch nix....

Bekomme beim einfügen von der RAW WR_1 eine mega Error Meldung

syntax error at (eval 23724) line 53, near "userReadings Total_PV_P_reserve:"
syntax error at (eval 23724) line 53, near "0 : round($reserve,0)  "
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 55.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 55.
syntax error at (eval 23724) line 57, near ") : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) "
syntax error at (eval 23724) line 59, near "0 : round($x,0) "
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 61.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 63.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 63.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 64.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 67.
Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 23724) line 69.
syntax error at (eval 23724) line 71, near "0 : round($reserve,0)  "
(eval 23724) has too many errors.


und dann dient mein WR_1 (Bild) auch katastrophal aus...
Das ist meist ein copy paste Problem.

Und setz das Interval mal auf 60 Sekunden, das reicht
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Dezember 2021, 18:09:17
Hier nochmals etwas zu "No Duplikate Key" bzw. "Primary Key"

Primary Key (https://forum.fhem.de/index.php/topic,114849.msg1158928/topicseen.html#msg1158928)
Und im DbLog Wiki  (https://wiki.fhem.de/wiki/DbLog-MySQL#Primary_Keys)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 26 Dezember 2021, 18:24:34
Zitat von: ch.eick am 26 Dezember 2021, 16:56:43
Das ist meist ein copy paste Problem.

Und setz das Interval mal auf 60 Sekunden, das reicht

Mist, das habe ich befürchtet... Habe es schon einige male probiert.. ein mal hat es geklappt, da waren die Felder aber ca einen Meter breit und habe dann das DEV gelöscht... nun klappt es nicht mehr.. Versuche jetzt einen anderen Browser..
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 26 Dezember 2021, 18:36:56
 :(
Leider kein Erfolg...

Das Intervall ist schon länger schon wie vorgegeben...

Habe nun die WR_1_Config und die WR_1 neu angelegt mit dem RAW Editor und leider ohne Erfolg...

Gibt es noch Wege wie man es importieren könnte? Ich meine, ich markiere alles, kopieren und dann im RAW Editor einfügen und die Daten anpassen, mehr nicht.. Warum klappt es nicht?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Dezember 2021, 19:04:47
Zitat von: misux am 26 Dezember 2021, 18:36:56
:(
Leider kein Erfolg...

Das Intervall ist schon länger schon wie vorgegeben...

Habe nun die WR_1_Config und die WR_1 neu angelegt mit dem RAW Editor und leider ohne Erfolg...

Gibt es noch Wege wie man es importieren könnte? Ich meine, ich markiere alles, kopieren und dann im RAW Editor einfügen und die Daten anpassen, mehr nicht.. Warum klappt es nicht?
Bisher hat es bei den anderen geklappt.

Schick mir mal ein List und das copy/paste aus dem RAW Device als PN, eventuell kann ich ja was sehen.
Das WR_1_config wird erst später gebraucht.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 00:23:23
So, nach wirklich ewigen Stunden und fast kompletter resignation (falls man das so nennt) habe ich es geschafft.

Nach erfolglosen RAW importen der ganzen geschichte bin ich zuletzt , keine Ahnung wieso, auf die Idee beim RAW Import des WR_1 codes OHNE den Teil "attr WR_1 userReadings"  zu importieren! Das hat dann soweit geklappt! Habe dann im nachhinein das attribut im device userreading mit dem Inhalt von der PN befüllt und nun scheint es zu gehen!

Und nun zu dem eigentlichen Problem!

Ich könnte schwören das es vor dem letzten Update von FHEM geklappt hat ohne diesen Umweg. Habe aber zwischenzeitig alle devices gelöscht fhem und das Raspi geupdatet, dbLog eingerichtet und dann wollte ich neu alles per RAW improtieren was nie geklappt hat weil er das attr WR_1 userreading nie gesetzt hat sondern im stateFormat belassen hat!
Ich glaube da ist was faul... habe aber wirklich inzwischen keine Lust mich damit zu befassen und bin glücklich das es jetzt geht.

HAbe aber minütlich nen Log eintrag:
2021.12.28 00:14:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value
2021.12.28 00:14:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_P_ScaleFactor resulted in undefined value
2021.12.28 00:15:04 3: WR_1: CreateDataObjects unpack of 0013 with f> for Battery_Actual_SOC resulted in undefined value
2021.12.28 00:15:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value
2021.12.28 00:15:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_P_ScaleFactor resulted in undefined value
2021.12.28 00:16:04 3: WR_1: CreateDataObjects unpack of 0013 with f> for Battery_Actual_SOC resulted in undefined value
2021.12.28 00:16:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value
2021.12.28 00:16:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_P_ScaleFactor resulted in undefined value
2021.12.28 00:17:04 3: WR_1: CreateDataObjects unpack of 0013 with f> for Battery_Actual_SOC resulted in undefined value
2021.12.28 00:17:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value


Wenn das gelöst ist dann gehts zu der API... ::) 8)

Achso, und was immernoch mega nervt ist das wenn ich im WR_1 Device drin bin das Teil ca n Meter breit ist... :o
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Dezember 2021, 09:07:29
Zitat von: misux am 28 Dezember 2021, 00:23:23
Ich könnte schwören das es vor dem letzten Update von FHEM geklappt hat ohne diesen Umweg. Habe aber zwischenzeitig alle devices gelöscht fhem und das Raspi geupdatet, dbLog eingerichtet und dann wollte ich neu alles per RAW improtieren was nie geklappt hat weil er das attr WR_1 userreading nie gesetzt hat sondern im stateFormat belassen hat!
Ich glaube da ist was faul... habe aber wirklich inzwischen keine Lust mich damit zu befassen und bin glücklich das es jetzt geht.
Die Fehlermeldung im state mit der fehlenden Klammer deutet wohl auf sowas hin, dass das stateFormat nicht durch die "}" beendet ist. Im Wiki ist aber eine drin.
Wie gesagt, es ist schon manchmal zu copy/paste Problemen gekommen, jedoch ist die Vorlage aus dem Wiki auch bereits mehrfach fehlerfrei übernommen worden.
Wenn Du den Fehler gefunden hast würde ich es natürlich im Wiki korrigieren, bzw einen Kommentar dazu schreiben, wenn man ein bestimmtes handling anwenden muss.

Zitat
Und nun zu dem eigentlichen Problem!

HAbe aber minütlich nen Log eintrag:
2021.12.28 00:14:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value
2021.12.28 00:14:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_P_ScaleFactor resulted in undefined value
2021.12.28 00:15:04 3: WR_1: CreateDataObjects unpack of 0013 with f> for Battery_Actual_SOC resulted in undefined value
2021.12.28 00:15:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value
2021.12.28 00:15:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_P_ScaleFactor resulted in undefined value
2021.12.28 00:16:04 3: WR_1: CreateDataObjects unpack of 0013 with f> for Battery_Actual_SOC resulted in undefined value
2021.12.28 00:16:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value
2021.12.28 00:16:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_P_ScaleFactor resulted in undefined value
2021.12.28 00:17:04 3: WR_1: CreateDataObjects unpack of 0013 with f> for Battery_Actual_SOC resulted in undefined value
2021.12.28 00:17:05 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value

Es kann sein, das Kostal das Register Format geändert hat und es nicht mehr auf little-endian steht. Siehe Bild

Zitat
Achso, und was immernoch mega nervt ist das wenn ich im WR_1 Device drin bin das Teil ca n Meter breit ist... :o
Das mit der Breite im FhemWeb ist nicht schön und liegt wohl an den Formaten der Felder, die nicht für so lange Einträge ausgelegt sind.
Leider hat sich noch niemand gefunden, der das Style sheet ändern kann.

Da man jedoch eher selten in die Devices geht, sondern sich eher ein gescheites stateFormat macht, oder wie Du ins FTUI integriert, scheint das ansonsten niemanden zu stören.
Es hängt ja auch wohl auch davon ab welches Style Sheet man verwendet. Im io7 ist es auch sehr breit.

Meistens schaue ich mir die Situation in Grafana auf einem 34" Fernseher an, oder halt im FhemWeb das stateFormat oder uiTable.
Schade finde ich auch, dass es vom verwendeten Device abhängt, ob man stateFormat oder uiTable zur Verfügung hat.
Die FHEM Oberfläche war ja schon oft als nicht so ansprechend in der Diskussion.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 09:38:59
Zitat von: ch.eick am 28 Dezember 2021, 09:07:29
Die Fehlermeldung im state mit der fehlenden Klammer deutet wohl auf sowas hin, dass das stateFormat nicht durch die "}" beendet ist. Im Wiki ist aber eine drin.
Wie gesagt, es ist schon manchmal zu copy/paste Problemen gekommen, jedoch ist die Vorlage aus dem Wiki auch bereits mehrfach fehlerfrei übernommen worden.
Wenn Du den Fehler gefunden hast würde ich es natürlich im Wiki korrigieren, bzw einen Kommentar dazu schreiben, wenn man ein bestimmtes handling anwenden muss.
Es kann sein, das Kostal das Register Format geändert hat und es nicht mehr auf little-endian steht. Siehe Bild
Das mit der Breite im FhemWeb ist nicht schön und liegt wohl an den Formaten der Felder, die nicht für so lange Einträge ausgelegt sind.
Leider hat sich noch niemand gefunden, der das Style sheet ändern kann.

Da man jedoch eher selten in die Devices geht, sondern sich eher ein gescheites stateFormat macht, oder wie Du ins FTUI integriert, scheint das ansonsten niemanden zu stören.
Es hängt ja auch wohl auch davon ab welches Style Sheet man verwendet. Im io7 ist es auch sehr breit.

Meistens schaue ich mir die Situation in Grafana auf einem 34" Fernseher an, oder halt im FhemWeb das stateFormat oder uiTable.
Schade finde ich auch, dass es vom verwendeten Device abhängt, ob man stateFormat oder uiTable zur Verfügung hat.
Die FHEM Oberfläche war ja schon oft als nicht so ansprechend in der Diskussion.

Hatte gehofft das es umgestellt wurde nach meinem durchgefürhten update. Aber leider nein, es steht noch auf little-emdian.

Was habe ich noch für Möglichkeiten? So kann ich es ja nicht laufen lassen...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Dezember 2021, 09:52:13
Zitat von: misux am 28 Dezember 2021, 09:38:59
Hatte gehofft das es umgestellt wurde nach meinem durchgefürhten update. Aber leider nein, es steht noch auf little-emdian.

Was habe ich noch für Möglichkeiten? So kann ich es ja nicht laufen lassen...
Werden den gar keine Werte mehr richtig angezeigt?
Ich habe die aktuelle Plenticore Firmware und
MODULEVERSION Modbus 4.4.02 - 31.3.2021
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 10:05:32
Doch doch, ich behaupte mal das alles i.o. ist... Siehe Bild

Die Modbus version ist die gleiche.
Kann es nur nicht so laufen lasse weil sonst das Logfile bald den raspberry sprengt...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 10:10:44
Und das mit dem megabreiten fenster werd ich mal im Anfängerforum posten, vielleicht erbarmt sich ja mal jemand... Das f11 style funktioniert perfekt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Dezember 2021, 10:32:22
Zitat von: misux am 28 Dezember 2021, 10:10:44
Und das mit dem megabreiten fenster werd ich mal im Anfängerforum posten, vielleicht erbarmt sich ja mal jemand... Das f11 style funktioniert perfekt.
Okay, aber auch das f11 ist über breit.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 10:42:03
Nö, bei mir stellt er f11 und f18 super dar. so wie es sein soll...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Dezember 2021, 10:43:15
Zitat von: misux am 28 Dezember 2021, 10:42:03
Nö, bei mir stellt er f11 und f18 super dar. so wie es sein soll...
Dann wird das auch noch mit dem Bildschirm zusammen hängen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 10:46:32
okay, aber wie du sagst ist das erstmal nebensächtlich..

Aber mein Problem mit den Logeinträgen... hast du da noch eine Idee? Weil ich weiß da definitiv nicht weiter...

EDIT:
Auch das ist gelöst. Das attribut verbose 0 wurde nicht mit dem RAW editor übernommen. Habe es manuell eingetragen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 21:28:49
So, bin dabei die API einzurichten... Leider bekomme ich wieder n Error bei den Einträgen in der 99_myUtils:

Can't locate Crypt/URandom.pm in @INC (you may need to install the Crypt::URandom module) (@INC contains: ./FHEM/lib ./lib ./FHEM . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/arm-linux-gnueabihf/perl5/5.28 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.28 /usr/share/perl/5.28 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at ./FHEM/99_myUtils.pm line 14. BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 14.

die beiden Module hatte ich schon aktuell:
    sudo apt-get install libcryptx-perl
    sudo apt-get install libpbkdf2-tiny-perl

Und nu...? :-X Sorry das es hier so doof läuft, habs mir auch anders vorgestellt... :-[
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 28 Dezember 2021, 21:39:57
Ich verwende zum Nachinstalieren von Perl Modulen gern den FHEM Installer.
Das ein FHEM Modul. Du definierst ein Device mit:


define fhemInstaller Installer


Und dann in deinem Fall  "set fhemInstaller installPerl Crypt::URandom".

Sollte dann passen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 22:28:11
OK!

Habs installiert. und alle recommended und suggesten außer DBD::Pg installiert.

Bei dem DBD::Pg bekomme ich einen Error:
error 'installPerl DBD::Pg'

Crypt::URandom ist installiert. Weiter gehts! Vielen Dank!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 28 Dezember 2021, 22:43:36
DBD::Pg brauchst du nur wenn du PostgreSQL mit DbLog einsetzt. Also o.k. soweit.
Viel Erfolg ...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 28 Dezember 2021, 23:31:18
WOW!

Ich habs geschafft! OKAY! 8) Soweit so gut... Nur wenn ich mir das so ansehe weis ich nicht so recht was oder von wem die API die Daten geholt hat, jedenfalls nicht von mir.. ;D

Die Daten können nicht passen... Meine Anlage läuft seit August und ich habe auch diesen Monat so einiges vom Netz bezogen... Siehe Bilder

Wo liegt jetzt der Fehler?

P.S. ich habe, war mir nicht sicher ob es so gemacht werden sollte, alle %IP-WR% in der RAW in meine Kostal IP geändert...
sieht jetzt also über all so aus: http://192.168.1.37/api/v1/.....

Und den Monatswert auf dem Kostal seite verstehe ich bis heute nicht...
Monat 171,7
Hausverbrauch 301,8
aus PV 55,1
aus Netz 183,5
aus Batterie 67,7

ich kann hin und her rechnen aber auf diese 171,1 komme ich nicht.... was ist das?

Und der Jahreswert ist noch schlimmer nur viel größer... Kapiere ich nicht
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 Dezember 2021, 10:24:13
Zitat von: misux am 28 Dezember 2021, 23:31:18
Nur wenn ich mir das so ansehe weis ich nicht so recht was oder von wem die API die Daten geholt hat, jedenfalls nicht von mir.. ;D

Die Daten können nicht passen... Meine Anlage läuft seit August und ich habe auch diesen Monat so einiges vom Netz bezogen... Siehe Bilder

Wo liegt jetzt der Fehler?
such, such, such,.... :-)
Zitat
Und den Monatswert auf dem Kostal Seite verstehe ich bis heute nicht...
Monat 171,7
Hausverbrauch 301,8
aus PV 55,1
aus Netz 183,5
aus Batterie 67,7

ich kann hin und her rechnen aber auf diese 171,1 komme ich nicht.... was ist das?

Und der Jahreswert ist noch schlimmer nur viel größer... Kapiere ich nicht
183,5 + 55,1 - 67,7 = 171
Das mit dem Speicher ist immer etwas verwirrend, da der im Hochvolt Bereich ist wird der Ertrag erst nach der Speicherentnahme als Ertrag gerechnet.
Ich hoffe das stimmt jetzt so, wenn nicht kannst Du das im photovoltaikforum.de mal nachfragen. Das hatte ich vor 2 jahren mal versucht zu verstehen.

Wahrscheinlich hast Du das PV_Schedule Device noch nicht in Verwendung. Daraus brauchst Du das cmd_1 , cmd_4 und cmd_5.
Bei cmd_1 kannst Du erstmal das Schattenmanagement entfernen.

Im cmd_5 werden täglich, monatich und jährlich die Zählerstände als "*_init_*" readings im Device gespeichert und für die Statistik Korrektur im Schwarm verwendet.
Bei nur einem WR könnte man das wieder zurück bauen, oder Du verwendest es weiter, damit über alle Anwender die Devices gleich sind.

Für den aller ersten Start des Konstruktes müsstest Du die readings einmal für Day, Month und Year mit Deinen Werten vom KSEM setzen. Das kann man auch etwas schätzen,
bis die Statistiken richtig passen und mit dem nächsten 1. des Monats werden dann alle richtig gesetzt. Du hast auch die Ehre einen Jahres Wechsel zu haben :-)

Zitat
P.S. ich habe, war mir nicht sicher ob es so gemacht werden sollte, alle %IP-WR% in der RAW in meine Kostal IP geändert...
sieht jetzt also über all so aus: http://192.168.1.37/api/v1/.....
Die IP-Adresse wird aus dem WR_1_config geholt und dann im WR_1_API Device mit replacement eingesetzt. Das dient der Portabilität, damit nicht jeder im Device jedesmal wieder alles ändern muss.

Die Statistik Werte für das Vorjahr kommen aus einem DbRep Device, was Du später mal einrichten kannst. Das macht eh erst Sinn, wenn es ein volles Jahr in der Datenbank gibt.
Mit DbRep kann man auch später extrem viele Reports oder Vergleiche anfertigen, da mir MySQL fast alles möglich ist, bis hin zu komplexen Berechnungen direkt in der Datenbank.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 29 Dezember 2021, 21:22:36
Zitat von: ch.eick am 29 Dezember 2021, 10:24:13

Für den aller ersten Start des Konstruktes müsstest Du die readings einmal für Day, Month und Year mit Deinen Werten vom KSEM setzen. Das kann man auch etwas schätzen,
bis die Statistiken richtig passen und mit dem nächsten 1. des Monats werden dann alle richtig gesetzt. Du hast auch die Ehre einen Jahres Wechsel zu haben :-)


;D  :o der war gut.. klingt logisch, wenn man weis wovon man spricht... Wo müssen denn diese readingwerte gesetzt werden?
ZitatDay, Month und Year mit Deinen Werten vom KSEM
Das soll das Installationsdatum sein oder welches?

Genauso viel verstehe ich da:
ZitatWahrscheinlich hast Du das PV_Schedule Device noch nicht in Verwendung. Daraus brauchst Du das cmd_1 , cmd_4 und cmd_5.
Bei cmd_1 kannst Du erstmal das Schattenmanagement entfernen.
Wo soll ich das Schattenmamagement entfernen? Mienst du bevor ich set cmd1 durchführe soll ich im WR das Schattenmanagement ausschalten? Kapiere nix.

und zwischendurch noch eine Frage zum LogDB...

Ist es okay wenn ich in der def nur "./db.conf WR_1" drin habe? Oder muss unbedingt "./db.conf .*:.*" drin stehen? Also ich brauche nix loggen, habe es nur für den Plenticore erstellt...

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 Dezember 2021, 23:48:47
Zitat von: misux am 29 Dezember 2021, 21:22:36
;D  :o der war gut.. klingt logisch, wenn man weis wovon man spricht... Wo müssen denn diese readingwerte gesetzt werden? Das soll das Installationsdatum sein oder welches?

Genauso viel verstehe ich da: Wo soll ich das Schattenmamagement entfernen? Mienst du bevor ich set cmd1 durchführe soll ich im WR das Schattenmanagement ausschalten? Kapiere nix.
Hier findest Du ein DOIF mit dem Namen PV_Schedule (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Timeing_f.C3.BCr_die_PV_extra_Funktionen) .
Damit werden die Statistiken und noch einige andere Funktionalitäten regelmäßig ausgeführt.

Hier habe ich Dir mal eine abgespeckte Version für einen WR gemacht.
Das cmd_5 wird jeden Tag um 00:01 ausgeführt und sichert die Zählerstände vom KSEM im WR_1_API Device.

defmod PV_Schedule DOIF ################################################################################################################\
## 1 Plenticore Status aktualisieren. Dies geschieht über das PV_Anlage_1_API Device\
##\
([:57])\
\
   (get WR_1_API 20_Statistic_EnergyFlow)\
\
################################################################################################################\
## 2 PV Prognose vom aktuellen Tag aktualisieren\
##     zwischen 5 und 21 Uhr zur vollen Stunde\
DOELSEIF\
([05:00-21:00] and [:00])\
\
   ({Solar_forecast("LogDB","LogDBRep_PV_Forecast_SQL","WR_1","Solar_Calculation_fc","DWD_Forecast",0)})\
\
################################################################################################################\
## 3 PV Prognose für den nächsten Tag aktualisieren\
## \
DOELSEIF\
([06:55] or [19:11])\
\
   ({Solar_forecast("LogDB","LogDBRep_PV_Forecast_SQL","WR_1","Solar_Calculation_fc","DWD_Forecast",1)})\
\
################################################################################################################\
## 4 regelmäßig die Bilanz aktualisieren, alle 5 Minuten außer um :00\
##\
DOELSEIF\
([+:05] and ![:00])\
\
  (get WR_1_API 04_auth_me)\
\
################################################################################################################\
## 5 Jeden Morgen die Zählerstände aktualisieren, damit im Schwarm die Statistiken berechnet werden können\
##\
##    ## **** sind z.B. meine ersten Zählerwerte, die ich beim aller ersten mal gesetzt hatte\
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\
        }\
     }\
  }\
)\
\

attr PV_Schedule DbLogExclude .*
attr PV_Schedule alias PV_Schedule
attr PV_Schedule cmdState WR Status|Forecast 0|Forecast 1|Bilanz refresh
attr PV_Schedule comment Version 2021.04.19 12:00
attr PV_Schedule do always
attr PV_Schedule room Strom->Photovoltaik
attr PV_Schedule sortby 11
attr PV_Schedule verbose 0
attr PV_Schedule wait 0,3:0:0:0
attr PV_Schedule webCmd cmd_1:cmd_2:cmd_3:cmd_4
attr PV_Schedule webCmdLabel Statistic :Forecast_0 :Forecast_1 :Bilanz :

mit einem Kommando in der FHEM Kommando Zeile kannst Du die initial Werte vom Dezember noch rückwirkend setzen und so die Statistiken für Dezember korrigieren.
Am 01.01.2022 werden dann alle Werte automatisch gesetzt und dann täglich und monatlich weiter geführt.

setreading WR_1_API SW_Meter_init_FeedInGrid_Month [nnnn]

*_Day muss den Zähterwert von morgens haben
*_Month muss den Zähterwert von morgens am 01. des Monats haben
*_Year muss den Zählerwert von morgens am 01.01. des Jahres haben

Das WR_0_KSEM Device sollte dafür natürlich auch aktiv sein.

Zitat
und zwischendurch noch eine Frage zum LogDB...

Ist es okay wenn ich in der def nur "./db.conf WR_1" drin habe? Oder muss unbedingt "./db.conf .*:.*" drin stehen? Also ich brauche nix loggen, habe es nur für den Plenticore erstellt...
Damit kenne ich mich nicht so genau aus, aber nur das WR_1 wird nicht ausreichen.
Normalerweise aktiviert man das Logging für alles und kann bei neuen Devices ein "DbLogExclude .*" in jedem Device erzeugen lassen.
Schau da bitte nochmal beim DbLog nach oder schreib die Frage in den DbLog Thread.
Ansonsten könnte im Moment besser passen, jedoch habe ich noch viele andere Devices, falls Du Dich da auch bedienen möchtest.

"./db.conf WR_1.*:.*"

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 30 Dezember 2021, 00:57:44
Zitat von: ch.eick am 29 Dezember 2021, 23:48:47

Das WR_0_KSEM Device sollte dafür natürlich auch aktiv sein.


OKay, DOIF habe ich angelegt. in deinem Code ist n kleiner Fehler... Hat ein bisschen gedauert, aber ich habs gefunden... ;D
im
## 5 Jeden Morgen die Zählerstände aktualisieren, damit im Schwarm die Statistiken berechnet werden können\
##\
##\    ## **** sind z.B. meine ersten Zählerwerte, die ich beim aller ersten mal gesetzt hatte
DOELSEIF\
([00:01])\

fehlte hinter " gesetzt hatte..." \
##\
und dann das DOELSEIF

Hab n Error bekommen das DOELSEIF nicht kennt oder so...

Das KSEM habe ich angelegt und im Log bekomme ich:
2021.12.30 00:42:32 3: WR_0_KSEM: defined master with id 1, protocol TCP and interval 60, connection to 192.168.1.41:502
2021.12.30 00:42:32 3: Opening WR_0_KSEM device 192.168.1.41:502
2021.12.30 00:42:32 1: WR_0_KSEM: Can't connect to 192.168.1.41:502: 192.168.1.41: Verbindungsaufbau abgelehnt (111)
2021.12.30 00:42:33 3: WR_0_KSEM: attr disable removed


Da muss doch bestimmt noch irgendwo die Zugangsdaten hinterlegt werden... Finde aber in der Wiki nirgens eine info drüber...

UNd püktlich um 00:57 hab ich einen Logfile eintrag bekommen:
2021.12.30 00:57:00 1: PERL WARNING: Argument "Error evaluating WR_1_API userReading SW_Statistic_Autar..." isn't numeric in sprintf at (eval 349668) line 40.
2021.12.30 00:57:00 3: eval:
my $calcVal=0;
my $WR="WR_1";
my $YearBefore='LogDBRep_Statistic_previous_Year';

my $pvt   = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",0) );
my $pvtd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Day",0)/1000 );
my $pvtm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Month",0)/1000 );
my $pvty  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_Yield_Year",0)/1000, ReadingsVal("$YearBefore","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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Day",0)/1000 );
my $pvm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Month",0)/1000 );
my $pvy  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomePv_Year",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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Day",0)/1000 );
my $gfim = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Month",0)/1000 );
my $gfiy = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyFeedInGrid_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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Day",0)/1000 );
my $ebm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Month",0)/1000 );
my $eby  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomeGrid_Year",0) );

my $pvb   = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0));
my $pvbd  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Day",0)/1000 );
my $pvbm  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Month",0)/1000 );
my $pvby  = sprintf("%05d / %05d",ReadingsVal("$name","Statistic_EnergyHomeBat_Year",0)/1000, 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 kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Day",0)/1000 );
my $etm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Month",0)/1000 );
my $ety  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Year",0)/1000, ReadingsVal("$YearBefore","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))));
my $cy   = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Year",0))));

"<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</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</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Jahr / 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>"


:o :-[ :-X
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Dezember 2021, 10:12:42
Zitat von: misux am 30 Dezember 2021, 00:57:44
OKay, DOIF habe ich angelegt. in deinem Code ist n kleiner Fehler... Hat ein bisschen gedauert, aber ich habs gefunden... ;D
im
Hab n Error bekommen das DOELSEIF nicht kennt oder so...
Hab ich korrigiert...

Zitat
Das KSEM habe ich angelegt und im Log bekomme ich:
2021.12.30 00:42:32 3: WR_0_KSEM: defined master with id 1, protocol TCP and interval 60, connection to 192.168.1.41:502
2021.12.30 00:42:32 3: Opening WR_0_KSEM device 192.168.1.41:502
2021.12.30 00:42:32 1: WR_0_KSEM: Can't connect to 192.168.1.41:502: 192.168.1.41: Verbindungsaufbau abgelehnt (111)
2021.12.30 00:42:33 3: WR_0_KSEM: attr disable removed


Da muss doch bestimmt noch irgendwo die Zugangsdaten hinterlegt werden... Finde aber in der Wiki nirgends eine Info drüber...
Im KSEM muss man natürlich ModBus auch aktivieren :-) Siehe Bild unten, das wären dann alle Optionen und ich meine es wäre die Slave Aktivierung ganz unten im Bild.
Die Plenticore IP-Adressen (bei mir zwei Stück) brauchst Du in Deiner einfachen Konfiguration nicht, da der Plenticore ja wegen des Speichers mit rs485 verbunden ist.

Zitat
UNd püktlich um 00:57 hab ich einen Logfile Eintrag bekommen:
2021.12.30 00:57:00 1: PERL WARNING: Argument "Error evaluating WR_1_API userReading SW_Statistic_Autar..." isn't numeric in sprintf at (eval 349668) line 40.
2021.12.30 00:57:00 3: eval:
<...>
[/quote]
Komisch, da kommt bei mir nichts, eventuell weil es das erste mal gelaufen ist. Beobachte es mal, dann schau ich nächstes Jahr mal danach.
Das ist jedoch auch nur eine Warning, ich denke weil FHEM auch Zahlen als String ablegt und ich es als Zahl formatiere. Die Ausgabe sollte aber trotzdem korrekt sein.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 30 Dezember 2021, 17:22:54
 ;D JAU! Soweit sogut Alles eingerichtet und WR_0 ist connected.

Die Perlwarnung bekomme ich alle 5 Minuten und das Losfile wird mega zugebombt...
2021.12.30 09:30:00 1: PERL WARNING: Argument "Error evaluating WR_1_API userReading SW_Statistic_Autar..." isn't numeric in sprintf at (eval 456462) line 40.
2021.12.30 09:30:00 3: eval:
my $calcVal=0;
my $WR="WR_1";
my $YearBefore='LogDBRep_Statistic_previous_Year';

my $pvt   = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",0) );
my $pvtd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Day",0)/1000 );
my $pvtm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Month",0)/1000 );
my $pvty  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_Yield_Year",0)/1000, ReadingsVal("$YearBefore","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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Day",0)/1000 );
my $pvm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Month",0)/1000 );
my $pvy  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomePv_Year",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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Day",0)/1000 );
my $gfim = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Month",0)/1000 );
my $gfiy = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyFeedInGrid_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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Day",0)/1000 );
my $ebm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Month",0)/1000 );
my $eby  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomeGrid_Year",0) );

my $pvb   = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0));
my $pvbd  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Day",0)/1000 );
my $pvbm  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Month",0)/1000 );
my $pvby  = sprintf("%05d / %05d",ReadingsVal("$name","Statistic_EnergyHomeBat_Year",0)/1000, 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 kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Day",0)/1000 );
my $etm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Month",0)/1000 );
my $ety  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Year",0)/1000, ReadingsVal("$YearBefore","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))));
my $cy   = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Year",0))));

"<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</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</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Jahr / 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>"



Natürlich kommt was neues dazu:
Heute seit 10uhr stündlich im Log:
2021.12.30 10:00:00 1: ERROR evaluating {Solar_forecast("LogDB","LogDBRep_PV_Forecast_SQL","WR_1","Solar_Calculation_fc","DWD_Forecast",0)}: Undefined subroutine &main::Solar_forecast called at (eval 463761) line 1.

::) :-[
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Dezember 2021, 19:11:17
Zitat von: misux am 30 Dezember 2021, 17:22:54
;D JAU! Soweit sogut Alles eingerichtet und WR_0 ist connected.

Die Perlwarnung bekomme ich alle 5 Minuten und das Losfile wird mega zugebombt...
2021.12.30 09:30:00 1: PERL WARNING: Argument "Error evaluating WR_1_API userReading SW_Statistic_Autar..." isn't numeric in sprintf at (eval 456462) line 40.
2021.12.30 09:30:00 3: eval:
my $calcVal=0;
my $WR="WR_1";
my $YearBefore='LogDBRep_Statistic_previous_Year';

my $pvt   = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",0) );
my $pvtd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Day",0)/1000 );
my $pvtm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Month",0)/1000 );
my $pvty  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_Yield_Year",0)/1000, ReadingsVal("$YearBefore","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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Day",0)/1000 );
my $pvm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Month",0)/1000 );
my $pvy  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomePv_Year",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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Day",0)/1000 );
my $gfim = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Month",0)/1000 );
my $gfiy = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyFeedInGrid_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 kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Day",0)/1000 );
my $ebm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Month",0)/1000 );
my $eby  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomeGrid_Year",0) );

my $pvb   = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0));
my $pvbd  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Day",0)/1000 );
my $pvbm  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Month",0)/1000 );
my $pvby  = sprintf("%05d / %05d",ReadingsVal("$name","Statistic_EnergyHomeBat_Year",0)/1000, 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 kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Day",0)/1000 );
my $etm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Month",0)/1000 );
my $ety  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Year",0)/1000, ReadingsVal("$YearBefore","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))));
my $cy   = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Year",0))));

"<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</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</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Jahr / 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>"



Natürlich kommt was neues dazu:
Heute seit 10uhr stündlich im Log:
2021.12.30 10:00:00 1: ERROR evaluating {Solar_forecast("LogDB","LogDBRep_PV_Forecast_SQL","WR_1","Solar_Calculation_fc","DWD_Forecast",0)}: Undefined subroutine &main::Solar_forecast called at (eval 463761) line 1.

::) :-[
Dann nimm im PV_Schedule doch mal den Solar_forcast raus. Das machst Du doch noch nicht.

Bei der anderen Warning check mal den verbose Level in dem Device. Die Problemsuche kann ich erst nächste Woche machen .
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 01 Januar 2022, 14:57:26
Hallo zusammen,

mir ist heute zum Jahreswechsel folgendes aufgefallen
Die Vorjahreswerte fehlen irgendwie und die Berechnung scheint nicht zu passen.
Dabei habe ich auch gesehen, dass im Wiki unten bei Bilanz ein Bild angezeigt wird (https://wiki.fhem.de/w/images/1/10/Plenticore_Bilanz.png) welches anders aussieht als die obere Bilanz (https://wiki.fhem.de/w/images/c/cc/WR_1.PNG)
Ich habe die obere, wie bekomme ich die untere. Was müsste ich anpassen, habe ich etwas übersehen? Welche Daten müsste ich liefern, damit ihr mir helfen könnt?


Statistik vom 2022-01-01   aktuell   Heute   Monat   Jahr / Vorjahr
Erzeugung PV-Total   0582 W   0003 kWh   0003 kWh   00003 / 00000
Bezug von PV   0577 W   0002 kWh   0002 kWh   -0032 / 00000
Bezug ins Haus (Energieverbrauch)   0753 W   0010 kWh   0010 kWh   00818 / 00000
Bezug vom Netz   0171 W   0007 kWh   0007 kWh   00850 / 00000
Einspeisung ins Netz   0000 W   0000 kWh   0000 kWh   00035 / 00000
Autarkiequote   70 %   28 %   28 %   -4 %
Eigenverbrauchsquote   99 %   83 %   83 %   -943 %
Berechnet um   14:55   13:57   13:57   13:57

LG
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Januar 2022, 17:09:42
Zitat von: kaiman am 01 Januar 2022, 14:57:26
Hallo zusammen,

mir ist heute zum Jahreswechsel folgendes aufgefallen
Die Vorjahreswerte fehlen irgendwie und die Berechnung scheint nicht zu passen.
Das alte Jahr ist keine Berechnung, sondern eine Ausgabe aus einem DbRep Device.
Die Berechnungen schaue ich mir nächste Tage mal an.

Zitat
Dabei habe ich auch gesehen, dass im Wiki unten bei Bilanz ein Bild angezeigt wird (https://wiki.fhem.de/w/images/1/10/Plenticore_Bilanz.png) welches anders aussieht als die obere Bilanz (https://wiki.fhem.de/w/images/c/cc/WR_1.PNG)
Ich habe die obere, wie bekomme ich die untere. Was müsste ich anpassen, habe ich etwas übersehen? Welche Daten müsste ich liefern, damit ihr mir helfen könnt?
Das untere ohne die Vorjahres Zahlen ist das alte Bild, das entferne ich dann mal aus dem Wiki.
Dir fehlt nur das DbRep für das Vorjahr.

defmod LogDBRep_Statistic_previous_Year DbRep LogDB
attr LogDBRep_Statistic_previous_Year DbLogExclude .*
attr LogDBRep_Statistic_previous_Year allowDeletion 0
attr LogDBRep_Statistic_previous_Year comment Version 2021.09.23 15:00
attr LogDBRep_Statistic_previous_Year device WR_1_API
attr LogDBRep_Statistic_previous_Year reading Statistic_%Year  EXCLUDE=%Autarky%,%Rate%
attr LogDBRep_Statistic_previous_Year room System
attr LogDBRep_Statistic_previous_Year userExitFn splitReading .*:.*
attr LogDBRep_Statistic_previous_Year verbose 5

setstate LogDBRep_Statistic_previous_Year 2021-09-25 17:47:23 sqlCmd SELECT * FROM (SELECT TIMESTAMP,READING,cast(VALUE/1000 AS decimal(6)) AS VALUE 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') ORDER BY TIMESTAMP DESC ) AS x1 GROUP BY x1.READING
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 02 Januar 2022, 22:45:24
Hallo Christian,
die Werte von 2021 sind nicht im WR_1_API abgebildet worden. Scheint mir so als ob "LogDBRep_Statistic_previous_Year" nicht richtig ausgeführt wurde. Hab jetzt für die Jahreszahle ganz schräge Werte.
Kann ich das mit den Initialwerten für Day/Month/Year wieder reparieren? Nur - welche Werte soll ich da einsetzen?

Grüßle Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2022, 10:08:47
Zitat von: zwölfgang am 02 Januar 2022, 22:45:24
Hallo Christian,
die Werte von 2021 sind nicht im WR_1_API abgebildet worden. Scheint mir so als ob "LogDBRep_Statistic_previous_Year" nicht richtig ausgeführt wurde. Hab jetzt für die Jahreszahle ganz schräge Werte.
Kann ich das mit den Initialwerten für Day/Month/Year wieder reparieren? Nur - welche Werte soll ich da einsetzen?
Hallo Wolfgang,
wie im vorherigen Post bereits geschrieben, setze ich mich da diese Woche mal ran. Sorry für die Unannehmlichkeiten, das ist durch meine Aufrüstung zum Schwarm im März rein gekommen.

Das "LogDBRep_Statistic_previous_Year" wird bisher nicht automatisch gestartet. Es reicht das einmal im laufenden Jahr zu machen.
Wenn Ihr da in das Device geht könntet Ihr bitte mal ein "set LogDBRep_Statistic_previous_Year sqlCmd" über die pull down Menüs machen. Das SELECT sollte dabei selber erscheinen, wenn das nicht passiert tragt bitte folgendes SELECT neu ein

SELECT * FROM (SELECT TIMESTAMP,READING,cast(VALUE/1000 AS decimal(6)) AS VALUE 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') ORDER BY TIMESTAMP DESC ) AS x1 GROUP BY x1.READING

Da Ihr wahrscheinlich noch auf MariaDB seit und noch nicht eine Oracle MySQL Datenbank im Docker Container verwendet sollte das dann im Device  "LogDBRep_Statistic_previous_Year" die fehlenden readings erzeugen. Für die Oracle MySQL Datenbank gibt es aufgrund der massiven Weiterentwicklung noch eine Unstimmigkeit im SELECT , die ich noch nicht beseitigt habe.

Wer die Vorjahres Werte nicht im stateFormat haben möchte müsste in der HTML Tabelle die Anzeige entsprechend entfernen, solange ich an der korrekten Anzeige arbeite :-)

Das zweite Problem sind die "schrägen Werte", die ich mich jetzt mal genauer anschaue. Bitte etwas Geduld, ich laufe gerade erst noch warm ;-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 03 Januar 2022, 11:01:32
Zitat von: ch.eick am 03 Januar 2022, 10:08:47

Das "LogDBRep_Statistic_previous_Year" wird bisher nicht automatisch gestartet. Es reicht das einmal im laufenden Jahr zu machen.
Wenn Ihr da in das Device geht könntet Ihr bitte mal ein "set LogDBRep_Statistic_previous_Year sqlCmd" über die pull down Menüs machen. Das SELECT sollte dabei selber erscheinen, wenn das nicht passiert tragt bitte folgendes SELECT neu ein

SELECT * FROM (SELECT TIMESTAMP,READING,cast(VALUE/1000 AS decimal(6)) AS VALUE 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') ORDER BY TIMESTAMP DESC ) AS x1 GROUP BY x1.READING


Hallo meine Mitstreiter
Zuerst wünsche ich allen ein Frohes Neues Jahr und alles Gute. Auf viele angeregte Diskussionen!

Ich habe diesen Teil gestern automatisiert und ins DB_Service_Schedule mit einem neuen Zweig eingefügt:


## Jährliche Einträge
DOELSEIF
($md eq "01-01" and [08:05])
(set LogDBRep_Statistic_previous_Year sqlCmd SELECT * FROM (SELECT TIMESTAMP,READING,cast(VALUE/1000 AS decimal(6)) AS VALUE FROM history WHERE DEVICE='WR_1_API' AND READING LIKE 'Statistic_%Year' AND READING NOT LIKE '%Autarky%' AND READING NOT LIKE '%Rate%' 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') ORDER BY TIMESTAMP DESC ) AS x1 GROUP BY x1.READING)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2022, 11:11:47
Zitat von: Mumpitz am 03 Januar 2022, 11:01:32
Ich habe diesen Teil gestern automatisiert und ins DB_Service_Schedule mit einem neuen Zweig eingefügt:


## Jährliche Einträge
DOELSEIF
($md eq "01-01" and [08:05])
(set LogDBRep_Statistic_previous_Year sqlCmd SELECT * FROM (SELECT TIMESTAMP,READING,cast(VALUE/1000 AS decimal(6)) AS VALUE FROM history WHERE DEVICE='WR_1_API' AND READING LIKE 'Statistic_%Year' AND READING NOT LIKE '%Autarky%' AND READING NOT LIKE '%Rate%' 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') ORDER BY TIMESTAMP DESC ) AS x1 GROUP BY x1.READING)

Dir auch ein besonderes Hallo

Danke für die Mithilfe, das ganze ich mir wohl etwas zu schnell ins Wiki gerutscht, da ich zuerst noch testen wollte.
Das SELECT wird sich noch ändern, damit es mit den neuen MySQL Anforderungen zusammen passt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 03 Januar 2022, 11:21:10
Zitat von: ch.eick am 03 Januar 2022, 11:11:47
Dir auch ein besonderes Hallo

Danke für die Mithilfe, das ganze ich mir wohl etwas zu schnell ins Wiki gerutscht, da ich zuerst noch testen wollte.
Das SELECT wird sich noch ändern, damit es mit den neuen MySQL Anforderungen zusammen passt.

aber rückwärtskompatibel auf mariadb, oder?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2022, 12:44:49
Zitat von: Mumpitz am 03 Januar 2022, 11:21:10
aber rückwärtskompatibel auf mariadb, oder?
Ja, so soll es sein, oder halt eine Auswahl im Wiki dokumentiert.
Die MySQL Version bekommt man beim Anmelden an die Datenbank angezeigt und ist bei mir "Server version: 8.0.27 MySQL Community Server - GPL"

Oder im DbRep mit einem get auf svrinfo

SQL_DBMS_NAME MySQL
SQL_DBMS_VERSION 8.0.27

Der große Versionsunterschied zwischen MariaDB und dem MySQL Community Server sollte zum Nachdenken anregen, ob da mal ein Upgrade notwendig wäre.

Ich habe FHEM auf einem RPI4 mit 4Gb Ram in Docker laufen.
Das Upgrade lief sehr einfach, da ich mich quasi für eine Neuinstallation der Datenbank entschieden hatte.
Ich hatte eine MariaDB als 32 Bit auf arm laufen und dort einen export der Daten gemacht.
Vorher hatte ich einen zweiten Container erstellt und dort die MySQL Community Server Edition gestartet.
Dann natürlich die Initialisierung der Datenbank nach dem FHEM Wiki und den Import der Datensichung geladen. Zu dieser Zeit liefen bereits neue Daten parallel in die Datenbank.
Ein ganz wichtiger Vorteil ist, dass der Docker Container direkt vom Hersteller kommt und durch die Community gepflegt wird. Somit kommen auch wieder Sicherheitsupdates in die Datenbank.

Der geneigte Leser hat sicher bereits bemerkt, dass ich gleichzeitig beim Betriebsystem von 32 Bit auf 64 Bit gewechselt habe, was einen subjektiv besseren Performanceschub gebracht hat.
Das sollte man jedoch vorher noch etwas besser planen :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2022, 13:28:16
Hallo zusammen,
hier kommt schon mal ein kleiner work around, der ja bereits auch angefragt wurde.

Die ursache der falschen Jahres Werte liegt an den nicht geschriebenen readings für *_init_*Year , die Ihr jetzt einfach mit dem Wert vom Monat setzen könnt, da ja gerade Januar ist.

setreading WR_1_API SW_Meter_init_Grid_Year 6134
setreading WR_1_API SW_Meter_init_FeedInGrid_Year 16535


Eigentlich sollte es durch das PV_Schedule um [00:01] gesetzt worden sein.
EDIT: Hier schon korrigiert, damit nicht die fehler so oft geposted werden.

################################################################################################################
## 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 0)
        {
         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
        }
     }
  }
)

Bis zum "$mday eq 1" wurde es auch durchlaufen, jedoch hat das "$yday eq 1" nicht ausgelöst, wodurch diese beiden Werte nicht gesetzt wurden.
Ein kurzes Suchen im FHEM Forum und schon findet man Ottos Erklärung, danke dafür.
Der 1.1. ist in $yday 0 (https://forum.fhem.de/index.php/topic,95162.0.html)

Bitte korrigiert also das "$yday eq 1" in "$yday eq 0" . Das testen wir dann in einem Jahr nochmal :-) :-) :-)

Sobald der Plenticore dann die Statistiken fortgeschrieben hat sollte alles wieder gut sein.
Das Vorjahr ist bei mir noch leer, da das SELECT auf die aktuelle MySQL Version noch umgeschrieben werden muss.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 03 Januar 2022, 14:17:03
Hallo zusammen,

ich habe gerade mal die Vorjahreswerte mit

setreading WR_1_API SW_Meter_init_Grid_Year xxx
setreading WR_1_API SW_Meter_init_FeedInGrid_Year yyy


eingetragen, somit passen die aktuellen Werte schon wieder ;)

DANKE euch!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2022, 14:56:31
Zitat von: kaiman am 03 Januar 2022, 14:17:03
Hallo zusammen,

ich habe gerade mal die Vorjahreswerte mit

setreading WR_1_API SW_Meter_init_Grid_Year xxx
setreading WR_1_API SW_Meter_init_FeedInGrid_Year yyy


eingetragen, somit passen die aktuellen Werte schon wieder ;)
Wie ich gerade geschrieben habe müsstest Du auch bitte das PV-Schedule korrigieren.
Ich denke die Vorjahres Zähler Werte sind gleich mit denen um 00:01 und somit passt das, ohne in der Datenbank nachzuschauen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 03 Januar 2022, 15:00:50
Zitat von: ch.eick am 03 Januar 2022, 14:56:31
Wie ich gerade geschrieben habe müsstest Du auch bitte das PV-Schedule korrigieren.
Ich denke die Vorjahres Zähler Werte sind gleich mit denen um 00:01 und somit passt das, ohne in der Datenbank nachzuschauen.

ja den PV Schedule hab ich auch korrigiert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 04 Januar 2022, 10:29:57
Hallo ich wieder!

Erstens, vielen Dank an @ch.eick für das tolle Modul und seine Unterstützung! Hat mir wirklich sehr geholfen.

Nun eine Frage und vielleicht ein Verbesserungsvorschlag:

Wäre es machbar in die WR_1_API Tabelle noch den Quartal als Übersicht zu integrieren?
Wir müssen unsere Umsatzsteuervoranmeldunggedöns Quartalsweise abgeben und das wäre ja eine feine Sache wenn man es dort einfach ablesen könnte...
Vielleicht geht es den einem oder anderem genauso..
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Januar 2022, 11:24:19
Zitat von: misux am 04 Januar 2022, 10:29:57
Nun eine Frage und vielleicht ein Verbesserungsvorschlag:

Wäre es machbar in die WR_1_API Tabelle noch den Quartal als Übersicht zu integrieren?
Wir müssen unsere Umsatzsteuervoranmeldunggedöns Quartalsweise abgeben und das wäre ja eine feine Sache wenn man es dort einfach ablesen könnte...
Vielleicht geht es den einem oder anderem genauso..
Moin in den Norden :-)
Da das nicht direkt vom Plenticore so angeboten wird wäre das eher etwas für eine Datenbank Auswertung, wie wir es zufällig gestern schon besprochen hatten.
Die Auswertung würde dann alle drei Monate gestartet werden und das vor Quartal auswerten, so wie ich es mit dem Vorjahr ähnlich implementiert habe.
Zufällig würden sich die Quartale ja auch etwas mit den Jahreszeiten annähern, wodurch da auch ein schöner Überblick entstehen würde.

Ich fange mal an in SQL zu denken :-) :-)
Puh, das wird sicher etwas länglicher...

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Januar 2022, 12:20:10
Und nochmal hallo

für die Jahres Auswertung im WR_1_API habe ich jetzt mal das SELECT modifiziert, damit es mit der MySQL Community Server Edition und den schärferen Anforderungen im GROUP BY zurecht kommt.
Würdet Ihr das dann bitte mal mit MariaDB testen? Also entweder direkt als SQL in der Datenbank oder im LogDBRep_Statistic_previous_Year Device, was dann auch das ergebnis im WR_1_API nach einem Device Update anzeigen sollte.

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 'Statistic_%Year' )
    AND READING NOT LIKE '%Autarky%'
    AND READING NOT LIKE '%Rate%'
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;
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 04 Januar 2022, 18:27:31
Aber die Werte zaubert er doch nicht automatisch in die Tabelle im FHEM... Oder? Ich meine, da muss doch bestimmt die tabelle brutal im stateFormat angepasst werden damit die Spalte "letztes Quartal" existiert... Oder mit der Überschrift Q1 am 01.03, Q2 am 01.06, Q3 am 01.09, Q4 am 01.01 oder am 31.12..

Also wie auf dem Bild zwischen Monat und Jahr...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Januar 2022, 19:13:32
Zitat von: misux am 04 Januar 2022, 18:27:31
Aber die Werte zaubert er doch nicht automatisch in die Tabelle im FHEM... Oder? Ich meine, da muss doch bestimmt die tabelle brutal im stateFormat angepasst werden damit die Spalte "letztes Quartal" existiert... Oder mit der Überschrift Q1 am 01.03, Q2 am 01.06, Q3 am 01.09, Q4 am 01.01 oder am 31.12..

Also wie auf dem Bild zwischen Monat und Jahr...
Da überlege ich noch, denn dann würde die Tabelle viel breiter werden.
Es stellt sich auch die Frage, ob alle Quartale in der Tabelle dargestellt werden müssten.
Oder eventuell nur das letzte, oder rollierend?
Ich habe da noch keine Idee.
Das DbRep Device, dass das letzte Quartal liefert, hätte ich schon fertig.

Es wäre schön, wenn Ihr Euch mal Gedanken über die Darstellung macht und das eventuell einfach als Skizze abfotographiert und mir zuschickt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 04 Januar 2022, 22:40:15
ZitatOder eventuell nur das letzte, oder rollierend?

Ja so war mein Gedanke, denn eigentlich ist nur das das wichtige...

Also nur das letzte Quartal rotierend zwischen Monat und Jahr. Das passt locker von Platz her ;)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Januar 2022, 22:58:58
Zitat von: misux am 04 Januar 2022, 22:40:15
Ja so war mein Gedanke, denn eigentlich ist nur das das wichtige...

Also nur das letzte Quartal rotierend zwischen Monat und Jahr. Das passt locker von Platz her ;)
Na dann schau ich mal... ;-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 06 Januar 2022, 09:40:34
Zitat von: ch.eick am 04 Januar 2022, 12:20:10
Und nochmal hallo

für die Jahres Auswertung im WR_1_API habe ich jetzt mal das SELECT modifiziert, damit es mit der MySQL Community Server Edition und den schärferen Anforderungen im GROUP BY zurecht kommt.
Würdet Ihr das dann bitte mal mit MariaDB testen? Also entweder direkt als SQL in der Datenbank oder im LogDBRep_Statistic_previous_Year Device, was dann auch das ergebnis im WR_1_API nach einem Device Update anzeigen sollte.

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 'Statistic_%Year' )
    AND READING NOT LIKE '%Autarky%'
    AND READING NOT LIKE '%Rate%'
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;


ich hab den SQL mal im LogDBRep_Statistic_previous_Year laufen lassen und bekomme dort auch

Ausgaben als Readings

SqlResultRow_01
   
TIMESTAMP|READING|VALUE
   
2022-01-06 09:38:14
SqlResultRow_02
   
2021-12-31 23:57:03|Statistic_EnergyHome_Year|667
   
2022-01-06 09:38:14
SqlResultRow_03
   
2021-12-31 23:57:03|Statistic_EnergyHomeBat_Year|0
   
2022-01-06 09:38:14
SqlResultRow_04
   
2021-12-31 23:57:03|Statistic_EnergyHomeGrid_Year|529
   
2022-01-06 09:38:14
SqlResultRow_05
   
2021-12-31 23:57:03|Statistic_EnergyHomePv_Year|137
   
2022-01-06 09:38:14
SqlResultRow_06
   
2021-12-31 23:57:03|Statistic_EnergyPv1_Year|139
   
2022-01-06 09:38:14
SqlResultRow_07
   
2021-12-31 23:57:03|Statistic_EnergyPv2_Year|46
   
2022-01-06 09:38:14
SqlResultRow_08
   
2021-12-31 23:57:03|Statistic_Yield_Year|172
   
2022-01-06 09:38:14
SqlResultRow_09
   
2021-12-31 23:57:03|Statistic_EnergyHomePvSum_Year|137
   
2022-01-06 09:38:14
SqlResultRow_10
   
2021-12-31 23:57:03|Statistic_EnergyFeedInGrid_Year|35
   
2022-01-06 09:38:14
SqlResultRow_11
   
2021-12-31 23:57:03|Statistic_TotalConsumption_Year|667
   
2022-01-06 09:38:14
SqlResultRow_12
   
2021-12-31 23:57:03|Statistic_Yield_NoBat_Year|172

Nur im WR_1_API erscheint davon irgendwie nichts, habe ich noch etwas vergessen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Januar 2022, 12:20:36
Zitat von: kaiman am 06 Januar 2022, 09:40:34
ich hab den SQL mal im LogDBRep_Statistic_previous_Year laufen lassen und bekomme dort auch

Nur im WR_1_API erscheint davon irgendwie nichts, habe ich noch etwas vergessen?
Danke für den Test.
Die Report readings bleiben im LogDBRep_Statistic_previous_Year Device, das nur einmal am anfang des Jahres ausgeführt werden müsste.
Ich habe auch ein Beispiel mit einer zusätzlichen Jahressumme für z.B. eine WallBox, was ich auch ganz spannend finde.

Die Anzeige wird im WR_1_API Device im stateFormat aufbereitet. Dort solltest Du in der "Jahr/Vorjahr" Spalte die Werte sehen. Ansonsten müsstest Du das stateFormat aus dem Wiki aktualisieren.

Momentan arbeite ich noch an den Quartals Zahlen, die dann später in der Monats Spalte angezeigt werden. Also immer schön mitlesen :-)
Der DbRep Aufruf arbeitet bereits ganz gut und liefert alle vier vorherigen Quartale. Das vorherige wird dann mit "previous" gekennzeichnet, damit man das Rollieren für eine Anzeige umsetzen kann.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 06 Januar 2022, 17:54:37
Zitat von: ch.eick am 04 Januar 2022, 12:20:10
Und nochmal hallo

für die Jahres Auswertung im WR_1_API habe ich jetzt mal das SELECT modifiziert, damit es mit der MySQL Community Server Edition und den schärferen Anforderungen im GROUP BY zurecht kommt.
Würdet Ihr das dann bitte mal mit MariaDB testen? Also entweder direkt als SQL in der Datenbank oder im LogDBRep_Statistic_previous_Year Device, was dann auch das ergebnis im WR_1_API nach einem Device Update anzeigen sollte.


Hallo
Bei mir funktioniert die Abfrage in mariaDB ebenfalls problemlos. Habe es direkt auf der Datenbank gemacht
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 06 Januar 2022, 19:13:37
ZitatUnd nochmal hallo

für die Jahres Auswertung im WR_1_API habe ich jetzt mal das SELECT modifiziert, damit es mit der MySQL Community Server Edition und den schärferen Anforderungen im GROUP BY zurecht kommt.
Würdet Ihr das dann bitte mal mit MariaDB testen? Also entweder direkt als SQL in der Datenbank oder im LogDBRep_Statistic_previous_Year Device, was dann auch das ergebnis im WR_1_API nach einem Device Update anzeigen sollte.

Mit der MariaDB hat das bei mir einwandfrei funktioniert. Habe das SELECT im LogDBRep_Statistic_previous_Year Device mit sqlCmd ausgeführt. Daten tauchen dann auch in der aktuellen WR_1_API perfekt auf.
Danke Christian.

Grüßle Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 07 Januar 2022, 11:22:45
Zitat von: ch.eick am 06 Januar 2022, 12:20:36
Danke für den Test.
Die Report readings bleiben im LogDBRep_Statistic_previous_Year Device, das nur einmal am anfang des Jahres ausgeführt werden müsste.
Ich habe auch ein Beispiel mit einer zusätzlichen Jahressumme für z.B. eine WallBox, was ich auch ganz spannend finde.

Die Anzeige wird im WR_1_API Device im stateFormat aufbereitet. Dort solltest Du in der "Jahr/Vorjahr" Spalte die Werte sehen. Ansonsten müsstest Du das stateFormat aus dem Wiki aktualisieren.

VG
   Christian

Danke für den Tip, aber irgendwie stehe ich auf dem Schlauch, ich habe den stateFormat aus dem Wiki, aber ich bekomme nur 0000 angezeigt.

Meine Readings heißen in der LogDBRep_Statistic_previous_Year alle SqlResultRow_01 bis 12. Passt das so?

Ich glaube der stateFormat im WR_1_API findet die Einträge nicht?

Gruß
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Januar 2022, 14:01:56
Zitat von: kaiman am 07 Januar 2022, 11:22:45
Danke für den Tip, aber irgendwie stehe ich auf dem Schlauch, ich habe den stateFormat aus dem Wiki, aber ich bekomme nur 0000 angezeigt.

Meine Readings heißen in der LogDBRep_Statistic_previous_Year alle SqlResultRow_01 bis 12. Passt das so?

Ich glaube der stateFormat im WR_1_API findet die Einträge nicht?

Gruß
Nein, dass passt so noch nicht

Im LogDBRep_Statistic_previous_Year  wird mit diesem Aufruf die Funktion splitReading aus der 99_myUtils aufgerufen, die wohl bei Dir noch fehlt.
userExitFn splitReading .*:.*

Dadurch werden die SqlResultRow_* in lesbare readings verwandelt.


Zusätzlich scheinst Du den Wechsel zu den SW_* userreadings nicht nachvollzogen zu haben, was jetzt und in Zukunft mehrarbeit bedeuten würde.
Im LogDBRep_Statistic_previous_Year Device wird im SQL SELECT nach 'SW_Statistic_%Year' gefiltert und nicht nach 'Statistic_%Year' . Bitte prüf das auch mal.

Generell sollten alle SW_* readings auch bei Betreibern mit nur einem WR funktionieren, dies erleichtert die Pflege der Devices insbesondere des stateFormat ernorm.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Januar 2022, 14:10:49
Hier nochmal der Link für die LogDBRep_Statistic_previous_Year Implementierung, da das noch nicht im Wiki ist :-(
LogDBRep_Statistic_previous_Year (https://forum.fhem.de/index.php/topic,114849.msg1176165.html#msg1176165)

Achtung für alle die, die es bereits implementiert haben.
Die Funktion splitReading() hat sich geringfügig geändert, da der Filter nicht für die Quartalsabfragen, die ich gerade erstell gepasst hat.
Bitte korrigiert das schonmal.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Januar 2022, 15:25:09
Ich was fleißig und habe hier schonmal eine Vorschau für die Quartalsabfrage:

READINGS:
     2021-03-31 23:59:00   Q1             
     2021-03-31 23:59:00   Q1_Statistic_EnergyHomeBat 283
     2021-06-30 23:59:00   Q2             
     2021-06-30 23:59:00   Q2_Statistic_EnergyHomeBat 393
     2021-09-30 23:59:00   Q3             
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyHome 1623
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyHomeFeedInGrid 4797
     2021-09-30 23:59:00   Q3_SW_Statistic_EnergyHomeGrid 16
     2021-09-30 23:59:00   Q3_SW_Statistic_TotalConsumption 1623
     2021-09-30 23:59:00   Q3_SW_Statistic_Yield 6404
     2021-09-30 23:59:00   Q3_Statistic_EnergyHomeBat 421
     2021-12-31 23:59:00   Q4              previous
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyHome 2583
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyHomeFeedInGrid 511
     2021-12-31 23:59:00   Q4_SW_Statistic_EnergyHomeGrid 1378
     2021-12-31 23:59:00   Q4_SW_Statistic_TotalConsumption 2583
     2021-12-31 23:59:00   Q4_SW_Statistic_Yield 1716
     2021-12-31 23:59:00   Q4_Statistic_EnergyHomeBat 330

Q1 und Q2 hatte ich noch keinen Schwarm, weshalb die Werte nicht angezeigt werden. Wenn man die auch haben möchte, müsste man noch etwas in der Datenbank aufräumen.

Da es sich um rollierende Quartale handelt wird mit dem Eintrag "Q* previous" das letzte Quartal markiert. Alle anderen müssten dann in umgekehrter Reihenfolge davor gelesen werden.

Beispiel:
2022-03-31 wird in einiger Zeit das vorherige Quartal sein.
Somit ergibt sich die Verarbeitsreihenfolge: Q1 previos , Q4, Q3, Q2

Ich baue jetzt das "previous" Quartal ins stateFormat von WR_1_API ein.

Stay tuned
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 07 Januar 2022, 15:51:55
Zitat von: ch.eick am 07 Januar 2022, 14:01:56
Nein, dass passt so noch nicht

Im LogDBRep_Statistic_previous_Year  wird mit diesem Aufruf die Funktion splitReading aus der 99_myUtils aufgerufen, die wohl bei Dir noch fehlt.
userExitFn splitReading .*:.*

Dadurch werden die SqlResultRow_* in lesbare readings verwandelt.


Zusätzlich scheinst Du den Wechsel zu den SW_* userreadings nicht nachvollzogen zu haben, was jetzt und in Zukunft mehrarbeit bedeuten würde.
Im LogDBRep_Statistic_previous_Year Device wird im SQL SELECT nach 'SW_Statistic_%Year' gefiltert und nicht nach 'Statistic_%Year' . Bitte prüf das auch mal.

Generell sollten alle SW_* readings auch bei Betreibern mit nur einem WR funktionieren, dies erleichtert die Pflege der Devices insbesondere des stateFormat ernorm.

Danke für die schnelle Hilfe. Stimmt ich hatte "nur" das Wiki abgearbeitet. Jetzt werden die Werte angezeigt.
Das mit den Readings muss ich noch prüfen, aber ich glaube die Werte passen schon mal ...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Januar 2022, 17:05:51
Zitat von: kaiman am 07 Januar 2022, 15:51:55
Danke für die schnelle Hilfe. Stimmt ich hatte "nur" das Wiki abgearbeitet. Jetzt werden die Werte angezeigt.
Das mit den Readings muss ich noch prüfen, aber ich glaube die Werte passen schon mal ...
Die Werte sind okay, jedoch die Namen sind ohne SW_* , wenn Du nur einen WR hast, solltest Du besser die SW_* belassen, da alles was jetzt kommen wird darauf aufbaut.
Mit nur einem WR sollten die SW_* gleich den Namen ohne SW_* sein.

In Zukunft werden sicherlich immer mehr Wünsche nach Reports kommen und da müsste man ansonsten jedes mal wieder umbauen, oder es kommt zu Missverständnissen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 07 Januar 2022, 17:19:40
Klingt pervers, sieht pervers aus und ist auch pervers! Sehr geil! 8) ;D
Bin gespannt...

Hatte bis jetzt keine Zeit weiter zu machen, habe nun heute meine Umsatzsteuervoranmeldung für 21Q4 gemacht und weiß jetzt wo cih meine Werte her bekomme... mehr habe ich nicht, aber die könnte cih dann ins Fhem eintragen sodass ich es sehen kann ob meine Rechnung auch passt...

Vielen Dank schon mal!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Januar 2022, 21:01:46
Zitat von: misux am 07 Januar 2022, 17:19:40
Klingt pervers, sieht pervers aus und ist auch pervers! Sehr geil! 8) ;D
Bin gespannt...

Hatte bis jetzt keine Zeit weiter zu machen, habe nun heute meine Umsatzsteuervoranmeldung für 21Q4 gemacht und weiß jetzt wo ich meine Werte her bekomme... mehr habe ich nicht, aber die könnte ich dann ins Fhem eintragen sodass ich es sehen kann ob meine Rechnung auch passt...
Du hast ja den Kontakt ;-)

Die Funktion splitReading() musst Du auch schon man einbauen. Die Solar_* Funktionen nur wenn Du in die Richtung mit möchtest.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Januar 2022, 17:23:27
Und schon kommt eine grafische Vorschau, bei der Ihr gerne noch Wünsche äußern könnt.
Ich habe es auch etwas variabel gestaltet, sodaß die Quartals- und die Vorjahres Ergänzung nur erscheint, wenn die entsprechenden DbRep auch vorhanden sind.
Wer also keine Quartals Werte sehen möchte könnte den Report einfach weg lassen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Januar 2022, 14:08:13
Hallo zusammen,
hier kommt schon mal das stateFormat für WR_1_API, es sollte die Jahres Werte jetzt mit Jahreszahl in der unterst Zeile Anzeigen.
Die Quartalsergenzung wird erst angezeigt, wenn auch das LogDBRep_Statistic_previous_Quarter Device eingerichtet ist. Da bin ich mit Heiko noch an einem DbRep Patch beschäftigt, der die SQL Umsetzung noch etwas flexibler gestatet.

{
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_Year",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("%3d %%",ReadingsVal("$name","SW_Statistic_Autarky_Day",0) );
my $aqm   = sprintf("%3d %%",ReadingsVal("$name","SW_Statistic_Autarky_Month",0) );
my $aqy   = sprintf("%3d %%",ReadingsVal("$name","SW_Statistic_Autarky_Year",0) );
    $aqy  .= ($YearPrevious ne "0") ? sprintf(" / %3d %%", ReadingsVal("$YearBefore","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) );
    $sqy  .= ($YearPrevious ne "0") ? sprintf(" / %3d %%", ReadingsVal("$YearBefore","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>"
}


Für das DbRep Device solltet Ihr mindestens die FVERSION 93_DbRep.pm:v8.43.0-s24929/2021-09-06 haben, was Ihr schon mal nachschauen könntet.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 09 Januar 2022, 17:57:40
Hi Christian,
habe grad mal das stateformat für das WR_1_API eingebaut. Die Vorjahreszahlen sind jetzt verschwunden, unten steht auch 2022.
Als DbRep Version habe ich "93_DbRep.pm 25414 2022-01-03 21:05:38Z DS_Starter" vorgefunden, sollte aktuell sein.
Habe ich da noch was übersehen was ich noch nachziehen muss? Oder bin ich mal wieder zu ungeduldig.

Grüßle Wolfgang

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Januar 2022, 18:34:04
Zitat von: zwölfgang am 09 Januar 2022, 17:57:40
Hi Christian,
habe grad mal das stateformat für das WR_1_API eingebaut. Die Vorjahreszahlen sind jetzt verschwunden, unten steht auch 2022.
Als DbRep Version habe ich "93_DbRep.pm 25414 2022-01-03 21:05:38Z DS_Starter" vorgefunden, sollte aktuell sein.
Habe ich da noch was übersehen was ich noch nachziehen muss? Oder bin ich mal wieder zu ungeduldig.

Grüßle Wolfgang
Hallo Wolfgang,

stehen denn die Daten von 2021 im LogDBRep_Statistic_previous_Year Device?
Dort müssen sie mir WR_* drin stehen, nur Statistic_EnergyHomeBat_Year hat kein WR_ davor, da es das im Schwarm nicht gibt.

Bei der DbRep Version hat Heiko bereits aufgeräumt, wie im DbRep Thread geschrieben, somit ist die schon neuer wie bei mir.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2022, 11:18:56
Hallo zusammen,
Heiko wird morgen eine neue Version des DbRep einstellen, was dann die Attrikute device und reading in den sqlcmd unterstützen wird. Das verwende ich bei mir bereits seit längerem als eigenen Patch, weshalb es bei unseren Statistik Reports zu etwas durcheinander gekommen ist.

LogDBRep_Statistic_previous_Year ohne das SELECT !
Das SELECT tragt Ihr bitte beim ersten sqlcmd händisch ein, damit Ihr es auch als Sicherung, formatiert in eine Text Datei wegschreiben könnt. Dadurch ist es dann auch lesbarer, denn nach dem Aufruf vom LogDBRep_Statistic_previous_Year ist es nur noch ein Bandwurm ;-)

defmod LogDBRep_Statistic_previous_Year DbRep LogDB
attr LogDBRep_Statistic_previous_Year DbLogExclude .*
attr LogDBRep_Statistic_previous_Year allowDeletion 0
attr LogDBRep_Statistic_previous_Year comment Version 2022.01.11 11:00
attr LogDBRep_Statistic_previous_Year device WR_1_API
attr LogDBRep_Statistic_previous_Year reading SW_Statistic%_Year,Statistic_EnergyHomeBat_Year EXCLUDE=%NoBat%,%EnergyPv%
attr LogDBRep_Statistic_previous_Year room System
attr LogDBRep_Statistic_previous_Year userExitFn splitReading .*:.*
attr LogDBRep_Statistic_previous_Year verbose 0


Bitte aktualisiert auch die splitReading() Funktion, wenn Ihr das noch nicht gemacht habt.

Hier jetzt das SQL SELECT für LogDBRep_Statistic_previous_Year mit den neuen Attribut Variablen

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
;


EDIT: Ab heute 2022.01.11 ist das DbRep im normalen FHEM update enthalten
Für die ganz eiligen kann man bei Heiko auch direkt das Test DbRep runter laden

"wget -qO ./FHEM/93_DbRep.pm https://svn.fhem.de/fhem/trunk/fhem/contrib/DS_Starter/93_DbRep.pm"
[/u]

Noch eine wichtige Info wäre, dass sich die SQL SELECT und auch das WR_1_API stateFormat auf die SW_* readings beziehen. Falls Ihr also nicht immer wieder alles manuell anpassen möchtet wäre es notwendig, dass Ihr Eure Datenbank entsprechend anpasst. Dazu gibt es im Plenticore Wiki bereits Muster für Umbenennungen in der DbLog.

Solltest Ihr noch weitere Jahres Werte in diesem Report haben wollen, so kann man das recht einfach direkt mit abfragen. Ich hole mir z.B. auch die Jahres Leistung, die über die WallBox ins Auto ging und zeige mir das in einem ander stateFormat als Vorjahr mit an.

VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 10 Januar 2022, 15:04:00
Hi nochmal,
ich steh gerade etwas auf dem Schlauch mit dem Umbauen auf SW_*

Zitat von: ch.eick am 07 Januar 2022, 17:05:51
Die Werte sind okay, jedoch die Namen sind ohne SW_* , wenn Du nur einen WR hast, solltest Du besser die SW_* belassen, da alles was jetzt kommen wird darauf aufbaut.
Mit nur einem WR sollten die SW_* gleich den Namen ohne SW_* sein.

In Zukunft werden sicherlich immer mehr Wünsche nach Reports kommen und da müsste man ansonsten jedes mal wieder umbauen, oder es kommt zu Missverständnissen.

Meine LogDBRep_Statistic_previous_Year ergab ja folgende Ergebnisse:
Statistic_EnergyFeedInGrid_Year  35  2021-12-31 23:57:03
Statistic_EnergyHomeBat_Year  0  2021-12-31 23:57:03
Statistic_EnergyHomeGrid_Year 529  2021-12-31 23:57:03
Statistic_EnergyHomePvSum_Year  137  2021-12-31 23:57:03
Statistic_EnergyHomePv_Year  137  2021-12-31 23:57:03
Statistic_EnergyHome_Year  667 2021-12-31 23:57:03
Statistic_EnergyPv1_Year  139 2021-12-31 23:57:03
Statistic_EnergyPv2_Year  46 2021-12-31 23:57:03
Statistic_TotalConsumption_Year  667  2021-12-31 23:57:03
Statistic_Yield_NoBat_Year  172  2021-12-31 23:57:03
Statistic_Yield_Year  172  2021-12-31 23:57:03

Was müsste ich in der DB anpassen?

Wäre das der Eintrag im Wiki: Ein altes READING einem neuen READING Namen zuordnen?
Ich hab im Thread noch den Eintrag gefunden https://forum.fhem.de/index.php/topic,114849.msg1176165.html#msg1176165
Steh aber irgendwie gerade echt auf dem Schlauch ...

Wäre das bei mir folgendes Code als Beispiel? Müsste ich alle YEAR einträge von oben so umbauen?
UPDATE history
  SET
    TIMESTAMP = TIMESTAMP,
    READING   = 'Statistic_EnergyFeedInGrid_Year'
  WHERE
        DEVICE    = 'WR_1_API'
    AND READING   = 'SW_Statistic_EnergyFeedInGrid_Year';

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2022, 15:37:04
Zitat von: kaiman am 10 Januar 2022, 15:04:00
Hi nochmal,
ich steh gerade etwas auf dem Schlauch mit dem Umbauen auf SW_*

Meine LogDBRep_Statistic_previous_Year ergab ja folgende Ergebnisse:
Statistic_EnergyFeedInGrid_Year  35  2021-12-31 23:57:03
Statistic_EnergyHomeBat_Year  0  2021-12-31 23:57:03
Statistic_EnergyHomeGrid_Year 529  2021-12-31 23:57:03
Statistic_EnergyHomePvSum_Year  137  2021-12-31 23:57:03
Statistic_EnergyHomePv_Year  137  2021-12-31 23:57:03
Statistic_EnergyHome_Year  667 2021-12-31 23:57:03
Statistic_EnergyPv1_Year  139 2021-12-31 23:57:03
Statistic_EnergyPv2_Year  46 2021-12-31 23:57:03
Statistic_TotalConsumption_Year  667  2021-12-31 23:57:03
Statistic_Yield_NoBat_Year  172  2021-12-31 23:57:03
Statistic_Yield_Year  172  2021-12-31 23:57:03

Schau bitte mal in Dein WR_1_API Device, ob die SW_* readings vorhanden sind. Damit würden sie auch in die Datenbank geschrieben.
Wenn das der Fall ist, dann verwende bitte das SELECT mit den §device§ und §reading§ aus dem vorigen Post. Aber entweder bis morgen mit dem 93_DbRep update warten, oder das wget verwenden.

Bei den SW_* readings sind diese bei nur einem Wechselrichter von den Werten her gleich mit den readings ohne SW_* ., aber Du müsstest den DbRep und auch das stateFormat umbauen. Mein Bestreben ist es alle auf einen einheitlichen Stand zu haben, damit der Support einfacher ist.

Wenn das obige so okay für Dich ist, braucht man nächste hier nicht zu machen.
Nur wenn Du noch Daten aus einer Zeit vor der SW_* Zeit hast, dann kann man diese mit dem update der Datenbank nachziehen. Jeder ist ja zu einer anderen Zeit hier eingestiegen, oder wollte unter umständen seine eigenen device Namen verwenden. Ich kann aber auch gerne beim migrieren von alt Daten helfen, wenn es nicht zeitkritisch ist ;-)
Im Wiki steht zur Datenpflege und Umzügen glaube ich auch etwas drin "Wenn man mal umziehen will" oder so änlich :-)
Zitat
Was müsste ich in der DB anpassen?

Wäre das der Eintrag im Wiki: Ein altes READING einem neuen READING Namen zuordnen?
Ich hab im Thread noch den Eintrag gefunden https://forum.fhem.de/index.php/topic,114849.msg1176165.html#msg1176165
Steh aber irgendwie gerade echt auf dem Schlauch ...

Wäre das bei mir folgendes Code als Beispiel? Müsste ich alle YEAR einträge von oben so umbauen?
UPDATE history
  SET
    TIMESTAMP = TIMESTAMP,
    READING   = 'Statistic_EnergyFeedInGrid_Year'
  WHERE
        DEVICE    = 'WR_1_API'
    AND READING   = 'SW_Statistic_EnergyFeedInGrid_Year';


In Hinblich auf weitere Reports würde ich das Umziehen beforzugen. Das Quartals SQL hat rund 550 Zeilen, wenn es lesbar Formatiert ist. Ansonsten sieht es auf dem Bildschirm als Bandwurm wie die Matrix aus :-) :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 11 Januar 2022, 07:55:50
Hallo,

danke für die Erklärung und die angebotene Unterstützung.

Ich hab im WR_1_API sowohl SW* alsoauch Readings ohne SW_

die Werte unterscheiden sich aber teilweise etwas, was mich etwas verwirrt.

Beispiel:
Statistic_EnergyHomeGrid_Month 205245.01 2022-01-11 06:57:00
SW_Statistic_EnergyHomeGrid_Month 205426.8 2022-01-11 06:57:00

Statistic_EnergyHomeGrid_Year 205245.01 2022-01-11 06:57:00
SW_Statistic_EnergyHomeGrid_Year 205890.2 2022-01-11 06:57:00

LG
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2022, 08:57:22
Zitat von: kaiman am 11 Januar 2022, 07:55:50
Hallo,

danke für die Erklärung und die angebotene Unterstützung.

Ich hab im WR_1_API sowohl SW* alsoauch Readings ohne SW_

die Werte unterscheiden sich aber teilweise etwas, was mich etwas verwirrt.

Beispiel:
Statistic_EnergyHomeGrid_Month 205245.01 2022-01-11 06:57:00
SW_Statistic_EnergyHomeGrid_Month 205426.8 2022-01-11 06:57:00

Statistic_EnergyHomeGrid_Year 205245.01 2022-01-11 06:57:00
SW_Statistic_EnergyHomeGrid_Year 205890.2 2022-01-11 06:57:00

LG
Diese Abweichungen sind im Bereich von "wenigen" wh, was mit der Zeit der Berechnung zu tun hat. Der Plenticore holt sich von KSEM und sich selber die Messwerte und mach bei den Statistiken nur in Zeitintervallen einen Update. Dann holt das WR_1_API Device die Werte ab und nur wenn es eine Änderung im Wert gibt (event-on-change) wird das reading geschrieben.
Die SW_* userreadings haben einen Trigger und machen erst eine Berechnung wenn dieser auslöst. Das geschieht aber auch nur bei enem event-on-change und in der Zwischenzeit hat sich ja wieder der Verbrauch geändert, da die Devices ja auch nur im Minuten Takt oder über die gesendeten register des ModBus arbeiten.
Bei einer Statistik reicht es, wenn man diese auf kWk Basis betrachtet, da ist es müßig sich 100 w schritte anzuschauen. Ich runde da ja eh ohne Nachkommastellen in der Anzeige.

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 11 Januar 2022, 09:02:58
Ok danke für die Erklärung, da hast du Recht.

Nachdem ich beide Werte in Device WR_1_API habe, soll ich noch eine Anpassung in der DB machen, oder kann das so bleiben?

Gruß
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2022, 10:33:22
Zitat von: kaiman am 11 Januar 2022, 09:02:58
Ok danke für die Erklärung, da hast du Recht.

Nachdem ich beide Werte in Device WR_1_API habe, soll ich noch eine Anpassung in der DB machen, oder kann das so bleiben?
Ich war mir bisher noch nicht sooo sicher, ob ich die äqivalente zu SW_* nicht doch noch brauchen würde, deshalb habe ich diese im DbLogInclude noch drin gelassen.
Es sind ja warscheinlich auch noch nicht alle auf die Schwarm Implementierung umgezogen.
Wenn Du platz Probleme bekommen würdest könnte man natürlich einiges doppeltes löschen, aber das geht ja ratzigarfazi.
Die Events dieser readings werden aber trotzdem für die Erstellung der SW_* benötigt.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2022, 11:40:13
Hallo zusammen,
die Begeisterung geht gerade mit mir durch und ich habe schon wieder etwas aktualisiert.

Das stateFormat (https://forum.fhem.de/index.php/topic,114849.msg1199270.html#msg1199270) zeigt jetzt auch die Vorjahres Autarkie und Eigenverbrauchsrate an.
Das SQL SELECT mit §reading§ (https://forum.fhem.de/index.php/topic,114849.msg1199506.html#msg1199506) sucht jetzt auch dei Werte aus der Datenbank.

Für diese Änderung gilt auch, dass die Werte im stateformat nur angezeigt werden, wenn sie im LogDBRep_Statistic_previous_Year Device vorhanden sind.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 11 Januar 2022, 17:29:59
Hallo,

ich finde es klasse, die du hier unterstützt!

DANKE.
Nein Platzprobleme habe ich keine, daher lass ich die Werte mal alle so drin.
Ich werde die Tage mal die neue Quartalsanzeige einbauen und schauen, ob es funktioniert.
Am Donnerstag bekomme ich dann meine neue Wallbox (openWB) mal schauen, ob ich die auch irgendwie in die Anzeige einbauen kann.

Gruß
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2022, 18:04:05
Zitat von: kaiman am 11 Januar 2022, 17:29:59
Ich werde die Tage mal die neue Quartalsanzeige einbauen und schauen, ob es funktioniert.
Am Donnerstag bekomme ich dann meine neue Wallbox (openWB) mal schauen, ob ich die auch irgendwie in die Anzeige einbauen kann.
Für die Quartalszahlen kommt jetzt bald das SELECT, beim stateFormat ist es bereits mit drin.

Auch openWB habe ich bereits bei mir implementiert. Ein Beispiel für einen Kia oder Hyundai habe ich auch mal angehängt.
Was für ein E-Auto ist den geplant?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 11 Januar 2022, 20:49:59
gibt es eine einfache Möglichkeit, 2 Werte von der Teilung /1000 zu exkludieren? Ich habe ja in meinem StateFormat noch je eine Linie eingeblendet, wieviel Geld ich verdient und wieviel bezahlt habe (gerechnet mit einem Durchschnittspreis)
Diese Werte sind in der Datenbank direkt in Franken geschrieben. Wenn diese nun automatisch durch /1000 geteilt werden, kommt 0 und 1 raus.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Januar 2022, 22:28:08
Zitat von: Mumpitz am 11 Januar 2022, 20:49:59
gibt es eine einfache Möglichkeit, 2 Werte von der Teilung /1000 zu exkludieren? Ich habe ja in meinem StateFormat noch je eine Linie eingeblendet, wieviel Geld ich verdient und wieviel bezahlt habe (gerechnet mit einem Durchschnittspreis)
Diese Werte sind in der Datenbank direkt in Franken geschrieben. Wenn diese nun automatisch durch /1000 geteilt werden, kommt 0 und 1 raus.

Das habe ich hier (https://forum.fhem.de/index.php/topic,114849.msg1199506.html#msg1199506) für die Autarkie und Consumtionrate heute auch schon eingebaut.
Diese Werte werde jetzt auch im stateFormat angezeigt und sind bereits in nn % in der Datenbank.
Bitte übernimm das und mach dann Deine Änderung rein, dann ist das Device bei Dir auch mit §device§ und §reading§ umgestellt.
Beim reading Attribut müsstest Du dann noch die zwei readings dazu schreiben.

attr LogDBRep_Statistic_previous_Year reading SW_Statistic%_Year,Statistic_EnergyHomeBat_Year,<Deine reading 1>,>Dein reading 2> EXCLUDE=%NoBat%,%EnergyPv%


Du kannst Dann dieses IF um weitere reading Namen mit OR erweiter

IF   (h.READING LIKE '%Rate%'
    OR h.READING LIKE '%Autarky%'
    OR h.READING ...
    OR h.READING ...
    ,h.VALUE ,                    <====== das ist der then Zweig, bei dem einfach der Wert aus von VALUE genommen wird
    cast(h.VALUE/1000 AS decimal(6)) ) AS VALUE           <====== und hier wird noch durch 1000 geteilt und als 6 Stelliger dezimal Wert ausgegeben


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 12 Januar 2022, 07:46:50
Du bist genial!

Zitat von: ch.eick am 11 Januar 2022, 18:04:05

Auch openWB habe ich bereits bei mir implementiert. Ein Beispiel für einen Kia oder Hyundai habe ich auch mal angehängt.
Was für ein E-Auto ist den geplant?

Ich werde zwei openWB betreiben, da wir ein Model S und ein Model 3 haben.
Die openWB sollen im LM arbeiten und PV Überschnuss Ladung machen.


Ich habe gerade versucht, die neue LogDBRep_Statistic_previous_Year einzubauen. (https://forum.fhem.de/index.php/topic,114849.msg1199506.html#msg1199506)
Wenn ich das ausführe erhalte ich nur noch:
SqlResultRow_1 TIMESTAMP|READING|VALUE 2022-01-12 07:55:44
sqlCmd 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 ; 2022-01-12 07:55:44
sqlResultNumRows 0 2022-01-12 07:55:44
state done

FVERSION93_DbRep.pm:v8.46.11-s25414/2022-01-03, die sollte also schon mal passen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2022, 09:47:26
Zitat von: kaiman am 12 Januar 2022, 07:46:50
Ich habe gerade versucht, die neue LogDBRep_Statistic_previous_Year einzubauen. (https://forum.fhem.de/index.php/topic,114849.msg1199506.html#msg1199506)
Wenn ich das ausführe erhalte ich nur noch:
SqlResultRow_1 TIMESTAMP|READING|VALUE 2022-01-12 07:55:44
sqlCmd 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 ; 2022-01-12 07:55:44
sqlResultNumRows 0 2022-01-12 07:55:44
state done

FVERSION93_DbRep.pm:v8.46.11-s25414/2022-01-03, die sollte also schon mal passen.
Schick mir bitte als PN ein list vom LogDBRep_Statistic_previous_Year

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2022, 09:48:57
Zitat von: kaiman am 12 Januar 2022, 07:46:50
Ich werde zwei openWB betreiben, da wir ein Model S und ein Model 3 haben.
Die openWB sollen im LM arbeiten und PV Überschnuss Ladung machen.
Ich habe ebenfalls zwei openWB Ladepunkte im Einsatz. Die Screenshots von den Kia Devices fallen dann weg, da die eine Kommunikation mit dem Auto vorraussetzen.
Als Muster, wie man Fahrzeuginformationen mit Ladepunkt Möglichkeiten kombinieren kann sollte der Screenshot aber reichen. Ich habe nochmal ein Bild angehängt,
bei dem man sehen kann, wie ich den Lademodus im Fahrzeug Device umstellen kann. Jedes Fahrzeug würde dann den bevorzugten Ladepunkt zugeordnet bekommen.
Die openWB zeigt nach meinem Kenntnisstand nicht den angestöpselten Fahrzeugtyp an. Über den eNiro kann ich jedoch die Geo Position ziemlich genau abfragen und man
müsste mal probieren, ob das so genau ist, dass der Stellplatz zugeordnet werden kann. Zumindest ist es so genau, dass ich zuhause erkennen kann.
Wenn der Stellplatz erkannt würde, könnte man responsive den Ladepunkt im uitable zuordnen. Das fände ich sehr spannend.

Hast Du die Model * schon im FHEM?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 12 Januar 2022, 12:51:36
Wie hast Du OpenWB angebunden- per MQTT ?
Ich habe MQTT2_DEVICE benutzt - aber da kriege ich das Schalten des ChargeMode nicht ans laufen. Das "Set Topic" tut irgendwie nicht.
Kannst Du mal Deine Config posten ?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2022, 13:01:50
Zitat von: papa am 12 Januar 2022, 12:51:36
Wie hast Du OpenWB angebunden- per MQTT ?
Ich habe MQTT2_DEVICE benutzt - aber da kriege ich das Schalten des ChargeMode nicht ans laufen. Das "Set Topic" tut irgendwie nicht.
Kannst Du mal Deine Config posten ?
Moin,
hier geht's weiter für Kia Connect (https://forum.fhem.de/index.php/topic,116175.msg1184265.html#msg1184265) und openWB (https://forum.fhem.de/index.php/topic,122297.msg1200059.html#msg1200059)
dann noch das DOIF (https://forum.fhem.de/index.php/topic,116175.msg1184267.html#msg1184267)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 12 Januar 2022, 13:45:11
WB_1 kann ich irgendwie nicht finden :-(
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2022, 13:57:04
Zitat von: papa am 12 Januar 2022, 13:45:11
WB_1 kann ich irgendwie nicht finden :-(
Ich habe den Link im vorigen Post noch ergänzt, die openWB ist glaube ich auch im Wiki zu finden.
openWB komplexe Anbindung (https://wiki.fhem.de/wiki/OpenWB#Komplexe_Anbindung)

EDIT: Das Wiki ist jetzt auch wieder aktuell
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 12 Januar 2022, 14:12:40
Zitat von: ch.eick am 12 Januar 2022, 09:47:26
Schick mir bitte als PN ein list vom LogDBRep_Statistic_previous_Year
hab ich gesendet.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2022, 14:18:12
In Bezug auf openWB und Hausspeicher

Wenn man NurPV mit Vorrang_EV lädt habe ich festgestellt, dass durch die Regelung der openWB trotzdem ein Rest für den Hausspeicher übrig bleibt, sodaß der trotzdem noch etwas geladen wird. Bei mir ist ein sperren des Hausspeichers gegen Entladen beim Fahrzeug Laden eingebaut. Dafür wird das smart_Laden vom WR_1_Speicher_1_ExternControl verwendet. Nach abschluss des Ladevorgangs wird dann wieder der Vorherige Zustand hergestellt.

In der Grafik sieht man das schöne Zusammenspiel zwischen Wärmepumpe und openWB.
Die schwarze Fläche zwischen dem Lila und der blauen Linie geht in den Hausspeicher.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 12 Januar 2022, 15:45:30
Habe nichts im Nachrichteneingang. Vllt nicht rausgegangen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2022, 18:25:23
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.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Januar 2022, 16:58:12
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
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Januar 2022, 10:38:50
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
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag 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?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Januar 2022, 18:52:25
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.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 18 Januar 2022, 19:46:30
Hi,

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

DANKE für den Support!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Januar 2022, 23:43:11
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.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 19 Januar 2022, 08:00:43
Hi,

ich habe meine PV Anlage erst im Dez 21 in Betrieb genommen, daher kann ich keine Werte zusteuern, sry.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Januar 2022, 10:02:02
Moin zusammen,

in dem WR_1_API stateFormat (https://forum.fhem.de/index.php/topic,114849.msg1199270.html#msg1199270) war noch ein kleiner Fehler, den ich jetzt korrigiert habe. Bitte ladet das nochmal neu.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Januar 2022, 14:40:18
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
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Januar 2022, 09:29:40
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
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Januar 2022, 09:37:13
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
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag 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?

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>"
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Februar 2022, 17:03:59
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 :-(
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Februar 2022, 11:08:43
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
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 20 Februar 2022, 17:02:50
Hm - ich habe das KSEM gar nicht im Netz. Das ist nur per RS485 mit dem Plenticore verbunden. Hast Du mal nen Link zu dem Beitrag wegen der Probleme nach dem Update.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Februar 2022, 18:11:13
Zitat von: papa am 20 Februar 2022, 17:02:50
Hm - ich habe das KSEM gar nicht im Netz. Das ist nur per RS485 mit dem Plenticore verbunden. Hast Du mal nen Link zu dem Beitrag wegen der Probleme nach dem Update.
Da steht nicht viel, nur Fehler 6006 https://www.photovoltaikforum.com/thread/149093-neue-software-version-f%C3%BCr-piko-und-plenticore/?postID=2323496#post2323496 (https://www.photovoltaikforum.com/thread/149093-neue-software-version-f%C3%BCr-piko-und-plenticore/?postID=2323496#post2323496)

Du solltest Dir aber generell eine Lösung für die Firmware Updates überlegen, da der KSEM immer mehr Funktionalitäten bekommen soll.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Februar 2022, 18:59:05
Nun war es dunkel und ich habe mal die Wechselrichter auf KOSTAL_Update_PLENTICORE_PIKO_IQ_012106586.swu aktualisiert.
Bisher sehe ich keinerlei Schwierigkeiten und auch der Speicher arbeitet aktuell korrekt.
Lediglich ein kleiner Text Hinweis ist im Bereich der Batteriekonfiguration zu sehen, das bei wenig PV-Leistung der MinSOC erhöht wird.
Das werde ich mal beobachten, da ich ja den MinSOC nach Wetterlage verändere.
Die Kommunikation über ModBus und API liefert wie gewohnt alle Werte. Somit funktioniert natürlich auch das Login weiterhin.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 06 März 2022, 09:50:37
Vielen Dank für die ganze Arbeit für die Prognose.
Bin gerade die bei mir einzurichten. Allerdings krieg ich keinen FC0 und FC1 Chart


Dargestellt wird das ganze laut Wiki mit folgendem Chart # Created by FHEM/98_SVG.pm, 2020-08-17 08:58:42
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Forecast / Calculation'
set ytics
set y2tics
set grid
set ylabel "Leistung"
set y2label "Leistung"
set yrange [0:10000]
set y2range [0:10000]

#LogDB Astro:SunAlt:::$val=($val>0?$val*50+7000:7000)
#LogDB wetter_<Wohnort>_II:solarRadiation:::$val=($val>0?$val*3+7000:7000)
#LogDB PV_1:Solar_SolarRadiation:::$val=($val>0?$val*3+7000:7000)
#LogDB Astro:SunAlt:::$val=7000
#LogDB DUMMY_PV:Solar_Calculation_fc1::
#LogDB WR_1:SW_Total_DC_P_sumOfAllPVInputs::
#LogDB WR_1:Solar_Calculation::
#LogDB WR_1:Solar_East::
#LogDB WR_1:Solar_South::
#LogDB WR_1:Solar_West::

plot "<IN>" using 1:2 axes x1y2 title 'Sonnenhöhe' ls l7 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'SolarRadiation' ls l8 lw 2 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'SolarRadiationPrognose' ls l8 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title '70%' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Calculation_fc1' ls l0 lw 2 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Total_DC_Power_(sumOfAllPVInputs)' ls l1fill lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Calculation' ls l5 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'East' ls l2 lw 0.5 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'South' ls l3 lw 0.5 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'West' ls l4 lw 0.5 with lines


Listing von meinem PV Device
nternals:
   FUUID      5f38f1c0-f33f-e34d-2f8a-04966bdba3d9b607
   NAME       DUMMY_PV
   NR         311
   STATE      -1.054 kW Verbrauch
   TYPE       dummy
   Helper:
     DBLOG:
       EigenverbrauchDay:
         logdb:
           TIME       1646514000.1866
           VALUE      1.89
       EigenverbrauchLastMonth:
         logdb:
           TIME       1646093520.19481
           VALUE      50.35
       ForecastEigenverbrauchAktMonth:
         logdb:
           TIME       1646555700.15203
           VALUE      76
       Solar_Calculation:
         logdb:
           TIME       1646555824.60382
           VALUE      1098
       Solar_CalculationT_fc0_06:
         logdb:
           TIME       1646556117.95895
           VALUE      0
       Solar_CalculationT_fc0_07:
         logdb:
           TIME       1646556118.00875
           VALUE      0
       Solar_CalculationT_fc0_08:
         logdb:
           TIME       1646556118.0684
           VALUE      621
       Solar_CalculationT_fc0_09:
         logdb:
           TIME       1646556118.1186
           VALUE      1098
       Solar_CalculationT_fc0_10:
         logdb:
           TIME       1646556118.17192
           VALUE      1445
       Solar_CalculationT_fc0_11:
         logdb:
           TIME       1646556118.22427
           VALUE      1616
       Solar_CalculationT_fc0_12:
         logdb:
           TIME       1646556118.27422
           VALUE      1561
       Solar_CalculationT_fc0_13:
         logdb:
           TIME       1646556118.32501
           VALUE      1505
       Solar_CalculationT_fc0_14:
         logdb:
           TIME       1646556118.38189
           VALUE      1225
       Solar_CalculationT_fc0_15:
         logdb:
           TIME       1646556118.43171
           VALUE      868
       Solar_CalculationT_fc0_16:
         logdb:
           TIME       1646556118.48024
           VALUE      504
       Solar_CalculationT_fc0_17:
         logdb:
           TIME       1646556118.53367
           VALUE      0
       Solar_CalculationT_fc0_18:
         logdb:
           TIME       1646556118.58507
           VALUE      0
       Solar_CalculationT_fc0_19:
         logdb:
           TIME       1646556118.63087
           VALUE      0
       Solar_CalculationT_fc0_20:
         logdb:
           TIME       1646556118.68358
           VALUE      0
       Solar_CalculationT_fc0_21:
         logdb:
           TIME       1646556118.73096
           VALUE      0
       Solar_CalculationT_fc0_4h:
         logdb:
           TIME       1646556118.74852
           VALUE      5720
       Solar_CalculationT_fc0_day:
         logdb:
           TIME       1646556118.79002
           VALUE      10443
       Solar_CalculationT_fc0_rest:
         logdb:
           TIME       1646556118.76752
           VALUE      9822
       Solar_Calculation_fc0_08:
         logdb:
           TIME       1646546400.19507
           VALUE      621
       Solar_Calculation_fc0_09:
         logdb:
           TIME       1646546400.23664
           VALUE      1098
       Solar_Calculation_fc0_10:
         logdb:
           TIME       1646546400.28323
           VALUE      1445
       Solar_Calculation_fc0_11:
         logdb:
           TIME       1646546400.32715
           VALUE      1616
       Solar_Calculation_fc0_12:
         logdb:
           TIME       1646546400.37003
           VALUE      1561
       Solar_Calculation_fc0_13:
         logdb:
           TIME       1646546400.40675
           VALUE      1505
       Solar_Calculation_fc0_14:
         logdb:
           TIME       1646546400.43936
           VALUE      1225
       Solar_Calculation_fc0_15:
         logdb:
           TIME       1646546400.47856
           VALUE      868
       Solar_Calculation_fc0_16:
         logdb:
           TIME       1646546400.52092
           VALUE      504
       Solar_Calculation_fc0_4h:
         logdb:
           TIME       1646553600.45305
           VALUE      5720
       Solar_Calculation_fc0_day:
         logdb:
           TIME       1646546400.73435
           VALUE      10443
       Solar_Calculation_fc0_rest:
         logdb:
           TIME       1646553600.46329
           VALUE      9822
       Solar_Calculation_fc1_08:
         logdb:
           TIME       1646546100.17178
           VALUE      562
       Solar_Calculation_fc1_09:
         logdb:
           TIME       1646546100.20531
           VALUE      980
       Solar_Calculation_fc1_10:
         logdb:
           TIME       1646546100.23629
           VALUE      1395
       Solar_Calculation_fc1_11:
         logdb:
           TIME       1646546100.26772
           VALUE      1648
       Solar_Calculation_fc1_12:
         logdb:
           TIME       1646546100.29899
           VALUE      1753
       Solar_Calculation_fc1_13:
         logdb:
           TIME       1646546100.33008
           VALUE      1675
       Solar_Calculation_fc1_14:
         logdb:
           TIME       1646546100.36496
           VALUE      1445
       Solar_Calculation_fc1_15:
         logdb:
           TIME       1646546100.40025
           VALUE      1163
       Solar_Calculation_fc1_16:
         logdb:
           TIME       1646546100.43209
           VALUE      723
       Solar_Calculation_fc1_day:
         logdb:
           TIME       1646546100.58417
           VALUE      11344
       Solar_Haus:
         logdb:
           TIME       1646553600.18753
           VALUE      737
       Solar_SolarRadiation:
         logdb:
           TIME       1646553600.2167
           VALUE      303
       intensitysum:
         logdb:
           TIME       1646556523.8854
           VALUE      -1.054
       statEigenverbrauch:
         logdb:
           TIME       1646556300.15466
           VALUE      Hour: 0.65 Day: 0.92 Month: 15.61 Year: 91.17
       statEigenverbrauchLast:
         logdb:
           TIME       1646553595.01101
           VALUE      Hour: 0.24 Day: 1.89 Month: 50.35 Year: 495.91 (since: 2021-05-31 )
       statTotal-all-get:
         logdb:
           TIME       1646556300.01561
           VALUE      Hour: 1.280 Day: 9.510 Month: 82.220 Year: 1063.640
       statTotal-all-getLast:
         logdb:
           TIME       1646553595.01101
           VALUE      Hour: 1.620 Day: 13.730 Month: 423.110 Year: 1041.270 (since: (since: )
   OLDREADINGS:
   READINGS:
     2022-03-06 09:45:00   Eigenverbrauch  1657.07
     2022-03-05 22:00:00   EigenverbrauchDay 1.89
     2022-03-01 01:12:00   EigenverbrauchLastMonth 50.35
     2022-03-06 09:45:00   ForcastAkkuersparniss 73
     2022-03-06 09:45:00   ForcastGesamtersparnissAktMonth 149
     2022-03-06 09:45:00   ForecastEigenverbrauchAktMonth 76
     2022-03-06 09:45:00   Gespart         Day: 0.25€ Month: 4.25€ Year: 24.80€
     2022-03-06 09:41:58   Solar_Calculation 1098
     2022-03-06 09:37:04   Solar_Calculation_fc0_06 0
     2022-03-06 09:37:04   Solar_Calculation_fc0_07 0
     2022-03-06 09:37:04   Solar_Calculation_fc0_08 621
     2022-03-06 09:37:04   Solar_Calculation_fc0_09 1098
     2022-03-06 09:37:04   Solar_Calculation_fc0_10 1445
     2022-03-06 09:37:04   Solar_Calculation_fc0_11 1616
     2022-03-06 09:37:04   Solar_Calculation_fc0_12 1561
     2022-03-06 09:37:04   Solar_Calculation_fc0_13 1505
     2022-03-06 09:37:04   Solar_Calculation_fc0_14 1225
     2022-03-06 09:37:04   Solar_Calculation_fc0_15 868
     2022-03-06 09:37:04   Solar_Calculation_fc0_16 504
     2022-03-06 09:37:04   Solar_Calculation_fc0_17 0
     2022-03-06 09:37:04   Solar_Calculation_fc0_18 0
     2022-03-06 09:37:04   Solar_Calculation_fc0_19 0
     2022-03-06 09:37:04   Solar_Calculation_fc0_20 0
     2022-03-06 09:37:04   Solar_Calculation_fc0_21 0
     2022-03-06 09:37:04   Solar_Calculation_fc0_4h 5720
     2022-03-06 09:37:04   Solar_Calculation_fc0_day 10443
     2022-03-06 09:37:04   Solar_Calculation_fc0_rest 9822
     2022-03-06 09:35:20   Solar_Calculation_fc1_06 0
     2022-03-06 09:35:20   Solar_Calculation_fc1_07 0
     2022-03-06 09:35:20   Solar_Calculation_fc1_08 562
     2022-03-06 09:35:20   Solar_Calculation_fc1_09 980
     2022-03-06 09:35:20   Solar_Calculation_fc1_10 1395
     2022-03-06 09:35:20   Solar_Calculation_fc1_11 1648
     2022-03-06 09:35:20   Solar_Calculation_fc1_12 1753
     2022-03-06 09:35:20   Solar_Calculation_fc1_13 1675
     2022-03-06 09:35:20   Solar_Calculation_fc1_14 1445
     2022-03-06 09:35:20   Solar_Calculation_fc1_15 1163
     2022-03-06 09:35:20   Solar_Calculation_fc1_16 723
     2022-03-06 09:35:21   Solar_Calculation_fc1_17 0
     2022-03-06 09:35:21   Solar_Calculation_fc1_18 0
     2022-03-06 09:35:21   Solar_Calculation_fc1_19 0
     2022-03-06 09:35:21   Solar_Calculation_fc1_20 0
     2022-03-06 09:35:21   Solar_Calculation_fc1_21 0
     2022-03-06 09:35:21   Solar_Calculation_fc1_day 11344
     2022-03-06 09:41:58   Solar_Cloud     37
     2022-03-06 09:41:58   Solar_Correction_Cloud 1
     2022-03-06 09:41:58   Solar_Correction_Rain 1
     2022-03-06 09:41:58   Solar_Correction_Temp 1
     2022-03-06 09:41:58   Solar_GartenHausNord 144
     2022-03-06 09:41:58   Solar_GartenHausSued 217
     2022-03-06 09:41:58   Solar_Haus      737
     2022-03-06 09:41:58   Solar_Rain      7
     2022-03-06 09:41:58   Solar_SolarRadiation 303
     2022-03-06 09:41:58   Solar_Temp      10.7
     2022-03-06 09:41:58   Solar_middayhigh_fc0 1
     2022-03-06 09:41:58   Solar_middayhigh_fc0_start 09:00
     2022-03-06 09:41:58   Solar_middayhigh_fc0_stop 15:00
     2022-03-06 09:35:21   Solar_middayhigh_fc1 1
     2022-03-06 09:35:21   Solar_middayhigh_fc1_start 09:00
     2022-03-06 09:35:21   Solar_middayhigh_fc1_stop 15:00
     2022-03-06 09:48:43   intensitysum    -1.054
     2022-03-06 09:48:43   statEigenverbrauch Hour: 0.65 Day: 0.92 Month: 15.61 Year: 91.17
     2022-03-06 08:59:55   statEigenverbrauchLast Hour: 0.24 Day: 1.89 Month: 50.35 Year: 495.91 (since: 2021-05-31 )
     2022-03-06 09:48:43   statTotal-all-get Hour: 1.280 Day: 9.510 Month: 82.220 Year: 1063.640
     2022-03-06 08:59:55   statTotal-all-getLast Hour: 1.620 Day: 13.730 Month: 423.110 Year: 1041.270 (since: (since: )
     2022-03-06 09:45:00   total-all-get   7431.610
     2022-03-06 09:45:00   total-all-make  2795.960
   helper:
     _98_statistics STATISTICS_STROMVERBRAUCH
Attributes:
   DbLogExclude .*
   DbLogInclude .*(Solar_SolarRadiation|Solar_Calculation_fc.|Solar_Calculation|Solar_Haus|intensity|sum|stat|EigenverbrauchDay|ForecastEigenverbrauchAktMonth|EigenverbrauchLastMonth|Forecasttotal-all-getMonth).*
   event-min-interval 600
   event-on-change-reading .*
   room       Technik_PV
   stateFormat intensitysum kW Verbrauch
   userReadings Gespart:statEigenverbrauch.* {sprintf("Day: %.2f€ Month: %.2f€ Year: %.2f€",((split(" ", (ReadingsVal($name,"statEigenverbrauch",""))))[3])*0.272,((split(" ", (ReadingsVal($name,"statEigenverbrauch",""))))[5])*0.272,((split(" ", (ReadingsVal($name,"statEigenverbrauch",""))))[7])*0.272)},
ForecastEigenverbrauchAktMonth:statEigenverbrauch.* {calcmonthusageSplit($name,"statEigenverbrauch",5)},



Das wird zyklisch von einem DOIF beschrieben
([05:00-21:00] and [:00])
({Solar_forecast("logdb","LogDBRep_PV_Forecast_SQL","DUMMY_PV","Solar_Calculation_fc","DWD_Forecast",0)})
DOELSEIF
([06:55] or [19:11])
({Solar_forecast("logdb","LogDBRep_PV_Forecast_SQL","DUMMY_PV","Solar_Calculation_fc","DWD_Forecast",1)})


Meinte DBLog heist logdb. Im Logfile habe ich drinstehen dass die fc0 Werte dem Cache hinzugefügt werden
2022.03.06 11:19:05 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 06:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 07:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 08:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 621, Reading: Solar_Calculation_fc0, Value: 621, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 09:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1098, Reading: Solar_Calculation_fc0, Value: 1098, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 10:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1246, Reading: Solar_Calculation_fc0, Value: 1246, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 11:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1478, Reading: Solar_Calculation_fc0, Value: 1478, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 12:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1505, Reading: Solar_Calculation_fc0, Value: 1505, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 13:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1428, Reading: Solar_Calculation_fc0, Value: 1428, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 14:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1156, Reading: Solar_Calculation_fc0, Value: 1156, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 15:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 840, Reading: Solar_Calculation_fc0, Value: 840, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 16:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 504, Reading: Solar_Calculation_fc0, Value: 504, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 17:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 18:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 19:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 20:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:19:06 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 21:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:30:19 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 16:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:30:55 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 16:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:30:55 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 17:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 100, Reading: Solar_Calculation_fc0, Value: 100, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 06:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 07:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 08:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 621, Reading: Solar_Calculation_fc0, Value: 621, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 09:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1098, Reading: Solar_Calculation_fc0, Value: 1098, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 10:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1246, Reading: Solar_Calculation_fc0, Value: 1246, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 11:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1478, Reading: Solar_Calculation_fc0, Value: 1478, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 12:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1505, Reading: Solar_Calculation_fc0, Value: 1505, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 13:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1428, Reading: Solar_Calculation_fc0, Value: 1428, Unit:
2022.03.06 11:32:40 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 14:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 1156, Reading: Solar_Calculation_fc0, Value: 1156, Unit:
2022.03.06 11:32:41 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 15:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 840, Reading: Solar_Calculation_fc0, Value: 840, Unit:
2022.03.06 11:32:41 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 16:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 504, Reading: Solar_Calculation_fc0, Value: 504, Unit:
2022.03.06 11:32:41 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 17:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:32:41 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 18:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:32:41 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 19:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:32:41 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 20:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:32:41 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-06 21:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc0: 0, Reading: Solar_Calculation_fc0, Value: 0, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 06:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 0, Reading: Solar_Calculation_fc1, Value: 0, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 07:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 0, Reading: Solar_Calculation_fc1, Value: 0, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 08:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 551, Reading: Solar_Calculation_fc1, Value: 551, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 09:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 969, Reading: Solar_Calculation_fc1, Value: 969, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 10:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 1358, Reading: Solar_Calculation_fc1, Value: 1358, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 11:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 1571, Reading: Solar_Calculation_fc1, Value: 1571, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 12:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 1626, Reading: Solar_Calculation_fc1, Value: 1626, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 13:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 1577, Reading: Solar_Calculation_fc1, Value: 1577, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 14:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 1417, Reading: Solar_Calculation_fc1, Value: 1417, Unit:
2022.03.06 11:32:43 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 15:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 1173, Reading: Solar_Calculation_fc1, Value: 1173, Unit:
2022.03.06 11:32:44 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 16:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 733, Reading: Solar_Calculation_fc1, Value: 733, Unit:
2022.03.06 11:32:44 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 17:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 0, Reading: Solar_Calculation_fc1, Value: 0, Unit:
2022.03.06 11:32:44 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 18:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 0, Reading: Solar_Calculation_fc1, Value: 0, Unit:
2022.03.06 11:32:44 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 19:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 0, Reading: Solar_Calculation_fc1, Value: 0, Unit:
2022.03.06 11:32:44 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 20:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 0, Reading: Solar_Calculation_fc1, Value: 0, Unit:
2022.03.06 11:32:44 3:  DbLog logdb -> added by addCacheLine - TS: 2022-03-07 21:00:00, Device: DUMMY_PV, Type: addlog, Event: Solar_Calculation_fc1: 0, Reading: Solar_Calculation_fc1, Value: 0, Unit:


logdb Internals:
   COLUMNS    field length used for Device: 64, Type: 64, Event: 512, Reading: 64, Value: 128, Unit: 32
   CONFIGURATION ./db.conf
   DEF        ./db.conf .*:.*
   FUUID      5ccd6a76-f33f-e34d-6489-17c96cf4ebae138d
   FVERSION   93_DbLog.pm:v4.12.6-s25478/2022-01-17
   MODE       synchronous
   MODEL      MYSQL
   NAME       logdb
   NR         20
   NTFY_ORDER 50-logdb
   PID        22797
   REGEXP     .*:.*
   STATE      connected
   TYPE       DbLog
   UTF8       1
   dbconn     mysql:database=fhem;host=127.0.0.1;port=3306
   dbuser     fhemuser
   HELPER:
     COLSET     1
     DEVICECOL  64
     EVENTCOL   512
     OLDSTATE   connected
     PACKAGE    main
     READINGCOL 64
     TC         current
     TH         history
     TYPECOL    64
     UNITCOL    32
     VALUECOL   128
     VERSION    4.12.6
     REDUCELOG:
       logdb
       reduceLogNbl
       30
   READINGS:
     2022-02-23 08:45:07   CacheOverflowLastNum 0
     2021-05-30 13:40:46   CacheOverflowLastState normal
     2022-03-06 11:32:44   CacheUsage      2259
     2021-06-10 19:15:37   countCurrent    322
     2021-06-10 19:15:37   countHistory    2903515
     2022-03-06 05:01:01   reduceLogState  reduceLogNbl finished. Rows processed: 2895841, deleted: 24192, time: 61.00sec
     2022-03-06 11:36:31   state           connected
Attributes:
   DbLogSelectionMode Include
   DbLogType  Current/History
   verbose    3


Aber angezeigt werden Sie nicht

Edit: Auch wenn in der Hilfe von DBlog steht dass im Syncron Mode direkt geschrieben wird, im FHEM Forum habe ich den Hinweis gefunden dass der Cache syncron garnicht geschrieben wird. Jetzt habe ich auf asycron umgestellt und mit commitcache auf das Dblog device alles übertragen.
Jetzt finde ich auch Daten über ein SQL Query, aber dargestellt wird nix :(
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 März 2022, 10:52:54
Zitat von: andi11 am 06 März 2022, 09:50:37
Vielen Dank für die ganze Arbeit für die Prognose.
Bin gerade die bei mir einzurichten. Allerdings krieg ich keinen FC0 und FC1 Chart

Dargestellt wird das ganze laut Wiki mit folgendem Chart
# Created by FHEM/98_SVG.pm, 2020-08-17 08:58:42
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Forecast / Calculation'
set ytics
set y2tics
set grid
set ylabel "Leistung"
set y2label "Leistung"
set yrange [0:10000]
set y2range [0:10000]

#LogDB Astro:SunAlt:::$val=($val>0?$val*50+7000:7000)
#LogDB wetter_<Wohnort>_II:solarRadiation:::$val=($val>0?$val*3+7000:7000)
#LogDB PV_1:Solar_SolarRadiation:::$val=($val>0?$val*3+7000:7000)
#LogDB Astro:SunAlt:::$val=7000
#LogDB DUMMY_PV:Solar_Calculation_fc1::
#LogDB WR_1:SW_Total_DC_P_sumOfAllPVInputs::
#LogDB WR_1:Solar_Calculation::
#LogDB WR_1:Solar_East::
#LogDB WR_1:Solar_South::
#LogDB WR_1:Solar_West::

plot "<IN>" using 1:2 axes x1y2 title 'Sonnenhöhe' ls l7 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'SolarRadiation' ls l8 lw 2 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'SolarRadiationPrognose' ls l8 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title '70%' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Calculation_fc1' ls l0 lw 2 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Total_DC_Power_(sumOfAllPVInputs)' ls l1fill lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Calculation' ls l5 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'East' ls l2 lw 0.5 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'South' ls l3 lw 0.5 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'West' ls l4 lw 0.5 with lines


Aber angezeigt werden Sie nicht

Hallo Andi,
die SVGs sind schon sehr alt und nur noch als Muster zu verstehen. Es hat in den letzten zwei Jahren sehr viele Änderungen gegeben, die sich auf die reading Namen ausgewirkt haben.
Generell ververwenden die meisten wohl bereits Grafana :-)
- Das DUMMY_PV Device gibt es nicht mehr
- Bei den einzelnen Strings ist der Wechselrichter Name noch dazu gekommen, da ich mitlerweise einen Schwarm mit 2 WR habe

#LogDB DUMMY_PV:Solar_Calculation_fc1::           <<< das ist bei Dir das WR_1 Device
#LogDB WR_1:SW_Total_DC_P_sumOfAllPVInputs::
#LogDB WR_1:Solar_Calculation::
#LogDB WR_1:Solar_East::                    <<< das sollte dann z.B. Solar_WR_1_East
#LogDB WR_1:Solar_South::
#LogDB WR_1:Solar_West::


Es wäre am Anfang sehr wichtig, wenn Du die Namen beibehalten würdest, da es da sehr viele Abhängigkeiten gibt.

Beim PV_Schedule (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#AW_Definition_PV_Schedule_.28DOIF.29) steht auch "WR_1" im Aufruf von Solar_forecast() .
Wenn Du es natürlich erstmal in einem anderen Device reinschreiben möchtest, dann müssen in der Folge auch im SVG die Device Namen angepasst werden.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 07 März 2022, 11:44:00
mein WR_1 device heist DUMMY_PV das ist für mich eine Art Sammeldevice für alles PV Wechselrichter übergreifendes.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 März 2022, 13:00:59
Zitat von: andi11 am 07 März 2022, 11:44:00
mein WR_1 device heist DUMMY_PC das ist für mich eine Art Sammeldevice für alles PV Wechselrichter übergreifendes.
Mein Ansatz ist jedoch, dass es eine PV-Anlage gibt, die dann aus mehreren Wechselrichtern bestehen kann.
Der WR_1 ist dabei der Master und nimmt dann auch die Leistungsprognose der kompletten Anlage auf.
Im WR_1 findest Du bei readings mit SW_* , die die Schwarm erweiterung darstellt. Bei mehreren Wechselrichtern sind dann die
zusätzlichen Strings vom WR_2 als *.PV[4|5|6] dargestellt. Der zweite WR besteht dann nur aus einer minimalen Darstellung im WR_2 Device
und alle wichtigen Werte sind in das WR_1 Device gemappt.
Wenn Du einen anderen Ansatz verfolgen möchtest, hat das natürlich auf viele Devices einen Einfluss.

Die Solar_forecast() Funktion kann ihre Werte erstmal in jedes anderre Device schreiben, dann sind natürlich die SCVs, Grafana Graphen, DbLog Auswertungen und
verschiedenste ander Devices entsprechend darauf an zu passen.

In Deinem Dummy_PV sehe ich auch noch eigene Statistiken, die der Plenticore mit dem WR_1_API schon selber liefert.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 07 März 2022, 14:33:16
Ich werde mich ans Konzept vom WIKI halten, das passt gut zu meinem Setup.
Ich habe:
2 Wechselrichter in eigenen Devices (aktuell ein Solis und ein Huaju), und eben DUMMY_PV da sind Summendaten usw. drin.

Eigentlich denke ich dass ich bereits alle Stellen von WR_1 auf DUMMY_PV geändert habe. Ja im SVG sind noch in manchen Stellen WR_1 verweise, aber die interessieren mich momentan nicht.

Wenn ich das Thema Forcast im Griff habe schau ich dann was von meinen bisherigen manuellen Auswertungen besser durch die neuen Möglichkeiten ersetzen werden kann.

Mein Kernthema ist momentan dass ich keine DUMMY_PV:Solar_Calculation_fc1 readings habe. Eigentlich sollten die aber korrekt erzeugt werden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 März 2022, 18:02:33
Zitat von: andi11 am 07 März 2022, 14:33:16
Ich werde mich ans Konzept vom WIKI halten, das passt gut zu meinem Setup.
Ich habe:
2 Wechselrichter in eigenen Devices (aktuell ein Solis und ein Huaju), und eben DUMMY_PV da sind Summendaten usw. drin.

Eigentlich denke ich dass ich bereits alle Stellen von WR_1 auf DUMMY_PV geändert habe. Ja im SVG sind noch in manchen Stellen WR_1 verweise, aber die interessieren mich momentan nicht.

Wenn ich das Thema Forcast im Griff habe schau ich dann was von meinen bisherigen manuellen Auswertungen besser durch die neuen Möglichkeiten ersetzen werden kann.

Mein Kernthema ist momentan dass ich keine DUMMY_PV:Solar_Calculation_fc1 readings habe. Eigentlich sollten die aber korrekt erzeugt werden.

Du scheinst beim Aufruf von Solar_forecast() mal als reading Solar_CalculationT angegeben zu haben.
Die addlog Einträge sehen doch auch gut aus???

Aber jetzt verstehe ich erst mal, warum Du andere Device Namen hast :-) Du überträgst das alles auf andere Wechselrichter.
Das sollte aber auch funktionieren.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 07 März 2022, 20:10:44
Zitat von: ch.eick am 07 März 2022, 18:02:33
Du scheinst beim Aufruf von Solar_forecast() mal als reading Solar_CalculationT angegeben zu haben.
Ja hatte ich mal zum testen, aber eigentlich habe ich alles wieder zurück geändert.
Jap eigentlich sollte es klappen :)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 März 2022, 09:43:44
Zitat von: andi11 am 07 März 2022, 20:10:44
Ja hatte ich mal zum testen, aber eigentlich habe ich alles wieder zurück geändert.
Jap eigentlich sollte es klappen :)
Du kannst im Dummy_PV Device die readings auch einfach löschen, dann werden sie einfach wieder neu angelegt, da in Deinem List noch die T readings zu sehen waren.

Was klappt den jetzt eigentlich nicht?
Was fehlt Dir noch?
Sind in der Datenbank die Einträge vorhanden?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 08 März 2022, 12:28:27
Berechnung klappt, Readings für fc0 und fc1 werden laut Dblog Logeintrag angelegt aber im Cache. Vermutlich findet sie daher eine select query mit mysql tools nicht.
Wa nicht klappt ist das die Werte dann im SVG landen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 März 2022, 13:37:22
Zitat von: andi11 am 08 März 2022, 12:28:27
Berechnung klappt, Readings für fc0 und fc1 werden laut Dblog Logeintrag angelegt aber im Cache. Vermutlich findet sie daher eine select query mit mysql tools nicht.
Wa nicht klappt ist das die Werte dann im SVG landen.
Dann schau mal bitte, wie oft Dein Cache in die Datenbank geschrieben wird. Das ist im Wiki beim DbLog irgend wo hinterlegt.
Es ist natürlich eine kurze Verzögerung, bis es in der Datenbank steht.

Das SVG holt sich dann später die daten aus der Datenbank.
Ich würde es jedoch direkt mit Grafana machen. Da gibt es einen Docker Container und Du überspringst direkt die Limitierungen vom SVG.
Gerade beim Stapeln von Messwerten aus dem PV Monitoring hat mir da einiges gefehlt.

Für Dich speziel wäre auch zu überlegen, ob Du nicht die WR Devices so umbaust, dass sich die readings der Kostal Implementierung ergeben. Damit würde es dann besser in diese Implementierung passen und Du könntest am Ende eventuell auch das Dashboard verwenden. Wenn Du das ansonsten umbauen möchtest, dann wirst Du sehr viel Zeit aufwenden müssen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 08 März 2022, 17:28:30
Mein DBLog Device Internals:
   COLUMNS    field length used for Device: 64, Type: 64, Event: 512, Reading: 64, Value: 128, Unit: 32
   CONFIGURATION ./db.conf
   DEF        ./db.conf .*:.*
   FUUID      5ccd6a76-f33f-e34d-6489-17c96cf4ebae138d
   FVERSION   93_DbLog.pm:v4.12.6-s25478/2022-01-17
   MODE       synchronous
   MODEL      MYSQL
   NAME       logdb
   NR         20
   NTFY_ORDER 50-logdb
   PID        22797
   REGEXP     .*:.*
   STATE      connected
   TYPE       DbLog
   UTF8       1
   dbconn     mysql:database=fhem;host=127.0.0.1;port=3306
   dbuser     fhemuser
   HELPER:
     COLSET     1
     DEVICECOL  64
     EVENTCOL   512
     OLDSTATE   connected
     PACKAGE    main
     READINGCOL 64
     TC         current
     TH         history
     TYPECOL    64
     UNITCOL    32
     VALUECOL   128
     VERSION    4.12.6
     REDUCELOG:
       logdb
       reduceLogNbl
       30
   READINGS:
     2022-02-23 08:45:07   CacheOverflowLastNum 0
     2021-05-30 13:40:46   CacheOverflowLastState normal
     2022-03-08 17:00:00   CacheUsage      2931
     2021-06-10 19:15:37   countCurrent    322
     2021-06-10 19:15:37   countHistory    2903515
     2022-03-08 05:01:09   reduceLogState  reduceLogNbl finished. Rows processed: 2907099, deleted: 31344, time: 69.00sec
     2022-03-08 17:24:42   state           connected
Attributes:
   DbLogSelectionMode Include
   DbLogType  Current/History
   verbose    3


OK

Abweichend zum Wiki habe ich noch nicht auf asyncron gestellt. In der Hilfe zum Modul steht aber "In synchronous mode (normal mode) the events won't be cached im memory and get saved into database immediately. If the database isn't available the events are get lost."

Mit der Namensanpassung hast du sicherlich recht. Grafana möchte ich jetzt halt erstmal nicht auch noch als Baustelle aufreißen. Dashboard ist nicht meine Prio1 sondern erstmal Steigerung des Eigenverbrauchs, und dafür ist Vorhersage elementar. Und um hier die Logik besser zu verstehen eben eine Anzeige.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 März 2022, 18:42:31
Zitat von: andi11 am 08 März 2022, 17:28:30
Abweichend zum Wiki habe ich noch nicht auf asyncron gestellt. In der Hilfe zum Modul steht aber "In synchronous mode (normal mode) the events won't be cached im memory and get saved into database immediately. If the database isn't available the events are get lost."
Und das ist genau der Grund warum nichts in der Datenbank ankommt :-)

Zitat
Mit der Namensanpassung hast du sicherlich recht. Grafana möchte ich jetzt halt erstmal nicht auch noch als Baustelle aufreißen. Dashboard ist nicht meine Prio1 sondern erstmal Steigerung des Eigenverbrauchs, und dafür ist Vorhersage elementar. Und um hier die Logik besser zu verstehen eben eine Anzeige.
Ich habe auch erst Daten gesammelt und optimiert, bevor ich dann die Daten aufbereitet habe.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 09 März 2022, 06:30:22
Hab jetzt das SVG zum laufen bekommen.
async im DBLog device aktiviert. In meiner SVG Config hatte ich scheinbar einen Fehler bei der Defintion. Egal welchen Wert ich benutzt hatte (auch wenn es was ganz anders war, dass sicher ging wurde nix angezeigt) Habs jetzt nochmal neu zusammengesetzt jetzt geht das.
Vielen Dank

2te Frage: Die Autokorrektur generiert aus dem Reading SW_Total_DC_P_sumOfAllPVInputs  die Korrekturwerte. Ich kann leider nur mit AC Werten dienen (die ja an sich auch die wichtigeren sind)
Ich habe ein Dummy Device in dem ich momentan eigenverbrauch usw berechne. Desweiteren einen Dummy der die Momentanleistung und Absolutwerte aller Wechselrichter summiert. Soll ich den Forecast lieber in den Zähler rein packen? Bin unsicher da ich momentan einen Batteriewechselrichter und 2 getrennte PV Wechselrichter habe. Demnächst wird der Batteriewechselrichter und 1 PV Wechselrichter durch einen Solis RHI Hybridwechselrichter getauscht. Ob ich dann eine brauchbare Momentanerzeugungsleistung habe weiß ich noch nicht.
Habe noch Direktzugang zu allen Wechselrichters über HTTPMOD und gehe davon aus dass ich das beim neuen auch haben werde. Dieser Weg gibt aber nicht soviele Infos her

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 09:21:08
Zitat von: andi11 am 09 März 2022, 06:30:22
Hab jetzt das SVG zum laufen bekommen.
async im DBLog device aktiviert. In meiner SVG Config hatte ich scheinbar einen Fehler bei der Defintion. Egal welchen Wert ich benutzt hatte (auch wenn es was ganz anders war, dass sicher ging wurde nix angezeigt) Habs jetzt nochmal neu zusammengesetzt jetzt geht das.
Vielen Dank

2te Frage: Die Autokorrektur generiert aus dem Reading SW_Total_DC_P_sumOfAllPVInputs  die Korrekturwerte. Ich kann leider nur mit AC Werten dienen (die ja an sich auch die wichtigeren sind)
Ich habe ein Dummy Device in dem ich momentan eigenverbrauch usw berechne. Desweiteren einen Dummy der die Momentanleistung und Absolutwerte aller Wechselrichter summiert. Soll ich den Forecast lieber in den Zähler rein packen? Bin unsicher da ich momentan einen Batteriewechselrichter und 2 getrennte PV Wechselrichter habe. Demnächst wird der Batteriewechselrichter und 1 PV Wechselrichter durch einen Solis RHI Hybridwechselrichter getauscht. Ob ich dann eine brauchbare Momentanerzeugungsleistung habe weiß ich noch nicht.
Habe noch Direktzugang zu allen Wechselrichters über HTTPMOD und gehe davon aus dass ich das beim neuen auch haben werde. Dieser Weg gibt aber nicht soviele Infos her
Hallo Andi,
meine Empfehlung wäre, einen Master Wechselrichter WR_1 zu definieren, was bei mir der WR mit dem Speicher ist.
Dort sind bei mir per Definition alle zentralen Werte abgelegt, die die gesamt Anlage betreffen.
Eine PV-Anlage besteht somit aus ein 1-n Wechselrichtern und eventuellem Zubehör, also auch einem Speicher.
Deshalb lege ich im WR_1 auch die Prognose ab.
Im WR_1 habe ich auch die die String Informationen der anderen WR abgelegt, WR_1 hat string 1 und 2, an String 3 ist der Speicher und alle weiteren Strings, also 3 und 5
habe ich einfach über userreadings rein gemapped.
Auch der Hausverbrauch und andere zentrale Werte sind dort zu finden. In den userreadings werden somit alle zusammengehörigen Werte behandelt, da diese ja auch in einem Schwarm teilweise korrigiert werden müssen.

Am Anfang ist es erstmal wichtig alle Daten, die im Zugriff sind zu sammeln und per Namensstandard zu gruppieren. Es ist dabei egal, über welchen Weg Du daran kommst, also HTTPMOD oder ModBus oder was auch immer.

Für die Struktur schau Dir eventuell nochmal mein Wiki an, da erkennst Du in der Namensgebung was zusammen gehört und die Struktur dahinter.

Die Autokorrektur solltest Du jetzt besser noch weg lassen, da Du zuerst die Prognose generell auf Deine Wechselrichter und die Strings anpassen musst.
Erst wenn das passt, kann man dann noch etwas nach justieren. Ob Du die AC oder DC Werte dann korrigierst ist eigentlich egal, das optische Ergebnis ist das wichtige dabei.

Gruß
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 10:05:49
Von Andi
Zitat
Andere Frage: Ich wohne direkt am Fuß eines Hügels, der östlich von mir liegt. Dementsprechend verschattet der in der früh  durch die höher gelegenen Häuser. Gibt es eine Möglichkeit z.b. solar_plain so zu erweitern dass es das etwas kompensiert? Es müsste eine Kombination von Azimuth und Elevation sein, aber wie ich das verrechnen kann weiß ich nicht. Schlimmstenfalls pro Modulgruppe einzeln. Sowas wie "Mindestsonnenstand dass die Anlage arbeitet"
Solar_plain()
Die Funktion reagiert auf das Attribut verbose >=3 vom Device mit dem Namen Astro

Dann gibt es zwei Grenzbereiche, die man sehr fein granular justieren könnte.

- Durch optische Kontrolle sollte man beobachten, zu welcher Uhrzeit die Sonne morgens und abends zu den kritischen
  Zeiten das erste mal richtig auf den Modulen steht. Hier ist natürlich auch das Datum wichtig und auch Schatten von Bergen oder dem Nachbarn.
- Aus den Wechselrichter Werten erkennt man zusätzlich ab wann die Produktion beginnt und wann sie endet.
- Dann aktiviert man das Logging
- und verwendet die Testaufrufe aus dem Wiki, man muss also nicht warten, bis eine Astro Konstellation in der Natur auftritt :-)
- Bei den Testaufrufen geht man nun auf 06:00, 07:00, 08:00, 09:00 Uhr und schaut sich den Faktor an
- In meinem Bild kommt von 6-8 Uhr eine 0.001 zurück, wodurch die Prognose auf 0 gezogen wird.
- ab 9 Uhr geht es dann erst richtig los.
- Dann kann man im Log die Elevation ablesen und an der Stelle "if ($elevation <= 0.1798)" ganz vorsichtig etwas nach justieren


    # avoid unrealistic values (normally formula should only be used within boundaries of orientation +/- 90 degrees)
    if ($elevation <= 0.1798) {
      if ($verbose >= 3) { Log 3, "Solar_plain factor           : ".$factor };
      return($factor);
    };

und

    # avoid too big values
    if ($factor > - 0.05 && $factor < 0.05) {
      $factor = 0.05
    };
    if ($verbose >= 3) { Log 3, "Solar_plain factor           : ".$factor };
    return ($factor);



Wichtig sind natürlich auch die korrekten Astro Werte in fhem.cfg, insbesondere die altitude, also die Höhedes Standortes + die Haushöhe ;-)

attr global altitude 93
attr global latitude 49.85345
attr global longitude 8.46780


- Zum Schluss sollte man das auch noch mal mit Sommer und Winter Daten testen und dort einen goldenen Mittelweg finden.

Bitte denkt immer daran, das ist nur eine Näherung an die Natur. An manchen Tagen passt es bei mir auf 1-2 kWh und an anderen Tagenliegt es halt rund 10 % daneben.
Für meine Optimierungsentscheidungen ist es jedoch gut genug und dazu noch unabhängig von ständig wechselnden Diesten im WEB.
Der Deutsche Wetterdienst (DWD) ist in seinem Angebot ziemlich stabiel und hält sich dazu noch an normierte Wetter Größen.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 09 März 2022, 10:14:57
super Ansatz. Wie kann ich passende Grenzwerte finden die Sommer und Winter passt?
Muss die Sonne einfach eine gewisse Höhe überschreiten? Die Werte kann ich dank Vergleich Prognose und aktueller Produktion ja fast aus einem Chart lesen. Aber passt dieser Wert automatisch für das ganze Jahr?

Ich würde die Funktion tendenziell so erweitern dass Grenzen als Parameter aus dem _config device übergeben werden können, da sich der Effekt bei meinen Panelgruppen unterschiedlich auswirkt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 10:31:45
Zitat von: andi11 am 09 März 2022, 10:14:57
super Ansatz. Wie kann ich passende Grenzwerte finden die Sommer und Winter passt?
Muss die Sonne einfach eine gewisse Höhe überschreiten? Die Werte kann ich dank Vergleich Prognose und aktueller Produktion ja fast aus einem Chart lesen. Aber passt dieser Wert automatisch für das ganze Jahr?

Ich würde die Funktion tendenziell so erweitern dass Grenzen als Parameter aus dem _config device übergeben werden können, da sich der Effekt bei meinen Panelgruppen unterschiedlich auswirkt.
Oh, ich hatte das Bild noch vergessen.
Das es durch die DWD Daten nur im ein Stunden Rythmus berechnet wird wandert die WR Kurve, wie im Bild zu sehen gerade langsam in die früheren Stunden.
Ab einem gewissen Datum kommt dann aus Solar_plain() für 7:00 Uhr keine 0.001 mehr und schon klappt die Prognose auf der Zeitachse auseinander.
Es bleibt halt immer nur eine Näherung. Wenn Du mal einen kompletten Jahreszyklus durchlaufen hast wirst Du eine Elevation finden, die näherungsweise passt.

- Wolken und Regen lässt sich noch anpassen, wenn man z.B. in seiner Region Effekte hat, die besonders berücksichtigt werden müssen.
- Danach kommt dann ein eventueller forecast_faktor, mit dem man die komplette Prognose heben oder senken kann.
- auch die Modul Ausrichtung kann gradweise eingetragen werden, also nicht nur -90 , 0 , 90
- Und ganz zum Schluss kommt dann die Autokorrektur, für die man aber erstmal Daten in der Datenbank haben muss :-)

Das mit dem Parameter wollte ich auch schon gemacht haben, der reagiert aber so stark auf Veränderung, dass sich eh jeder bei mir meldet ;-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 09 März 2022, 10:34:35
Zitat von: ch.eick am 09 März 2022, 10:31:45
- auch die Modul Ausrichtung kann gradweise eingetragen werden, also nicht nur -90 , 0 , 90
ich benutze auch 180 da ich aus optischen Gründen auf meinem Gartenhaus auch Module auf der Nordseite habe (und auch wissen will was das so in der Realität bringt)

Durch den Ansatz mit solar_plain von dir kann ich jetzt schon einen korrekten Wert ermitteln denke ich.
Ich habe schon länger Wechselrichter Daten, d.h. ich kann für Sommer und Wintersonnwende schauen ab wann der WR Leistung produziert und entsprechend mit dem Mindestsonnenstand abgleichen
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 11:20:18
Zitat von: andi11 am 09 März 2022, 10:34:35
ich benutze auch 180 da ich aus optischen Gründen auf meinem Gartenhaus auch Module auf der Nordseite habe (und auch wissen will was das so in der Realität bringt)
Ich meinte eher -73 , +47 , ... :-) Es gibt ja doch mehr gedrehte Häuser, als die die eine echte Süd Ausrichtung haben.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 12:50:32
Von Andi
Zitat
hast du mal überlegt noch folgendes in die Config zu packen?
module_x_factor (Könnte Alterung, Wandlungsverluste, unterschiedliche Wirkungsgrade Modulgruppenspezifisch abfangen) Ich habe jetzt die Modulleistung entsprechend runtergerechnet. Schöner wäre halt ein extra Faktor
Das macht es aber auch beliebig komplex und es wird jetzt schon nur von den wenigsten verstanden.
Da es ja auch nur eine Näherung auf Stunden Basis ist und auch die rad1h Werte des DWD nicht so dolle sind wäre das schon ziemlich über dimensioniert.
Je nach Wohnort gibt es ja oft gar keine Wetterstation, die die rad1h Werte liefert und dann liegt man schon sehr daneben mit seiner Berechnung.

Viel schwieriger wird es da bei Wolken und Regen, was ich über eine "Heizungskurve" umgesetzt habe und das dann eher eine gefühlte Implementierung ist.

Zitat
module_x_SunStartAltitude Sonnenhöhe zu der die Beschattung der Reihe endet (Morgensonne kommt verspätet auf die Module)
module_x_SunEndAltitude Sonnenhöhe zu der die Beschattung der Reihe anfängt (Abendsonne kommt nicht mehr auf die Module)

Die beiden letzten Parameter in Grad, denn dann kann man mit Astro sehr schön den Sonnenstand zu einer bestimmten Uhrzeit berechnen lassen.
Wenn dann sind beide Winkel zu berücksichtigen , also Altitude und Latitude um Sommer und Winter zu berücksichtigen.
Ich hatte mich einfach auf das Abfangen der Grenzwerte beschränkt, da ich schon etwas länger aus der Schule bin ;-)

Zitat
ganz optional: module_x_ tempk  (Ich habe unterschiedliche Modultechnologien)
Liegen die denn wirklich soooo weit auseinander?
Wichtiger wäre ein temperatursensor an den Modulen, was bisher keiner hat.
Ich nehme da den Sensor aus meiner Wärmepumpe, die im Süden voll in der Sonne steht und addiere da noch einige Grad drauf.
Das mit der Temperatur hatten wir ja schon geändert, es ist jetzt die Prognose vom DWD +10° , aber dieser Stelle könnte man besser einen Sensor an den Modulen verwenden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 09 März 2022, 13:04:12
Komplex macht es im ersten Moment die Vermischung von Kostal, Vorhersage und Eigenverbrauchsoptimierung (zumindest gefühlt) ohne grobe graphische Skizze.

Die Verschmischung macht großteils Sinn. Der WIKI Artikel ist sehr gut nachvollziehbar, aber sehr lang. Evl könnte eine Auftrennung in Basis (Vorhersage mit SVG) + bessere Charts mit Grafana helfen, und Eigenverbrauchsoptimierung helfen?
Beim ersten anschauen des Artikels hab ich als es mit Kostal anfing nicht mehr weitergelesen und den Goldschatz übersehen.... Mit der Schwarmaufteilung hast du es super aufgezogen, irritierend ist aber dass der Chef im Ring der Kostal WR ist (ich weiß Kostal nennt den auch Master). Ich hab keinen solchen Master, daher scheint mir ein virtueller Master hier einfacher verständlich. "Wir definieren ein Device dass folgende Readings bereitstellen muss... Das kann innerhalb eines WRs sein oder in einem Dummy. Achtung wenn es in einem WR ist, wird es komplexer falls z.b. nach einem defekt der Kostal WR durch SMA ersetzt wird"

Ein Faktor auf Modulebene kann es hier vereinfachen. "Mein Modulstring Hans liefert immer zuviel Leistung, den rechne ich einfach runter z.b. weil da Tagsüber die Satschüssel mal im Weg ist) Modulstring Herbert betrifft das aber nicht." Selbst meine China Wechselrichter liefern Stringmomentan und Tageswerte über die Cloud App, damit kann man vergleichsweise gut skalieren.

Ich könnte den Temperatursensor von meinem Windmesser bieten. Der steht neben den Modulen auf dem Dach. Wie ich das verknüpfe habe ich aber noch nicht verstanden (und auch noch nicht genauer angeschaut)
Nein der Temperaturkoeffizient ist ähnlich, daher wäre der Wert auch optional.

Muss für die Früh/Abendverschattung der Sonnenstand groß mitverwendet werden? Vormittag gilt dieser Grenzwert, Nachmittag gilt der andere Grenzwert?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 13:43:52
Zitat von: andi11 am 09 März 2022, 13:04:12
Komplex macht es im ersten Moment die Vermischung von Kostal, Vorhersage und Eigenverbrauchsoptimierung (zumindest gefühlt) ohne grobe graphische Skizze.
Tja, wie immer ist es mit den Ideen gewachsen.

Zitat
Die Verschmischung macht großteils Sinn. Der WIKI Artikel ist sehr gut nachvollziehbar, aber sehr lang. Evl könnte eine Auftrennung in Basis (Vorhersage mit SVG) + bessere Charts mit Grafana helfen, und Eigenverbrauchsoptimierung helfen?
Das Wiki war meine Dokumentation :-) und ich wollte nicht aufteilen, damit der Zusammenhang nicht verloren geht.

Zitat
Beim ersten anschauen des Artikels hab ich als es mit Kostal anfing nicht mehr weitergelesen und den Goldschatz übersehen.... Mit der Schwarmaufteilung hast du es super aufgezogen, irritierend ist aber dass der Chef im Ring der Kostal WR ist (ich weiß Kostal nennt den auch Master). Ich hab keinen solchen Master, daher scheint mir ein virtueller Master hier einfacher verständlich. "Wir definieren ein Device dass folgende Readings bereitstellen muss... Das kann innerhalb eines WRs sein oder in einem Dummy.
Die Probleme hatte ich auch bemerkt und da schon begonnen die Device Namen in einen Namensstandard zu überführen.
WR_1 ist somit der Chef im Ring, egal was es für ein Wechselrichter ist. In einem anderen Thread wurde schon mal begonnen eine Standard bei den readings zwischen SMA und Kostal zu definieren, was aber letzt endlich nicht zu einem Ergebnis geführt hat. Kostal liefert viel mehr Informationen, die bei SMA namuell erst noch berechnet werden müssen :-(

Umsetzbar wäre das dann wie Du geschrieben hast mit einem Dummy Device, was jedoch wieder eine menge an umkopieren von Daten bedeuten würde. Da selbst der RPI 4 bei mir bereits ziemlich gut gefüllt ist muss ich auf die zusätzlichen Events verzichten ;-) es stockt so auch schon mal, wenn zuviel HTTPMOD im Hintergrund läuft.

Zitat
Achtung wenn es in einem WR ist, wird es komplexer falls z.b. nach einem defekt der Kostal WR durch SMA ersetzt wird"
Den Austauschfall am Master hatte ich erst gerade. Das habe ich bei den Zählern gemerkt, die ich gerne fortlaufend haben wollte :-) Das hat dank Vorbereitung aber soweit geklappt.
Nur die Statistiken von Monat und Jahr muss man dann leider mit einem Offset um den vorherigen Zeitraum anheben, was mich jetzt bis anfang April und dann bis zum Jahreswechsel begleitet :-(

Wenn es ein komplett anderer WR ist, dann muss man eh einiges neu aufsetzen.

Zitat
Ein Faktor auf Modulebene kann es hier vereinfachen. "Mein Modulstring Hans liefert immer zuviel Leistung, den rechne ich einfach runter z.b. weil da Tagsüber die Satschüssel mal im Weg ist) Modulstring Herbert betrifft das aber nicht." Selbst meine China Wechselrichter liefern Stringmomentan und Tageswerte über die Cloud App, damit kann man vergleichsweise gut skalieren.
Hier fällt mir nur Schattenmanagement oder Leistungsoptimierer ein, das ist so speziel, das kann nicht in die Prognose rein.
Mein Schattenmanagement habe ich im PV_Schedule eingebaut und aktiviere es nur zu bestimmten Zeiten. Der Plenticoe kann das über die API.
Experimentell habe ich mal versucht eine Verdeckung von Schnee zu erkennen, da ist aber noch nichts gescheites bei raus gekommen und bisher war kein Schnee da :-)

Zitat
Ich könnte den Temperatursensor von meinem Windmesser bieten. Der steht neben den Modulen auf dem Dach. Wie ich das verknüpfe habe ich aber noch nicht verstanden (und auch noch nicht genauer angeschaut)
Das müsste man noch einbauen. Im Moment wird die Temperatur vom DWD +10 genommen, was ja auch mehr Sinn macht, da ich ja stundenweise Werte in der zukunft brauche.
Ob es jetzt 10° oder mehr sind, könnte man mal messen, aber auch das wird zwischen morgens, mittags und abends schwanken. Das wären dann wieder drei Offsets in der Konfig :-)

Zitat
Nein der Temperaturkoeffizient ist ähnlich, daher wäre der Wert auch optional.
Deshalb ist es auch nur einer :-)

Zitat
Muss für die Früh/Abendverschattung der Sonnenstand groß mitverwendet werden? Vormittag gilt dieser Grenzwert, Nachmittag gilt der andere Grenzwert?
Schau Dir bitte mal die Winkel und Faktoren von Solar_plain() im Log dazu an. Anhand des Rückgabe Wertes von 0.001 oder 0.5 kannst Du unterscheiden wann welcher Grenzwert gezogen hat.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 09 März 2022, 13:53:37
Zitat von: ch.eick am 09 März 2022, 13:43:52
Schau Dir bitte mal die Winkel und Faktoren von Solar_plain() im Log dazu an. Anhand des Rückgabe Wertes von 0.001 oder 0.5 kannst Du unterscheiden wann welcher Grenzwert gezogen hat.
Vielleicht war mein reading Name schlecht gewählt.
MindesthoeheMorgens und MindesthoeheAbends
Trennung Morgens <>Abends anhand "Vor oder nach 12Uhr" oder Winkel >180° im Astromodul, dann Abendswert.

den Wert ausschließlich anhand einer Mindesthoehe zu limiteren reicht denke ich z.b. in meinem Fall nicht aus. Früh hab ich Schatten, abends geht die Sonne einfach nur unter.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 14:12:36
Von Andi
Zitat
Du hast da echte Schätze in dem Artikel. Im Bereich der SVG Veränderung, webcmd Kennzeichnung und lauter kleine Details :)
Man gibt sich halt Mühe :-)

Zitat
steuerst du deine Wärmepumpe "nur" mit diesem DOIF und dem Shelly also ohne Sperrzeiten usw?
Achtung, ich habe eine Zyklische Wärmepumpe und noch keine oszilierende.
Nein, als erstes muss die Wärmepumpe bis zum letzten auf das Haus und die Bewohner optimiert werden!!!
Die WP läuft erstmal generell autark und macht was sie will :-) :-)
- Sperrzeiten habe ich für WW, damit es von sich aus immer in der PV Zeit liegt und nicht von 12:00 Uhr
- Eine Tagesanhebung um 4K  zwischen 10:00 und 16:00 Uhr bringt die WP ordentlich ans Heizen
- Die Nachtabsenkung von 8K in der Restzeit minimiert die Heizung und bedient sich aus dem Mehrfachpufferspeicher
Hier kommt jetzt FHEM
- von 18:30 bis 2:00 Uhr schalte ich mittlerweile die Heizung komplett über FHEM ab
- Zwischen 2:00 und ca 9:00 Uhr habe ich dann 2-3 Heizzyklen, wo die WP mal anspringt und den Puffer nachheizt

- Nach der Leistungsprognose wird dann auch mal der PV-Modus der WP aktiviert, was meist in der Überganszeit passiert.
  Das macht dann der Shelly, als potentialfreies Signal auf den SG-Ready Eingang der WP.

Den PV-Modus verwende ich zusätzlich, um bei Besuch und zum geplanten Putzen mal das WW auf 60° zu heizen.
Wir haben mittlerweile in der Küche eine Tradfri remote control, mit der wir die Zirkulationspumpe und den PV-Modus
aktivieren können, das ist end Geil :-)

Zitat
Mir gefällt das richtig gut dass die Vorhersage meldet wieviel die PV Anlage heute noch liefern wird.
Überlege in Richtung "Es ist Mittag, der COP der LWP ist hoch, hat der Speicher genug Platz für die Restenergie oder soll die Pumpe mal bissl mehr laufen"
Das macht ja mein DOIF, wobei der COP nicht so extrem wichtig ist. Um 14:00 Uhr wäre die höchste Außentemperatur, aber da kann es bei schlechtem Wetter
schon knapp mit der PV-Leistung werden. Deshalb bin ich auf 12:00 Uhr gegangen.

Beim Accu gilt immer, ein direkter Verbrauch ist besser als speichern.
Deshalb immer zuerst die WP aktivieren und den Hausspeicher (ACCU) nur die Reste einsammeln lassen.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 14:22:49
Zitat von: andi11 am 09 März 2022, 13:53:37
Vielleicht war mein reading Name schlecht gewählt.
MindesthoeheMorgens und MindesthoeheAbends
Trennung Morgens <>Abends anhand "Vor oder nach 12Uhr" oder Winkel >180° im Astromodul, dann Abendswert.

den Wert ausschließlich anhand einer Mindesthoehe zu limiteren reicht denke ich z.b. in meinem Fall nicht aus. Früh hab ich Schatten, abends geht die Sonne einfach nur unter.
Die Funktion Solar_plan() ist eine reine Winkel Korrektur und sollte nichts mit Schattenmanagenet zu tun haben.
Die Korrektur des elevation Wertes dient nur dazu bei bestimmten berechneten Winkel die ungültigen Werte zu eliminieren.
Die Winkelberechnungen sind nur in einem definierten Bereich gültig.

Ab wann zündet denn Deine Anlage morgens? Das wäre dann der Winkel Bereich, der den ersten Faktor > 0.001 liefern sollte.
Du hast natürlich recht, man könnte auch die eingangs Winkel für die Winkelberechnung limitieren, jedoch fand ich es besser einfach den Müll wieder weg zu schmeißen.
Die Grundfunktion ist übrigens auch nicht von mir, sondern nur addaptiert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 09 März 2022, 14:42:52
Zitat von: ch.eick am 09 März 2022, 14:22:49
Die Funktion Solar_plan() ist eine reine Winkel Korrektur und sollte nichts mit Schattenmanagenet zu tun haben.
Die Korrektur des elevation Wertes dient nur dazu bei bestimmten berechneten Winkel die ungültigen Werte zu eliminieren.
Die Winkelberechnungen sind nur in einem definierten Bereich gültig.
Macht Sinn :)

Zitat von: ch.eick am 09 März 2022, 14:22:49
Ab wann zündet denn Deine Anlage morgens? Das wäre dann der Winkel Bereich, der den ersten Faktor > 0.001 liefern sollte.
Aktuell ab 8.30 die entsprechende Sonnenstandhöhe habe ich als mindestwert in solar_plain eingetragen. Diese Sonnenstandshöhe hat aber nichts mit der (in diesem Fall unnötigen erhöhten) Begrenzung abends zu tun. Hab nur auf einer Seite einen Berg neben unserem Haus :)

Der bessere Platz wäre hier wohl eine Erweiterung von Solar_forcast. Alternativ denkbar wäre eine Begrenzung durch Aufruf einer weiteren Funktion z.b. Solar_shadow() Hier könnten eigene Perl Begrenzungen implementiert werden. da als Parameter azimuth,elevtion,modulname usw übergeben werden.
Das Schattenthema wird wohl immer so Anwendungsspezifisch sein dass es kaum mit ein paar generischen Readings abzudecken werden)

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 15:36:39
Zitat von: andi11 am 09 März 2022, 14:42:52
Macht Sinn :)
Aktuell ab 8.30 die entsprechende Sonnenstandhöhe habe ich als mindestwert in solar_plain eingetragen. Diese Sonnenstandshöhe hat aber nichts mit der (in diesem Fall unnötigen erhöhten) Begrenzung abends zu tun. Hab nur auf einer Seite einen Berg neben unserem Haus :)
Okay, bei mir geht es um 7:00 los und endet um 18:00 Uhr, bei einer Aufteilung könnte auch ich morgens und abends genauer korrigieren.

Zitat
Der bessere Platz wäre hier wohl eine Erweiterung von Solar_forcast. Alternativ denkbar wäre eine Begrenzung durch Aufruf einer weiteren Funktion z.b. Solar_shadow() Hier könnten eigene Perl Begrenzungen implementiert werden. da als Parameter azimuth,elevtion,modulname usw übergeben werden.
Das Schattenthema wird wohl immer so Anwendungsspezifisch sein dass es kaum mit ein paar generischen Readings abzudecken werden)

Für meinen Standort wäre vormittags

get Astro text SunAz  "2022-03-09 12:00:00"
==> 168.8


Hier mal zum Testen mit der Aufteilung für Vormittag und Nachmittag. Den Elevation Grenzwert könnte man dann in das WR_1_config Device legen.


    # avoid unrealistic values (normally formula should only be used within boundaries of orientation +/- 90 degrees)

    if ($azimuth < 180) {
      if ($elevation <= 0.1798) {
        if ($verbose >= 3) { Log 3, "Solar_plain factor           : ".$factor };
        return($factor)
      }
    } else {
      if ($elevation <= 0.1798) {
        if ($verbose >= 3) { Log 3, "Solar_plain factor           : ".$factor };
        return($factor)
      }
    };


Achtung, alle korrekten Werte würden einfach ohne Änderung durch die Abfrage weiter laufen, also nicht einfach den Code optimieren :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 09 März 2022, 15:40:11
dankeschön :)
hab ich mal eingebaut (mit für mich angepasste Sonnenhöhe). werde morgen berichten
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 März 2022, 16:05:06
Zitat von: andi11 am 09 März 2022, 15:40:11
dankeschön :)
hab ich mal eingebaut (mit für mich angepasste Sonnenhöhe). werde morgen berichten
Bei mir wäre der Wert um 8 Uhr im Moment viel zu hoch, aber Du kannst es ja mal testen. Wenn es praktikabel ist bau ich die Parameter ins WR_1_config ein.
Die Höhe der Prognose Leistung um z.B. 8 Uhr hängt natürlich stark vom DWD ab, aber da müsste ich dann mal einen Graphen sehen.

EDIT: Hier nochmal ein Graph für die Prognose und die Realität. Die Autokorrektur ist momentan noch aus, weil mir die Realität extreme Werte in der Datenbank geliefert hat
und da erstmal ruhe rein kommen soll :-)

Das Bunte sind die einzelnen Strings. Um 9 Uhr liegt es drüber und um 8 Uhr drunter. Ein geometrisches Überlagern bringt jedoch den Ausgleich.
Die summierte Prognose liegt für heute bei 75 kWh wovon ich bereits 64 kWh eingesammelt habe und 11 sollen noch kommen.

==> die Prognose lag bei der Summierung um ca. 10% daneben, was ich jedoch echt okay finde.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 10 März 2022, 15:49:01
Zum Anhang: blau und braun sind AC Istwerte. das beide graue die entsprechenden Vorhersagen.
Der Morgenwert passt so sehr gut. Habe aber bisher nur blau angepasst.

Die blaue, höhere Kurve ist aus meiner Sicht etwas Phasenverschoben (später) als Ihre Vorhersage. Mein Gedanke ist dass ich die Orientation etwas vergrößern muss. Laut Sonnenverlauf ist mein Haus max ganz leicht Richtung Osten gedreht. Die Vorhersage deutet aber darauf hin dass ich virtuell Richtung Westen drehen müsste.
Als orientation habe ich momentan 2 eingetragen. Muss ich einfach nochmal vergrößeren (obwohl ich gedanklich eigentlich -2 eintragen müsste), oder habe ich einen Denkfehler?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 März 2022, 17:15:06
Zitat von: andi11 am 10 März 2022, 15:49:01
Zum Anhang: blau und braun sind AC Istwerte. das beide graue die entsprechenden Vorhersagen.
Der Morgenwert passt so sehr gut. Habe aber bisher nur blau angepasst.

Die blaue, höhere Kurve ist aus meiner Sicht etwas Phasenverschoben (später) als Ihre Vorhersage. Mein Gedanke ist dass ich die Orientation etwas vergrößern muss. Laut Sonnenverlauf ist mein Haus max ganz leicht Richtung Osten gedreht. Die Vorhersage deutet aber darauf hin dass ich virtuell Richtung Westen drehen müsste.
Als orientation habe ich momentan 2 eingetragen. Muss ich einfach nochmal vergrößeren (obwohl ich gedanklich eigentlich -2 eintragen müsste), oder habe ich einen Denkfehler?
Es kann auch sein, dass Du eine Stunde Zeitverschiebung hast, da hatte ich glaube ich mal ein Problem mit der Datenbank. Ich weiß aber nicht mehr was das war.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 10 März 2022, 17:36:55
Zitat von: ch.eick am 10 März 2022, 17:15:06
Es kann auch sein, dass Du eine Stunde Zeitverschiebung hast, da hatte ich glaube ich mal ein Problem mit der Datenbank. Ich weiß aber nicht mehr was das war.
Bei den Forcecast Readings denke ich nicht. Und genau die nutze ich um die einzelnen Modulgruppen zu verifizieren.

Sonnenhöchststand:

get Astro text SunAlt 2022-03-09 12:19:00  => 36
get Astro text SunAlt 2022-03-09 12:20:00  => 36,1
get Astro text SunAlt 2022-03-09 12:31:00  => 36,1
get Astro text SunAlt 2022-03-09 12:32:00  => 36
Astro SunTransit => 12:24

edit: der Wert deckt sich exakt mit Sonnenverlauf.de

Was muss ich tun um die Vorhersage nach hinten zu schieben? Orientation weiter Richtung Westen, und damit den Wert etwas erhöhen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 März 2022, 17:39:07
Zitat von: andi11 am 10 März 2022, 17:36:55
Bei den Forcecast Readings denke ich nicht. Und genau die nutze ich um die einzelnen Modulgruppen zu verifizieren.

Was muss ich tun um die Vorhersage nach hinten zu schieben? Orientation weiter Richtung Westen, und damit den Wert etwas erhöhen?
Hast Du die Zeit der datenbank schon überprüft? Ich bin mir da nicht so sicher.

EDIT: Es kann aber auch an dem Ersten Wert und einer etwas zu guten Prognose liegen.

Verändere mal die elevation Prüfung, dass um 8:00 Uhr noch 0.001 kommt.
Wenn die Prognose zu gut ist, dann kannst Du ja einen festen Faktor von 1 setzen.
In meinem Beispiel ist glaube ich in der WR_1_config ein Wert von 1.2 , was jeden Wert um diesen Faktor anhebt.

forecast_factor 1.2
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 10 März 2022, 18:08:34
Zitat von: ch.eick am 10 März 2022, 17:39:07
Hast Du die Zeit der datenbank schon überprüft? Ich bin mir da nicht so sicher.
Wenn ich z.b. um 17Uhr ins SVG schaue taucht dort pünktlich der neue Wert auf, um 17Uhr im Chart.
forecast_factor ist auf 1. Die Prognose ist nur minimal zu gut. Habe die Modulleistung mal 0,96 gerechnet um meine Verluste auszugleichen. Der Wert gehört nochmal etwas erhöht, aber erstmal will ich den Zeitshift in den Griff bekommen.
{Solar_plain(20,0,"2022-03-10 12:05:00")." ".Solar_plain(20,0,"2022-03-10 12:25:00")." ".Solar_plain(20,0,"2022-03-10 12:55:00")}
ergibt folgende Rückgabe
1.40257442775161 1.40190744003861 1.40255544458782

müsste der Faktor zum Höchststand nicht auch am höchsten sein? Lat und Lon im Astro Modul sind korrekt.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 März 2022, 19:25:19
Zitat von: andi11 am 10 März 2022, 18:08:34
Wenn ich z.b. um 17Uhr ins SVG schaue taucht dort pünktlich der neue Wert auf, um 17Uhr im Chart.
forecast_factor ist auf 1. Die Prognose ist nur minimal zu gut. Habe die Modulleistung mal 0,96 gerechnet um meine Verluste auszugleichen. Der Wert gehört nochmal etwas erhöht, aber erstmal will ich den Zeitshift in den Griff bekommen.
{Solar_plain(20,0,"2022-03-10 12:05:00")." ".Solar_plain(20,0,"2022-03-10 12:25:00")." ".Solar_plain(20,0,"2022-03-10 12:55:00")}
ergibt folgende Rückgabe
1.40257442775161 1.40190744003861 1.40255544458782

müsste der Faktor zum Höchststand nicht auch am höchsten sein? Lat und Lon im Astro Modul sind korrekt.
Das kann ich Dir leider auch nicht erklären, ich habe es ja nur adaptiert und habe mich gefreut, dass es passt :-)

Ich denke, dass bei Dir lediglich das Problem mit dem Berg besteht und Du den frühen elevation Wert korrigieren solltest, also auf 0.001 ziehen.
Von gestern auf heute ist bei mir der Nullpunkt jetzt auch von 8:00 auf 7:00 Uhr gesprungen, die Übergangszeit ist halt ziemlich schwierig.
Du wirst es auch nie auf den Punkt genau hinbekommen, das ist halt Natur :-)
Die Autokorrektur ermittelt dann später wie weit es in den letzten 30 Tagen daneben lag und versieht die Prognose mit einem stunden basierten Faktor,
den man dann auch noch prozentual berücksichtigen kann. Das sollte dann aber auch reichen, Es soll ja nur eine Möglichkeit zur Entscheidungsfindung sein.

Deine Anlage zündet halt durch den Schatten erst später, die restlichen Werte und auch die Kurve finde ich schon ziemlich gut.
Die untere Prognose Kurve hast Du noch auf Stufen stehen, das könntest Du auch noch ändern.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 10 März 2022, 19:57:51
Zitat von: ch.eick am 10 März 2022, 19:25:19
Ich denke, dass bei Dir lediglich das Problem mit dem Berg besteht und Du den frühen elevation Wert korrigieren solltest, also auf 0.001 ziehen.
Hab ich bei der ersten Modulgruppe drin zum Test, da funktioniert es sehr gut. Habe es heute für die anderen Gruppen ergänzt und werde dann morgen Ergebnisse sehen.
Zitat von: ch.eick am 10 März 2022, 19:25:19
Deine Anlage zündet halt durch den Schatten erst später, die restlichen Werte und auch die Kurve finde ich schon ziemlich gut.
Das find ich auch
Zitat von: ch.eick am 10 März 2022, 19:25:19
Die untere Prognose Kurve hast Du noch auf Stufen stehen, das könntest Du auch noch ändern.
Danke für den Hinweis, ist mir jetzt erst aufgefallen das SVG verwendet das hier
2022-03-10_09:00:00 0.348
2022-03-10_09:00:00 0.408
2022-03-10_10:00:00 0.495
2022-03-10_10:00:00 0.541
2022-03-10_11:00:00 0.591
2022-03-10_11:00:00 0.618
also immer 2Werte pro Stunde, muss ich mal genauer checken wo die herkommen.

edit: Das kommt daher dass ich den Forcast von 2 Modulgruppen aufsummiere um ihn mit der Einspeiseleistung von diesem Wechselrichter zu vergleichen.
Hab das jetzt abgeändert auf
Solar_GartenHaus:Solar_GartenHausNord.* {ReadingsVal($name,"Solar_GartenHausNord","")+ReadingsVal($name,"Solar_GartenHausSued","")}
zuvor hab ich auf Nord und Sued Events reagiert, jetzt nur noch auf Nord da es mein String mit der höheren Nummer ist
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 März 2022, 07:39:21
Zitat von: andi11 am 10 März 2022, 19:57:51
Danke für den Hinweis, ist mir jetzt erst aufgefallen das SVG verwendet das hier
2022-03-10_09:00:00 0.348
2022-03-10_09:00:00 0.408
2022-03-10_10:00:00 0.495
2022-03-10_10:00:00 0.541
2022-03-10_11:00:00 0.591
2022-03-10_11:00:00 0.618
also immer 2Werte pro Stunde, muss ich mal genauer checken wo die herkommen.

edit: Das kommt daher dass ich den Forcast von 2 Modulgruppen aufsummiere um ihn mit der Einspeiseleistung von diesem Wechselrichter zu vergleichen.
Hab das jetzt abgeändert auf
Solar_GartenHaus:Solar_GartenHausNord.* {ReadingsVal($name,"Solar_GartenHausNord","")+ReadingsVal($name,"Solar_GartenHausSued","")}
zuvor hab ich auf Nord und Sued Events reagiert, jetzt nur noch auf Nord da es mein String mit der höheren Nummer ist
Wenn Du bei dem WR_Gartenhaus mehrere Strings angiebst, werden die doch direkt aufsummiert. Das geht für bis zu 5 Modul Gruppen.

Schau mal ob die in der Datenbank auch den primary key über TIMESTAMP, DEVICE, READING eingerichtet hast.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 11 März 2022, 15:16:23
ich hab folgende Config
setstate DUMMY_PV_config 2022-03-09 08:10:56 forecast_cloudk 45
setstate DUMMY_PV_config 2022-03-09 08:10:56 forecast_cloudk_base 0
setstate DUMMY_PV_config 2022-03-09 11:35:34 forecast_factor 1
setstate DUMMY_PV_config 2022-03-09 11:13:07 forecast_factor_autocorrection 0
setstate DUMMY_PV_config 2022-03-09 08:10:56 forecast_raink 20
setstate DUMMY_PV_config 2022-03-09 08:10:56 forecast_raink_base 0
setstate DUMMY_PV_config 2022-03-09 07:36:24 forecast_tempk 35
setstate DUMMY_PV_config 2022-03-09 07:36:24 forecast_tempk_base 25
setstate DUMMY_PV_config 2022-03-10 17:55:37 module_1_count 5
setstate DUMMY_PV_config 2022-03-10 20:11:40 module_1_direction 6
setstate DUMMY_PV_config 2022-02-27 14:33:27 module_1_name Haus
setstate DUMMY_PV_config 2022-02-27 12:29:42 module_1_plain 20
setstate DUMMY_PV_config 2022-03-10 19:14:40 module_1_power 305
setstate DUMMY_PV_config 2022-02-27 14:31:19 module_2_count 4
setstate DUMMY_PV_config 2022-02-27 12:27:38 module_2_direction 0
setstate DUMMY_PV_config 2022-02-27 14:33:27 module_2_name GartenHausSued
setstate DUMMY_PV_config 2022-03-09 11:50:30 module_2_plain 15
setstate DUMMY_PV_config 2022-03-10 20:57:55 module_2_power 133
setstate DUMMY_PV_config 2022-02-27 14:31:19 module_3_count 4
setstate DUMMY_PV_config 2022-02-27 12:27:38 module_3_direction 180
setstate DUMMY_PV_config 2022-02-27 14:33:27 module_3_name GartenHausNord
setstate DUMMY_PV_config 2022-03-09 11:50:26 module_3_plain 15
setstate DUMMY_PV_config 2022-03-10 20:58:00 module_3_power 133

ich möchte Haus + Gartenhaus getrennt verwenden. Beides schriebt momentan ins Device dummy_pv. Es gibt nur eine Forecast Berechnung  die alle 3 Teile berechnet.
Wie könnte ich da das aufsummieren verhindern?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 März 2022, 16:24:06
Zitat von: andi11 am 11 März 2022, 15:16:23
ich hab folgende Config
< snip >
ich möchte Haus + Gartenhaus getrennt verwenden. Beides schriebt momentan ins Device dummy_pv. Es gibt nur eine Forecast Berechnung  die alle 3 Teile berechnet.
Wie könnte ich da das aufsummieren verhindern?
Dann solltest Du WR_1 und WR_2 anlegen, jeweils mit einer eigenen WR_*_config und separaten Solar_forecast() aufrufen, die in die beiden WRs schreiben.
Wenn Du es dann trotzdem als eine PV_Anlage betrachten möchtest, würde man wie in meinem WR_1 Device die SW_* readings dafür verwenden. SW_* wäre dann der Schwarm.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 11 März 2022, 17:50:51
jetzt hast du mich abgehängt.
Die Anlage nach diesem Schema klingt logisch. Du hast im Wiki aber auch nur eine Forecast Berechnung trotz 2 WR?

Aber wie bekomme ich in meinem WR1 dann die Summenforecast werte? Zyklisch addieren? Tageswert und Restwert heute finde ich spannend.

edit: und brauch ich dann auch nur ein DBRep Device? Oder für jeden WR eines?
Im Wiki steht Dieses Device war vormals das LogDBRep_PV_Forecast_SQL , es wird jedoch nun mehrfach verwendet und wurde deshalb umbenannt. Das LogDBRep_PV_Forecast_SQL kann gelöscht werden. das ist aber 2x der selbe Name.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 März 2022, 18:35:34
Zitat von: andi11 am 11 März 2022, 17:50:51
jetzt hast du mich abgehängt.
Die Anlage nach diesem Schema klingt logisch. Du hast im Wiki aber auch nur eine Forecast Berechnung trotz 2 WR?

Aber wie bekomme ich in meinem WR1 dann die Summenforecast werte? Zyklisch addieren? Tageswert und Restwert heute finde ich spannend.
Du wolltest doch für jeden WR einen eigenen Forcast??
Bei mir gibt es nur einen, da ich mich nur für die gesamte Leistung interessiere um meine Verbraucher zu planen.

Bei mir liefert WR_2 nur und der Forecast wird über insgesamt 4 Strings zusammen im WR_1 abgelegt, aber dann natürlich auch über alles summiert.
Du kannst natürlich auch drei mal den Forecast machen :-)
Für WR_1 im Device WR_1, für WR_2 im Device WR_2 und dann nochmal einen Forecast in einem Dummy Device mit allen Strings :-)
Dann hast Du alle Werte einzeln oder auch Summiert, wobei dann natürlich jedes Device ein WR_*_config haben muss.

Oder Du summierst es wie Du es schon gemacht hast über userreadings z.B. mit einem Prefix SW_ für den Schwarm.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 11 März 2022, 18:40:12
Zitat von: ch.eick am 11 März 2022, 07:39:21
Wenn Du bei dem WR_Gartenhaus mehrere Strings angiebst, werden die doch direkt aufsummiert. Das geht für bis zu 5 Modul Gruppen.
dann war das wohl ein Missverständnis. Ich wollte nicht für jeden WR einen extra Forcast.
Ich wollte einen gemeinsamen Wert für 2Modulgruppen und die 3te extra.....  Und einen gemeinsamen Forecast
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 11 März 2022, 18:56:47
dann bau ich mal wieder zurück. Hat das eigentlich einen speziellen Grund dass die Config in Readings gespeichert wird und nicht in attributen? Dann wäre die Modulconfig in der fhem.cfg
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 März 2022, 09:02:45
Zitat von: andi11 am 11 März 2022, 18:56:47
dann bau ich mal wieder zurück. Hat das eigentlich einen speziellen Grund dass die Config in Readings gespeichert wird und nicht in attributen? Dann wäre die Modulconfig in der fhem.cfg
Da habe ich zuwenig kenntnisse über die einzelnen Module. Kann ich einfach eigene Attribute in einem fremden Modul erstellen?
Für mich ist das WR_1_config ein Device um die Parameter zu sammeln und diese im GUI einfach zu verändern.
Beim WR_1_Speicher_1_ExternControl oder Kia_eNiro_PV wird ja eh ein DOIF verwendet, bei dem ich das dann über uiTable erledigt habe.
Führt nicht auch die Änderung von Attributen dazu, dass man jedesmal ein "Save config" machen müsste?

Solltest Du da bessere Kenntnisse haben, dann wäre ich sehr erfreut.

Diese PV-Anlagen Implementierung ist kein Modul, es bedient sich nur bei den anderen Modulen, damit der Support etwas weiter gestreut wird.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 13 März 2022, 06:23:15
Eine Änderung von Attributen macht ein Save Config nötig. Aber wie oft ändert man im WR_Config device dass dies ein Nachteil wäre?. Allerdings ist damit die Konfiguration auch direkt in der fhem.cfg gesichert. Bei Setreading/setstate ist die Konfiguration nicht automatisch gleich gesichert.
Ich mache z.b. täglich ein Backup der fhem.cfg. Da wäre es schön, wenn solche Änderungen mit archiviert werden, um im Bedarfsfall drauf zugreifen zu können.

Um eigene Atribute zu erstellen gibt es das Attribut userattr. Sobald da ein Parameter erstellt wurde, taucht es normal in der Attributsliste zum auswählen oder für Direkteingabe auf. Man muss nicht gleich ein Modul erstellen, nur weil man Attribute verwendet.

Edit3: Kleiner Einwand noch bezgl. zeitlichem Offset zwischen Forecast und Istwert. Den muss es ja geben um 8Uhr wird der Wert der nächsten Stunde berechnet. Der Istwert ist aber in der aktuellen Stunde => zum direkten Vergleich und anpassen muss das ganze um eine Stunde versetzt betrachtet werden

Edit: Was machst du aktuell mit den Daten aus der Prognose? Zum steuern der Verbraucher verwendest du Total_PV_Power_reserve, aber das wird nirgends erstellt. Vermutlich fehlt mir hier nur ein kleiner Zwischenteil da ich ja kein Kostalgerät habe.

Edit2: Aktuell wird in der Berechnung der fc1 Wert mit dem Timestamp von morgen in der Datenbank abgespeichert. Also wird gerade im Moment im SVG dargestellt:
FC0 => Vorhersage von heute für heute
FC1 => Vorhersage von gestern für heute
Ist es nicht logischer den Forcecast Wert von morgen heute anzuzeigen? Also vom Timestamp einen Tag abziehen, wenn ein fc1 Wert berechnet wird? Ich korrigiere das momentan mit dem logproxy:
#lp DbLog:logdb,offset=60*60*-24:DUMMY_PV:Solar_Calculation_fc1
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 März 2022, 09:58:11
Zitat von: andi11 am 13 März 2022, 06:23:15
Eine Änderung von Attributen macht ein Save Config nötig. Aber wie oft ändert man im WR_Config device dass dies ein Nachteil wäre?. Allerdings ist damit die Konfiguration auch direkt in der fhem.cfg gesichert. Bei Setreading/setstate ist die Konfiguration nicht automatisch gleich gesichert.
Ich mache z.b. täglich ein Backup der fhem.cfg. Da wäre es schön, wenn solche Änderungen mit archiviert werden, um im Bedarfsfall drauf zugreifen zu können.

Um eigene Atribute zu erstellen gibt es das Attribut userattr. Sobald da ein Parameter erstellt wurde, taucht es normal in der Attributsliste zum auswählen oder für Direkteingabe auf. Man muss nicht gleich ein Modul erstellen, nur weil man Attribute verwendet.
Das schaue ich mir dann später mal an

Zitat
Edit3: Kleiner Einwand noch bezgl. zeitlichem Offset zwischen Forecast und Istwert. Den muss es ja geben um 8Uhr wird der Wert der nächsten Stunde berechnet. Der Istwert ist aber in der aktuellen Stunde => zum direkten Vergleich und anpassen muss das ganze um eine Stunde versetzt betrachtet werden
Mir war es einfach nur wichtig, dass die Prognose mit der realität deckungsgleich ist.
Beim DWD werden die rad1h Werte für 8:00 Uhr auch erst mit 9:00 Uhr angegeben, also zum Ende der Stunde.
Bei mir war es auch viel Ausprobieren, bis es gepasst hat.

Zitat
Edit: Was machst du aktuell mit den Daten aus der Prognose? Zum steuern der Verbraucher verwendest du Total_PV_Power_reserve, aber das wird nirgends erstellt. Vermutlich fehlt mir hier nur ein kleiner Zwischenteil da ich ja kein Kostalgerät habe.
Der Total_PV_Power_reserve Wert ist ein userreading im WR_1 und berücksichtigt, dass ich z.B. einen Verbraucher einschalten kann, auch wenn aktuell der Speicher geladen wird. Das ist in der Übergangszeit und bei wenig Leistung wichtig. Ich versuche immer zuerst einen sofort Verbrauch, bevor der Speicher geladen wird. Der Speicher soll immer nut die Reste bei schlechtem Wetter ( Winter ) aufsammeln.

Zitat
Edit2: Aktuell wird in der Berechnung der fc1 Wert mit dem Timestamp von morgen in der Datenbank abgespeichert. Also wird gerade im Moment im SVG dargestellt:
FC0 => Vorhersage von heute für heute
FC1 => Vorhersage von gestern für heute
Das ist zum Vergleich, wie gut der Vorcast von gestern für heute gewesen ist. Der DWD aktualisiert ja die Daten alle paar Stunden.

Zitat
Ist es nicht logischer den Forcecast Wert von morgen heute anzuzeigen? Also vom Timestamp einen Tag abziehen, wenn ein fc1 Wert berechnet wird? Ich korrigiere das momentan mit dem logproxy:
#lp DbLog:logdb,offset=60*60*-24:DUMMY_PV:Solar_Calculation_fc1
Das kannst Du gerne so machen, ich schaue mir den Graphen nur sehr selten im Grafana an und da kann ich das Datum von Morgen einfach einstellen.
Die Abfrage auf bestimmte Werte ist ja über das WR_1 Device möglich, was dann zur Steuerung verwendet wird.
Auch über die Datenbank könnte man auch wieder direkt auf die Werte lesend zugreifen.

Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 13 März 2022, 17:09:14
Zitat von: ch.eick am 13 März 2022, 09:58:11
Mir war es einfach nur wichtig, dass die Prognose mit der realität deckungsgleich ist.
Beim DWD werden die rad1h Werte für 8:00 Uhr auch erst mit 9:00 Uhr angegeben, also zum Ende der Stunde.
Bei mir war es auch viel Ausprobieren, bis es gepasst hat.
Wie sollte es per Definition sein?
Solar_Calculation um 12Uhr beschrieben => Erzeugung für 12-13Uhr oder von 11-12Uhr?
Solar_Calculation_fc0_12 um 12 Uhr beschrieben=> Erzeugung für 12-13Uhr oder von 11-12Uhr?

Rad1h vom DWD ist für die letzte Stunde, du arbeitest aber mit einem Timeshift von einer Stunde. 
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 März 2022, 18:56:02
Zitat von: andi11 am 13 März 2022, 17:09:14
Wie sollte es per Definition sein?
Solar_Calculation um 12Uhr beschrieben => Erzeugung für 12-13Uhr oder von 11-12Uhr?
Das sind wh um 12 Uhr.
Annäherungsweise setze ich dann in der Zeit von 12 - 13 Uhr auch als kWh, weil es ja genau eine Stunde ist.

Zitat
Solar_Calculation_fc0_12 um 12 Uhr beschrieben=> Erzeugung für 12-13Uhr oder von 11-12Uhr?
Das sollte der selbe Wert sein, es ist Leistung und nicht Energie in kWh!

Zitat
Rad1h vom DWD ist für die letzte Stunde, du arbeitest aber mit einem Timeshift von einer Stunde.
Wie ich geschrieben habe ist die Definition beim DWD, das der Wert der Strahlung zum Ende der Stunde angegeben wird. Deshalb habe ich den Timeshift gemacht und bei mir hat es dann gepasst.

Ich verstehe im Moment nicht was Du jetzt für ein Problem hast. Deine Kurven waren von Mittags bis abends deckungsgleich, besser geht es nicht.
Morgens hatte ich geschrieben, dass Du die Prognose durch Solar_plain() auf 0,0001 auf Null ziegehen solltest. Das die Prognose am Vormittag über der realität liegt, liegt an der Überschwenglichen Prognose des DWD, was bei mir auch der Fall ist. Somit sehen Deine Kurven super aus, oder Du erklärst bitte nochmal, was nicht passt.

Wenn Du es für notwendig hällst könntest Du noch den forecast_factor auf z.B. 0.9 setzen, dann gehen alle Werte des Tages auf 90 %, aber auch am Nachmittag. Du solltest es aber einfach beobachten und das über einen kompletten Jahres Zyklus, denn es soll ja auch zu anderen Zeiten passen. Der goldene Mittelweg ist der richtige, die Zielsetzung liegt nicht darin eine exakte Prognose von XX kWh am Tag zu bekommen, sondern zum richtigen Zeitpunkt einen Trigger zu haben, um die großen Langzeitverbraucher zu schalten.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 März 2022, 07:57:14
Moin zusammen.
Bald ist Sommer :-) noch einmal weniger Heizen und der Accu schafft es durch die Nacht...

Sonnige Grüße
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 14 März 2022, 15:05:23
Ich habe meine Module über module_direction solange gedreht bis Solar_Calculation Deckungsgleich mit der Istwertberechnung war.
Würde nur gerne rausfinden ob dieser Ansatz überhaupt korrekt ist.
=> Ich will verhindern dass ich bei meiner Anpassung übers Jahr die falschen Werte vergleiche.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 März 2022, 16:15:48
Zitat von: andi11 am 14 März 2022, 15:05:23
Ich habe meine Module über module_direction solange gedreht bis Solar_Calculation Deckungsgleich mit der Istwertberechnung war.
Würde nur gerne rausfinden ob dieser Ansatz überhaupt korrekt ist.
=> Ich will verhindern dass ich bei meiner Anpassung übers Jahr die falschen Werte vergleiche.
Durch das Verdrehen hast Du generell eine falsche Prognose.

Lies einfach nochmal diesen post  (https://forum.fhem.de/index.php/topic,114849.msg1213311.html#msg1213311)
Ich verstehe Dein Problem einfach nicht mehr? Es ist normal, dass die Prognose nicht 100% ist.
Du bist auch noch nicht bei der Autokorrektur angekommen.
An anderen Tagen wird es noch viel gravierendere Abweichungen geben, gerade wenn noch Wolken und Regen dazu kommen, wie im Bild.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 14 März 2022, 18:05:45
Ich hatte die Deckungsgleichheit nur durch das verdrehen der Module erreicht, und genau das will ich aber nicht.
Daher eben die spezifische Frage welcher Wert was genau bedeutet. Jetzt weiß ich dass der Forecast_12 den Wert von 12-13Uhr anzeigt, und das kann ich entsprechend um 13Uhr mit der Erzeugung vergleichen und korrigieren
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 März 2022, 18:56:46
Zitat von: andi11 am 14 März 2022, 18:05:45
Ich hatte die Deckungsgleichheit nur durch das verdrehen der Module erreicht, und genau das will ich aber nicht.
Daher eben die spezifische Frage welcher Wert was genau bedeutet. Jetzt weiß ich dass der Forecast_12 den Wert von 12-13Uhr anzeigt, und das kann ich entsprechend um 13Uhr mit der Erzeugung vergleichen und korrigieren
Nein, das ist die Erwartete Leistung um 12 Uhr in Watt. Wenn Du die Zeit ins Spiel bringst wären es kWh, was hier aber nicht der Fall ist.
Um z.B. 12:10 könnten auch 500 Watt mehr sein, das gibt aber der rad1h Wert vom DWD nicht her. Schau Dir mal mein letztes Bild an, dann verstehst Du was ich meine.
Nur eine Wolke und das ganze bricht eventuell drastisch ein.

Ich verstehe immer noch nicht, was Du erreichen möchtest?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 14 März 2022, 19:49:19
Zitat von: ch.eick am 14 März 2022, 18:56:46
Nein, das ist die Erwartete Leistung um 12 Uhr in Watt. Wenn Du die Zeit ins Spiel bringst wären es kWh, was hier aber nicht der Fall ist.
Um z.B. 12:10 könnten auch 500 Watt mehr sein, das gibt aber der rad1h Wert vom DWD nicht her. Schau Dir mal mein letztes Bild an, dann verstehst Du was ich meine.
Nur eine Wolke und das ganze bricht eventuell drastisch ein.

Ich verstehe immer noch nicht, was Du erreichen möchtest?
Mir geht es nicht um Wolken und andere Leistungskiller. Im ersten Moment nur perfekte Sonnentage.
Das erklärt deine Verwirrung und mein Unverständnis.

Für mich war in dem Fall zwischen Watt und Wh kein Unterschied, solange dass Zeitraster eine Stunde ist.
Rad1h habe ich beim DWD als "Strahlung letzte Stunde" verstanden. Da ist die Einheit kJ/m² => Im ersten Moment kann damit durch Umrechnung Wh berechnen, aber keine Watt.

=> Meine Schlussfolgerung: Um 12Uhr gilt folgendes:
Durch den Offset von 1 aus deiner Funktion wird der fc0_13_rad1h Wert vom DWD für die fc0_12 Berechnung verwendet. Damit beinhaltet fc0_12 aus deinem Forcecast kwh Erzeugung von 12-13Uhr.
Damit ist die korrekte Vergleichsgröße nicht die aktuelle Erzeugung vom Wechselrichter sondern "Erzeugung in der letzten Stunde". Um 12Uhr wäre das Zeitraum 11-12Uhr. Das ist aber der falsche Zeitraum, es müsste mit 12-13Uhr verglichen werden.

=> Um den 12Uhr Forecast Wert (12-13Uhr) mit der Erzeugung (12-13Uhr) im Chart zu vergleichen muss die Erzeugung um eine Stunde in die Vergangenheit verschoben werden.

Mein Vergleichchart ist damit aktuell so aufgebaut. in statTotal-get habe ich vom statistics Modul stunden, tages und monatswerte der Erzeugung.



#logdb DUMMY_PV:Solar_Haus:::$val=$val/1000
#logdb DUMMY_PV:Solar_GartenHaus:::$val=$val/1000
#lp DbLog:logdb,offset=60*60*-1:Stromverbrauch_Zaehler3:statTotal-get:::$val=~s/.*Hour..(([\d]*.[\d]*)|[\d]*).*/$1/e
#lp DbLog:logdb,offset=60*60*-1:Stromverbrauch_Zaehler4:statTotal-get:::$val=~s/.*Hour..(([\d]*.[\d]*)|[\d]*).*/$1/e
plot
"<IN>" using 1:2 axes x1y1 title 'calc-Hausdach' ls l7 lw 1 with lines,\
"<IN>" using 1:2 axes x1y1 title 'calc-Gartenhaus' ls l7 lw 1 with lines,\
"<IN>" using 1:2 axes x1y1 title 'Haus' ls l0 lw 1 with lines,\
"<IN>" using 1:2 axes x1y1 title 'GartenHaus' ls l1 lw 1 with lines


Stimmt das so? Chart von gestern (bestes PV Wetter) im Anhang. Allerdings gelten nur die Maximalwerte pro Stunde vom Sägezahn. Dabei hab ich die Moduldrehung von 7Grad wieder 0 gesetzt. (laut Sonnenverlauf.de sollten es -2Grad sein)

Deine vorangegangen Posts habe ich mehrfach gelesen, konnte aber keine Ursache für meine Abweichung finden und hatte insofern die Module gedreht. Was aber keine wirklich schöne Lösung ist




Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 März 2022, 07:57:50
Zitat von: andi11 am 14 März 2022, 19:49:19
Mir geht es nicht um Wolken und andere Leistungskiller. Im ersten Moment nur perfekte Sonnentage.
Das erklärt deine Verwirrung und mein Unverständnis.

Für mich war in dem Fall zwischen Watt und Wh kein Unterschied, solange dass Zeitraster eine Stunde ist.
Rad1h habe ich beim DWD als "Strahlung letzte Stunde" verstanden. Da ist die Einheit kJ/m² => Im ersten Moment kann damit durch Umrechnung Wh berechnen, aber keine Watt.

=> Meine Schlussfolgerung: Um 12Uhr gilt folgendes:
Durch den Offset von 1 aus deiner Funktion wird der fc0_13_rad1h Wert vom DWD für die fc0_12 Berechnung verwendet. Damit beinhaltet fc0_12 aus deinem Forcecast kwh Erzeugung von 12-13Uhr.
Damit ist die korrekte Vergleichsgröße nicht die aktuelle Erzeugung vom Wechselrichter sondern "Erzeugung in der letzten Stunde". Um 12Uhr wäre das Zeitraum 11-12Uhr. Das ist aber der falsche Zeitraum, es müsste mit 12-13Uhr verglichen werden.

=> Um den 12Uhr Forecast Wert (12-13Uhr) mit der Erzeugung (12-13Uhr) im Chart zu vergleichen muss die Erzeugung um eine Stunde in die Vergangenheit verschoben werden.

Mein Vergleichchart ist damit aktuell so aufgebaut. in statTotal-get habe ich vom statistics Modul stunden, tages und monatswerte der Erzeugung.


< snip>


Stimmt das so? Chart von gestern (bestes PV Wetter) im Anhang. Allerdings gelten nur die Maximalwerte pro Stunde vom Sägezahn. Dabei hab ich die Moduldrehung von 7Grad wieder 0 gesetzt. (laut Sonnenverlauf.de sollten es -2Grad sein)

Deine vorangegangen Posts habe ich mehrfach gelesen, konnte aber keine Ursache für meine Abweichung finden und hatte insofern die Module gedreht. Was aber keine wirklich schöne Lösung ist
Das hört sich ziemlich plausiebel an. Sollten in der Solar_forecast() fehler drin sein, so könntest Du das gerne überarbeiten. Ich hatte da eher den pragmatischen Ansatz und lasse mich gerne aufklären :-) Für mich war es genug, dass die Prognose recht gut an die Realität ran reichte und ich habe sicher einige mathematische Fehler gemacht. Zu Beginn konnte ich sehen, dass es da eine Verschiebung um eine Stunde gegeben hat, also habe ich die Berechnung verschoben ;-)
Mit dem rad1h, kJ/m2 und Wh hast Du natürlich vollkommen recht, da ist wohl etwas durcheinander. Durch das Raster von 1 h ist mir das gar nicht so aufgefallen.
Der Sägezahn gefällt mir in solch einem Diagramm allerdings nicht so wirklich, wobei die Darstellung natürlich richtig ist.
Wenn Du also wert auf den Wh Vergleich legst musst Du natürlich die Watt des WR über die Zeit (bei mir im Minuten Rythmus) berechnen und diese dann mit der Prognose vergleichen. Bei dieser Aktion wäre dann auch die Berechnung der Gesamt Prognose, nächste vier Stunden und Rest des Tages zu korrigieren. Da habe ich auch einfach die Einzelwerte summiert und nicht die geometrische Fläche, wodurch das Ergebnis um ca 5-10% zu hoch ausfällt, was an der Steilheit der PV-Kurve liegt. Im Winter passt es besser.

Resüme:
Wenn Du Dich da mit einbringen möchtest, wäre ich ziemlich begeistert. Für die reine Steuerung der Eigenleistung ist es allerdings nicht erforderlich eine warscheinlich recht komplexe Überarbeitung zu machen. Die wenigsten besitzen überhaupt die erforderlichen Verbrauchsgeräte, die eine solche Steuerung notwendig machen.

Vielen Dank für Deine Analyse
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 15 März 2022, 09:21:40
Zitat von: ch.eick am 15 März 2022, 07:57:50
Resüme:
Wenn Du Dich da mit einbringen möchtest, wäre ich ziemlich begeistert. Für die reine Steuerung der Eigenleistung ist es allerdings nicht erforderlich eine warscheinlich recht komplexe Überarbeitung zu machen. Die wenigsten besitzen überhaupt die erforderlichen Verbrauchsgeräte, die eine solche Steuerung notwendig machen.
Werde mich da gerne mit einbringen. Allerdings sehe ich keine Notwendigkeit einer "recht komplexen Überarbeitung". Das Ergebniss an sich finde ich schon sehr gut wenn die Toleranz übers Jahr bei <20% liegt. Ich bin auch erst genauer in die Analyse eingestiegen als ich diesen zeitlichen Offset bei mir bemerkt hatte. Eigentlich müsstest du den aber auch haben, du hast ihn über den Offset im Script korrigiert, ist in Wirklichkeit vielleicht deine Anlage verdreht?

Die (bei mir noch nicht aktivierte) Autokorrektur wird hier einiges glätten können.
Das mit der Flächenberechnung verstehe ich zwar, glaube aber dass du das schon ausreichend berücksichtig hast. Rad1h liefert geometrisch gesehen schon ein Rechteck und mittelt über eine Stunde.

P.S.: Stimmt, Sägezahn ist hässlich :)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 März 2022, 10:26:07
Zitat von: andi11 am 15 März 2022, 09:21:40
Werde mich da gerne mit einbringen. Allerdings sehe ich keine Notwendigkeit einer "recht komplexen Überarbeitung". Das Ergebniss an sich finde ich schon sehr gut wenn die Toleranz übers Jahr bei <20% liegt. Ich bin auch erst genauer in die Analyse eingestiegen als ich diesen zeitlichen Offset bei mir bemerkt hatte. Eigentlich müsstest du den aber auch haben, du hast ihn über den Offset im Script korrigiert, ist in Wirklichkeit vielleicht deine Anlage verdreht?
Die Verschiebung war durch den Versatz beim DWD, das der Wert der Stunde erst zum Ende der Stunde eingetragen wird. Warum das so ist verstehe ich selber nicht, da es ja eine Prognose ist, aber so sei es halt.
Zitat
Die (bei mir noch nicht aktivierte) Autokorrektur wird hier einiges glätten können.
Das ist eh böser Woodo Zauber und ein reiner Versuch einen Korrekturfaktor zu ermitteln. Momentan habe ich das abgeschaltet, da die Werte bisher passen. Es kann ja auch sein, das der DWD besser geworden ist :-)
Zitat
Das mit der Flächenberechnung verstehe ich zwar, glaube aber dass du das schon ausreichend berücksichtig hast. Rad1h liefert geometrisch gesehen schon ein Rechteck und mittelt über eine Stunde.

P.S.: Stimmt, Sägezahn ist hässlich :)
Ich hatte ja Watt und Wh durcheinander gebracht. Im Ergebnis konnte ich aber erkennen, dass die Prognose ca 10% höher ist als der tatsächlich erzeugte yield am Tages Ende.
Im Moment habe ich einfach im stateFormat den Wert mit 0.9 multipliziert. Pragmatisch halt :-) Ich berechne aber auch nichts weiter mit den prognose Werten, es ist nur ein Trigger/Schwellwert für die Eigenverbrauchssteuerung.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 März 2022, 14:42:09
Hey zusammen,

im Photovoltaikforum ist mal wieder Bewegung bezüglich Speicher und Wechselricher Firmware Update.
Ich habe jetzt mal den Software Reset des Plenticore über die API eingebaut.


attr WR_1_API set6001Header01 authorization: Session %auth_sessionId%
attr WR_1_API set6001Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set6001Method POST
attr WR_1_API set6001NoArg 1
attr WR_1_API set6001Name 60_01_Reset_Wechselrichter
attr WR_1_API set6001URL http://%IP-WR%/api/v1/system/reboot


Gruß
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 16 März 2022, 11:43:51
Ne Frage noch bezgl dem finden des richtigen Wertes für cloudk.

Zur Anpassung der Leistung bei Bewölkung wird als Basis der Bedeckungsgrad des Himmels benutzt. Der Globalstrahlungswert vom DWD ist aber bereits inklusive Bewölkung, also an bewölkten Tagen schon im Standart geringer oder? D.h. der Korrekturfaktor sollte recht klein sein? Wollte eigentlich mit den 45 aus dem WIKI starten, aber das passt die Leistung schon deutlich an. Ist die Globalstrahlung vom DWD dann so daneben oder liegt das an der Empfindlichkeit der PV Module für bestimmte Wellenlängen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 März 2022, 12:14:01
Zitat von: andi11 am 16 März 2022, 11:43:51
Ne Frage noch bezgl dem finden des richtigen Wertes für cloudk.

Zur Anpassung der Leistung bei Bewölkung wird als Basis der Bedeckungsgrad des Himmels benutzt.
richtig
Zitat
Der Globalstrahlungswert vom DWD ist aber bereits inklusive Bewölkung, also an bewölkten Tagen schon im Standart geringer oder?
auch richtig
Zitat
D.h. der Korrekturfaktor sollte recht klein sein? Wollte eigentlich mit den 45 aus dem WIKI starten, aber das passt die Leistung schon deutlich an.
Da hinter liegt eine "Heizungskurve", also der Bedeckungsgrad vom DWD wird durch die Heizungskurve nicht linear verändert.
Die 45 kommen aus der Erfahrung von 2 Jahren Beobachtung, da trotz der DWD Globalstrahlung die Prognose bei wechselnder Bewölkung nicht gepasst hat.
Das hat ab hier nichts mehr mit Wissenschaft zu tun, sondern eher mit Bauchgefühl und Austesten ;-)
Zitat
Ist die Globalstrahlung vom DWD dann so daneben oder liegt das an der Empfindlichkeit der PV Module für bestimmte Wellenlängen?
Bauchgefühl :-) Ich habe ja rein optisch meine Graphen beobachtet und dann ist es historisch gewachsen.
Im Bild mal das Ergebnis von Gestern, ohne Autokorrektur.
Bei der Autokorrektur beobachte ich mal, ob die eventuell überhaupt noch notwendig ist, es kann ja sein, dass der DWD jetzt besser geworden ist.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 16 März 2022, 12:19:53
Wie gut die DWD Vorhersage passt kann man doch eh nur durch regelmäßiges kontrollieren überprüfen. Selbst wenn die bei mir passen sollte heist es ja noch lange nicht dass es in jeder Ecke der Landkarte genauso gut passt.

=> dann starte ich mit cloudk 0 also neutraler Ausgangsbasis, statt 45. Und erhöhe von da aus den Wert wenn ich zuviel Leistung im Forecast habe bei bewölktem Himmel :)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 März 2022, 12:29:15
Zitat von: andi11 am 16 März 2022, 12:19:53
Wie gut die DWD Vorhersage passt kann man doch eh nur durch regelmäßiges kontrollieren überprüfen. Selbst wenn die bei mir passen sollte heist es ja noch lange nicht dass es in jeder Ecke der Landkarte genauso gut passt.

=> dann starte ich mit cloudk 0 also neutraler Ausgangsbasis, statt 45. Und erhöhe von da aus den Wert wenn ich zuviel Leistung im Forecast habe bei bewölktem Himmel :)
Oder Du verlässt Dich auf meine gesammelte Erfahrung und gehst bei Bedarf weiter rauf oder runter.
Wie gesagt, Deine Prognose Ergebnisse im Graphen sind doch bereits top gewesen und da war die Wolken und Regen Prognose bereits aktiv.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 16 März 2022, 12:39:03
Ja die Vorhersage war top. Aber das war bei bombastischem Wetter, da gabs keine Wolkenkorrektur :) Was da als Faktor drin war, war also egal. Heute liegt es deutlich daneben. Und da fehlt mir jedes Gefühl für die Wolken => ich fang bei 0 an und erhöhe
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 März 2022, 12:56:42
Zitat von: andi11 am 16 März 2022, 12:39:03
Ja die Vorhersage war top. Aber das war bei bombastischem Wetter, da gabs keine Wolkenkorrektur :) Was da als Faktor drin war, war also egal. Heute liegt es deutlich daneben. Und da fehlt mir jedes Gefühl für die Wolken => ich fang bei 0 an und erhöhe
zeig bitte nochmal eine Kurve der Prognose von gestern, da sollten ja Wolken schon dabei gewesen sein.
Ich glaube Du hast immernoch zu hohe Erwartungen an die Exaktheit der Prognose.
Es soll nur ein Trigger für die Tendenz sein und nicht zwingend genaue Leistungswerte liefern, das wird nie genau passen, da die Qualität des DWD auch nur begrenzt ist.

EDIT: Das hier von heute ist z.B. schon ein sehr gutes Ergebnis! Und Du kannst die Schwankungen durch Wolken ziemlich gut sehen :-)
Alles was über der Prognose Liegt ist einfach ein Geschenk des Himmels :-) :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 16 März 2022, 14:49:16
gestern ist ein ganz schlechtes Beispiel für gute Prognose bei uns. Aber das ist komplett verständlich, der Himmel war Blutrot vor lauter Sahara Staub und alle Flächen waren entsprechend rötlich.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 März 2022, 16:39:11
Zitat von: andi11 am 16 März 2022, 14:49:16
gestern ist ein ganz schlechtes Beispiel für gute Prognose bei uns. Aber das ist komplett verständlich, der Himmel war Blutrot vor lauter Sahara Staub und alle Flächen waren entsprechend rötlich.
Das war bei uns nicht ganz so schlimm, aber die Prognose war top, wie in dem Bild von diesem Post zu sehen.
https://forum.fhem.de/index.php/topic,114849.msg1213758.html#msg1213758 (https://forum.fhem.de/index.php/topic,114849.msg1213758.html#msg1213758)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 19 März 2022, 18:49:32
hier mal Bewölkung ab Mittag. DWD und Wunderground sind Globalstrahlung. Offensichtlich war mein Verständnis vom Wert rad1h vom DWD gänzlich falsch.
Bei denen strahlts wohl über den Wolken *fg*

Wunderground ist bei uns ca 1km weg eine Station.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 März 2022, 16:11:38
Zitat von: andi11 am 19 März 2022, 18:49:32
hier mal Bewölkung ab Mittag. DWD und Wunderground sind Globalstrahlung. Offensichtlich war mein Verständnis vom Wert rad1h vom DWD gänzlich falsch.
Bei denen strahlts wohl über den Wolken *fg*

Wunderground ist bei uns ca 1km weg eine Station.
Deshalb habe ich ja auch die Wolken mit rein gerechnet :-)
Aber wonderground sieht doch recht gut aus bei Dir. Haben die jetzt auch stunden Werte?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 20 März 2022, 16:47:51
Die Wetterstation die ich benutze aktualisiert jede Minute. Allerdings frag ich nur alle 15min ab
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 März 2022, 17:18:55
Zitat von: andi11 am 20 März 2022, 16:47:51
Die Wetterstation die ich benutze aktualisiert jede Minute. Allerdings frag ich nur alle 15min ab
Ah, moment, das sind die aktuellen Werte, also kein Forecast.
Da habe ich auch drei Stück in  der Nähe, mit denen ich dann die Beschattung mir den Rollos steuer.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 März 2022, 12:02:37
Hallo zusammen,
einige von Euch warten ja bereits auf die aktualisierte Wiki Seite, was ich nun gerade erledigt habe.

- WR_1
- Solar_forecast()
- WR_1_API
- WR_1_Speicher_1_ExternControl
- Einige Bilder wurden aktualisiert

Im Allgemeinen gab es kleinere Korrektur über die letzten Monate.

Das wichtigste ist jedoch die total überarbeitete Speicher Steuerung, die nun im Perl Modus und mit uiTable läuft.
Für den Betrieb einer WallBox wurden zusätzliche Blöcke eingefügt, die den Speicher auf smart_Laden setzen und hinterher wieder den ursprünglichen Status herstellen.

Block 2_smart_Laden_start_WB_1
Block 3_smart_Laden_beenden_WB_1

Eine zusätzliche Bedingung im 3_smart_Laden_beenden_Automatik
Zitat
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled
     and
     [$SELF:SpeicherEntladung] eq "Automatik"                            ## Nur für den Automatik Modus
     and
     [$SELF:WB_1_smart_laden_before] eq "---"
                            ## Es wird gerade kein Fahrzeug geladen

Der Ladezustand wird hierbei von der WallBox abgefragt und unterscheidet sich bei verschiedenen Herstellern:
Zitat
openWB:
     [WB_1:lp_1_ChargeStat] eq "loading"

go-eCharger:
     [WB_1:car_state] eq "2"                           ## Ladevorgang läuft

Hier bitte gerne noch weitere WallBoxen bei mir melden.

Auch im WR_1_API gab es Erweiterungen bei der Abfrage von Registern
get:
- 23_Battery_ExternControl
      Änderung wegen ComMomitor_*
- 41_DigitalOutputs
      Liest die Register für die Output Steuerung

set:
- 23_11_Battery_ComMonitor_Enable
- 23_12_Battery_ComMonitor_Time
      Verändert die Kommando Wiederholungs Zeit für die Externe Steuerung (z.B. WR_1_Speicher_1_ExternControl von 3 Minuten auf 5 Minuten)
- 41_DigitalOutputs
      Setzt die Register für die Output Steuerung.
      Hierzu gibt es eine Befehlsabfolge, mit der man den potentialfreien Ausgang des Plenticore schalten kann, wenn man die Überschusssteuerung des Plenticore nicht verwendet.
      Darüber kann man dann z.B. einen Lüfter im Technik Raum Ein/Aus schalten ;-)
- 60_01_Reset_Wechselrichter
      Hierdurch macht der Plenticore einen Softreset, wie es z.B. auch nach einem Firmware Update erfolgt.

Beim Solar_forecast() ist es wichtig zu beachten, dass bei einer Umbenennung der Device Namen eine Abhängigkeit besteht!
Dies betrifft insbesonderen das reading SpeicherMidday_Inverter_Max_Power
Das reading wird im Device WR_1_Speicher_1_ExternControl gesetzt und bestimmt den Grenzwert für das Mittagshoch, da dies in der Funktion Solar_forecast() berechnet wird müssen folgende Devices namentlich zusammen passen:

WR_1 und WR_1_Speicher_1_ExternControl

Beim Solar_forecast() wird Der Device Name, in den der Forecast geschrieben werden soll mit übergeben, was hier WR_1 ist. Damit dann der Grenzwert für die externe Speicher Steuerung gefunden werden kann muss das Device dann WR_1_Speicher_1_ExternControl benannt werden.

Ausschnitt aus der Solar_forecast()
Zitat
     my $Inverter_Max_Power = ReadingsVal($logdevice."_Speicher_1_ExternControl","SpeicherMidday_Inverter_Max_Power","unused");  # Überschreiben des middayhigh
     if ($Inverter_Max_Power eq "unused") {
       $Inverter_Max_Power = ReadingsVal($logdevice,"Inverter_Max_Power",0) +500 ;      # Hier wird ein Durchschnittsverbrauch des Hauses aufaddiert
     } else {
       if ($verbose >= 3) { Log 3, "SpeicherMidday_Inverter_Max_Power manuell gesetzt" } ;
     };
     if ($verbose >= 3) { Log 3, "SpeicherMidday_Inverter_Max_Power auf ".$Inverter_Max_Power." gesetzt" } ;

Ich hoffe, dass ich nichts vergessen habe und wünsche Euch viel Spaß beim Fehler suchen :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 März 2022, 16:20:56
Und nochmals hallo zusammen,
vor meiner 50000 Thread Marke möchte ich noch etwas posten :-)

In der WR_1_Speicher_1_ExternControl kann man einen DC_Power_Abs Wert setzen, der bei negativen Werten den Speicher zwangsweise lädt und bei positiven Werten auch entlädt.
Damit nichts ungewolltes passiert müsst Ihr das aber in Eurem Zeitinterval ( 3 Minuten ) über das uiTable manuell senden. Eine 0 wäre dann wieder die neutrale Einstellung.
Eine Reaktion ist dann nach ca. 1 Minute zu sehen, da ja das Abfrage Intervall vom WR_1 auf 60 Sekunden steht.
Es besteht allerdings auch eine Wechselwirkung mit der MaxSoc Begrenzung, wenn der Speicher also auf z.B. 95% limitiert ist, dann wird natürlich erst geladen, sobald die Grenze unterschritten wird.
Eine Regelung auf 0 wird leider nicht vom Plenticore durchgeführt, das war eine weitere Idee, um Tagsüber die Standby Verluste zu unterbinden ;-)

Und nun Achtung Ihr Schweizer unter uns, wie mir zugetragen wurde dürft Ihr leider nicht Euren Speicher aus dem Netz laden ;-)


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 03 April 2022, 07:29:20
Hallo zusammen,

ich bräuchte noch mal eure Hilfe:

Gestern hatte ich einen längeren Stromausfall und FHEM hat neu gestartet, leider passen jetzt die Werte für den Monat April nicht mehr:
Statistik vom 2022-04-03 in kWh   aktuell   Heute   Monat   Jahr / Vorjahr
Bezug von PV   0308 W   0000   -606
Bezug ins Haus (Energieverbrauch)   0477 W   0003   -322

Kann ich irgendwo antriggern, dass die Werte neu erzeugt werden?
Die Tageswerte waren gestern auch komplett falsch, wurden heute nacht aber ja zurückgesetzt.
Die Jahreswerte passen noch.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 April 2022, 14:58:15
Zitat von: kaiman am 03 April 2022, 07:29:20
Hallo zusammen,

ich bräuchte noch mal eure Hilfe:

Gestern hatte ich einen längeren Stromausfall und FHEM hat neu gestartet, leider passen jetzt die Werte für den Monat April nicht mehr:
Statistik vom 2022-04-03 in kWh   aktuell   Heute   Monat   Jahr / Vorjahr
Bezug von PV   0308 W   0000   -606
Bezug ins Haus (Energieverbrauch)   0477 W   0003   -322

Kann ich irgendwo antriggern, dass die Werte neu erzeugt werden?
Die Tageswerte waren gestern auch komplett falsch, wurden heute nacht aber ja zurückgesetzt.
Die Jahreswerte passen noch.
Schau mal ob im WR_1_API die Initiative readings für Tag, Monat und Jahr richtig gesetzt sind. Eventuell ist jetzt noch der Wert vom 1.4 0:00 nicht richtig.
Nimm einfach den letzten vom 31.03, dann sollte es passen.

Gruß Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 03 April 2022, 15:26:51
Hallo,

DANKE! Hat funktioniert. Hab die Daten vom 01.04. 01:00 in SW_Meter_init_FeedInGrid_Month und SW_Meter_init_Grid_Month eingetragen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 April 2022, 16:35:42
Zitat von: kaiman am 03 April 2022, 15:26:51
Hallo,

DANKE! Hat funktioniert. Hab die Daten vom 01.04. 01:00 in SW_Meter_init_FeedInGrid_Month und SW_Meter_init_Grid_Month eingetragen.
Die anderen bereits geschriebenen Werte in der DB sollten dann um diesen Wert zu hoch sein. Die könntest Du dann ja noch korrigieren,
damit die Datenbank bei Graphen wieder stimmert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 08 April 2022, 08:52:31
Hallo Christian,

Ich habe aktuell Probleme den Wert für das erste Quartal zubekommen. Da ich letztes Jahr Ende Dezember die Anlage erst in Betrieb genommen habe fällt mir das jetzt erst auf.
Die Abfrage LogDBRep_Statistic_previous_Quarter gibt leider keine Werte raus. Wenn ich mir die einzelnen Werte in WR_1_Api anschaue sind diese aber wohl vorhanden.
Hast du evtl. ein Tipp für mich wie ich das Problem eingrenzen kann?

List LogDBRep_Statistic_previous_Quarter
Internals:
   DATABASE   fhem
   DEF        logdb
   FUUID      61e156c6-f33f-3405-689b-6b14f28883227972
   FVERSION   93_DbRep.pm:v8.48.2-s25731/2022-02-22
   LASTCMD    sqlCmd 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 ;
   MODEL      Client
   NAME       LogDBRep_Statistic_previous_Quarter
   NOTIFYDEV  global,LogDBRep_Statistic_previous_Quarter
   NR         807
   NTFY_ORDER 50-LogDBRep_Statistic_previous_Quarter
   ROLE       Client
   STATE      done
   TYPE       DbRep
   UTF8       1
   HELPER:
     DBLOGDEVICE logdb
     GRANTS     ALL PRIVILEGES,USAGE
     IDRETRIES  2
     MINTS      2019-07-12 13:30:00
     PACKAGE    main
     VERSION    8.48.2
     DBREPCOL:
       COLSET     1
       DEVICE     64
       EVENT      512
       READING    64
       TYPE       64
       UNIT       32
       VALUE      128
   OLDREADINGS:
   READINGS:
     2022-03-31 23:59:00   Q1              previous
     2021-06-30 23:59:00   Q2             
     2021-09-30 23:59:00   Q3             
     2021-12-31 23:59:00   Q4             
     2022-04-08 08:36:08   SqlResultRow_1  TIMESTAMP|READING|VALUE
     2022-04-08 08:36:08   SqlResultRow_2  2022-03-31 23:59:00|Q1|previous
     2022-04-08 08:36:08   SqlResultRow_3  2021-12-31 23:59:00|Q4|
     2022-04-08 08:36:08   SqlResultRow_4  2021-09-30 23:59:00|Q3|
     2022-04-08 08:36:08   SqlResultRow_5  2021-06-30 23:59:00|Q2|
     2022-04-08 08:36:08   sqlCmd          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 ;
     2022-04-08 08:36:08   sqlResultNumRows 4
     2022-04-08 08:36:08   state           done
Attributes:
   DbLogExclude .*
   allowDeletion 0
   comment    Version 2022.01.14 10:00
   device     WR_1_API
   reading    SW_Statistic%_Year,Statistic_EnergyHomeBat_Year EXCLUDE=%Autarky%,%Rate%,%NoBat%
   room       Statistik
   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  );
   userExitFn splitReading .*:.*
   verbose    0


List von WR_1_API als txt Datei.

Die splitReading Funtion sie wie folgt aus
sub splitReading {
my ($name,$reading,$value) = @_;
my $hash = $defs{$name};

if($reading =~ /^.*SqlResultRow_.*$/ and
    $value   =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)\|(.*)\|(.*)/ ) {

     my $TIMESTAMP = "$1-$2-$3 $4:$5:$6";
     my $READING   = "$7";
     my $VALUE     = "$8";

     setReadingsVal($hash,$READING,$VALUE,$TIMESTAMP);
}
return;
}


Vielen Dank schon mal für deine Mühe.

VG Alex
 
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 April 2022, 10:13:46
Zitat von: majestro84 am 08 April 2022, 08:52:31
Hallo Christian,

Ich habe aktuell Probleme den Wert für das erste Quartal zubekommen. Da ich letztes Jahr Ende Dezember die Anlage erst in Betrieb genommen habe fällt mir das jetzt erst auf.
Die Abfrage LogDBRep_Statistic_previous_Quarter gibt leider keine Werte raus. Wenn ich mir die einzelnen Werte in WR_1_Api anschaue sind diese aber wohl vorhanden.
Hast du evtl. ein Tipp für mich wie ich das Problem eingrenzen kann?
Hallo Alex,
das ist ja noch ganz neu und ich schaue es mir bereits an :-)

Q2, Q3 und Q4 sind bei mir für 2021 noch okay.
Q1 liefert falsche Werte, wird aber als "previous" und mit dem richtigen Datum bereits erkannt.
Auch die Anzeige im WR_1_API reagiert bereits und zeigt die falschen Werte bereits an.

Nun schaue ich mir mal das SQL SELECT an ...

EDIT: Das Problem ist natürlich der Jahreswechsel :-( am 01.01. wird ja alles wieder auf Null gesetzt, was ich total verpennt habe.
Es dauert dann jetzt leider noch etwas, damit Q1 richtig berechnet wird.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 08 April 2022, 16:02:49
Hallo Christian

Danke für deine schnelle Antwort und deine Bemühung.

VG Alex
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 April 2022, 18:01:37
Zitat von: majestro84 am 08 April 2022, 16:02:49
Hallo Christian

Danke für deine schnelle Antwort und deine Bemühung.

VG Alex
Hallo Alex,
bitte teste das SQL SELECT dann nochmal mit Deinen Daten, es sollte jetzt so passen.

SqlCmd für das DbRep Device LogDBRep_Statistic_previous_Quarter

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§ AND §reading§
          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,
         if(MONTH(x1.TIMESTAMP)=12,0,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 >= 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§ AND §reading§
          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,
         if(MONTH(x1.TIMESTAMP)=12,0,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 >= 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§ AND §reading§
          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(x1.TIMESTAMP)=12,0,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 >= 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§ AND §reading§
          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(x1.TIMESTAMP)=12,0,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 >= 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
;

Im Device ist dann die Reihenfolge wie folgt zu lesen Q1, Q4, Q3, Q2 . Das Q1 ist mit previous markiert, da wir ja jetzt im Q2 sind.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 08 April 2022, 19:11:32
Zitat von: ch.eick am 08 April 2022, 18:01:37
Hallo Alex,
bitte teste das SQL SELECT dann nochmal mit Deinen Daten, es sollte jetzt so passen.

SqlCmd für das DbRep Device LogDBRep_Statistic_previous_Quarter

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§ AND §reading§
          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,
         if(MONTH(x1.TIMESTAMP)=12,0,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 >= 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§ AND §reading§
          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,
         if(MONTH(x1.TIMESTAMP)=12,0,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 >= 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§ AND §reading§
          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(x1.TIMESTAMP)=12,0,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 >= 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§ AND §reading§
          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(x1.TIMESTAMP)=12,0,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 >= 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
;

Im Device ist dann die Reihenfolge wie folgt zu lesen Q1, Q4, Q3, Q2 . Das Q1 ist mit previous markiert, da wir ja jetzt im Q2 sind.

VG
   Christian

Hallo Christian
Ich habe es versucht mit dem SELECT leider ohne Erfolg.
Wenn ich es auf dem SQL Server eingeben hängt es an Folgender Stelle

§device§ AND §reading§

Ist das so gewollt?

Die Frage hat sich geklärt das sind die Attribute aus dem LogDBRep_Statistic_previous_Quarter Device

Im FHEM läuft die Abfrage durch allerdings ohne Ergebnis.

VG Alex
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 April 2022, 08:19:12
Zitat von: majestro84 am 08 April 2022, 19:11:32
Ich habe es versucht mit dem SELECT leider ohne Erfolg.
Im FHEM läuft die Abfrage durch allerdings ohne Ergebnis.
Hallo zusammen

wenn bei dieser DbRep Abfrage nur die Quartals Namen zurück geliefert werden, dann liegt das daran, dass in der Datenbank keine Daten vorhanden sind.

+---------------------+---------+----------+
| TIMESTAMP           | READING | VALUE    |
+---------------------+---------+----------+
| 2022-03-31 23:59:00 | Q1      | previous |
| 2021-12-31 23:59:00 | Q4      | NULL     |
| 2021-09-30 23:59:00 | Q3      | NULL     |
| 2021-06-30 23:59:00 | Q2      | NULL     |
+---------------------+---------+----------+
4 rows in set (0.331 sec)

Für die Berechnung werden die letzten Einträge im vorherigen und im aktuellen Quartal benötigt.

Offset sezten

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
);


Start Werte des Quartals

SELECT
         h.TIMESTAMP,
         h.READING,
         if(MONTH(x1.TIMESTAMP)=12,0,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
;

Ende Werte des Quartals

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
;


Nun kann man manuell die fehlenden Werte eintragen.
Anstelle der Nullen kann man natürlich auch die richtigen Werte eintragen.

INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','Statistic_EnergyHomeBat_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyHome_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyHomeFeedInGrid_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyHomeGrid_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyHomePv_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyHomePvSum_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyPv1_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyPv2_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyPv4_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_EnergyPv5_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_TotalConsumption_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-12-31 23:57:03','SW_Statistic_Yield_Year',0);


Wenn oben die Jahres End Werte eingetragen sind und man hier zusätzlich alles auf Null setzt, dann sollten auch für Q4 Werte angezeigt werden.

INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','Statistic_EnergyHomeBat_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyHome_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyHomeFeedInGrid_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyHomeGrid_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyHomePv_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyHomePvSum_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyPv1_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyPv2_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyPv4_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_EnergyPv5_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_TotalConsumption_Year',0);
INSERT INTO `history` (`TIMESTAMP`,`READING`,`VALUE`) VALUES ('2021-09-31 23:57:03','SW_Statistic_Yield_Year',0);


Sollte im WR_1_API das Quartal nicht sofort angezeigt werden, so muss dies einmal aktualisiert werden. Das kann man einfach über das PV_Schedule Device erreichen, indem man "Bilanz cmd_4" ausführt.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 12 April 2022, 13:57:35
Hallo zusammen,

ich kämpfe gerade auf mit den Quartalswerten.

Den DB Timeout hab ich jetzt schon auf 2 Tage gestellt, aber ich bekomm immer ein "LogDBRep_Statistic_previous_Quarter
   
Timeout: process terminated,"

Hab den Timeout jetzt auf 3 Tage gestellt und noch einmal angestoßen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 12 April 2022, 14:01:57
Falls die timeouts erst seit einem FHEM update auftreten und sonst auch evtl. Netzwerkprobleme im Log zu sehen sein sollten schau mal in diesen Thread -> https://forum.fhem.de/index.php/topic,127077.0.html
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 April 2022, 14:13:50
Zitat von: kaiman am 12 April 2022, 13:57:35
Hallo zusammen,

ich kämpfe gerade auf mit den Quartalswerten.

Den DB Timeout hab ich jetzt schon auf 2 Tage gestellt, aber ich bekomm immer ein "LogDBRep_Statistic_previous_Quarter
   
Timeout: process terminated,"

Hab den Timeout jetzt auf 3 Tage gestellt und noch einmal angestoßen.

Okay, bei den timeouts kann ich nicht wirklich helfen, die habe ich bei mir nicht.

Wenn es Fragen zum Quartals Report gibt, da haben wir bereits per PN einige Erfahrungen gesammelt. Melde Dich einfach.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Mai 2022, 21:36:56
Hallo,
kann das sein, dass alles so stabiel läuft, oder sind hier alle geflüchtet :-) ?

Meine Prognose lief für heute ziemlich genau, 97 kWh Prognose zu 103 kWh Ertrag :-) und das alles ohne Autokorrektur. Die habe ich bereits seit Januar ausgeschaltet, um mal zu schauen, wie es ohne laufen würde.

Wie läuft es so bei Euch, das kann hier auch zu einem Kostal Stammtisch werden. Eventuell entstehen ja noch neue Ideen.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 08 Mai 2022, 19:03:31
Hallo Christian,
nein nein, nicht geflüchtet :-) , nur zufrieden und es läuft tatsächlich bei mir ganz gut. Ich versuche grad noch den go-eCharger und eine Warmwasserwärmepumpe in deinem Stil zu integrieren, und da hängt die Messlatte schon hoch. Ich verfolge das alles gerne und bin immer noch dabei.

viele Grüße
   Wolfgang

PS. hab mal noch einen kleinen screen von heute angehängt, die Zahlen können sich glaub schon sehen lassen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Mai 2022, 15:12:52
Zitat von: zwölfgang am 08 Mai 2022, 19:03:31
Ich versuche grad noch den go-eCharger und eine Warmwasserwärmepumpe in deinem Stil zu integrieren, und da hängt die Messlatte schon hoch. Ich verfolge das alles gerne und bin immer noch dabei.
Ich denke das hier https://forum.fhem.de/index.php/topic,123644.0.html (https://forum.fhem.de/index.php/topic,123644.0.html) hast Du sicher schon gesehen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Mai 2022, 09:11:47
Moin,
Mal ein wenig Technik.
Dadurch, dass ich den Hausspeicher noch nicht lade, speise ich seit ca. 7 Uhr für 4-5 andere Haushalte Strom ins Netz ein.
Um diese Uhrzeit gibt es noch wenig PV Leistung, was somit gut für das Netz ist. Den Speicher lade ich dann mittags, was auch gut für das Netz ist, da es dort viel PV Leistung gibt. Das alles ist zwar mikroskopisch, macht aber Spaß 😋
VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 13 Mai 2022, 09:28:00
Ja genau Christian. Ich glaube das wird auch der Weg für die Zukunft sein. Wir werden versuchen müssen die Einspeisung ins Netz besser aufzuteilen. Das funktioniert meiner Ansicht nach jedoch nur mit entsprechenden (finanziellen) Anreizen. Sprich die Mittagsstunden werden weniger vergütet als der Morgen und der Abend. Falls das kommen wird sind wir mit deiner Steuerung aber bereits bestens gewappnet  :D

Wiedermal ein Feeback:
Bei mir klappt auch alles wunderbar. Echt genial wie zuverlässig das alles arbeitet. Ich staune auch immer wieder über die Prognose. Hier ein Beispiel wie genau es gepasst hat von vorgestern
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Mai 2022, 10:13:56
Zitat von: Mumpitz am 13 Mai 2022, 09:28:00
Ja genau Christian. Ich glaube das wird auch der Weg für die Zukunft sein. Wir werden versuchen müssen die Einspeisung ins Netz besser aufzuteilen. Das funktioniert meiner Ansicht nach jedoch nur mit entsprechenden (finanziellen) Anreizen. Sprich die Mittagsstunden werden weniger vergütet als der Morgen und der Abend. Falls das kommen wird sind wir mit deiner Steuerung aber bereits bestens gewappnet  :D

Wiedermal ein Feeback:
Bei mir klappt auch alles wunderbar. Echt genial wie zuverlässig das alles arbeitet. Ich staune auch immer wieder über die Prognose. Hier ein Beispiel wie genau es gepasst hat von vorgestern
Stolzguck :-) :-)

Ich weiß nicht. ob Ihr das beim WR_1 Device auch bereits drin habt.
Die Prognose läuft ja ziemlich gut, als Darstellung im Diagramm - bei mir habe ich die Autokorrektur bereits sein geraumer Zeit deaktiviert.
Nur bei den Ertragssummen waren doch kleinere Abweichungen, die ich mir dann im WR_1 stateformat testweise um 9 % korrigiert habe.

my $Solar_Calculation_fc0_4h   = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_4h",0)*0.9/1000 ,0));
my $Solar_Calculation_fc0_day  = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_day",0)*0.9/1000 ,0));
my $Solar_Calculation_fc0_rest = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_rest",0)*0.9/1000 ,0));

Wenn ich das nun im Forecast direkt machen würde, wäre die Grafik um 10 % höher, was nicht so schön wäre. Andererseits könnte ich es einfach direkt bei den Tagessummen mit rein rechnen,
da ich dort ja keine mathematisch korrekte Berechnung der Kurven Fläche gemacht habe, was bei einem stündlichen Raster eh recht ungenau wäre.

Es wäre schön, wenn Ihr am Abend mal nachschauen würdet, wie bei Euch die Abweichung von Ertag und Prognose Tag ist. Kommt Ihr da auf einen änlichen Faktor? Oder ist das bei Euch bereits ins stateformat rein gerutscht, da es ja im Wiki steht :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 13 Mai 2022, 11:26:20
Zitat von: ch.eick am 13 Mai 2022, 10:13:56

Es wäre schön, wenn Ihr am Abend mal nachschauen würdet, wie bei Euch die Abweichung von Ertag und Prognose Tag ist. Kommt Ihr da auf einen änlichen Faktor? Oder ist das bei Euch bereits ins stateformat rein gerutscht, da es ja im Wiki steht :-)

VG
   Christian

Bei mir ist noch 100% drinn. Ich schaue mir die Zahlen mal an sobald wieder ein perfekter Tag ist oder natürlich rückwirkend der Tag welcher so schöng gepasst hat. Melde mich
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 13 Mai 2022, 11:57:24
ZitatEs wäre schön, wenn Ihr am Abend mal nachschauen würdet, wie bei Euch die Abweichung von Ertag und Prognose Tag ist. Kommt Ihr da auf einen änlichen Faktor? Oder ist das bei Euch bereits ins stateformat rein gerutscht, da es ja im Wiki steht :-)

Hab das auch so drin. Aus dem Bauch heraus gesagt habe ich ähnliche Abweichungen gesehen aber dem keine größere Bedeutung zugewiesen. Werde das auch mal weiter beobachten und berichten.

VG
Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Mai 2022, 12:37:24
Zitat von: zwölfgang am 13 Mai 2022, 11:57:24
Hab das auch so drin. Aus dem Bauch heraus gesagt habe ich ähnliche Abweichungen gesehen aber dem keine größere Bedeutung zugewiesen. Werde das auch mal weiter beobachten und berichten.
In der Solar_forecast() wäre für eine korrekte Berechnung einfach zuviel Aufwand, selbst wenn man jede Stunde aus einem Rechteck und einem Dreieck zusammen setzen würde.
Ich glaube für die reine Steuerung von großen Verbraucher ist das ganze eher unrelevant und im Winter kann man wegen zu wenig Leistung auch nicht viel verschieben.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Mai 2022, 12:56:44
Zitat von: zwölfgang am 08 Mai 2022, 19:03:31
Ich versuche grad noch den go-eCharger und eine Warmwasserwärmepumpe in deinem Stil zu integrieren, und da hängt die Messlatte schon hoch. Ich verfolge das alles gerne und bin immer noch dabei.
Hallo Wolfgang,
da ich ja auch in den Jahren etwas dazu gelernt habe bin ich dabei das LWP DOIF vom FHEM auf den Perl Modus umzustellen.
Bei der Gelegenheit nehme ich dann die Konfiguration aus dem Dummy mit ins DOIF und verwende widgets im uiTable um diese zu verändern.
Beim Status der LWP bringe ich dann auch noch etwas mehr rein und hoffendlich mit mehr Übersicht.
Die einzelnen Schaltblöcke werden auch mit einem Pull Down selektierbar.
Auch die Anzahl der Schaltblöcke soll sich verringern und durch sub Funktionen übersichtlichen werden.

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 13 Mai 2022, 21:51:19
Hallo Christian,
das sieht ja mal wieder klasse aus. Sowas weckt immer gewisse Begehrlichkeiten :-)
Du machst mit der LWP ausser der Heizung auch das Brauchwasser warm?
Ich habe nur eine Brauchwasserwärmepumpe im Einsatz die nur ca. 400 W braucht. Die habe ich fast immer übrig.
Die Wärmepumpe bietet zwei Schaltkontakte über die ich sie steuern kann:
- einen Freigabekontakt damit sie heizen darf, wird für günstige Stromquelle Awatar oder Rundsteuergerät o.ä vorgeschlagen.
- einen Kontakt mit dem der Sollwert höher gestellt wird, wird als Schaltbeispiel für den potentialfreien Kontakt vom Kostal vorgeschlagen.
Ich verwende den Freigabekontakt über ein Shelly Schalter und steuere damit den Heizvorgang in Abhängigkeit vom Überschuss mit einem Doif und den Daten von deinem WR_1.
Ich vewende auch den HourCounter. Es funktioniert soweit ganz gut ist aber natürlich nicht so ausgefeilt wie deine Lösung. Ich arbeite noch daran.
Eins von mir.

VG
   Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Mai 2022, 10:04:15
Zitat von: zwölfgang am 13 Mai 2022, 21:51:19
Du machst mit der LWP ausser der Heizung auch das Brauchwasser warm?
Ich habe nur eine Brauchwasserwärmepumpe im Einsatz die nur ca. 400 W braucht. Die habe ich fast immer übrig.
Die Wärmepumpe bietet zwei Schaltkontakte über die ich sie steuern kann:
- einen Freigabekontakt damit sie heizen darf, wird für günstige Stromquelle Awatar oder Rundsteuergerät o.ä vorgeschlagen.
- einen Kontakt mit dem der Sollwert höher gestellt wird, wird als Schaltbeispiel für den potentialfreien Kontakt vom Kostal vorgeschlagen.
Ich verwende den Freigabekontakt über ein Shelly Schalter und steuere damit den Heizvorgang in Abhängigkeit vom Überschuss mit einem Doif und den Daten von deinem WR_1.
Ich vewende auch den HourCounter. Es funktioniert soweit ganz gut ist aber natürlich nicht so ausgefeilt wie deine Lösung. Ich arbeite noch daran.
Ich habe eine große LWWP mit Multifunktionsspeicher. In dem Schichtspeicher bedient sich unten die Heizung und oben das WW über eine Edelstahlspirale. Somit habe ich kein stehendes Wasser und auch kein Legionellen Problem.

Du weist ja wie Du mich finden kannst :-)
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Mai 2022, 17:55:11
Hallo zusammen,

ich hatte ja bereits die Steuerungsmöglichkeit für DigitalOutputs mal erwähnt. Nun ist es soweit, dass mein Technikraum ziemlich warm wird und der Speicher somit auch die 40° C erreichen würde.
Deshalb habe ich am potentialfreien Ausgang nun ein Hutschienen Lastreais angeschlossen, mit dem ich einen Lüfter aktivieren kann. Schon mal vorweg, nein der Status ist nicht abfragbar (dank Kostal :-) )
Hier kommt nun die Beschreibung, wie man den Relais Ausgang ein/aus schalten kann, ohne die PV Steuerung von Kostal, lastabhängig zu konfigurieren.

get:
- 41_DigitalOutputs
      Liest die Register für die Output Steuerung

set:
- 41_DigitalOutputs
      Setzt die Register für die Output Steuerung.
      Hierzu gibt es eine Befehlsabfolge, mit der man den potentialfreien Ausgang des Plenticore schalten kann, wenn man die Überschusssteuerung des Plenticore [b]nicht[/b] verwendet.
      Darüber kann man dann z.B. einen Lüfter im Technik Raum Ein/Aus schalten ;-)


Die Abfolge, die dafür notwendig ist wäre dann diese, was ich [url_https://www.photovoltaikforum.com/thread/149992-status-schaltausgang-abfragen/?postID=2432655#post2432655]hier[/url] schon mal gepostet hatte:

Beispiel der Schaltreihenfolge:

9-0 => Aus, das Flag bleibt nun auf 0
9    => Ein nach 1 Minute
9-0 => Aus, das Flag bleibt nun auf 0

Durch die 9 schaltet es bereits ab, würde jedoch nach 1 Minute wieder an gehen.
Die 0 deaktiviert die Steuerung komplett.

Ich denke durch diese Vorgehensweise kann man auch die anderen Schaltkonfigurationen im Wechsel verwenden. Die Abschaltung sollte dann jeweils durch die Wiederholung der aktuell aktiven Konfiguration gefolgt vom Flag 0 erfolgen.
Anschließend kann dann die neu gewüschte Konfiguration folgen.

Somit wäre das Flag 0 dann auch das Signal für ein auf jeden Fall abgeschaltetes Relais.


Für die restlichen Konfigurationen gibt es hier (https://www.photovoltaikforum.com/thread/149992-status-schaltausgang-abfragen/?postID=2429159#post2429159) noch eine weitere Erklärung, die ich jedoch bisher nicht verwende.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 20 Mai 2022, 16:20:21
Hallo Christian,

Ich habe seit gestern nun endlich meinen Speicher erhalten BYD HVM.
Jetzt habe ich die Externe Steuerung ins FHEM hinzugefügt.
Muss ich da was spezielles beachten? Wenn ich es richtig verstanden habe ist die Basis Steuerung aktiv oder?
Ein Frage hätte ich das noch zu SpeicherMinSOC_fc1_Limit was hat der Wert zu bedeuten der dort eingetragen wird?

Vielen Dank
Gruß Alex
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Mai 2022, 19:06:58
Zitat von: majestro84 am 20 Mai 2022, 16:20:21
Hallo Christian,

Ich habe seit gestern nun endlich meinen Speicher erhalten BYD HVM.
Jetzt habe ich die Externe Steuerung ins FHEM hinzugefügt.
Muss ich da was spezielles beachten? Wenn ich es richtig verstanden habe ist die Basis Steuerung aktiv oder?
Ein Frage hätte ich das noch zu SpeicherMinSOC_fc1_Limit was hat der Wert zu bedeuten der dort eingetragen wird?

Vielen Dank
Gruß Alex
Hallo Alex

- generell sollte natürlich WR_1_API funktionieren
- Die Werte mit fc beziehen sich auf den Forecast, also müsste die Leistungsprognose auch laufen.

- Mit den Werten werden dann die Punkte für die Sommer/Winter Umschaltung und für das Mittagshoch festgelegt.
    SpeicherMinSOC_fc1_Limit     <= unter diesem Wert kommt am Tag so wenig Leistung, das auf den Winterbetrieb umgeschaltet wird.
    SpeicherMaxSOC_fc1_Limit    <= oberhalb dieses Wertes kommt so viel Leistung, das eine MaxSOC Begrenzung für den Speicher gemacht wird.
    SpeicherMidday_Inverter_Max_Power    <= Diese Leistung markiert den Anfang des Mittagshoch

Eine Beschreibung für die erste Einstellung sollte auch im Wiki sein.
Bitte verwende auch die Speicher Steuerung mit dem DOIF im Perl Modus, die ist bereits im Wiki. Die ältere im FHEM Modus ist aus dem Service :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 20 Mai 2022, 21:36:55
Ok danke ja das Wiki hatte ich gelesen und danach den Speicher in Fhem eingebunden.
Für die Externe Steuerung muss ich im Plenticore als Installateur die Steuerung auf Modbus umstellen richtig?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Mai 2022, 07:43:05
Zitat von: majestro84 am 20 Mai 2022, 21:36:55
Ok danke ja das Wiki hatte ich gelesen und danach den Speicher in Fhem eingebunden.
Für die Externe Steuerung muss ich im Plenticore als Installateur die Steuerung auf Modbus umstellen richtig?
Ohne ModBus / TCP kannst Du doch nicht die Werte des Plenticore empfangen, und hast somit auch keine Grundlage für Entscheidungen :-)
Die Steuerung habe ich über die API realisiert, bei der natürlich dann die Anmeldung am Plenticore laufen muss. Über ModBus kann man
mittlerweile auch den Speicher steuern, was ich jedoch nicht verwende (als das kam war die API bereits fertig).

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 21 Mai 2022, 12:18:07
Hi Christian
Den Wechselrichter habe ich mit der Api eingerichtet und es scheint auch zu gehen.
Nur kann ich beim Speicher nicht den MinSoC setzen über Fhem.
Deshalb die Frage ob ich in den Plenticore Batterieeinstellungen die Batteriesteuerung auf Modbus stellen muss statt wie jetzt auf intern.
VG Alex
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Mai 2022, 13:00:14
Zitat von: majestro84 am 21 Mai 2022, 12:18:07
Hi Christian
Den Wechselrichter habe ich mit der Api eingerichtet und es scheint auch zu gehen.
Nur kann ich beim Speicher nicht den MinSoC setzen über Fhem.
Deshalb die Frage ob ich in den Plenticore Batterieeinstellungen die Batteriesteuerung auf Modbus stellen muss statt wie jetzt auf intern.
VG Alex
Ja, das muss aktiviert werden.
Generell wird der Speicher aber trotzdem intern selber steuern und die externe Steuerung überlagert dann die interne. Somit kann man auch bei kleinen Anlagen die "intelligente Steuerung" im Plenticore aktivieren und nur z.B. die Sommer/Winter Umschaltung und das Steicher Sperren extern machen.
Ich habe es bereits komplett inklusive des Mittagshochs übernommen. Dafür schaltet man dann im Plenticore die "intelligente Steuerung" ab. Der WR würde dann einfach zu jeder Zeit den Speicher laden, sobald Überschuss an PV Leistung besteht.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 21 Mai 2022, 14:07:11
Ok danke dann werde ich das mal ausprobieren und gucken wie es so läuft.
Vielen Dank für deine Mühe
VG Alex
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Mai 2022, 14:26:43
Zitat von: majestro84 am 21 Mai 2022, 14:07:11
Ok danke dann werde ich das mal ausprobieren und gucken wie es so läuft.
Vielen Dank für deine Mühe
VG Alex
Ich kann auch gerne beim Feintuning helfen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 21 Mai 2022, 20:03:19
Darauf komme ich gerne zurück.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 Mai 2022, 13:52:40
Hallo zusammen,
es ist einfach geil sein E-Auto zuhause zu laden :-)
Heute mal nur mit 35 kWh bis 80%, das sind 200 km Fahrspaß.
Da geht der Eigenverbrauch mal eben für heute über 65 % (weil der Tag noch nicht rum ist habe ich etwas abgerundet)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Juni 2022, 15:17:25
Hallo zusammen,
heute ist ein Tag, an dem bei mir der Vormittag und der Nachmittag von der Prognoseleistung stärker abweichen.
Da ich die MaxSOC Begrenzung verwende würde mein Speicher limitiert, aber durch die starken Schwankungen am Nachmittag auch schon zeitweise entladen.
Das ganze deutet somit auf schlechtes Wetter hin und ich möchte ja nicht mit zuwenig Leistung in die Nacht starten.
Deshalb habe ich jetzt testweise noch die Prognose für die Zeit vor 13:00 Uhr und ab 13:00 Uhr mit als reading im Solar_forecast() aufgenommen. Das ist aber noch nicht im Wiki .

Solar_Calculation_fc0_day 40445
Solar_Calculation_fc0_morning 23339
Solar_Calculation_fc0_afternoon 17106

Nach welchen Kriterien ich das nun in die Speicher Steuerung aufnehme ist noch nicht ganz klar.
Als ersten Ansatz stoppe ich die MaxSOC Begrenzung, wenn eine Speicherverwendung von > 500 W festgestellt wird, was eventuell noch über die Verendungszeit konkretisiert werden könnte.

Habt Ihr eventuell auch noch spezielle Situationen festgestellt?

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 08 Juni 2022, 15:43:37
Bei mir war das vor ein paar Tagen der Fall, als das Wetter entgegen der Prognose mit einem Gewitter und damit starker Abdunklung, der Berechnung einen Strich durch die Rechnung gemacht hat...

Das hätte aber auch bei einer Aufhebung der Limitierung bei >500 Wh aus dem Speicher nicht aufgefangen werden können.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Juni 2022, 16:23:09
Zitat von: Mumpitz am 08 Juni 2022, 15:43:37
Bei mir war das vor ein paar Tagen der Fall, als das Wetter entgegen der Prognose mit einem Gewitter und damit starker Abdunklung, der Berechnung einen Strich durch die Rechnung gemacht hat...

Das hätte aber auch bei einer Aufhebung der Limitierung bei >500 Wh aus dem Speicher nicht aufgefangen werden können.
Okay, so eine Katastrophe kann man nicht vorraus planen :-(
Dein Speicher war aber vorher voll geladen und hätte sich bei entsprechender Leistung nach dem Gewitter ja auch wieder aufgeladen.

Mein Speicher würde dann ja wegen der MaxSOC Limitierung auch nur bis dort hin wieder nachgeladen werden. Frei nach dem Motto eine Katastrophe kommt selten alleine, würde ich dann die MaxSOC Limitierung halt aufheben. Wenn dann natürlich nichts mehr vom Dach kommt bringt das auch nichts.

Dafür würde ich dann versuchen die Prognose von dem schlechten Nachmittag zu verwenden. Heute hatte ich einen Faktor von 17106/23339 = 0,73 , je kleiner der wird, umso schlechter ist der Nachmittag. Das geht natürlich nur bei entsprechender Prognose vom Wetterdienst und für den Faktor muss man erst noch Erfahrung sammeln. Somit würde ich dann schon morgens die MaxSOC Limitierung aufheben und mit einem volleren Speicher in den Nachmittag gehen.

VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 08 Juni 2022, 17:41:32
Zitat von: ch.eick am 08 Juni 2022, 16:23:09
Okay, so eine Katastrophe kann man nicht vorraus planen :-(
Dein Speicher war aber vorher voll geladen und hätte sich bei entsprechender Leistung nach dem Gewitter ja auch wieder aufgeladen.


Da muss ich dir widersperchen lieber Christian. An diesem Tag wurde der Speicher nur zu 78% geladen...

2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMiddayControl es wird kein Middayhigh geben
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMaxSOC_Actual 78 % geplant
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMaxSOC_DayBefore 78 % neu berechnet und gesichert
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : Speicherladung aktuell 34 % > Minimum 20 %
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : Leistung Prognose 41377 wh > Schwellwert 30000 wh
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMaxSOC_DayBefore 85 %
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMaxSOC_MinSOC_Time gefunden 34 %


Aber einen Ansatz das zu verhindern? allenfalls Einbezug einer Zweitmeinung wie beim Arzt vor einer Knie OP, sprich ein zweiter Wetterdienst?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Juni 2022, 22:34:02
Zitat von: Mumpitz am 08 Juni 2022, 17:41:32
Da muss ich dir widersperchen lieber Christian. An diesem Tag wurde der Speicher nur zu 78% geladen...

2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMiddayControl es wird kein Middayhigh geben
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMaxSOC_Actual 78 % geplant
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMaxSOC_DayBefore 78 % neu berechnet und gesichert
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : Speicherladung aktuell 34 % > Minimum 20 %
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : Leistung Prognose 41377 wh > Schwellwert 30000 wh
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMaxSOC_DayBefore 85 %
2022.06.05 07:12:33 3: BYD_ExternControl_neu cmd_7  : SpeicherMaxSOC_MinSOC_Time gefunden 34 %


Aber einen Ansatz das zu verhindern? allenfalls Einbezug einer Zweitmeinung wie beim Arzt vor einer Knie OP, sprich ein zweiter Wetterdienst?
Okay,
also wäre eine Änderung für Dich auch interessant.
Gab es denn einen Wetterdienst mit Rad1h Werten, der das Gewitter berücksichtigen konnte? Oder der das lokale Gewitter vorraussagen konnte?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 09 Juni 2022, 06:21:34
Wunderground, bei der eine nahegelegene Station Daten liefert könnte aushelfen
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 09 Juni 2022, 06:25:47
Zitat von: ch.eick am 08 Juni 2022, 22:34:02
Oder der das lokale Gewitter vorraussagen konnte?

Ich weiss noch das ich vom UWZ Modul eine Gewitterwarnung erhalten habe. Leider kann ich nicht mehr nachschauen wieviel vorher das gewesen ist. Ich zeichne die Daten nicht auf und die Pushmeldungen löschen sich ebenfalls.
Wäre allenfalls ein Ansatz. Sobald Gewitter Meldung, maxSoc Kontrolle abbrechen...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 09 Juni 2022, 07:13:23
Ich mach die Akkuregelung nicht über MaxSOC sondern mit MaxChargePower. Das Ziel ist, den Akku erstmal auf 40% zu bringen und dann bis 15:00 Uhr voll zu machen. Dazu wird die MaxChargePower soweit reduziert, dass die 100% etwa gegen 15:00 Uhr erreicht werden. Außerdem wird noch geprüft, ob die vorhergesagte PV-Energy bis zum Ende des Tages mindestens 5x so groß ist, wie die noch zu ladende Energie. Wird das unterschritten, wird wieder mit voller Leistung geladen.
Im Winter geht es dann genau anders herum. Es wird MaxDischargePower auf 0 gestellt, bis der Akku bei 80% ist. Dann darf bis 30% entladen werden.

PowerMeter.power_consumption.* {
  my $discharge = 2780;
  my $charge = 2780;
  my $minsoc = 8;
  my $maxsoc = 80;
  my $soc = ReadingsNum('PV_1',"Act_state_of_charge",0);
  my $msoc = ReadingsNum('ExtBatCtrl','msoc',0);
  my $mode = ReadingsVal('PV_1','Battery_mode','');
  my $pvday = ReadingsNum('Solar','Today_PVforecast',0);
  my $pvrest = ReadingsNum('Solar','RestOfDayPVforecast',0);
  my $batfree = 5100 - ((5100 * $soc) / 100);

  if( $pvday > 10000 ) {
    # sommer
    $maxsoc = 100;
    if( $pvrest > ($batfree * 5) ) {
      if( $soc >= 40 && $hour < 15 ) {
        my $minleft = ((15 - $hour) * 60) - $min;
        my $limit = ($batfree * 60) / $minleft;
    if( $limit < $charge ) { $charge = $limit; }
    if( $charge < 400 ) { $charge = 400; }
      }
    }
  }
  else {
    # winter
    $minsoc = ReadingsNum('ExtBatCtrl','minimal',30);
    # switch destination soc
    if( $soc < $minsoc ) { $msoc = $maxsoc; }
    if( $soc > $maxsoc ) { $msoc = $minsoc; }

    # disbale discharge when going up to maxsco
    if( $msoc == $maxsoc ) {
      $discharge = 0;
    }
  }

  # if mode not normal, we charge only up to 90%
  $maxsoc = 100;
  if( $mode ne 'Normal' ) { $maxsoc = 90; }

  fhem('setreading ExtBatCtrl msoc '.$msoc);
  fhem('set PV_1 Battery_MaxDischargePower '.$discharge);
  fhem('set PV_1 Battery_MaxChargePower '.$charge);
  fhem('set PV_1 Battery_MaxSOC '.$maxsoc);
  fhem('set PV_1 Battery_MinSOC '.$minsoc);
}
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Juni 2022, 09:34:51
Zitat von: andi11 am 09 Juni 2022, 06:21:34
Wunderground, bei der eine nahegelegene Station Daten liefert könnte aushelfen
Das nutze ich für meine Rollo Steuerung, jedoch kommen da nur aktuelle Werte, soweit ich das weiß.
Hättest Du mal eine Station als Beispiel?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Juni 2022, 10:05:59
Zitat von: papa am 09 Juni 2022, 07:13:23
Ich mach die Akkuregelung nicht über MaxSOC sondern mit MaxChargePower. Das Ziel ist, den Akku erstmal auf 40% zu bringen und dann bis 15:00 Uhr voll zu machen. Dazu wird die MaxChargePower soweit reduziert, dass die 100% etwa gegen 15:00 Uhr erreicht werden. Außerdem wird noch geprüft, ob die vorhergesagte PV-Energy bis zum Ende des Tages mindestens 5x so groß ist, wie die noch zu ladende Energie. Wird das unterschritten, wird wieder mit voller Leistung geladen.
Im Winter geht es dann genau anders herum. Es wird MaxDischargePower auf 0 gestellt, bis der Akku bei 80% ist. Dann darf bis 30% entladen werden.
Das wird in der Speicher Steuerung über die Schwellwerte der Prognose gemacht.
Auch das MaxChargePower wird im WR_1_Speicher_1_ExternControl verwendet.

Im Winter, wenn die Prognose schlecht ist, oder auch im Sommer bei schlechtem Wetter gibt es kein Mittagshoch. Daduch wird dann sofort am morgen mit dem kompletten Überschuss geladen.
Sollte es ein Mittagshoch gibt, wid zuerst auf 3* MinSOC direkt geladen, danach wird bis 9:00 Uhr gewartet und es beginnt ein Laden mit niedriger Leistung bis 30 %.
Ab dem berechneten Mittagshoch kann man entweder eine Ladeleistung vorgeben, oder man lässt sie dynamisch berechnen. Je nach ende des Mittagshochs ist der Speicher dann voll, oder der Rest wird noch ohne weitere Kontrolle aufgefüllt.
Die MaxSOC Limitierung beeinflusst das ganze dann noch zusätzlich, damit der Speicher nicht ständig bei 100% ist, falls er für den Sommer überdimensioniert sein sollte.
Sollte der Speicher 100% erreicht haben, wird mit der MaxSOC Limitierung auf 95% begrenzt, dadurch wird nicht permanent nachgeladen, was in der Graphik nicht schön aussieht :-)

Laut EFT-Service ist eigentlich die Ladegeschwindigkeit egal und auch nicht schädlich. Somit kann man mit voller Leistung eine kurze Zeit laden oder auch langsam mit weniger Leistung.

Das mit dem MaxDischargePower hat es bei den ersten Firmware Ständen noch nicht gegeben, es wäre jedoch eine Überlegung wert. Allerdings müsste man das über die Plenticore API zyklisch wiederholen, da es dort das Dead Man Prinzip gibt.

Wie sieht es bei der Modbus Steuerung aus, wenn Du einfach nichts mer senden würdest? Nach meinen früheren Tests ging der Plenticore dann nicht mehr in die Eigensteuerung, z.B. die "inteligente Speicher Steuerung".
Mir war da wichtig, dass beim Ausfall von FHEM, oder beim Verzichten auf SmartHome, wenn ich es mal nicht mehr betreiben kann, alles im Haus einfach mit dem Default weiter läuft. Dann fehlt zwar einiges an Luxus und die Heizung oder die PV-Anlage ist nicht mehr überoptimiert, aber ein normaler Elektriker sollte es trotzdem warten können.

@papa hast Du eigentlich mein Konstrukt übernommen, oder Dir nur einiges davon rausgesucht? Ich meine Du hattest mit dem Plenticore schon vor mir begonnen und wolltest nicht mehr umbauen?

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 09 Juni 2022, 10:47:12
Zitat von: Mumpitz am 09 Juni 2022, 06:25:47
Ich weiss noch das ich vom UWZ Modul eine Gewitterwarnung erhalten habe. Leider kann ich nicht mehr nachschauen wieviel vorher das gewesen ist. Ich zeichne die Daten nicht auf und die Pushmeldungen löschen sich ebenfalls.
Wäre allenfalls ein Ansatz. Sobald Gewitter Meldung, maxSoc Kontrolle abbrechen...

Aktuell haben wir grad so eine Unwetterwarnung:

Internals:
   CountryCode CH
   DEF        CH 3162 1200
   FUUID      5c6afec8-f33f-915e-e3ba-eb2b3bddcbb3ea23
   FVERSION   77_UWZ.pm:v3.1.0-s25306/2021-12-06
   INTERVAL   1200
   INTERVALWARN 0
   NAME       Unwetterzentrale
   NOTIFYDEV  global,Unwetterzentrale
   NR         149
   NTFY_ORDER 50-Unwetterzentrale
   PLZ        3162
   STATE      Warnungen: 1
   TYPE       UWZ
   URL        https://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=getWarning&language=de&areaID=UWZCH3162
   VERSION    v3.1.0
   OLDREADINGS:
   READINGS:
     2022-06-09 10:29:21   WarnCount       1
     2022-06-09 10:29:21   WarnUWZLevel    3
     2022-06-09 10:29:21   WarnUWZLevel_Color orange
     2022-06-09 10:29:21   WarnUWZLevel_Str Warnstufe Orange (Unwetterwarnung)
     2022-06-09 10:29:21   Warn_0_AltitudeMax 9000
     2022-06-09 10:29:21   Warn_0_AltitudeMin -10
     2022-06-09 10:29:21   Warn_0_Creation 1654760100
     2022-06-09 10:29:21   Warn_0_Creation_Date 09.06.2022
     2022-06-09 10:29:21   Warn_0_Creation_Time 09:35
     2022-06-09 10:29:21   Warn_0_End      1654763700
     2022-06-09 10:29:21   Warn_0_End_Date 09.06.2022
     2022-06-09 10:29:21   Warn_0_End_Time 10:35
     2022-06-09 10:29:21   Warn_0_EventID  16547605350000
     2022-06-09 10:29:21   Warn_0_Hail     1
     2022-06-09 10:29:21   Warn_0_IconURL  https://www.unwetterzentrale.de/images/icons/gewitter-orange.gif
     2022-06-09 10:29:21   Warn_0_LongText Am 09.06.2022 um 09:35 Uhr wurde ein Gewitter der Stufe Orange registriert, dessen Schwerpunkt sich im Bereich Neukirch (Egnach) befindet. Es kommt aus West und bewegt sich mit einer Geschwindigkeit von 22 km/h in östliche Richtung. Es sind lokal Starkregen und stürmische Böen möglich. Punktuell ist auch kleinkörniger Hagel nicht auszuschließen. Die Blitzaktivität ist gering. Folgende Orte befinden sich auf der weiteren Zugbahn des Gewitters: Salmsach (09:35), Egnach (09:35), Arbon (09:35), Roggwil TG (09:35), Muolen (09:35), Amriswil (09:35), Steinebrunn (09:35), Romanshorn (09:35), Horn (09:38), Goldach (09:46), Rorschach (09:50), Rorschacherberg (09:56), Altenrhein (10:00), Wasserburg (Bodensee) (10:14), Lindau (Bodensee) (10:20). Angegeben ist die Ankunftszeit des Gewitters in dem Ort.
     2022-06-09 10:29:21   Warn_0_Severity 10
     2022-06-09 10:29:21   Warn_0_ShortText Gewitter mit Starkregen, (kleiner Hagel und stürmische Böen sind möglich)
     2022-06-09 10:29:21   Warn_0_Start    1654760100
     2022-06-09 10:29:21   Warn_0_Start_Date 09.06.2022
     2022-06-09 10:29:21   Warn_0_Start_Time 09:35
     2022-06-09 10:29:21   Warn_0_Type     7
     2022-06-09 10:29:21   Warn_0_Type_Str Gewitter
     2022-06-09 10:29:21   Warn_0_levelName alert_warn_orange
     2022-06-09 10:29:21   Warn_0_uwzLevel 3
     2022-06-09 10:29:21   Warn_0_uwzLevel_Str Warnstufe Orange (Unwetterwarnung)
     2022-06-09 10:29:20   currentIntervalMode normal
     2022-06-09 10:29:21   durationFetchReadings 1.00
     2017-01-05 13:37:38   ftuiUwzText     <div class="top-space-min"><div class="row"><div class="col-2-1"><img src="http://www.unwetterzentrale.de/images/icons/schnee-orange.gif" width="50" height="50" alt="Unwetterwarnung" /></div><div class="top-space-mid col-3-4">Für Lagen unterhalb von 600 Metern: Ab Mittwochnachmittag ist zeitweise warnrelevanter Schneefall in den Tälern zu erwarten. Dabei kommen Neuschneemengen zwischen 5 und 15 cm in 12 Stunden, örtlich auch mehr zustande. Donnerstagabend und -nacht lässt der Schneefall nach.</div></div><div class="newline">&nbsp </div><div class="row"><div class="col-2-1"><img src="http://www.unwetterzentrale.de/images/icons/strassenglaette-orange.gif" width="50" height="50" alt="Unwetterwarnung" /></div><div class="top-space-mid col-3-4">Streckenweise gefährliche Fahrbahnverhältnisse durch Schneefall.</div></div><div class="newline">&nbsp </div></div>
     2022-06-09 10:29:21   lastConnection  27 values captured in 1.00 s
     2022-06-09 10:29:21   state           Warnungen: 1
   fhem:
     LOCAL      0
   helper:
Attributes:
   DbLogExclude .*
   group      Unwetterradar
   humanreadable 1
   room       hidden
   verbose    2


Vielleicht wäre damit was zu machen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Juni 2022, 11:15:35
Zitat von: Mumpitz am 09 Juni 2022, 10:47:12
Aktuell haben wir grad so eine Unwetterwarnung:

<snip>

Vielleicht wäre damit was zu machen?
Hast Du mal einen Link für den Browser?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 09 Juni 2022, 11:24:39
https://wiki.fhem.de/wiki/UWZ
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Juni 2022, 11:31:05
Zitat von: Mumpitz am 09 Juni 2022, 11:24:39
https://wiki.fhem.de/wiki/UWZ
Ich meinte zur Alarm Seite, wo man das im Browser aufbereitet sehen kann :-)

EDIT: Hab's schon gefunden.

Es wäre toll, wenn Du die Kriterien für eine rechtzeitige Reaktion heraus finden könntest.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: papa am 09 Juni 2022, 11:44:04
Zitat von: ch.eick am 09 Juni 2022, 10:05:59
Das mit dem MaxDischargePower hat es bei den ersten Firmware Ständen noch nicht gegeben, es wäre jedoch eine Überlegung wert. Allerdings müsste man das über die Plenticore API zyklisch wiederholen, da es dort das Dead Man Prinzip gibt.

Wie sieht es bei der Modbus Steuerung aus, wenn Du einfach nichts mer senden würdest? Nach meinen früheren Tests ging der Plenticore dann nicht mehr in die Eigensteuerung, z.B. die "inteligente Speicher Steuerung".
Das funktioniert super. Wenn ich das Notify auf inactive stelle, greift wieder die Standardregelung des Plenticore.
Zitat von: ch.eick am 09 Juni 2022, 10:05:59
@papa hast Du eigentlich mein Konstrukt übernommen, oder Dir nur einiges davon rausgesucht? Ich meine Du hattest mit dem Plenticore schon vor mir begonnen und wolltest nicht mehr umbauen?
Ich habe mir nur die Rosinen rausgepickt - Deine Lösung ist mir einfach zu komplex. Außerdem kann ich den BYD HVS nicht per Web auslesen. Bin da komplett auf die Plenticore Register angewiesen. Für die Prognose nutzt ich das SolarForecast Modul.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Juni 2022, 11:58:49
Zitat von: papa am 09 Juni 2022, 11:44:04
Ich habe mir nur die Rosinen rausgepickt - Deine Lösung ist mir einfach zu komplex. Außerdem kann ich den BYD HVS nicht per Web auslesen. Bin da komplett auf die Plenticore Register angewiesen. Für die Prognose nutzt ich das SolarForecast Modul.
Den HVS muss man nicht auslesen, es wird alles über den Plenticore gesteuert. Beim BYD HV habe ich nur begonnen die weiteren Informationen zu Zellspannungen und Temperaturen auszulesen. Das wird aber nicht verwendet und sollte als Nachweis für eine Leistungsdegeneration dienen, damit man vor Ablauf der Gewährleistung mit BYD ins Gespräch gehen kann.
Gibt es zum SolarForecast mitlerweile eine Beschreibung für einen strukturierten Einstieg? Heiko hatte ja meine Solar_forecast() mit eingebaut, aber dann hat sich das ganze doch ziemlich von einem Forecast weg entwickelt und hat noch die Eigenverbrauchsoptimierung und Graphische Darstellung mit aufgenommen. Das wurde dann für mich persönlich zuviel in einem Modul, was ich lieber getrennt haben würde. Deshalb bin ich lieber bei dem modularen Aufbau geblieben, bei dem man besser Rosinen picken kann :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Juni 2022, 12:54:50
Zitat von: Mumpitz am 09 Juni 2022, 11:24:39
https://wiki.fhem.de/wiki/UWZ
Ich habe es jetzt mal probehalber bei mir auch eingebunden. Jetzt fehlen halt noch die möglichen Kriterien, nach denen man eine Entscheidung treffen könnte.
Wenn Du da mal die readings mit in die DbLog schreiben würdest könnten wir uns das mal genauer anschauen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: andi11 am 10 Juni 2022, 19:41:36
bei mir kommen über Wunderground auch nur aktuelle Werte, aber evl könnte es zumindest ein 2tes Abbruchkriterium liefern?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Juni 2022, 10:09:44
Zitat von: andi11 am 10 Juni 2022, 19:41:36
bei mir kommen über Wunderground auch nur aktuelle Werte, aber evl könnte es zumindest ein 2tes Abbruchkriterium liefern?
Ich habe bereits auch Donnerwetter vorbereitet.
Bei wunderground frage ich drei Stationen in der Nähe ab und steuere die Rollos damit, das klappt super. Man kann das auch ohne eine Registrierung verwenden, da ich direkt solch eine Seite (https://www.wunderground.com/dashboard/pws/IGROGERA47) mit httpmod parse.

Aktuelle Werte sind leider mindestens 6 Stunden zu spät, um proaktiv reagieren zu können.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Juni 2022, 09:48:47
Zitat von: ch.eick am 09 Juni 2022, 12:54:50
Ich habe es jetzt mal probehalber bei mir auch eingebunden. Jetzt fehlen halt noch die möglichen Kriterien, nach denen man eine Entscheidung treffen könnte.
Wenn Du da mal die readings mit in die DbLog schreiben würdest könnten wir uns das mal genauer anschauen.
Moin zusammen,
ich stelle mal die Typen von UWZ zur diskussion siehe hier Definitionen (https://forum.fhem.de/index.php/topic,51233.msg428863.html#msg428863)
Die mit "<<<" könnten meiner Meinung nach etwas mit weniger Leistung zu tun haben.

Warn_0_Type_Str - Art des Unwetters (text)
1 - unbekannt
2 - Sturm/Orkan   <<<
3 - Schneefall   <<<
4 - Regen   <<<
5 - Extremfrost
6 - Waldbrandgefahr
7 - Gewitter   <<<
8 - Glätte
9 - Hitze
10 - Glatteisregen   <<<
11 - Bodenfrost

Dazu dann noch die Warnstufen, wobei ich ab Stufe 3 mir eine reduktion in der Prognose vorstelle.

Warnstufen
0 Stufe Grün (keine Warnung)
1 Stufe Dunkelgrün (Wetterhinweise)
2 Stufe Gelb (Vorwarnung für Unwetterwarnung)
3 Warnstufe Orange (Unwetterwarnung)   <<<
4 Warnstufe Rot (Unwetterwarnung)
5 Warnstufe Violett (Unwetterwarnung)

Dann müsste noch das hier ausgewertet werden

Warn_0_Start - Begin der Warnung
Warn_0_Start_Date - Startdatum der Warnung
Warn_0_Start_Time - Startzeit der Warnung
Warn_0_End - Warn Ende
Warn_0_End_Date - Enddatum der Warnung
Warn_0_End_Time - Endzeit der Warnung
Warn_0_Severity - Schwere des Unwetters (0 kein Unwetter, 12 massives Unwetter)
Warn_0_Hail - Hagelwarnung (1|0)


Nun wärern einige echte Beispiele mit den Kombinationen der readings recht hilfreich. Hat da bereits jemand mal etwas im Logging?

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Juni 2022, 10:01:28
Moin,
ich habe jetzt die ersten Warnungen vom Unwetterdienst, die auch ins DbLog aufgenommen sind.
Dabei klammere ich jetzt durationFetchReadings, currentIntervalMode und lastConnection aus, da das nicht von belang ist.
In der Datenbank wird der Warn_0_LongText jedoch auf Grund der Länge und der Feldgröße in der Datenbank abgeschnitten.
Für eine rein technische Auswertung bräuchte man den ja auch nicht. Auch Warn_0_IconURL, Warn_0_ShortText und Warn_0_EventID, Warn_0_levelName könnte nach meiner Meinung direkt weg fallen.
Mit Warn_0_AltitudeMin/Max könnte man gegen die Altitude der Anlage noch einige Warnungen, z.B. für Schneefall ausklammern.

READINGS:
     2022-06-20 09:05:53   WarnCount       1
     2022-06-20 09:05:53   WarnUWZLevel    2
     2022-06-20 09:05:53   WarnUWZLevel_Color gelb
     2022-06-20 09:05:53   Warn_0_AltitudeMax 9000
     2022-06-20 09:05:53   Warn_0_AltitudeMin -10
     2022-06-20 09:05:53   Warn_0_Creation 1655643862
     2022-06-20 09:05:53   Warn_0_End      1655730000
     2022-06-20 09:05:53   Warn_0_EventID  16556437029005
     2022-06-20 09:05:53   Warn_0_Hail     0
     2022-06-20 09:05:53   Warn_0_IconURL  https://www.unwetterzentrale.de/images/icons/gewitter-gelb.gif
     2022-06-20 09:05:53   Warn_0_LongText Ab Sonntagnacht ist mit Gewittern zu rechnen. Aus Südwest zieht ein Gewitter auf. Dabei besteht die Gefahr von Starkregen und Sturmböen. Montagvormittag und -mittag lässt die Schauer- und Gewitterneigung wieder nach.
     2022-06-20 09:05:53   Warn_0_Severity 7
     2022-06-20 09:05:53   Warn_0_ShortText Gewitter.
     2022-06-20 09:05:53   Warn_0_Start    1655683200
     2022-06-20 09:05:53   Warn_0_Type     7
     2022-06-20 09:05:53   Warn_0_levelName alert_forewarn_orange
     2022-06-20 09:05:53   Warn_0_uwzLevel 2
     2022-06-20 09:05:53   currentIntervalMode normal
     2022-06-20 09:05:53   durationFetchReadings 0.00
     2022-06-20 09:05:53   lastConnection  18 values captured in 0.00 s
     2022-06-20 09:05:53   state           Warnungen: 1

Der Effect der Warnung ist im Diagramm von 07:15 - 08:45 zu erkennen, da hat es eigentlich nur geregnet.
Durch den Forecast kann man ja sehr schön sehen, das der DWD am Vormittag auch ziemlich gut die Rad1h Werte gedämpft hat. ab 15:00 Uhr wird es dann etwas besser werden und danach kommt der Abfall der PV-Leistung am Nachmittag. Ich werde jetzt die Kurve weiter verfolgen und dann hier im Verlauf der Zeit austauschen.
Durch den Zeitraum der Warnung könnte man jetzt höchstens die Prognose etwas stärker nach unten drücken, dazu müsste sich jedoch ein Faktor aus WarnUWZLevel, Warn_0_Hail, Warn_0_Severity und Warn_0_uwzLevel ergeben. Hieraus käme dann das erste Kriterium für Warn_0_Type = 7 = Gewitter .

EDIT: Zusätlich hatte ich ja auch noch die Prognose mit Vormittags/Nachmittags (https://forum.fhem.de/index.php/topic,114849.msg1224433.html#msg1224433) als reading aufsummiert.

Solar_Calculation_fc0_afternoon 46388
Solar_Calculation_fc0_morning 15663
Solar_Calculation_fc0_day 62051

Hierbei ist dann Nachmittag/Vormittag=Faktor ein Wert um 1 ist ausgeglichen.
schlechter Nachmittag: 17106/23339 = 0,73
schlechten Vormittag : 46388/15663 = 2,96


Wie ist da Eure Meinung?

VG
   Christian

Und hier noch der Auszug aus der Datenbank, etwas bereinigt. Die Zeiten sind in UNIX Time angegeben.

mysql> select * from history WHERE DEVICE='Unwetterzentrale' AND TIMESTAMP > '2022-06-19 00:00:00' ORDER BY TIMESTAMP;
+---------------------+------------------+------+-------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------+------+
| TIMESTAMP           | DEVICE           | TYPE | EVENT | READING               | VALUE                                                                                                                           | UNIT |
+---------------------+------------------+------+-------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------+------+
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | state                 | Warnungen: 4                                                                                                                    |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_0_Creation       | 1655464891                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_0_End            | 1655676000                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_0_EventID        | 16551784063592.9                                                                                                                |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_0_LongText       | Am Wochenende sind hochsommerliche Verh▒ltnisse zu erwarten. Die Temperaturen steigen teils deutlich ▒ber 30 Grad, so dass die  |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_0_ShortText      | Gebietsweise hohe, am Wochenende gebietsweise sehr hohe Waldbrandgefahr.                                                        |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_0_Start          | 1655463600                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_AltitudeMax    | 600                                                                                                                             |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_Creation       | 1655486545                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_End            | 1655661600                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_EventID        | 16554861763287.5                                                                                                                |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_IconURL        | https://www.unwetterzentrale.de/images/icons/temperatur-orange.gif                                                              |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_LongText       | F▒r Lagen unterhalb von 600 Metern: Leichte bis moderate Hitzebelastung bei H▒chstwerten zwischen 30 und 33 Grad.               |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_ShortText      | Unterhalb von 600 Metern: Leichte bis moderate Hitzebelastung; 30-33 ▒C.                                                        |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_Start          | 1655542800                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_1_Type           | 9                                                                                                                               |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_2_AltitudeMax    | 500                                                                                                                             |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_2_Creation       | 1655488320                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_2_EventID        | 16554872455126.1                                                                                                                |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_2_levelName      | notice_warn_red                                                                                                                 |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_2_LongText       | F▒r Lagen unterhalb von 500 Metern: Durch viel Sonnenschein und subtropischer Luft herrscht starke Hitzebelastung bei H▒chstwe  |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_2_Severity       | 5                                                                                                                               |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_2_ShortText      | Unterhalb von 500 Metern: Starke Hitzebelastung; 30-35 ▒C.                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_2_Start          | 1655550000                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_AltitudeMax    | 200                                                                                                                             |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_Creation       | 1655489400                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_End            | 1655658000                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_EventID        | 16554889536935.1                                                                                                                |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_levelName      | notice_warn_violet                                                                                                              |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_LongText       | F▒r Lagen in den Niederungen unterhalb von 200 Metern: Durch ganztags sehr viel Sonneneinstrahlung und subtropische Luftmassen  |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_Severity       | 6                                                                                                                               |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_ShortText      | Unterhalb von 200 Metern: starke bis extreme Hitzebelastung; 37-39 ▒C.                                                          |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | Warn_3_Start          | 1655553600                                                                                                                      |      |
| 2022-06-19 00:05:49 | Unwetterzentrale | UWZ  |       | WarnCount             | 4                                                                                                                               |      |


| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | state                 | Warnungen: 5                                                                                                                    |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_AltitudeMax    | 9000                                                                                                                            |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_AltitudeMin    | -10                                                                                                                             |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_Creation       | 1655643780                                                                                                                      |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_End            | 1655730000                                                                                                                      |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_EventID        | 16556437029005                                                                                                                  |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_Hail           | 0                                                                                                                               |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_IconURL        | https://www.unwetterzentrale.de/images/icons/gewitter-gelb.gif                                                                  |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_levelName      | alert_forewarn_orange                                                                                                           |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_LongText       | Ab Sonntagnacht ist mit Gewittern zu rechnen. Aus S▒dwest zieht ein Gewitter auf. Dabei besteht die Gefahr von Starkregen und S |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_Severity       | 7                                                                                                                               |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_ShortText      | Gewitter.                                                                                                                       |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_Start          | 1655683200                                                                                                                      |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_Type           | 7                                                                                                                               |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | Warn_4_uwzLevel       | 2                                                                                                                               |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | WarnCount             | 5                                                                                                                               |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | WarnUWZLevel          | 2                                                                                                                               |      |
| 2022-06-19 15:35:53 | Unwetterzentrale | UWZ  |       | WarnUWZLevel_Color    | gelb                                                                                                                            |      |
| 2022-06-19 17:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_Creation       | 1655464800                                                                                                                      |      |
| 2022-06-19 17:05:53 | Unwetterzentrale | UWZ  |       | Warn_4_Creation       | 1655643862                                                                                                                      |      |


| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | state                 | Warnungen: 4                                                                                                                    |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_AltitudeMax    | 9000                                                                                                                            |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_Creation       | 1655643862                                                                                                                      |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_End            | 1655730000                                                                                                                      |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_EventID        | 16556437029005                                                                                                                  |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_IconURL        | https://www.unwetterzentrale.de/images/icons/gewitter-gelb.gif                                                                  |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_levelName      | alert_forewarn_orange                                                                                                           |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_LongText       | Ab Sonntagnacht ist mit Gewittern zu rechnen. Aus S▒dwest zieht ein Gewitter auf. Dabei besteht die Gefahr von Starkregen und S |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_Severity       | 7                                                                                                                               |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_ShortText      | Gewitter.                                                                                                                       |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_Start          | 1655683200                                                                                                                      |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_Type           | 7                                                                                                                               |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | Warn_3_uwzLevel       | 2                                                                                                                               |      |
| 2022-06-19 19:05:53 | Unwetterzentrale | UWZ  |       | WarnCount             | 4                                                                                                                               |      |


| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | state                 | Warnungen: 2                                                                                                                    |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_AltitudeMax    | 9000                                                                                                                            |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_Creation       | 1655643862                                                                                                                      |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_End            | 1655730000                                                                                                                      |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_EventID        | 16556437029005                                                                                                                  |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_IconURL        | https://www.unwetterzentrale.de/images/icons/gewitter-gelb.gif                                                                  |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_levelName      | alert_forewarn_orange                                                                                                           |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_LongText       | Ab Sonntagnacht ist mit Gewittern zu rechnen. Aus S▒dwest zieht ein Gewitter auf. Dabei besteht die Gefahr von Starkregen und S |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_Severity       | 7                                                                                                                               |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_ShortText      | Gewitter.                                                                                                                       |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_Start          | 1655683200                                                                                                                      |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_Type           | 7                                                                                                                               |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | Warn_1_uwzLevel       | 2                                                                                                                               |      |
| 2022-06-19 20:05:53 | Unwetterzentrale | UWZ  |       | WarnCount             | 2                                                                                                                               |      |


| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | state                 | Warnungen: 1                                                                                                                    |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_Creation       | 1655643862                                                                                                                      |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_End            | 1655730000                                                                                                                      |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_EventID        | 16556437029005                                                                                                                  |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_IconURL        | https://www.unwetterzentrale.de/images/icons/gewitter-gelb.gif                                                                  |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_levelName      | alert_forewarn_orange                                                                                                           |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_LongText       | Ab Sonntagnacht ist mit Gewittern zu rechnen. Aus S▒dwest zieht ein Gewitter auf. Dabei besteht die Gefahr von Starkregen und S |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_Severity       | 7                                                                                                                               |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_ShortText      | Gewitter.                                                                                                                       |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_Start          | 1655683200                                                                                                                      |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_Type           | 7                                                                                                                               |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | Warn_0_uwzLevel       | 2                                                                                                                               |      |
| 2022-06-20 00:05:53 | Unwetterzentrale | UWZ  |       | WarnCount             | 1                                                                                                                               |      |
+---------------------+------------------+------+-------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------+------+
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Juni 2022, 15:15:23
Hallo zusammen,
heute hat es eine sehr schöne korrektur der Prognose vom DWD gegeben.
Die grüne Linie ist fc_0 und das rote ist der Forecast von gestern.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Juni 2022, 09:49:17
Moin,
leider konnte ich bisher aus den Unwetterwarnungen noch keine Trigger für die Prognose ableiten.

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 01 Juli 2022, 09:50:33
Zitat von: ch.eick am 14 Januar 2022, 10:38:50
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

Hallo Christian,

bei muss ich die Quartalsauswertung manuell anstoßen. Ist das so richtig? Oder habe ich irgendwo was überlesen und vergessen ins DOIF zupacken.

VG Alex
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Juli 2022, 10:18:08
Zitat von: majestro84 am 01 Juli 2022, 09:50:33
Hallo Christian,

bei muss ich die Quartalsauswertung manuell anstoßen. Ist das so richtig? Oder habe ich irgendwo was überlesen und vergessen ins DOIF zupacken.

VG Alex
Hallo Alex,
ich habe es auch noch nicht automatisch drin :-) , also einfach manuell oder ansonsten in das PV-Schedule und dann am ersten des neuen Quartals ausführen.
Würdest Du eventuell das DOIF liefern, da ich momentan etwas eingespannt bin ?

Hier ein Beispiel aus meiner PV_Schedule für die Zählerstände vom KSEM, da ich einen Schwarm betreibe.

################################################################################################################
## 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 0)
        {
         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
        }
     }
  }
)


Eventuell wäre eine Darstellung der rollierenden Quartale bei den Statistiken auch ganz nett.
vier Spalten wären ja schon da und man könnte das aktuelle immer ganz rechts platzieren und dann z.B. für jetzt Q3|Q4|Q1|Q2 anzeigen.
Dadurch würde dann jedoch das uitable vom WR_1_API fast doppelt so hoch in der FHEM GUI angezeigt.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 01 Juli 2022, 11:05:09
Ok dann habe ich ja nichts übersehen.
Gucke das ich es die Tage mal ins DOIF packe.

VG Alex
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Juli 2022, 11:06:43
Zitat von: majestro84 am 01 Juli 2022, 11:05:09
Ok dann habe ich ja nichts übersehen.
Gucke das ich es die Tage mal ins DOIF packe.

VG Alex
Lief denn Dein manueller Lauf mit richtigem Ergebnis?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: majestro84 am 01 Juli 2022, 11:11:04
ja das sah ganz gut aus
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 05 Juli 2022, 22:32:59
Also mir ist vollkommen unklar, was mit den Parametern in der WR_1_config gemeint ist und was ich da eintragen sollte...
Ich habe 1 WR, 15 Module alle mit gleicher Neigung und in gleiche Richtung ausgerichtet. Ich hätte jetzt gedacht, ich trage Steilheit und Winkel der Ausrichtung ein und fertig. aber was bedeutet tempk cloudk und raink? Muss ich nur ein Modul mit der Gesamtleistung konfigurieren oder 15? Oder soll ich dann Modul 2-5 löschen? Was sind ist bei faktor und autocorrecetion einzutragen? Usw. ich habe da echt keine Idee....
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Juli 2022, 08:00:25
Zitat von: trupf am 05 Juli 2022, 22:32:59
Also mir ist vollkommen unklar, was mit den Parametern in der WR_1_config gemeint ist und was ich da eintragen sollte...
Ich habe 1 WR, 15 Module alle mit gleicher Neigung und in gleiche Richtung ausgerichtet. Ich hätte jetzt gedacht, ich trage Steilheit und Winkel der Ausrichtung ein und fertig. aber was bedeutet tempk cloudk und raink? Muss ich nur ein Modul mit der Gesamtleistung konfigurieren oder 15? Oder soll ich dann Modul 2-5 löschen? Was sind ist bei faktor und autocorrecetion einzutragen? Usw. ich habe da echt keine Idee....
Moin,
Du verwendest dazu modul_1_* , bei den anderen reicht es *_count auf 0 zu setzen.

Damit es besser aussieht könntest Du ja auch die anderen Werte auf 0 setzen.
Ich glaube jetzt verstehe ich den Gedankengang.
Hier wird mit Modulen gerechnet, die eine gemeinsame Ausrichtung haben. Die 1-5 wären dann die Strings mit unterschiedlicher Ausrichtung.

Hiel ein Beispiel für einen nicht verwendeten String:

module_5_count 0
module_5_direction 0
module_5_name frei
module_5_plain 0
module_5_power 0

Die Modulleistung wird nur für eins eingetragen und dann intern mit der Anzahl multipliziert :-) Somit könntest Du natürlich auch nur eins mit der Gesamtleistung eintragen.

Zum Thema Temperatur sollte bereits ein Default Wert eingetragen sein. Auch für Regen und Wolken sollte es erstmal so passen.
Eine Beschreibung wie man da dann weiter anpassen kann steht im Wiki an dieser Stelle (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Forecast_Basiseinstellung)
Das normale Vorgehen wäre, zuerst die defaults zu verwenden und nur wenn es im Diagramm starke Ungereimtheiten gibt das zu verändern.
Stell nach dem Einrichten mal ein Diagramm hier rein, dann kann man das Verbesserungspotential am besten erkennen. Es sollten die Prognose Werte und die Realität zu erkennen sein.

Die Autokorrektur sollte bitte zuerst auf 0 bleiben, die würde später aus der Datenbank versuchen die Prognose noch zu verbessern, was ich bei mir jedoch momentan gar nicht mehr verwende.

Auch der Faktor wollte zu beginn auf 1 bleiben. Dieser ermöglicht später dann die gesamte Prognoseleistung zu jeder Stunde um den Faktor anzuheben.


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Juli 2022, 16:20:23
Hallo zusammen,
ich bin mal wieder an etwas neuem :-)
Meine openWB hat die Möglichkeit von "70%_beachten", wobei dann eine 70% Basis verwendet wir, um z.B. das Mittagshoch eigenständig zu verwenden.
Das war mir wieder nicht toll genug und würde sich ja auch nicht auf die Leistungsprognose anpassen, wobei es dann passieren kann, dass das Auto gar nicht geladen würde, oder halt viel zu wenig.
Mit dem NurPV laden ist es jedoch so, dass jegliche Überschuss ins Auto geht und es dann abber zuschnell voll ist, wodurch es zu einer 70% Kappung kommen kann, die ich bei mir schon oft gesehen habe.
Nun habe ich mich halt ran gesetzt und mal wieder einiges berechnet. Die Grundlage dabei ist natürlich das Mittagshoch aus der Prognose, was Start- und Stoppzeiten liefert.

2022.07.06 12:08:41.515 3: Kia_eNiro_PV Ladebasis_berechnen : delta_wh       17280        <<< berechnete Leistung anhand der gesetzten SOCs vom Auto, also zwischen 20 und 80 %
2022.07.06 12:08:41.515 3: Kia_eNiro_PV Ladebasis_berechnen : Mittagshoch_h      3        <<< dauer des Mittagshochs
2022.07.06 12:08:41.515 3: Kia_eNiro_PV Ladebasis_berechnen : charge_Power_wh 5760        <<< erforderliche Leistung pro Stunde
2022.07.06 12:08:41.515 3: Kia_eNiro_PV Ladebasis_berechnen : fc_Power_wh    32736        <<< Summe der Leistungsprognose für die Zeit vom Mittagshoch
2022.07.06 12:08:41.516 3: Kia_eNiro_PV Ladebasis_berechnen : 70% Basis       6200        <<< berechneter Wert für die "70%_beachten" Funktion

Wenn man das jetzt in der openWB Konfiguriert würde ab einer Einspeisung von 6200 Watt der Überschuss ins Auto geladen werden. Das bedeutet ab 6200 Watt plus die ein Phasige Mindestleistung.

Damit nun nicht all die anderen Starkverbraucher in der Mittagszeit ein ständiges auf und ab beim E-Auto Laden hervorrufen, habe ich den 70% Wert nochmals dynamisch angepasst.
Der Wert von dynw schwankt somit mit den Starkverbraucher und wird als 70% Basis an die openWB gesendet, was im nächsten Regelzyklus berücksichtigt wird.

2022.07.06 12:35:41.668 3: Kia_eNiro_PV 70 % berechnen : Starkverbraucher 3874.06    <<< Da läuft gerade die LWWP für's WW
2022.07.06 12:35:41.672 3: Kia_eNiro_PV 70 % berechnen : basis 6200 dynw  2300

2022.07.06 13:28:10.474 3: Kia_eNiro_PV 70 % berechnen : Starkverbraucher 980.21     <<< Das ist der Wirlpool
2022.07.06 13:28:10.478 3: Kia_eNiro_PV 70 % berechnen : basis 6200 dynw  5200

2022.07.06 15:21:26.364 3: Kia_eNiro_PV 70 % berechnen : Starkverbraucher 3098.24    <<< Hier überschneidet sich der Pool mit der Waschmaschine
2022.07.06 15:21:26.368 3: Kia_eNiro_PV 70 % berechnen : basis 5200 dynw  2100

2022.07.06 15:32:50.973 3: Kia_eNiro_PV 70 % berechnen : Starkverbraucher 2153       <<< Hier heizt gerade die Waschmaschine
2022.07.06 15:32:50.977 3: Kia_eNiro_PV 70 % berechnen : basis 5200 dynw  3000

Im anhängenden Diagramm kann man nun erkennen, wie sich die Verbraucher aufeinander abstimmen und die WallBox eine gleichmäßige Ladung beibehält.
Das besondere ist hierbei nun, dass die Wallbox nach oben der Leistungskurve des Wechselrichters folgen kann, um die dynamische 70% Regelung zu nutzen. Es kommt zu keiner 70% Kappung an solch einem E-Auto Ladetag. Was man in diesem Diagramm nicht sehen kann ist, dass der Hausspeicher zusätzlich geladen wurde und ebenfalls die dynamische 70% Regelung genutzt hat. Daher rührt auch die ziemlich gerade Oberkannte von 13:30 bis ca 15:00 Uhr. Ohne den Hausspeicher würde die NurPV Ladung des Autos stärker der WR Ladekurve folgen, dann geht es halt auch etwas schneller.

Ein großes Ziel ist es natürlich die Leistung schön gleichmäßig zu verteilen und Mittags ein Peak Shaving zu erreichen, bzw. am Morgen so wenig wie möglich zu verwenden, damit die anderen im Netz auch etwas abbekommen ;-)

VG
     Christian


Rot is LWWP, lila ist BEV, gelb der Pool und hellrot die Waschmaschine
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 06 Juli 2022, 20:49:57
OK und danke Christian, habe ich soweit verstanden und hoffentlich richtig eingetragen.

Grafiken laufen bei mir noch nicht, da muss ich wohl erst noch grafana einrichichten, da habe ich nicht und bin auch nicht sicher ob die Leistung meiner Box dafür reicht...
(ich habe fhem auf der NAS laufen und die hat einen schwachen Prozessor).

Unklar ist mir jetzt noch die Parameter  Einstellungen und Commandos auf WR_1_Speicher_1_ExternControl. Was z.B. sollte bei MinSOC Steuerung eingetragen werden? Und bei SpeicherSteuerung Automatik/Trigger/Zeit? Ich habe nur einen Stromtarif, keinen Zeittarif. Wenn ich es richtig verstehe ist es in dem Fall nicht wichtig, sich die externe Steuerung vom Installateur freigeben zu lasse, oder sollte ich das in jedem Fall tun? Was ich auf jeden Fall erreichen möchte ist, den Speicher dann zu laden wenn die 70%-Kappung einsetzen würde. Eine Wallbox kommt auch noch hinzu (allerdings ein go-e, keine OpenWB)

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Juli 2022, 07:43:55
Zitat von: trupf am 06 Juli 2022, 20:49:57
OK und danke Christian, habe ich soweit verstanden und hoffentlich richtig eingetragen.
Grafiken laufen bei mir noch nicht, da muss ich wohl erst noch grafana einrichichten, da habe ich nicht und bin auch nicht sicher ob die Leistung meiner Box dafür reicht...
(ich habe fhem auf der NAS laufen und die hat einen schwachen Prozessor).
Das kannst Du auch auf einem anderen System laufen lassen, da es nur über das Netzwerk auf die Datenbank zugreift.
Zitat
Unklar ist mir jetzt noch die Parameter  Einstellungen und Commandos auf WR_1_Speicher_1_ExternControl. Was z.B. sollte bei MinSOC Steuerung eingetragen werden?
Zuerst sollte die Prognose richtig laufen. Dort werden quasi Punkte auf der Forecast (fc) Kurfe eingetragen, die dann Schwellwerte für bestimmte Leistungen sind. Das sollte aber auch im Wiki beschrieben sein.
Zitat
Und bei SpeicherSteuerung Automatik/Trigger/Zeit? Ich habe nur einen Stromtarif, keinen Zeittarif.
Am besten verwendest Du erstmal "Automatik". Die Möglichkeit "Zeit" ist eher für die Schweizer unter uns, die Tagsüber einen teureren Tarif haben und in dieser Zeit bevorzugt im Winter den Speicher entladen möchten. Trigger wird so weiß ich weiß garnicht verwendet, es ist ein Abfallprodukt der Zeitsteuerung. Damit kann man sich zusätzlich einen Trigger von einer eigenen Steuerung bauen. Ich denke das nehme ich irgend wann mal raus, da mir kein wirklicher Anwendungsfall einfällt.
Zitat
Wenn ich es richtig verstehe ist es in dem Fall nicht wichtig, sich die externe Steuerung vom Installateur freigeben zu lasse, oder sollte ich das in jedem Fall tun?
Die einfachen Dinge, wie Sommer/Winter Umschaltung des MinSOC oder Smart Laden im Winter gehen auch ohne diese Freischaltung. Für die Lade/Entlade Steuerung im Mittagshoch muss es frei gegeben sein. Generell stört es eh nicht, wenn man nichts zum WR schickt, dann steuert der Plenticore selber (dead man). Sogar die "inteligente Speicher Steuerung" des Plenticores funktioniert mit den Basis Steuerungen. Nur wenn man das Mittagshoch selber kontrollieren möchte, dann braucht man die Freischaltung, oder wenn ein zweiter WR oder ein BHKW im Haus ist, denn dann funktioniert die Kostal Speicher Steuerung nicht mehr, denn der Hausverbrauch wird nicht richtig ermittelt.
Zitat
Was ich auf jeden Fall erreichen möchte ist, den Speicher dann zu laden wenn die 70%-Kappung einsetzen würde.
Das ermöglicht das Mittagshoch, also Speichersteuerung frei schalten und die "inteligente Speicher Steuerung" abschalten. Der Speicher lädt dann im default (dead man) einfach morgens jeden Überschuss, bis man selber irgend etwas anderes vorgibt.
Zitat
Eine Wallbox kommt auch noch hinzu (allerdings ein go-e, keine OpenWB)
Für die go-e gibt es ja schon einen anderen Thread und ich mache jetzt keine weitere Werbung mehr :-)
Mein letzter Post würde dann für Dich wegfallen, bei dem ich die openWB auch für das Mittagshoch verwende.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 11 Juli 2022, 21:40:01
Ich habe jetzt Grafana soweit am Laufen und es auch geschafft DbLogExclude und DbLoginclude soweit zu setzen, dass ich die Danten in der Datenbank bekomme. Die begefügten Bilder sind dann der Verlauf von heute. Unverständlich sind mir vor allem die Peaks um z.B. 7:00 Uhr oder 9:00 Uhr. Wie kann der Eigenverbrauch von der Solaranlage höher sein als die aktuelle Leistung der Solaranlage? Weiterhin auffällig ist das SW_Home_own_consumption_from_PV und SW_Home_own_consumption_from_grid an vielen tllen eine vergleichbare Kurvenform haben, also parrallel steiegen oder fallen - das ergibt für mich auch keinen Sinn.

Wie kann ich den Forecast jetzt weiter optimieren? Ich denke der Ertrag wird tendenziell eher zu niedrig angesetzt...

P.S.: Der Speicher ist noch nicht angeschlossen, kommt die Tage aber noch hinzu.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Juli 2022, 11:59:00
Zitat von: trupf am 11 Juli 2022, 21:40:01

Wie kann ich den Forecast jetzt weiter optimieren? Ich denke der Ertrag wird tendenziell eher zu niedrig angesetzt...

P.S.: Der Speicher ist noch nicht angeschlossen, kommt die Tage aber noch hinzu.
Hast Du den KSEM bereits eingebunden? Der wird für die Berechnungen verwendet.

Den Forecast kann man am besten an Wolken freien Tagen anpassen.
Ja, er ist konservativ gestaltet. Das schauen wir uns später an. Bin unterwegs :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Juli 2022, 12:04:31
Zitat von: trupf am 11 Juli 2022, 21:40:01
Ich habe jetzt Grafana soweit am Laufen und es auch geschafft DbLogExclude und DbLoginclude soweit zu setzen, dass ich die Danten in der Datenbank bekomme. Die begefügten Bilder sind dann der Verlauf von heute. Unverständlich sind mir vor allem die Peaks um z.B. 7:00 Uhr oder 9:00 Uhr. Wie kann der Eigenverbrauch von der Solaranlage höher sein als die aktuelle Leistung der Solaranlage? Weiterhin auffällig ist das SW_Home_own_consumption_from_PV und SW_Home_own_consumption_from_grid an vielen tllen eine vergleichbare Kurvenform haben, also parrallel steiegen oder fallen - das ergibt für mich auch keinen Sinn.
Schau Dir dazu mal die Berechnungen und die zugrunde liegenden Werte an.
Solche Peaks kenne ich nur von der Notladung des Speichers,der ja noch nicht dran ist.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 12 Juli 2022, 14:57:08
Zitat von: ch.eick am 12 Juli 2022, 11:59:00
Hast Du den KSEM bereits eingebunden? Der wird für die Berechnungen verwendet.

Den KSEM hatte ich nicht eingebunden, da im Wiki stand das sei nicht zwingend...kann ich aber noch tun.

..inzwischen ist er  eingebunden, stehat aber auf disabled und verbindet sich auch nicht wenn ich "attr WR_0_KSEM disable 0" setze. Es wird immer "disconnected" angezigt. Nur in dem Moment wo ich das Attribut so setze zeigt er kurz "active" an um dann gleich wieder auf disconnected zu wechseln. Irgendwelche Readings bekomme ich auch nicht.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 12 Juli 2022, 21:33:52
Und ich habe auch einige Schwierigkeiten mit der Authentifizierung von WR_1_API am Umrichter. Prinzipiell klappt es mit dem Masterkey. Dann bekomme ich aber jedes Mal, wenn ich mich als Anlagenbeteiber am Plenticore anmelden will angezeigt, es wäre kein Passwort gesetzt und ich müsse eines vergeben. Das kann ich dann tun und mich anmelden, aber beim nächsten Anmeldeversuch 1h später oder so, hat er das Passwort wieder vergessen. Ich dachte daher, ich könnte mich in WR_1_API auch mit dem vergebenen Passwort authentifizieren, aber das scheint auch nicht zu gehen.

Was genau muss ich denn nun hier ausführen: {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
   {KeyValue("store","PW_WR_1_API_user","<passwort>")}

Ich habe das ober als Erklärung zur Funktion verstanden und nur die untere Funktion mit meinem vergebenen Passwort ausgeführt - wie gesagt, danach klappt die Authentifizierung nicht mehr. Wenn ich den Masterkey als Passwort verwende geht es, aber ich kann mich im Plenticore nur noch umständlich anmelden...

Nachdem ich wieder auf den Masterkey umgestellt habe bekomme ich angezeigt:
httpbody    {"role":"NONE","locked":true,"authenticated":false,"permissions":[],"active":false,"anonymous":true}
Heißt das es gibt einen Fehler oder alles ok?

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Juli 2022, 09:00:55
Zitat von: trupf am 12 Juli 2022, 14:57:08
Den KSEM hatte ich nicht eingebunden, da im Wiki stand das sei nicht zwingend...kann ich aber noch tun.
Zitat
Um die Installation zu vereinheitlichen, da ich später einen zweiten WR bekommen hatte, habe ich alles so umgestellt, dass die Devices für einen oder zwei WR funktionieren. Das geht dann allerdings nur mit dem Verbund des KSEM. Da muss ich wohl nochmal ins Wiki :-)

..inzwischen ist er  eingebunden, stehat aber auf disabled und verbindet sich auch nicht wenn ich "attr WR_0_KSEM disable 0" setze. Es wird immer "disconnected" angezigt. Nur in dem Moment wo ich das Attribut so setze zeigt er kurz "active" an um dann gleich wieder auf disconnected zu wechseln. Irgendwelche Readings bekomme ich auch nicht.
Hast Du da im KSEM den ModBus aktiviert?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Juli 2022, 09:29:44
Zitat von: trupf am 12 Juli 2022, 21:33:52
Und ich habe auch einige Schwierigkeiten mit der Authentifizierung von WR_1_API am Umrichter.

Zitat
Nachdem ich wieder auf den Masterkey umgestellt habe bekomme ich angezeigt:
httpbody    {"role":"NONE","locked":true,"authenticated":false,"permissions":[],"active":false,"anonymous":true}
Heißt das es gibt einen Fehler oder alles ok?
Das bedeutet, dass Du noch nicht angemeldet bist und der Zugang wurde gesperrt (locked). Dies kann passieren, wenn es zuviele Fehlversuche gegeben hat.

Zitat
Prinzipiell klappt es mit dem Masterkey. Dann bekomme ich aber jedes Mal, wenn ich mich als Anlagenbeteiber am Plenticore anmelden will angezeigt, es wäre kein Passwort gesetzt und ich müsse eines vergeben. Das kann ich dann tun und mich anmelden, aber beim nächsten Anmeldeversuch 1h später oder so, hat er das Passwort wieder vergessen. Ich dachte daher, ich könnte mich in WR_1_API auch mit dem vergebenen Passwort authentifizieren, aber das scheint auch nicht zu gehen.

Was genau muss ich denn nun hier ausführen: {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
   {KeyValue("store","PW_WR_1_API_user","<passwort>")}

Ich habe das ober als Erklärung zur Funktion verstanden und nur die untere Funktion mit meinem vergebenen Passwort ausgeführt - wie gesagt, danach klappt die Authentifizierung nicht mehr. Wenn ich den Masterkey als Passwort verwende geht es, aber ich kann mich im Plenticore nur noch umständlich anmelden...
Wenn Du Dich am Plenticore anmeldest und ein Passwort setzen sollst, dann habe ich bei mir das Passwort gleich dem Key, der auf dem Aufkleber steht, gesetzt. Mir ist da auch noch nicht so klar, wo der Unterschied zwischen dem Betreiber Key und dem Betreiber Passwort ist. Dadurch, dass ich es gleich gesetzt habe bin ich aus dem Problem raus :-)

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 14 Juli 2022, 19:41:49
Also Passwort gleich mit dem Key geht und nach Aktivierung des Modbus im KSEM geht das auch.

Hier jetzt die aktuellen Grafiken. Unklar ist mir noch, was ich tun muss, damit die Ladesteuerung des Speichers funktioniert, wie ich es will (also z.B. nicht gleich morgens losladen, Begrenzung auf max SOC 90%...)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Juli 2022, 10:30:03
Zitat von: trupf am 14 Juli 2022, 19:41:49
Also Passwort gleich mit dem Key geht und nach Aktivierung des Modbus im KSEM geht das auch.

Hier jetzt die aktuellen Grafiken. Unklar ist mir noch, was ich tun muss, damit die Ladesteuerung des Speichers funktioniert, wie ich es will (also z.B. nicht gleich morgens losladen, Begrenzung auf max SOC 90%...)
Hallo,
zuerst mal Gratulation für das bisherige Ergebnis :-)

Beim Device WR_1_Speicher_1_ExternControl habe ich noch eine kleine uiTable Verbesserung bezüglich der MinSOC Darstellung.
Dafür könntest Du im uiTable diesen Teil für die Tabelle austauschen. Die Funktionen im oberen Teil bleiben identisch.

Dadurch ändert sich einfach nur die Darstellung für den morgens gefundenen MinSOC auf "06:11 15 %" , denn mir hat immer die
Uhrzeit gefehlt und eine Veränderung ist dort nicht sinnvoll. Das Verändern brauchte ich nur zu test zwecken.

#########################################################
## "Spalte 0"|"Spalte 1"|"Spalte 2"|"Spalte 3"|"Spalte 4"|"Spalte 5"

"$SELF"|"Kommando<dd>Auswahl / DcPowerAbs / Status</dd>" | widget([$SELF:ui_command_1],"uzsuDropDown,---,Status_Speicher,smart_Laden_start,smart_Laden_beenden,smart_Laden_starten_WB_1,smart_Laden_beenden_WB_1,Kommando_Wiederholung,SOC_Calculation,Reset,DC_Power_Abs,Sommer,Winter,Speicher_voll,14_Luefter_ein,15_Luefter_aus,Status_WR_1_Speicher_1_BYD") | widget([$SELF:SpeicherDcPowerAbs],"selectnumbers,-4500,250,4500,0,lin")."W" |[WR_1_API:Battery_EM_State]|([$SELF:SpeicherExternTrigger] eq "gesperrt" and [WR_1_API:Battery_InternControl_MinHomeConsumption] == 30000)?'<span style="color:red">smart_Laden aktiv</span>':""

|"Speicher<dd>Steuerung</dd>" | widget([$SELF:SpeicherEntladung],"uzsuDropDown,Automatik,Trigger,Zeit") |"WB_1 Laden ".widget([$SELF:SpeicherWB_1_buffer],"uzsuToggle,Aus,An")|
FUNC_Status([WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],-10,"green","Laden","orange","Standby",15,"red","Entladen").FUNC_Status([WR_1:Act_state_of_charge],15,"red","Speicher SOC","orange","Speicher SOC",49,"green","Speicher SOC")|

FUNC_Status([WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],-10,"green",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],"orange",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],15,"red",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P])." W"."<div style='border-width:2px;border-style:solid;border-color:gray;position:relative;width:90px;height:20px;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);'>".STY(" ",FUNC_batt([WR_1:Act_state_of_charge])).STY(::round([WR_1:Act_state_of_charge],0)."%","font-size:16px;position:absolute;top:2px;left:30px")."</div>"


|"Trigger<dd>Status / ExternTrigger / Start / Ende</dd>" | widget([$SELF:SpeicherTrigger],"uzsuDropDown,entladen,gesperrt,none") | widget([$SELF:SpeicherExternTrigger],"uzsuDropDown,frei,gesperrt,none") | widget([$SELF:SpeicherZeitStart],"time") | widget([$SELF:SpeicherZeitEnde],"time")

|"Kommando Wiederholung<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherCmdRepeatActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherCmdRepeatRunning],"uzsuToggle,Aus,An") |""|""

|"MaxSOC Kontrolle<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherMaxSOCControlActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherMaxSOCControlRunning],"uzsuToggle,Aus,An") |""|""

|"MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / geplant</dd>" |
FUNC_Status([WR_1:Solar_Calculation_fc1_day],[$SELF:SpeicherMaxSOC_fc1_Limit],"red","<",0,0,([$SELF:SpeicherMaxSOC_fc1_Limit]-1),"green",">="). widget([$SELF:SpeicherMaxSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin") | ([$SELF:SpeicherMaxSOC_MinSOC_Time] eq "gefunden")?(POSIX::strftime("%H:%M",::localtime(::time_str2num(::ReadingsTimestamp("$SELF","SpeicherMaxSOC_MinSOC_MinSOC",""))))." ".[$SELF:SpeicherMaxSOC_MinSOC_MinSOC]." %"):"wartet" |
"<div style='border-width:2px;border-style:solid;border-color:gray;position:relative;width:90px;height:20px;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);'>".STY(" ",FUNC_batt([$SELF:SpeicherMaxSOC_DayBefore])).STY("gestern","font-size:12px;position:absolute;top:3px;left:25px")."</div>".widget([$SELF:SpeicherMaxSOC_DayBefore],"selectnumbers,5,1,100,0,lin")."%" |
"<div style='border-width:2px;border-style:solid;border-color:gray;position:relative;width:90px;height:20px;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);'>".STY(" ",FUNC_batt([$SELF:SpeicherMaxSOC_Actual])).STY("geplant","font-size:12px;position:absolute;top:3px;left:25px")."</div>".widget([$SELF:SpeicherMaxSOC_Actual],"selectnumbers,5,1,100,0,lin")."%"

|"Mittags Kontrolle<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherMiddayControlActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherMiddayControlRunning],"uzsuToggle,Aus,An")|""|""

|"Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br>MaxSOC morgens / Power morgens / Power mittags</dd>" | widget([$SELF:SpeicherMidday_Inverter_Max_Power],"selectnumbers,1000,250,15000,0,lin")."W<br>".widget([$SELF:SpeicherMidday_MaxSOC],"selectnumbers,5,1,100,0,lin")."%" | widget([$SELF:SpeicherMidday_NotBefore],"time").widget([$SELF:SpeicherMidday_MaxChargePowerAbs_morning],"selectnumbers,0,50,1000,0,lin")."W" | widget([WR_1:Solar_middayhigh_fc0_start],"time").widget([$SELF:SpeicherMidday_MaxChargePowerAbs_midday],"selectnumbers,0,100,4700,0,lin")."W" | widget([WR_1:Solar_middayhigh_fc0_stop],"time").([$SELF:SpeicherMidday_MaxChargePowerAbs_midday] == 0)?"dynamisch":""

|"MinSOC Steuerung<dd>fc1_Limit / Winter | Sommer /aktuell</dd>"|
FUNC_Status([WR_1:Solar_Calculation_fc1_day],[$SELF:SpeicherMinSOC_fc1_Limit],"red","<",0,0,([$SELF:SpeicherMinSOC_fc1_Limit]-1),"green",">=").widget([$SELF:SpeicherMinSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin")."wh" |
widget([$SELF:SpeicherMinSOC_Winter],"selectnumbers,10,1,30,0,lin").widget([$SELF:SpeicherMinSOC_Sommer],"selectnumbers,5,1,10,0,lin")."%" |""|[WR_1_API:Battery_InternControl_MinSoc]." %"


Nun zur Einstellung, die hier unter Batteriesteuerung_Möglichkeiten (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Batteriesteuerung_M.C3.B6glichkeiten) beschrieben wird.
Hierbei ist die Leistung Deiner Anlage und die größe des Speichers, sowie die Verbrauchssituation in Deinem Haus wichtig, da dadurch die Ladezeiten beeinflusst werden.

Im WR_1_config bitte zuerst mal mit
   forecast_factor 1
   forecast_factor_autocorrection 0
beginnen und einen neuen "PV_Schedule Forecast_0 cmd_2" erstellen. Danach kann man sehen, ob der Forecast grundsätzlich gut zu Deiner PV-Anlage passt.
Liegt das Progneseergebnis für den ganzen Tag stark unter der Realität, dann beginnt man den forecast_factor zu erhöhen, wodurch das Ergebnis jeder
einzelnen Stunde erhöht (oder auch gesenkt) wird.


MinSOC Steuerung
- Kostal empfielt einen MinSOC von 20 im Winter
- Das fc_1_Limit ist der Schwellwert, bei dem der Speicher über den Tag gesehen im Winter noch geladen werden kann. Also darunter wäre dann Winter, bzw schlechtes Wetter
   und der MinSOC wird auf 20% angehoben, damit es zu keiner Notladung in der Nacht kommt.

Mittags Limits
   Hierfür betrachtest Du Deine Forecast Kurve, am besten an einem Wolkenfreien Tag, damit nicht solche Schwankungen wie in Deinem Diagramm entstehen.
   Beim Mittagshoch geht es darum den Hügel des Forecast in der Mittagszeit zu definieren.

- Inverter_Max_Power ist der Schnittpunkt der WR Leistung mit der Forecast Kurve. Dort beginnt dann für Dich die Mittagszeit.
   Im WR_1 Device habe ich z.B. folgende Werte. Mein Inverter_Max_Power steht dann auf 8500 , wodurch fc0_11 der erste Wert ist, der darüber liegt.
     Solar_Calculation_fc0_10 7747
     Solar_Calculation_fc0_11 9463
   Somit wird nun 11:00 Uhr als start für das Mittagshoch genommen.

- MaxSOC morgens
   Dies ist der MaxSOC, der bis zum beginn des Mittagshochs erreicht werden darf. Der sollte so niedrig liegen, dass mittags noch genügend Platz im Speicher ist.
- Power morgens
   Sorgt für ein langsameres Laden bis zum "MaxSOC morgens"
- Laden nicht vor
   Diese Uhrzeit (bei Dir 11:00 Uhr) verschiebt den Ladebeginn etwas nach hinten, damit früh morgens noch etwas Leistung für die Nachbarn übrig bleibt :-)
   Die Zeit sollte auf jeden Fall nicht zu nah am Mittagshoch sein, damit man den "MaxSOC morgens" auch noch erreichen kann.

- Start / Stop vom Mittagshoch werden durch Inverter_Max_Power bestimmt und dann durch die Solar_forecast() Funktion jede Stunde neu berechnet und falls
   man mal etwas getestet hat überschrieben ! Die Werte kommen aus dem Device WR_1.
     Solar_middayhigh_fc0_start 12:00
     Solar_middayhigh_fc0_stop 16:00

- Power mittags
   kann eine Ladeleistung für die Mittagszeit fest vorgeben. Steht das auf 0 wird die Ladeleistung dynamisch berechnet.

- MaxSOC Limit
  Dieser Leistungswert gibt an, ab welcher Prognose Leistung das Limitieren des MaxSOC angewendet werden soll. Das Limitieren macht natürlich nur Sinn, wenn
  Dein Speicher im Sommer in der Nacht nicht leer wir, bei Dir sehe ich einen Wert von 37%, wodurch man das durchaus verwenden könnte.
  Auch diesen Wert musst Du etwas im Frühjahr und Herbst näher beobachten. Schau dafür im WR_1 Device den angezeigten Prognose Wert für den Tag an.
  Falls Du eine Wärmepumpe hast, sollte ab dem ersten Heizstart keine MaxSOC Limitierung mehr erfolgen.

Für mehr details brauche ich die Solar_middayhigh_* readings aus dem WR_1 Device.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 15 Juli 2022, 22:11:56
Ich habe mir das alles doch deutlich einfacher vorgestellt....

Also nach der Änderung im PV-Schedule hatte ich einige Fehlermeldungen in FHEM und nachdem ich jetzt die fehlenden "\" und die Doppel";" wieder ergänzt habe bekomme ich keine Fehlermeldung mehr aber die letzte Spalte fehlt zum Teil (siehe Bild)

Zitat von: ch.eick am 15 Juli 2022, 10:30:03
Nun zur Einstellung, die hier unter Batteriesteuerung_Möglichkeiten (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Batteriesteuerung_M.C3.B6glichkeiten) beschrieben wird.

Sorry, aber von dem Teil hatte ich nicht viel verstanden.

forecast_factor und ...autocorrection sind jetzt so gesetzt.

Woran erkenne ich jetzt ob der Ertrag des heutigen Tages gepasst hätte? Prognose sagt 27kWh, Ertrag 37kWh (wobei in mysql ist Solar_Calculation_fc0_day jetzt nach der Neukalkulation bei 30111...heißt das 30,1 kWh?) Demnach setzte ich also den Faktor auf etwas 1,23?

Ich glaube die meisten Einstellungen verstehe ich jetzt. Danke für die Hilfe. Wenn ich weitere benötige melde ich mich noch mal.

Die Anzeige des WR_1_Speicher_1_ExternControl ist jetzt auch wieder komplett - weiß nicht was der Fehler hier war...
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 16 Juli 2022, 05:16:43
Hallo zusammen,

ich hatte heute Nacht einen Ausfall des FHEM Servers und jetzt passen meine Werte für den aktuelle Monat nicht mehr.

Es stehen dort falsche Werte so, dass die Berechnung des Eigenverbrauchs und der Autarkie komplett falsch sind für den Monat.
Wie kann ich das am einfachsten wieder beheben, kann ich die Monatswerte irgendwie vom KSEM oder so einlesen oder muss ich da mehr anpassen?

Erzeugung PV-Total 0859 / 2127
Bezug von PV -1694 / 1336
Bezug ins Haus (Energieverbrauch) -1693 / 2551
Bezug vom Netz 0000 / 1215
Einspeisung ins Netz 2553 / 0791
Autarkiequote 100 %
Eigenverbrauchsquote -197 %
Berechnet um 05:14 / 31.03


Wie kann ich verhindern, dass bei einem Ausfall die Werte sicher wieder korrekt eingelesen werden können?

Gruß
Kaiman
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 16 Juli 2022, 08:32:43
So ich muss mich noch mal melden. Die Werte habe ich zwar jetzt angepaßt, aber irgendwie scheint das den Wechselrichter nicht zu interessieren, er lädt immer schön fleißig den Speicher mit max. mögl. Solarpower, ohne auf die Begrenzung SpeicherMidday_MaxCharge_PowerAbs_Morning (bei mir 400W) zu achten. Ich hatte dem Solarinstallateur gesagt, er soll die extrne Steuerung freischalten - aber irgendwas passt da noch nicht. Wie kann ich testen, ob die externe Ansteuerung funktioniert? Oder was genau muss beim Kostal noch eingestellt werden?

Weiterhin wird der aktuelle MicSoc mit 10% angezeigt, obwohl ich für den Sommer 7% eingestellt habe. Und der Forecast zeit mir 29kWh für den Tag an, obwohl in der Dantenbank 32 eingetragen sind:
MariaDB [fhem]> select * from history where reading like '%Calculation_fc0%';
.....
| 2022-07-16 06:52:11 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_07: 222     | Solar_Calculation_fc0_07   | 222   |      |
| 2022-07-16 06:52:11 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_08: 1789    | Solar_Calculation_fc0_08   | 1789  |      |
| 2022-07-16 06:52:11 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_09: 2847    | Solar_Calculation_fc0_09   | 2847  |      |
| 2022-07-16 06:52:11 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_10: 3542    | Solar_Calculation_fc0_10   | 3542  |      |
| 2022-07-16 06:52:11 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_11: 3952    | Solar_Calculation_fc0_11   | 3952  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_12: 3865    | Solar_Calculation_fc0_12   | 3865  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_13: 3782    | Solar_Calculation_fc0_13   | 3782  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_14: 3459    | Solar_Calculation_fc0_14   | 3459  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_15: 3040    | Solar_Calculation_fc0_15   | 3040  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_16: 2498    | Solar_Calculation_fc0_16   | 2498  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_17: 2051    | Solar_Calculation_fc0_17   | 2051  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_18: 929     | Solar_Calculation_fc0_18   | 929   |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_19: 119     | Solar_Calculation_fc0_19   | 119   |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_4h: 4858    | Solar_Calculation_fc0_4h   | 4858  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_rest: 32095 | Solar_Calculation_fc0_rest | 32095 |      |
| 2022-07-16 06:52:13 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_day: 32095  | Solar_Calculation_fc0_day  | 32095 |      |
| 2022-07-16 07:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_4h: 8400    | Solar_Calculation_fc0_4h   | 8400  |      |
| 2022-07-16 08:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_4h: 12130   | Solar_Calculation_fc0_4h   | 12130 |      |
| 2022-07-16 08:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_rest: 31873 | Solar_Calculation_fc0_rest | 31873 |      |
+---------------------+--------+------------+-----------------------------------+----------------------------+-------+------+


Die Kommandos vom PV_Schedule (cmd_1 | cmd_2 | cmd_3 | cmd_4 ) scheinen auch keine Neuberechnung des Forecast auszulösen, jedenfalls kommen keine neuen Werte in mysql an und auch sonst sehe ich keinerlei Auswirkung. Irgendwie scheinen die ganzen Einstellungen den WR nicht wirklich zu interessieren....

Die Einstellungen im Kostal sehen für mich aber korrekt aus.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Juli 2022, 09:21:28
Zitat von: kaiman am 16 Juli 2022, 05:16:43
Hallo zusammen,

ich hatte heute Nacht einen Ausfall des FHEM Servers und jetzt passen meine Werte für den aktuelle Monat nicht mehr.

Es stehen dort falsche Werte so, dass die Berechnung des Eigenverbrauchs und der Autarkie komplett falsch sind für den Monat.
Wie kann ich das am einfachsten wieder beheben, kann ich die Monatswerte irgendwie vom KSEM oder so einlesen oder muss ich da mehr anpassen?

< snip >

Wie kann ich verhindern, dass bei einem Ausfall die Werte sicher wieder korrekt eingelesen werden können?
Hallo Kaiman,
das ist ja ein Zufall, bei ist FHEM heute auch hängen geblieben :-(

Die falschen Werte kommen warscheinlich aus den zuletzt gespeicherten SW_Meter_init_* Werten im WR_1_API Device.
Dafür check bitte in der Datenbank die korrekten init Werte

mysql> select * from history where DEVICE='WR_1_API' and READING like 'SW_Meter_init%Month' and TIMESTAMP>'2022-01-01 00:00:00' order by TIMESTAMP desc limit 2;
+---------------------+----------+---------+-------+--------------------------------+-------+------+
| TIMESTAMP           | DEVICE   | TYPE    | EVENT | READING                        | VALUE | UNIT |
+---------------------+----------+---------+-------+--------------------------------+-------+------+
| 2022-07-01 00:01:00 | WR_1_API | HTTPMOD |       | SW_Meter_init_Grid_Month       | 7458  |      |
| 2022-07-01 00:01:00 | WR_1_API | HTTPMOD |       | SW_Meter_init_FeedInGrid_Month | 23418 |      |
+---------------------+----------+---------+-------+--------------------------------+-------+------+
2 rows in set (7.60 sec)

mysql> select * from history where DEVICE='WR_1_API' and READING like 'SW_Meter_init%Day' and TIMESTAMP>'2022-01-01 00:00:00' order by TIMESTAMP desc limit 2;
+---------------------+----------+---------+-------+------------------------------+-------+------+
| TIMESTAMP           | DEVICE   | TYPE    | EVENT | READING                      | VALUE | UNIT |
+---------------------+----------+---------+-------+------------------------------+-------+------+
| 2022-07-16 08:56:52 | WR_1_API | HTTPMOD |       | SW_Meter_init_Grid_Day       | 7464  |      |
| 2022-07-16 08:53:01 | WR_1_API | HTTPMOD |       | SW_Meter_init_FeedInGrid_Day | 24404 |      |
+---------------------+----------+---------+-------+------------------------------+-------+------+
2 rows in set (0.02 sec)

Sollten die von denen im WR_1_API Device abweichen müsstest Du sie dann einfach überschreiben

setreading WR_1_API SW_Meter_init_Grid_Day 7464
setreading WR_1_API SW_Meter_init_Grid_Day 24404

Das Problem liegt daran, dass im FHEM Device die readings Werte vom letzten "Save Config" wieder hergestellt werden.
Ich könnte eventuell ein MySQL schreiben, dass die Werte dann "manuell" aus der Datenbank wieder herstellt. Da es jedoch nach 3 Jahren das erste mal bei mir zu einem Absturz gekommen ist habe ich mir da noch keine Gedanken zu gemacht.

VG
   Christian



Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Juli 2022, 10:09:10
Zitat von: trupf am 16 Juli 2022, 08:32:43
So ich muss mich noch mal melden. Die Werte habe ich zwar jetzt angepaßt, aber irgendwie scheint das den Wechselrichter nicht zu interessieren, er lädt immer schön fleißig den Speicher mit max. mögl. Solarpower, ohne auf die Begrenzung SpeicherMidday_MaxCharge_PowerAbs_Morning (bei mir 400W) zu achten. Ich hatte dem Solarinstallateur gesagt, er soll die extrne Steuerung freischalten - aber irgendwas passt da noch nicht. Wie kann ich testen, ob die externe Ansteuerung funktioniert? Oder was genau muss beim Kostal noch eingestellt werden?
- Im Plenticore müsstest Du noch die "inteligente Speicher Steuerung (Activate smart battery control)" deaktivieren.
- Wenn Du den MinSOC veränderst musst Du den DOIF Block für die Umschaltung auch manuell ausführen, dies geschieht ansonsten erst wenn es einen Wetter Wechsel gibt.
  Im Bild siehst Du das Pull Down Menü mit Sommer/Winter , da kannst Du es manuell umschalten und solltest es sofort im Wechselrichter sehen.
- Die MaxSOC Limitierung ist Teil der Mittagshoch Steuerung und nur wirksam, wenn es auch ein Mittagshoch gibt. Bei Dir steht überall 00:00 als Zeit.
  Wenn es kein Mittagshoch gibt, wird der Speicher morgens schon voll geladen, damit er tagsüber bereits unterstützen kann. Dann ist es oft auch bewölkt oder Regen zieht auf.
- Bei Deinem Solar_Calculation_fc0_11 Wert von 3952 würde ich Inverter_Max_Power auf 3600 stellen. Daraus sollte sich dann ein Mittagshoch von 11-13 Uhr ergeben.
  Das "Laden nicht vor" lass erst mal bei 09:00 Uhr

Zitat
Weiterhin wird der aktuelle MicSoc mit 10% angezeigt, obwohl ich für den Sommer 7% eingestellt habe. Und der Forecast zeigt mir 29kWh für den Tag an, obwohl in der Dantenbank 32 eingetragen sind:
Da der Forecast regelmäßig aktualisiert wird kann das an leicht geänderten Daten vom DWD liegen. Deine Daten sind von unterschiedlichen Zeiten.

| 2022-07-16 06:52:13 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_day: 32095  | Solar_Calculation_fc0_day  | 32095 |      |

Der Screenshot ist von 08:28

Im PV-Schedule wird Solar_forecast() jede Stunde aktualisiert
>>> DOELSEIF
>>> ([05:00-21:00] and [:00])


Zitat

MariaDB [fhem]> select * from history where reading like '%Calculation_fc0%';
< snip >
| 2022-07-16 06:52:11 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_09: 2847    | Solar_Calculation_fc0_09   | 2847  |      |
| 2022-07-16 06:52:11 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_10: 3542    | Solar_Calculation_fc0_10   | 3542  |      |       <<<< bei 3500 wäre diese Stunde auch noch mit drin
| 2022-07-16 06:52:11 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_11: 3952    | Solar_Calculation_fc0_11   | 3952  |      |  <<<<<< ist größer als 3600
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_12: 3865    | Solar_Calculation_fc0_12   | 3865  |      |
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_13: 3782    | Solar_Calculation_fc0_13   | 3782  |      |  <<<<<< ist immernoch größer als 3600
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_14: 3459    | Solar_Calculation_fc0_14   | 3459  |      |       <<<< diese Stunde wäre bei 3500 nicht mehr drin
| 2022-07-16 06:52:12 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_15: 3040    | Solar_Calculation_fc0_15   | 3040  |      |
< snip >
+---------------------+--------+------------+-----------------------------------+----------------------------+-------+------+


Die Kommandos vom PV_Schedule (cmd_1 | cmd_2 | cmd_3 | cmd_4 ) scheinen auch keine Neuberechnung des Forecast auszulösen, jedenfalls kommen keine neuen Werte in mysql an und auch sonst sehe ich keinerlei Auswirkung. Irgendwie scheinen die ganzen Einstellungen den WR nicht wirklich zu interessieren....
Für den Forecast habe ich entschieden nur immer den aktuellstedn in der Datenbank zu lassen. Somit wird der alte an diesem Tag gelöscht und der neue eingetragen. Im Diagramm kann man manchmal erkennen, dass die Kurve mal kurz weg ist und dann wieder erscheint, was am DbLog cache liegt.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 16 Juli 2022, 13:44:22
Zitat von: ch.eick am 16 Juli 2022, 10:09:10
Wenn Du den MinSOC veränderst musst Du den DOIF Block für die Umschaltung auch manuell ausführen, dies geschieht ansonsten erst wenn es einen Wetter Wechsel gibt.
  Im Bild siehst Du das Pull Down Menü mit Sommer/Winter , da kannst Du es manuell umschalten und solltest es sofort im Wechselrichter sehen.

Diese Pulldown-Menü finde ich bei mir nicht - wo genau soll das erscheinen?

Weiterhin fällt mir auf, dass bei mir in der 1. Zeile "WR_1_Speicher_1_ExternControl | ???" steht, bei Dir steht dort "WR_1_Speicher_1_ExternControl | initilized". Ist da nicht noch was falsch? Bei WR_1_config steht auch nur "???" im Status.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Juli 2022, 13:57:38
Zitat von: trupf am 16 Juli 2022, 13:44:22
Diese Pulldown-Menü finde ich bei mir nicht - wo genau soll das erscheinen?

Weiterhin fällt mir auf, dass bei mir in der 1. Zeile "WR_1_Speicher_1_ExternControl | ???" steht, bei Dir steht dort "WR_1_Speicher_1_ExternControl | initilized". Ist da nicht noch was falsch? Bei WR_1_config steht auch nur "???" im Status.
In der Zeile "Kommando|Auswahl" wird ein Pull Down Menü mit "---" dargestellt. Klapp das mal auf.

Schau mal, ob das Device eventuell auf disable 1 steht ???
Spätestens, wenn Du mal kurz ein disable/enable machst, dann sollte es auch initialized stehen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 16 Juli 2022, 15:50:08
OK, jetzt hab ich es. Und was ist bei SpeicherDCPowerAbs einzutragen? Dort gibt es positive und negative Werte, aber mein Speicher heit eine höhere Kapazität, nämlich 5120 - das kann ich aber nicht auswählen...

Grüße,
Tobias
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Juli 2022, 18:04:47
Zitat von: trupf am 16 Juli 2022, 15:50:08
OK, jetzt hab ich es. Und was ist bei SpeicherDCPowerAbs einzutragen? Dort gibt es positive und negative Werte, aber mein Speicher heit eine höhere Kapazität, nämlich 5120 - das kann ich aber nicht auswählen...

Grüße,
Tobias
Hallo Tobias,
Du kannst mir ja nochmal ein Diagramm schicken, wenn Du nicht soviel getestet hast, dann justieren wir noch etwas nach, wenn es notwendig sein sollte.

Das SpeicherDCPowerAbs ist ein featcher, um den Speicher zwangs zu laden/entladen und gibt die DC Leistung an. Das steht immer auf Null !
Positive Werte entladen den Speicher und negative würden ihn laden. Dann muss der passende Befehl über das Komando Menü noch manuell, regelmäßig ausgelöst werden.
Das wäre denkbar, wenn man einen bestimmten SOC zwangsweise erreichen möchte, oder für Wartungszwecke am Speicher. Bei falsche Bedienung könnte man damit auch
sinnloser Weise ins Netz einspeisen, oder auch aus dem Netz laden ;-) In der Schweiz wäre das aber verboten! Aber man weiß ja nicht, wie sich die Tarife entwickeln und
ich bin gerne Vorbereitet. Bei einem Tarif nach der Strombörse wäre dann ein Laden in der Nacht denkbar, was jedoch dann wiederum noch gesteuert werden müsste.

Für aWATTar habe ich noch ein Device, was mir einen Trigger liefert, aber die Preise sind für mich, bei den hohen Grundkosten in keinster Weise verwendbar.

Übrigens könntest Du noch im Plenticore die "Time of ext. battery control" auf z.B. 300 setzen. Dadurch erscheinen dann auch im Log die Meldungen in einem etwas
verlangsamten Zyklus. Nach meiner Erfahrung reicht diese höhere Zeit vollkommen aus.
Mit dem WR_1_API Device sollte das auch mit einem Set Befehl funktionieren.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 16 Juli 2022, 19:00:08
Zitat von: ch.eick am 16 Juli 2022, 18:04:47
Übrigens könntest Du noch im Plenticore die "Time of ext. battery control" auf z.B. 300 setzen. Dadurch erscheinen dann auch im Log die Meldungen in einem etwas
verlangsamten Zyklus. Nach meiner Erfahrung reicht diese höhere Zeit vollkommen aus.
Mit dem WR_1_API Device sollte das auch mit einem Set Befehl funktionieren.

Das geht nicht, er lässt nur Werte zwischen 1 und 60 zu (ja ich weiß da steht aktuell 180....)

Gruß,
Tobias
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 16 Juli 2022, 20:32:57
Hi Chris

Danke für die Info.
Ich komm heute nicht mehr dazu die Änderung durchzuführen.  Wenn ich das einen oder zwei Tage später mache, muss ich etwas beachten oder soll ich den Init wert dann einfach für den Tag setzen, wenn ich es anpasse?

Stehe gerade etwas auf der Leitung.

Gruß
Kaiman

Zitat von: ch.eick am 16 Juli 2022, 09:21:28
Hallo Kaiman,
das ist ja ein Zufall, bei ist FHEM heute auch hängen geblieben :-(

Die falschen Werte kommen warscheinlich aus den zuletzt gespeicherten SW_Meter_init_* Werten im WR_1_API Device.
Dafür check bitte in der Datenbank die korrekten init Werte

mysql> select * from history where DEVICE='WR_1_API' and READING like 'SW_Meter_init%Month' and TIMESTAMP>'2022-01-01 00:00:00' order by TIMESTAMP desc limit 2;
+---------------------+----------+---------+-------+--------------------------------+-------+------+
| TIMESTAMP           | DEVICE   | TYPE    | EVENT | READING                        | VALUE | UNIT |
+---------------------+----------+---------+-------+--------------------------------+-------+------+
| 2022-07-01 00:01:00 | WR_1_API | HTTPMOD |       | SW_Meter_init_Grid_Month       | 7458  |      |
| 2022-07-01 00:01:00 | WR_1_API | HTTPMOD |       | SW_Meter_init_FeedInGrid_Month | 23418 |      |
+---------------------+----------+---------+-------+--------------------------------+-------+------+
2 rows in set (7.60 sec)

mysql> select * from history where DEVICE='WR_1_API' and READING like 'SW_Meter_init%Day' and TIMESTAMP>'2022-01-01 00:00:00' order by TIMESTAMP desc limit 2;
+---------------------+----------+---------+-------+------------------------------+-------+------+
| TIMESTAMP           | DEVICE   | TYPE    | EVENT | READING                      | VALUE | UNIT |
+---------------------+----------+---------+-------+------------------------------+-------+------+
| 2022-07-16 08:56:52 | WR_1_API | HTTPMOD |       | SW_Meter_init_Grid_Day       | 7464  |      |
| 2022-07-16 08:53:01 | WR_1_API | HTTPMOD |       | SW_Meter_init_FeedInGrid_Day | 24404 |      |
+---------------------+----------+---------+-------+------------------------------+-------+------+
2 rows in set (0.02 sec)

Sollten die von denen im WR_1_API Device abweichen müsstest Du sie dann einfach überschreiben

setreading WR_1_API SW_Meter_init_Grid_Day 7464
setreading WR_1_API SW_Meter_init_Grid_Day 24404

Das Problem liegt daran, dass im FHEM Device die readings Werte vom letzten "Save Config" wieder hergestellt werden.
Ich könnte eventuell ein MySQL schreiben, dass die Werte dann "manuell" aus der Datenbank wieder herstellt. Da es jedoch nach 3 Jahren das erste mal bei mir zu einem Absturz gekommen ist habe ich mir da noch keine Gedanken zu gemacht.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 17 Juli 2022, 08:11:29
Heute morgen hat er wieder mit voller Leistung den Speicher geladen - ich bin dann auf MaxSOC 50% gegangen, damit hat das Laden aufgehört und dann habe ich die MaxSOC -Kontrolle noch auf "läuft" gestellt (war aktiviert, aber warum lief sie dan nicht??), danach wieder auf MaxSOc 100% und jetzt schein er erst mal nicht zu laden. Warum aber lädt er morgens schon mit voller Leistung wenn das steht nicht von 8:30 Uhr und dann nur mit 200W? Und Warum wir mir in mysql Solar_Calculation_fc0_day: 41656 angezeigt, aber in der Prognose für den Tag in FHEM nur 38kWh? Die Differenz würde ich gern verstehen, was passiert mit den übrigen 3 kWh?

| 2022-07-17 05:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_07: 245     | Solar_Calculation_fc0_07   | 245   |      |
| 2022-07-17 05:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_08: 2060    | Solar_Calculation_fc0_08   | 2060  |      |
| 2022-07-17 05:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_09: 3308    | Solar_Calculation_fc0_09   | 3308  |      |
| 2022-07-17 05:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0: 1           | Solar_middayhigh_fc0       | 1     |      |
| 2022-07-17 05:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_10: 4317    | Solar_Calculation_fc0_10   | 4317  |      |
| 2022-07-17 05:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_11: 4926    | Solar_Calculation_fc0_11   | 4926  |      |
| 2022-07-17 05:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_12: 5170    | Solar_Calculation_fc0_12   | 5170  |      |
| 2022-07-17 05:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_13: 5217    | Solar_Calculation_fc0_13   | 5217  |      |
| 2022-07-17 05:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_14: 4969    | Solar_Calculation_fc0_14   | 4969  |      |
| 2022-07-17 05:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_15: 4249    | Solar_Calculation_fc0_15   | 4249  |      |
| 2022-07-17 05:00:01 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_start: 11:00 | Solar_middayhigh_fc0_start | 11:00 |      |
| 2022-07-17 05:00:01 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_stop: 14:00  | Solar_middayhigh_fc0_stop  | 14:00 |      |
| 2022-07-17 05:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_16: 3311    | Solar_Calculation_fc0_16   | 3311  |      |
| 2022-07-17 05:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_17: 2651    | Solar_Calculation_fc0_17   | 2651  |      |
| 2022-07-17 05:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_18: 1103    | Solar_Calculation_fc0_18   | 1103  |      |
| 2022-07-17 05:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_19: 130     | Solar_Calculation_fc0_19   | 130   |      |
| 2022-07-17 05:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_4h: 2305    | Solar_Calculation_fc0_4h   | 2305  |      |
| 2022-07-17 05:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_rest: 41656 | Solar_Calculation_fc0_rest | 41656 |      |
| 2022-07-17 05:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_day: 41656  | Solar_Calculation_fc0_day  | 41656 |      |
| 2022-07-17 06:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0: 0           | Solar_middayhigh_fc0       | 0     |      |
| 2022-07-17 06:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_start: 00:00 | Solar_middayhigh_fc0_start | 00:00 |      |
| 2022-07-17 06:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_stop: 00:00  | Solar_middayhigh_fc0_stop  | 00:00 |      |
| 2022-07-17 06:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0: 1           | Solar_middayhigh_fc0       | 1     |      |
| 2022-07-17 06:00:01 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_start: 11:00 | Solar_middayhigh_fc0_start | 11:00 |      |
| 2022-07-17 06:00:01 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_stop: 14:00  | Solar_middayhigh_fc0_stop  | 14:00 |      |
| 2022-07-17 06:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_4h: 5613    | Solar_Calculation_fc0_4h   | 5613  |      |
| 2022-07-17 07:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0: 0           | Solar_middayhigh_fc0       | 0     |      |
| 2022-07-17 07:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_start: 00:00 | Solar_middayhigh_fc0_start | 00:00 |      |
| 2022-07-17 07:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_stop: 00:00  | Solar_middayhigh_fc0_stop  | 00:00 |      |
| 2022-07-17 07:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0: 1           | Solar_middayhigh_fc0       | 1     |      |
| 2022-07-17 07:00:01 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_start: 11:00 | Solar_middayhigh_fc0_start | 11:00 |      |
| 2022-07-17 07:00:01 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_stop: 14:00  | Solar_middayhigh_fc0_stop  | 14:00 |      |
| 2022-07-17 08:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0: 0           | Solar_middayhigh_fc0       | 0     |      |
| 2022-07-17 08:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_start: 00:00 | Solar_middayhigh_fc0_start | 00:00 |      |
| 2022-07-17 08:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_stop: 00:00  | Solar_middayhigh_fc0_stop  | 00:00 |      |
| 2022-07-17 08:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_08: 2044    | Solar_Calculation_fc0_08   | 2044  |      |
| 2022-07-17 08:00:00 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_09: 3241    | Solar_Calculation_fc0_09   | 3241  |      |
| 2022-07-17 08:00:00 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0: 1           | Solar_middayhigh_fc0       | 1     |      |
| 2022-07-17 08:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_10: 4287    | Solar_Calculation_fc0_10   | 4287  |      |
| 2022-07-17 08:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_11: 4941    | Solar_Calculation_fc0_11   | 4941  |      |
| 2022-07-17 08:00:01 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_12: 5137    | Solar_Calculation_fc0_12   | 5137  |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_13: 5259    | Solar_Calculation_fc0_13   | 5259  |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_14: 5024    | Solar_Calculation_fc0_14   | 5024  |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_15: 4258    | Solar_Calculation_fc0_15   | 4258  |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_start: 11:00 | Solar_middayhigh_fc0_start | 11:00 |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_middayhigh_fc0_stop: 14:00  | Solar_middayhigh_fc0_stop  | 14:00 |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_16: 3345    | Solar_Calculation_fc0_16   | 3345  |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_17: 2654    | Solar_Calculation_fc0_17   | 2654  |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_18: 1107    | Solar_Calculation_fc0_18   | 1107  |      |
| 2022-07-17 08:00:02 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_19: 131     | Solar_Calculation_fc0_19   | 131   |      |
| 2022-07-17 08:00:03 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_4h: 14513   | Solar_Calculation_fc0_4h   | 14513 |      |
| 2022-07-17 08:00:03 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_rest: 41428 | Solar_Calculation_fc0_rest | 41428 |      |
| 2022-07-17 08:00:03 | WR_1   | MODBUSATTR | Solar_Calculation_fc0_day: 41673  | Solar_Calculation_fc0_day  | 41673 |      |
+---------------------+--------+------------+-----------------------------------+----------------------------+-------+------+
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Juli 2022, 09:58:23
Moin Kaiman.

Zitat von: trupf am 17 Juli 2022, 08:11:29
Heute morgen hat er wieder mit voller Leistung den Speicher geladen - ich bin dann auf MaxSOC 50% gegangen,
damit hat das Laden aufgehört und dann habe ich die MaxSOC -Kontrolle noch auf "läuft" gestellt (war aktiviert, aber warum lief sie dan nicht??),
danach wieder auf MaxSOc 100% und jetzt schein er erst mal nicht zu laden.
Warum aber lädt er morgens schon mit voller Leistung wenn das steht nicht von 8:30 Uhr und dann nur mit 200W?
Es kann sein, dass Dein Speicher mit weniger als 3*MinSOC = 15% aus der Nacht gekommen ist.
Der Lade SOC von gestern war 100% und wurde für heute auch wieder mit 100% geplant.
Da müssen wir uns mal die Speicher Größe und Deinen Nachtverbrauch anschauen. Eventuell brauchst Du ja keine MaxSOC Begrenzung ,
wenn Dein Speicher immer schön über Nacht entladen wird. Dann wäre Dein Speicher optimal auf Deinen Verbrauch geplant worden. Meinen habe ich
wegen der Wärmepumpe im Herbst/Winter etwas größer gewählt und auch damit er nach einigen Jahren auch noch genug Kapazietät für meinen Verbrauch hat.
Zitat
Und Warum wird mir in mysql Solar_Calculation_fc0_day: 41656 angezeigt, aber in der Prognose für den Tag in FHEM nur 38kWh? Die Differenz würde ich gern verstehen, was passiert mit den übrigen 3 kWh?
Im WR_1 stateFormat ist mir etwas vom Test rein gerutscht :-( Da hatte ich mir die Tagesleistung mal um 10% in der Anzeige geändert.
Bitte nimm das "*0.9" raus. Im Wiki habe ich es auch gerade korrigiert.

my $Solar_Calculation_fc0_4h   = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_4h",0)/1000 ,0));;\
my $Solar_Calculation_fc0_day  = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_day",0)/1000 ,0));;\
my $Solar_Calculation_fc0_rest = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_rest",0)/1000 ,0));;\



1) bitte stell die Trigger Steuerung zuerst mal wieder auf den Default, da Du die nicht verwendest:
       - entladen
       - none

2) Im uiTable fehlt in der folgenden Zeile die Anzeige des MinSOC am Morgen

|"MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / geplant</dd>" |
FUNC_Status([WR_1:Solar_Calculation_fc1_day],[$SELF:SpeicherMaxSOC_fc1_Limit],"red","<",0,0,([$SELF:SpeicherMaxSOC_fc1_Limit]-1),"green",">="). widget([$SELF:SpeicherMaxSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin") | ([$SELF:SpeicherMaxSOC_MinSOC_Time] eq "gefunden")?(POSIX::strftime("%H:%M",::localtime(::time_str2num(::ReadingsTimestamp("$SELF","SpeicherMaxSOC_MinSOC_MinSOC",""))))." ".[$SELF:SpeicherMaxSOC_MinSOC_MinSOC]." %"):"wartet" |
"<div style='border-width:2px;border-style:solid;border-color:gray;position:relative;width:90px;height:20px;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);'>".STY(" ",FUNC_batt([$SELF:SpeicherMaxSOC_DayBefore])).STY("gestern","font-size:12px;position:absolute;top:3px;left:25px")."</div>".widget([$SELF:SpeicherMaxSOC_DayBefore],"selectnumbers,5,1,100,0,lin")."%" |
"<div style='border-width:2px;border-style:solid;border-color:gray;position:relative;width:90px;height:20px;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);'>".STY(" ",FUNC_batt([$SELF:SpeicherMaxSOC_Actual])).STY("geplant","font-size:12px;position:absolute;top:3px;left:25px")."</div>".widget([$SELF:SpeicherMaxSOC_Actual],"selectnumbers,5,1,100,0,lin")."%"


3) Das Mittagshoch von 11:00 - 14:00 Uhr wurde nun jetzt ja bereits erkannt.

4) Leider fehlt in Deinem Diagramm die Darstellung von WR_1 Actual_Battery_charge_usable_P , das ist bei mir in gelb mit drin. Damit kannst Du den Ladezustand des Speichers in kW sehen.

5) Die Schalter "aktiviert" setzt man selber, damit man MaxSOC oder das Mittagshoch aktivieren kann. Die Schalter "läuft" sollten dann automatisch gesetzt werden und
     dienen ansonsten zum Testen, oder um eine manuelle Situation hervorzurufen.

Bitte schick mit mal Dein WR_1_Speicher_ExternControl als PN im List und als RAW.
Dazu dann auch noch die gefilterten Log Meldungen, aber bitte ohne alle anderen Device Meldungen.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 17 Juli 2022, 11:58:35
Was überhaupt nicht geht bei mir ist, den WR mit einer festel Leistung zu laden bzw. die Ladeleistung auf ein Max zu begrenzen. Entweder er lädt alles rein was geht oder nichts. Die 200 Watt am Morgen werden genauso ignoriert wie eine Ladeleistung, die ich für das Mittagshoch einstelle (aktuell habe ich 1200 Watt eingestellt, geladen wird aber mit 2800W). Damit wird der Speicher aber zu schnell voll und ich laufe späöter dann dennoch in die 70%-Begrenzung.

Was der Installateur bei mir nicht angeschlossen hat, ist das RS485-Kabel zwischen Batterie und WR - kann es daran liegen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Juli 2022, 12:12:36
Zitat von: trupf am 17 Juli 2022, 11:58:35
Was überhaupt nicht geht bei mir ist, den WR mit einer festel Leistung zu laden bzw. die Ladeleistung auf ein Max zu begrenzen. Entweder er lädt alles rein was geht oder nichts. Die 200 Watt am Morgen werden genauso ignoriert wie eine Ladeleistung, die ich für das Mittagshoch einstelle (aktuell habe ich 1200 Watt eingestellt, geladen wird aber mit 2800W). Damit wird der Speicher aber zu schnell voll und ich laufe späöter dann dennoch in die 70%-Begrenzung.

Was der Installateur bei mir nicht angeschlossen hat, ist das RS485-Kabel zwischen Batterie und WR - kann es daran liegen?
Haaa ( <<< Ausruf des Entsetzens )

Das ist der riesen Fehler in Deinem System. Für die Speichersteuerung des Plenticore ist die rs485 Verbindung pflicht, ohne das kann der Plenticore nicht steuern und Du solltest sogar im WR eine Fehlermeldung im Ereignislog haben.
Wenn Du technisch begabt bist könntest Du das natürlich auch selber machen, ansonsten steht der Installateur nocgh in der Verpflichtung.
Die LAN Verbindungen sind ein nice to have, aber rs485 ist ein muss.

Somit machen wir hier erst weiter, wenn das angeschlossen ist :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 17 Juli 2022, 14:38:37
Zitat von: ch.eick am 17 Juli 2022, 09:58:23
Es kann sein, dass Dein Speicher mit weniger als 3*MinSOC = 15% aus der Nacht gekommen ist.
Der Lade SOC von gestern war 100% und wurde für heute auch wieder mit 100% geplant.
Er ist mit fast 40% aus der Nacht gekommen.

Zitat von: ch.eick am 17 Juli 2022, 09:58:23
Im WR_1 stateFormat ist mir etwas vom Test rein gerutscht :-( Da hatte ich mir die Tagesleistung mal um 10% in der Anzeige geändert.
Bitte nimm das "*0.9" raus. Im Wiki habe ich es auch gerade korrigiert.
OK, ist erledigt.

Zitat von: ch.eick am 17 Juli 2022, 09:58:23
1) bitte stell die Trigger Steuerung zuerst mal wieder auf den Default, da Du die nicht verwendest:
       - entladen
       - none
2) Im uiTable fehlt in der folgenden Zeile die Anzeige des MinSOC am Morgen
Auch erledigt

Zitat von: ch.eick am 17 Juli 2022, 09:58:23
3) Das Mittagshoch von 11:00 - 14:00 Uhr wurde nun jetzt ja bereits erkannt.
Ja, nützt nur nichts, wenn der Speicher bis 11:00 Uhr schon voll geladen ist.

Zitat von: ch.eick am 17 Juli 2022, 09:58:23
4) Leider fehlt in Deinem Diagramm die Darstellung von WR_1 Actual_Battery_charge_usable_P , das ist bei mir in gelb mit drin. Damit kannst Du den Ladezustand des Speichers in kW sehen.
In der Config aus dem WIKI ist das mit WR_1 Actual_battery_charge_usable_P (beachte das kleine "b" bei Battery) hinterlegt, daher hat es nicht fuinktioniert, habe ich korrigiert.

Zitat von: ch.eick am 17 Juli 2022, 09:58:23
5) Die Schalter "aktiviert" setzt man selber, damit man MaxSOC oder das Mittagshoch aktivieren kann. Die Schalter "läuft" sollten dann automatisch gesetzt werden und
     dienen ansonsten zum Testen, oder um eine manuelle Situation hervorzurufen.
Das ist ja das was komisch war, aktiviert war gesetzt, aber läuft hat sich nicht automatisch gesetzt.

Zitat von: ch.eick am 17 Juli 2022, 12:12:36
Das ist der riesen Fehler in Deinem System. Für die Speichersteuerung des Plenticore ist die rs485 Verbindung pflicht, ohne das kann der Plenticore nicht steuern und Du solltest sogar im WR eine Fehlermeldung im Ereignislog haben.
Da habe ich wohl nicht ganz richtig geschaut, es ist zwar ein Kabel nicht angeschlossen, aber das RS485 ist verbunden. Im WR gibt es zwar eine Fehlermeldung zur Kommunikation, aber die ist vom Tag, als das Ganze angeschlossen worden ist, danach kam keine mehr. Daher gehe ich jetzt davon aus, dass die Verbindung OK ist.
Die Begrenzung auf eine fixe Ladeleistung scheint aber dennoch nicht zu funktionieren. Kann das noch an der Software des Plenticore liegen? Ich habe in einem anderen Forum gesehen, dass sich Nutzer bei Kostal beschwert haben, da es zumindest in früheren Firmwareversionen diese Möglichkeit die Ladeleistung zu begrenzen nicht gab - weißt Du ob Kostal das inzwischen behoben hat? Ich habe UI version 01.23.07734, MC version 01.70, IOC version 01.70, keine Ahnung ob das die aktuellen Versionen sind, aber automatische Updates sind in jedem Fall aktiviert.

Die anderen Daten schicke ich per PN.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 Juli 2022, 15:41:26
Zitat von: trupf am 17 Juli 2022, 14:38:37
Ja, nützt nur nichts, wenn der Speicher bis 11:00 Uhr schon voll geladen ist.
Zuerst muss die Kommunikation gesichert werden.

Zitat
In der Config aus dem WIKI ist das mit WR_1 Actual_battery_charge_usable_P (beachte das kleine "b" bei Battery) hinterlegt, daher hat es nicht fuinktioniert, habe ich korrigiert.
Okay, habe ich im Wiki auch geändert, das haben wohl noch nicht so viele nachgebaut.

Zitat
Das ist ja das was komisch war, aktiviert war gesetzt, aber läuft hat sich nicht automatisch gesetzt.

Zitat
Da habe ich wohl nicht ganz richtig geschaut, es ist zwar ein Kabel nicht angeschlossen, aber das RS485 ist verbunden. Im WR gibt es zwar eine Fehlermeldung zur Kommunikation, aber die ist vom Tag, als das Ganze angeschlossen worden ist, danach kam keine mehr. Daher gehe ich jetzt davon aus, dass die Verbindung OK ist.
Die Begrenzung auf eine fixe Ladeleistung scheint aber dennoch nicht zu funktionieren. Kann das noch an der Software des Plenticore liegen? Ich habe in einem anderen Forum gesehen, dass sich Nutzer bei Kostal beschwert haben, da es zumindest in früheren Firmwareversionen diese Möglichkeit die Ladeleistung zu begrenzen nicht gab - weißt Du ob Kostal das inzwischen behoben hat? Ich habe UI version 01.23.07734, MC version 01.70, IOC version 01.70, keine Ahnung ob das die aktuellen Versionen sind, aber automatische Updates sind in jedem Fall aktiviert.
Ich habe noch diese Version im Einsatz

UI-Version 01.21.06586
MC-Version 01.60
IOC-Version 01.60


Ich schau mir dann mal das Log an, dass Du schickst.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Juli 2022, 09:53:20
Zitat von: trupf am 17 Juli 2022, 14:38:37
Ja, nützt nur nichts, wenn der Speicher bis 11:00 Uhr schon voll geladen ist.
Hallo Tobias,
nach einem Blick ins Log erklärt sich, warum sofort geladen wurde.

2022.07.17 06:34:01 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_DayBefore wurde um 24 erhöht
2022.07.17 06:34:01 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_Actual wird nicht begrenzt, da die Prognose für morgen zu schlecht ist
2022.07.17 06:34:01 3: WR_1_Speicher_1_ExternControl cmd_7  : Batterie SpeicherMiddayControlRunning vorbereitet
2022.07.17 06:34:01 3: WR_1_Speicher_1_ExternControl cmd_7  : Batterie Solar_middayhigh_fc0_start 11:00 gesetzt
2022.07.17 06:34:01 3: WR_1_Speicher_1_ExternControl cmd_7  : Batterie Solar_middayhigh_fc0_stop  14:00 gesetzt


Das hier ist die entscheidende Meldung :-)

2022.07.17 06:34:01 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_Actual wird nicht begrenzt, da die Prognose für morgen zu schlecht ist

Aber trotzdem sollte es natürlich kontrolliert sein.

Auch das hier kommt mir komisch vor. Dadurch kann natürlich kein Uhrzeit Vergleich gemacht werden.

2022.07.17 07:41:43 3: WR_1_Speicher_1_ExternControl: eval: 'error Undefined subroutine &main::localtime called at (eval 694154) line 1.

in expression:  (::ReadingValDoIf($hash,'WR_1_Speicher_1_ExternControl','SpeicherMaxSOC_MinSOC_Time') eq "gefunden")?(POSIX::strftime("%H:%M",::localtime(::time_str2num(::ReadingsTimestamp("WR_1_Speicher_1_ExternControl","SpeicherMaxSOC_MinSOC_MinSOC",""))))." ".::ReadingValDoIf($hash,'WR_1_Speicher_1_ExternControl','SpeicherMaxSOC_MinSOC_MinSOC')." %"):"wartet" ' error: Bad name after WR_1_Speicher_1_ExternControl' at (eval 837471) line 2.

Da scheint etwas im DOIF mit dem Aufruf der Zeit Funktionen aus dem main Addressspace nicht zu stimmen. Hier mal meine DOIF Version.

FVERSION 98_DOIF.pm:0.260200/2022-05-03


Bitte beobachte das nochmal genauer und schau Dir auch die Log Meldungen an.
Insbesondere fehlen noch die Meldungen der Prognose, die dann so aussehen sollten

2022.07.18 06:11:16.003 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_MinSOC_Time gefunden 22 %
2022.07.18 06:11:16.003 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_DayBefore 81 %
2022.07.18 06:11:16.004 3: WR_1_Speicher_1_ExternControl cmd_7  : Leistung Prognose 131633 wh > Schwellwert 30000 wh
2022.07.18 06:11:16.004 3: WR_1_Speicher_1_ExternControl cmd_7  : Speicherladung aktuell 22 % > Minimum 15 %
2022.07.18 06:11:16.004 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_DayBefore 81 % gesichert
2022.07.18 06:11:16.004 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_Actual 81 % geplant
2022.07.18 06:11:16.004 3: WR_1_Speicher_1_ExternControl cmd_7  : Batterie SpeicherMiddayControlRunning vorbereitet
2022.07.18 06:11:16.005 3: WR_1_Speicher_1_ExternControl cmd_7  : Batterie Solar_middayhigh_fc0_start 11:00 gesetzt
2022.07.18 06:11:16.005 3: WR_1_Speicher_1_ExternControl cmd_7  : Batterie Solar_middayhigh_fc0_stop  16:00 gesetzt


VG
  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 18 Juli 2022, 17:59:11
Hi Chris,

Ich glaube du hast mich mit trupf verwechselt und meine Frage übersehen :)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Juli 2022, 19:44:00
Zitat von: kaiman am 18 Juli 2022, 17:59:11
Hi Chris,

Ich glaube du hast mich mit trupf verwechselt und meine Frage übersehen :)

Zitat von: kaiman am 16 Juli 2022, 20:32:57
Hi Chris

Danke für die Info.
Ich komm heute nicht mehr dazu die Änderung durchzuführen.  Wenn ich das einen oder zwei Tage später mache, muss ich etwas beachten oder soll ich den Init wert dann einfach für den Tag setzen, wenn ich es anpasse?

Stehe gerade etwas auf der Leitung.

Gruß
Kaiman
der Tages Init Wert setzt sich jeden Tag selber neu. Das wäre nur zu machen. wenn es sofort wieder korrekt sein soll.
Leider wären dann natürlich jetzt die Tages Werte in der Datenbank durcheinander.
Um das wieder hin zu bekommen müsstest Du ausrechnen, um wieviel sie falsch berechnet wurden und das dann entsprechend überschreiben.

Das gilt natürlich für die Monats Werte im übertragenen Sinne.

Sorry, hatte ich wirklich überlesen.
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 18 Juli 2022, 21:22:30
Hi,

ich poste noch mal das Ladediagramm von heute. Insgeasamt sieht es schon deutlich besser aus, die meisten Einstellungen scheinen funktioniert zu haben:
- er hat den Speicher bis 8:30 nicht geladen
- ab 8:30 mit 400W geladen, wie eingestellt
- dann hat er als SpeicherMdiday_MaxSOC erreicht war aufgehört zu laden (ich denke das soll so sein)
- geplant war Laden über das Mittagshoch ab 11:00, aber im Log habe ich mehrere meldungen gefunden mit
    2022.07.18 11:01:51 3: WR_1_Speicher_1_ExternControl cmd_6  : SpeicherMiddayControlActive laden wegen MaxSoc von 11:00 auf 12:00 Uhr verschoben
  um 12:00 Uhr hjat er dan angefangen den Speicher zu laden

==> der letzte Punkt macht für mich aber keinen Sinn, ich will ja gerade dass er das Mittagshoch nutzt zum Laden und nich da das Laden verschiebt. Dann lieber mit weniger Leistung laden, man sieht im Diagramm gut, dass er durch das Verschieben ab kurz nach 11:00 Uhr in die 70%-Begrenzung gegangen ist. Wie kann ich dieses Verschieben verhindern?

Aufgefallen ist mir noch, dass nach einem Neustart von FHEM alle Einstellungen im ExternControl verloren gegangen sind - kann ich das irgendwie verhindern?

Und aktuell bekomme ich einen Haufen Fehlermeldungen in der Art:
2022.07.18 21:40:01 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 18471) line 1.
2022.07.18 21:40:01 3: eval: WR_1_Speicher_1_ExternControl: warning in condition c10
2022.07.18 21:40:01 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 18476) line 1.
2022.07.18 21:40:01 3: eval: WR_1_Speicher_1_ExternControl: warning in condition c10
2022.07.18 21:40:02 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 18492) line 1.
2022.07.18 21:40:02 3: eval: WR_1_Speicher_1_ExternControl: warning in condition c10
2022.07.18 21:40:03 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 18517) line 1.
2022.07.18 21:40:03 3: eval: WR_1_Speicher_1_ExternControl: warning in condition c10
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Juli 2022, 21:45:28
Zitat von: trupf am 18 Juli 2022, 21:22:30
Hi,

ich poste noch mal das Ladediagramm von heute. Insgeasamt sieht es schon deutlich besser aus, die meisten Einstellungen scheinen funktioniert zu haben:
- er hat den Speicher bis 8:30 nicht geladen
- ab 8:30 mit 400W geladen, wie eingestellt
- dann hat er als SpeicherMdiday_MaxSOC erreicht war aufgehört zu laden (ich denke das soll so sein)
- geplant war Laden über das Mittagshoch ab 11:00, aber im Log habe ich mehrere meldungen gefunden mit
    2022.07.18 11:01:51 3: WR_1_Speicher_1_ExternControl cmd_6  : SpeicherMiddayControlActive laden wegen MaxSoc von 11:00 auf 12:00 Uhr verschoben
  um 12:00 Uhr hjat er dan angefangen den Speicher zu laden

==> der letzte Punkt macht für mich aber keinen Sinn, ich will ja gerade dass er das Mittagshoch nutzt zum Laden und nich da das Laden verschiebt. Dann lieber mit weniger Leistung laden, man sieht im Diagramm gut, dass er durch das Verschieben ab kurz nach 11:00 Uhr in die 70%-Begrenzung gegangen ist. Wie kann ich dieses Verschieben verhindern?
Eventuell nimmst Du Inverter_Max_Power etwas niediger, dann beginnt das Mittagshoch früher. Du solltest es bei Deiner Anlage versuchen auf 10:00 Uhr zu bekommen,
dann kommt eventuell die MaxSOC Verschiebung noch dazu und Du landest bei 11:00 Uhr.
Bei mir ist das Mittagshoch erst gegen 13 oder 13:30 Uhr, da ich eine Ost/Süd/West Anlage mit kleinem Süd Anteil habe.
Wenn es dann trotzdem noch nicht passen sollte kann ich ja den Code etwas ändern.

Anstelle der dynamischen Ladeleistung könntest Du auch eine Leistung mit Power_Mittags (steht jetzt auf 0) vorgeben.

Die 400W könntest Du noch verringern, dann lädt er etwas länger, bis der MaxSOC erreicht wird.

Die Verschiebung wegen MaxSOC Begrenzung macht normalerweise Sinn, da dadurch weniger Platz im Speicher ist und somit die Mittagszeit etwas verkürzt wird.

Die Speicher Leistung sieht als Linie ohne Stufen besser aus :-)

Zitat
Aufgefallen ist mir noch, dass nach einem Neustart von FHEM alle Einstellungen im ExternControl verloren gegangen sind - kann ich das irgendwie verhindern?
Da solltest Du nach Veränderungen mal ein Save machen. Dadurch werden sie mit dem setstate wieder hergestellt. Die berechneten Werte, oder das aus dem Forecast wird ja eh alle Stunde neu geschrieben.

Ist das um 14:00 Uhr eine Wärmepumpe? Die wäre um 12:00 Uhr auch gut zu gebrauchen.

Um jetzt etwas in die Details zu gehen wären die Log Meldungen ganz gut, aber am besten dann als .txt Datei anhängen.

VG
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 18 Juli 2022, 22:09:51
Nein 14:00 Uhr ist keine Wärmepumpe, da hat meine Frau wohl was gekocht...Außerdem Wärempumpe bei den Temperaturen? Dann eher eine Klimaanlage, aber die haben wir auch nicht.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 19 Juli 2022, 07:18:07
Hi,
Ok soweit verstanden.
Wenn ich die Werte jetzt bei Monat nicht korrigiere, würde der nächste Monat wieder korrekt berechnet und angezeigt, oder?

Hätten die falschen Werte in der Datenbank Auswirkungen auf die Quartalsberechnungen und die Jahreswerte die angezeigt werden?

Gruß
Kaiman

Zitat von: ch.eick am 18 Juli 2022, 19:44:00
der Tages Init Wert setzt sich jeden Tag selber neu. Das wäre nur zu machen. wenn es sofort wieder korrekt sein soll.
Leider wären dann natürlich jetzt die Tages Werte in der Datenbank durcheinander.
Um das wieder hin zu bekommen müsstest Du ausrechnen, um wieviel sie falsch berechnet wurden und das dann entsprechend überschreiben.

Das gilt natürlich für die Monats Werte im übertragenen Sinne.

Sorry, hatte ich wirklich überlesen.
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Juli 2022, 07:38:05
Zitat von: kaiman am 19 Juli 2022, 07:18:07
Hi,
Ok soweit verstanden.
Wenn ich die Werte jetzt bei Monat nicht korrigiere, würde der nächste Monat wieder korrekt berechnet und angezeigt, oder?

Hätten die falschen Werte in der Datenbank Auswirkungen auf die Quartalsberechnungen und die Jahreswerte die angezeigt werden?

Gruß
Kaiman
Hallo Kaiman,
den Monatswert würde ich sofort korrigieren, wenn er überhaupt falsch sein sollte. Meistens ist es eh nur der Tageswert.
Betroffen sind folgende  userreadings

SW_Statistic_EnergyHomeFeedInGrid_Day:SW_Statistic_Yield_Day.* { (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Day",0)) * 1000 },
SW_Statistic_EnergyHomeFeedInGrid_Month:SW_Statistic_Yield_Month.* { (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Month",0)) * 1000 },
SW_Statistic_EnergyHomeFeedInGrid_Year:SW_Statistic_Yield_Year.* { (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Year",0)) * 1000 },

SW_Statistic_EnergyHomeGrid_Day:SW_Statistic_Yield_Day.* { (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Day",0)) * 1000 },
SW_Statistic_EnergyHomeGrid_Month:SW_Statistic_Yield_Month.* { (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Month",0)) * 1000 },
SW_Statistic_EnergyHomeGrid_Year:SW_Statistic_Yield_Year.* { (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Year",0)) * 1000 },

Im Quartalsreport werden jedoch die "SW_Statistic_%Year" Werte verwendet.

reading SW_Statistic_%Year,Statistic_EnergyHomeBat_Year EXCLUDE=%Autarky%,%Rate%,%NoBat%


Da ich fast täglich auf meine Diagramme schaue sehe ich das Problem meist noch am selben Tag. Und den Absturz von FHEM sollte man auch recht schnell merken, was bei mir bisher ein mal passiert ist und da sind die Rollos morgens als Folge nicht oben gewesen.In dem Zeitraum, wo dann alles unter war fehlen ja zusätzlich auch die Messwerte, somit kann man nichts korrigieren.
Eine Korrektur wäre aber zwischen dem wieder hochfahren und dem Zeitpunkt des korrigierens der Init Werte möglich.
Dazu vergleicht man den falschen Wert mit dem letzten korrekten Init Wert in der Datenbank. Daraus sollte sich eine Differenz ergeben, um die die *Grid readings zu hoch/niedrig sind.
Mit einem MySQL UPDATE könnte man dann die fehlerhaften Werte, die ja mit einem Zeitraum bestimmbar sind korrigieren.

Als Vorbereitung für eine Korrektur:
- falsche INIT Werte notieren.
- letzte richtige Werte aus deer Datenbank ermitteln
- TIMESTAMP für den Zeitraum notieren (Anfang und Ende)

VG
     Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 19 Juli 2022, 21:13:02
Hi,
Danke soweit verstanden.
Ich bin leider jetzt erst mal unterwegs und hab nur über mein Handy Zugriff. Mitte nächster Woche zurück. Leider betrifft es die Monatswerte.

Ich werd dann mal schauen, wie ist die gerade ziehen kann, bis dahin muss ich mit den fehlerhaften leben.
Wenn die Diagramme nicht passen ist nicht so wild, wichtiger wäre mir die numerische Übersicht. Wenn die Werte passen bin ich zufrieden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 19 Juli 2022, 22:07:18
Anbei wieder 3 Screenshots. Was mir noch nicht gefällt sind die folgenden Punkte:

1. Die Ladebegrenzung mit SpeicherMidday_MaxChargePowerAbs_midday wird nicht beachtet. Genaugenommen hat wieder das Verschieben des Ladestarts wegen MaxSOC auf 12:00 Uhr zugeschlagen, wobei ich die Zeit im ExternControl aber auf 11.00 Uhr geändert habe. Dennoch soll er die max. Ladeleistung aber beachten! Gibt es eine Möglichkei die Variabeln sich direkt durch Eingbe eines Befehls in FHEM anzeigen zu lassen (also z.B. den aktuellen Wert von $MaxChargePowerAbs_midday oder $SELF:Speicher_Midday_MaxChargePowerAbs_midday)?
2.Durch dieses schnelle Laden komme ich ab ca. 12:30 wieder in die 70%-Begrenzung...
3. Es wurde am Morgen ein MaxSOC von 95% berechnet (und am Mittag auch noch so angezeigt, 100% kam erst gegen Abend). Der MaxSOC wird aber nicht beachtet, er lädt trotzdem bis 100%
4. Wo die 83% MaxSOC von DayBefore herkommen ist mir auch unklar, die galten gestern nicht und heute auch nie. Warum wird der Wert überhaupt zum Abend hin noch mal verändert? Und bei DayBefore macht das doch noch weniger Sinn und führt nur zu Verwirrung?
5. ich habe noch einige Fehlermldungen im log (z.B. zu localtime) was muss ich tun um das zu lösen? Ein Hinweis dazu: alles mit WR2habe ich in FHEM disabled, ich hoffe das ist ok.

Ich schicke das Log per Mail.

Grüße,
Tobias
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Juli 2022, 15:07:41
Zitat von: trupf am 19 Juli 2022, 22:07:18
5. ich habe noch einige Fehlermldungen im log (z.B. zu localtime) was muss ich tun um das zu lösen? Ein Hinweis dazu: alles mit WR2habe ich in FHEM disabled, ich hoffe das ist ok.

Hallo Tobias,

wie im letzten Post bereits geschrieben, kann die Steuerung nicht funkltionieren, solange da ein Problem besteht, denn dadurch wird keine Zeit beachtet und alle Berechnungen sind falsch.
Zu dem Thema localtime solltest Du schon mal im FHEM Forum suchen, denn das ist eine basis Funktion, auf die ich auch keinen Einfluss habe.
Natürlich schaue ich mir noch die Logs an, aber alle anderen Fragen brauchen wir nicht zu analysieren, da die Grundlage in Deiner FHEM Installation anscheinend das localtime nicht bereitstellt.

Die Beschränkungen sind alle Zeitabhängig, siede dazu oben (localtime).

Ich versuche mir dann noch mal Gedanken zur Berechnung der Ladestärke zu machen, denn das finde ich auch nicht so schön. (siehe Bild)
Bisher habe ich noch keine Idee für eine mathematische Funktion :-(

Der Wert für DayBefore wird abends nochmals bestimmt, denn es kann vorkommen, dass der Speicher am Nachmittag, z.B. durch die Heizung, teilweise entleert wurde und dann nicht mehr nachgeladen werden kann. Somit geht man mit weniger in die Nacht, was morgens wieder berücksichtigt werden muss.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 20 Juli 2022, 16:57:52
Danke für die Antwort, aber mit der Fehlerbehebung habe ich Schwierigkeiten. Localtime habe ich z.B. in 99_myUtils.pm als als "use Time::Local" mit inkludiert, aber das hilft offenbar nicht für den uiTable, sondern nur für die Funktionen die in 99_myUtils.pm enthalten sind. Und dazu finde ich mit Google keine Lösung.
Und bei den übrigen Fehlermeldungen habe ich noch weniger Plan. Mir fällt es schon schwer die Stelle im Code zu finden wo sie herkommen (welche Stelle ist c10 im Code? Da steht dann was von cmd_7, das hilft etwas, aber ab welcher Zeile muss ich jetzt mit der Zählung der Zeilen beginnen? Wie kann ich herausfinden welcher der Werte "uninitialized" war?  Wie soll ich wissen welcher Wert nicht numerisch war und warum? Dazu müsste ich mir die Variablen zumindest mal anzeigen lassen können um herauszufinden welche Variable jetzt eigentlich den Fehler erzeugt - deshalb auch meine Frage, wie ich mir die aktuellen Werte in FHEM anzeigen lassen kann. Vielleicht kannst Du mir diese noch beantworten oder einen Hinweis geben, wo ich die Antwort finde.  Google hat mich leider auch hier nicht weitergebracht.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Juli 2022, 18:11:47
Zitat von: trupf am 20 Juli 2022, 16:57:52
Danke für die Antwort, aber mit der Fehlerbehebung habe ich Schwierigkeiten. Localtime habe ich z.B. in 99_myUtils.pm als als "use Time::Local" mit inkludiert, aber das hilft offenbar nicht für den uiTable, sondern nur für die Funktionen die in 99_myUtils.pm enthalten sind. Und dazu finde ich mit Google keine Lösung.
In der 99_my_Utils habe ich das nicht drin.
Meine Vermutung ist, dass Dein DOIF so alt ist, dass Du die Änderung mit dem eigenen Runtime Environment noch nicht drin hast.
Da hat sich vor geraumer Zeit mal etwas geändert.

Ich mache bei mir häufiger mal ein FHEM update, damit ich nicht alle Aktualisierungen verschlafe ;-)

Zitat
Und bei den übrigen Fehlermeldungen habe ich noch weniger Plan. Mir fällt es schon schwer die Stelle im Code zu finden wo sie herkommen (welche Stelle ist c10 im Code? Da steht dann was von cmd_7, das hilft etwas, aber ab welcher Zeile muss ich jetzt mit der Zählung der Zeilen beginnen? Wie kann ich herausfinden welcher der Werte "uninitialized" war?  Wie soll ich wissen welcher Wert nicht numerisch war und warum? Dazu müsste ich mir die Variablen zumindest mal anzeigen lassen können um herauszufinden welche Variable jetzt eigentlich den Fehler erzeugt - deshalb auch meine Frage, wie ich mir die aktuellen Werte in FHEM anzeigen lassen kann. Vielleicht kannst Du mir diese noch beantworten oder einen Hinweis geben, wo ich die Antwort finde.  Google hat mich leider auch hier nicht weitergebracht.
Ich habe Dir noch eine Mail geschrieben. Arbeite die schon mal durch, dann schauen wir nach den verbleibenden Log Meldungen und erst, wenn die durch sind schauen wir nach der Speicher Steuerung.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 22 Juli 2022, 19:49:26
Nach dem FHEM update habe ich jetzt einige neue Fehlermeldung dieser Art:
PERL WARNING: Use of uninitialized value $2 in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 507, <$fh> line 306.

Die hatte ich vorherr nicht und sie kommen von Device Plenticore_WR1_api. Irgendwas muss in FHEM geändert worden sein, was den Fehler bewirkt. Hat jemand eine Ahnung was geändert werden muss?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Juli 2022, 08:14:14
Zitat von: trupf am 22 Juli 2022, 19:49:26
Nach dem FHEM update habe ich jetzt einige neue Fehlermeldung dieser Art:
PERL WARNING: Use of uninitialized value $2 in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 507, <$fh> line 306.

Die hatte ich vorherr nicht und sie kommen von Device Plenticore_WR1_api. Irgendwas muss in FHEM geändert worden sein, was den Fehler bewirkt. Hat jemand eine Ahnung was geändert werden muss?
Das hat vor geraumer Zeit mit einem Update von HTTPMOD begonne, ich konnte jedoch nicht feststellen, ob es durch einen falschen Aufruf, oder durch das Modul entsatanden ist. Meine Vermutung liegt aber beim Modul :-( und das übersteigt meine Perl Kenntnisse.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 August 2022, 18:45:32
Hallo zusammen,

ich überarbeite gerade die Solar_forecast() Funktion um bessere Prognosewerte und noch zusätzlich einen Prognose_max Wert mit Uhrzeit zu bekommen.
Hier schon mal einige Ausgabewerte, wobei mir schon jetzt aufgefallen ist, dass der Prognose_day Wert nicht wirklich falsch gewesen ist.
Der Unterschied ist in den restlichen Werten, wodurch man dann genauer planen kann.

Das ist die bisherige Berechnung:

2022.08.03 18:27:21.131 3: Prognose_4h                  : 10146
2022.08.03 18:27:21.131 3: Prognose_rest                : 10146
2022.08.03 18:27:21.131 3: Prognose_morning             : 38949
2022.08.03 18:27:21.132 3: Prognose_afternoon           : 69343
2022.08.03 18:27:21.132 3: Prognose_day                 : 108292

Das wäre dann als reading neu:

2022.08.03 18:27:21.132 3: Prognose_max                 : 13357
2022.08.03 18:27:21.132 3: Prognose_max_time            : 14:00

Diese Werte ergeben sich aus der Summierung über die Interpolation und würden die bisherige Prognose ersetzen.
Die bisherigen reading Namen bleiben jedoch erhalten.

2022.08.03 18:27:21.132 3: Interpolation_4h             : 7056
2022.08.03 18:27:21.132 3: Interpolation_rest           : 7056
2022.08.03 18:27:21.132 3: Interpolation_morning        : 45541
2022.08.03 18:27:21.132 3: Interpolation_afternoon      : 62753
2022.08.03 18:27:21.132 3: Interpolation_day            : 108294

Prognose_day und Interpolation_day sind bis auf 2 W gleich :-)

Für eine Darstellung im Grafana Diagramm macht es jedoch keinen Unterschied, wenn man es als Linie Darstellt. deshalb werde ich die interpolierten Werte nicht in die Datenbank schreiben, sondern nur für die Summierungen verwenden.

Über die Werte von *_morning und *_afternoon kann man auch erkennen, ob der Vormittag oder der Nachmittag in der Leistung stärker sein wird. Wir hatten ja noch immer das Problem, dass es am Nachmittag mal regnen könnte und dann der Speicher nicht richtig voll wäre.
Da könnte ich eventuell noch etwas in der WR_1_Speicher_1_ExternControl einbauen ???
Meine anderen Untersuchungen bezüglich Regen haben noch nichts hervorgebracht :-(

Gibt es bei dieser Gelegenheit noch weitere Wünsche, die in der Prognose berechnet werden könnten?

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 August 2022, 09:30:47
Moin,
nachdem ich mit dem Upgrade vom KSEM auf 2.0 (https://www.photovoltaikforum.com/thread/179173-ksem-fw-2-0/?postID=2724300#post2724300) nun das Wochenende noch gewartet habe, ist es nun vollbracht :-)
Bisher gab es mit zwei Wechselrichtern noch kein Problem, jedoch wird der Hausverbrauch im Schwarm leider noch nicht zum Plenticore Master übermittelt. Da denke ich wird es sicher bald noch einen Plenticore Update geben.
Die eventuell zusätzlichen KSEM Modbus Register habe ich auch noch nicht gefunden.
Dann schauen wir mal, wann Kostal mit dem Umbau fertig ist, bevor ist die FHEM Devices anfassen werde.

VG
   Christian

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 August 2022, 15:12:42
Hallo nochmal,

ich habe jetzt auch eine kontinuierlichere Ladung des Speichers hin bekommen, zumindest nach dem ersten Test :-)
Bisher ist das Laden ja immer zum Ende hin spitz zugelaufen und somit wurde zu Begin stark und zum Ende langsamer geladen. Das ist für die 70% Regelung natürlich nicht so schön und einige von Euch haben dann einen Festen Wert eingestellt. Da das Mittagshoch jedoch unterschiedlich lang sein kann verwende ich die dynamische Ladeberechnung.
In der Grafik sieht man jetzt recht schön den gleichmäßigeren Verlauf, bis auf die kleine Stufe :-) , da habe ich dann nochmal etwas verändert, wodurch es dann morgen fertig sein sollte.

Der Hintergrund mit dem spitzen Zulaufen hatte wohl zwei Gründe:
1. Die Funktion für die Berechnung hat immer auf die restliche Lademenge reagiert.
2. Die Ladefunktion eines Speichers schein zum Ende hin langsam abzuflachen.

Lange Rede kurzer Sinn, jetzt sieht es schon wesendlich gleichmäßiger aus.

Fortsetzung folgt...

EDIT:
2022.08.09 Leider habe ich mich zu früh gefreut :-( es sieht immer noch wie ein Flugzeugflügel aus.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 August 2022, 10:30:27
Hallo zusammen,
ich habe im Wiki mal wieder was ergänzt.
Externe Speichersteuerung Ladekontrolle (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Externe_Speichersteuerung_.28ExternControl.29)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 August 2022, 12:00:47
Moin,
falls Euch mal im WR_1_API Device die init Zählerstände verloren gegangen sind was Ihr z.B. an merkwürdigen Werten in der Tages- oder Monatsspalte merkt, dann könnt Ihr das wie folgt wieder herstellen.

In der Datenbank müsstet Ihr die Werte für Active_energy+ und Active_energy- vom Vormonat suchen.
Beim Jahreswechsel ist das auch der Wert für den Jahresanfang.

select TIMESTAMP,READING,VALUE from history
  where DEVICE='WR_0_KSEM' and READING='Active_energy-'
    and TIMESTAMP > last_day(date_sub(now(),interval 1 month))+ interval 1 day - interval 1 month
    and TIMESTAMP < last_day(date_sub(now(),interval 1 month))+ interval 1 day
  order by TIMESTAMP desc
  limit 1;
+---------------------+----------------+-------+
| TIMESTAMP           | READING        | VALUE |
+---------------------+----------------+-------+
| 2022-07-31 19:31:41 | Active_energy- | 25537 |
+---------------------+----------------+-------+


select TIMESTAMP,READING,VALUE from history
  where DEVICE='WR_0_KSEM' and READING='Active_energy+'
    and TIMESTAMP > last_day(date_sub(now(),interval 1 month))+ interval 1 day - interval 1 month
    and TIMESTAMP < last_day(date_sub(now(),interval 1 month))+ interval 1 day
  order by TIMESTAMP desc
  limit 1;
+---------------------+----------------+-------+
| TIMESTAMP           | READING        | VALUE |
+---------------------+----------------+-------+
| 2022-07-31 18:08:40 | Active_energy+ | 7468  |
+---------------------+----------------+-------+


In der FHEM Kommandozeile z.B. für den Monat

setreading WR_1_API SW_Meter_init_FeedInGrid_Month 25537
setreading WR_1_API SW_Meter_init_Grid_Month 7468


Das ganze wird im normalfall im PV_Schedule Device jeden Tag/Monat/Jahr automatisch gemacht.

Der Tageswert fällt oft gar nicht auf, da er ja am nächsten Tag dann schon wieder richtig gesetzt wurde.
Solltet Ihr das jedoch erst spät bemerken könntet Ihr alle davon abhängigen Werte auch in der Datenbank, mit etwas Rechenaufwand, manuell wieder korrigieren.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 August 2022, 10:07:26
Moin zusammen,
die Wetterlage lässt es gerade zu, weshalb ich mal wieder am Regen bin.
Ein virtueller Regensensor mit wetter.com und HTTPMOD (https://forum.fhem.de/index.php/topic,122508.0.html)
Das greift auf das Wetter RADAR zu und liefert sehr aktuell im 5 Minuten Raster Informationen zu Regenwolken :-)

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 August 2022, 10:49:17
Hey,
2023, was ändert sich? (https://www.photovoltaikforum.com/core/article/74-eeg-2023-was-%C3%A4ndert-sich/)
ich wollte mal wissen, wie oft die 70% Regelung bei meiner Anlage zuschlägt.

Dabei schaue ich mir jedoch zwei Werte an, da die Anlage ja auch noch eine Regelungs Hysterese hat.
Das Start Datum und die 70% als Leistung müsst Ihr natürlich noch selber ändern.

select * from history
  where  DEVICE='WR_1'
      and (   READING='Total_Active_P_EM' and VALUE < -13400
           or READING='P_limit_from_EVU' and VALUE < 100)
      and TIMESTAMP > '2022-07-01'
      and TIMESTAMP < '2022-08-01'
      and hour(TIMESTAMP) > 9
      and hour(TIMESTAMP) < 15
  order by TIMESTAMP;

select count('P_limit_from_EVU') AS Anzahl from history
  where  DEVICE='WR_1'
      and READING='P_limit_from_EVU'
      and VALUE < 100
      and TIMESTAMP > '2022-07-01'
      and TIMESTAMP < '2022-08-01'
      and hour(TIMESTAMP) > 9
      and hour(TIMESTAMP) < 15;
+--------+
| Anzahl |
+--------+
|     69 |
+--------+

Hierbei war der 26.07.2022 besonders auffällig, was an dem sehr wechselhaften Wetter gelegen haben muss. Trotz der Optimierung der Starkverbraucher und auch des Hausspeicherladens  in der Mittagszeit kam es an dem Tag von 11:30 bis 15:00 Uhr zu Abregelungen. Ab 14:00 Uhr war der Hausspeicher bereits voll.
Damit ist aber bald Schluss, dann geht es eher um "Peak Shaving", aber das verwendet ja die gleichen Mechanismen :-)

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 September 2022, 12:08:17
Hey Leute,
der Urlaub ist rum.
Ladet Eure BEVs, denn das Wetter wird schlechter :-)

VG, an alle die noch mitlesen
      Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 September 2022, 11:15:18
Puh, das ist ja mal super gelaufen :-)

- BEV auf 100%
- Wärmepumpe fertig
- Wirlpool auf 38 °C
- Die Heizung meldet sich auch kurz um 10:00 Uhr zu Wort :-(

und heute war am Übergang von der Speicher- zur PV-Leistung, um 7:43 noch genau 7 % SOC übrig.
Der Eigenverbrauch war gestern bei 95 %.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 28 September 2022, 20:35:08
Hi Christian,
Urlaub vorbei und alles läuft gut. Auch mein go-eCharger ladet den Niro schön mit Überschuss sofern es welchen gibt, wird jetzt halt immer weniger.
Wollte damit nur sagen dass ich immer noch schön dabei bin und für neues immer gerne bereit zum testen.
Super Arbeit von dir.  :)

VG
Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 September 2022, 08:25:18
Zitat von: zwölfgang am 28 September 2022, 20:35:08
Hi Christian,
Urlaub vorbei und alles läuft gut. Auch mein go-eCharger ladet den Niro schön mit Überschuss sofern es welchen gibt, wird jetzt halt immer weniger.
Wollte damit nur sagen dass ich immer noch schön dabei bin und für neues immer gerne bereit zum testen.
Super Arbeit von dir.  :)

VG
Wolfgang
Hallo Wolfgang,
vielen Dank, es ist schön mal zu hören, dass noch jemand Spaß an diesem Thread hat :-)
Ich arbeite immer mal wieder an der Steuerung der Verbraucher und stelle sie auf den DOIF Perl Modus um. Doch da habe ich keinen Überblick, ob das überhaupt jemand verwendet hat.
Beim e-Niro habe ich jetzt noch eine Vorwarnung für die Inspektion ins uiTable rein gebaut, damit ich den Kilometer Stand nicht verpasse. Der Hersteller ist da sehr pingelig, wenn man das Jahresintervall oder die 15000 km überschreiten würde. Da jetzt bei mir ein Jahr rum ist war ich bereits zur Wartung, das hat aber nun zur Folge, dass ich unter 30000 km schon wieder hin muss :-(

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: nisi80 am 06 Oktober 2022, 15:38:38
Hallöchen, aus Berlin!

Mein System läuft nun auch bereits seit einer Woche und ich versuche alle Komponenten in FHEM zu integrieren.

Vielen Dank an deine/eure super Arbeit!!!
Das hat mir sehr geholfen.

Ich habe nun jedoch 2 Punkte, die noch nicht wie gewünscht funktionieren:

  • Speicher
  • KSME

Ich habe einen BYD HVS am Plenticore und diesen per LAN an das Netzwerk angeschlossen.
Ich war auch schon mal per App und dem eigenen WLAN auf dem Speicher, jedoch wollte ich diesen auch gemäß der Definitionen einbinden. Leider gibt es hier einen Timeout beim Aufruf der referenzierten URL.
Bei einem Test mit curl kann ich das nachvollziehen, da hier keine Antwort zurück kommt.
Wenn man die reine Webadresse aufruft, kommt eine BasicAuth mit Username und Passwort.
Laut der anderen Foren kommt man per LAN ja nur auf den Ser2Net-Adapter um dort dessen Einstellungen ändern zu können.

--> Funktioniert der HVM-Speicher mit der HTTPMOD-Abfrage oder ist mein Speicher nicht unterstützt?

Der KSME kann leider nicht abgefragt werden.
FHEM versucht es immer wieder, scheitert aber scheinbar an der Anmeldung.
Wie kann ich hier korrekt das Passwort für den hoffentlich identischen User "user" hinterlegen?

Vielen Dank!

VG Denis
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Oktober 2022, 16:50:08
Hallo Denis

Zitat von: nisi80 am 06 Oktober 2022, 15:38:38
Ich habe einen BYD HVS am Plenticore und diesen per LAN an das Netzwerk angeschlossen.
Ich war auch schon mal per App und dem eigenen WLAN auf dem Speicher, jedoch wollte ich diesen auch gemäß der Definitionen einbinden. Leider gibt es hier einen Timeout beim Aufruf der referenzierten URL.
Bei einem Test mit curl kann ich das nachvollziehen, da hier keine Antwort zurück kommt.
Wenn man die reine Webadresse aufruft, kommt eine BasicAuth mit Username und Passwort.
Laut der anderen Foren kommt man per LAN ja nur auf den Ser2Net-Adapter um dort dessen Einstellungen ändern zu können.

--> Funktioniert der HVM-Speicher mit der HTTPMOD-Abfrage oder ist mein Speicher nicht unterstützt?
Der neuere BYD HVS kann nicht per HTTPMOD abgefragt werden, das geht nur beim BYD HV.
Es ist aber auch nicht wirklich notwendig, da die Steuerung durch den WR vorgenommen wird.
Solltest Du den BYD HVS selber über den Browser abfragen können, dann könnte man das auch mit dem HTTPMOD Modul nachbilden.

Zitat von: nisi80 am 06 Oktober 2022, 15:38:38
Der KSEM kann leider nicht abgefragt werden.
FHEM versucht es immer wieder, scheitert aber scheinbar an der Anmeldung.
Wie kann ich hier korrekt das Passwort für den hoffentlich identischen User "user" hinterlegen?
Bei dem KSEM musst Du ModBus aktivieren, das läuft dann ohne Passwort.

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: nisi80 am 06 Oktober 2022, 18:55:28
Vielen Dank, der Slave-Schalter war es!!!!
Nun ist das KSEM-Device aktiv und bekommt die Daten.

Jetzt frage ich noch die Daten meines zweiten und dritten WRs ab (Piko MP Plus), leider per HTTPMOD auf 2 XML-Dateien und hoffe, dass die Werte des Plneticore durch die Werte des KSEM korrekt sind.

Das mit dem Speicher habe ich mir schon gedacht!
Ich dachte nur, dass man eventuell die einzelnen Zellen Monitoren könnte und bei auffälligen Veränderungen der Spannungen und Temperaturen entsprechend reagieren kann.

VG Denis
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Oktober 2022, 19:16:06
Zitat von: nisi80 am 06 Oktober 2022, 18:55:28
Vielen Dank, der Slave-Schalter war es!!!!
Nun ist das KSEM-Device aktiv und bekommt die Daten.

Jetzt frage ich noch die Daten meines zweiten und dritten WRs ab (Piko MP Plus), leider per HTTPMOD auf 2 XML-Dateien und hoffe, dass die Werte des Plneticore durch die Werte des KSEM korrekt sind.
Ich meine ein anderer Nutzer hätte das für den Piko IQ auch mit ModBus verwenden können. Das ist die selbe Firmware Datei.
Wenn Du ein Device für den Piko MP Plus baust und den selben Namensstandard verwendest könnten wir das im Wiki mit aufnehmen.
Mein Konstrukt ist bisher nur für zwei WR vorbereitet, lässt sich aber in den userreadings einfach erweitern.
Die SW_* redings sind dann für den Schwarm gedacht und die Steuerungen wären somit kompatiebel.

Mit der jetzigen Firmware des KSEM 2.0.0 kann der Plenticore noch nicht die richtigen Werte anzeigen. Der KSEM zeigt zwar den Hausverbrauch jetzt an, sendet ihn aber noch nicht per ModBus. Das wird bei Kostal wohl noch etwas dauern. Wenn das dann später läuft werde ich die FHEM Devices entsprechend anpassen. Jetzt ist es ein work around :-)

Zitat
Das mit dem Speicher habe ich mir schon gedacht!
Ich dachte nur, dass man eventuell die einzelnen Zellen Monitoren könnte und bei auffälligen Veränderungen der Spannungen und Temperaturen entsprechend reagieren kann.
Das war mein Grundgedanke dabei, leider kann ich nur den ersten Block abfragen, da der interne Web Server etwas störrisch ist.
Somit werde ich in einigen Jahren ein Ticket bei EFT aufmachen, dann sollen die das prüfen :-)

Momentan arbeite ich noch an den Verbraucher Devices, die ich vom DOIF FHEM Modus zum DOIF Perl Modus umbaue. Wenn da interesse besteht melde Dich, da die noch nicht im Wiki sind.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: nisi80 am 07 Oktober 2022, 14:02:23
Hallo Christian,

kann ich gern versuchen, leider kann ich nach einem ersten Telnet-Versuch mit dem Piko MP sagen, dass der den Port 1502 nicht offen hat. Wenn ich das beim Plenticore versuche, kommt wenigstens ein Prompt, der dann bei Eingabe eines Zeichens abbricht.

Aktuell frage ich folgende Dateien per HTTPMOD ab und werte die KeyValue-Pärchen aus:
http://192.168.xxx.xxx/measurements.xml
<?xml version='1.0' encoding='UTF-8'?>
<root>
<Device Name='PIKO 3.6-1 MP plus' Type='Inverter' Platform='Net16' HmiPlatform='HMI17' NominalPower='3600' UserPowerLimit='nan' CountryPowerLimit='nan' Serial='######' OEMSerial='####' BusAddress='1' NetBiosName='####' WebPortal='PIKO Solar Portal' ManufacturerURL='kostal-solar-electric.com' IpAddress='192.168.xxx.xxx' DateTime='2022-10-07T13:45:46' MilliSeconds='288'>
<Measurements>
<Measurement Value='237.3' Unit='V' Type='AC_Voltage'/>
<Measurement Value='1.953' Unit='A' Type='AC_Current'/>
<Measurement Value='463.3' Unit='W' Type='AC_Power'/>
<Measurement Value='463.1' Unit='W' Type='AC_Power_fast'/>
<Measurement Value='49.993' Unit='Hz' Type='AC_Frequency'/>
<Measurement Value='172.6' Unit='V' Type='DC_Voltage'/>
<Measurement Value='2.937' Unit='A' Type='DC_Current'/>
<Measurement Value='345.5' Unit='V' Type='LINK_Voltage'/>
<Measurement Unit='W' Type='GridPower'/>
<Measurement Unit='W' Type='GridConsumedPower'/>
<Measurement Unit='W' Type='GridInjectedPower'/>
<Measurement Unit='W' Type='OwnConsumedPower'/>
<Measurement Value='100.0' Unit='%' Type='Derating'/>
</Measurements>
</Device>
</root>


http://192.168.xxx.xxx/yields.xml
<?xml version='1.0' encoding='UTF-8'?>
<root>
<Device Name='PIKO 3.6-1 MP plus' Type='Inverter' Platform='Net16' HmiPlatform='HMI17' NominalPower='3600' UserPowerLimit='nan' CountryPowerLimit='nan' Serial='#####' OEMSerial='####' BusAddress='1' NetBiosName='###' WebPortal='PIKO Solar Portal' ManufacturerURL='kostal-solar-electric.com' IpAddress='192.168.xxx.xxx' DateTime='2022-10-07T13:48:34' MilliSeconds='467'>
<Yields>
<Yield Type='Produced' Slot='Total' Unit='Wh'>
<YieldValue Value='10581' TimeStamp='2021-04-27T19:00:00'/>
</Yield>
</Yields>
</Device>
</root>


Ich rechne nun, wie von dem User, der das Define im Forum gepostet hat, per statistics-Modul die Yield-Werte für den Tag, Monat und Jahr aus.
Dann habe ich deine UserReadings entsprechend umbenannt, da ein benennen der Statistiken ja nicht möglich ist. Das könnte man aber wiederum mit UserReadings erschlagen.

Ich würde diese HTTPMODs dann entsprechend definieren und hier einmal posten.

PS: könntet ihr das Einstellen der Modus-Slave-Funktion im Wiki ergänzen? Wenn ich drüber gestolpert bin, dann eventuell auch andere  :D
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Oktober 2022, 15:39:08
Zitat von: nisi80 am 07 Oktober 2022, 14:02:23
PS: könntet ihr das Einstellen der Modus-Slave-Funktion im Wiki ergänzen? Wenn ich drüber gestolpert bin, dann eventuell auch andere  :D
Das kann ich machen.
EDIT: Erledigt :-)

Die Ausgaben von Deinem WR Model habe ich bisher noch nicht gesehen. Da kann ich nichts zu sagen.
Der Plenticore liefert ja schon von sich aus die ganzen Statistiken, da kann man die bei mehreren entsprechend verrechnen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Oktober 2022, 18:09:23
Zitat von: nisi80 am 07 Oktober 2022, 14:02:23
Aktuell frage ich folgende Dateien per HTTPMOD ab und werte die KeyValue-Pärchen aus:
http://192.168.xxx.xxx/measurements.xml

http://192.168.xxx.xxx/yields.xml

Ich rechne nun, wie von dem User, der das Define im Forum gepostet hat, per statistics-Modul die Yield-Werte für den Tag, Monat und Jahr aus.
Dann habe ich deine UserReadings entsprechend umbenannt, da ein benennen der Statistiken ja nicht möglich ist. Das könnte man aber wiederum mit UserReadings erschlagen.

Ich würde diese HTTPMODs dann entsprechend definieren und hier einmal posten.
Hier habe ich noch was zu HTTPMOD XMF File gefunden (https://forum.fhem.de/index.php/topic,107395.0.html)
Damit solltest Du die readings aus dem XML File und direkt nach meiner Benennung ins Device bekommen.
Es sollte dann dem WR_2 Slave angepasst sein. Fehlende Statistiken könnte man im zweiten Schritt im Device dann zusätzlich ablegen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: nisi80 am 09 Oktober 2022, 14:15:01
Hallo, anbei meine WR_2 Definition, die ich dann so auch für den WR_3 übernehmen werde:


defmod WR_2 HTTPMOD http://192.168.xxx.xxx/measurements.xml 10
attr WR_2 group Wechselrichter
attr WR_2 icon measure_photovoltaic_inst
attr WR_2 reading1Name AC_Power
attr WR_2 reading1Regex Measurement Value='(-?\d*\.?\d*)' Unit='W' Type='AC_Power'
attr WR_2 reading2Name DC_Voltage
attr WR_2 reading2Regex Measurement Value='(-?\d*\.?\d*)' Unit='V' Type='DC_Voltage'
attr WR_2 reading3Name DC_Current
attr WR_2 reading3Regex Measurement Value='(-?\d*\.?\d*)' Unit='A' Type='DC_Current'
attr WR_2 reading4Name AC_Power_fast
attr WR_2 reading4Regex Measurement Value='(-?\d*\.?\d*)' Unit='W' Type='AC_Power_fast'
attr WR_2 reading5Name AC_Frequency
attr WR_2 reading5Regex Measurement Value='(-?\d*\.?\d*)' Unit='Hz' Type='AC_Frequency'
attr WR_2 reading6Name AC_Current
attr WR_2 reading6Regex Measurement Value='(-?\d*\.?\d*)' Unit='A' Type='AC_Current'
attr WR_2 reading7Name AC_Voltage
attr WR_2 reading7Regex Measurement Value='(-?\d*\.?\d*)' Unit='V' Type='AC_Voltage'
attr WR_2 room Strom->Photovoltaik
attr WR_2 stateFormat AC_Power W
attr WR_2 userReadings Inverter_Generation_P_Actual:AC_Power.* {round(ReadingsVal($NAME,"AC_Power",0),0);;},\
Total_AC_Active_P:AC_Power.* {round(ReadingsVal($NAME,"AC_Power",0),0);;},\
Total_DC_P:[DC_Current|DC_Voltage].* {round((ReadingsVal($NAME,"DC_Current",0)*(ReadingsVal($NAME,"DC_Voltage",0))),0);;},\
Total_DC_P_sumOfAllPVInputs:Total_DC_P.* {ReadingsVal($NAME,"Total_DC_P",0)},\
Daily_yield:AC_Power.* {ReadingsVal("WR_2_yields","statYieldValueDay",0)},\
Monthly_yield:AC_Power.* {ReadingsVal("WR_2_yields","statYieldValueMonth",0)},\
Yearly_yield:AC_Power.* {ReadingsVal("WR_2_yields","statYieldValueYear",0)},\
Total_yield:AC_Power.* {ReadingsVal("WR_2_yields","YieldValue",0)},\
Total_DC_Energy_From_PV1:AC_Power.* {ReadingsVal("WR_2_yields","YieldValue",0)},\
Total_DC_PV_Energy_sumOfAllPVInputs:AC_Power.* {ReadingsVal("WR_2_yields","YieldValue",0)}


Dazu kommt noch ein Yield-Device:


defmod WR_2_yields HTTPMOD http://192.168.xxx.xxx/yields.xml 60
attr WR_2_yields event-on-change-reading Ertrag_PV
attr WR_2_yields group Helferfunktionen
attr WdR_2_yields icon measure_photovoltaic_inst
attr WR_2_yields reading1Name YieldValue
attr WR_2_yields reading1Regex YieldValue Value='(-?\d*)'
attr WR_2_yields room Strom->Photovoltaik
attr WR_2_yields stateFormat {my $PVDay = ReadingsVal($name,"statYieldValueDay",0)/1000;;\
my $PVMonth = ReadingsVal($name,"statYieldValueMonth",0)/1000;;\
my $PVYear = ReadingsVal($name,"statYieldValueYear",0)/1000;;\
my $PVTotal = ReadingsVal($name,"YieldValue",0)/1000;;\
"Erträge: ".$PVDay."kW/h Tag / ".$PVMonth."kW/h Monat / ".$PVYear."kW/h Jahr / ".$PVTotal."kW/h Gesamt"\
}
attr WR_2_yields userReadings Total_DC_Energy_From_PV1:YieldValue.* {ReadingsVal($name,"YieldValue",0)}
attr WR_2_yields verbose 0


Und eines, welches die Statistiken erzeugt:


defmode stat_WR_2 statistics WR_2_yields
attr stat_WR_2 deltaReadings YieldValue
attr stat_WR_2 group Helferfunktionen
attr stat_WR_2 room Strom->Photovoltaik
attr stat_WR_2 singularReadings WR_2_yields:YieldValue:Delta:Day|WR_2_yields:YieldValue:Delta:Month|WR_2_yields:YieldValue:Delta:Year


Dazu habe ich die Userreadings deines WR_1 abgeändert, dass dieser noch einen dritten WR in die Auswertung mit einbezieht:


attr WR_1 userReadings Total_PV_P_reserve:Total_DC_P.* {my $reserve = ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0) * 0.90 - ReadingsVal($NAME,"Home_own_consumption_from_PV",0);;;; ($reserve lt 0)? 0 : round($reserve,0)  },\
\
Actual_Battery_charge_-minus_or_discharge_-plus_P:[Battery_voltage|Actual_Battery_charge_-minus_or_discharge_-plus_I].* {round((ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I",0)*ReadingsVal($NAME,"Battery_voltage",0)),0)},\
\
Total_DC_P_Max:[Total_DC_P_sumOfAllPVInputs|Actual_Battery_charge_-minus_or_discharge_-plus_P].* { my $Bat_P = ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_P",0);;;; ($Bat_P gt 0)? round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0) + $Bat_P,0) : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) },\
\
Actual_Battery_charge_usable_P:[Act_state_of_charge|Battery_MinSOC].* {my $x = (ReadingsVal($NAME,"Battery_work_capacity",0)*(ReadingsVal($NAME,"Act_state_of_charge",0)-ReadingsVal($NAME,"Battery_MinSOC",0))/100);;;; ($x lt 0)? 0 : round($x,0) },\
\
SW_Inverter_Generation_P_Actual:Inverter_Generation_P_Actual.* {round(ReadingsVal($NAME,"Inverter_Generation_P_Actual",0)+ReadingsVal("WR_2","Inverter_Generation_P_Actual",0)+ReadingsVal("WR_3","Inverter_Generation_P_Actual",0),0)},\
\
SW_Home_own_consumption:[Total_Active_P_EM:|Total_AC_Active_P:].* {round(ReadingsVal($NAME,"Total_Active_P_EM",0)+ReadingsVal($NAME,"Total_AC_Active_P",0),0)},\
SW_Total_AC_Active_P:Total_AC_Active_P:.*  {round(ReadingsVal($NAME,"Total_AC_Active_P",0),0)+ReadingsVal("WR_2","Total_AC_Active_P",0)+ReadingsVal("WR_3","Total_AC_Active_P",0)},\
\
SW_Total_Active_P_EM:Total_Active_P_EM:.* {round(ReadingsVal($NAME,"Total_Active_P_EM",0),0)},\
\
SW_Total_DC_P:Total_DC_P:.* {round(ReadingsVal($NAME,"Total_DC_P",0)+ReadingsVal("WR_2","Total_DC_P",0)+ReadingsVal("WR_3","Total_DC_P",0),0) },\
\
SW_Total_DC_P_sumOfAllPVInputs:Total_DC_P_sumOfAllPVInputs.* {round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0)+ReadingsVal("WR_2","Total_DC_P_sumOfAllPVInputs",0)+ReadingsVal("WR_3","Total_DC_P_sumOfAllPVInputs",0),0) },\
\
SW_Total_PV_P_reserve:SW_Total_DC_P_sumOfAllPVInputs.* {my $reserve = ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0) * 0.90 - ReadingsVal($NAME,"SW_Home_own_consumption",0);;;; ($reserve lt 0)? 0 : round($reserve,0)  },\
\
SW_Total_DC_P_Max:SW_Total_DC_P_sumOfAllPVInputs.* { my $Bat_out = (ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I",0)*ReadingsVal($NAME,"Battery_voltage",0));;;; ($Bat_out gt 0)? round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0) + $Bat_out,0) : round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0),0) },\
\
SW_Yield_Daily:Daily_yield.* { round(ReadingsVal($NAME,"Daily_yield",0)+ReadingsVal("WR_2","Daily_yield",0)+ReadingsVal("WR_3","Daily_yield",0),0) },\
SW_Yield_Monthly:Monthly_yield.* { round(ReadingsVal($NAME,"Monthly_yield",0)+ReadingsVal("WR_2","Monthly_yield",0)+ReadingsVal("WR_3","Monthly_yield",0),0) },\
SW_Yield_Yearly:Yearly_yield.* { round(ReadingsVal($NAME,"Yearly_yield",0)+ReadingsVal("WR_2","Yearly_yield",0)+ReadingsVal("WR_3","Yearly_yield",0),0) },\
SW_Yield_Total:Total_yield.* monotonic { round(ReadingsVal($NAME,"Total_yield",0)+ReadingsVal("WR_2","Total_yield",0)+ReadingsVal("WR_3","Total_yield",0),0) },\
\
SW_Home_own_consumption_from_PV:[Total_Active_P_EM|SW_Home_own_consumption:|Home_own_consumption_from_grid|Home_own_consumption_from_Battery].* { (ReadingsVal($NAME,"Total_Active_P_EM",0) ge 0) ? ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_grid",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) :  ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0);;;; },\
\
SW_Home_own_consumption_from_Battery:[SW_Home_own_consumption_from_PV|Home_own_consumption_from_Battery].* { ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) },\
SW_Home_own_consumption_from_grid:[SW_Home_own_consumption_from_PV|Home_own_consumption_from_grid].* { ReadingsVal($NAME,"Home_own_consumption_from_grid",0) },\
\
\
SW_Battery_Total_AC_ChargeEnergy_ACsideToBattery:Battery_Total_AC_ChargeEnergy_ACsideToBattery.* monotonic { round(ReadingsVal($NAME,"Battery_Total_AC_ChargeEnergy_ACsideToBattery",0),0) },\
SW_Battery_Total_AC_ChargeEnergy_gridToBattery:Battery_Total_AC_ChargeEnergy_gridToBattery.* monotonic { round(ReadingsVal($NAME,"Battery_Total_AC_ChargeEnergy_gridToBattery",0),0) },\
SW_Battery_Total_AC_DischargeEnergy_BatteryToGrid:Battery_Total_AC_DischargeEnergy_BatteryToGrid.* monotonic { round(ReadingsVal($NAME,"Battery_Total_AC_DischargeEnergy_BatteryToGrid",0),0) },\
SW_Battery_Total_DC_ChargeEnergy_DCsideToBattery:Battery_Total_DC_ChargeEnergy_DCsideToBattery.* monotonic { round(ReadingsVal($NAME,"Battery_Total_DC_ChargeEnergy_DCsideToBattery",0),0) },\
SW_Battery_Total_DC_DischargeEnergy_DCsideFromBattery:Battery_Total_DC_DischargeEnergy_DCsideFromBattery.* monotonic { round(ReadingsVal($NAME,"Battery_Total_DC_DischargeEnergy_DCsideFromBattery",0),0) },\
\
SW_Total_AC_Energy_ACsideToGrid:Total_AC_Energy_ACsideToGrid.* monotonic { round(ReadingsVal($NAME,"Total_AC_Energy_ACsideToGrid",0)+ReadingsVal("WR_2","Total_AC_Energy_ACsideToGrid",0)+ReadingsVal("WR_3","Total_AC_Energy_ACsideToGrid",0),0) },\
\
SW_Total_DC_Energy_From_PV1:Total_DC_Energy_From_PV1.* monotonic { round(ReadingsVal($NAME,"Total_DC_Energy_From_PV1",0),0) },\
SW_Total_DC_Energy_From_PV2:Total_DC_Energy_From_PV2.* monotonic { round(ReadingsVal($NAME,"Total_DC_Energy_From_PV2",0),0) },\
SW_Total_DC_Energy_From_PV3:Total_DC_Energy_From_PV3.* monotonic { round(ReadingsVal($NAME,"Total_DC_Energy_From_PV3",0),0) },\\
SW_Total_DC_Energy_From_PV4:Total_DC_Energy_From_PV1.* monotonic { round(ReadingsVal("WR_2","Total_DC_Energy_From_PV1",0),0) },\\
\
SW_Total_DC_PV_Energy_sumOfAllPVInputs:Total_DC_PV_Energy_sumOfAllPVInputs.* monotonic { round(ReadingsVal($NAME,"Total_DC_PV_Energy_sumOfAllPVInputs",0)+ReadingsVal("WR_2","Total_DC_PV_Energy_sumOfAllPVInputs",0)+ReadingsVal("WR_3","Total_DC_PV_Energy_sumOfAllPVInputs",0),0) },\
SW_Total_home_consumption_Battery:Total_home_consumption_Battery.* monotonic { round(ReadingsVal($NAME,"Total_home_consumption_Battery",0),0) },\
SW_Total_home_consumption_Grid:Total_home_consumption_Grid.* monotonic { round(ReadingsVal($NAME,"Total_home_consumption_Grid",0),0) },\
SW_Total_home_consumption_PV:Total_home_consumption_PV.* monotonic { round(ReadingsVal($NAME,"Total_home_consumption_PV",0),0) }\


PS: warum wird bei mir, wenn die Auth_me Funktion aufgerufen wird, mein User im Webportal des Plenticore gesperrt und ich muss ein neues Passwort mit dem Masterkey erzeugen? Ist das bei euch auch so, oder habe ich hier einen Fehler?

VG Denis
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 Oktober 2022, 17:05:01
Zitat von: nisi80 am 09 Oktober 2022, 14:15:01
Hallo, anbei meine WR_2 Definition, die ich dann so auch für den WR_3 übernehmen werde:


defmod WR_2 HTTPMOD http://192.168.xxx.xxx/measurements.xml 10
attr WR_2 group Wechselrichter
attr WR_2 icon measure_photovoltaic_inst
attr WR_2 reading1Name AC_Power
attr WR_2 reading1Regex Measurement Value='(-?\d*\.?\d*)' Unit='W' Type='AC_Power'
attr WR_2 reading2Name DC_Voltage
attr WR_2 reading2Regex Measurement Value='(-?\d*\.?\d*)' Unit='V' Type='DC_Voltage'
attr WR_2 reading3Name DC_Current
attr WR_2 reading3Regex Measurement Value='(-?\d*\.?\d*)' Unit='A' Type='DC_Current'
attr WR_2 reading4Name AC_Power_fast
attr WR_2 reading4Regex Measurement Value='(-?\d*\.?\d*)' Unit='W' Type='AC_Power_fast'
attr WR_2 reading5Name AC_Frequency
attr WR_2 reading5Regex Measurement Value='(-?\d*\.?\d*)' Unit='Hz' Type='AC_Frequency'
attr WR_2 reading6Name AC_Current
attr WR_2 reading6Regex Measurement Value='(-?\d*\.?\d*)' Unit='A' Type='AC_Current'
attr WR_2 reading7Name AC_Voltage
attr WR_2 reading7Regex Measurement Value='(-?\d*\.?\d*)' Unit='V' Type='AC_Voltage'


Hallo Denis,
ich fände es toll, wenn Du versuchen würdest die Namen der readings noch an die bestehenden Namen anzupassen. Das führt ansonsten zu Verwirrungen und Inkonsistenzen.

Als Beispiele

AC_Power = P_AC
DC_Voltage = V_DC
AC_Current = I_AC

Das mag am Anfang etwas unverständlich sein, ist aber später in der Datenbank und bei Berechnungen übersichtlicher.
Ich hatte auch mit den Langnamen begonnen und mich stark an die Vorgaben von Kostal gehalten, jedoch wurde das sehr
schnell unübersichtlich und bei Abfragen in der Datenbank ziemlich länglich.

Wenn wir das auch ind Wiki aufnehmen möchten, sollte es aussehen wie aus einem Guss, da ansonsten jede Menge Fragen auftauchen werden.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: nisi80 am 10 Oktober 2022, 10:22:47
Hallo Christian,

anbei die korrigierten Benennungen, mit der Hoffnung, dass diese übereinstimmen:

defmod WR_2 HTTPMOD http://192.168.xxx.xxx/measurements.xml 10
attr WR_2 group Wechselrichter
attr WR_2 icon measure_photovoltaic_inst
attr WR_2 reading1Name P_AC
attr WR_2 reading1Regex Measurement Value='(-?\d*\.?\d*)' Unit='W' Type='AC_Power'
attr WR_2 reading2Name U_DC1
attr WR_2 reading2Regex Measurement Value='(-?\d*\.?\d*)' Unit='V' Type='DC_Voltage'
attr WR_2 reading3Name I_DC1
attr WR_2 reading3Regex Measurement Value='(-?\d*\.?\d*)' Unit='A' Type='DC_Current'
attr WR_2 reading4Name AC_Power_fast
attr WR_2 reading4Regex Measurement Value='(-?\d*\.?\d*)' Unit='W' Type='AC_Power_fast'
attr WR_2 reading5Name Frequency_EM
attr WR_2 reading5Regex Measurement Value='(-?\d*\.?\d*)' Unit='Hz' Type='AC_Frequency'
attr WR_2 reading6Name I_L1
attr WR_2 reading6Regex Measurement Value='(-?\d*\.?\d*)' Unit='A' Type='AC_Current'
attr WR_2 reading7Name U_L1
attr WR_2 reading7Regex Measurement Value='(-?\d*\.?\d*)' Unit='V' Type='AC_Voltage'
attr WR_2 room Strom->Photovoltaik
attr WR_2 stateFormat P_AC W
attr WR_2 userReadings Inverter_Generation_P_Actual:AC_Power.* {round(ReadingsVal($NAME,"P_AC",0),0);;},\
Total_AC_Active_P:AC_Power.* {round(ReadingsVal($NAME,"P_AC",0),0);;},\
Total_DC_P:[I_DC1|U_DC1].* {round((ReadingsVal($NAME,"I_DC1",0)*(ReadingsVal($NAME,"U_DC1",0))),0);;},\
Total_DC_P_sumOfAllPVInputs:Total_DC_P.* {ReadingsVal($NAME,"Total_DC_P",0)},\
Daily_yield:P_AC.* {ReadingsVal("WR_2_yields","statYieldValueDay",0)},\
Monthly_yield:P_AC.* {ReadingsVal("WR_2_yields","statYieldValueMonth",0)},\
Yearly_yield:P_AC.* {ReadingsVal("WR_2_yields","statYieldValueYear",0)},\
Total_yield:P_AC.* {ReadingsVal("WR_2_yields","YieldValue",0)},\
Total_DC_Energy_From_PV1:P_AC.* {ReadingsVal("WR_2_yields","YieldValue",0)},\
Total_DC_PV_Energy_sumOfAllPVInputs:P_AC.* {ReadingsVal("WR_2_yields","YieldValue",0)}


VG Denis
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Oktober 2022, 11:07:55
Zitat von: nisi80 am 10 Oktober 2022, 10:22:47
Hallo Christian,

anbei die korrigierten Benennungen, mit der Hoffnung, dass diese übereinstimmen:

defmod WR_2 HTTPMOD http://192.168.xxx.xxx/measurements.xml 10
attr WR_2 group Wechselrichter
attr WR_2 icon measure_photovoltaic_inst
attr WR_2 reading1Name P_AC
attr WR_2 reading1Regex Measurement Value='(-?\d*\.?\d*)' Unit='W' Type='AC_Power'
attr WR_2 reading2Name U_DC1
attr WR_2 reading2Regex Measurement Value='(-?\d*\.?\d*)' Unit='V' Type='DC_Voltage'
attr WR_2 reading3Name I_DC1
attr WR_2 reading3Regex Measurement Value='(-?\d*\.?\d*)' Unit='A' Type='DC_Current'
attr WR_2 reading4Name AC_Power_fast
attr WR_2 reading4Regex Measurement Value='(-?\d*\.?\d*)' Unit='W' Type='AC_Power_fast'
attr WR_2 reading5Name Frequency_EM
attr WR_2 reading5Regex Measurement Value='(-?\d*\.?\d*)' Unit='Hz' Type='AC_Frequency'
attr WR_2 reading6Name I_L1
attr WR_2 reading6Regex Measurement Value='(-?\d*\.?\d*)' Unit='A' Type='AC_Current'
attr WR_2 reading7Name U_L1
attr WR_2 reading7Regex Measurement Value='(-?\d*\.?\d*)' Unit='V' Type='AC_Voltage'
attr WR_2 room Strom->Photovoltaik
attr WR_2 stateFormat AC_Power W
attr WR_2 userReadings Inverter_Generation_P_Actual:AC_Power.* {round(ReadingsVal($NAME,"P_AC",0),0);;},\
Total_AC_Active_P:AC_Power.* {round(ReadingsVal($NAME,"P_AC",0),0);;},\
Total_DC_P:[I_DC1|U_DC1].* {round((ReadingsVal($NAME,"I_DC1",0)*(ReadingsVal($NAME,"U_DC1",0))),0);;},\
Total_DC_P_sumOfAllPVInputs:Total_DC_P.* {ReadingsVal($NAME,"Total_DC_P",0)},\
Daily_yield:AC_Power.* {ReadingsVal("WR_2_yields","statYieldValueDay",0)},\
Monthly_yield:AC_Power.* {ReadingsVal("WR_2_yields","statYieldValueMonth",0)},\
Yearly_yield:AC_Power.* {ReadingsVal("WR_2_yields","statYieldValueYear",0)},\
Total_yield:AC_Power.* {ReadingsVal("WR_2_yields","YieldValue",0)},\
Total_DC_Energy_From_PV1:AC_Power.* {ReadingsVal("WR_2_yields","YieldValue",0)},\
Total_DC_PV_Energy_sumOfAllPVInputs:AC_Power.* {ReadingsVal("WR_2_yields","YieldValue",0)}


VG Denis
Hallo Denis,
das sieht doch schon gut aus :-)

Frequency_EM = Grid_frequency
Im userreading ist noch AC_Power als Trigger verwendet.
Auch der Trigger Total_DC_P.* scheint bei Dir nicht vorhanden zu sein.

Da Du für den WR zwei XML Abfragen hast könntest Du diese in einem HTTPMOD eintragen und dort auch als folge aneinander ketten. Dann wird es ein gemeinsames Device mit den yield Abfragen. Dafür gibt es ein Attribut get*FollowGet und Du sparst Dir das WR_2_yields Device, was den Zusammenhang besser deutlich macht.

EDIT: Ein Abfrage Intervall von 10 Sekunden ist bei mir bisher nicht notwendig gewesen, da hättest Du nur die x Fache Menge an Daten, jedoch keinen wirklichen Nutzen daraus.
EDIT: Achtung, das hier "Total_DC_P_sumOfAllPVInputs:Total_DC_P.*" könnte zu einem Loop führen, bitte teste das besser mal genauer, da Total_DC_P_sumOfAllPVInputs auch ein Event auslöst und auch in die Maske passt.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Oktober 2022, 12:03:42
Zitat von: nisi80 am 09 Oktober 2022, 14:15:01
PS: warum wird bei mir, wenn die Auth_me Funktion aufgerufen wird, mein User im Webportal des Plenticore gesperrt und ich muss ein neues Passwort mit dem Masterkey erzeugen? Ist das bei euch auch so, oder habe ich hier einen Fehler?
Hallo Denis,
dass passiert eigentlich nur, wenn über kurze Zeit mehrfach das Passwort falsch gewesen ist.
Ich setze bei mir das Passwort immer gleich dem Code auf dem Geräte Aufkleber.
VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: nisi80 am 11 Oktober 2022, 10:07:27
Vielen Dank für den Hinweis!
Nach einem erneuten Setzen des Passwortes war auch das Flag für authenticated in den Readings TRUE.
Jetzt bleibt der Nutzer erhalten.

Super!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: nisi80 am 11 Oktober 2022, 16:01:24
Nun ist mir aufgefallen, dass die Werte der drei Spalten 2 (heute), 3 (Monat) und 4 (Jahr) im WR_1_API nicht aktualisiert werden.
Hier wird ja der Timestamp z.B. des Autarkie per Tag Wertes ausgelesen und der steht bei mir aktuell immer noch auf dem 6.10.2022.

Alle SW_Statistic_EnergyHome* Readings werden nicht geupdatet.

Ich habe die URL, die hinter der Funktion liegt auch einmal per curl aufgerufen:
curl http://192.168.xxx.xxx/api/v1/processdata/scb:statistic:EnergyFlow
Und es kommt als Antwort:
[{"processdata":[],"moduleid":"scb:statistic:EnergyFlow"}]
Das heißt, die Statistiken werden im Plenticore berechnet und dann abgerufen oder übermittelt?

Jedenfalls hat es ja am 6.10. schon mal funktioniert, aber seitdem nicht mehr.

Könnt ihr mir helfen herauszufinden, was hier das Problem ist?
Eingeloggt ist der User jetzt und der Account wird auch nicht mehr gesperrt.

Vielen Dank!
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Oktober 2022, 18:16:24
Zitat von: nisi80 am 11 Oktober 2022, 16:01:24
Nun ist mir aufgefallen, dass die Werte der drei Spalten 2 (heute), 3 (Monat) und 4 (Jahr) im WR_1_API nicht aktualisiert werden.
Hier wird ja der Timestamp z.B. des Autarkie per Tag Wertes ausgelesen und der steht bei mir aktuell immer noch auf dem 6.10.2022.

Alle SW_Statistic_EnergyHome* Readings werden nicht geupdatet.

Ich habe die URL, die hinter der Funktion liegt auch einmal per curl aufgerufen:
curl http://192.168.xxx.xxx/api/v1/processdata/scb:statistic:EnergyFlow
Und es kommt als Antwort:
[{"processdata":[],"moduleid":"scb:statistic:EnergyFlow"}]
Das heißt, die Statistiken werden im Plenticore berechnet und dann abgerufen oder übermittelt?

Jedenfalls hat es ja am 6.10. schon mal funktioniert, aber seitdem nicht mehr.

Könnt ihr mir helfen herauszufinden, was hier das Problem ist?
Eingeloggt ist der User jetzt und der Account wird auch nicht mehr gesperrt.

Vielen Dank!
Hallo,

mit curl geht das nicht, da curl sich nicht am WR anmeldet.
Wenn Du das im WR_1_API unter get startest, dann sollte die Antwort, nach einem Browser refresh, im httpbody zu sehen sein.

VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Oktober 2022, 18:55:44
Hallo zusammen,
durch eine Anfrage von Dio habe ich mich mit der Battery_TimeControl nun weiter beschäftigt.

Beim set hat man nun die Möglichkeit
-  jeden Battery_TimeControl Tag separat zu setzen
-  jeder Tag wird hierbei in Stunden Blöcken innerhalb eines readings angezeigt
-  beim set kann man [0-2] auswählen, was dann wiederum einheitlich 96 mal geschrieben wird
-  Die Tage sind mit der Nummerierung im FHEM von [0-6] durchnummeriert, damit sie erstens sortiert sind
   und zweitens aus Funktionen direkt addressiert werden können (Regex)
-  Es ist im set ein Text auszuwählen, was dann versucht ein reading zu diesem Tag zu lesen
   ist das reading nicht vorhanden wird wiederum 96 mal 0 geschrieben, was einem abschalten innerhalb des Gerätes gleich kommt.

   Battery_TimeControl_0_So 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
   Battery_TimeControl_1_Mo 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
   ...
   Battery_TimeControl_6_Sa 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

-  Das jeweilige reading kann jedoch auch aus einem anderen Device in dieses geschrieben werden, was eine Formatierung des gesamten Strings mit [0-2] durch eine Funktion ermöglicht.

-  Sollte man die Battery_TimeControl mal wieder deaktivieren, dann ist zu beachten, dass der Plenticore die letzte Konfiguration der Zeiten gespeichert hat.
   Bei einem erneuten Aktivieren ist die alte Konfiguration wieder im Plenticore gültig.

-  Leider kann man im HTTPMOD nicht mit setList und readingList arbeiten :-(

Achtung, das get24* hat sich geändert, weil die Tage nicht korrekt eingelesen wurden und weil es jetzt formatiert wird

- Bedeutung der Werte [0-2]

   0  Keine Einschränkung (Farbe Weiss)
   1  Batterieladung gesperrt, Entladung bei Hausbedarf erlaubt (Farbe Azurblau)
   2  Batterieentladung gesperrt, Ladung bei Energieüberschuss erlaubt (Farbe Lila)

- Sollte man nur die interne Steuerung aktiv haben, so lassen sich diese Optionen trotzdem nutzen

  1. Möchte man z.B. den MaxSOC begrenzen
      Hierbei kann man im WR_1 den Act_state_of_charge verwenden und bei z.B. SOC 80 % ab diesem Zeitpunkt die Batterieladung sperren ( 1 )
      Die Freigabe sollte dann mit einer gewissen Hysterese beim Act_state_of_charge erfolgen

  2. Möchte man auf jeden Fall eine gewisse Reserve im Speicher behalten, wäre Batterieentladung gesperrt ( 2 ) eine Möglichkeit

  3. Bei einem zwei Tarif Model für den Zähler könnte man das ebenfalls anwenden, um einen entsprechenden Rythmus zu bekommen, der
      dann auch Tageweise wechseln kann.

- Für eine Steuerung der gewünschten Modi wird sicherlich die Planung der Zeiten eine Herausforderung sein,
  die dann über eine Funktion mit der Maskierung der 96 Zeitabschnitte übertragen werden müsste.
  Hierfür habe ich die readings Battery_TimeControl_[0-6]_[So-Sa] eingebaut,
  die dann das Ergebnis der Planung speichern und mit einem "set WR_1_API 24__[0-6]_Battery_TimeControl_[So-Sa] Battery_TimeControl_[0-6]_[So-Sa]" zum Plenticore
  übertragen. Ein einheitliches setzen für den ganzen Tag ist dann mit "set WR_1_API 24__[0-6]_Battery_TimeControl_[So-Sa] [0-2]" möglich.

- Wichtig ist das die "Intelligente Speicher Steuerung" deaktiviert ist sonst spielt es keine Rolle ob die "Zeitgesteuerte Batterienutzung" aktive ist oder nicht.
  Somit gibt es dort eine Wechselwirkung zwischen den Optionen und die "Intelligente Speicher Steuerung" überlagert die Zeitsteuerung. (Dank an Dio)


Und hier nun die Attribute für das RAW, die readings sind jedoch nicht dabei und müssten bei Bedarf nach dem obigen Muster erstellt werden.
Wenn Ihr noch alte [set|get]24* Attribute haben solltet, dann wäre es gut diese vorher zu entfernen.
Und denkt daran, eine Sicherung ist auch immer gut :-)

attr WR_1_API get24-1Name Battery_TimeControl_5
attr WR_1_API get24-1OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
attr WR_1_API get24-2Name Battery_TimeControl_1
attr WR_1_API get24-2OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
attr WR_1_API get24-3Name Battery_TimeControl_6
attr WR_1_API get24-3OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
attr WR_1_API get24-4Name Battery_TimeControl_0
attr WR_1_API get24-4OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
attr WR_1_API get24-5Name Battery_TimeControl_4
attr WR_1_API get24-5OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
attr WR_1_API get24-6Name Battery_TimeControl_2
attr WR_1_API get24-6OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
attr WR_1_API get24-7Name Battery_TimeControl_3
attr WR_1_API get24-7OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
attr WR_1_API get24-8Name Battery_TimeControl
attr WR_1_API get24Header01 authorization: Session %auth_sessionId%
attr WR_1_API get24Header02 Content-type: application/json, Accept: application/json, Connection: keep-alive
attr WR_1_API get24JSON .._value
attr WR_1_API get24Name 24_Battery_TimeControl
attr WR_1_API get24URL http://%IP-WR%/api/v1/settings/devices:local/Battery:TimeControl:Enable,Battery:TimeControl:ConfMon,Battery:TimeControl:ConfTue,Battery:TimeControl:ConfWed,Battery:TimeControl:ConfThu,Battery:TimeControl:ConfFri,Battery:TimeControl:ConfSat,Battery:TimeControl:ConfSun


attr WR_1_API set2400Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:Enable","value":"$val"}]}]
attr WR_1_API set2400FollowGet 24_Battery_TimeControl
attr WR_1_API set2400Header01 authorization: Session %auth_sessionId%
attr WR_1_API set2400Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set2400Hint 0,1
attr WR_1_API set2400Method PUT
attr WR_1_API set2400Name 24_00_Battery_TimeControl
attr WR_1_API set2400URL http://%IP-WR%/api/v1/settings

attr WR_1_API set2401Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfSun","value":"$val"}]}]
attr WR_1_API set2401FollowGet 24_Battery_TimeControl
attr WR_1_API set2401Header01 authorization: Session %auth_sessionId%
attr WR_1_API set2401Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set2401Hint 0,1,2,Battery_TimeControl_0_So
attr WR_1_API set2401IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
attr WR_1_API set2401Method PUT
attr WR_1_API set2401Name 24__0_Battery_TimeControl_So
attr WR_1_API set2401URL http://%IP-WR%/api/v1/settings

attr WR_1_API set2402Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfMon","value":"$val"}]}]
attr WR_1_API set2402FollowGet 24_Battery_TimeControl
attr WR_1_API set2402Header01 authorization: Session %auth_sessionId%
attr WR_1_API set2402Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set2402Hint 0,1,2,Battery_TimeControl_1_Mo
attr WR_1_API set2402IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
attr WR_1_API set2402Method PUT
attr WR_1_API set2402Name 24__1_Battery_TimeControl_Mo
attr WR_1_API set2402URL http://%IP-WR%/api/v1/settings

attr WR_1_API set2403Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfTue","value":"$val"}]}]
attr WR_1_API set2403FollowGet 24_Battery_TimeControl
attr WR_1_API set2403Header01 authorization: Session %auth_sessionId%
attr WR_1_API set2403Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set2403Hint 0,1,2,Battery_TimeControl_2_Di
attr WR_1_API set2403IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
attr WR_1_API set2403Method PUT
attr WR_1_API set2403Name 24__2_Battery_TimeControl_Di
attr WR_1_API set2403TextArg 1
attr WR_1_API set2403URL http://%IP-WR%/api/v1/settings

attr WR_1_API set2404Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfWed","value":"$val"}]}]
attr WR_1_API set2404FollowGet 24_Battery_TimeControl
attr WR_1_API set2404Header01 authorization: Session %auth_sessionId%
attr WR_1_API set2404Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set2404Hint 0,1,2,Battery_TimeControl_3_Mi
attr WR_1_API set2404IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
attr WR_1_API set2404Method PUT
attr WR_1_API set2404Name 24__3_Battery_TimeControl_Mi
attr WR_1_API set2404TextArg 1
attr WR_1_API set2404URL http://%IP-WR%/api/v1/settings

attr WR_1_API set2405Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfThu","value":"$val"}]}]
attr WR_1_API set2405FollowGet 24_Battery_TimeControl
attr WR_1_API set2405Header01 authorization: Session %auth_sessionId%
attr WR_1_API set2405Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set2405Hint 0,1,2,Battery_TimeControl_4_Do
attr WR_1_API set2405IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
attr WR_1_API set2405Method PUT
attr WR_1_API set2405Name 24__4_Battery_TimeControl_Do
attr WR_1_API set2405URL http://%IP-WR%/api/v1/settings

attr WR_1_API set2406Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfFri","value":"$val"}]}]
attr WR_1_API set2406FollowGet 24_Battery_TimeControl
attr WR_1_API set2406Header01 authorization: Session %auth_sessionId%
attr WR_1_API set2406Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set2406Hint 0,1,2,Battery_TimeControl_5_Fr
attr WR_1_API set2406IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
attr WR_1_API set2406Method PUT
attr WR_1_API set2406Name 24__5_Battery_TimeControl_Fr
attr WR_1_API set2406URL http://%IP-WR%/api/v1/settings

attr WR_1_API set2407Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfSat","value":"$val"}]}]
attr WR_1_API set2407Header01 authorization: Session %auth_sessionId%
attr WR_1_API set2407Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set2407Hint 0,1,2,Battery_TimeControl_6_Sa
attr WR_1_API set2407IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
attr WR_1_API set2407Method PUT
attr WR_1_API set2407Name 24__6_Battery_TimeControl_Sa
attr WR_1_API set2407URL http://%IP-WR%/api/v1/settings


VG
   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: nisi80 am 12 Oktober 2022, 10:55:06
Hallo Christian,

Zitat von: ch.eick am 11 Oktober 2022, 18:16:24
Wenn Du das im WR_1_API unter get startest, dann sollte die Antwort, nach einem Browser refresh, im httpbody zu sehen sein.

Wenn ich die Funktion aufrufe kommt folgender Body:
[{"processdata":[
{"id":"Statistic:Autarky:Day","unit":"","value":29.6701186032},
{"id":"Statistic:Autarky:Month","unit":"","value":55.4207662845},
{"id":"Statistic:Autarky:Total","unit":"","value":50.3454500655},
{"id":"Statistic:Autarky:Year","unit":"","value":50.3692616562},
{"id":"Statistic:CO2Saving:Day","unit":"","value":862.6227999929},
{"id":"Statistic:CO2Saving:Month","unit":"","value":61638.4571676583},
{"id":"Statistic:CO2Saving:Total","unit":"","value":82776.9845724445},
{"id":"Statistic:CO2Saving:Year","unit":"","value":82770.3373146098},
{"id":"Statistic:EnergyChargeGrid:Day","unit":"","value":0.0042272727},
{"id":"Statistic:EnergyChargeGrid:Month","unit":"","value":1326.2926918956},
{"id":"Statistic:EnergyChargeGrid:Total","unit":"","value":2215.2984904846},
{"id":"Statistic:EnergyChargeGrid:Year","unit":"","value":2215.2984904846},
{"id":"Statistic:EnergyChargeInvIn:Day","unit":"","value":0.8065063039},
{"id":"Statistic:EnergyChargeInvIn:Month","unit":"","value":1493.4644193275},
{"id":"Statistic:EnergyChargeInvIn:Total","unit":"","value":2462.0378650436},
{"id":"Statistic:EnergyChargeInvIn:Year","unit":"","value":2462.0378650436},
{"id":"Statistic:EnergyChargePv:Day","unit":"","value":720.6548854983},
{"id":"Statistic:EnergyChargePv:Month","unit":"","value":46088.2990090918},
{"id":"Statistic:EnergyChargePv:Total","unit":"","value":57815.8318457365},
{"id":"Statistic:EnergyChargePv:Year","unit":"","value":57815.8318457365},
{"id":"Statistic:EnergyDischarge:Day","unit":"","value":623.4187493164},
{"id":"Statistic:EnergyDischarge:Month","unit":"","value":45154.4067252972},
{"id":"Statistic:EnergyDischarge:Total","unit":"","value":56481.5680871301},
{"id":"Statistic:EnergyDischarge:Year","unit":"","value":56481.5680871301},
{"id":"Statistic:EnergyDischargeGrid:Day","unit":"","value":1.3561015926},
{"id":"Statistic:EnergyDischargeGrid:Month","unit":"","value":113.884608165},
{"id":"Statistic:EnergyDischargeGrid:Total","unit":"","value":125.8675601086},
{"id":"Statistic:EnergyDischargeGrid:Year","unit":"","value":125.8675601086},
{"id":"Statistic:EnergyHome:Day","unit":"","value":4129.1504270449},
{"id":"Statistic:EnergyHome:Month","unit":"","value":150425.9881369346},
{"id":"Statistic:EnergyHome:Total","unit":"","value":224861.5642837081},
{"id":"Statistic:EnergyHome:Year","unit":"","value":224736.4123010893},
{"id":"Statistic:EnergyHomeBat:Day","unit":"","value":566.9988488812},
{"id":"Statistic:EnergyHomeBat:Month","unit":"","value":41577.9960206414},
{"id":"Statistic:EnergyHomeBat:Total","unit":"","value":51972.4582424067},
{"id":"Statistic:EnergyHomeBat:Year","unit":"","value":51972.4582424067},
{"id":"Statistic:EnergyHomeGrid:Day","unit":"","value":2906.3888644177},
{"id":"Statistic:EnergyHomeGrid:Month","unit":"","value":68480.5973796209},
{"id":"Statistic:EnergyHomeGrid:Total","unit":"","value":114060.2358023472},
{"id":"Statistic:EnergyHomeGrid:Year","unit":"","value":113944.7586533207},
{"id":"Statistic:EnergyHomeOwn:Total","unit":"","value":113207.5665628811},
{"id":"Statistic:EnergyHomePv:Day","unit":"","value":658.1270115653},
{"id":"Statistic:EnergyHomePv:Month","unit":"","value":41790.4759819993},
{"id":"Statistic:EnergyHomePv:Total","unit":"","value":61234.1876810692},
{"id":"Statistic:EnergyHomePv:Year","unit":"","value":61224.6948035763},
{"id":"Statistic:EnergyPv1:Day","unit":"","value":1002.3775168914},
{"id":"Statistic:EnergyPv1:Month","unit":"","value":70295.9552284258},
{"id":"Statistic:EnergyPv1:Total","unit":"","value":92798.1840023958},
{"id":"Statistic:EnergyPv1:Year","unit":"","value":92791.0145075332},
{"id":"Statistic:EnergyPv2:Day","unit":"","value":543.2122043153},
{"id":"Statistic:EnergyPv2:Month","unit":"","value":29518.9744284229},
{"id":"Statistic:EnergyPv2:Total","unit":"","value":41277.9276391308},
{"id":"Statistic:EnergyPv2:Year","unit":"","value":41274.256702151},
{"id":"Statistic:EnergyPv3:Day","unit":"","value":0.0},
{"id":"Statistic:EnergyPv3:Month","unit":"","value":0.0},
{"id":"Statistic:EnergyPv3:Total","unit":"","value":0.0},
{"id":"Statistic:EnergyPv3:Year","unit":"","value":0.0},
{"id":"Statistic:OwnConsumptionRate:Day","unit":"","value":99.416185187},
{"id":"Statistic:OwnConsumptionRate:Month","unit":"","value":94.6763877669},
{"id":"Statistic:OwnConsumptionRate:Total","unit":"","value":95.7334904181},
{"id":"Statistic:OwnConsumptionRate:Year","unit":"","value":95.7331486797},
{"id":"Statistic:Yield:Day","unit":"","value":1232.3182857042},
{"id":"Statistic:Yield:Month","unit":"","value":88054.9388109405},
{"id":"Statistic:Yield:Total","unit":"","value":118252.8351034922},
{"id":"Statistic:Yield:Year","unit":"","value":118243.3390208711}],
"moduleid":"scb:statistic:EnergyFlow"}]


Es sind aus meiner Sicht ja alle Daten vorhanden aber diese matchen nicht, um die Readings zu aktualisieren.
Kann es sein, dass hier die Reihenfolge bestimmend ist?
Diese passt ja nicht zu den Reading-Definitionen.


VG Denis
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Oktober 2022, 12:20:48
Zitat von: nisi80 am 12 Oktober 2022, 10:55:06
Hallo Christian,

Wenn ich die Funktion aufrufe kommt folgender Body:
[{"processdata":[
{"id":"Statistic:Autarky:Day","unit":"","value":29.6701186032},
< snip >
{"id":"Statistic:Yield:Year","unit":"","value":118243.3390208711}],
"moduleid":"scb:statistic:EnergyFlow"}]

Hallo Denis,
ein grober Vergleich mit meinem httpbody sieht gleich aus.

Das Scheduling läuft übrigens über das PV_Schedule Device, falls Du das noch nicht haben solltest.

Zitat
Es sind aus meiner Sicht ja alle Daten vorhanden aber diese matchen nicht, um die Readings zu aktualisieren.
Kann es sein, dass hier die Reihenfolge bestimmend ist?
Diese passt ja nicht zu den Reading-Definitionen.
Achtung, bei der Nummerierung ist 1-9 einstellig, was im Device anders sortiert wird.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 November 2022, 08:57:44
Hallo zusammen,
das Thema Wärmepumpe ist jetzt ja mal wieder von Interesse.
Ich verwende eine LAD9 von Novelan und habe diese hier ja auch mit einem DOIF gekoppelt und optimiert.
In diesem Thread (https://forum.fhem.de/index.php/topic,19258.0.html) wird zur Luxtronik2 Steuerung diskutiert und es kam zu kleineren Anpassungen bei der Zusatzheizung.
Da auch eine Rückfrage zur PV-Ready Ansteuerung kam stell ich hier mal einige Bilder von Mir rein.
Legende zu den Bildern
1) ist das Heizelement mit 2/4/6 kW Leistung, die man mit zwei Lastrelais auch in diesen Stufen schalten könnte.
2) Zeigt die Einbauposition des Shelly im LAD Gehäuse
3) Hier habe ich Phase und Null abgegriffen
4) Dort wird das PV-Ready / SWT-Signal angeschlossen

Im Wiki ist das DOIF hier abgelegt. (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#RAW_Definition_LWP_PV_Perl_.28DOIF_Modul.29)

VG    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 November 2022, 09:44:22
Moin,
ich habe jetzt auch die Beispiele für den Eigenverbrauch vom Wärmepumpe, Waschmaschine und Pool auf den DOIF Perl Modus im Wiki aktualisiert.
Da jetzt meine SONOS Lautsprecher auch wieder mit Sprachausgabe funktionieren ist das ebenfalls für den Status der Geräte eingeflossen.

Viel Spaß beim Testen
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 November 2022, 09:23:21
Hallo zusammen,
vielen Dank an @Crawler, für das finden eines Copy/Past Fehlers, von dem nur die betroffen sind, die einen zweiten Wechselrichter haben.

Im Device WR_1_API müsstet Ihr bitte diese Zeile korrigieren

SW_Statistic_EnergyPv4_Day:Statistic_EnergyPv1_Day.* {round(ReadingsVal("WR_2_API","Statistic_EnergyPv1_Month",0),0)},\

Dort muss es anstelle von "Month" natürlich "Day" heißen

SW_Statistic_EnergyPv4_Day:Statistic_EnergyPv1_Day.* {round(ReadingsVal("WR_2_API","Statistic_EnergyPv1_Day",0),0)},\

Das Wiki ist bereits korrigiert.

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 09 November 2022, 09:38:00
Heute wird ein trauriger Tag und die Leistungsprognose hatte recht :-)
Gestern konnte ich aber das BEV noch auf 100% laden, nur wo will man bei dem Wetter hin.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 November 2022, 11:56:19
Die dunkle Jahreszeit wirft ihre Schatten und straft im WR_1_API Device bei den userReadings mit einer Division durch Null :-)

Es geht um dieses reading "SW_Statistic_Autarky_Day"

SW_Statistic_Autarky_Day:SW_Statistic_EnergyHomePvSum_Day.* { my $SW_Statistic_EnergyHome_Day = ReadingsVal("$NAME","SW_Statistic_EnergyHome_Day",0) ;; ($SW_Statistic_EnergyHome_Day eq 0)? 0 : round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Day",0) / $SW_Statistic_EnergyHome_Day *100,0) },


VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 November 2022, 14:07:54
Hallo zusammen,
da wir hier ja dauerhaft doch so einige Daten ins DbLog schreiben habe ich meinen Backup jetzt mal etwas aufgeteilt.

Ein Backup der MySQL Datenbank mache ich mit dem SQLBackupAndFTP. Das geht bisher ziemlich schnell und Komprimiert recht gut.
In der Backup Datei sind dann INSERT Statements zu finden.
Die Dump Datei wird allerdings zu groß und passt nicht mehr in einen Editor.

Heute habe ich die Möglichkeit einer WHERE Klausel beim Backup gefunden, das klappt im ersten Test für 2020 auch schon mal.
So kann man sich auch Incrementals machen :-)
--where="TIMESTAMP >= '2020-01-01 00:00:00' AND TIMESTAMP < '2021-01-01 00:00:00'"

VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 November 2022, 12:53:34
Update: 20221118 12:40 Es funktioniert nun :-)

Hallo zusammen,
wie Ihr ja eventuell auch mitbekommen habt versuche ich vom FHEM aus dem KSEM einen Fake Wechselrichter unterzuschieben.

Der Hintergrund wäre, dass man von irgend wo her einen anderen Wechselrichter, oder ein Balkonmodul bekommen hat, was die Installation dann zu einem Schwarm erweitern würde.
Mit FHEM würde man dann die Messwerte dem KSEM als Fake Wechselrichter unterschieben, damit z.B. die gesamt Leistung wieder stimmt.

Natürlich könnte man dann auch ein Blockheizkraftwerk oder Windrad mit integrieren ;-)

EDIT:
Hier wäre nun die WR_3 Konfiguration, die dann mit Werten aus dem Fremd Wechselrichter aktualisiert werden kann.
Sobal sich ein reading ändert, werden die Werte vom KSEM abgeholt. Wie sich das innerhalb des KSEM dann genau auswirkt kann ich jedoch noch nicht sagen.

Sichtbar wirkt sich bisher anscheinend nur der Total_AC_Active_P Wert aus, der dann zu einem Ausschlag bei der erzeugten Leistung im KSEM führt.
Ich denke alle anderen Werte wie I/U könnte man entweder auch vom Fremdgerät holen, oder halt mit den bekannten Formeln berechnen.

defmod WR_3 ModbusAttr 71 slave < IP vom FHEM >:1502 TCP
attr WR_3 DbLogExclude .*
attr WR_3 comment Version 2022.11.18 12:40\
Fremder WR am KSEM
attr WR_3 dev-h-combine 20
attr WR_3 dev-h-defFormat %.2f
attr WR_3 dev-h-defLen 2
attr WR_3 dev-h-defRevRegs 1
attr WR_3 dev-h-defUnpack f>
attr WR_3 dev-type-STR-format %s
attr WR_3 dev-type-STR-len 8
attr WR_3 dev-type-STR-revRegs 0
attr WR_3 dev-type-STR-unpack a*
attr WR_3 disable 0
attr WR_3 group PV Eigenverbrauch
attr WR_3 icon sani_solar
attr WR_3 obj-h1066-reading Total_DC_P_sumOfAllPVInputs
attr WR_3 obj-h14-reading Inverter_serial_number
attr WR_3 obj-h14-type STR
attr WR_3 obj-h154-reading I_L1
attr WR_3 obj-h156-reading Active_P_L1
attr WR_3 obj-h158-reading U_L1
attr WR_3 obj-h160-reading I_L2
attr WR_3 obj-h162-reading Active_P_L2
attr WR_3 obj-h164-reading U_L2
attr WR_3 obj-h166-reading I_L3
attr WR_3 obj-h168-reading Active_P_L3
attr WR_3 obj-h170-reading U_L3
attr WR_3 obj-h172-reading Total_AC_Active_P
attr WR_3 obj-h172-set 1
attr WR_3 obj-h38-reading Software-Version_Maincontroller_MC
attr WR_3 obj-h38-type STR
attr WR_3 obj-h46-reading Software-Version_IO-Controller_IOC
attr WR_3 obj-h46-type STR
attr WR_3 obj-h514-len 1
attr WR_3 obj-h514-reading Battery_Actual_SOC
attr WR_3 obj-h56-format %.0f
attr WR_3 obj-h56-reading Inverter_state
attr WR_3 obj-h56-unpack N
attr WR_3 obj-h582-reading Actual_Battery_charge-discharge_P
attr WR_3 obj-h6-reading Inverter_Article_number
attr WR_3 obj-h6-type STR
attr WR_3 obj-h768-len 32
attr WR_3 obj-h768-reading Productname
attr WR_3 obj-h768-type STR
attr WR_3 room Strom->Photovoltaik
attr WR_3 sortby 311
attr WR_3 verbose 0

setstate WR_3 2022-10-27 12:19:25 Active_P_L1 0.00
setstate WR_3 2022-10-27 12:19:34 Active_P_L2 0.00
setstate WR_3 2022-10-27 12:19:40 Active_P_L3 0.00
setstate WR_3 2022-10-27 12:19:25 Actual_Battery_charge-discharge_P 0.00
setstate WR_3 2022-10-27 12:19:25 Battery_Actual_SOC 0.00
setstate WR_3 2022-10-27 15:43:17 I_L1 0.00
setstate WR_3 2022-10-27 15:43:26 I_L2 0.00
setstate WR_3 2022-10-27 15:43:34 I_L3 0.00
setstate WR_3 2022-10-27 10:56:32 Inverter_Article_number 12345678
setstate WR_3 2022-10-27 10:56:32 Inverter_serial_number 87654321
setstate WR_3 2022-10-27 10:56:32 Inverter_state 6
setstate WR_3 2022-10-27 10:59:21 Productname WR_3
setstate WR_3 2022-10-27 10:56:32 Software-Version_IO-Controller_IOC 4711
setstate WR_3 2022-10-27 10:56:32 Software-Version_Maincontroller_MC 0815
setstate WR_3 2022-11-18 12:27:13 Total_AC_Active_P 0
setstate WR_3 2022-10-27 12:19:25 Total_DC_P_sumOfAllPVInputs 0.00
setstate WR_3 2022-10-27 12:17:24 U_L1 230.00
setstate WR_3 2022-10-27 12:17:35 U_L2 230.00
setstate WR_3 2022-10-27 12:17:44 U_L3 230.00

Für den KSEM wird dann nun FHEM über den Port 1502 ein neuer ModBus Server (der Wechselrichter).
Die Konfiguration im KSEM unter "Wechselrichter" ist im Anhang zu sehen. Dort kann man jedoch nicht den Port auswählen,
wodurch somit nur ein fake Wechselrichter pro FHEM Installation möglich ist.


VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 November 2022, 16:08:16
Hey Leute

ich habe mal wieder etwas gefunden, was aber nichts mit FHEM und der Steuerung hier zu tun hat.
Im Bild sind mal die Energieeffizienzklasseb abgebildet.

Ich komme da auf folgendes Ergebnis, was ich aus den Statistiken meiner Implementierung ableite. Der Jahresverbrauch wurde
um das E-Auto und den Wirlpool, die ja nichts mit dem Haus ansich zu tun haben, bereinigt.

2021
  6985 kWh Gesamtverbrauch (Haushalt, Warmwasser, Heizung 116 m², Heizung 64 m²)
  ==> 6985 kWh / 180 m² = 38,8 kWh/m² pro Jahr

Somit liegt mein Haus in der Mitte bei Energieeffizienzklasse A und das als Baujahr 1977 mit Kernsanierung 2016

2022
  6410 kWh (da fehlt noch der Dezember)
   483 kWh geschätzt vom November
  ==> 6893 kWh /180 m² = 38,3 kWh/m² pro Jahr

Der Energieberater ist durch seine Berechnungen ebenfalls für die Mietwohnung auf Energieeffizienzklasse A mit
einem Wert von 47,9 kWh/m² pro Jahr gekommen.
Der Gästebereich im Keller mit ca 34 m² wurde dabei noch nicht mal mit rein gerechnet, ansonsten liegt der Wert
bei 32,6 kWh/m² pro Jahr und somit schon fast bei A+ ;-)

Mein Resümee ist somit, Sanierung kann sich echt lohnen, auch wenn sich die Investition erst in vieleicht 10 Jahren amortisiert.

EDIT: Energie-Plus-Haus
Beim weiter Lesen wird es immer besser. Die PV-Anlage wird ja auch mit der Einspeisung berücksichtigt. Dann sieht es ja noch besser aus.

Einspeisung:
2021 12523 kWh
2022 15100 kWh ( in 2021 wurde die PV-Anlage aufgerüstet )

Somit ergibt sich folgendes Energie Plus in den Jahren

2021 12523 - 6985 = 5538 kWh
2022 15100 - 6893 = 8207 kWh


Wie sieht es bei Euch aus?

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Dezember 2022, 12:18:17
Ein Aufruf zum Durchhalten :-) :-)
Auch im Winter kann PV an einzelnen Tagen was bringen. Heute ist der Anteil, der von der Wärmepumpe verwendet wird ziemlich hoch.

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Dezember 2022, 18:51:54
EDIT: Ich habe es jetzt auch hier im Wiki abgelegt. (https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Wieviel_PV-Leistung_wird_von_einem_Starkverbraucher_verwendet_.28MySQL.29)

Ich habe mal versucht aus der Datenbank zu ermitteln, wieviel PV-Leistung für z.B. eine Wärmepumpe übrig bleibt.
Dabei habe ich den grundlegenden Hausverbrauch als erstes in Abzug gebracht und den Rest mit der WP verrechnet.
Natürlich kann man solch einen Report nur für einen Verbraucher verwenden, da man ja den Überschuss nur einem zuordnen kann.

EDIT:
Findet Ihr solch einen Report sinnvoll, oder interressant? Man hätte in einer Diskussion mal echte Daten :-)
Selbst im Winter finde ich die Unterstützung noch recht gut, gestern komme ich auf eine Durchschnittsuntertützung von 46,6 % und das bei nur kurzen Sonnenschein.
Heute habe ich die Sonne noch nicht gesehen, da sieht es bisher noch etwas schlechter aus. Allerdings ist der Haushalt ja bereits zu 100% abgedeckt.
Ich füge unten dann mal das SELECT Statement an.

2022-12-07
+------+-------------+------------------+--------------------------+------------+-----------+---------+
| HOUR | generator_P | Home_Consumption | PV_after_Home_Consumtion | consumer_P | from_Grid | Percent |
+------+-------------+------------------+--------------------------+------------+-----------+---------+
|    8 |       96.38 |          1210.60 |                     0.00 |   -1346.59 |   1346.59 |       0 |
|    9 |      525.20 |          1081.62 |                     0.00 |     -61.93 |     61.93 |       0 |
|   10 |     2142.27 |           616.15 |                  1526.12 |   -2677.54 |   1151.42 |      57 |
|   11 |     1335.65 |           567.72 |                   767.93 |   -1135.92 |    367.99 |      68 |
|   12 |     1624.61 |           650.44 |                   974.17 |   -2646.73 |   1672.56 |      37 |
|   13 |      546.83 |           520.85 |                    25.98 |     -55.98 |     30.00 |      46 |
|   14 |     1155.63 |           714.65 |                   440.98 |   -1774.13 |   1333.15 |      25 |
|   15 |      387.44 |           436.01 |                     0.00 |    -111.47 |    111.47 |       0 |
|   16 |       73.22 |           472.44 |                     0.00 |     -63.88 |     63.88 |       0 |
+------+-------------+------------------+--------------------------+------------+-----------+---------+

2022-12-08
+------+-------------+------------------+--------------------------+------------+-----------+---------+
| HOUR | generator_P | Home_Consumption | PV_after_Home_Consumtion | consumer_P | from_Grid | Percent |
+------+-------------+------------------+--------------------------+------------+-----------+---------+
|    8 |      187.00 |           638.44 |                     0.00 |     -58.41 |     58.41 |       0 |
|    9 |      455.44 |           648.36 |                     0.00 |     -63.90 |     63.90 |       0 |
|   10 |      891.86 |           527.20 |                   364.66 |   -2505.25 |   2140.59 |      15 |
|   11 |     1588.88 |           560.82 |                  1028.06 |   -2812.80 |   1784.74 |      37 |
|   12 |     2347.47 |           640.22 |                  1707.25 |   -2641.59 |    934.34 |      65 |
|   13 |      869.55 |           975.54 |                     0.00 |     -71.81 |     71.81 |       0 |
|   14 |     1351.78 |           513.16 |                   838.62 |   -1833.21 |    994.59 |      46 |
|   15 |      594.35 |           523.39 |                    70.96 |     -69.85 |         0 |     100 |
+------+-------------+------------------+--------------------------+------------+-----------+---------+

-- Hier mal ein Sommertag, die Fehlwerte in der Nacht scheinen Rundungsfehler zu sein :-)
SET @date:='2022-07-12';
+------+-------------+------------------+--------------------------+------------+-----------+---------+
| HOUR | generator_P | Home_Consumption | PV_after_Home_Consumtion | consumer_P | from_Grid | Percent |
+------+-------------+------------------+--------------------------+------------+-----------+---------+
|    0 |      311.71 |           267.67 |                    44.04 |     -46.95 |      2.91 |      94 |
|    1 |      333.86 |           262.13 |                    71.73 |     -52.64 |         0 |     100 |
|    2 |      281.81 |           223.69 |                    58.12 |     -52.71 |         0 |     100 |
|    3 |      446.37 |           400.72 |                    45.65 |     -52.89 |      7.24 |      86 |
|    4 |      454.35 |           387.41 |                    66.94 |     -57.83 |         0 |     100 |
|    5 |      553.94 |           480.12 |                    73.82 |     -72.11 |         0 |     100 |
|    6 |      988.25 |           319.47 |                   668.78 |     -76.69 |         0 |     100 |
|    7 |     2942.42 |           404.10 |                  2538.32 |     -91.19 |         0 |     100 |
|    8 |     5005.92 |           328.75 |                  4677.17 |     -91.93 |         0 |     100 |
|    9 |     7280.32 |           933.17 |                  6347.15 |     -94.61 |         0 |     100 |
|   10 |     7812.17 |          1255.93 |                  6556.24 |     -94.00 |         0 |     100 |
|   11 |    11421.43 |          1814.18 |                  9607.25 |     -64.01 |         0 |     100 |
|   12 |    12025.25 |          1556.05 |                 10469.20 |   -2104.53 |         0 |     100 |
|   13 |    12555.58 |          2634.29 |                  9921.29 |     -46.67 |         0 |     100 |
|   14 |    12299.73 |          1460.87 |                 10838.86 |     -46.70 |         0 |     100 |
|   15 |    11652.87 |           894.12 |                 10758.75 |     -46.55 |         0 |     100 |
|   16 |    10212.00 |           704.89 |                  9507.11 |     -46.48 |         0 |     100 |
|   17 |     7600.08 |           823.84 |                  6776.24 |     -47.12 |         0 |     100 |
|   18 |     5983.46 |           704.32 |                  5279.14 |     -60.46 |         0 |     100 |
|   19 |     2614.37 |           746.43 |                  1867.94 |     -52.85 |         0 |     100 |
|   20 |      930.12 |           621.92 |                   308.20 |     -58.05 |         0 |     100 |
|   21 |      586.85 |           511.25 |                    75.60 |     -75.25 |         0 |     100 |
|   22 |      573.20 |           509.78 |                    63.42 |     -46.75 |         0 |     100 |
|   23 |      509.44 |           411.68 |                    97.76 |     -46.88 |         0 |     100 |
+------+-------------+------------------+--------------------------+------------+-----------+---------+

Home_Consumption = Hausverbrauch ohne Wärmepumpe
Heizung = negativer Zähler, da es ein Verbraucher ist

An dem SQL Select arbeite ich momentan noch.
Habt Ihr auch interessante Abfragen, oder Ideen für Abfragen?

VG  Christian

Hier ist dann mal das SELECT
1) Zuerst werden die einzelnen Daten für einen Tag zusammen gesucht
2) Jeder Daten Teil wird mit einem Durchschnitt auf Stundenbasis berechnet
3) Im JOIN werden alle Daten Teile für die relevanten Stunden zusammen geführt. Maßgeblich hierbei ist der Betrieb der Heizung
   zudem Zeitpunkt wo auch PV-Leistung verfügbar war. Alle anderen Stunden tauchen danach nicht mehr auf. Ist es ein Hybrid WR
   mit Speicher, dann kann auch in der Nacht eine Unterstützung erfolgen, was im Winter jedoch recht selten sein wird.
4) Es wird der restliche Hausverbrauch ermittelt. Achtung, die Heizung ist ein Verbraucher, weshalb die Leistung im Heizungszähler
   negativ summiert wird. Ein "+Heizung" ist somit eine Summe mit einem negativen Wert ;-)
5) Im letzten SELECT werden dann die Daten final aufbereitet und Formatiert, auch der Prozentuale Anteil der PV Leistung am gesamten
   Heizungsverbrauch wird noch berechnet.

Das ließe sich natürlich auch auf andere Verbraucher übertragen.


SET @date:='2022-12-07',
    @consumer:='StromZaehler_Heizung', @consumer_P:='SMAEM1901401955_Saldo_Wirkleistung',
    @generator:='WR_1', @generator_P:='SW_Total_AC_Active_P', @Home_Consumtion_P:='SW_Home_own_consumption';


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 > @date and TIMESTAMP < DATE_ADD(@date,INTERVAL 1 DAY) AND
      DEVICE = @Consumer AND
      READING = @consumer_P
    GROUP BY 1
    ) X1
  JOIN (
    SELECT
      hour(TIMESTAMP) AS HOUR,
      round(avg(value),2) AS generator_P
    FROM history
    WHERE
      TIMESTAMP > @date AND TIMESTAMP < DATE_ADD(@date,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 > @date and TIMESTAMP < DATE_ADD(@date,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;
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Dezember 2022, 11:24:53
Hallo zusammen,

ich teste gerade nochmal die WR_1_Speicher_1_ExternControl Zeit Steuerung.
Dadurch wollte ich dann jetzt im Winter mal nur den Speicher zur Tageszeit verwenden, falls er mal voll ist. Die Zeit Steuerung hatte ich mal für die Schweizer mit rein genommen, die Tagsüber einen Hochtarif und nachts einen Niedigtarif haben. Damit werde ich warscheinlich keinen Netzausfall verhindern :) :) :) , aber man probiert ja mal aus was man kann ;)
Sollte es mal attraktive Tarif Modelle geben, die man auch bestellen kann, würde soetwas ja auch bei uns Sinn machen.

VG   Chrstian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 11 Dezember 2022, 00:23:17
Also die Energietabelle mit den Effizienzklassen ist sehr interessant. Ich komme auf A+ :-)

Haus 2013 gebaut in Massiv-Ziegel. Ca. 220 qm beheizte Fläche, PV-Anlage seit Mitte 2021 (17,5 kWp, 12,8 kWh Speicher), Wärmepumpe mit Tiefenbohrung 2x 100m, beheizter Außenpool im Sommer, E-Auto.
Bei mir sind die Stromkosten in der Leaserate enthalten. Ich versuche also nur daheim zu laden, wenn Überschussstrom da ist, weil dann bekomme ich den Strom erstattet.

Meine Bilanz sieht aus wie folgt. An dieser Stelle, DANKE DANKE DANKE für das Modul und überhaupt an alle für FHEM.

Liebe Grüße
Oli
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Dezember 2022, 09:48:01
Zitat von: ojb am 11 Dezember 2022, 00:23:17
Also die Energietabelle mit den Effizienzklassen ist sehr interessant. Ich komme auf A+ :-)

Haus 2013 gebaut in Massiv-Ziegel. Ca. 220 qm beheizte Fläche, PV-Anlage seit Mitte 2021 (17,5 kWp, 12,8 kWh Speicher), Wärmepumpe mit Tiefenbohrung 2x 100m, beheizter Außenpool im Sommer, E-Auto.
Bei mir sind die Stromkosten in der Leaserate enthalten. Ich versuche also nur daheim zu laden, wenn Überschussstrom da ist, weil dann bekomme ich den Strom erstattet.

Meine Bilanz sieht aus wie folgt. An dieser Stelle, DANKE DANKE DANKE für das Modul und überhaupt an alle für FHEM.

Liebe Grüße
Oli
Hallo Oli,
das ist ja fast ein Neubau :-) , unser Haus ist zwar 2015 Saniert worden, aber einige wenige Stellen kann man dann leider doch nicht optimal hin bekommen.
Möchtest Du mal Deine Bilanz mit den Kosten hier rein stellen? Hast Du das auch generisch aus der Datenbank ermittelt?

VG
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Dezember 2022, 14:15:30
Moin early birds :-)

Da es ja nun immer weniger PV vom Dach gibt und der Speicher auf MinSOC fällt, habe ich mir mal überlegt, wie man das ständige Entladen mit <20W beendet, dass ich bei mir im Status mit "Standby" anzeige. Empirisch habe ich nun ermittelt, wenn man DC_Power_Abs auf -1 setzt, scheint der Kostal Laderegler bessen an die 0 Watt zu kommen. Dies müsste jedoch für jede Installation ausprobiert werden.

Der Wert muss dazu allerdings, mit der eingestellten Zeit der API oder auch ModBus, über WR_1_Speicher_1_ExternControl wiederholt werden.

Sollte das so funktionieren, könnte man eventuell den MinSOC auf z.B. 10% senken, da ja nur noch die Hausspeicher Steuerung den Standby verbraucht. Wenn man möchte könnte man natürlich auch [+|-][1-4] verwenden, um den Standby auszugleichen. Das bedeutet jedoch ein kleiner Mehrverbrauch aus dem Netz.

Zu Testzwecken habe ich nun einen weiteren Block ins WR_1_Speicher_1_ExternControl eingefügt, der als RAW dann so aussieht.

################################################################################################################\
## 6 Wiederhole alle 180s die Kommandos der ExternControl Steuerung\
##\
16_Stop_Standby_Entladung\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
     and\
      ((\
       [WR_1_API:Battery_Control] > 0 and                                ## Wenn die ExternControl am WR konfiguriert ist\
       [$SELF:SpeicherCmdRepeatActive]  eq "An" and                      ## Wenn die ExternControl Aktiviert ist\
       [$SELF:SpeicherExternTrigger] eq "gesperrt" and                   ## Das smart_Laden\
       [WR_1_API:Battery_InternControl_MinHomeConsumption] == 30000 and  ##      aktiviert wurde\
       [WR_1:Total_Active_P_EM] > 0 and                                  ## Es wird nicht ins Netz eingespeist\
       [$SELF:SpeicherDcPowerAbs] == 0 and                               ## Es wird anderweitig kein Wert vorgegeben\
       [+([WR_1_API:Battery_ComMonitor_Time]-30)]                        ## Den Befehl nach eingestellter Zeit wiederholen\
      )\
      or [$SELF:ui_command_1] eq "Stop_Standby_Entladung"                ## Hier wird das uiTable select ausgewertet\
     )\
   ) {\
\
    if( [$SELF:ui_command_1] eq "Stop_Standby_Entladung" ) {             ## Hier wurde manuell ausgelöst\
      set_Reading("ui_command_1_before",[$SELF:ui_command_1]);;\
    }\
\
   ::CommandSet(undef, "WR_1_API 23_05_Battery_ExternControl_DcPowerAbs -1");;\
\
   if (AttrVal("$SELF","verbose",0) >=4) {\
     Log 3, "$SELF cmd_16 : Battery_ExternControl_DcPowerAbs auf -1 gesetzt";;\
   };;\
\
   set_Reading("ui_command_1","---");;                                    ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
   }\
}

Das Ganze reagiert dann verzögert mit ca. der eingestellten Battery_ComMonitor_Time, die im Plenticore geändert werden kann.
Auch das Laden verzögert sich dann maximal um diese Zeit, da ja erst der Default wieder erreicht werden muss.

EDIT: Ich habe noch eben die Meldung auf den verbose level 4 gesetzt, da ansonsten die Meldung ständig im Log erscheint.

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Dezember 2022, 09:11:47
Moin,
ich habe noch einen Speicher Status klären können. Bei mir war mir 256 aufgefallen, für den ich noch kein map hatte.


attr WR_1 obj-h104-map 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz,256:externe Batteriesteuerung

attr WR_1_API reading25OMap 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz,256:externe Batteriesteuerung

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 18 Dezember 2022, 14:25:26
Zitat von: ch.eick am 11 Dezember 2022, 09:48:01
Hallo Oli,
das ist ja fast ein Neubau :-) , unser Haus ist zwar 2015 Saniert worden, aber einige wenige Stellen kann man dann leider doch nicht optimal hin bekommen.
Möchtest Du mal Deine Bilanz mit den Kosten hier rein stellen? Hast Du das auch generisch aus der Datenbank ermittelt?

VG
    Christian

Meinst Du mit Bilanz die Anschaffungskosten?

Also die Bilanz oben ist ein Dashboard das FHEM rechnet. Ich verwende viel userreadings unter Verwendung von ElectricityCalculator.

Die Kosten der Anlage sehen so aus:

  • Sole-Wärmepumpe (Viessmann, 2013)): 5 k€.
  • Tiefenborhung 2x 100m (Baugrund Süd, 2013): 13 k€.
  • PV-Anlage 17,5 kWp mit 12,8 kWh Speicher (E.ON und BYD, 2021): 37 k€.

Liebe Grüße
Oli
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Dezember 2022, 15:20:15
Zitat von: ojb am 18 Dezember 2022, 14:25:26
Also die Bilanz oben ist ein Dashboard das FHEM rechnet. Ich verwende viel userreadings unter Verwendung von ElectricityCalculator.
Hallo Oli,
Ich meinte nur die aktuellen Bilanzen aus den Verbräuchen
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Dezember 2022, 09:48:46
Hallo Oli,
ich gehe nochmal auf Deine Statistiken mit der Berechnung der Kosten ein.

1.) Das obere Drittel kommt mir sehr bekannt vor ;-) und ist ja nur etwas anders aufgeteilt.
    Das kommt ja aus dem DbRep LogDBRep_Statistic_previous_Year, was man für den Vortag bzw. Vormonat adaptieren kann.
    Tag / Monat /Jahr kommen direkt aus dem Plenticore, bzw den SW_* readings, wenn man einen Schwarm hat.

2.) Für die Berechnung der Kosten würde mich Deine Definition interessieren. Meine Hoffnung wäre ein uiTable zur Einstellung
    der Einzelkosten mit Basis Gebühren und Arbeitspreisen.
    Die Wallbox Vergütung dürfte sicherlich von Deinem Arbeitgeber sein, oder sind das die 18 ct über THG Ladepunkt Quote?

3.) Da sich in der letzten zeit ein wechselder EVU Anbieter herauskristalisiert wäre es natürlich toll, wenn man die EVU Preise
    auch in der Datenbank hätte, eventuell sogar auf Stundenbasis für Tibber oder aWattar. Wie weit bist Du denn da im Moment?
    Wie handhabst Du den Tarifwechsel innerhalb deines Berechnungszeitraums? Ich habe z.B. jetzt vom 01.01.2023 bis 31.03.2023
    noch einen günstigen Tarif bekommen, danach kommt ja schon wieder ein Wechsel.

Mein Ansatz wäre die gesamte Statistik mit Kostenberechnung direkt in einer SELECT Abfrage wie beim DbRep LogDBRep_Statistic_previous_Year
zu erledigen und dort auch die Preise aus der Datenbank heraus zu kalkulieren.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 19 Dezember 2022, 17:02:09
################################################################################################################\
## 6 Wiederhole alle 180s die Kommandos der ExternControl Steuerung\

Hallo Christian,
ich habe deine Erweiterung bei mir eingebaut, denke es wird in den nächsten Tagen wieder öfters zum leeren Speicher kommen,
bin dann mal gespannt was passiert.

Was meinst Du mit:
ZitatSollte das so funktionieren, könnte man eventuell den MinSOC auf z.B. 10% senken, da ja nur noch die Hausspeicher Steuerung den Standby verbraucht. Wenn man möchte könnte man natürlich auch [+|-][1-4] verwenden, um den Standby auszugleichen. Das bedeutet jedoch ein kleiner Mehrverbrauch aus dem Netz.
das habe ich nicht verstanden wo ich das verändern kann. Den MinSOC habe ich (Sommer/Winter) auch schon auf (5/10)% gestellt.

viele Grüße
Wolfgang

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Dezember 2022, 17:44:01
Zitat von: zwölfgang am 19 Dezember 2022, 17:02:09
################################################################################################################\
## 6 Wiederhole alle 180s die Kommandos der ExternControl Steuerung\

Hallo Christian,
ich habe deine Erweiterung bei mir eingebaut, denke es wird in den nächsten Tagen wieder öfters zum leeren Speicher kommen,
bin dann mal gespannt was passiert.

das habe ich nicht verstanden wo ich das verändern kann. Den MinSOC habe ich (Sommer/Winter) auch schon auf (5/10)% gestellt.
Hallo Wolfgang,
Kostal empfiehlt einen MinSOC von 20% im Winter und da könnte man dann mal testen, ob 10% auch reichen würden, aber das hast Du ja bereits.

Leider habe ich jedoch auch festgestellt, dass das Absinken des Speicher SOC so doch nicht wirklich zum Stillstand kommt :-( , es wird subjektiv nur langsamer.
Ich bin aber mal gespannt, wie es bei Dir wirken wird.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 26 Dezember 2022, 11:59:11
Hallo Christian

Was haben deine Tests ergeben? Gibt es Änderungen welche zu übernehmen sind?
Sorry, ich habe in letzter Zeit etwas abgehängt da alles reibungslos gelaufen ist...

Zitat von: ch.eick am 10 Dezember 2022, 11:24:53
Hallo zusammen,

ich teste gerade nochmal die WR_1_Speicher_1_ExternControl Zeit Steuerung.
Dadurch wollte ich dann jetzt im Winter mal nur den Speicher zur Tageszeit verwenden, falls er mal voll ist. Die Zeit Steuerung hatte ich mal für die Schweizer mit rein genommen, die Tagsüber einen Hochtarif und nachts einen Niedigtarif haben. Damit werde ich warscheinlich keinen Netzausfall verhindern :) :) :) , aber man probiert ja mal aus was man kann ;)
Sollte es mal attraktive Tarif Modelle geben, die man auch bestellen kann, würde soetwas ja auch bei uns Sinn machen.

VG   Chrstian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Dezember 2022, 18:42:11
Frohe Weihnachten Euch allen.

Die letzten Änderungen sind nur nice to have.

VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Dezember 2022, 10:31:29
Mon zusammen,
es wurde wieder ein Fehler gefunden :-)
Besonderen Dank an @Melt.Weister
Zitat
Mich haben die folgenden 3 FM gestört und deshalb habe ich mich heute mal damit beschäftigt:

2022.12.29 12:12:04.102 3: WR_1: CreateDataObjects unpack of 0007 with f> for Battery_Actual_SOC resulted in undefined value
2022.12.29 12:12:05.185 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_Charge_AC_P_Setpoint resulted in undefined value
2022.12.29 12:12:05.187 3: WR_1: CreateDataObjects unpack of 0000 with f> for Battery_P_ScaleFactor resulted in undefined value

Ich habe sie durch Hinzufügen des Unpack-Attributes im WR_1 Device eliminiert. Vielleicht möchtest Du das prüfen und übernehmen und im WIKI hinterlegen.


attr WR_1 obj-h1024-unpack n
attr WR_1 obj-h1025-unpack n
attr WR_1 obj-h514-unpack n


(kleines "n" ist entscheidend)
Ich korrigier dann noch das Wiki.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 02 Januar 2023, 17:47:45
Moin zusammen,

erstmal danke für die viele Arbeit und das ausführliche Wiki. Nachdem ich nun langsam fast alles zum laufen bekommen habe (2 x Plenticore mit 1x BYD, Integration eines Fronius steht noch aus) habe ich Anmerkungen zum Wiki und der Implementierung allgemein:

Wiki:

Im WR_1 wird geschrieben "Bei mehreren Wechselrichtern werden einige Werte vom Plenticore fehlerhaft ermittelt und durch diese readings korrigiert. Wann Kostal das in der Firmware korrigiert ist nicht bekannt." Hier wäre es zielführend, anzugeben, auf welchen Softwarestand sich das bezieht.

"RAW Definition WR_1 Master (bei zwei Wechselrichtern)"
Im stateformat müsste die Einheit bei my $Actual_Battery_charge_usable_P       = sprintf("%d W" Wh sein und nicht W, denke ich.


"plenticore_auth() und KeyValue() Voraussetzung"
Der Abschnitt der zu nutzenden use-Anweisungen sollte in einem grauen Kasten sein wie der übrige Code. Da bin ich zunächst drüber gestolpert und hatte das übersehen. Dann musste ich bei meiner Installation zusätzlich
sudo apt install libcrypt-urandom-perl
nutzen, da sonst die 99_myUtils nicht kompiliert wurde.

"KeyValue() Test"
Hier ist derzeit geschrieben: "Somit ist für die API "user" zu verwenden und der "Master Key" als Passwort, der sich auf dem Aufkleber der Plenticore befindet." Das ist etwas unglücklich formuliert. Wenn ich mein System betrachte, dann ist das Passwort genau jenes, das man als Anlagenbetreiber bei der Anmeldung am GUI des Wechselrichters eingibt. Dies ist nicht zwingend der auf dem Gerät befindliche Master Key. Vielleicht sollte der Satz auch fett geschrieben werden und mit Verweis auf das Anmeldepasswort am Plenticore Webinterface.

"RAW Definition des WR_1_API Master ab v1.16"
Hier wird hingewiesen auf "Für die Korrektur der Statistiken werden die Stromzähler Stände des KSEM benötigt...". Es wäre gut, wenn hier ein Link zur defmod des KSEM eingefügt werden würde. Ich dachte zunächst, dass hier was fehlt und wollte mangels defmod schon aufgeben. Kommt aber dann ja weiter unten.

Der Block "Initiales setzen der WR_0_KSEM Zähler Stände" hat die falschen Befehle. Es sollte nicht "setstate" sondern setreading sein, oder?

Implementierung:
Es ist derzeit vorgesehen, bis zu 5 Strings eingeben zu können. Die Faktoren tempk und tempk_base existieren aber nur einmal. Wenn man unterschiedlich bestückte Strings hat, stimmen somit die Werte nicht. Ich kann nicht beurteilen, wie groß hier Differenzen in der Vorhersage sind, aber aus meiner Sicht sollten diese Faktoren in die module_1 bis 5 Blöcke aufgenommen werden. Bei tempk_base wäre das wohl noch egal, weil hier alle mir bekannten Module immer 25 Grad haben, aber der Koeffizient variiert doch recht arg.

Diskussion:
Wäre es sinnvoll, zwecks besserer Prognose pro Modul auch die geschätzte jährliche Degradation in % zusammen mit dem Installationszeitpunkt anzugeben (oder auch garantierte % der Mindestleistung zusammen mit Garantiezeitraum, dann kann fhem das ja flott berechnen)? Dadurch würde sich die Prognose über die Jahre automatisch anpassen.

Und dann spiele ich erstmal weiter mit der Implementierung und schaue mir an, in wieweit alles vernünftige Werte liefert.
Gruß
Michael

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Januar 2023, 20:44:08
Hallo Michael,
vielen Dank für die vielen Anregungen.

Zitat von: MichaelO am 02 Januar 2023, 17:47:45
Anmerkungen zum Wiki und der Implementierung allgemein:

Wiki:

Im WR_1 wird geschrieben "Bei mehreren Wechselrichtern werden einige Werte vom Plenticore fehlerhaft ermittelt und durch diese readings korrigiert. Wann Kostal das in der Firmware korrigiert ist nicht bekannt." Hier wäre es zielführend, anzugeben, auf welchen Softwarestand sich das bezieht.
Das bezieht sich auf alle von Kostal veröffentliche Firmware. Der KSEM zeigt bereits den Hausverbrauch ab Version 2.0.0 richtig an, übermittelt ihn aber noch nicht.
Ich hoffe, dass dort bald was neues kommr, was bereits für 12/2022 angekündigt war. Deshalb aktualisiere ich dazu im Moment nichts, da ich es ganz raus haben möchte.

Zitat
"RAW Definition WR_1 Master (bei zwei Wechselrichtern)"
Im stateformat müsste die Einheit bei my $Actual_Battery_charge_usable_P       = sprintf("%d W" Wh sein und nicht W, denke ich.
Es sind Watt, Wh werden es erst durch die Zeit :-)

Zitat
"plenticore_auth() und KeyValue() Voraussetzung"
Der Abschnitt der zu nutzenden use-Anweisungen sollte in einem grauen Kasten sein wie der übrige Code. Da bin ich zunächst drüber gestolpert und hatte das übersehen. Dann musste ich bei meiner Installation zusätzlich
sudo apt install libcrypt-urandom-perl
nutzen, da sonst die 99_myUtils nicht kompiliert wurde.
Habe ich im Wiki ergänzt und umformatiert.

Zitat
"KeyValue() Test"
Hier ist derzeit geschrieben: "Somit ist für die API "user" zu verwenden und der "Master Key" als Passwort, der sich auf dem Aufkleber der Plenticore befindet." Das ist etwas unglücklich formuliert. Wenn ich mein System betrachte, dann ist das Passwort genau jenes, das man als Anlagenbetreiber bei der Anmeldung am GUI des Wechselrichters eingibt. Dies ist nicht zwingend der auf dem Gerät befindliche Master Key. Vielleicht sollte der Satz auch fett geschrieben werden und mit Verweis auf das Anmeldepasswort am Plenticore Webinterface.
Im Default ist das Passwort des Anlagenbetreibers vom Web-GUI = auf dem Gerät befindliche Master Key . Das setze ich bei mir auch immer wieder so, damit ein Solarteur den Zugang zum Gerät hat, falls ich es mal nicht mehr machen kann.
Ich habe es im Wiki überarbeitet.

Zitat
"RAW Definition des WR_1_API Master ab v1.16"
Hier wird hingewiesen auf "Für die Korrektur der Statistiken werden die Stromzähler Stände des KSEM benötigt...". Es wäre gut, wenn hier ein Link zur defmod des KSEM eingefügt werden würde. Ich dachte zunächst, dass hier was fehlt und wollte mangels defmod schon aufgeben. Kommt aber dann ja weiter unten.
Im Wiki erledigt

Zitat
Der Block "Initiales setzen der WR_0_KSEM Zähler Stände" hat die falschen Befehle. Es sollte nicht "setstate" sondern setreading sein, oder?
Wenn man es direkt im RAW mit einträgt, ist es "setstate", ansonsten kann man es bei einem Absturz von FHEM auch mit einen setreading wieder mit den korrekten Werten aus der DbLog setzen. Dazu gab es im Thread auch schon mal eine Anleitung.

Zitat
Implementierung:
Es ist derzeit vorgesehen, bis zu 5 Strings eingeben zu können. Die Faktoren tempk und tempk_base existieren aber nur einmal. Wenn man unterschiedlich bestückte Strings hat, stimmen somit die Werte nicht. Ich kann nicht beurteilen, wie groß hier Differenzen in der Vorhersage sind, aber aus meiner Sicht sollten diese Faktoren in die module_1 bis 5 Blöcke aufgenommen werden. Bei tempk_base wäre das wohl noch egal, weil hier alle mir bekannten Module immer 25 Grad haben, aber der Koeffizient variiert doch recht arg.
Meistens wurden bisher immer die gleichen Module verwendet, jedoch sollte die Forecast Abweichung nicht so arg sein. Es kommt eh nur ein recht guter Schätzwert dabei raus, den man eher als Schwellwert für die Entscheidungen sehen sollte. Am Meisten Einfluss hat hier der DWD.

Zitat
Diskussion:
Wäre es sinnvoll, zwecks besserer Prognose pro Modul auch die geschätzte jährliche Degradation in % zusammen mit dem Installationszeitpunkt anzugeben (oder auch garantierte % der Mindestleistung zusammen mit Garantiezeitraum, dann kann fhem das ja flott berechnen)? Dadurch würde sich die Prognose über die Jahre automatisch anpassen.
Wenn Du da die Kenntnisse hast könntest Du mir gerne mal eine Testversion schicken ;-)
Ich arbeite bereits mit jemandem aus dem Forum an einer KI Implementierung, die dann selber lernen sollte.
Hier gibt es noch einen anderen Ansatz, der ohne DbLog arbeitet und als Grundlage meine Formeln verwendet. (https://forum.fhem.de/index.php/topic,117864.0.html)

Zitat
Und dann spiele ich erstmal weiter mit der Implementierung und schaue mir an, in wieweit alles vernünftige Werte liefert.
Dabei aber am besten immer nur an einer Schraube drehen. Die Anpassung des Forecast macht erst im Frühjahr/Sommer richtig Sinn. Jetzt im Winter liegt es ziemlich daneben, wie gesagt es sollte als Schwellwert verstanden werden.

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Januar 2023, 20:48:23
Hallo zusammen,
ich habe hier mal etwas zum Reformatieren von SQL Kommandos gepostet (https://forum.fhem.de/index.php/topic,53584.msg1254967.html#msg1254967).

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 02 Januar 2023, 21:45:38
Moin Christian

Zitat von: ch.eick am 02 Januar 2023, 20:44:08
Es sind Watt, Wh werden es erst durch die Zeit :-)

Da muss ich leider klugschei...  8) Wenn dieser Wert die noch verfügbare Ladung im Speicher ist (und somit der Anteil an der Gesamtkapazität gemäß der ebenfalls angezeigten Prozentangabe SOC), dann sind es Wh. Die Angabe W bezieht sich auf die "Leistungsgeschwindigkeit", also die Leistungsabgabe zu einem bestimmten Zeitpunkt. Die Angabe Wh hingegen bezieht sich auf eine Energiemenge, also die Leistung, die für einen bestimmten Zeitraum zur Verfügung steht.

Zitat von: ch.eick am 02 Januar 2023, 20:44:08
Wenn man es direkt im RAW mit einträgt, ist es "setstate", ansonsten kann man es bei einem Absturz von FHEM auch mit einen setreading wieder mit den korrekten Werten aus der DbLog setzen. Dazu gab es im Thread auch schon mal eine Anleitung.

Ok, das wusste ich nicht. Bei mir waren die Readings garnicht vorhanden, ich habe sie dann erstmal manuell erzeugt und warte auf das erste Update der Statistiken, um zu sehen, ob dann alles passt.

Zitat von: ch.eick am 02 Januar 2023, 20:44:08
Wenn Du da die Kenntnisse hast könntest Du mir gerne mal eine Testversion schicken ;-)
Ich arbeite bereits mit jemandem aus dem Forum an einer KI Implementierung, die dann selber lernen sollte.

Sobald die Konfiguration grundsätzlich läuft und vernünftige Werte liefert, kann ich da gerne mal etwas spielen. Ich stehe zwar mit Perl mächtig auf dem Kriegsfuß, aber da muss man dann durch   ::) KI in fhem halte ich für gewagt und wäre da sehr gespannt, wie das Implementiert werden soll. Wäre sicher eine gute Sache.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Januar 2023, 23:35:59
Zitat von: MichaelO am 02 Januar 2023, 21:45:38
Da muss ich leider klugschei...  8) Wenn dieser Wert die noch verfügbare Ladung im Speicher ist (und somit der Anteil an der Gesamtkapazität gemäß der ebenfalls angezeigten Prozentangabe SOC), dann sind es Wh. Die Angabe W bezieht sich auf die "Leistungsgeschwindigkeit", also die Leistungsabgabe zu einem bestimmten Zeitpunkt. Die Angabe Wh hingegen bezieht sich auf eine Energiemenge, also die Leistung, die für einen bestimmten Zeitraum zur Verfügung steht.
Klugschei... akzepiert, ich schau es mir morgen mal an.

Zitat
Ok, das wusste ich nicht. Bei mir waren die Readings garnicht vorhanden, ich habe sie dann erstmal manuell erzeugt und warte auf das erste Update der Statistiken, um zu sehen, ob dann alles passt.
Das würde ich nicht machen, da dadurch ja dann auch falsch berechnete Werte in die DB geschrieben werden, die die Monks unter uns dann mühsam wieder korrigieren möchten.
Also besser den richtigen init Wert aus der DB suchen und eintragen, wir haben ja gerade erst Monatsanfang und Jahresanfang. Das zieht sich ansonsten ziemlich lange durch.
Such nochmal hier im Thread, oder es könnte auch schon im Wiki stehen, da bin ich mir aber nicht sicher.

Zitat
Sobald die Konfiguration grundsätzlich läuft und vernünftige Werte liefert, kann ich da gerne mal etwas spielen. Ich stehe zwar mit Perl mächtig auf dem Kriegsfuß, aber da muss man dann durch   ::) KI in fhem halte ich für gewagt und wäre da sehr gespannt, wie das Implementiert werden soll. Wäre sicher eine gute Sache.
Das mit der KI wurde auch schon mal im Thread von Peter angesprochen, da hatte ich nur viele andere Dinge im Kopf. Peter hat es auf einem anderen FHEM externen Rechner laufen.
Ich habe schon einige vorarbeiten für FHEM erledigt, aber die "Inteligenz" würde dann in einem Phyton Aufruf erledigt werden. So richtig habe ich es auch noch nicht verstanden :-)
Bei der Verarbeitung wird RandomForestRegressor() verwendet, was wohl gewichtete änliche Situationen vergleicht und daraus die zuerwartende Prognose Leistung ableitet. Als Quelle dient die Datenbank mit den geloggten DWD Daten und den Leistungswerten des WR zu diesem Zeitpunkt.


Es ist schön, wenn mal wieder jemand so genau in das ganze Konstrukt schaut, dadurch wird es für uns alle noch besser.

Vielen Dank
    Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Januar 2023, 23:46:48
Zitat von: MichaelO am 02 Januar 2023, 17:47:45
Nachdem ich nun langsam fast alles zum laufen bekommen habe
   2 x Plenticore mit 1x BYD
   Integration eines Fronius steht noch aus
Achtung, bei dem 3. WR wird es eventuell etwas schwieriger.
Ich habe dazu bereits mal etwas vorgearbeitet. Die Werte des Kostal Schwarms werden alle nicht korrekt sein, da Kostal nicht den dritten Wechselrichter im Schwarm kennt.
Hierzu habe ich einen Fake Wechselrichter (https://forum.fhem.de/index.php/topic,114849.msg1246040/topicseen.html#msg1246040) integriert, der dem KSEM die fehlende Leistung unterjubelt. Dazu steht noch nichts im Wiki, aber hier im Thread.
Auch die ganzen Statistiken müssen dann in dem Fake WR nachgebildet werden, damit sie dann anschließend mit verechnet werden können.
An dem Projekt hätte ich auch sehr großes Interesse, was wir aber besser per PN/Mail bearbeiten sollten. Die Essence kommt dann wieder ins Forum und ins Wiki.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 03 Januar 2023, 08:04:58
Zitat von: ch.eick am 02 Januar 2023, 23:46:48
Achtung, bei dem 3. WR wird es eventuell etwas schwieriger.
...
An dem Projekt hätte ich auch sehr großes Interesse, was wir aber besser per PN/Mail bearbeiten sollten. Die Essence kommt dann wieder ins Forum und ins Wiki.

Ja, da hab ich dank der Vorarbeit dem KSEM schon den Fronius per Dummy unterjubeln können  8) Ich kenne die KSEM Problematik, insbesondere die bislang immer noch nicht vernünftig umgesetzte Schwarm-Anzeige von Kostal, das Problem, dass es keinen Wert für das AC-Äquivalent der PV-Leistung gibt etc. Von mir sind die Plenticore-Module der openWB, die hab ich damals implementiert, weil Kostal ... ach, das vergesse ich lieber wieder, sonst muss ich mich aufregen  :-X

Wegen der Statistiken im 3.WR muss ich mir die aktuelle Implementierung erstmal in Ruhe anschauen und entsprechend Zeit finden. Das ist ja auf einen Schwung so komplex, braucht etwas Zeit.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 03 Januar 2023, 09:33:41
Seit gestern läuft ja soweit die Implementierung aus dem Wiki. Nun ist mir im Log aufgefallen, dass ich u. a. immer diesen Eintrag bekomme

2023.01.03 09:15:00 4: WR_1_API: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)

Und aus der Prognosenberechnung

2023.01.03 09:00:00 1: PERL WARNING: Argument "0.1\n0.1\n0.1\n0.1\n0.1\n0.1" isn't numeric in multiplication (*) at ./FHEM/99_myUtils.pm line 546.
was dieser Zeile entspricht:
$Solar_[$j]     = $Solar_[$j] * $Solar_Correction_Faktor_auto ;

Ist das normales Verhalten, oder stimmt da was nicht?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2023, 10:37:45
Zitat von: MichaelO am 03 Januar 2023, 09:33:41
Seit gestern läuft ja soweit die Implementierung aus dem Wiki. Nun ist mir im Log aufgefallen, dass ich u. a. immer diesen Eintrag bekomme

2023.01.03 09:15:00 4: WR_1_API: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
Das wird aus dem HTTPMOD Modul kommen und mit der aktuellen Version zusammen hängen.
In dieser FVERSION 98_HTTPMOD.pm:0.265330/2022-10-13 kann ich die Meldung nicht sehen.

Zitat
Und aus der Prognosenberechnung

2023.01.03 09:00:00 1: PERL WARNING: Argument "0.1\n0.1\n0.1\n0.1\n0.1\n0.1" isn't numeric in multiplication (*) at ./FHEM/99_myUtils.pm line 546.
was dieser Zeile entspricht:
$Solar_[$j]     = $Solar_[$j] * $Solar_Correction_Faktor_auto ;

Ist das normales Verhalten, oder stimmt da was nicht?
Hast Du das hier auf 0 gesetzt?
setreading WR_1_config forecast_factor_autocorrection 0
Ich verwende die Autokorrektur momentan gar nicht mehr, weil bei mir das Ergebnis bisher super passt.
Am Anfang solltest Du das auch abgeschaltet lassen um die basis Werte zuerst optimal zu bestimmen. Das ist eine kleine Geduldsaufgabe für den Frühling/Sommer .
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2023, 11:06:56
Zitat von: MichaelO am 03 Januar 2023, 08:04:58
Wegen der Statistiken im 3.WR muss ich mir die aktuelle Implementierung erstmal in Ruhe anschauen und entsprechend Zeit finden. Das ist ja auf einen Schwung so komplex, braucht etwas Zeit.
Im Prinzip musst Du alle Werte des Fremd WR mit dem gleichen Namen wie beim Plenticore in das Fake Device bringen. Das hast Du ja schon für die Leistung gemacht.
Je nach dem was der Fremd WR eventuell an Statistiken liefert sind diese dann auch ins WR_3 Device zu mappen. Es sollte hinterher wie ein abgestrippter Plenticore aussehen.

Die Zusammenführung geschiet dann über das WR_1_API Device in den userReadings mit den SW_* readings.
Dort findest Du dann auch Dummy Strings, wie z.B. SW_*Pv[4-6]* , die den Schwarm dann wie einen einzigen WR erscheinen lassen sollen.
Somit müsstest Du aus dem Fremd WR folgende Werte Ermitteln, oder nachbilden:

Statistic_EnergyPv[1-n]_*       mappen auf [7-n] , die werden aber nicht wirklich weiter verwendet, sind aber eventuell schön in Graphen
Statistic_Yield_*

Eine Bestimmung des Yield, wenn es der WR nicht liefert könnte man nachbauen. Da gibt es glaube ich Beispiele von den SMA Kollegen im Wiki. Ich hatte mich darmals gefreut, dass das alles der Plenticore direkt selber liefert ;-)

Schickst Du mir dann mal die Umsetzung per PN vom Fronis zum WR_3 , dann könnte ich meinen Grundgedanken eventuell noch mit einfließen lassen, bevor das auch ins Wiki geht.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2023, 11:11:12
Hallo Michael,
was hälst Du denn von meiner integration der openWB ins FHEM, da Du ja aktiv bein openWB mitgemacht hast?

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 03 Januar 2023, 11:12:32
Zitat von: ch.eick am 03 Januar 2023, 10:37:45
Hast Du das hier auf 0 gesetzt?

Nein, war Standard 1 aus dem Wiki. Hab es jetzt auf 0 gesetzt. Wobei hier ja grundsätzlich was in der Subroutine nicht stimmt. Den Abschnitt der Berechnung mittels Reading einfach nur abzuschalten, löst ja das Problem des nichtnumerischen Ausdrucks nicht. Aber erstmal ist es jetzt auf 0.

Und dann habe ich bemerkt, dass zumindest bei mir im WR_1_API device keinerlei Battery_ Readings auftauchen. Nur Statistic_, SW_ und auth_. Im WR_1 device stehen etliche Battery_ readings. Muss man da noch was extra konfigurieren, dass die Readings auch im API-device landen. Ist mir erst aufgefallen, als ich im WR_1_Speicher_1 (auch wenn man den ja eigentlich nicht benötigt, aber interessehalber implementiert) gesehen habe, dass dort der EM_State nicht hingeschrieben wird und das stateformat sich auf "WR_1_API","Battery_EM_State" bezieht  :o

Wegen der Strings im Fake-WR schaue ich... der Rest ist ja drin für den KSEM

Muss man eigentlich für den SVG "Forcast" noch was speziell machen? Ich hab die Def (erstmal als einzigen SVG) aus dem Wiki einschl. GPLOT genommen. Das Diagramm wird angezeigt einschl. der Legende, aber es bleibt leer  ???
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 03 Januar 2023, 11:18:45
Zitat von: ch.eick am 03 Januar 2023, 11:11:12
Hallo Michael,
was hälst Du denn von meiner integration der openWB ins FHEM, da Du ja aktiv bein openWB mitgemacht hast?

VG  Christian

Soweit bin ich noch nicht. Ich hab bisher auch immer nur das GUI der openWB auf dem Tablet laufen und lange gehadert, die WR in fhem einzubinden, da mir die openWB bislang gereicht hat. Dann hatte ich die Integration eines Fake WR in den KSEM gesehen und nun wollte ich aber die Batteriesteuerung für eigene Zwecke nutzen (brauche kein 70%, hab einen FRSE verbaut und kann so 100% einspeisen) und deswegen jetzt mal angefangen, die tolle Vorarbeit zu nutzen.

Hab mir auch schon überlegt, ggf. dann fhem auch openWB steuern zu lassen. Mal sehen. Erstmal in kleinen Schritten voranschreiten  8) Ich hab für openWB ja auch Tibber implementiert, das nutze ich seit Jahreswechsel wieder, das müsste ja sonst auch noch in fhem. Und dazu dann insgesamt ein vernünftiges GUI - das sehe ich als größte Herausforderung. Mein restliches "Smarthome" steuere ich nur über DOIF. Schalter und irgendwas auf dem Tablet will ich nicht. Was nicht von alleine im Hintergrund geht, ist in meinen Augen nicht smart und kann auch sonst mit der Hand gesteuert werden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2023, 12:10:54
Zitat von: MichaelO am 03 Januar 2023, 11:12:32
Nein, war Standard 1 aus dem Wiki. Hab es jetzt auf 0 gesetzt. Wobei hier ja grundsätzlich was in der Subroutine nicht stimmt. Den Abschnitt der Berechnung mittels Reading einfach nur abzuschalten, löst ja das Problem des nichtnumerischen Ausdrucks nicht. Aber erstmal ist es jetzt auf 0.
Ich denke, es wird an Deiner noch leeren Datenbank liegen.

Zitat
Und dann habe ich bemerkt, dass zumindest bei mir im WR_1_API device keinerlei Battery_ Readings auftauchen. Nur Statistic_, SW_ und auth_. Im WR_1 device stehen etliche Battery_ readings. Muss man da noch was extra konfigurieren, dass die Readings auch im API-device landen. Ist mir erst aufgefallen, als ich im WR_1_Speicher_1 (auch wenn man den ja eigentlich nicht benötigt, aber interessehalber implementiert) gesehen habe, dass dort der EM_State nicht hingeschrieben wird und das stateformat sich auf "WR_1_API","Battery_EM_State" bezieht  :o
Bei Dir werden die Battery_ readings noch nicht abgefragt, das geschieht über das WR_1_Speicher_1_ExternControl Device im Block 1_Status_WR_1_Speicher_1 .
Du kannst es aber manuell über die set Kommandos im WR_1_API Device anstoßen.

Das WR_1_Speicher_1  Device kann nur mit einem BYD HV Speicher funktionieren und ist komplett separat zu sehen. Damit wollte ich mal die einzelnen Speicher Module monitoren. Im stateFormat hole ich mir manchmal zugehörige Referentwerte aus anderen Devices, damit der Überblick besser ist.

Zitat
Wegen der Strings im Fake-WR schaue ich... der Rest ist ja drin für den KSEM

Muss man eigentlich für den SVG "Forcast" noch was speziell machen? Ich hab die Def (erstmal als einzigen SVG) aus dem Wiki einschl. GPLOT genommen. Das Diagramm wird angezeigt einschl. der Legende, aber es bleibt leer  ???
Da müsstest Du mal schauen, ob die reading Namen noch passen. Das ist altes Zeug aus den Anfängen, ich bin schon länger auf Grafana umgestiegen, da man dort auch Werte stapeln kann und alles
um einiges bessert aussieht. Nebenbei wird FHEM dann auch von den Diagrammen befreit, die bei mir die Anzeige ziemlich verlangsamt haben.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2023, 12:25:07
Zitat von: MichaelO am 03 Januar 2023, 11:18:45
Soweit bin ich noch nicht. Ich hab bisher auch immer nur das GUI der openWB auf dem Tablet laufen und lange gehadert, die WR in fhem einzubinden, da mir die openWB bislang gereicht hat. Dann hatte ich die Integration eines Fake WR in den KSEM gesehen und nun wollte ich aber die Batteriesteuerung für eigene Zwecke nutzen (brauche kein 70%, hab einen FRSE verbaut und kann so 100% einspeisen) und deswegen jetzt mal angefangen, die tolle Vorarbeit zu nutzen.

Hab mir auch schon überlegt, ggf. dann fhem auch openWB steuern zu lassen. Mal sehen. Erstmal in kleinen Schritten voranschreiten  8) Ich hab für openWB ja auch Tibber implementiert, das nutze ich seit Jahreswechsel wieder, das müsste ja sonst auch noch in fhem. Und dazu dann insgesamt ein vernünftiges GUI - das sehe ich als größte Herausforderung. Mein restliches "Smarthome" steuere ich nur über DOIF. Schalter und irgendwas auf dem Tablet will ich nicht. Was nicht von alleine im Hintergrund geht, ist in meinen Augen nicht smart und kann auch sonst mit der Hand gesteuert werden.
Okay,
das mit dem Smarthome sehe ich genauso, es ist für mich noch die letzte Optimierung oben drauf und ich mag es, wenn die Bedienung an einer Stelle möglich ist.
Bei der openWB und dem E-Auto wollte ich es auch gerne zusammen haben, da bin ich gerade auch an den Statistiken. Da man ja auch mal extern laden muss habe ich die Daten jetzt als WB_0 in die Datenbank geschrieben. Jetzt summiere ich das für den Vormonat und das Vorjahr auf, damit man mal den gesamt Verbrauch sehen kann. Die WB_0 wird dann wohl ein DbRep Device werden, das ist aber noch nicht ganz klar.
Schön finde ich auch den Luxus mit der Standheizung über den Kalender oder einen Timer, aber das hängt natürlich vom Fahrzeug ab, wie gut man das integrieren kann.

Mit Tibber habe ich mich auch bereits beschäftigt. Hast Du schon ein Device in FHEM und könntest mir die Berechnungsformel liefern?
Für meinen relativ geringen Netzbezug scheint sich das noch nicht zu lohnen. Ich müsste mit 2572 kWh/a alle Mehrkosten von Tibber rein holen, bevor ich dann was sparen könnte  :-\
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 03 Januar 2023, 12:34:19
Zitat von: ch.eick am 03 Januar 2023, 12:25:07
Mit Tibber habe ich mich auch bereits beschäftigt. Hast Du schon ein Device in FHEM und könntest mir die Berechnungsformel liefern?

Leider nicht, das hab ich nur in der openWB mit Python umgesetzt. Bei Tibber braucht man aber einen gültigen Account mit einem Token. Darüber lässt sich dann die Home-ID erlangen (falls man in seinem Account mehrere Häuser mit einem Tibber Vertrag hat) und dann erst bekommt man die Daten über deren API. Das war nicht ganz trivial umzusetzen, meine Implementierung in openWB dürfte aber für fhem nicht zutreffen. Ansonsten einfach mal auf https://github.com/snaptec/openWB/blob/master/modules/et_tibber/tibbergetprices.py (https://github.com/snaptec/openWB/blob/master/modules/et_tibber/tibbergetprices.py) schauen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Januar 2023, 12:56:48
Zitat von: MichaelO am 03 Januar 2023, 12:34:19
Leider nicht, das hab ich nur in der openWB mit Python umgesetzt. Bei Tibber braucht man aber einen gültigen Account mit einem Token. Darüber lässt sich dann die Home-ID erlangen (falls man in seinem Account mehrere Häuser mit einem Tibber Vertrag hat) und dann erst bekommt man die Daten über deren API. Das war nicht ganz trivial umzusetzen, meine Implementierung in openWB dürfte aber für fhem nicht zutreffen. Ansonsten einfach mal auf https://github.com/snaptec/openWB/blob/master/modules/et_tibber/tibbergetprices.py (https://github.com/snaptec/openWB/blob/master/modules/et_tibber/tibbergetprices.py) schauen.
Hier ist mal mein Stand für die Tibber API, ohne eigenen Account, als Grundlage.

defmod EVU_Tibber HTTPMOD https://api.tibber.com/v1-beta/gql 0
attr EVU_Tibber DbLogExclude .*
attr EVU_Tibber comment Version 2022.12.12 13:00 \
https://developer.tibber.com/explorer
attr EVU_Tibber enableControlSet 1
attr EVU_Tibber get01Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt}}}}}}" }
attr EVU_Tibber get01Header01 Content-Type: application/json
attr EVU_Tibber get01Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get01Name 01_priceInfo
attr EVU_Tibber get01URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get02Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt} today {total energy tax startsAt} tomorrow {total energy tax startsAt}}}}}}" }
attr EVU_Tibber get02Header01 Content-Type: application/json
attr EVU_Tibber get02Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get02Name 02_priceAll
attr EVU_Tibber get02URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get03Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 100) {nodes {from to cost unitPrice unitPriceVAT consumption consumptionUnit}}}}}"}
attr EVU_Tibber get03Header01 Content-Type: application/json
attr EVU_Tibber get03Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get03Name 03_consumption_hourly_100
attr EVU_Tibber get03URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get04Data { "query": "{viewer {home(id:\"%%homeID%%\") {address {address1 address2 address3 postalCode city country latitude longitude} owner {firstName lastName contactInfo {email mobile}}}}}" }
attr EVU_Tibber get04Header01 Content-Type: application/json
attr EVU_Tibber get04Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get04Name 04_address
attr EVU_Tibber get04URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber group PV Steuerung EVU
attr EVU_Tibber icon sani_pump
attr EVU_Tibber reading1JSON data_viewer_home_currentSubscription_priceInfo_current_total
attr EVU_Tibber reading1Name Strompreis
attr EVU_Tibber reading1OExpr $val*100
attr EVU_Tibber replacement01Mode reading
attr EVU_Tibber replacement01Regex %%token%%
attr EVU_Tibber replacement01Value token
attr EVU_Tibber replacement02Mode reading
attr EVU_Tibber replacement02Regex %%homeID%%
attr EVU_Tibber replacement02Value homeID
attr EVU_Tibber requestData { "query": "{viewer {home(id:\"%%homeID%%b\") {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}" }
attr EVU_Tibber requestHeader1 Content-Type: application/json
attr EVU_Tibber requestHeader2 Authorization: Bearer %%token%%
attr EVU_Tibber room Strom->Photovoltaik
attr EVU_Tibber showBody 1
attr EVU_Tibber showError 1
attr EVU_Tibber sortby 313
attr EVU_Tibber stateFormat {sprintf("Strompreis: %.2f ct/kWh", ReadingsVal($name,"Strompreis",0))}
attr EVU_Tibber verbose 0

setstate EVU_Tibber Strompreis: 630.11 ct/kWh
setstate EVU_Tibber 2022-12-15 14:49:29 Strompreis 630.11
setstate EVU_Tibber 2022-12-15 12:17:23 homeID 96a14971-525a-4420-aae9-e5aedaa129ff
setstate EVU_Tibber 2022-12-15 12:19:56 token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE

Das stateFormat ist auch nur übernommen und sicherlich noch falsch :-)
Token und homeID sind von der Entwickler Seite, also öffentlich.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Januar 2023, 08:35:40
Moin zusammen,
da Michael ja fleißig Fehler sucht, kommt hier eine kleine Anpassung für das WR_1 Device.

Es hat sich im stateFormat nur die Einheit von Actual_Battery_charge_usable_P auf "Wh" geändert.

attr WR_1 stateFormat {\
my $DUMMY  = "";;\
\
my $Power          = ReadingsVal($name,"Actual_Battery_charge_-minus_or_discharge_-plus_P",0);;\
my $StatusSpeicher = ($Power < -10) ? "<span style='color:green'>Laden</span>" : ($Power > 15)?  "<span style='color:red'>Entladen</span>"  : "<span style='color:orange'>Standby</span>";;\
    $StatusSpeicher = $StatusSpeicher."<br>".ReadingsVal($name,"State_of_EM","n/a");;\
    $Power          = $Power." W";;\
\
\
my $Battery_temperature                  = sprintf("%.1f °C",ReadingsVal($name,"Battery_temperature",0));;\
    $Battery_temperature                  = ((ReadingsVal("WR_1_API","DigitalOutputs_ConfigurationFlags",0) == 9) ? "<span style='color:green'>Lüfter An </span><br>" : "<br>").$Battery_temperature;;\
\
my $Actual_Battery_charge_usable_P       = sprintf("%d Wh",ReadingsVal($name,"Actual_Battery_charge_usable_P",0));;\
         \
my $Act_state_of_charge                  = sprintf("%d %%",ReadingsVal($name,"Act_state_of_charge","0"));;\
my $SW_Total_DC_P_sumOfAllPVInputs       = sprintf("%d W",ReadingsVal($name,"SW_Total_DC_P_sumOfAllPVInputs","0"));;\
my $SW_Total_PV_P_reserve                = sprintf("%d W",ReadingsVal($name,"SW_Total_PV_P_reserve","0"));;\
\
my $SW_Home_own_consumption_from_PV      = sprintf("%d",ReadingsVal($name,"SW_Home_own_consumption_from_PV",0));;\
    $SW_Home_own_consumption_from_PV = ($SW_Home_own_consumption_from_PV >= 0) ? $SW_Home_own_consumption_from_PV." W" : "0 W";;\
my $SW_Home_own_consumption_from_Battery = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_Battery",0));;\
my $SW_Home_own_consumption_from_grid    = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_grid",0));;\
my $SW_Home_own_consumption              = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption",0));;\
\
my $Total_Active_P_EM  = sprintf("%d",ReadingsVal($name,"Total_Active_P_EM",0));;\
my $StatusNetz         = ($Total_Active_P_EM < -10) ? "<span style='color:green'>Einspeisen</span>" : ($Total_Active_P_EM > 15)?  "<span style='color:red'>Netzbezug</span>"  : "<span style='color:orange'>Standby</span>";;\
    $Total_Active_P_EM  = $Total_Active_P_EM." W";;\
\
my $SW_Yield_Daily   = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Daily",0)/1000 ,0));;\
my $SW_Yield_Monthly = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Monthly",0)/1000 ,0));;\
my $SW_Yield_Yearly  = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Yearly",0)/1000 ,0));;\
my $SW_Yield_Total   = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Total",0)/1000 ,0));;\
\
my $Solar_Calculation_fc0_4h   = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_4h",0)/1000 ,0));;\
my $Solar_Calculation_fc0_day  = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_day",0)/1000 ,0));;\
my $Solar_Calculation_fc0_rest = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_rest",0)/1000 ,0));;\
\
"<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'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Wechselrichter / KSEM<dd>Max DC / PV Reserve / Netz Leistung</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_DC_P_sumOfAllPVInputs."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_PV_P_reserve."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusNetz."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Total_Active_P_EM."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Leistung<dd>von PV / von Batterie / vom Netz / ins Haus</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_PV."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_Battery."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_grid."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Ertrag<dd>Tag / Monat / Jahr / Total</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Daily."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Monthly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Yearly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Total."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Prognose<dd>Tag / 4 Stunden / Resttag</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_day."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_4h."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_rest."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Speicher<dd>Temperatur / nutzbare Ladung / Status / Leistung / akt. SOC</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Battery_temperature."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Actual_Battery_charge_usable_P."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusSpeicher."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>\
</table>\
</html>"\
}
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 05 Januar 2023, 12:50:16
Moin,
Michael ist weiterhin fleißig, danke dafür.

Im Wiki habe ich das [urlhttps://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#RAW_Definition_DWD_Forecast]DWD_Forecast[/url] aktualisiert.
Michael hat noch Kommentare ergänzt. die ich mit meinen noch gemischt habe.

Achtung, es werden nun einige Werte vom DWD gelogged, das verwende ich für Tests mit einer KI Prognose. Wer da noch nicht sammeln möchte
sollte da das DbLogInclude entsprechend der eigenen Wünsche bereinigen.

Wer mag, der kann auch die Solar_plan() (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Solar_plain.28.29) aktualisieren, da ist aber nur eine Log Meldung dazu gekommen.

if ($verbose >= 3) {
      Log 3, "Solar_plain time             : ".$time;                  <<<< diese hier
      Log 3, "Solar_plain azimuth          : ".$azimuth;
      Log 3, "Solar_plain elevation        : ".$elevation;
      Log 3, "Solar_plain orientation      : ".$orientation;
      Log 3, "Solar_plain angle            : ".$angle;
    };


VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 06 Januar 2023, 13:16:42
Zitat von: ch.eick am 19 Dezember 2022, 09:48:46
Hallo Oli,
ich gehe nochmal auf Deine Statistiken mit der Berechnung der Kosten ein.

1.) Das obere Drittel kommt mir sehr bekannt vor ;-) und ist ja nur etwas anders aufgeteilt.
    Das kommt ja aus dem DbRep LogDBRep_Statistic_previous_Year, was man für den Vortag bzw. Vormonat adaptieren kann.
    Tag / Monat /Jahr kommen direkt aus dem Plenticore, bzw den SW_* readings, wenn man einen Schwarm hat.

2.) Für die Berechnung der Kosten würde mich Deine Definition interessieren. Meine Hoffnung wäre ein uiTable zur Einstellung
    der Einzelkosten mit Basis Gebühren und Arbeitspreisen.
    Die Wallbox Vergütung dürfte sicherlich von Deinem Arbeitgeber sein, oder sind das die 18 ct über THG Ladepunkt Quote?

3.) Da sich in der letzten zeit ein wechselder EVU Anbieter herauskristalisiert wäre es natürlich toll, wenn man die EVU Preise
    auch in der Datenbank hätte, eventuell sogar auf Stundenbasis für Tibber oder aWattar. Wie weit bist Du denn da im Moment?
    Wie handhabst Du den Tarifwechsel innerhalb deines Berechnungszeitraums? Ich habe z.B. jetzt vom 01.01.2023 bis 31.03.2023
    noch einen günstigen Tarif bekommen, danach kommt ja schon wieder ein Wechsel.

Mein Ansatz wäre die gesamte Statistik mit Kostenberechnung direkt in einer SELECT Abfrage wie beim DbRep LogDBRep_Statistic_previous_Year
zu erledigen und dort auch die Preise aus der Datenbank heraus zu kalkulieren.

VG   Christian

Hi Christian,

sorry für die späte Antwort.

Wallboxvergütung ist in der Tat von meinem Arbeitgeber, ist Teil der Lease-Rate.

Ich lasse alle Kosten über ElectricityCalculator's berechnen.

Ich habe dazu folgende definiert:

  • ElectricityCalculator_Batteriebezug.
  • ElectricityCalculator_Eigenverbrauch_aus_Photovoltaik.
  • ElectricityCalculator_Gesamt.
  • ElectricityCalculator_Haus.
  • ElectricityCalculator_Heizung.
  • ElectricityCalculator_Netzbezug.
  • ElectricityCalculator_Netzeinspeisung.
  • ElectricityCalculator_Photovoltaik_Ertrag.
  • ElectricityCalculator_Wallbox.

Wenn sich Tarifänderungen ergeben, dann ändere ich den Tarif einfach in den ElectricityCalculator's.

Fast alle Berechnungen bezüglich PV (Autarkie, Eigenverbrauch etc.) laufen im WR_1.

Tibber finde ich sehr interessant und ich will da unbedingt hin. Ich habe jetzt eine Mail mit meinem technischen Setup hingeschrieben (PV-Anlage, Kaskadenmessverfahren) und sie gefragt, ob man das alles mit einem Vertrag abbilden kann, weil Betriebsstrom und Wärmestrom wäre ja dann das gleiche.

Im Moment wurde der Tarif meines Wärmepumpenstromes erhöht (25c auf 45c). Mein Betriebsstrom ist (noch) 32c.

Mit Hilfe Deines genialen Moduls hab ich jetzt die Batteriestrategie geändert:

([OW_Stromzaehler:Stromverbrauch_Heizung] > 500)
(
set WR_1_API 22_04_Battery_MinSoc 10;
)
DOELSE
(
set WR_1_API 22_04_Battery_MinSoc 100;
)

Batteriestrom wird also primär in die Wärmepumpe geleitet.

Den aktuellen Tibber-Tarif auszuwerten und dann z.B. Wärmepumpe oder E-Auto-Ladung zu optimieren das ist das Ziel.

Super wäre natürlich auch, wenn man die Haus-Batterie gezielt über Netz aufladen könnte. Aber ich habe gehört das geht nur mir Installateurspasswort.

Anbei unten meine WR_1 Definition.

Liebe Grüße
Oli




Total_PV_P_reserve:Total_DC_P.* {my $reserve = ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs","0") * 0.90 - ReadingsVal($NAME,"Home_own_consumption_from_PV",0);;;; ($reserve lt 0)? 0 : round($reserve,0)  },

Actual_Battery_charge_-minus_or_discharge_-plus_P:[Battery_voltage|Actual_Battery_charge_-minus_or_discharge_-plus_I].* {round((ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I",0)*ReadingsVal($NAME,"Battery_voltage","0")),0)},

Total_DC_P_Max:[Total_DC_P_sumOfAllPVInputs|Actual_Battery_charge_-minus_or_discharge_-plus_P].* { my $Bat_P = ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_P","0");;;; ($Bat_P gt 0)? round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0) + $Bat_P,0) : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) },

Actual_Battery_charge_usable_P:[Act_state_of_charge|Battery_MinSOC].* {my $x = (12800*(ReadingsVal($NAME,"Act_state_of_charge",0)-ReadingsVal($NAME,"Battery_MinSOC",0))/100);;;; ($x lt 0)? 0 : round($x,0) },

SW_Inverter_Generation_P_Actual:Inverter_Generation_P_Actual.* {round(ReadingsVal($NAME,"Inverter_Generation_P_Actual",0)+ReadingsVal("WR_2","Inverter_Generation_P_Actual",0),0) },

SW_Home_own_consumption:[Total_Active_P_EM|Total_AC_Active_P:].* {round(ReadingsVal($NAME,"Total_Active_P_EM",0)+ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)},
SW_Total_AC_Active_P:Total_AC_Active_P:.*  {round(ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)},


SW_Total_DC_P:Total_DC_P:.* {round(ReadingsVal($NAME,"Total_DC_P",0)+ReadingsVal("WR_2","Total_DC_P",0),0) },

SW_Total_DC_P_sumOfAllPVInputs:Total_DC_P_sumOfAllPVInputs.* {round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0)+ReadingsVal("WR_2","Total_DC_P_sumOfAllPVInputs",0),0) },

SW_Total_PV_P_reserve:SW_Total_DC_P_sumOfAllPVInputs.* {my $reserve = ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs","0") * 0.90 - ReadingsVal($NAME,"SW_Home_own_consumption",0);;;; ($reserve lt 0)? 0 : round($reserve,0)  },

SW_Total_DC_P_Max:SW_Total_DC_P_sumOfAllPVInputs.* { my $Bat_out = (ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I","0")*ReadingsVal($NAME,"Battery_voltage",0));;;; ($Bat_out gt 0)? round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0) + $Bat_out,0) : round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0),0) },

SW_Yield_Daily:Daily_yield.* { round(ReadingsVal($NAME,"Daily_yield",0)+ReadingsVal("WR_2","Daily_yield",0),0) },
SW_Yield_Monthly:Monthly_yield.* { round(ReadingsVal($NAME,"Monthly_yield",0)+ReadingsVal("WR_2","Monthly_yield",0),0) },
SW_Yield_Yearly:Yearly_yield.* { round(ReadingsVal($NAME,"Yearly_yield",0)+ReadingsVal("WR_2","Yearly_yield",0),0) },
SW_Yield_Total:Total_yield.* { round(ReadingsVal($NAME,"Total_yield",0)+ReadingsVal("WR_2","Total_yield",0),0) },

SW_Home_own_consumption_from_PV:[Total_Active_P_EM|SW_Home_own_consumption:|Home_own_consumption_from_grid|Home_own_consumption_from_Battery].* { (ReadingsVal($NAME,"Total_Active_P_EM",0) ge 0) ? ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_grid",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) :  ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0);;;; },
SW_Home_own_consumption_from_Battery:[SW_Home_own_consumption_from_PV|Home_own_consumption_from_Battery].* { ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) },
SW_Home_own_consumption_from_grid:[SW_Home_own_consumption_from_PV|Home_own_consumption_from_grid].* { ReadingsVal($NAME,"Home_own_consumption_from_grid",0) },

P_WR_1_DC1 { ReadingsVal("WR_1","P_DC1",0) },
P_WR_1_DC2 { ReadingsVal("WR_1","P_DC2",0) },
P_WR_2_DC1 { ReadingsVal("WR_2","P_DC1",0) },
P_WR_2_DC2 { ReadingsVal("WR_2","P_DC2",0) },
P_WR_2_DC3 { ReadingsVal("WR_2","P_DC3",0) },

P_WR_1_DC1_pM { ReadingsVal("WR_1","P_DC1",0) / 10 },
P_WR_1_DC2_pM { ReadingsVal("WR_1","P_DC2",0) / 10 },
P_WR_2_DC1_pM { ReadingsVal("WR_2","P_DC1",0) / 11 },
P_WR_2_DC2_pM { ReadingsVal("WR_2","P_DC2",0) / 9 },
P_WR_2_DC3_pM { ReadingsVal("WR_2","P_DC3",0) / 9 },

P_WR_1_DC1_pM_Relative { ReadingsVal($NAME,"P_WR_1_DC1_pM",0) > 5 ? ReadingsVal($NAME,"P_WR_1_DC1_pM",0) / (ReadingsVal($NAME,"P_WR_1_DC1_pM",0) + ReadingsVal($NAME,"P_WR_1_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC1_pM",0) + ReadingsVal($NAME,"P_WR_2_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC3_pM",0)) * 100 : 0 },
P_WR_1_DC2_pM_Relative { ReadingsVal($NAME,"P_WR_1_DC2_pM",0) > 5 ? ReadingsVal($NAME,"P_WR_1_DC2_pM",0) / (ReadingsVal($NAME,"P_WR_1_DC1_pM",0) + ReadingsVal($NAME,"P_WR_1_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC1_pM",0) + ReadingsVal($NAME,"P_WR_2_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC3_pM",0)) * 100 : 0 },
P_WR_2_DC1_pM_Relative { ReadingsVal($NAME,"P_WR_2_DC1_pM",0) > 5 ? ReadingsVal($NAME,"P_WR_2_DC1_pM",0) / (ReadingsVal($NAME,"P_WR_1_DC1_pM",0) + ReadingsVal($NAME,"P_WR_1_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC1_pM",0) + ReadingsVal($NAME,"P_WR_2_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC3_pM",0)) * 100 : 0 },
P_WR_2_DC2_pM_Relative { ReadingsVal($NAME,"P_WR_2_DC2_pM",0) > 5 ? ReadingsVal($NAME,"P_WR_2_DC2_pM",0) / (ReadingsVal($NAME,"P_WR_1_DC1_pM",0) + ReadingsVal($NAME,"P_WR_1_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC1_pM",0) + ReadingsVal($NAME,"P_WR_2_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC3_pM",0)) * 100 : 0 },
P_WR_2_DC3_pM_Relative { ReadingsVal($NAME,"P_WR_2_DC3_pM",0) > 5 ? ReadingsVal($NAME,"P_WR_2_DC3_pM",0) / (ReadingsVal($NAME,"P_WR_1_DC1_pM",0) + ReadingsVal($NAME,"P_WR_1_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC1_pM",0) + ReadingsVal($NAME,"P_WR_2_DC2_pM",0) + ReadingsVal($NAME,"P_WR_2_DC3_pM",0)) * 100 : 0 },

WR_1_Load { abs(ReadingsVal("WR_1","Total_AC_Apparent_P",0)) / ReadingsVal("WR_1","Work_Capacity",0) * 100 },
WR_2_Load { abs(ReadingsVal("WR_2","Total_AC_Apparent_P",0)) / ReadingsVal("WR_2","Work_Capacity",0) * 100 },

Wirkungsgrad_Module_bezogen_auf_Sollwirkungsgrad { ReadingsVal("WR_1","SW_Total_DC_P_sumOfAllPVInputs",0) / ((ReadingsNum("wetterstationinternet.solarstrahlung","state",0) + 0.00001) * 49 * 1.82 * 0.197) * 100 },

U_WR_1_DC1 { ReadingsVal("WR_1","U_DC1",0) },
U_WR_1_DC2 { ReadingsVal("WR_1","U_DC2",0) },
U_WR_2_DC1 { ReadingsVal("WR_2","U_DC1",0) },
U_WR_2_DC2 { ReadingsVal("WR_2","U_DC2",0) },
U_WR_2_DC3 { ReadingsVal("WR_2","U_DC3",0) },

U_WR_1_DC1_pM { ReadingsVal("WR_1","U_DC1",0) / 10 },
U_WR_1_DC2_pM { ReadingsVal("WR_1","U_DC2",0) / 10 },
U_WR_2_DC1_pM { ReadingsVal("WR_2","U_DC1",0) / 11 },
U_WR_2_DC2_pM { ReadingsVal("WR_2","U_DC2",0) / 9 },
U_WR_2_DC3_pM { ReadingsVal("WR_2","U_DC3",0) / 9 },

I_WR_1_DC1 { ReadingsVal("WR_1","I_DC1",0) },
I_WR_1_DC2 { ReadingsVal("WR_1","I_DC2",0) },
I_WR_2_DC1 { ReadingsVal("WR_2","I_DC1",0) },
I_WR_2_DC2 { ReadingsVal("WR_2","I_DC2",0) },
I_WR_2_DC3 { ReadingsVal("WR_2","I_DC3",0) },

I_WR_1_DC1_pM { ReadingsVal("WR_1","I_DC1",0) / 10 },
I_WR_1_DC2_pM { ReadingsVal("WR_1","I_DC2",0) / 10 },
I_WR_2_DC1_pM { ReadingsVal("WR_2","I_DC1",0) / 11 },
I_WR_2_DC2_pM { ReadingsVal("WR_2","I_DC2",0) / 9 },
I_WR_2_DC3_pM { ReadingsVal("WR_2","I_DC3",0) / 9 },

Ertrag_Ersparnis_Tag { ReadingsVal("WR_1","SW_Yield_Daily",0) * 0.3021 / 1000 },
Ertrag_Ersparnis_Monat { ReadingsVal("WR_1","SW_Yield_Monthly",0) * 0.3021 / 1000 },
Ertrag_Ersparnis_Jahr { ReadingsVal("WR_1","SW_Yield_Yearly",0) * 0.3021 / 1000 },
Ertrag_Ersparnis_Gesamt { ReadingsVal("WR_1","SW_Yield_Total",0) * 0.3021 / 1000 },

Ertrag_Einspeisung_Tag { ReadingsVal("WR_1","SW_Yield_Daily",0) * 0.0725 / 1000 },
Ertrag_Einspeisung_Monat { ReadingsVal("WR_1","SW_Yield_Monthly",0) * 0.0725 / 1000 },
Ertrag_Einspeisung_Jahr { ReadingsVal("WR_1","SW_Yield_Yearly",0) * 0.0725 / 1000 },
Ertrag_Einspeisung_Gesamt { ReadingsVal("WR_1","SW_Yield_Total",0) * 0.0725 / 1000 },

Ertrag_Gesamt { ReadingsVal("WR_1","SW_Yield_Total",0) / 1000 },

Einspeisung { ReadingsVal("WR_1","Actual_Battery_charge_-minus_or_discharge_-plus_P",0) < 0 ? (ReadingsVal("WR_1","SW_Total_PV_P_reserve",0) - ReadingsVal("WR_1","Actual_Battery_charge_-minus_or_discharge_-plus_P",0)) / 1000 : 0 },

Leistung_Selbst_Erzeugt { ReadingsVal("WR_1","SW_Total_DC_P_sumOfAllPVInputs",0) + (ReadingsVal("WR_1","Actual_Battery_charge_-minus_or_discharge_-plus_P",0) > 0 ? ReadingsVal("WR_1","Actual_Battery_charge_-minus_or_discharge_-plus_P",0) :0) },

Eigenverbrauch_aus_Photovoltaik_Zaehler { ReadingsVal("WR_1","SW_Yield_Total",0) / 1000 - ReadingsVal("ElectricityCalculator_Netzeinspeisung","KSEM_Active_energy_minus_EnergyMeter",0) },

Stromverbrauch_Gesamt { ReadingsVal("WR_1","SW_Home_own_consumption", "Undef")  },
Stromverbrauch_Gesamt_Zaehler { ReadingsVal("WR_1","SW_Yield_Total", "Undef") / 1000 * 0.95 + ReadingsVal("KSEM","Active_energy_plus", "Undef") - ReadingsVal("KSEM","Active_energy_minus", "Undef")},

Stromverbrauch_Heizung { ReadingsVal("OW_Stromzaehler","Stromverbrauch_Heizung", "Undef") },
Stromverbrauch_Wallbox { ReadingsVal("OW_Stromzaehler","Stromverbrauch_Wallbox", "Undef") },

Stromverbrauch_Haus { ReadingsVal("WR_1","Stromverbrauch_Gesamt", "Undef") - ReadingsVal("WR_1","Stromverbrauch_Heizung", "Undef") - ReadingsVal("WR_1","Stromverbrauch_Wallbox", "Undef") },
Stromverbrauch_Haus_Zaehler { ReadingsVal("WR_1","Stromverbrauch_Gesamt_Zaehler", "Undef") - ReadingsVal("OW_Stromzaehler","Stromverbrauch_Heizung_Zaehler", "Undef") - ReadingsVal("OW_Stromzaehler","Stromverbrauch_Wallbox_Zaehler", "Undef") },

Strombezug_Batterie { ReadingsVal("WR_1","Total_home_consumption_Battery", "Undef") / 1000 },

Autarkie { abs((1-ReadingsVal("WR_1","SW_Home_own_consumption_from_grid", "Undef") / ReadingsVal("WR_1","SW_Home_own_consumption", "Undef")) * 100) },
AutarkieTag { abs((1 - ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyDay", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyDay","Undef")) * 100) },
AutarkieVortag { abs((1 - ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyDayLast", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyDayLast","Undef")) * 100) },
AutarkieMonat { abs((1 - ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyMonth", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyMonth","Undef")) * 100) },
AutarkieVormonat { abs((1 - ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyMonthLast", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyMonthLast","Undef")) * 100) },
AutarkieJahr { abs((1 - ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyYear", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyYear","Undef")) * 100) },
AutarkieVorjahr { abs((1 - ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyYearLast", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyYearLast","Undef")) * 100) },
AutarkieGesamt { abs((1 - ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyMeter", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyMeter","Undef")) * 100) },

AutarkieErtrag { abs(ReadingsVal("WR_1","SW_Total_DC_P_sumOfAllPVInputs", "Undef") / ReadingsVal("WR_1","SW_Home_own_consumption", "Undef") * 100) },
AutarkieErtragTag { abs(ReadingsVal("ElectricityCalculator_Photovoltaik_Ertrag","WR_1_Ertrag_Gesamt_EnergyDay", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyDay","Undef") * 100) },
AutarkieErtragVortag { abs(ReadingsVal("ElectricityCalculator_Photovoltaik_Ertrag","WR_1_Ertrag_Gesamt_EnergyDayLast", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyDayLast","Undef") * 100) },
AutarkieErtragMonat { abs(ReadingsVal("ElectricityCalculator_Photovoltaik_Ertrag","WR_1_Ertrag_Gesamt_EnergyMonth", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyMonth","Undef") * 100) },
AutarkieErtragVormonat { abs(ReadingsVal("ElectricityCalculator_Photovoltaik_Ertrag","WR_1_Ertrag_Gesamt_EnergyMonthLast", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyMonthLast","Undef") * 100) },
AutarkieErtragJahr { abs(ReadingsVal("ElectricityCalculator_Photovoltaik_Ertrag","WR_1_Ertrag_Gesamt_EnergyYear", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyYear","Undef") * 100) },
AutarkieErtragVorjahr { abs(ReadingsVal("ElectricityCalculator_Photovoltaik_Ertrag","WR_1_Ertrag_Gesamt_EnergyYearLast", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyYearLast","Undef") * 100) },
AutarkieErtragGesamt { abs(ReadingsVal("ElectricityCalculator_Photovoltaik_Ertrag","WR_1_Ertrag_Gesamt_EnergyMeter", "Undef") / ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyMeter","Undef") * 100) },

StromkostenNettoTag { ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyCostDay", "Undef") - ReadingsVal("ElectricityCalculator_Netzeinspeisung","KSEM_Active_energy_minus_EnergyCostDay","Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostDay","Undef") },
StromkostenNettoVortag { ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyCostDayLast", "Undef") - ReadingsVal("ElectricityCalculator_Netzeinspeisung","KSEM_Active_energy_minus_EnergyCostDayLast","Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostDayLast","Undef") },
StromkostenNettoMonat { ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyCostMonth", "Undef") - ReadingsVal("ElectricityCalculator_Netzeinspeisung","KSEM_Active_energy_minus_EnergyCostMonth","Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostMonth","Undef") },
StromkostenNettoVormonat { ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyCostMonthLast", "Undef") - ReadingsVal("ElectricityCalculator_Netzeinspeisung","KSEM_Active_energy_minus_EnergyCostMonthLast","Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostMonthLast","Undef") },
StromkostenNettoJahr { ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyCostYear", "Undef") - ReadingsVal("ElectricityCalculator_Netzeinspeisung","KSEM_Active_energy_minus_EnergyCostYear","Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostYear","Undef") },
StromkostenNettoVorjahr { ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyCostYearLast", "Undef") - ReadingsVal("ElectricityCalculator_Netzeinspeisung","KSEM_Active_energy_minus_EnergyCostYearLast","Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostYearLast","Undef") },
StromkostenNettoGesamt { ReadingsVal("ElectricityCalculator_Netzbezug","KSEM_Active_energy_plus_EnergyCostMeter", "Undef") - ReadingsVal("ElectricityCalculator_Netzeinspeisung","KSEM_Active_energy_minus_EnergyCostMeter","Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostMeter","Undef") },

StromkostenHausHeizungTag { ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyCostDay", "Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostDay","Undef") },
StromkostenHausHeizungVortag { ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyCostDayLast", "Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostDayLast","Undef") },
StromkostenHausHeizungMonat { ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyCostMonth", "Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostMonth","Undef") },
StromkostenHausHeizungVormonat { ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyCostMonthLast", "Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostMonthLast","Undef") },
StromkostenHausHeizungJahr { ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyCostYear", "Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostYear","Undef") },
StromkostenHausHeizungVorjahr { ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyCostYearLast", "Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostYearLast","Undef") },
StromkostenHausHeizungGesamt { ReadingsVal("ElectricityCalculator_Gesamt","WR_1_Stromverbrauch_Gesamt_Zaehler_EnergyCostMeter", "Undef") - ReadingsVal("ElectricityCalculator_Wallbox","OW_Stromzaehler_Stromverbrauch_Wallbox_Zaehler_EnergyCostMeter","Undef") },

StromkostenErsparnisTag { ReadingsVal("WR_1","StromkostenHausHeizungTag", "Undef") - ReadingsVal("WR_1","StromkostenNettoTag","Undef") },
StromkostenErsparnisVortag { ReadingsVal("WR_1","StromkostenHausHeizungVortag", "Undef") - ReadingsVal("WR_1","StromkostenNettoVortag","Undef") },
StromkostenErsparnisMonat { ReadingsVal("WR_1","StromkostenHausHeizungMonat", "Undef") - ReadingsVal("WR_1","StromkostenNettoMonat","Undef") },
StromkostenErsparnisVormonat { ReadingsVal("WR_1","StromkostenHausHeizungVormonat", "Undef") - ReadingsVal("WR_1","StromkostenNettoVormonat","Undef") },
StromkostenErsparnisJahr { ReadingsVal("WR_1","StromkostenHausHeizungJahr", "Undef") - ReadingsVal("WR_1","StromkostenNettoJahr","Undef") },
StromkostenErsparnisVorjahr { ReadingsVal("WR_1","StromkostenHausHeizungVorjahr", "Undef") - ReadingsVal("WR_1","StromkostenNettoVorjahr","Undef") },
StromkostenErsparnisGesamt { ReadingsVal("WR_1","StromkostenHausHeizungGesamt", "Undef") - ReadingsVal("WR_1","StromkostenNettoGesamt","Undef") } ,

StromkostenErsparnisProzentTag { (1 - ReadingsVal("WR_1","StromkostenNettoTag", "Undef") / ReadingsVal("WR_1","StromkostenHausHeizungTag","Undef")) * 100 },
StromkostenErsparnisProzentVortag { (1 - ReadingsVal("WR_1","StromkostenNettoVortag", "Undef") / ReadingsVal("WR_1","StromkostenHausHeizungVortag","Undef")) * 100 },
StromkostenErsparnisProzentMonat { (1 - ReadingsVal("WR_1","StromkostenNettoMonat", "Undef") / ReadingsVal("WR_1","StromkostenHausHeizungMonat","Undef")) * 100 },
StromkostenErsparnisProzentVormonat { (1 - ReadingsVal("WR_1","StromkostenNettoVormonat", "Undef") / ReadingsVal("WR_1","StromkostenHausHeizungVormonat","Undef")) * 100 },
StromkostenErsparnisProzentJahr { (1 - ReadingsVal("WR_1","StromkostenNettoJahr", "Undef") / ReadingsVal("WR_1","StromkostenHausHeizungJahr","Undef")) * 100 },
StromkostenErsparnisProzentVorjahr { (1 - ReadingsVal("WR_1","StromkostenNettoVorjahr", "Undef") / ReadingsVal("WR_1","StromkostenHausHeizungVorjahr","Undef")) * 100 },
StromkostenErsparnisProzentGesamt { (1 - ReadingsVal("WR_1","StromkostenNettoGesamt", "Undef") / ReadingsVal("WR_1","StromkostenHausHeizungGesamt","Undef")) * 100 }



Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Januar 2023, 14:07:51
Hallo Oli,
Zitat von: ojb am 06 Januar 2023, 13:16:42
Wallboxvergütung ist in der Tat von meinem Arbeitgeber, ist Teil der Lease-Rate.

Ich lasse alle Kosten über ElectricityCalculator's berechnen.

Wenn sich Tarifänderungen ergeben, dann ändere ich den Tarif einfach in den ElectricityCalculator's.
stellst Du da die Definition auch noch rein?

Zitat
Fast alle Berechnungen bezüglich PV (Autarkie, Eigenverbrauch etc.) laufen im WR_1.
Das ist doch beim WR_1_API auch für den Schwarm bereits drin. Auch der Vergleich mit Monat/Quartal/Jahr zum Vorjahr wurde bereits im uiTable aufgenommen.
Kleinere Anpassungen mache ich gerne noch, falls was fehlt

Zitat
Tibber finde ich sehr interessant und ich will da unbedingt hin.
Ich habe jetzt eine Mail mit meinem technischen Setup hingeschrieben (PV-Anlage, Kaskadenmessverfahren) und sie gefragt, ob man das alles mit einem Vertrag
abbilden kann, weil Betriebsstrom und Wärmestrom wäre ja dann das gleiche.
Da ist dann die Kaskade überflüssig.
Bei Tibber und aWATTar bin ich aktuell auch im FHEM dran. Mir schwebt gerade ein "Börsen" Device vor, da Tibber die Börsenpreise erst beim Vertragsabschluss
abfragbar macht. Das Device soll dann beide EVUs bedienen und auch den aktuellen Anbieter zum Vergleich berechnen. Dort würde ich auch die Kostenberechnung
der PV-Anlage sehen, damit man alles an einer Stelle hat.
Über die Datenbank möchte ich da auch wechselnde Tarif Preise möglich machen, damit man auch mal wechseln kann und Preissteigerungen abbildbar sind.

Zitat
Batteriestrom wird also primär in die Wärmepumpe geleitet.
Den aktuellen Tibber-Tarif auszuwerten und dann z.B. Wärmepumpe oder E-Auto-Ladung zu optimieren das ist das Ziel.
Das kann man über einen Trigger lösen, den man im Starkverbraucher Device abfragt.

Zitat
Super wäre natürlich auch, wenn man die Haus-Batterie gezielt über Netz aufladen könnte. Aber ich habe gehört das geht nur mir Installateurspasswort.
Das ist in Deutschland und insbesondere in der Schweiz nicht gestattet.
Für Wartungsarbeiten am Speicher habe ich letzte Tage einen Trigger im WR_1_Speicher_1_ExternControl eingebaut.
Das geht dann auch ohne Installateur Passwort. Siehe dazu den Anhang

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Januar 2023, 14:10:10
Nochmal Hallo,
hier habe ich gerade einen Snapshot, wie es aussieht, wenn der KSEM mal nicht im Netz erreichbar ist.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 06 Januar 2023, 14:27:16
Zitat von: ch.eick am 06 Januar 2023, 14:07:51
Hallo Oli,stellst Du da die Definition auch noch rein?

Hier die Definition eines der ElectricityCalculator's, die anderen sind entsprechend:

WR_1:Eigenverbrauch_aus_Photovoltaik_Zaehler.*


Gibt dann Readings wie im Bild.

Zitat von: ch.eick am 06 Januar 2023, 14:07:51
Das ist doch beim WR_1_API auch für den Schwarm bereits drin. Auch der Vergleich mit

Ja stimmt, aber ich hab laaaaange nur mit WR_1 gearbeitet und die API gar nicht benutzt. Deshalb hab ich da alles implementiert. API hab ich dann begonnen als ich die Steuerung des SOCs haben wollte.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Januar 2023, 15:34:31
Zitat von: ojb am 06 Januar 2023, 14:27:16
Hier die Definition eines der ElectricityCalculator's, die anderen sind entsprechend:

WR_1:Eigenverbrauch_aus_Photovoltaik_Zaehler.*

Somit hast Du für jede Statistic jetzt ein einzelnes ElectricityCalculator Device ?

Dann würde es sich ja lohnen das auf das WR_1_API Device umzubauen. Die bisherigen Zähler kann man in der Datenbank entsprechend umbenennen.
Dann wärst Du wieder im main stream :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 07 Januar 2023, 20:42:28
Zitat von: ch.eick am 10 Dezember 2022, 11:24:53
Hallo zusammen,

ich teste gerade nochmal die WR_1_Speicher_1_ExternControl Zeit Steuerung.
Dadurch wollte ich dann jetzt im Winter mal nur den Speicher zur Tageszeit verwenden, falls er mal voll ist. Die Zeit Steuerung hatte ich mal für die Schweizer mit rein genommen, die Tagsüber einen Hochtarif und nachts einen Niedigtarif haben. Damit werde ich warscheinlich keinen Netzausfall verhindern :) :) :) , aber man probiert ja mal aus was man kann ;)
Sollte es mal attraktive Tarif Modelle geben, die man auch bestellen kann, würde soetwas ja auch bei uns Sinn machen.

VG   Chrstian

Hallo Christian

Du hast ja mal die Zeit Steuerung implementiert. Ich wollte diese bei mir auch mal aktivieren. Dabei musste ich jedoch feststellen, dass das smart_laden gar nicht funktioniert. Ist ja eigentlich auch klar, da im cmd_2 der Steuerung expliziert nur bei Automatik das smart_laden gestartet wird. Ist das wirklich richtig so?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Waldgeist78 am 07 Januar 2023, 21:33:55
Hallo zusammen,

Sehr spannendes Thema, allerdings mega komplex.
Ich habe so nach und nach alles eingerichtet lt. dem Wiki allerdings bekomme ich folgenden Fehler mit SQLite Datenbank nicht weg in Zusammenhang mit der Solar Forecast Berechnung. Der Fehler kommt auch jede Stunde im Log bei der Ausführung der Abfrage.
Hat jemand eine Idee?



Zitat

2023.01.07 20:00:01 2: DbRep LogDBRep_PV_Forecast_SQL - ERROR - DBD::SQLite::db do failed: near "SET": syntax error at ./FHEM/93_DbRep.pm line 13181.

2023.01.07 21:03:52 3: Solar_Correction_Temp        : 1.028
2023.01.07 21:03:52 3: Solar_Correction_Faktor      : 1
2023.01.07 21:03:52 3: Solar_Correction_Faktor_auto : DBD::SQLite::db do failed: near "SET": syntax error at ./FHEM/93_DbRep.pm line 13181.

2023.01.07 21:03:52 3: Forecast,Hour,Estimation 1h  : 0 20 0
2023.01.07 21:03:52 3: Solar_SolarRadiation         : 0 W 0.00 J
2023.01.07 21:03:52 2: DbRep LogDBRep_PV_Forecast_SQL - ERROR - DBD::SQLite::db do failed: near "SET": syntax error at ./FHEM/93_DbRep.pm line 13181.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 07 Januar 2023, 21:58:18
Ich grätsch mal kurz rein damit ihr nicht ewig rumsucht ...


2023.01.07 21:03:52 2: DbRep LogDBRep_PV_Forecast_SQL - ERROR - DBD::SQLite::db do failed: near "SET": syntax error at ./FHEM/93_DbRep.pm line 13181.


SQLite kann keine Variablendefinitionen via "SET" so wie MySQL/MariaDB es kann.
ch.eick arbeitet mit der MySQL/Oracle Syntax.

VG
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Januar 2023, 09:32:35
Zitat von: Waldgeist78 am 07 Januar 2023, 21:33:55
Hallo zusammen,

Sehr spannendes Thema, allerdings mega komplex.
Ich habe so nach und nach alles eingerichtet lt. dem Wiki allerdings bekomme ich folgenden Fehler mit SQLite Datenbank nicht weg in Zusammenhang mit der Solar Forecast Berechnung. Der Fehler kommt auch jede Stunde im Log bei der Ausführung der Abfrage.
Hat jemand eine Idee?
Moin,
als erstes mal vielen Dank an Heiko, für die Hilfestellung.

Du könntest als erstes mal die Autokorrektur abschalten.

setreading WR_1_config forecast_factor_autocorrection 0

Ich habe festgestellt, das die Autokorrekur nicht so wirklich viel bringt und verwende sie selber bereits ca. 1 Jahr nicht mehr.Das Ergebnis der Prognose hängt viel stärker vom DWD ab und liegt deshalb, gerade bei schlechtem Wetter, oft daneben. Das bekommt man selbst mit einer Autokorrektur nicht wirklich gut in den Griff :-( .
Momentan verfolge ich einen Ansatz mit KI Prognose, bei der die KI aus den Vergleichsdaten lernen soll. Das Theme hatte Peter hier schon mal im Thread aufgebracht und testet es bereits seit geraumer Zeit. Meine ersten Schritte in dem Umfeld belaufen sich momentan auf die Integration in FHEM und die Optimierung/Minimierung des Datenvolumens aus der Datenbank, damit die Laufzeit nicht zu lang wird und der Speicherbedarf reduziert wird. Es sieht aber schon recht gut aus.

Heiko hat aber recht, ich verwende ein möglichst originales MySQL, was sogar auf dem RPI4 arm64 im Docker Container läuft. Das Image wird direkt von Oracle zur Verfügung gestellt.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 08 Januar 2023, 09:54:32
##############################################################################################################
16_Stop_Standby_Entladung\

Hallo Christian,
zu der "16_Stop_Standby_Entladung" habe ich einmalig folgendes beobachten könne.
Mein Speicher ist in einer Nacht auf 4% abgefallen, (minSOC war auf 5% eingestellt von mir selber verzockt), eine Aussage über die Standby Entladung habe ich damit nicht wirklich beobachte es aber weiter mit 10% minSOC.
Gestern war dann wieder ein schöner Solartag und da konnte ich das Laden etwas beobachten und dabei ist mir aufgefallen das immer zwischen Laden und Einspeisen hin und her geflipt wurde. Dabei war
- SOC 5%
- externe Batteriesteuerung (WR_1) aktiviert
- smart Laden (WR_1_Speicher_1_ExternControl) aktiviert

Ich bin nicht dahinter gekommen was da passiert.
- block_2_smart_Laden_start_Automatik
- block_2_smart_Laden_beenden_Automatik
werden zyklisch zeitgleich executed.

Habe dann im WR_1_Speicher_1_ExternControl das 3_smart_Laden_beenden_Automatik ausgelöst, dann hat der Speicher normal geladen.

ZitatDas Ganze reagiert dann verzögert mit ca. der eingestellten Battery_ComMonitor_Time, die im Plenticore geändert werden kann.
Auch das Laden verzögert sich dann maximal um diese Zeit, da ja erst der Default wieder erreicht werden muss.

Hat es damit zu tun?
Ich finde im Kostal dazu nur "Timeout ext. Batteriesteuerung 180" und die Zeit würde in etwa zu dem Flip zischen Laden und Einspeisen passen.

Idee?

Grüßle Wolfgang



hier solllte eigentlich nix durchgestrichen sein  :-[
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Januar 2023, 11:36:02
Hallo Wolfgang,
das mit dem "16_Stop_Standby_Entladung" war ein Test, der leider nicht wirklich geholfen hat.
Nimm den ganzen Block einfach wieder raus, da ist meine Euphorie mit mir durch gegangen. Besser wäre die aktuellste FW des Plenticore, die jetzt viel früher in den Ruhe 1 Modus schaltet.

VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Januar 2023, 12:02:25
Zitat von: Mumpitz am 07 Januar 2023, 20:42:28
Du hast ja mal die Zeit Steuerung implementiert. Ich wollte diese bei mir auch mal aktivieren. Dabei musste ich jedoch feststellen, dass das smart_laden gar nicht funktioniert. Ist ja eigentlich auch klar, da im cmd_2 der Steuerung expliziert nur bei Automatik das smart_laden gestartet wird. Ist das wirklich richtig so?
Hallo,
schön, dass Ihr alle Fehler aufspürt, zum Glück war mir das auch schon aufgefallen :-)

Ich habe nun im Wiki mal wieder das WR_1_Speicher_1_ExternControl Device (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#RAW_Definition_des_WR_1_Speicher_1_ExternControl) aktualisiert. Das läuft jetzt schon einige Wochen so bei mir.

- Es gab Probleme mit dem smart_Laden bei der Zeitsteuerung
- Auch die Verriegelung bei der WallBox war nicht sauber, da im Speichermodus smart_Laden beim Beenden der Speicherverriegelung,
   nicht wieder sauber ins smart_laden zurück geschaltet wurde.


VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 08 Januar 2023, 14:51:15
Hallo Christian,
deine Euphorie gefällt mir gut :-)
habe den Block wieder entfernt. Mein Kostal sollte auf dem neusten Stand sein, mit der Suche finde ich jedenfalls nichts neues, isofern sollte das schon passen.
Wie ich sehe hast Du auch noch die WB_1 Steuerung weiter ausgebaut, hab ich auch mal mit übernommen und für den go-eCharger angepasst.
Testen kann ich das jetzt nur nicht wegen zu wenig Sonne.

VG  Wolfgang

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Januar 2023, 15:03:54
Zitat von: zwölfgang am 08 Januar 2023, 14:51:15
Hallo Christian,
deine Euphorie gefällt mir gut :-)
habe den Block wieder entfernt. Mein Kostal sollte auf dem neusten Stand sein, mit der Suche finde ich jedenfalls nichts neues, isofern sollte das schon passen.
Wie ich sehe hast Du auch noch die WB_1 Steuerung weiter ausgebaut, hab ich auch mal mit übernommen und für den go-eCharger angepasst.
Testen kann ich das jetzt nur nicht wegen zu wenig Sonne.
Schön, wenn es Dir gefällt, manchmal kommt ja auch was gutes dabei raus :-)
Bei der WB_1 Ansteuerung war das Problem im Zusammenhang mit dem smart_Laden, da wurde der vorherige Zustand nicht wieder hergestellt, aber das klappt bei mir jetzt wie gewünscht.
Ansonsten bin ich gerade an den Statistiken des BEV, um dort direkt den Vormonat zu vergleichen, oder auch die Ladevorgänge an den öffentlichen Säulen zu berücksichtigen.
Da habe ich mit in der Datenbank bereits alle Ladevorgänge mit dem Device Namen WB_0 gespeichert und diese dann mit DbRep abgefragt. Das Ergebnis ist schon im stateFormat dargestellt.

Als WB_0 schwebt mir ein DOIF im Perl Modus mit uiTable vor, bei dem ich dann manuell die externen Ladevorgänge eingeben kann und diese dann im DbLog mit dem richtigen TIMESTAMP erscheinen. Das DOIF kann dann direkt ein DbRep für die Abfrage der Statistik ansteuern, sodass diese dann als Vormonat oder Vorjahr angezeigt werden können. So wird der Verbrauch exakter angezeigt.
Leider klappt bei meinem Kartenanbieter die FHEM HTTPMOD Abfrage der Ladevorgänge nicht, aber das sind bei mir ja auch nur 5-10 pro Jahr, inklusive der externen privaten.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Januar 2023, 15:12:22
Zitat von: zwölfgang am 08 Januar 2023, 14:51:15
Wie ich sehe hast Du auch noch die WB_1 Steuerung weiter ausgebaut, hab ich auch mal mit übernommen und für den go-eCharger angepasst.
Testen kann ich das jetzt nur nicht wegen zu wenig Sonne.
Im Winter lade ich alles mit Sofortladen, da eh nicht genug PV Kommt und das dann durch den Hausspeicher aufgenommen würde.
Im WR_1_Speicher_1_ExternControl gab es nur änderungen bei der smart_Laden Umschaltung, das kannst Du auch mit den Sofortladen testen.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2023, 09:45:37
Hallo zusammen,
ich arbeite gerade an einem Device zur Erfassung der externen Ladeleistung für das BEV. Man hat ja nicht nur die Ladung an der eigenen Ladesäule ;-)
Falls Ihr dazu eigenen Ideen oder Anregungen habt wäre jetzt der geeignete Zeitpunkt.

Folgendes ist die Idee:

- Das Device wird WB_0 heißen
- Man muss den TIMESTAMP für die Datenbank eingeben können
- Es kann mehrere BEVs geben, die ausgewählt werden können
- Die Ladeleistung muss mit rein
- Der gesamt Preis für's Laden sollte mit rein
- Es sollen direkt Monats/Jahres Summen gebildet werden
- Über ein DbRep sollen bisherige Informationen angezeigt werden, die die Orientierung bei der Erfassung ermöglichen
- Ein Löschen wäre schön
- Bei den Leistungsreports zur Wallbox für Monat/Jahr möchte ich das in dem BEV in der Statistik mit aufsummiert bekommen

Noch offene Fragen
- Braucht man die Ladekartennummer?
- Macht es Sinn fremde private Ladestellen separat zu reporten?
- Müssen auch die Kostenlosen Ladesäulen aufgelistet werden,
  oder erfasst man die mit einem eigenen Preis?

Leider bekomme ich von meiner Ladekarte über das Portal nur manuell einen EXCEL Report, eine API gibt es wohl nicht.
Einen Import in die Datenbank würde ich bevorzugen.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 10 Januar 2023, 11:36:09
Zitat################################################################################################################
## 6 Wiederhole alle 180s die Kommandos der ExternControl Steuerung
##
16_Stop_Standby_Entladung

Hallo Christian,
ich hatt kürzlich den Block ins WR_1_Speicher_1_ExternControl eingebaut und dann wieder entfernt. Dazu habe ich es aus dem Wiki neu herauskopiert und installiert.
Jetzt passiert folgendes: Block 6,7,8 funktionieren nicht mehr. Im Log steht:
Zitat2023.01.09 23:18:02 4: WR_1_Speicher_1_ExternControl: condition c10: Unrecognized character \xC2; marked by <-- HERE after t   = (1 -<-- HERE near column 823, line 48.
in perl block: 6_Kommando_Wiederholung
2023.01.09 23:18:02 4: WR_1_Speicher_1_ExternControl: condition c11: Unrecognized character \xC2; marked by <-- HERE after SOCNew   =<-- HERE near column 292, line 42.
in perl block: 7_SOC_Calculation
2023.01.09 23:18:02 4: WR_1_Speicher_1_ExternControl: condition c12: Unrecognized character \xC2; marked by <-- HERE after  DOIF; if(<-- HERE near column 18, line 1.
in perl block: 8_Reset

Hab dann die drei Blöcke aus meiner Sicherung wieder eingebaut und alles funktioniert wieder, alle Blöcke stehen wieder auf executed
Kann es sein das ins Wiki ein Formatfehler wie es von Otto123 hier https://forum.fhem.de/index.php?topic=121864.0 (https://forum.fhem.de/index.php?topic=121864.0) beschrieben wurde da mit reingeschlüpft ist?

VG
Wolfgang


Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 10 Januar 2023, 11:51:41
Frage mal in die Runde,
wie kann man so einen Fehler in einem DOIF Reading bzw. Logeintrag finden?
Zitat2023.01.09 23:18:02 4: WR_1_Speicher_1_ExternControl: condition c10: Unrecognized character \xC2; marked by <-- HERE after t   = (1 -<-- HERE near column 823, line 48.
 in perl block: 6_Kommando_Wiederholung
Den Block habe ich gefunden aber column und line hat mir da nicht wirklich weiter geholfen.
Hat dazu jemand einen Hinweis?

VG Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2023, 12:17:41
Zitat von: zwölfgang am 10 Januar 2023, 11:36:09
Hallo Christian,
ich hatt kürzlich den Block ins WR_1_Speicher_1_ExternControl eingebaut und dann wieder entfernt. Dazu habe ich es aus dem Wiki neu herauskopiert und installiert.
Jetzt passiert folgendes: Block 6,7,8 funktionieren nicht mehr. Im Log steht:
Hab dann die drei Blöcke aus meiner Sicherung wieder eingebaut und alles funktioniert wieder, alle Blöcke stehen wieder auf executed
Kann es sein das ins Wiki ein Formatfehler wie es von Otto123 hier https://forum.fhem.de/index.php?topic=121864.0 (https://forum.fhem.de/index.php?topic=121864.0) beschrieben wurde da mit reingeschlüpft ist?
Hallo Wolfgang,
copy/past könnte immer ein Problem sein :-(

Ich habe es im Wiki nochmal aktualisiert und es mir dann auch im Notepad++ angeschaut.
Dort habe ich die Sonderzeichen aktiviert und nach "t   = (1" sucht kommt man an die Stelle wie im Bild.
Eventuell hilft das ja bei der Suche.

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2023, 12:21:32
Zitat von: zwölfgang am 10 Januar 2023, 11:51:41
Frage mal in die Runde,
wie kann man so einen Fehler in einem DOIF Reading bzw. Logeintrag finden? Den Block habe ich gefunden aber column und line hat mir da nicht wirklich weiter geholfen.
Hat dazu jemand einen Hinweis?
Das ist immer schwierig, weshalb ich immer nur in kleinen Stücken Änderungen mache und teste.
Die line und column bezieht sich wohl auf den Block, der aktuell ausgeführt wurde, aber der fehler kann schon vorher im Code sein und sich erst dort auswirken.
Beim Suchen kann man dann zusätzliche Meldungen einfügen und so die Position im Code weiter einschränken.

Zusätzlich siehe auch den vorherigen Post.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 10 Januar 2023, 13:35:46
Hallo Christian,
hab das nochmal neu aus dem Wiki kopiert und mit defmod installiert, alle drei Fehler waren wieder da. Irgend etwas mach ich da wohl falsch.
Habe dann im Fhem Editor genau diese fehlerbehafteten Zeichenfolgen gesucht und neu geschrieben und siehe da, Fehler ist weg.
Sollte ich den Text aus dem Wiki zuerst noch in einen anderen Editor bearbeiten und dann ins FHEM einfügen ?
Irgendwie seltsam aber jetzt ist wieder alles gut.

VG Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 10 Januar 2023, 14:55:40
Moin zusammen,
nachdem ich mich momentan mit den hier aufgezeigten Berechnungen befasse und schon Einiges direkt mit Christian abgeklärt habe, würde ich gerne meine Einwände gegen die aktuelle Vorgehensweise zur Diskussion stellen.

Ausgangspunkt der Prognose ist RAD1h vom DWD. Gemäß deren Beschreibung gilt: "Die Globalstrahlung ist die gesamte am Erdboden ankommende solare Strahlung. Sie setzt sich aus der Direkt- und der Diffusstrahlung zusammen. Standardmäßig wird die Globalstrahlung und die Diffusstrahlung auf die horizontale Ebene bezogen gemessen. Aus beiden Komponenten lässt sich dann die Direktstrahlung ableiten."

In der Sub Solar_plain wird dann ausgerechnet, wie groß der Strahlungsanteil ist, der aufgrund der Ausrichtung der Module und des Sonnenstands noch zur Energiegewinnung beisteuert. Dieser Wert wird dann im weiteren Verlauf der Prognose mit Wetterphänomenen wie Regen/Wolken etc. "verrechnet".

Hier ist meiner Meinung nach jedoch schon der Ansatz in der Solar_plain falsch. Der Wert Rad1h sollte doch schon den Sonnenstand und Wetter berücksichtigen.

Momentan werden Strings, die zB gemäß Ausrichtung garnicht mehr beschienen sind, mit einem Prognosebetrag von 0Wh berechnet (Strings Richtung NordOst sobald die ganz im Schatten liegen). Diese liefern aber sehr wohl noch reichlich Energie, so dass hier systematisch die Prognose zu schlecht ausfällt. Man müsste doch eigentlich aus der Globalstrahlung die Direkt- und Diffusstrahlung berechnen, und das auf die Strings anwenden.

Die Direktstrahlung müsste theoretisch zusammen mit der Modulneigung betrachtet werden, um den Stundenertrag zu bekommen, also etwa so:

cosinus = cos(string_plain);
string_power_estimation  = string_kWp * cosinus * Solar_SolarRadiation;


Während die Diffusstrahlung meiner Meinung nach zu 100% zum Ertrag beiträgt.

Zuletzt bin ich unsicher, ob die Globalstrahlung des DWD, die ja stationsbezogen bereitgestellt wird, nicht auch schon Faktoren wie Wolken und Regen berücksichtigt. Dann würde ja gleich mehrfach korrigiert. Auch wenn Wikipedia keine anerkannte wissenschaftliche Quelle darstellt, möchte ich zitieren: "Die Momentanwerte der Globalstrahlung unterliegen wetterbedingt starken Schwankungen durch Bewölkung und atmosphärische Trübung. Wegen des veränderlichen Einfallswinkels des Direktstrahlungsanteils ist die Globalstrahlung mittags stärker als morgens und abends, und im Sommer stärker als im Winter." Demnach ist die aktuell durchgeführte Korrektur zwar individuell anhand empirischer Daten und Schätzungen vielleicht ok, aber eigentlich enthält der bereitgestellte Wert bereits genau jene Faktoren.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2023, 16:09:37
Zitat von: MichaelO am 10 Januar 2023, 14:55:40
Moin zusammen,
nachdem ich mich momentan mit den hier aufgezeigten Berechnungen befasse und schon Einiges direkt mit Christian abgeklärt habe, würde ich gerne meine Einwände gegen die aktuelle Vorgehensweise zur Diskussion stellen.

Ausgangspunkt der Prognose ist RAD1h vom DWD. Gemäß deren Beschreibung gilt: "Die Globalstrahlung ist die gesamte am Erdboden ankommende solare Strahlung. Sie setzt sich aus der Direkt- und der Diffusstrahlung zusammen. Standardmäßig wird die Globalstrahlung und die Diffusstrahlung auf die horizontale Ebene bezogen gemessen. Aus beiden Komponenten lässt sich dann die Direktstrahlung ableiten."

In der Sub Solar_plain wird dann ausgerechnet, wie groß der Strahlungsanteil ist, der aufgrund der Ausrichtung der Module und des Sonnenstands noch zur Energiegewinnung beisteuert. Dieser Wert wird dann im weiteren Verlauf der Prognose mit Wetterphänomenen wie Regen/Wolken etc. "verrechnet".

Hier ist meiner Meinung nach jedoch schon der Ansatz in der Solar_plain falsch. Der Wert Rad1h sollte doch schon den Sonnenstand und Wetter berücksichtigen.
Nur leider lag die Prognose ohne das noch viel weiter daneben ;-)
Ich fahre da einen empirischen Ansatz und das Ergebnis war mein Ziel. Das hat alles nichts mit echter Wissenschaft zu tun!

Zitat
Momentan werden Strings, die zB gemäß Ausrichtung garnicht mehr beschienen sind, mit einem Prognosebetrag von 0Wh berechnet (Strings Richtung NordOst sobald die ganz im Schatten liegen). Diese liefern aber sehr wohl noch reichlich Energie, so dass hier systematisch die Prognose zu schlecht ausfällt. Man müsste doch eigentlich aus der Globalstrahlung die Direkt- und Diffusstrahlung berechnen, und das auf die Strings anwenden.
In der Solar_plain() werden Grenzwerte bewust auf 0.001 gesetzt, was bei jeder Installation etwas anders ausfallen könnte. Da ist dann noch Platz für Optimierung der eigenen Prognose.

Zitat
Die Direktstrahlung müsste theoretisch zusammen mit der Modulneigung betrachtet werden, um den Stundenertrag zu bekommen, also etwa so:

cosinus = cos(string_plain);
string_power_estimation  = string_kWp * cosinus * Solar_SolarRadiation;


Während die Diffusstrahlung meiner Meinung nach zu 100% zum Ertrag beiträgt.
Dem stimme ich zu.

Zitat
Zuletzt bin ich unsicher, ob die Globalstrahlung des DWD, die ja stationsbezogen bereitgestellt wird, nicht auch schon Faktoren wie Wolken und Regen berücksichtigt. Dann würde ja gleich mehrfach korrigiert. Auch wenn Wikipedia keine anerkannte wissenschaftliche Quelle darstellt, möchte ich zitieren: "Die Momentanwerte der Globalstrahlung unterliegen wetterbedingt starken Schwankungen durch Bewölkung und atmosphärische Trübung. Wegen des veränderlichen Einfallswinkels des Direktstrahlungsanteils ist die Globalstrahlung mittags stärker als morgens und abends, und im Sommer stärker als im Winter." Demnach ist die aktuell durchgeführte Korrektur zwar individuell anhand empirischer Daten und Schätzungen vielleicht ok, aber eigentlich enthält der bereitgestellte Wert bereits genau jene Faktoren.
Das ist vollkommen richtig, wie Du das siehst. Nur sind halt leider die Ergebnisse der Prognose recht schlecht gewesen. Aus diesem Grund habe ich empirisch nach Verbesserungen gesucht und durch die Beobachtung der Außenwelt maßgeblich Wolken und Regen identifiziert :-) Deshalb ist das dann mit eingeflossen und hat maßgeblich zu genaueren Ergebnissen geführt.

Das ist aber alles nicht in Stein gemeißelt und kann gerne verbessert werden. Ich bin da für alles offen und übernehme es gerne.

Mit @Peter arbeite ich wie gesagt an einer KI Variante, die sehr vielversprechend aussieht. Da gehen die DWD Werte und der tatsächliche Ertrag der gesamt Anlage rein, ohne das irgend etwas über die Anlage konfiguriert worden ist. Da wäre man dann weg von Modulen, Ausrichtung, Neigung und all dem anderen Zeugs :-)
Die bisherige Prognose arbeitet seit fast 3 Jahren zufriedenstellend und ein neuer Weg mit viel weniger Konfigurationsaufwand hat sich bereits geöffnet, da kommt dann doch meine Faulheit durch ;-)

EDIT: Sobald Du die Graphen der Prognose mit Deinem Ertrag hast, könntest Du die mal schicken, dann können wir noch optimieren.

VG  Christian

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 10 Januar 2023, 16:55:55
Hallo Christian,

ich habe einen Anzeigefehler und weiß nicht ganz, wo ich ansetzen kann. In der Tabelle fehlen die Angaben des letzen Jahre. Der SQL Lauf für das letzte Jahr ist gelaufen. Dennoch werden die Werte nicht angezeigt. Ich weiß aber, dass letztes Jahr die Werte von 2021 angezeigt wurden.

Hast du blind ne Idee, wo ich was anpassen müsste, oder benötigst du noch Infos?

LG
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2023, 17:32:11
Zitat von: kaiman am 10 Januar 2023, 16:55:55
Hallo Christian,

ich habe einen Anzeigefehler und weiß nicht ganz, wo ich ansetzen kann. In der Tabelle fehlen die Angaben des letzen Jahre. Der SQL Lauf für das letzte Jahr ist gelaufen. Dennoch werden die Werte nicht angezeigt. Ich weiß aber, dass letztes Jahr die Werte von 2021 angezeigt wurden.

Hast du blind ne Idee, wo ich was anpassen müsste, oder benötigst du noch Infos?

LG
Die Ausgabe vom LogDBRep_Statistic_previous_Year war ganz gut. Wie sehen da die readings aus?

EDIT: Im WR_1_API stateFormat wären diese Zeilen wichtig.

my $YearBefore      = "LogDBRep_Statistic_previous_Year";
my $YearPrevious    = ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null");
   $YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(time_str2num(ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null")))) : "null";
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Januar 2023, 19:23:08
Soo, jetzt kommt noch ein Preview für das WB_0 Device und dann bin ich mal offline für den Rest der Woche.

Bisher funktioniert:
- Einfügen von Datensätzen
- Anzeige der der Datensätze mit 7 Tage vor und nach dem Datum
- Ein Report mit 30 Einträgen vor dem Datum
- Das löschen des Reports, damit die Anzeige im FHEMWEB nicht so voll ist

In der Datenbank sieht es bisher dann so aus, wobei die Summen für Monat und Jahr noch manuell erzeugt wurden.

mysql> select * from history where DEVICE='WB_0' order by TIMESTAMP;
+---------------------+--------+---------+-------+---------------------------------+--------+------+
| TIMESTAMP           | DEVICE | TYPE    | EVENT | READING                         | VALUE  | UNIT |
+---------------------+--------+---------+-------+---------------------------------+--------+------+
| 2021-12-11 14:00:00 | WB_0   | privat  | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 60     | NULL |
| 2021-12-11 14:00:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCost          | 32.40  | NULL |
| 2021-12-12 19:45:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 31.55  | NULL |
| 2021-12-12 19:45:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCost          | 20.55  | NULL |
| 2021-12-25 16:30:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 39.91  | NULL |
| 2021-12-25 16:30:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCost          | 25.21  | NULL |
| 2021-12-26 17:00:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 10.9   | NULL |
| 2021-12-26 17:00:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCost          | 7.32   | NULL |
| 2021-12-31 23:00:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCounter_Year  | 142.36 | NULL |
| 2021-12-31 23:00:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCounter_Month | 142.36 | NULL |
| 2022-07-12 12:15:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 23.75  | NULL |
| 2022-07-12 12:15:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCost          | 13.90  | NULL |
| 2022-07-12 14:45:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 24.92  | NULL |
| 2022-07-12 14:45:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCost          | 14.81  | NULL |
| 2022-07-31 23:00:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCounter_Month | 48.67  | NULL |
| 2022-08-27 16:45:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCost          | 20.11  | NULL |
| 2022-08-27 16:45:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 42.96  | NULL |
| 2022-08-31 23:00:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCounter_Month | 42.96  | NULL |
| 2022-12-26 14:00:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 45     | NULL |
| 2022-12-31 23:00:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCounter_Month | 45     | NULL |
| 2022-12-31 23:00:00 | WB_0   | manuell | NULL  | Kia_eNiro_lp_1_kWhCounter_Year  | 136.63 | NULL |
| 2023-01-10 19:00:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCost    | 8.90   | NULL |
| 2023-01-10 19:00:00 | WB_0   | Karte_1 | NULL  | Kia_eNiro_lp_1_kWhActualCharged | 12     | NULL |
+---------------------+--------+---------+-------+---------------------------------+--------+------+
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 11 Januar 2023, 07:54:42
Zitat von: ch.eick am 10 Januar 2023, 17:32:11
Die Ausgabe vom LogDBRep_Statistic_previous_Year war ganz gut. Wie sehen da die readings aus?

EDIT: Im WR_1_API stateFormat wären diese Zeilen wichtig.

my $YearBefore      = "LogDBRep_Statistic_previous_Year";
my $YearPrevious    = ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null");
   $YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(time_str2num(ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null")))) : "null";


Hier die Zeilen im StateFormat:

my $YearBefore      = "LogDBRep_Statistic_previous_Year";
my $YearPrevious    = POSIX::strftime("%Y",localtime(time_str2num(ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null"))));

Im Bild die Daten aus der LogDBRep_Statistic_previous_Year
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 12 Januar 2023, 08:11:34
Aktuell wird in der Prognose u. a. eine Korrektur über den Temperaturkoeffizienten der verbauten Module vorgenommen. Hierzu hätte ich Anmerkungen bzw. Fragen, ebenso zur Globalstrahlung.

1) Warum wird zur Vorhersagetemperatur des DWD für die Stunden 10 hinzugezählt?
$Solar_Temp           = ReadingsVal($wetter,"fc".$fc."_".($i+$timeshift)."_TTT"  ,0)+10;

2) Gemäß Wiki soll der Wert $Solar_Temp die geschätzte erwartete Temperatur an den Modulen sein. Um den Wert präziser ermitteln zu können, habe ich nun in einer Dissertation die Berechnung der Modultemperatur nach Govindasamy, et al., 2012 gefunden (die Quellen habe ich nicht kontrolliert da nicht verfügbar) und bei mir implementiert. Darüber wird dann die Leistung entsprechend korrigiert. Für diesen Ansatz wird zusätzlich das Reading FF (Windgeschwindigkeit) vom DWD benötigt, das Device ist entsprechend zu erweitern und mit den Wetterdaten der Stunde über
$Solar_Windspeed      = ReadingsVal($wetter,"fc".$fc."_".($loop_hour+$timeshift)."_FF",0) ;
in der Prognoseberechnung abzufragen. Dann erfolgt die Berechnung der Temperatur wie folgt:

$tempk  = ReadingsVal($logdevice."_config","forecast_tempk",0) * -0.01;   # Temperaturkoeffizient des Strings 
if ($tempk ne 0) {
         $tempk_base  = ReadingsVal($logdevice."_config","forecast_tempk_base" ,0) ;   #
         # Berechnung Modultemperatur nach Govindasamy, et al., 2012
         $module_temp = 0.943 * $Solar_Temp + 0.028 * $Solar_SolarRadiation - 1,528 * $Solar_Windspeed + 4,3 ;
         # Berechnung Leistungskorrektur [%] aufgrund Modultemperatur
         $Solar_Correction_Temp = round( (($module_temp - $tempk_base) * $tempk),3) ;
}

Dann habe ich den Korrekturfaktor wie folgt angewendet ($Solar_Correction_Temp ist dann aus der Zeile mit Regen und Wolken zu entfernen):

# Berechnung der Modul Nennleistung für diese Ausrichtung
$Solar_[$j]  = $module_count[$j] * ReadingsVal($logdevice."_config","module_".$j."_power",1)/1000 ;
# Anwendung der Korrekturfaktoren
$Solar_[$j] = $Solar_[$j] + ($Solar_[$j] * $Solar_Correction_Temp / 100) ;   # Korrektur der Modulleistung aufgrund Temperatur
$Solar_[$j]  = $Solar_[$j] * $Solar_Plain ;
...

Das wäre vielleicht ein weiterer Schritt Richtung besserer Prognose, den ich gerne zur Diskussion stelle.

3) Persönlich halte ich den Ansatz, ausschließlich über die Globalstrahlung per empirischer Beobachtungen den Anlagenfaktor für die Prognosen zu bestimmen, für unzweckmäßig. Wie man aus direkter, diffuser und reflektierter Strahlung eine gute Annäherung an die Realität hinbekommt, ist u. a. von Prof. Quaschning in einem seiner Bücher beschrieben. Da habe ich aber nur ein paar "hingeworfene" Formeln bislang im Netz gefunden, das Buch besitze ich nicht. Wenn hier jemand weiß, wie man aus dem Rad1h-Wert des DWD für den jeweiligen Ort auf die darin enthaltenen Anteile der Direkt- und Diffusstrahlung kommt (oder dafür eine andere Quelle mit öffentlicher Schnittstelle für die Stundenwerte kennt), dann wäre das aus meiner Sicht schon ein großer Schritt und ich wäre für eine Antwort dankbar. Die bisherige Anwendung von Wetter-Korrekturfaktoren, die bereits in den Basiswert eingepreist sind, halte ich wie schon gesagt für nicht zweckmäßig.

4) Die Prognose läuft derzeit von 6 bis 21 Uhr. Ich schlage vor, hier eine Startzeit von 5 Uhr und Endzeit 22 Uhr zu setzen, da im Sommer Ertrag auch in den bislang fehlenden Stunden vom Dach kommt und das die Prognose weiter verzerren würde.

@Christian: Hast Du meine überarbeitete sub Solar_forecast und das _config-Device schon anschauen können? Neben den Umbenennungen der Readings in selbsterklärendere Namen habe ich ja u. a. unnötige Arrays entfernt, das Log präzisiert und lesbarer gemacht sowie die Berechnungen etwas beschleunigt. Bei mir läuft es, soweit ich das beurteilen kann.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2023, 09:23:27
Zitat von: MichaelO am 12 Januar 2023, 08:11:34
Aktuell wird in der Prognose u. a. eine Korrektur über den Temperaturkoeffizienten der verbauten Module vorgenommen. Hierzu hätte ich Anmerkungen bzw. Fragen, ebenso zur Globalstrahlung.

1) Warum wird zur Vorhersagetemperatur des DWD für die Stunden 10 hinzugezählt?
$Solar_Temp           = ReadingsVal($wetter,"fc".$fc."_".($i+$timeshift)."_TTT"  ,0)+10;
Es wird eigentlich die Temperatur der Module benötigt ;-) Da niemand einen Sensor unter den Modulen hat habe ich die Prognose Temperatur genommen und etwas drauf geschlagen, da die Module bei Sonnenschein wärmer sind als die Umgebungstemperatur.

Zitat
2) Gemäß Wiki soll der Wert $Solar_Temp die geschätzte erwartete Temperatur an den Modulen sein. Um den Wert präziser ermitteln zu können, habe ich nun in einer Dissertation die Berechnung der Modultemperatur nach Govindasamy, et al., 2012 gefunden (die Quellen habe ich nicht kontrolliert da nicht verfügbar) und bei mir implementiert. Darüber wird dann die Leistung entsprechend korrigiert. Für diesen Ansatz wird zusätzlich das Reading FF (Windgeschwindigkeit) vom DWD benötigt, das Device ist entsprechend zu erweitern und mit den Wetterdaten der Stunde über
$Solar_Windspeed      = ReadingsVal($wetter,"fc".$fc."_".($loop_hour+$timeshift)."_FF",0) ;
in der Prognoseberechnung abzufragen. Dann erfolgt die Berechnung der Temperatur wie folgt:

$tempk  = ReadingsVal($logdevice."_config","forecast_tempk",0) * -0.01;   # Temperaturkoeffizient des Strings 
if ($tempk ne 0) {
         $tempk_base  = ReadingsVal($logdevice."_config","forecast_tempk_base" ,0) ;   #
         # Berechnung Modultemperatur nach Govindasamy, et al., 2012
         $module_temp = 0.943 * $Solar_Temp + 0.028 * $Solar_SolarRadiation - 1,528 * $Solar_Windspeed + 4,3 ;
         # Berechnung Leistungskorrektur [%] aufgrund Modultemperatur
         $Solar_Correction_Temp = round( (($module_temp - $tempk_base) * $tempk),3) ;
}

Du schießt mit Kanone auf Spatzen :-)
Für mich ist das wegen der KI schon fast EOL (end off live)

Zitat
Dann habe ich den Korrekturfaktor wie folgt angewendet ($Solar_Correction_Temp ist dann aus der Zeile mit Regen und Wolken zu entfernen):

# Berechnung der Modul Nennleistung für diese Ausrichtung
$Solar_[$j]  = $module_count[$j] * ReadingsVal($logdevice."_config","module_".$j."_power",1)/1000 ;
# Anwendung der Korrekturfaktoren
$Solar_[$j] = $Solar_[$j] + ($Solar_[$j] * $Solar_Correction_Temp / 100) ;   # Korrektur der Modulleistung aufgrund Temperatur
$Solar_[$j]  = $Solar_[$j] * $Solar_Plain ;
...

Das wäre vielleicht ein weiterer Schritt Richtung besserer Prognose, den ich gerne zur Diskussion stelle.
Du kannst ja gerne die Ergebnisse vergleichen und hier veröffentlichen.

Zitat
3) Persönlich halte ich den Ansatz, ausschließlich über die Globalstrahlung per empirischer Beobachtungen den Anlagenfaktor für die Prognosen zu bestimmen, für unzweckmäßig. Wie man aus direkter, diffuser und reflektierter Strahlung eine gute Annäherung an die Realität hinbekommt, ist u. a. von Prof. Quaschning in einem seiner Bücher beschrieben. Da habe ich aber nur ein paar "hingeworfene" Formeln bislang im Netz gefunden, das Buch besitze ich nicht. Wenn hier jemand weiß, wie man aus dem Rad1h-Wert des DWD für den jeweiligen Ort auf die darin enthaltenen Anteile der Direkt- und Diffusstrahlung kommt (oder dafür eine andere Quelle mit öffentlicher Schnittstelle für die Stundenwerte kennt), dann wäre das aus meiner Sicht schon ein großer Schritt und ich wäre für eine Antwort dankbar. Die bisherige Anwendung von Wetter-Korrekturfaktoren, die bereits in den Basiswert eingepreist sind, halte ich wie schon gesagt für nicht zweckmäßig.
Genau das ist das Problem, ich lege Wert auf kostenlose verlässliche Daten, es sind schon viele Dienste im Netz erschienen, dann wieder verschwunden oder wurden kostenpflichtig.
Mit den wissenschaftlichen Formeln kann ich leider nichts anfangen. Ich freue mich aber auf Deine überarbeitete Version.

Zitat
4) Die Prognose läuft derzeit von 6 bis 21 Uhr. Ich schlage vor, hier eine Startzeit von 5 Uhr und Endzeit 22 Uhr zu setzen, da im Sommer Ertrag auch in den bislang fehlenden Stunden vom Dach kommt und das die Prognose weiter verzerren würde.
Die Erfahrung hat gezeigt, dass vor 6 Uhr nicht wirklich viel zu erwarten ist, bei meiner Ost Seite kommt im Sommer noch nicht genug um das Haus zu versorgen, somit ist auch nichts zu verteilen.
Da spare ich dann einfach Daten.

Zitat
@Christian: Hast Du meine überarbeitete sub Solar_forecast und das _config-Device schon anschauen können? Neben den Umbenennungen der Readings in selbsterklärendere Namen habe ich ja u. a. unnötige Arrays entfernt, das Log präzisiert und lesbarer gemacht sowie die Berechnungen etwas beschleunigt. Bei mir läuft es, soweit ich das beurteilen kann.
leider noch nicht, da ich momentan dienstlich unterwegs bin :-(
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 12 Januar 2023, 09:45:41
Ok, danke für die Info. Leider muss ich dann für mich persönlich feststellen, dass ich den hier gezeigten Ansatz zwar grundsätzlich gut heiße, aber nicht weiter verfolgen werde, das ist mir zu viel - bitte nicht persönlich nehmen - "Raterei".

Zitat von: ch.eick am 12 Januar 2023, 09:23:27
[...]
Du schießt mit Kanone auf Spatzen :-)
[...]
Ich freue mich aber auf Deine überarbeitete Version.
Das widerspricht sich leider. Der auf wissenschaftlich fundierten Erkenntnissen basierte vorgestellte Ansatz der Ermittlung der Modultemperatur mit einer einfachen Formel und einem vom vorhandenen Dienst bereitgestellten weiteren Wert wird als "auf Spatzen schießen" bezeichnet, während Du dich ansonsten auf meine überarbeitete Version freust. Einen Vergleich der Prognosen zwischen den unterschiedlichen Temperaturermittlungen werde ich nicht anstellen, da der Rest der Berechnungen aus meiner Sicht zu vage ist und somit keine Grundlage für Vergleiche bildet.

Aber wie gesagt, ist nicht persönlich, es geht um die Sache. Wenn genug Teilnehmer des Forums mit dem bisherigen Ansatz zufrieden sind, dann erfüllt er ja seinen Zweck. Sollte dennoch irgend jemand wissen, wie man aus dem Rad1h-Wert des DWD für den jeweiligen Ort auf die darin enthaltenen Anteile der Direkt- und Diffusstrahlung kommt, wäre ich dankbar, wenn dieses Wissen hier geteilt wird.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 12 Januar 2023, 11:52:46
Zitat von: MichaelO am 12 Januar 2023, 09:45:41

Aber wie gesagt, ist nicht persönlich, es geht um die Sache. Wenn genug Teilnehmer des Forums mit dem bisherigen Ansatz zufrieden sind, dann erfüllt er ja seinen Zweck. Sollte dennoch irgend jemand wissen, wie man aus dem Rad1h-Wert des DWD für den jeweiligen Ort auf die darin enthaltenen Anteile der Direkt- und Diffusstrahlung kommt, wäre ich dankbar, wenn dieses Wissen hier geteilt wird.

Ich arbeite seit bald 1.5 Jahren mit dem Ansatz von Christian und bin mehr als zufrieden damit. Die Prognose stimmt in den meisten Fällen sehr genau. Ich wüsste nicht warum die Werte genauer sein sollten, da ich damit ja keine direkten Schaltungen ausführe sondern nur entscheide, wie viel der Speicher geladen wird oder ähnliches.

Gruss aus der Schweiz :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2023, 13:08:01
Zitat von: Mumpitz am 12 Januar 2023, 11:52:46
Ich arbeite seit bald 1.5 Jahren mit dem Ansatz von Christian und bin mehr als zufrieden damit. Die Prognose stimmt in den meisten Fällen sehr genau. Ich wüsste nicht warum die Werte genauer sein sollten, da ich damit ja keine direkten Schaltungen ausführe sondern nur entscheide, wie viel der Speicher geladen wird oder ähnliches.

Gruss aus der Schweiz :-)
Hallo Reto,
ich schreibe noch offline mit Michael und möchte seine Korrekturen alle mit einarbeiten. Formel sind besser als Konfigurationsparameter, egal, ob das Ergebnis dadurch mehr an die realität kommt oder nicht. ich finde die Ideen grundlegend sehr gut und inovativ. Es wird also weiterhin noch viele Verbesserungen geben.
Ich entschuldige mich auch nochmal, wenn meine Anmerkungen abweisend gewirkt haben. Es war sehr stressig in der letzten Zeit, da viele Fragen über PN gekommen sind und ziemlich individuell waren.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 12 Januar 2023, 13:17:20
Zitat von: ch.eick am 12 Januar 2023, 13:08:01
Ich entschuldige mich auch nochmal, wenn meine Anmerkungen abweisend gewirkt haben. Es war sehr stressig in der letzten Zeit, da viele Fragen über PN gekommen sind und ziemlich individuell waren.

Alles kein Problem, ich schrieb ja, das es nichts Persönliches ist. Vielleicht liege ich ja auch falsch, deswegen stellen wir ja hier unsere Ideen und Erkenntnisse zur Diskussion. Wenn es dann hinterher besser wird, ist doch jede Diskussion lohnenswert gewesen. Und wenn nicht, sind alle schlauer für die Zukunft  8)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Januar 2023, 13:18:49
Zitat von: kaiman am 11 Januar 2023, 07:54:42
Hier die Zeilen im StateFormat:

my $YearBefore      = "LogDBRep_Statistic_previous_Year";
my $YearPrevious    = POSIX::strftime("%Y",localtime(time_str2num(ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null"))));

Im Bild die Daten aus der LogDBRep_Statistic_previous_Year

Okay, somit ist SW_Statistic_Yield_Year im LogDBRep_Statistic_previous_Year Device vorhanden und es sollte im stateFormat entsprechend berücksichtigt werden. Schick mir doch mal des stateFormat, ober besser ein komplettes List von dem WR_1_API Device als PN. Eventuell machst Du vorher noch einen Vergleich mit dem Wiki.

EDIT: Übrigens haben sich die reading Namen auf SW_* geändert.

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MichaelO am 18 Januar 2023, 18:28:47
Kurz zur Info. Nach langer Recherche habe ich tatsächlich eine Seite gefunden, die den Weg der Berechnung des Ertrags einer PV-Anlage aus der Globalstrahlung aufzeigt:

https://www.homerenergy.com/products/pro/docs/3.9/how_homer_calculates_the_pv_array_power_output.html (https://www.homerenergy.com/products/pro/docs/3.9/how_homer_calculates_the_pv_array_power_output.html)

in Verbindung mit

https://www.homerenergy.com/products/pro/docs/3.9/how_homer_calculates_the_radiation_incident_on_the_pv_array.html (https://www.homerenergy.com/products/pro/docs/3.9/how_homer_calculates_the_radiation_incident_on_the_pv_array.html)

Nach Rücksprache mit Christian werde ich versuchen, das in die Prognose-Routine zu bringen, so dass man dann testen kann, ob dieser wissenschaftliche Ansatz genauere Werte liefert, als die bisherigen Versuche basierend auf empirischer Beobachtung. Falls ja, wäre es schön, falls nein zumindest eine gute Programmierübung gepaart mit Wissenszuwachs zum Thema Meteorologie  8)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 19 Januar 2023, 10:38:01
Zitat von: ch.eick am 12 Januar 2023, 13:18:49
Okay, somit ist SW_Statistic_Yield_Year im LogDBRep_Statistic_previous_Year Device vorhanden und es sollte im stateFormat entsprechend berücksichtigt werden. Schick mir doch mal des stateFormat, ober besser ein komplettes List von dem WR_1_API Device als PN. Eventuell machst Du vorher noch einen Vergleich mit dem Wiki.

EDIT: Übrigens haben sich die reading Namen auf SW_* geändert.

VG  Christian

Hast du meine PN mit dem List bekommen?

LG
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Januar 2023, 11:05:52
Zitat von: kaiman am 19 Januar 2023, 10:38:01
Hast du meine PN mit dem List bekommen?
Ich hatte doch bereits alles beantwortet.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 19 Januar 2023, 18:59:07
oh sry, übersehen.

Gibt es eine "einfache" Möglichkeit, die reading im Namen auf SW_* umzubauen?

LG
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: jnewton957 am 19 Januar 2023, 20:26:46
Zitat von: ch.eick am 14 Januar 2022, 10:38:50

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


Ich lese mich gerade durch die ganzen Beiträge durch und wollte das LogDBRep_Statistic_previous_Quarter implementieren.

Aber ich finde im fhem die splitReading() Funktion für die 99_myUtils nicht.

Was habe ich übersehen?

Grüße
Jörg
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Januar 2023, 07:48:17
Zitat von: jnewton957 am 19 Januar 2023, 20:26:46
Ich lese mich gerade durch die ganzen Beiträge durch und wollte das LogDBRep_Statistic_previous_Quarter implementieren.

Aber ich finde im fhem die splitReading() Funktion für die 99_myUtils nicht.
Hallo Jörg,
die ist in diesem Post enthalten. (https://forum.fhem.de/index.php/topic,114849.msg1176165/topicseen.html#msg1176165)

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Januar 2023, 07:54:45
Zitat von: kaiman am 19 Januar 2023, 18:59:07
Gibt es eine "einfache" Möglichkeit, die reading im Namen auf SW_* umzubauen?
Leider nein, eventuell hilft im UNIX ein diff von den beiden stateFormat, dann werden alle Zeilen angezeigt.
Oder Du sicherst Dir Dein altes stateFormat und verwendest dann das aktuelle.

Solltet Ihr im Device noch die alten readings verwenden, dann müssen die neuen erzeugt werden und im Anschluss in der Datenbank alles alte auf das neue geändert werden.
Dazu gibt es bereits im Thread und auch im Wiki eine Hilfestellung.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: jnewton957 am 20 Januar 2023, 16:16:06
Zitat von: ch.eick am 20 Januar 2023, 07:48:17
Hallo Jörg,
die ist in diesem Post enthalten. (https://forum.fhem.de/index.php/topic,114849.msg1176165/topicseen.html#msg1176165)

VG  Christian

gefunden, eingebaut und Fehlermeldung: DBD::SQLite::db prepare failed: no such function: CONCAT at ./FHEM/93_DbRep.pm line 11129.

Leider keine Info zum Fehler hier im Forum gefunden.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 20 Januar 2023, 16:33:44
Kleiner Zwischenruf...

Zitat
Fehlermeldung:
Code: [Auswählen]

DBD::SQLite::db prepare failed: no such function: CONCAT at ./FHEM/93_DbRep.pm line 11129.

Leider keine Info zum Fehler hier im Forum gefunden.


The SQL standard provides the CONCAT() function to concatenate two strings into a single string.

SQLite, however, does not support the CONCAT() function. Instead, it uses the concatenate operator (||) to join two strings into one.

-> https://www.sqlitetutorial.net/sqlite-string-functions/sqlite-concat/
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 20 Januar 2023, 17:53:51
Zitat von: DS_Starter am 20 Januar 2023, 16:33:44
The SQL standard provides the CONCAT() function to concatenate two strings into a single string.

SQLite, however, does not support the CONCAT() function. Instead, it uses the concatenate operator (||) to join two strings into one.

-> https://www.sqlitetutorial.net/sqlite-string-functions/sqlite-concat/

Okay, ich schau mir das mal an.
https://database.guide/how-to-enable-the-pipe-concatenation-operator-in-mysql/ (https://database.guide/how-to-enable-the-pipe-concatenation-operator-in-mysql/)
Zitat
MySQL supports the use of the pipe concatenation operator (||) for concatenating its operands. However, you need to enable it first.

By default, MySQL treats || as a logical OR operator (although this treatment is currently deprecated). However, the ANSI standard requires that || is a concatenation operator. Perhaps you have code that already uses the pipe concatenation operator, and you would rather not go through and change the code to use the CONCAT() function.

Fortunately, MySQL provides us with the ability to specify whether to treat it as a logical OR operator or a concatenation operator.
Wenn ich das jetzt richtig verstehe, wird dann als Folge das || nicht mehr als logisches OR verwendet, was auch probleme machen könnte.


Momentan habe ich folgendes gefunden, um MySQL da kompatiebler zu bekommen, sodass es auch bei Oracle MySQL laufen würde.

## so kann man den sql_mode abfragen, der gerade gesetzt ist
mysql> SELECT @@sql_mode;
+----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                           |
+----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------------------------+

## Nun kann man im Oracle MySQL PIPES_AS_CONCAT hinzufügen
mysql> SET sql_mode=(SELECT CONCAT(@@sql_mode,',PIPES_AS_CONCAT'));

## Danach nochmal nachschauen
mysql> SELECT @@sql_mode;
+--------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                            |
+--------------------------------------------------------------------------------------------------------------------------------------+
|PIPES_AS_CONCAT,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION|
+--------------------------------------------------------------------------------------------------------------------------------------+

## Und hier ein Test
mysql> SELECT 'Homer' || 'Symptom';
+----------------------+
| 'Homer' || 'Symptom' |
+----------------------+
| HomerSymptom         |
+----------------------+

mysql> SELECT concat('Homer','Symptom');
+---------------------------+
| concat('Homer','Symptom') |
+---------------------------+
| HomerSymptom              |
+---------------------------+


Anscheinend verwenden hier im Thread alle anderen kein SQLite, also entweder MySQL oder MariaDB .
Nun bin ich mir nicht wirklich sicher, was das noch für weitere Konsquenzen haben wird.

Da es sich bisher um einen Einzelfall zu handeln scheint, bitte ich momentan darum in dem LogDBRep_Statistic_previous_Quarter Device das SQL SELECT aus dem Wiki lokal zu ändern.
Beispiel für die 4 SELECT mit je 2 CONCAT()

## aus einem
CONCAT('Q', CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1)))
## würde dann ein
'Q'||CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1))

## aus einem
CONCAT('Q', CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1)), '_', REPLACE(READING, '_Year', '')))
## würde dann ein
'Q'||CAST(MONTH(TIMESTAMP)/3 AS DECIMAL(1))||'_'|| REPLACE(READING, '_Year', ''))


Ich hoffe das kann jetzt weiter helfen.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: jnewton957 am 20 Januar 2023, 20:23:33
Zitat von: ch.eick am 20 Januar 2023, 17:53:51

Anscheinend verwenden hier im Thread alle anderen kein SQLite, also entweder MySQL oder MariaDB .
Nun bin ich mir nicht wirklich sicher, was das noch für weitere Konsquenzen haben wird.


STR_TO_DATE gibt es bei SQLite wohl auch nicht. Error: no such function: STR_TO_DATE

Schade. hatte die fhem.db eben nach Anleitung aufgesetzt. Und da stand "damals" eben sqlite.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 20 Januar 2023, 20:32:32
Man kann durchaus mehrere DbLog Devices benutzen mit verschiedenen Datenbanksystemen.
Nur mal so als Hinweis.  ;)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Januar 2023, 10:49:11
Zitat von: jnewton957 am 20 Januar 2023, 20:23:33
STR_TO_DATE gibt es bei SQLite wohl auch nicht. Error: no such function: STR_TO_DATE

Schade. hatte die fhem.db eben nach Anleitung aufgesetzt. Und da stand "damals" eben sqlite.
SQLite hatte ich noch nie installiert, deshalb kann ich zur Kompatibilität leider nichts sagen.
Vom Namen her "Lite" hatte ich abgeleitet, dass es da sicherlich viele Einschränkungen geben würde. Deshalb hatte ich zuerst MariaDB 32 Bit installiert, aber das Docker Image wurde nie aktualisiert. Jetzt verwende ich das original MySQL 64 Bit als Docker Container und bekomme auch immer wieder Updates. Auch der Installationsaufwand ist um vieles geringer.
Im Wiki werde ich dann besser noch einen MySQL Hinweis rein schreiben.

Sorry für den extra Aufwand, aber ich schaffe es nicht alleine verschiedene Datenbanken zu unterstützen.

VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Januar 2023, 16:35:26
Zitat von: jnewton957 am 20 Januar 2023, 20:23:33
Schade. hatte die fhem.db eben nach Anleitung aufgesetzt. Und da stand "damals" eben sqlite.
Ich habe gerade nochmal nachgeschaut, im FHEM Plenticore Wiki stand bisher ein MariaDB Docker Container bei 32 Bit. Ich habe es jetzt aktualisiert auf den Oracle MySQL Docker Container, da hat man halt alle aktuellen Möglichkeiten und regelmäßige Updates.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 Januar 2023, 14:21:20
Hallo zusammen,
bevor ich jetzt die nächsten zei Wochen in der Versenkung verschwinde, habe ich hier nochmal was zum Spielen, da es ja geschneit hat.
Bei mir sind noch die halben Module mit Schnee bedeckt, da es bereits am Tauen ist.

Das kommt ins userReadings vom WR_1 und muss auf Eure Anlagen angepasst werden.
Denkt bitte an das Komma, wenn noch etwas ins userReadings kommt ;-)

string_1_covered_snow:SW_Total_DC_Energy_From_PV1.* {
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;
   (($mon <= 2 or $mon >= 11) and
    ($hour >= 10 and $hour <= 16) and
    ReadingsVal($NAME,"P_DC1","10000") < 50 and
    ReadingsVal("Heizung","ambientTemperature",100) < 10)? "Schnee" : "frei";; },

string_2_covered_snow:SW_Total_DC_Energy_From_PV2.* {
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;
   (($mon <= 2 or $mon >= 11) and
    ($hour >= 10 and $hour <= 16) and
    ReadingsVal($NAME,"P_DC2","10000") < 50 and
    ReadingsVal("Heizung","ambientTemperature",100) < 10)? "Schnee" : "frei";; }

## Falls Ihr auch noch mehr Strings habt, dann einfach noch mehr readings erzeugen. Bei mir wäre noch ein zweiter WR mit dem Trigger SW_Total_DC_Energy_From_PV4.* und SW_Total_DC_Energy_From_PV5.*, die dann aus dem WR_2 das reading P_DC* holen.

Angepasst werden müsste die Leistung 50 Watt des Strings, auf einen Wert wo Ihr sagt, dass er abgedeckt ist.
Und Ihr bräuchtet noch ein Device, aus dem Ihr die Außentemperatur bekommt. Bei mir ist das die Heizung (LWP) und da denke ich, dass über 10 ° wohl kein Schnee mehr vorhanden sein sollte.

Mein Gedanke ist, das dann später mit in die Solar_forecast() einfließen zu lassen.

EDIT: gerade ist es im Osten und Süden runter gerutscht und schon wird "frei" angezeigt :-)
   Nur der untere String im Westen zeigt noch "Schnee" an.

VG   Christian
Titel: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 23 Januar 2023, 01:05:07
Hallo,
ich will von Plenticore den Tagesnetzverbrauch auslesen. Dies scheint nur über die API-Schnittstelle zu gehen. Bei den MODBUS-Readings habe ich nichts passendes gefunden.

https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus
Diesen Betrag habe ich feinsäuberlich abgearbeitet.
ich scheitere bei KeyValue() Test
Wenn ich in FHEM in der Commandline folgenden aufruf eingebe:
{KeyValue("[read|store]","PW_WR_1_API_Xh@JJLjwcB","lentin9")}
kommt folgende Fehlermeldung:
Global symbol "@JJLjwcB" requires explicit package name (did you forget to declare "my @JJLjwcB"?) at (eval 74115) line 1.
Der Username (Master Key) lautet: Xh@JJLjwcB. Den kann ich auch nicht ändern. ich habe das Gefühl, dass es an dem @ hängt.
Hat jemand eine Idee für mich.
Oder gibt es noch einen ganz anderen Ansatz, über die API-Schnittstelle den Plenticore direkt auszulesen.

Danke. udo
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Januar 2023, 08:30:51
Zitat von: u.stemler am 23 Januar 2023, 01:05:07
https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus
Diesen Betrag habe ich feinsäuberlich abgearbeitet.
ich scheitere bei KeyValue() Test
Wenn ich in FHEM in der Commandline folgenden aufruf eingebe:
{KeyValue("[read|store]","PW_WR_1_API_Xh@JJLjwcB","lentin9")}
kommt folgende Fehlermeldung:
Global symbol "@JJLjwcB" requires explicit package name (did you forget to declare "my @JJLjwcB"?) at (eval 74115) line 1.
Der Username (Master Key) lautet: Xh@JJLjwcB. Den kann ich auch nicht ändern. ich habe das Gefühl, dass es an dem @ hängt.
Hat jemand eine Idee für mich.
Hallo Udo,
da hast Du einen falschen Syntax

{KeyValue("store","PW_WR_1_API_user","<passwort>")}
{KeyValue("read","PW_WR_1_API_user")}


"PW_WR_1_API_user" ist der feste Schlüssel, unterdem das Passwort abgelegt wird.
Das "<passwort> " ist das von Deinem Betreiberzugang und wird mit "" im Kommando angegeben, da es dort ein String ist.

Sollte es trotzdem noch mit Sonderzeichen ein Problem geben, dann kann man das im Plenticore auch ändern.
Es ist ein Unterschied zwischen dem Key auf dem Aufkleber und dem Passwort, wobei ich das bei mir gleich gesetzt habe, was auch der Default von Kostal ist.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 23 Januar 2023, 23:36:07
Hallo Christian,
Danke für die schnelle Antwort.
Passwortübergabe hat funktioniert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 24 Januar 2023, 21:27:09
https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Kostal_Plenticore_Plus_die_API

Wer kann mir weiterhelfen.
KeyValue funktioniert. Beim Test wird das Passwort korrekt zurück gegeben.

Beim Aufruf von get 01_auth_start kommt die meldung: 01_auth_start requested, watch readings
Der Log zeigt  kommt folgende Fehlermeldung:
2023.01.24 21:07:24 5 : WR_1_API: get called with 01_auth_start 
2023.01.24 21:07:24 5 : WR_1_API: get found option 01_auth_start in attribute get01Name
2023.01.24 21:07:24 4 : WR_1_API: get will now request 01_auth_start, no optional value
2023.01.24 21:07:24 5 : WR_1_API: AddToQueue adds type get01 to URL http://%IP-WR%/api/v1/auth/start, data %START%, header Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive, retry 0, initial queue len: 0
2023.01.24 21:07:24 5 : WR_1_API: HandleSendQueue called from AddToSendQueue, qlen = 1
2023.01.24 21:07:24 4 : WR_1_API: HandleSendQueue sends get01 with timeout 2 to http://%IP-WR%/api/v1/auth/start, 
data: %START%, 
header: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2023.01.24 21:07:24 5 : WR_1_API: ReadCallback called from __ANON__
2023.01.24 21:07:24 5 : WR_1_API: Read callback Error LogLvl set to 3, regex 
2023.01.24 21:07:24 3 : WR_1_API: Read callback: Error: gethostbyname %IP-WR% failed
2023.01.24 21:07:24 4 : WR_1_API: Read callback: request type was get01 retry 0, no headers, no body
<div class='fhe
2023.01.24 21:07:24 4 : WR_1_API: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2023.01.24 21:07:24 5 : WR_1_API: GetCookies is looking for Cookies
2023.01.24 21:07:24 5 : WR_1_API: ExtractSid called, context get, num 01
2023.01.24 21:07:24 4 : WR_1_API: no header to look for redirects
2023.01.24 21:07:24 5 : WR_1_API: Read callback sets LAST_REQUEST to get01
2023.01.24 21:07:24 5 : WR_1_API: CheckAuth decided no authentication required


vielleicht ist im device auch etwas nicht richtig eingerichtet. beim Aufruf comment bin ich mir nciht sicher.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Januar 2023, 16:24:57
Zitat
2023.01.24 21:07:24 3 : WR_1_API: Read callback: Error: gethostbyname %IP-WR% failed

vielleicht ist im device auch etwas nicht richtig eingerichtet.
Moin,
Hast du im WR_1_config die IP-ADRESSE  des WRs eingetragen?

Comment kann auch gelöscht werden, oder Du kopierst den Inhalt nochmal neu in das Attribut. Das ist für mich ein Feld für Erinnerungen.

VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 30 Januar 2023, 21:50:45
Hallo Christian,
ich habe die IP in der WR_1_config (Dummy) korrekt eingebunden.
Hast Du noch eine Idee?
Internals:
   FUUID      63d1bb69-f33f-e971-d32b-93079ae17824cfc1
   NAME       WR_1_config
   NR         147
   STATE      ???
   TYPE       dummy
   eventCount 1
   READINGS:
     2020-09-11 07:36:39   Forecast_Station P0178
     2020-08-31 12:39:26   IP-FHEM         192.168.178.188
     2023-01-30 21:27:59   IP-WR_1         192.189.178.162
Attributes:
   DbLogExclude .*
   alias      WR_1_config
   comment    Version 2021.04.07 12:00
Passworte für die Abfrage des WR_1_API werden im storeKeyValue abgelegt:
   {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}
   {KeyValue("store","PW_WR_1_API_user","<passwort>")}

Steht das reading module_*_count auf 0 wird diese Ausrichtung nicht berücksichtigt

Korrekturkurven:
         Steilheit  Parallel
                    verschiebung
tempk      -0.39      25
cloudk     -0.65       0
raink      -0.30       0
Der Slider für die Steilheit wird mit - k/100 umgerechnet. 39 ==> -0.39
   event-on-change-reading .*
   group      PV Eigenverbrauch
   icon       solar_icon
   readingList IP-WR_1 IP-WR_1_Speicher_1 IP-WR_1_KSEM IP-FHEM module_1_active module_2_active module_3_active module_1_name module_2_name module_3_name  module_4_name module_5_name module_1_direction module_2_direction module_3_direction module_4_direction module_5_direction module_1_count module_2_count module_3_count module_4_count module_5_count module_1_power module_2_power module_3_power module_4_power module_5_power module_1_plain module_2_plain module_3_plain module_4_plain module_5_plain forecast_cloudk forecast_cloudk_base forecast_raink forecast_raink_base forecast_tempk forecast_tempk_base forecast_factor forecast_factor_autocorrection Forecast_Station
   room       Photovoltaik
   setList    IP-WR_1 IP-WR_1_Speicher_1 IP-WR_1_KSEM IP-FHEM module_1_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort module_2_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort module_3_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_4_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_5_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_1_direction module_2_direction module_3_direction module_4_direction module_5_direction module_1_count module_2_count module_3_count module_4_count module_5_count module_1_power module_2_power module_3_power module_4_power module_5_power module_1_plain module_2_plain module_3_plain module_4_plain module_5_plain forecast_cloudk forecast_cloudk_base forecast_raink forecast_raink_base forecast_tempk forecast_tempk_base forecast_factor forecast_factor_autocorrection Forecast_Station
   sortby     113
   verbose    5
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Januar 2023, 22:38:22
Zitat von: u.stemler am 30 Januar 2023, 21:50:45IP-WR_1         192.189.178.162
Vergleich die IP-WR_1 noch mal, die ist falsch.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 30 Januar 2023, 23:43:46
 :-[  Entschuldigung - ich hatte vorhin noch etwas ausprobiert und mich dabei verschrieben.
Hier nochmal die List, die nciht funktioniert.

Internals:
   FUUID      63d1bb69-f33f-e971-d32b-93079ae17824cfc1
   NAME       WR_1_config
   NR         146
   STATE      ???
   TYPE       dummy
   READINGS:
     2023-01-30 23:39:32   Forecast_Station P0178
     2020-08-31 12:39:26   IP-FHEM         192.168.178.188
     2023-01-30 23:37:42   IP-WR_1         192.168.178.162
Attributes:
   DbLogExclude .*
   alias      WR_1_config
   comment    Version 2021.04.07 12:00
Passworte für die Abfrage des WR_1_API werden im storeKeyValue abgelegt:
   {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}
   {KeyValue("store","PW_WR_1_API_user","<passwort>")}

Steht das reading module_*_count auf 0 wird diese Ausrichtung nicht berücksichtigt

Korrekturkurven:
         Steilheit  Parallel
                    verschiebung
tempk      -0.39      25
cloudk     -0.65       0
raink      -0.30       0
Der Slider für die Steilheit wird mit - k/100 umgerechnet. 39 ==> -0.39
   event-on-change-reading .*
   group      PV Eigenverbrauch
   icon       solar_icon
   readingList IP-WR_1 IP-WR_1_Speicher_1 IP-WR_1_KSEM IP-FHEM module_1_active module_2_active module_3_active module_1_name module_2_name module_3_name  module_4_name module_5_name module_1_direction module_2_direction module_3_direction module_4_direction module_5_direction module_1_count module_2_count module_3_count module_4_count module_5_count module_1_power module_2_power module_3_power module_4_power module_5_power module_1_plain module_2_plain module_3_plain module_4_plain module_5_plain forecast_cloudk forecast_cloudk_base forecast_raink forecast_raink_base forecast_tempk forecast_tempk_base forecast_factor forecast_factor_autocorrection Forecast_Station
   room       Photovoltaik
   setList    IP-WR_1 IP-WR_1_Speicher_1 IP-WR_1_KSEM IP-FHEM module_1_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort module_2_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort module_3_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_4_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_5_name:WR_1_Ost,WR_1_West,WR_2_Sued,WR_2_West,East,SouthEast,South,SouthWest,West,Garage,CarPort,frei module_1_direction module_2_direction module_3_direction module_4_direction module_5_direction module_1_count module_2_count module_3_count module_4_count module_5_count module_1_power module_2_power module_3_power module_4_power module_5_power module_1_plain module_2_plain module_3_plain module_4_plain module_5_plain forecast_cloudk forecast_cloudk_base forecast_raink forecast_raink_base forecast_tempk forecast_tempk_base forecast_factor forecast_factor_autocorrection Forecast_Station
   sortby     113
   verbose    5
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Februar 2023, 00:01:06
Zitat von: u.stemler am 30 Januar 2023, 23:43:46
:-[  Entschuldigung - ich hatte vorhin noch etwas ausprobiert und mich dabei verschrieben.
Dann schau doch bitte nochmal für das WR_1_API bei verbose 5 ins Log. Da muss der API Aufruf mit der eingesetzten IP Adresse geschehen. Ansonsten ist bei dem replacement etwas falsch aus dem Wiki übernommen.
VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 02 Februar 2023, 20:29:44
Hallo Christan,
vielen Dank für Deine Unterstüzung.
Ich habe WR-1, WR_1_API und WR_1_config neuangelegt, dann hat alles funktioniert.

udo

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 06 Februar 2023, 23:33:12
Noch eine Frage zu https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus

Den täglichen PV-Ertrag kann ich tageweise aufsummiert mit Daily_yield abfragen. D.h. am Abend sehe ich den Tagesertrag.
Gibt es eine solche Funktion auch für den Strom, den ich aus dem Netz beziehe. ich hatte mal irgendwo etwas gelesen, dass abends um 22.00 Uhr (besser wäre 24.00 Uhr) der Tagesnetzbezug erfasst wird. ich würde mir gerne ein Balkendiagramm erstellen, aus dem hervor geht, wieviel Strom ich täglich aus dem Netz bezogen habe. (WR_1_API, WR_0_KSEM und WR_1 sind in betrieb).

Über möglliche Ansatzpunkte würde ich mich freuen.

vg
udo
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Februar 2023, 07:42:44
Zitat von: u.stemler am 06 Februar 2023, 23:33:12
Noch eine Frage zu https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus

Den täglichen PV-Ertrag kann ich tageweise aufsummiert mit Daily_yield abfragen. D.h. am Abend sehe ich den Tagesertrag.
Gibt es eine solche Funktion auch für den Strom, den ich aus dem Netz beziehe. ich hatte mal irgendwo etwas gelesen, dass abends um 22.00 Uhr (besser wäre 24.00 Uhr) der Tagesnetzbezug erfasst wird. ich würde mir gerne ein Balkendiagramm erstellen, aus dem hervor geht, wieviel Strom ich täglich aus dem Netz bezogen habe. (WR_1_API, WR_0_KSEM und WR_1 sind in betrieb).

Über möglliche Ansatzpunkte würde ich mich freuen.
Hallo Udo,
das ist ein userReading im WR_1_API

SW_Statistic_EnergyHomeGrid_Day

Dieser Wert wächst über den Tag hinweg und der letzte Eintrag ist dann der Wert, den Du suchst. Für ein Diagramm wäre es somit der Maximum Wert.
VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 08 Februar 2023, 06:33:49
Hallo Christian,

mal eine Frage: Meine DB wächst und wächst und ich würde gerne nicht benötigte Daten entfernen.

Werden die alten WR_1 MODBUSATTR Einträge alle benotigt, oder könnten die gefahrlos entfernt werden?


Beispiel:
2021-12-15 11:53:00
WR_1
MODBUSATTR
Total_DC_P: 1166.70
Total_DC_P
1166.70
2021-12-15 11:53:01
WR_1
MODBUSATTR
Home_own_consumption_from_PV: 674.00
Home_own_consumption_from_PV
674.00
2021-12-15 11:53:01
WR_1
MODBUSATTR
Total_AC_Active_P: 1094.00
Total_AC_Active_P
1094.00
2021-12-15 11:53:01
WR_1
MODBUSATTR
Total_AC_Reactive_P: 289.20
Total_AC_Reactive_P
289.20
2021-12-15 11:53:01
WR_1
MODBUSATTR
Total_AC_Apparent_P: 1138.07
Total_AC_Apparent_P
1138.07
2021-12-15 11:53:02
WR_1
MODBUSATTR
Total_Active_P_EM: -431.80
Total_Active_P_EM
-431.80
2021-12-15 11:53:02
WR_1
MODBUSATTR
Total_Reactive_P_EM: -470.10
Total_Reactive_P_EM
-470.10
2021-12-15 11:53:02
WR_1
MODBUSATTR
Total_Apparent_P_EM: -655.20
Total_Apparent_P_EM
-655.20
2021-12-15 11:53:02
WR_1
MODBUSATTR
P_DC1: 718.92
P_DC1
718.92
2021-12-15 11:53:03
WR_1
MODBUSATTR
P_DC2: 449.29
P_DC2
449.29
2021-12-15 11:53:04
WR_1
MODBUSATTR
Inverter_Generation_P_Actual: 1095.00
Inverter_Generation_P_Actual
1095.00
2021-12-15 11:53:06
WR_1
MODBUSATTR
Total_DC_P_sumOfAllPVInputs: 1169.57
Total_DC_P_sumOfAllPVInputs
1169.57


LG
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Februar 2023, 08:06:14
Zitat von: kaiman am 08 Februar 2023, 06:33:49
mal eine Frage: Meine DB wächst und wächst und ich würde gerne nicht benötigte Daten entfernen.

Werden die alten WR_1 MODBUSATTR Einträge alle benotigt, oder könnten die gefahrlos entfernt werden?
Das hängt einzig davon ab, was Du z.B. in Grafane auswerten möchtest und wie lange Du zurück möchtest.
Generell würde ich die MODBUSATTR drin lassen, und nur das Logging reduzieren. Einige Attribute dienen ja auch als Basis für userReadings und müssen deshalb einen Event auslösen.
Wenn Du den Wechsel zu den SW_* readings mit gemacht hast, könnten die äqivalente aus dem Logging entfernt werden. Das hat aber nicht jeder gemacht.
Wichtig wäre natürlich dann auch den Umzug der readings in der Datenbank für den Zeitraum davor vorher noch zu machen. Eine Beschreibung für das Prinzip ist im Wiki zu finden.
Zusätzlich habe ich noch mit dem DbRep einzelne Werte ausgedünnt, da z.B. ein über den Tag steigender Wert von *_Day, *_Month, *_Year nach ablauf des Zeitraums eventuell keinen Sinn mehr macht, es sei denn man möchte daraus noch andere Zwischenwerte berechnen. Da Statistiken und Diagramme immer nur sehr selten angefasst werden bin ich da etwas zurückhaltend und Platz auf der SSD habe ich auch noch genug.
Das Backup der DB mache ich mit SQLBackupAndFTP vom Windows aus, da kann man beim SQLDump auch Monats Jobs ( mit Zeitfilter) definieren. Das wäre dann wie ein Incrementel Dump und ich finde die Daten für einen Restore einfacher, falls ich mal ausversehen zuviel gelöscht habe. Ein Incrementel wäre dann bei mir ca 5,1 MB komprimiert.


mysql>
SELECT table_schema "DB Name",
     Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"
FROM  information_schema.tables
GROUP BY table_schema;
+--------------------+---------------+
| DB Name            | DB Size in MB |
+--------------------+---------------+
| fhem               |       10457.0 |
| information_schema |           0.0 |
+--------------------+---------------+
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 09 Februar 2023, 16:27:22
Zitat von: ch.eick am 08 Februar 2023, 08:06:14
Zusätzlich habe ich noch mit dem DbRep einzelne Werte ausgedünnt, da z.B. ein über den Tag steigender Wert von *_Day, *_Month, *_Year nach ablauf des Zeitraums eventuell keinen Sinn mehr macht, es sei denn man möchte daraus noch andere Zwischenwerte berechnen. Da Statistiken und Diagramme immer nur sehr selten angefasst werden bin ich da etwas zurückhaltend und Platz auf der SSD habe ich auch noch genug.


kannst du uns das mal zeigen?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 10 Februar 2023, 10:08:48
Zitat von: Mumpitz am 09 Februar 2023, 16:27:22
kannst du uns das mal zeigen?
Moin,
ich habe folgende DbRep eingerichtet, um etwas auszudünnen, bzw einige Werte für Diagramme vorzubereiten.
Falls Ihr noch mehr habt, könntet Ihr mir die bitte schicken.

Diese DbRep erzeugen noch zusätzliche Datenbank Einträge, die man dann in Diagrammen direkt darstellen kann ohne mit SQL wieder zu filtern.

LogDBRep_Statistic_EnergyFeedInGrid_Year_diff_Week
LogDBRep_Statistic_EnergyHomePvSum_Year_diff_Week
LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month
LogDBRep_Statistic_Yield_Month_max_Month
LogDBRep_Statistic_Yield_Year_diff_Week

Hierbei wird folgendes gemacht:

- EnergyFeedInGrid_EnergyHomePvSum_Year_diff_Week   Bildet noch zusätzlich Wochen Summen

2023-01-01_00-57-03__Statistic_EnergyFeedInGrid_Week__week_52 0.0000
2023-01-02_00-57-03__Statistic_EnergyFeedInGrid_Week__week_01 0.0000
2023-01-13_16-57-03__Statistic_EnergyFeedInGrid_Week__week_02 14000
2023-01-20_14-57-03__Statistic_EnergyFeedInGrid_Week__week_03 7000
2023-01-29_16-57-03__Statistic_EnergyFeedInGrid_Week__week_04 15000
2023-02-04_16-57-03__Statistic_EnergyFeedInGrid_Week__week_05 9000


- EnergyHomePvSum_Year_max_Month   Dieser Wert ist die gesamte Dc Lieferung der PV Anlage inklusive Batterie im Monat.

2023-01-31_23-57-03__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-01 269854


- Yield_Month_max_Month   Dieser Wert gibt den gesamten Ertrag der PV Anlage im Monat an.

2023-01-31_23-57-03__WR_1_API__SW_Statistic_Yield_Month__MAX__2023-01 308854


- Yield_Year_diff_Week Dieser Wert gibt den gesamten Ertrag der PV Anlage pro Woche an.

2023-01-01_18-57-03__Statistic_Yield_Week__week_52 9942
2023-01-08_16-57-03__Statistic_Yield_Week__week_01 51725
2023-01-15_23-57-03__Statistic_Yield_Week__week_02 68039
2023-01-22_15-57-03__Statistic_Yield_Week__week_03 92407
2023-01-29_23-57-03__Statistic_Yield_Week__week_04 61645
2023-02-05_17-57-03__Statistic_Yield_Week__week_05 94445


Und hier wären dann noch DbRep zum löschen.

LogDBRep_delete_Statistic_EnergyHomeBat_Day_max_Day
LogDBRep_delete_Statistic_EnergyHomePvSum_Day_max_Day
LogDBRep_delete_Statistic_TotalConsumption_Day_max_Day


- EnergyHomeBat_Day_max_Day   Löschen aller SW_Statistic_EnergyHomeBat_Day Werte, bis auf den maximal Wert des Tages.
                                            Der aktuelle Tag bleibt noch erhalten. Aufruf mit: maxValue deleteOther

- EnergyHomePvSum_Day_max_Day   Löschen aller SW_Statistic_EnergyHomePvSum_Day Werte, bis auf den maximal Wert des Tages.
                                            Der aktuelle Tag bleibt noch erhalten. Aufruf mit: maxValue deleteOther

- TotalConsumption_Day_max_Day    Löschen aller SW_Statistic_TotalConsumption_Day_max_Day Werte, bis auf den maximal Wert des Tages.
                                            Der aktuelle Tag bleibt noch erhalten. Aufruf mit: maxValue deleteOther

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 11 Februar 2023, 01:06:07
Problem mit https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus, WR_1_API

Ich habe bei der Kopie der attr usw aus o.g. Wiki folgende Fehlermeldung:
Unrecognized character \xC2; marked by <-- HERE after ne "null")<-- HERE near column 235 at (eval 119431) line 6.
Ich habe schon Block umd Block gelöscht. Ab Stateformat kommt diese Fehlermeldung. Ein Steuerzeichen mit Hilfe eines Editors konnte ich auch nicht finden.
Die Fehlermeldung wird bei Internals , State auch angezeigt.
Oder hat das etwas mit "null" zu tun?

Viele Grüße
udo
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Februar 2023, 09:05:54
Zitat von: u.stemler am 11 Februar 2023, 01:06:07
Problem mit https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus, WR_1_API

Ich habe bei der Kopie der attr usw aus o.g. Wiki folgende Fehlermeldung:
Unrecognized character \xC2; marked by <-- HERE after ne "null")<-- HERE near column 235 at (eval 119431) line 6.
Ich habe schon Block umd Block gelöscht. Ab Stateformat kommt diese Fehlermeldung. Ein Steuerzeichen mit Hilfe eines Editors konnte ich auch nicht finden.
Die Fehlermeldung wird bei Internals , State auch angezeigt.
Oder hat das etwas mit "null" zu tun?
Hallo Udo,
da scheint etwas mit dem Copy/Paste nicht richtig zu laufen.
In meinem stateFormat und auch im Wiki sind mehr Zeilen enthalten, die in Deinem Snapshot fehlen.
Ich habe mal zwei Fenster zusammen im Snapshot abgebildet.

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 11 Februar 2023, 09:41:44
Hallo Christian,
vielen Dank.
Ich hatte das Skript schon mehrfach über Firefox eingelesen und die Fehlermeldung kam immer wieder. Vorhin hatte ich das Skript dann über Chromium eingelesen, dann war die Fehlermeldung weg.
vg
udo
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Februar 2023, 10:56:32
Zitat von: u.stemler am 11 Februar 2023, 09:41:44
Ich hatte das Skript schon mehrfach über Firefox eingelesen und die Fehlermeldung kam immer wieder. Vorhin hatte ich das Skript dann über Chromium eingelesen, dann war die Fehlermeldung weg.
Manchmal hilf auch ein normaler Editor zum zwischen speichern.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 12 Februar 2023, 01:38:10
Irgendwie kommt keine Verbindung vom WR_1-API zu KSEM zustande. Der KSEM steht auf Slave. Wenn ich ein AUT_me oder was auch immer aufrufe, kommt immer die meldung: watch reading -  nach meinem Verständnis müsste FHEM die Informationen auf dem KSEM einlesen, Oder?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: u.stemler am 12 Februar 2023, 01:48:48
OK - jetzt habe ich verstanden. Es gibt eine Master- und eine Slave-variante des WR_1_API-Skripts. Ich hatte die Slavevariante und die war falsch.  Jetzt habe ich die Mastervariante, jetzt siehts wesentlich besser aus.
udo
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Februar 2023, 08:49:02
Zitat von: u.stemler am 12 Februar 2023, 01:48:48
OK - jetzt habe ich verstanden. Es gibt eine Master- und eine Slave-variante des WR_1_API-Skripts. Ich hatte die Slavevariante und die war falsch.  Jetzt habe ich die Mastervariante, jetzt siehts wesentlich besser aus.
udo
Die Slave Variante ist nur für zusätzliche Wechselrichter. Man muss erst mal einen Master haben, egal ob mit oder ohne Speicher.

Achtung, bei zu vielen Fehlversuchen, kann es sein, dass der Plenticore den Zugang sperrt. Dann muss man über das GUI das Passwort neu setzen.
Bei mir ist das Passwort gleich dem Key auf dem Aufkleber vom Plenticore.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: misux am 17 Februar 2023, 19:43:10
Hey Leute!

Habt ihr das etwa nicht? Habe seit ein paar taen, keine ahnung wie lange das phänomen das sich mein modbus ständig connected und wieder disconnented... im Sekundentakt.

Hat das niemand?

https://forum.fhem.de/index.php/topic,132242.0.html (https://forum.fhem.de/index.php/topic,132242.0.html)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 Februar 2023, 19:23:29
Zitat von: misux am 17 Februar 2023, 19:43:10
Hey Leute!

Habt ihr das etwa nicht? Habe seit ein paar taen, keine ahnung wie lange das phänomen das sich mein modbus ständig connected und wieder disconnented... im Sekundentakt.

Hat das niemand?

https://forum.fhem.de/index.php/topic,132242.0.html (https://forum.fhem.de/index.php/topic,132242.0.html)
Nee, alles stabil.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Februar 2023, 09:59:55
Hallo zusammen,
ich habe gerade problemlos auf die aktuellste Firmware beim Plenticore und KSEM umgestellt.
Im Modbus des Plenticore werden jetzt einige Speicher Informationen wieder richtig angezeigt, dazu gibt es Informationen in den Release Notes.

VG   Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: vw2audi am 01 März 2023, 14:22:45
Hallo zusammen,

ich habe das folgende Setting:
Kostal PLENTICORE plus 8.5 mit BYD HV Speicher (ohne webgui) und einem KSEM.

Ich habe das Wiki studiert und mich an das Einrichten der konfiguration gemacht.
Das Device WR_1 funktioniert ohne Probleme und liefert mir auch alle Werte.

Bei dem Modul WR_1_API gibt es ein paar ungereimtheiten. Die Eigenverbrauchsquote kommt mir sehr komisch vor:
heute -20800% !?

Hat jemand eine Idee, wo ich nach dem Fehler suchen kann / muss?

Danke Gruß
Christian

Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 März 2023, 16:58:13
Zitat von: vw2audi am 01 März 2023, 14:22:45
Hallo zusammen,

ich habe das folgende Setting:
Kostal PLENTICORE plus 8.5 mit BYD HV Speicher (ohne webgui) und einem KSEM.

Ich habe das Wiki studiert und mich an das Einrichten der konfiguration gemacht.
Das Device WR_1 funktioniert ohne Probleme und liefert mir auch alle Werte.

Bei dem Modul WR_1_API gibt es ein paar ungereimtheiten. Die Eigenverbrauchsquote kommt mir sehr komisch vor:
heute -20800% !?

Hat jemand eine Idee, wo ich nach dem Fehler suchen kann / muss?
Hallo Christian,
aufgrund der Berechnung für den Hausverbrauch sind die Devices auch für einen Schwarm ausgelegt. Im Schwarm wird der Hausverbrauch momentan noch durch den Plenticore falsch berechnet. Du müsstest bitte auch noch den KSEM einbinden, denn von dort werden noch Messwerte benötigt.
Sobald Kostal den Modbus des KSEM komplettiert hat werde ich das mit dem Hausverbrauch nochmals umbauen, aber auch dafür muss der KSEM eingebunden werden.

Zusätzlich müsstest Du auch noch die initialen Zählerständes des KSEM für den anfang des Jahres/Monats/Tages im WR_1_API Device setzen, die dann später über das PV_Schedule Device aktualisiert werden. Hier mal Beispiele von mir:

Einspeisung:
SW_Meter_init_FeedInGrid_Day 29294     <<< Das wäre heute Morgen
SW_Meter_init_FeedInGrid_Month 29294   <<< Hier der Stand vom 01 des Monats ( was heute der selbe Stand ist )
SW_Meter_init_FeedInGrid_Year 29054    <<< Und das ist der Stand vom 01.01 , bzw. von der Inberiebnahme

Bezug:
SW_Meter_init_Grid_Day 9440
SW_Meter_init_Grid_Month 9440
SW_Meter_init_Grid_Year 8706


VG Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 04 März 2023, 15:38:26
Hallo Christian

Seit ich das neue Extern Control übernommen habe bekomme ich regelmässig Fehlermeldungen.

Heute nun, als die Kommando Wiederholung anschlagen sollte um das regelmässige Nachladen auf 100% zu vermeiden kam folgende Meldung:

warning
condition c07: Use of uninitialized value $type in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 812

Die Meldung erscheint alle 3 Minuten.

Im FHEM Log erscheint folgendes:
2023.03.04 15:17:33 3: eval: BYD_ExternControl_neu: warning in condition c07
2023.03.04 15:17:33 1: PERL WARNING: Use of uninitialized value $type in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 812.
2023.03.04 15:17:33 3: eval: BYD_ExternControl_neu: warning in condition c07
2023.03.04 15:17:33 1: PERL WARNING: Use of uninitialized value $type in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 805.
2023.03.04 15:15:01 3: BYD_ExternControl_neu cmd_12 : Battery_ExternControl_MaxSocRel auf 95 % reduziert


Weisst du was die Ursache sein könnte?
Wie kann ich überprüfen ob der MaxSocRel auch beim WR ankommt?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 März 2023, 15:44:32
Schau mal, ob in dem Block eine Variable nicht gesetzt ist.
Ich bin momentan krank, Sorry.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: zwölfgang am 12 März 2023, 20:47:30
Hallo zusammen,
für alle Interessierten mit einem BYD HVS Speicher, es gibt einen super Beitrag von MiniBlister und MadMax. Es gibt ein Modul 23_BYDBox das ich bei mir installiert habe und gut funktioniert. Die Version 26524 2023-01-17 12:00 aus Beitrag 102 habe ich installiert.
Hier der Link dazu:
https://forum.fhem.de/index.php/topic,121643.90.html

Der Beitrag Nr 7 von MadMax ist auch noch zu beachten.
https://forum.fhem.de/index.php/topic,121643.0.html

VG Wolfgang
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 März 2023, 14:33:35
KI Prognose Teil 1 - DWD und Astro Daten sammeln

Hallo zusammen,
ich möchte Euch schon mal auf die Neuerungen in der Prognose etwas einstimmen.
Dank Peter ist der Ansatz der KI nun eingezogen und meine Ergebnisse, von bisherigen Tests, sehen schon ziemlich gut aus.

Der Grundgedanke ist, dass die Prognose keinerlei technischen Informationen über den Aufbau der PV-Anlage benötigt. Einzig allen der Ertrag der Anlage wird dabei in Bezug zu den Wetterdaten des jeweiligen Standortes gesetz, wobei die KI daraus Rückschlüsse zieht, wie bei ähnlichen Bedingungen der ertrag werden könnte. Je mehr vergleichbare Daten dazu zur Verfügung stehen, umso besser wird die Prognose.

In der momentan implementierten Prognose besteht darüber hinaus ein Problem, das man momentan erzeugte Leistung eigentlich mit der zu erwartenden Energieprognose vergleicht.
Beim neuen Ansatz wird nun versucht das mit zu korrigieren, was auch im Diagramm durch die Stufen Darstellung verdeutlicht wird.

Die KI Prognose arbeitet nun über den Yield, den der Plenticore jede Stunde aktualisiert. Bei diesem Yield ist nun jedoch ein weiteres Problem, da der hybrid Wechselrichter natürlich auf der AC Seite den Yield angibt und somit das Laden des Speichers nicht aktuell mit zählt. Die Speicher Entladung wird später dann wiederum mit gerechnet, was die AC Yield Kurve dann sehr merkwürdig aussehen lässt. An dieser Problematik wurde auch bereits gearbeitet und das wird dann später nochmal erwähnt.

Im Diagramm sieht man nun in blau den korrigierten Yield unter Berücksichtigung des Speichers und in diesem Beispiel Fall für eien gesamten Schwarm (ich habe zwei WR). Jede Stufe im Diagramm ist dann nun der Ertrag (Yield) der entsprechenden Stunde in kWh.
Zur Orientierung sieht man in gelb die AC Leistung in kW, gezeichnet aus den minütlichen Messwerten.
Die rosa Stufen sind dann nun endlich die Ertrags Prognose Werte aus der KI in kWh.

Solltet Ihr später mit in diese Richtung gehen wollen, so macht es Sinn schon jetzt die Wetterdaten für Euren Standort zu sammeln, da diese die Grundlage bilden und im Anschluss mit dem korrigierten Ertrag in Verbindung gebracht werden. Alle im comment angegebenen DWD Werte werden später von der KI ausgewertet und müssen somit in der DbLog vorliegen. Je mehr DWD Daten von den letzten Jahren vorliegen, umso besser kann die KI Rückschlüsse ziehen. Sollten diese nicht da sein, so lernt das ganze langsam dazu.

Hier wäre dann mein aktuelles DWD_Forecast Device
defmod DWD_Forecast DWD_OpenData
attr DWD_Forecast DbLogExclude .*
attr DWD_Forecast DbLogInclude fc.*_.*_Rad1h,fc.*_.*_TTT,fc.*_.*_FF,fc.*_.*_Neff,fc.*_.*_R101,fc.*_.*_RRS1c,fc.*_.*_DD,fc.*_.*_N,fc.*_.*_VV,fc.*_.*_SunD1
attr DWD_Forecast comment Version 2022.08.20 12:00\
TTT     : Temperature 2m above surface [°C]\
FF      : Windspeed\
Neff    : Effective cloud cover [%]\
R101    : Probability of precipitation > 0.1 mm during the last hour [%]\
R600    : Probability of precipitation > 0.0mm during the last 6 hours [%]\
RRs1c    : Snow-Rain-Equivalent during the last 3 hours [kg/m2]\
Rad1h    : Global Irradiance [kJ/m2]\
          kJ/m² Umrechnung *0,277778 in kWh/m²\
ww    : Significant Weather\
wwM    : Probability for fog within the last hour [%]
attr DWD_Forecast event-on-update-reading fc.*_.*_[Rad1h|TTT|FF|Neff|R101|RRS1c|DD|N|VV|SunD1].*
attr DWD_Forecast forecastDays 1
attr DWD_Forecast forecastProperties Rad1h,TTT,FF,Neff,R600,R101,wwM,ww,RRS1c,DD,N,VV,SunD1
attr DWD_Forecast forecastResolution 1
attr DWD_Forecast forecastStation P0178
attr DWD_Forecast group PV Leistungsprognose
attr DWD_Forecast icon weather_rain_fog
attr DWD_Forecast room Informationen->Wetter,Strom->Photovoltaik
attr DWD_Forecast sortby 07
attr DWD_Forecast verbose 0

EDIT: 20230317
Ich habe mal noch ein Bild von heute angehängt, die KI scheint echt schnell zu lernen. Grün ist die alte Prognose und rosa die KI Prognose. Blau ist der erreichte yield für die Stunde, was recht gut zum KI Ergebnis passt.

EDIT: 20230602
Da die KI Prognose ja auch die Astro Daten für den Sonnenstand benötigt und dieser im Astro Device nicht als fc[0|1] vorliegt habe ich das Astro Device etwas modifiziert. In den userreadings werden dort die fc[0|1] Sonnenstände jetzt abgefragt und als readings eingetragen. Dies geschieht sobald es einen Event von ObsDate gibt, der einmal täglich kommen sollte. Somit beachtet auch die Änderung bei event-on-update-reading und beim DbLogInclude.

defmod Astro Astro
attr Astro DbLogExclude .*
attr Astro DbLogInclude SunAlt,SunAz,fc.*_.*
attr Astro alias Astro
attr Astro event-on-change-reading SunAlt,SunAz,ObsSeason,ObsSeasonN,.*Twilight.*
attr Astro event-on-update-reading ObsDate.*,fc.*_.*
attr Astro group ASC Environment
attr Astro icon telescope
attr Astro interval 600
attr Astro recomputeAt NewDay,SunRise,SunSet,AstroTwilightEvening,AstroTwilightMorning,CivilTwilightEvening,CivilTwilightMorning,CustomTwilightEvening,CustomTwilightMorning
attr Astro room Informationen->Wetter,Rollos
attr Astro sortby 08
attr Astro userReadings fc0_6_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 06:00:00",localtime))},\
fc0_7_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 07:00:00",localtime))},\
fc0_8_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 08:00:00",localtime))},\
fc0_9_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 09:00:00",localtime))},\
fc0_10_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 10:00:00",localtime))},\
fc0_11_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 11:00:00",localtime))},\
fc0_12_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 12:00:00",localtime))},\
fc0_13_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 13:00:00",localtime))},\
fc0_14_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 14:00:00",localtime))},\
fc0_15_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 15:00:00",localtime))},\
fc0_16_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 16:00:00",localtime))},\
fc0_17_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 17:00:00",localtime))},\
fc0_18_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 18:00:00",localtime))},\
fc0_19_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 19:00:00",localtime))},\
fc0_20_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 20:00:00",localtime))},\
fc0_21_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 21:00:00",localtime))},\
fc0_6_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 06:00:00",localtime))},\
fc0_7_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 07:00:00",localtime))},\
fc0_8_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 08:00:00",localtime))},\
fc0_9_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 09:00:00",localtime))},\
fc0_10_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 10:00:00",localtime))},\
fc0_11_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 11:00:00",localtime))},\
fc0_12_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 12:00:00",localtime))},\
fc0_13_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 13:00:00",localtime))},\
fc0_14_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 14:00:00",localtime))},\
fc0_15_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 15:00:00",localtime))},\
fc0_16_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 16:00:00",localtime))},\
fc0_17_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 17:00:00",localtime))},\
fc0_18_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 18:00:00",localtime))},\
fc0_19_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 19:00:00",localtime))},\
fc0_20_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 20:00:00",localtime))},\
fc0_21_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 21:00:00",localtime))},\
\
fc1_6_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 06:00:00",localtime(time+1*24*60*60)))},\
fc1_7_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 07:00:00",localtime(time+1*24*60*60)))},\
fc1_8_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 08:00:00",localtime(time+1*24*60*60)))},\
fc1_9_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 09:00:00",localtime(time+1*24*60*60)))},\
fc1_10_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 10:00:00",localtime(time+1*24*60*60)))},\
fc1_11_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 11:00:00",localtime(time+1*24*60*60)))},\
fc1_12_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 12:00:00",localtime(time+1*24*60*60)))},\
fc1_13_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 13:00:00",localtime(time+1*24*60*60)))},\
fc1_14_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 14:00:00",localtime(time+1*24*60*60)))},\
fc1_15_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 15:00:00",localtime(time+1*24*60*60)))},\
fc1_16_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 16:00:00",localtime(time+1*24*60*60)))},\
fc1_17_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 17:00:00",localtime(time+1*24*60*60)))},\
fc1_18_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 18:00:00",localtime(time+1*24*60*60)))},\
fc1_19_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 19:00:00",localtime(time+1*24*60*60)))},\
fc1_20_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 20:00:00",localtime(time+1*24*60*60)))},\
fc1_21_SunAlt:ObsDate.* {Astro_Get(undef,"Astro","text","SunAlt",POSIX::strftime("%Y-%m-%d 21:00:00",localtime(time+1*24*60*60)))},\
fc1_6_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 06:00:00",localtime(time+1*24*60*60)))},\
fc1_7_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 07:00:00",localtime(time+1*24*60*60)))},\
fc1_8_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 08:00:00",localtime(time+1*24*60*60)))},\
fc1_9_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 09:00:00",localtime(time+1*24*60*60)))},\
fc1_10_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 10:00:00",localtime(time+1*24*60*60)))},\
fc1_11_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 11:00:00",localtime(time+1*24*60*60)))},\
fc1_12_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 12:00:00",localtime(time+1*24*60*60)))},\
fc1_13_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 13:00:00",localtime(time+1*24*60*60)))},\
fc1_14_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 14:00:00",localtime(time+1*24*60*60)))},\
fc1_15_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 15:00:00",localtime(time+1*24*60*60)))},\
fc1_16_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 16:00:00",localtime(time+1*24*60*60)))},\
fc1_17_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 17:00:00",localtime(time+1*24*60*60)))},\
fc1_18_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 18:00:00",localtime(time+1*24*60*60)))},\
fc1_19_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 19:00:00",localtime(time+1*24*60*60)))},\
fc1_20_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 20:00:00",localtime(time+1*24*60*60)))},\
fc1_21_SunAz:ObsDate.* {Astro_Get(undef,"Astro","text","SunAz",POSIX::strftime("%Y-%m-%d 21:00:00",localtime(time+1*24*60*60)))}
attr Astro verbose 0

VG  Christian
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 17 März 2023, 09:52:34
KI Prognose Teil 2 - Vorbereitung der Daten

Moin,
hier kommt nun der zweite Teil der neuen KI Prognose.
In diesem Teil geht es darum die Daten aus der FHEM History so aufzubereiten, dass sie für die KI Prognose verwendbar wird. Das Daten Model der FHEM History ist in der Form nicht für diese Verarbeitung brauchbar und wird deshalb in eine neu Tabelle überführt. Bei der Gelegenheit wird einiges noch aufbereitet und insbesondere der yield des Plenticore mit Speicher korrigiert.

Im Anhang befindet sich eine MySQL Procedure, die in der Datanbank hinterlegt wird. Dazu verwende ich z.B. die MySQL Workbench, wo dann die Procedure unter "Stored Precedures" auftaucht. Dies ermöglicht, dass man im FHEM DbRep Device nur diese eine Procedure aufrufen kann und nicht jedes einzelne SELECT zur Datenbank in einer separaten Session übermittelt werden muss.

dwd_load in einzelnen Schritten
  • Löschen der bisherigen dwdfull Tabelle
  • Anlegen einer neuen dwnfull Tabelle
  • Füllen der Tabelle mit den älteren rad1h Werten
  • Ergänzen der rad1h Werte für den nächsten Tag
  • Nun erfolgen alle weiteren DWD Daten in weiteren Spalten der dwdfull Tabelle
    • TTT      : Temperature 2m above surface [°C]
    • FF      : Windspeed
    • Neff    : Effective cloud cover [%]
    • R101    : Probability of precipitation > 0.1 mm during the last hour [%]
    • R600    : Probability of precipitation > 0.0mm during the last 6 hours [%]
    • RRs1c  : Snow-Rain-Equivalent during the last 3 hours [kg/m2]
    • Rad1h  : Global Irradiance [kJ/m2]
                  kJ/m² Umrechnung *0,277778 in kWh/m²
    • ww      : Significant Weather
    • wwM    : Probability for fog within the last hour [%]
  • Zum Schluss wird noch der yield der kompletten PV-Anlage ergänzt
    • Begonnen wird mit dem AC yield, der stundenweise aus dem Zähler "SW_Yield_Daily" berechnet wird
        dieser ist jedoch wegen des DC seitigen Speichers nicht korrekt, da in einem Graphen die PV-Leistung erst nach dem entladen zugerechnet wird
    • Nun wird der DC yield des Speichers berücksichtigt, was über diese Werte geschieht
      • Battery_Total_DC_ChargeEnergy_DCsideToBattery
      • Battery_Total_DC_DischargeEnergy_DCsideFromBattery
    • Die Ermittlung einer stunden basierten Tabelle ist etwas komplexer und bedarf diverser SELECT mit JOIN (Im MySQL gibt es kein full JOIN)
  • Der letzte Schritt ist dann die Möglichkeit einer Rückmeldung aus der MySQL Procedure ins FHEM
  • Über den Parameter show/none wird der Prozedure die Art der Rückmeldung mitgeteilt
    • none wäre der Default und gibt als Ergebnis das aktuelle Datum der Datenbank zurück
    • show würde den Inhalt der dwnfull Tabelle an FHEM zurück liefern, was jedoch einige hundert Zeilen sein werden
  • Die Procedure selectiert nur die entscheidenden Daten für die jeweilige KI Prognose, um das Datenvolumen gering zu halten,
    denn es macht ja keinen Sinn, die Winter mit den Sommer Daten zu vergleichen
  • Hierbei werden deshalb folgende Zeiträume jeweils selectiert
    • Die letzten 30 Tage ab dem aktuellen Datum
    • Vom letzten Jahr 30 Tage vor dem Datum
    • Vom letzten Jahr 30 Tage nach dem Datum
    • Vom vorletzten Jahr 30 Tage vor dem Datum
    • Vom vorletzten Jahr 30 Tage nach dem Datum
    • Die Forecast Daten für den nächsten Tag,
      an dieser Stelle wäre es natürlich auch denkbar noch weiter in die Zukunft zu gehen,
      was mir jedoch zu spekulativ ist und nach meiner Meinung bisher für keine Entscheidung von Wichtigkeit wäre
  • Die Laufzeit dieser Procedure beträgt auf meinem RPI4 in einem Oracle MySQL Docker Container ca. 50-70 Sekunden,
    deshalb musste ich bei mir den Timeout der MySQL Workbench für eine Session von 60 Sekunden auf z.B 90 Sekunden erhöhen
  • In einem Interface Eurer Wahl zur Datenbank könnt Ihr die Procedure zum Testen dann aufrufen und das Ergebnis testen.
call dwd_load(curdate(),'none');

select * from dwdfull
-- WHERE TIMESTAMP > curdate()
order by TIMESTAMP desc
LIMIT 1000;

Sollte nun der Test der Procedure eine gefüllte Tabelle anzeigen, so kann nun die Integration ins FHEM erfolgen. Hierzu wird dann ein DbRep Device angelegt, dass später zyklisch jede Stunde ausgeführt wird.
Achtung, bei diesem Device kommt im weiteren Fortschritt noch ein weiteres Attribut zum Aufruf des Python KI Prognose Skriptes hinzu. Im Kommentar wird dies bereits im Syntax erwähnt.
defmod LogDBRep_PV_KI_Prognose DbRep LogDB
attr LogDBRep_PV_KI_Prognose DbLogExclude .*
attr LogDBRep_PV_KI_Prognose allowDeletion 0
attr LogDBRep_PV_KI_Prognose comment Version 2023.02.23 12:00\
\
Hier wird die Vorbereitung für die KI PV-Leistungsprognose durchgeführt\
\
sqlCmd call dwd_load(curdate(),'none');;\
[none|show] zum Anzeigen des Ergebnisses\
\
executeAfterProc:\
<absoluter Skript Name> <DbLog IP-Adresse> <FHEM IP-Adresse> <DbRep Name> <Wechselricher Name> <Prefix Reading Name>
attr LogDBRep_PV_KI_Prognose executeAfterProc "/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.XXX 192.168.178.YYY LogDBRep_PV_KI_Prognose WR_1 Solar_yield_fc"
attr LogDBRep_PV_KI_Prognose room System
attr LogDBRep_PV_KI_Prognose verbose 3
Auch hier sollte nun getestet werden, indem man beim set das sqlCmd ausführt. Der MySQL Procedur Aufruf ist ebenfalls im Kommentar zu finden.

Als Ergebnis sollte soetwas zurück kommen. Nachdem das erschienen ist kann man den obigen Test mit dem SELECT der dwdfull Tabelle nochmals wiederholen.
SqlResultRow_1 NOW()
SqlResultRow_2 2023-03-17 11:01:03
sqlCmd call dwd_load(curdate(),'none');
sqlResultNumRows 1

Im nächsten Teil dieser Reihe kommt dann die Python KI Prognose.
Bitte beachtet auch, dass dies noch im Entwicklungsstatus ist und es immer mal wieder noch Änderungen geben wird.

VG Christian

P.S. Um den Thread nicht zu sehr mit diesem Thema zu fluten könnt Ihr mir Eure Probleme und Fragen besser als PN schicken, ich pflege das dann in den entsprechenden Posts ein und verbesser diese dann. Aus den Posts wird dann später das Wiki weiter gepflegt :-)
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 März 2023, 10:06:38
KI Prognose Teil 3 - Python KI Prognose Skript

Für die Verwendung der KI Prognose werden die folgenden Python Packages noch benötigt. Die Basis wäre hierbei der FHEM Docker Container.
Momentan habe ich das erstmal manuell im Container gemacht:
  • sudo apt-get install python3-pandas
  • sudo apt-get install python3-pymysql
  • sudo apt-get install python3-sqlalchemy
  • sudo apt-get install python3-sklearn python3-sklearn-lib
  • pip3 install fhem
Für Docker sollte das im .yml File dann so aussehen:
  • -e PIP_PKGS="pandas pymysql sqlalchemy sklearn sklearn-lib"
  • ob das mit dem "pip3 install fhem" so geht habe ich nicht getestet

Die Python Skripte liegen bei mir im Ordner
  • ./python/bin
  • ./python/bin/PV_KI_Prognose.py (Das Skript ist im Anhang)

Das PV_KI_Prognose.py wir mit folgenden Paramerter aufgerufen:
     <absoluter Skript Name> <DbLog IP-Adresse> <FHEM IP-Adresse> <DbRep Name> <Wechselricher Name> <Prefix Reading Name>
z.B. /opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.XXX 192.168.178.YYY LogDBRep_PV_KI_Prognose WR_1 Solar_yield_fc

  • Zum Test kann dies auch in "" in der FHEM Kommandozeile eingegeben werden, zuvor muss jedoch die MySQL Prozedur aufgerufen worden sein, damit die benötigte Tabelle mit den Daten erstellt worden ist.
  • Nach dem Testen kommt dieser Aufruf dann in das LogDBRep_PV_KI_Prognose Device und wird somit mit dem MySQL Prozeduraufruf synchronisiert.
    Bitte das LogDBRep_PV_KI_Prognose Device aus dem vorherigen Post verwenden (es wurde mit diesem Update aktualisiert!).
    Damit dann alles automatisch gestartet wird muss nun noch im PV_Schedule Device ein Eintrag eingefügt werden.
  • Achtung, im weiteren Thread Verlauf wurde jetzt auch schon ein WR_ctl Device eingeführt, was dann auch die Forecast Daten beinhaltet.
  • Für das WR_1 und WR_1_API Device gibt es auch ein Update für das stateFormat, damit es in Verbindung mit dem WR_ctl Device nicht alles doppelt anzeigt
< snip >
################################################################################################################
## 2 PV Prognose vom aktuellen Tag aktualisieren
##     zwischen 5 und 21 Uhr zur vollen Stunde
DOELSEIF
 ([05:00-21:00] and [:00])
## Das ist die bisherige Prognose, die noch weiterhin verwendet wird.
   ({Solar_forecast("LogDB","LogDBRep_PV_Forecast_SQL","WR_1","Solar_Calculation_fc","DWD_Forecast",0)})

## An dieser Stelle wird nun die PV_KI_Prognose gestartet, die dann im WR_1 Device für eine Übergangszeit
## zusätzliche readings erstellt. Nach einer Testphase wird das dann geändert.
   (set LogDBRep_PV_KI_Prognose sqlCmd call dwd_load(curdate(),'none') )

< snip >


Für die Netzwerkverbindung aus dem KI Python Skript werden die Zugansdaten im Filesystem abgelegt, damit sie nicht mit dem Skript ausversehen weiter gegeben werden.
  • ./python/pwd_fhem.json
  • ./python/pwd_sql.json
Die Verbindungsdaten werden in den Dateien wie folgt abgelegt:
fhem@raspberrypi:~/python$ cat pwd_[fhem|sql].json
{"username": "<Euer Username>",
 "password": "<Euer Passwort>"}
FHEM und die Datenbank müssen nicht auf dem selben Rechner installiert werden. Die IP-Adressen werden dem Skript beim Aufruf mitgegeben.

Es ist nicht erforderlich die neuen readings mit DbLogInclude aus dem WR_1 Device in die datenbank zu loggen, da dies bereits durch das PV_KI_Prognose Skript direkt geschieht, um einen passenden TIMESTAMP pro Stunde zu bekommen.

Wenn im LogDBRep_PV_KI_Prognose der verbose Level auf >= 3 steht kommen diverse Meldungen im Log:
2023.04.07 16:01:21.586 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.XXX 192.168.178.YYY LogDBRep_PV_KI_Prognose WR_1 Solar_yield_fc"'

### Wer die Meldung weg bekommt, kann Lob und Anerkennung erwarten :-)
/usr/lib/python3/dist-packages/sklearn/externals/joblib.py:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import imp

PV_KI_Prognose  running - start
PV_KI_Prognose  running - connected to 192.168.178.XXX
PV_KI_Prognose  running - dwdfull read from DbLog 192.168.178.YYY
PV_KI_Prognose  running - RandomForestRegressor loading
PV_KI_Prognose  running - RandomForestRegressor loaded
PV_KI_Prognose  running - RandomForestRegressor trained
PV_KI_Prognose  running - RandomForestRegressor fitted with yield
PV_KI_Prognose  running - old forecast deleted
PV_KI_Prognose  running - start forecast
Solar_yield_fc0_06  06 77
Solar_yield_fc0_07  07 448
Solar_yield_fc0_08  08 1133
Solar_yield_fc0_09  09 2073
Solar_yield_fc0_10  10 2921
Solar_yield_fc0_11  11 3637
Solar_yield_fc0_12  12 4168
Solar_yield_fc0_13  13 4348
Solar_yield_fc0_14  14 4348
Solar_yield_fc0_15  15 4080
Solar_yield_fc0_16  16 3557
Solar_yield_fc0_17  17 2877
Solar_yield_fc0_18  18 1787
Solar_yield_fc0_19  19 610
Solar_yield_fc0_20  20 103
PV_KI_Prognose  running - forecast written to FHEM
PV_KI_Prognose  running - old forecast deleted
PV_KI_Prognose  running - start forecast
Solar_yield_fc1_06  06 124
Solar_yield_fc1_07  07 1294
Solar_yield_fc1_08  08 3669
Solar_yield_fc1_09  09 5376
Solar_yield_fc1_10  10 6706
Solar_yield_fc1_11  11 8224
Solar_yield_fc1_12  12 8766
Solar_yield_fc1_13  13 8786
Solar_yield_fc1_14  14 8627
Solar_yield_fc1_15  15 7247
Solar_yield_fc1_16  16 5457
Solar_yield_fc1_17  17 4150
Solar_yield_fc1_18  18 2550
Solar_yield_fc1_19  19 900
Solar_yield_fc1_20  20 101
PV_KI_Prognose  running - forecast written to FHEM
--------------------------------------------
max       off/at 8792 12:00
Middayhigh_start 00:00
Middayhigh_stop  00:00
4h               12301
rest             13014
morning          10289
afternoon        25878
day              36167
--------------------------------------------
PV_KI_Prognose  done

20230602: Das PV_KI_Prognose.py Skript wurde aktualisiert.
20230704: Das PV_KI_Prognose.py Skript wurde aktualisiert.
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 18 März 2023, 10:07:17
KI Prognose Teil 4 - Grafana Visualisierung

Dieser Post ist bereits ein Platzhalter in diesem Thread, damit alle Teile der KI Prognose zusammen hängend sind, bevor sie ins Wiki kommen.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 März 2023, 16:22:02
Update: 20220328
Bisher haben sich 4 Mitstreiter gemeldet, bei denen auch bereits die dwd_load() Procedur läuft und die dwdfull Tabelle erstellt wird.
Falls es da noch Fragen gibt bitte per PN melden.
Am Ki Python Skript schreibe ich noch fleißig weiter, damit der nächste Schritt gemacht werden kann.


Update: 20220324
"KI Prognose Teil 2" hat sich die MySQL Prozedur geändert, da es eine inkompatibilität zu MariaDB gegeben hat.
Auch das "DROP PROCEDURE" ist nun direkt mit in dem Skript vorhanden und muss dann mit ausgeführt werden.



Moin,
im "KI Prognose Teil 2" hat sich die MySQL Prozedur geändert.
Die Änderung betrifft den Yield Bereich, da es bei längerem Laden des Speichers zu eine fehlerhaften Auswertung gekommen ist.
Bitte ladet die Procedur neu herunter, bevor diese gespeichert werden kann muss natürlich die bisherige vorher gelöscht werden.
DROP PROCEDURE IF EXISTS dwd_load;

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 März 2023, 09:20:43
Moin zusammen,
Kostal scheint wohl an den ModBus Registern gebastelt zu haben, was jedoch unsere Implementierung nicht betroffen hat.
Kostal: Modbus Wert für Batterie Kapazität wird nicht mehr ausgelesen (https://forum.fhem.de/index.php?topic=132918.0)
Vor diversen WR updates wurde mal einige Speicher Registern ergänzt und bei dem älteren 529 scheint nun nichts mehr zu kommen.
Ihr könntet das ja mal checken und in dem anderen thread ergänzen.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 April 2023, 16:16:27
Moin,
heute hat die KI Prognose sogar den Einbruch beim Ertrag von 13:00 bis 14:00 Uhr getroffen :-)
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 06 April 2023, 18:21:59
Zitat von: ch.eick am 06 April 2023, 16:16:27Moin,
heute hat die KI Prognose sogar den Einbruch beim Ertrag von 13:00 bis 14:00 Uhr getroffen :-)


Ja dann warte ich gespannt auf deine Umsetzung  ;D
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: plin am 06 April 2023, 21:23:13
Nachdem ich das Einspeiselimit rausgenommen habe lernt meine KI gerade was heutzutage alles geht.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 April 2023, 16:19:16
Hallo zusammen,
ich bin jetzt mal ganz wagemutig und stelle das PV_KI_Prognose Skript hier ein :-)

KI Prognose Teil 3 - Python KI Prognose Skript

Ihr könntet dann jetzt hier weiter testen. (https://forum.fhem.de/index.php?msg=1268601)
Und in diesem Post muss das LogDBRep_PV_KI_Prognose Device aktualisiert werden. (https://forum.fhem.de/index.php?msg=1268478)

In der Datenbank sind dann natürlich auch Werte zum Plotten der Ergebnisse, das kommt dann später im Post für Grafana.

Feedback bitte per PN direkt an mich, damit der Thread nicht so voll wird ;-)

Frohes Oster Wochenende
    Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 April 2023, 16:31:59
Hallo zusammen,
wenn für die KI Prognose jetzt keine großen Einwände kommen, würde ich dann jetzt mal die Umstellung im WR_1
und den anderen abhängigen Devices vornehmen, sodass das ganze dann produktiv wäre. Bei der Aktion würden dann
auch die WR_*_config Devices weg fallen, da es ja keine KI Prognose Konfiguration in der Form mehr geben wird.

An der alten Solar_forecast() wird es dann von meiner Seite keine Weiterentwicklung geben, ich würde dann mal
schauen, wie man das im Wiki auf eine eigene Seite stellen kann, damit es andere noch verwenden können.

In den letzten Tagen hatte ich mich dann noch mit EVU_Tibber_connect beschäftigt, um eine Möglichkeit zum
Speicherladen im Winter vorzubereiten, das ist jetzt auch soweit durch. Die uiTable Diagramme mit card könnte ich
mir für den KI Prognose noch vorstellen.
Mein Gedanke wäre aus dem PV_Schedule, was ja auch mal überarbeitet werden sollte dann eine Art übergeordnetes Device
zu machen, wo dann z.B. die KI Prognose Werte rein könnten und mit den Diagrammen aufgewertet werden. Das Scheduling
für die Bilanzen und die Statistiken könnte dort ja auch bleiben.
Denkbar wäre auch den Status von WR_1 und WR_1_API dort zu integrieren, wodurch man dann auch Pull/Down Menüs für die
API haben könnte, ohne in das WR_1_API Device rein gehen zu müssen. Die Nostalgiker könnten ja dann trotzdem das
bisherige stateFormat weiter verwenden.

Jetzt wäre dann der richtige Zeitpunkt für weitere Ideen, damit die mit einfließen können.

VG Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 April 2023, 18:40:02
Moin,
ich habe mal ein Beispiel für die Diagramme im FHEMWEB erstellt und beginne das stateFormat zu migrieren.
Auch die KI Prognose Anbindung sieht man nun als Status, damit man erkennt, wann man es nicht nochmal manuell starten kann.

Leider kann das card bisher noch nicht in die Zukunft darstellen, was jedoch eventuell mal kommen soll.
Somit ist der Tagesnamen für fc1 falsch und wird wegen der Verschiebung der Zeit als Sonntag gekennzeichnet.
Dargestellt habe ich nun die KI Prognose Yield für fc0 und fc1. Auch das Maximum finde ich recht gut gekennzeichnet.

- Im Bild sieht man nun bereits den Status der Prognose, die mit den bekannten readings jetzt im WR_ctl Device abgelegt wird.
  Hierdurch werden dann die Prognose readings aus dem WR_1 Device verschwinden.
- Die wichtigsten Kommandos Aufrufe sind über das Pull/Down Menü erreichbar
- Unterhalb der Diagramme beginnt dann der Status des WR_1_API
- Die Anzeige der aktuellen Werte wird nun nicht mehr nur alle 5 Minuten aktualisiert und passt somit zum WR_1 Device
- Auch das WR_1_API Device kann über ein Pull/Down Menü abgerufen werden. Bisher ist mir nur die Statistikabfrage
  und der Plenticore Software Reset eingefallen, was man von Zeit zu Zeit mal manuell machen würde.

Als Konsequenz würde sich daraus folgendes ergeben
- Das PV_Schedule Device entfällt, da es vom WR_ctl übernommen wird.
- Die KI Prognose erstellt immer fc0 und fc1
- Die WR_*_config entfallen, da die Konfiguration der Prognose weg fällt
  - Die Wetterstation wird nur noch im DWD Device benötigt
  - Die IP-Adressen schaue ich mir nochmal an, würden aber auch im WR_ctl abgelegt werden
- Die stateFormat vom WR_1 und WR_1_API lägen nur noch als Alternative Definition im Wiki,
  falls man mal eine abgespeckte Version haben möchte, oder die alte Implementierung behalten möchte.
- Im Wiki müsste somit noch eine Seite erstellt werden, die die alten Devices noch behält, die
  jedoch dann über kurz oder lang nicht weiter gepflegt werden.

1.JPG

Und hier kommt noch das RAW WR_ctl Stand 20230613
defmod WR_ctl DOIF ################################################################################################################\
## 1 Scheduling für das Abholen der Wechselrichter Statistiken\
##   Umschaltung des Schattenmanagements\
##\
20_Statistic_EnergyFlow\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
    and\
    (     [:57]                                                          ## Kurz vor jeder vollen Stunde\
    )\
    or [$SELF:ui_command_2] eq "20_Statistic_EnergyFlow"                 ## Hier wird das uiTable select ausgewertet\
   ) {\
\
  ::CommandGet(undef, "WR_2_API 20_Statistic_EnergyFlow");;                                ## Zuerst WR_2 und anschließend\
  set_Exec("wait_Statistic",2,'::CommandGet(undef, "WR_1_API 20_Statistic_EnergyFlow")');; ## WR_1, damit die Schwarm Werte stimmen\
\
   ## Schattenmanagement \
   if ($hour == 9)   {\
     ::CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 0");;       ## Komplett aus\
   }\
   if ($hour == 16) {\
     ::CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 2");;       ## Im Westen unten einschalten\
   }\
   if ($hour == 21) {\
     ::CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 1");;       ## Schattenmanagement für den Osten vorbereiten\
   }\
\
  if (AttrVal("$SELF","verbose",0) >=3) {\
      Log 3, "$SELF cmd_1  : Abfrage der Statistiken";;\
    }\
\
    set_Reading("ui_command_2","---");;                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
  }\
}\
\
################################################################################################################\
## 2 Start der KI Prognose\
## Der Reading Name und das Device werden in LogDBRep_PV_KI_Prognose im executeAfterProc eingestellt\
##  "/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_1_ctl Yield_fc"\
##\
2_KI_Prognose\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
    and\
      ReadingsVal("LogDBRep_PV_KI_Prognose","PV_KI_Prognose","null") eq "done"  ## Die Prognose darf nicht gerade laufen !!!\
    and\
  (\
    ([05:00-22:00] and [:03]                                             ## In der PV-Zeit jede Stunde aktualisieren\
    )\
    or [$SELF:ui_command_1] eq "2_KI_Prognose"                           ## Hier wird das uiTable select ausgewertet\
  )\
   ) {\
\
  ::CommandSet(undef, "LogDBRep_PV_KI_Prognose sqlCmd call dwd_load(curdate(),'none')");;\
\
  if (AttrVal("$SELF","verbose",0) >=3) {\
      Log 3, "$SELF 2_KI_Prognose : Start KI Prognose";;\
    }\
\
    set_Reading("ui_command_1","---");;                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
  }\
}\
\
################################################################################################################\
## 2 Erstellen des Diagramms im uiTable\
3_WR_ctl_Diagramm\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
    and [$SELF:Yield_fc0_06]                                             ## Wenn die Prognose aktualisiert wurde\
    or  [$SELF:ui_command_1] eq "3_WR_ctl_Diagramm"                      ## Hier wird das uiTable select ausgewertet\
   ) {\
\
  my (@out) = ("") x 2;;                                                  ## Es wird für jedes Diagramm ein Array benötigt\
  my $timestamp;;\
\
  for (my $j=0;;$j<=1;;$j++){                                              ## loop fc0 und fc1\
    for (my $i=5;;$i<=21;;$i++){                                           ## loop für die PV-Zeit\
      $timestamp = sprintf("%s_%02d:00:00", POSIX::strftime("%Y-%m-%d",localtime(time)), $i);;\
      $out[$j]  .= $timestamp." ".::round(::ReadingsVal("$SELF",sprintf("Yield_fc%d_%02d",$j, $i),0)/1000,2)."\n";;\
    } # End $i\
  } # End $j\
  if (AttrVal("$SELF","verbose",0) >=3) {\
      Log 3, "$SELF 3_WR_ctl_Diagramm : Werte für das Diagramm";;\
      print($out[0]."\n\n");;\
      print($out[1]."\n");;\
    }\
  ## Yield_fc*_current dient nur als Trigger für die card Diagramme, damit diese im uiTable aktualisiert werden.\
  ::DOIF_modify_card_data("$SELF","$SELF","Yield_fc0_current","bar1day",0,$out[0]);;      ## Der fc1 wird verschoben, da card nicht\
  ::DOIF_modify_card_data("$SELF","$SELF","Yield_fc1_current","bar1day",-86400,$out[1]);; ## den nächsten Tag anzeigen kann\
\
    set_Reading("ui_command_1","---");;                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
  }\
}\
\
################################################################################################################\
## 4 WR_1_API setzen der init Werte für die Berechnung des Hausverbrauches. Bei Fehlern in der Verbrauchsanzeige\
##   muss man die ersten Werte des Tages gegen 00:01 aus der DB setzen. \
4_WR_1_API_init_Werte\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
    and\
       [00:01]\
    or [$SELF:ui_command_2] eq "4_WR_1_API_init_Werte"                   ## Hier wird das uiTable select ausgewertet\
   ) {\
    if ($hour > 0) {\
      ## Achtung, der init Wert muss auf den ersten Wert des Tages korrigiert werden, dieser ist in der DB\
\
      ## Korrektur der Tages Werte\
      my $Active_energy = ::CommandGet(undef, "LogDBRep_$SELF_SQL sqlCmdBlocking\
           SELECT VALUE FROM history\
           WHERE DEVICE='WR_0_KSEM'\
             AND READING='Active_energy-'\
             AND TIMESTAMP > curdate() - interval 1 month\
             AND TIMESTAMP <= concat(curdate(),' 00:01')\
           ORDER BY TIMESTAMP desc\
           LIMIT 1;;") ;;\
      fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Day $Active_energy");;\
\
      $Active_energy = ::CommandGet(undef, "LogDBRep_$SELF_SQL sqlCmdBlocking\
           SELECT VALUE FROM history\
           WHERE DEVICE='WR_0_KSEM'\
             AND READING='Active_energy+'\
             AND TIMESTAMP > curdate() - interval 1 month\
             AND TIMESTAMP <= concat(curdate(),' 00:01')\
           ORDER BY TIMESTAMP desc\
           LIMIT 1;;") ;;\
      fhem("setreading WR_1_API SW_Meter_init_Grid_Day $Active_energy");;\
\
      ## Korrektur der Monats Werte\
      $Active_energy = ::CommandGet(undef, "LogDBRep_$SELF_SQL sqlCmdBlocking\
      SELECT VALUE FROM history\
           WHERE DEVICE='WR_0_KSEM'\
             AND READING='Active_energy-'\
             AND TIMESTAMP > curdate() - interval 1 month\
             AND TIMESTAMP <= subdate(curdate(), (day(curdate())-1))\
           ORDER BY TIMESTAMP desc\
           LIMIT 1;;") ;;\
      fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Month $Active_energy");;\
\
      $Active_energy = ::CommandGet(undef, "LogDBRep_$SELF_SQL sqlCmdBlocking\
      SELECT VALUE FROM history\
           WHERE DEVICE='WR_0_KSEM'\
             AND READING='Active_energy+'\
             AND TIMESTAMP > curdate() - interval 1 month\
             AND TIMESTAMP <= LAST_DAY(SUBDATE(curdate(), INTERVAL 1 MONTH))\
           ORDER BY TIMESTAMP desc\
           LIMIT 1;;") ;;\
      fhem("setreading WR_1_API SW_Meter_init_Grid_Month $Active_energy");;\
\
      ::CommandGet(undef, "WR_2_API 20_Statistic_EnergyFlow");;           ## Zuerst WR_2 und anschließend\
      ::CommandGet(undef, "WR_1_API 20_Statistic_EnergyFlow");;           ## WR_1, damit die Schwarm Werte stimmen\
\
    } else {\
      fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Day ".[?WR_0_KSEM:Active_energy-]);;\
      fhem("setreading WR_1_API SW_Meter_init_Grid_Day ".[?WR_0_KSEM:Active_energy+]);;\
    }\
\
    if ($mday eq 1) {\
      fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Month ".[?WR_0_KSEM:Active_energy-]);;\
      fhem("setreading WR_1_API SW_Meter_init_Grid_Month ".[?WR_0_KSEM:Active_energy+]);;\
\
      if ($yday eq 0) {\
        fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Year ".[?WR_0_KSEM:Active_energy-]);;\
        fhem("setreading WR_1_API SW_Meter_init_Grid_Year ".[?WR_0_KSEM:Active_energy+]);;\
      }\
    }\
\
    if (AttrVal("$SELF","verbose",0) >=3) {\
        Log 3, "$SELF 4_WR_1_API_init_Werte : init Werte gesetzt";;\
    }\
\
    set_Reading("ui_command_2","---");;                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
  }\
}\

attr WR_ctl DbLogExclude .*
attr WR_ctl DbLogInclude Yield_fc0_day
attr WR_ctl comment Version 2023.06.21 12:00 \
\
Die readings Yield_fc* werden direkt vom KI Prognose Skript in die Datenbank geschrieben und müssen hier nicht extra gelogged werden.
attr WR_ctl disable 0
attr WR_ctl group PV Eigenverbrauch
attr WR_ctl icon sani_solar
attr WR_ctl room Strom->Photovoltaik
attr WR_ctl sortby 11
attr WR_ctl uiTable {\
package ui_Table;;\
  $TABLE = "style='width:100%;;'";;\
\
  $TD{0..18}{0}     = "align='center' style='font-size:16px;;border-right-style:solid;;border-color:darkgreen;;border-right-width:2px;;width:26%'";;\
\
  $TD{0..18}{1} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
  $TD{0..18}{2..4} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
  $TD{0..18}{5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
\
sub FUNC_Status {\
    my($value, $min, $colorMin,  $statusMin,  $colorMiddel, $statusMiddle, $max, $colorMax, $statusMax)=@_;;\
    my $ret = ($value < $min)? '<span style="color:'.$colorMin.'">'.$statusMin.'</span>' : ($value > $max)? '<span style="color:'.$colorMax.'">'.$statusMax.'</span>' : '<span style="color:'.$colorMiddel.'">'.$statusMiddle.'</span>';;\
    return $ret;;\
  }\
\
sub Status_Speicher {\
  if (::ReadingsVal("WR_1","Actual_Battery_charge_-minus_or_discharge_-plus_P",0) < -10) {\
    return "<span style='color:green'>Laden</span><br>".::ReadingsVal("WR_1","State_of_EM","n/a")\
  } elsif (::ReadingsVal("WR_1","Actual_Battery_charge_-minus_or_discharge_-plus_P",0) >  15) {\
    return  "<span style='color:red'>Entladen</span><br>".::ReadingsVal("WR_1","State_of_EM","n/a")\
  } else {\
    return "<span style='color:orange'>Standby</span>"."<br>".::ReadingsVal("WR_1","State_of_EM","n/a")\
  }\
}\
sub Yield {\
  my($i)=@_;;\
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;\
\
  if ($i eq "4h") {\
      return sprintf("%05d 4h",::ReadingsVal("$SELF","Yield_fc0_4h",0));;\
    } elsif ($i eq "Tag") {\
      return sprintf("%05d Tag",::ReadingsVal("$SELF","Yield_fc0_day",0));;\
    } elsif ($i eq "Rest") {\
      return sprintf("%05d Rest",::ReadingsVal("$SELF","Yield_fc0_rest",0));;\
    } elsif ($i eq "max") {\
      return sprintf("%05d Wh",::ReadingsVal("$SELF","Yield_fc0_max",0));;\
    } elsif ($i eq "max_time") {\
      return ::ReadingsVal("$SELF","Yield_fc0_max_time","null");;\
    } elsif ($i eq "Vormittag") {\
      return sprintf("%05d Wh",::ReadingsVal("$SELF","Yield_fc0_morning",0));;\
    } elsif ($i eq "Nachmittag") {\
      return sprintf("%05d Wh",::ReadingsVal("$SELF","Yield_fc0_afternoon",0));;\
    }\
  my $j = $i + $hour;;\
  if ($j > 23) {\
    if     ($j == 24) {$j = 0}\
    elsif ($j == 25) {$j = 1}\
    elsif ($j == 26) {$j = 2}\
  }\
  return sprintf("%02d : %05d Wh",$j,::ReadingsVal("$SELF","Yield_fc0_".sprintf("%02d",$j),0));;\
 }\
\
sub WR_ctl_Format {\
  my($period,$device,$reading)=@_;;\
  my $value = 0;;\
  my $MonthBefore   = "LogDBRep_Statistic_previous_Month";;\
  my $MonthPrevious = ::ReadingsTimestamp("$MonthBefore","$device"."$reading","null");;\
       $MonthPrevious = ($MonthPrevious ne "null") ?    POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$MonthBefore","$device"."$reading","null")))) : "null";;\
\
  my $QuarterBefore   = "LogDBRep_Statistic_previous_Quarter";;\
  my $QuarterPrevious = "null";;\
  if ($period eq "_Qx" or $period eq "_Quarter") {\
    foreach my $loop (1,2,3,4) {\
       if (::ReadingsVal("$QuarterBefore","Q".$loop,0) eq "previous") { \
         $QuarterPrevious = "Q".$loop \
       }\
    };;\
    if ($period eq "_Qx") {\
      return " / ".$QuarterPrevious;;\
    }\
  }\
\
  my $YearBefore   = "LogDBRep_Statistic_previous_Year";;\
  my $YearPrevious = "";;\
  $YearPrevious = ::ReadingsTimestamp($YearBefore,$reading."_Year","null");;\
  $YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$YearBefore",$reading."_Year","null")))) : "null";;\
\
  if ($period eq "_Yx") {\
    if ($YearPrevious ne "null") {\
      return " / Vorjahr";;\
    }\
  }\
\
  if ($period eq "_Year") {\
    $YearPrevious = ::ReadingsTimestamp($YearBefore,$reading.$period,"null");;\
    $YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp($YearBefore,$reading.$period,"null")))) : "null";;\
  }\
\
   if ($period eq "actual" and $reading eq "Autarky") {\
     my $valA     = ::ReadingsVal($device, "SW_Total_AC_Active_P",0) - ::ReadingsVal($device, "SW_Home_own_consumption_from_grid",0);;\
     my $calcVal = ($valA > 0) ? ::round($valA /($valA + ::ReadingsVal($device, "SW_Home_own_consumption_from_grid",0))*100 ,0) : 0;;\
     return sprintf("%3d %%",(($calcVal > 100) ? 100 : $calcVal) );;\
   }\
\
   if ($period eq "actual" and $reading eq "OwnConsumptionRate") {\
     my $valS     = ::ReadingsVal($device,"SW_Total_AC_Active_P",0);;\
     my $calcVal = ($valS > 0) ? ::round((::ReadingsVal($device,"SW_Home_own_consumption_from_PV",0) +\
                                                           ::ReadingsVal($device,"SW_Home_own_consumption_from_Battery",0)) / $valS * 100 ,0) : 0;;\
     return sprintf("%3d %%",(($calcVal > 100) ? 100 : $calcVal) );;\
   }\
\
   if ($period eq "time_Day" and $reading eq "SW_Statistic_Autarky") {\
    return POSIX::strftime("%H:%M",localtime(::time_str2num(::ReadingsTimestamp($device, $reading."_Day",0))))\
   }\
\
   if ($period eq "time_Month" and $reading eq "SW_Statistic_Autarky") {\
    return POSIX::strftime("%H:%M",localtime(::time_str2num(::ReadingsTimestamp($device, $reading."_Month",0))));;\
   }\
\
   if ($period eq "time_Year" and $reading eq "SW_Statistic_Autarky") {\
     my $cy    = POSIX::strftime("%H:%M",localtime(::time_str2num(::ReadingsTimestamp($device, $reading."_Year",0))));;\
          $cy   .= ($YearPrevious ne "null") ? " / ".$YearPrevious : "";;\
     return $cy;;\
   }\
\
   if ($period eq "Autarky_Year" or $period eq "OwnConsumptionRate_Year") {\
      $value  = sprintf("%3d %%",::ReadingsVal($device,$reading."_Year",0));;\
      $value .= ($YearPrevious ne "null") ? sprintf(" / %3d %%", ::ReadingsVal($YearBefore,$reading."_Year",0) ) : "";;\
      return $value;;\
    } elsif ($reading eq "SW_Statistic_Autarky" or $reading eq "SW_Statistic_OwnConsumptionRate") {\
      return sprintf("%3d %%",::ReadingsVal($device,$reading.$period,0) );;\
    } elsif ($period eq "_Day") {\
      return sprintf("%04d",::ReadingsVal($device,$reading.$period,0)/1000 );;\
    } elsif ($period eq "_Month") {\
      $value  = sprintf("%04d",::ReadingsVal($device,$reading.$period,0)/1000);;\
      $value .= ($MonthPrevious ne "null") ? sprintf(" / %04d", ::ReadingsVal($MonthBefore,$device."_".$reading,0) ) : "";;\
      return $value;;\
    } elsif ($period eq "_Quarter") {\
      $period = "_Month";;\
      $value  = sprintf("%04d",::ReadingsVal($device,$reading.$period,0)/1000);;\
      $value .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ::ReadingsVal($QuarterBefore,$QuarterPrevious."_".$reading,0) ) : "";;\
      return $value;;\
    } elsif ($period eq "_Year") {\
      $value  = sprintf("%05d",::ReadingsVal($device,$reading.$period,0)/1000);;\
      $value .= ($YearPrevious ne "null") ? sprintf(" / %05d", ::ReadingsVal($YearBefore,$reading.$period,0) ) : "";;\
      return $value;;\
    }\
  return "null";;\
}\
\
}\
\
|"KI Prognose<dd>Kommando Auswahl</dd>"|\
widget([$SELF:ui_command_1],"uzsuDropDown,---,2_KI_Prognose,3_WR_ctl_Diagramm") |\
"MySQL ".[LogDBRep_PV_KI_Prognose:state]."<br> KI ".([LogDBRep_PV_KI_Prognose:state] ne "done") ? "waiting" : [LogDBRep_PV_KI_Prognose:PV_KI_Prognose]|\
""|\
""\
\
|"Statistiken"|\
Yield(0)|\
Yield('Tag')|\
Yield('4h')|\
Yield('Rest')\
\
|card([$SELF:Yield_fc0_current:bar1day],undef,undef,0,17,90,0,"fc0  kWh",undef,"2","130,,,,,,220").card([$SELF:Yield_fc1_current:bar1day],undef,undef,0,17,90,0,"fc1  kWh",undef,"2","130,,,,,,220")|\
"<span style=font-weight:bold>nächste 3h</span><br><br>".Yield(1)."<br>".Yield(2)."<br>".Yield(3)|\
"<span style=font-weight:bold>Vor- / Nachmittag</span><br><br>".Yield('Vormittag')."<br>".Yield('Nachmittag')|\
"<span style=font-weight:bold>Maximum</span><br><br><br>".Yield("max")."<br>".Yield("max_time")|\
"<span style=font-weight:bold>Mittagshoch</span><br><br><br>fc0 ".[$SELF:Yield_fc0_middayhigh_start]." - ".[$SELF:Yield_fc0_middayhigh_stop]."<br>fc1 ".[$SELF:Yield_fc1_middayhigh_start]." - ".[$SELF:Yield_fc1_middayhigh_stop]\
\
|"WR_1 / KSEM<dd> / PV Reserve / Netz Leistung</dd>"|\
""|\
sprintf("%d W",[WR_1:SW_Total_PV_P_reserve])|\
(::ReadingsVal("WR_1","Total_Active_P_EM",0) < -10) ? "<span style='color:green'>Einspeisen</span>" : (::ReadingsVal("WR_1","Total_Active_P_EM",0) > 15)?  "<span style='color:red'>Netzbezug</span>"  : "<span style='color:orange'>Standby</span>"|\
sprintf("%d W",[WR_1:Total_Active_P_EM])\
\
|"Ertrag aktuell<dd> / Tag / Monat / Jahr</dd>"|\
""|\
sprintf("%d kWh",::round([WR_1:SW_Yield_Daily]/1000 ,0))|\
sprintf("%d kWh",::round([WR_1:SW_Yield_Monthly]/1000 ,0))|\
sprintf("%d kWh",::round([WR_1:SW_Yield_Yearly]/1000 ,0))\
\
|"Speicher<dd>Temperatur / nutzbare Ladung / Status / Leistung / akt. SOC</dd>"|\
(::ReadingsVal("WR_1_API","DigitalOutputs_ConfigurationFlags",0) == 9) ? "<span style='color:green'>Lüfter An </span><br>" : "<br>".sprintf("%.1f °C",::ReadingsVal("WR_1","Battery_temperature",0))|\
sprintf("%d Wh",::ReadingsVal("WR_1","Actual_Battery_charge_usable_P",0))|\
Status_Speicher()|\
[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P]." W<br>".sprintf("%d %%",[WR_1:Act_state_of_charge])\
\
|"WR_1_API<dd>Kommando Auswahl</dd>"|\
widget([$SELF:ui_command_2],"uzsuDropDown,---,20_Statistic_EnergyFlow,4_WR_1_API_init_Werte") |\
""|\
""|\
""\
\
|"Statistiken ".::POSIX::strftime("%Y-%m-%d",localtime(::time_str2num(::ReadingsTimestamp("WR_1_API", "auth_me_authenticated",0))))." in kWh"|\
"<span style=font-weight:bold>aktuell</span>"|\
"<span style=font-weight:bold>heute</span>"|\
"<span style=font-weight:bold>Monat".WR_ctl_Format("_Qx","none","none")."</span>"|\
"<span style=font-weight:bold>Jahr".WR_ctl_Format("_Yx","none","SW_Statistic_Yield")."</span>"\
\
|"Erzeugung PV-Total"|\
sprintf("%04d W",[WR_1:SW_Total_AC_Active_P])|\
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_Yield")|\
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_Yield")|\
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_Yield")\
\
|"Bezug von PV"|\
sprintf("%04d W",[WR_1:SW_Home_own_consumption_from_Battery]+[WR_1:SW_Home_own_consumption_from_PV])|\
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_EnergyHomePv")|\
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_EnergyHomePv")|\
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_EnergyHomePv")\
\
|"Bezug von Batterie"|\
sprintf("%04d W",[WR_1:SW_Home_own_consumption_from_Battery])|\
WR_ctl_Format("_Day","WR_1_API","Statistic_EnergyHomeBat")|\
WR_ctl_Format("_Quarter","WR_1_API","Statistic_EnergyHomeBat")|\
WR_ctl_Format("_Year","WR_1_API","Statistic_EnergyHomeBat")\
\
|"Bezug vom Netz"|\
sprintf("%04d W",([WR_1:Total_Active_P_EM] >= 0 ? ::round(::ReadingsVal("WR_1","Total_Active_P_EM",0),0) : 0) )|\
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_EnergyHomeGrid")|\
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_EnergyHomeGrid")|\
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_EnergyHomeGrid")\
\
|"Bezug ins Haus (Energieverbrauch)"|\
sprintf("%04d W",[WR_1:SW_Home_own_consumption_from_PV]+[WR_1:SW_Home_own_consumption_from_Battery]+[WR_1:SW_Home_own_consumption_from_grid])|\
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_TotalConsumption")|\
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_TotalConsumption")|\
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_TotalConsumption")\
\
|"Einspeisung ins Netz"|\
sprintf("%04d W",([WR_1:Total_Active_P_EM] <= 0 ? abs(::round(::ReadingsVal("WR_1","Total_Active_P_EM",0),0)) :  0) )|\
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_EnergyHomeFeedInGrid")|\
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_EnergyHomeFeedInGrid")|\
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_EnergyHomeFeedInGrid")\
\
|"Autarkiequote"|\
WR_ctl_Format("actual","WR_1","Autarky")|\
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_Autarky")|\
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_Autarky")|\
WR_ctl_Format("Autarky_Year","WR_1_API","SW_Statistic_Autarky")\
\
|"Eigenverbrauchsquote"|\
WR_ctl_Format("actual","WR_1","OwnConsumptionRate")|\
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_OwnConsumptionRate")|\
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_OwnConsumptionRate")|\
WR_ctl_Format("OwnConsumptionRate_Year","WR_1_API","SW_Statistic_OwnConsumptionRate")\
\
|"Berechnet um"|\
""|\
WR_ctl_Format("time_Day","WR_1_API","SW_Statistic_Autarky")|\
WR_ctl_Format("time_Month","WR_1_API","SW_Statistic_Autarky")|\
WR_ctl_Format("time_Year","WR_1_API","SW_Statistic_Autarky")\

attr WR_ctl userReadings Yield_fc0_current:Yield_fc1_12.* { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;; ::ReadingsVal("$NAME","Yield_fc0_".sprintf("%02d",$hour),0)/1000 },\
Yield_fc1_current:Yield_fc1_12.* { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;; ::ReadingsVal("$NAME","Yield_fc1_".sprintf("%02d",$hour),0)/1000 }
attr WR_ctl verbose 3

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 April 2023, 08:47:17
Hallo zusammen,
ich habe gerade gesehen, dass die KI wohl euphorisch ist :-) und einen Wert ermittelt hat, der bei mir über der Leistungsfähigkeit des Schwarms liegt.
Da schaue ich mir das Skript nochmal an und limitiere das. Mein erster Gedanke wäre aus der DB ein Maximum der Realität abzufragen und das als Limit zu verwenden.

EDIT: Durch einen Ausfall am letzten Sonntag sind mir einige Logging Daten verloren gegangen,
      nachdem ich diese wieder rekonstruiert habe sieht die Prognose wieder gut aus.

Trotzdem habe ich noch die MySQL Procedure erweitert und das Yield Maximum pro Stunde der letzten 30 Tage ermittelt.
Das wird dann für die fc0 und fc1 Prognose in einer weiteren Spalte der dwdfull Tabelle abgelegt.
Nun füge ich noch die Limitierung in das KI Prognose Skript ein, damit uns nicht die KI über das Anlagenlimit hinaus geht.


VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 27 April 2023, 12:37:19
Moin mal wieder :-)
Gestern habe ich mal wieder an der openWB Integration gearbeitet und die leistungsreduzierte Ladung des BEV verfeinert. Das ganze dient der 70% Ausnutzung oder halt dem Peak Shaving, wie auch immer man das nennen möchte.

1.1 Es gibt bei der openWB ein 70% beachten, dass ich bereits verwende.
    - ich schiebe dem 70% beachten dynamisch einen eigenen Basiswert unter und passe diesen zusätzlich
      nach den Großverbrauchern an.
1.2 Das ganze fußt auf die Erkennung des Mittagshoch, was ja auch so ca. die 70% Grenze als Grundlage hat.
    - Die WB steht im Status Stop und der Pushbutton 70%_An ist aktiv
    - Das BEV ist angestöpselt
    - Wird nun das Mittagshoch erreicht, startet das Laden
    - Das laden geht nun langsamer und man kann es über mehrere Tage strecken
      Achtung, es entstehen etwas höhere Ladeverluste, dafür regelt der WR aber nicht mehr ab
    - Wenn das BEV nicht mehr lädt, weil der Wunsch SOC erreicht wird, sieht man das an der
      Meldung "70%_Base 9700 sofort", also "9700 Watt" stehen zur Verfügung und können "sofort" verwendet
      werden. Das Auto entscheidet, ob die verwendet werden.

    - Nach Ablauf des Mittagshoch geht es wieder in den Status Stop und am nächsten Tag wird wieder weiter geladen

2.1 Die openWB kann den Ladestrom im Status SofortLaden auch fest drosseln.
    - Den Ladestrom kann ich im FHEM Device vorgeben (siehe Bild SofortLaden limit 32 A)
    - Wählt man dort einen gewünschten Wert aus, so geht die openWB direkt ins SofortLaden
    - Wenn die PV Leistung sinkt und [WR_1:Total_Active_P_EM] > 500 Watt Bezug hat wird auf NurPV umgeschaltet
      Die 500 Watt wurden gewählt, da manchmal der Hausspeicher etwas träge reagiert, bzw es ja immer etwas um 0 Watt schwankt.

Bei mir geht das SofortLaden immer nur mit 3P, wodurch das Lademinimum dann so um die 3500 W liegt.
Im NurPV Modus gibt es eine 1P/3P Umschaltung, die ein besseres Entlangtasten an der PV-Leistung, auch bei niedrigerer Leistung gewährleistet.

1.JPG
In meinem Beispiel wurden 13000 Watt vom Dach geliefert und 500 Watt im Haus verbraucht.
Das 70%_An hat 9700 berechnet, wodurch dann immer noch 2800 Watt eingespeist würden. Somit kann man über mehrere Tage sein BEV laden und kommt nicht in die 70% Abregelung, die ja für Anlagen > 7000 Wp noch gültig ist.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Mai 2023, 10:51:02
Hallo zusammen,
ich würde dann jetzt die Testphase für die KI Prognose als beendet betrachten.
Um das nun produktiv zu verwenden müsstet Ihr das PV-Scheduling entsprechend anpassen, also die alte Prognose raus nehmen oder auskommentieren und die KI Prognose dauerhaft aktivieren.
Hier ein Beispiel im PV_Schedule
   (set LogDBRep_PV_KI_Prognose sqlCmd call dwd_load(curdate(),'none') )
##   ({Solar_forecast("LogDB","LogDBRep_PV_Forecast_SQL","WR_1","Solar_Calculation_fc","DWD_Forecast",0)})
Bei der KI Prognose ist dann auch noch das Ziel Device und die reading Basis zu verändern
executeAfterProc "/opt/fhem/python/bin/PV_KI_Prognose.py <DbLog IP-Adresse> <FHEM IP-Adresse> LogDBRep_PV_KI_Prognose WR_1 Solar_Calculation_fc"

Es könnte auch noch notwendig werden, dass die Schwellwerte, wie im Anghang markiert, angepasst werden müssen. Das hängt davon ab, ob die alte - und die neue Prognose maßgeblich voneinander abweichen. Beobachtet dazu einfach mal die PV Diagramme, ob z.B. das Mittagshoch noch passt und ob die Sommer/Winter Umschaltung zielgenau passiert.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Mai 2023, 16:29:22
Moin zusammen,
ich habe gerade diesen Post für das WR_ctl Device aktualisiert. (https://forum.fhem.de/index.php?msg=1273722)
Es führt die Statusanzeigen und das PV_Schedule später zusammen.

EDIT: Im Bild sieht man nun den kompletten Status und darunter die Devices WR_1 und WR_1_API ohne das stateFormat.
  In den alten Devices habe ich das stateFormat mit der Abfrage des verbose Attributs einfach unterdrückt.
  Mit Verbose >= 3 erscheint es dann wieder, was man natürlich auch noch ändern könnte.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 Mai 2023, 11:47:21
Hallo zusammen,
es wurden noch einige Fehler in der KI Prognose korrigiert und auch das WR_ctl im uiTable noch erweitert.

Updates sind dann hier:
- KI Prognose, das Skript im Anhang ist aktualisiert (https://forum.fhem.de/index.php?msg=1268601)
- Beim WR_ctl wird das Mittagshoch jetzt für fc0 und fc1 angezeigt (https://forum.fhem.de/index.php?msg=1273722)

Bisher habe ich noch keine Rückfragen bekommen, weshalb ich das WR_ctl Device noch nicht geposted habe. Entweder ich habe jetzt alle abgehängt, oder es besteht kein Bedarf, weil alles stabil läuft :-)

Heute habe ich nun den nächsten Schritt gemacht und verwende erstmalig die Ausgabe der KI Prognose im WR_1_Speicher_1_ExternControl Device. Hierfür muss man dann einige readings im WR_1_Speicher_1_ExternControl umbenennen, damit die KI Prognose, die ja in einem anderen Device liegt verwendet wird. Wenn Ihr noch nicht den Schritt zum WR_ctl Device gemacht habt, da ja keine Rückfrage für die Devinition kam, dann könnt Ihr diesen Schritt natürlich auch noch nicht machen.

Zuerst bitte das KI Prognose Skript ersetzen, da eine readings falsch oder gar nicht gesetzt wurden. Nach dem nächsten Lauf sollten alle readings im WR_ctl Device vorhanden sein. Das WR_ctl gibt es bei mir auf Anfrage, damit ich mich auf den Support vorbereiten kann.

WR_1_Speicher_1_ExternControl Änderungen
im Code
[WR_1:Solar_Calculation_fc0_day]  ==> [WR_ctl:Yield_fc0_day]
[WR_1:Solar_Calculation_fc1_day]  ==> [WR_ctl:Yield_fc1_day]
[WR_1:Solar_middayhigh_fc0_start] ==> [WR_ctl:Yield_fc0_middayhigh_start]
[WR_1:Solar_middayhigh_fc0_stop]  ==> [WR_ctl:Yield_fc0_middayhigh_stop]
[WR_1:Solar_middayhigh_fc0]       ==> [WR_ctl:Yield_fc0_middayhigh]
im uiTable
[WR_1:Solar_middayhigh_fc0_start] ==> [WR_ctl:Yield_fc0_middayhigh_start]
[WR_1:Solar_middayhigh_fc0_stop]  ==> [WR_ctl:Yield_fc0_middayhigh_stop]

VG Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Mai 2023, 19:12:00
Hallo zusammen,
für diejenigen, die Grafana nutzen habe ich mal eine Möglichkeit, wie man das 70% Limit anzeigen könnte.
Für Anlagen <= 7 kWp ist die Begrenzung ja nicht mehr relevant und man würde damit eine Linie im Diagramm bekommen, mit der man sieht wieviel mehr man jetzt einspeist.
1.JPG
Mit dem Grafana Select werden Werte oberhalb des alten Limits raus gesucht und durch einen Fixen Wert mit dem Limit überschrieben, es entsteht somit im Diagramm eine waagerechte Linie und alles oberhalb der Linie bis zum SW_Total_AC_Active_P ist das was man mehr einspeisen konnt. Der Hausverbrauch ist dabei bereits gedeckt.
SELECT
  $__timeGroupAlias(TIMESTAMP,$__interval,previous),
  <hier kommt das alte Limit, als positiver Wert, hin> AS "EVU Limit"
FROM history
WHERE
  $__timeFilter(TIMESTAMP) AND
  DEVICE = 'WR_1' AND
  READING = 'Total_Active_P_EM' AND
  VALUE < <hier kommt das alte Limit, als negativer Wert, hin>
GROUP BY 1
ORDER BY $__timeGroup(TIMESTAMP,$__interval,previous)
Für die Darstellung des Limits habe ich jetzt nur Punkte gewählt, da es bei Schwankungen ja auch nur temporäte Überschreitungen gibt, wo dann eine Linie ein falsches Bild liefert.
Auch sollte man dazu im Diagramm nur Total_Active_P_EM_to_Grid und nicht wie im oberen Diagramm SW_Total_AC_Active_P verwenden.
1.JPG
Alias or regex "EVU Limit"
Lines: false
Points: true
Points Radius: 1

Hier noch ein MySQL SELECT um die wh zu berechnen.
Der Wert 4900 ist durch das eigenen Limit zu ersetzen.
Grundlage ist ein minütliches Logging der wh und die Annahme, dass es in der Minute keine Schwankung
gegeben hat, es ist somit nur eine Näherung.
-- Berechnung der wh oberhalb der 70%
SELECT cast(sum(VALUE)/60 AS decimal (6,2) ) from
  (
   SELECT TIMESTAMP, VALUE + 4900 AS VALUE
   FROM history
     WHERE
      DEVICE = 'WR_1' AND
      READING = 'Total_Active_P_EM' AND
      VALUE < -4900 AND
      TIMESTAMP > curdate()
  ) x1
;

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Juni 2023, 15:22:34
Hallo zusammen,

ladet bitte nochmal die MySQL Procedure aus diesem Post neu, da gab es eine Änderung. (https://forum.fhem.de/index.php?msg=1268478)
Auch das Python Skript ist aktualisiert worden ;-). (https://forum.fhem.de/index.php?msg=1268601)
Beim Astro Device wird auch der Sonnenstand für fc[0|1] benötigt, das ist somit ebenfalls erweitert worden. (https://forum.fhem.de/index.php?msg=1268412)

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Juni 2023, 09:17:55
Hallo zusammen,
beim Astro Device ist ein kleines Problem aufgetreten, da das reading SunRise nicht garantiert einmal pro Tag aktualisiert wird. Deshalb wird nun ObsDate verwendet und Ihr müsstest dies im Astro Device korrigieren.

In diesem "KI Prognose Teil 1 - DWD und Astro Daten sammeln", ist die Änderung bereits eingetragen. (https://forum.fhem.de/index.php?msg=1268412)
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Juni 2023, 15:48:07
Hallöle,
ich habe hier nochmal die Darstellung vom EVU Limit geändert. (https://forum.fhem.de/index.php?msg=1276933)
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 Juni 2023, 12:17:11
Da nun einige das WR_ctl bereits im Einsatz haben, stelle ich die RAW Definition nun mal hier zur Verfügung (https://forum.fhem.de/index.php?msg=1273722).
Es wurde auch noch ein kleiner Fehler im uiTable korrigiert, der jetzt die Nachtstunden richtig mit 0|1|2 anzeigt, wenn der Tageswechsel ansteht.

Falls Ihr noch Ideen/Wünsche für die direkte Kommandoauswahl in den Pull Down Menüs habt, so lasst es mich wissen. Das Ziel wäre es, sowenig wie möglich in die einzelnen Devices direkt rein zu gehen und alle wiederkehrenden Dinge direkt im WR_ctl auswählen zu können.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 14 Juni 2023, 10:58:53
Hi Christian,
kurze Frage zu Yield. Du hattest ja bereits geschrieben, dass auch Yield gezählt wird, wenn die Batterie entladen wird. Nutzt du denn auch AC-seitiges Laden? Denn dann wird doppelt gezählt. Einmal im WR2 beim Etrag, und wenn die Energie dann im WR1 zum laden genutzt wird, wird sie später beim Entladen im WR1 erneut als Yield gezählt. Da habe ich bei mir immer die Differenz von Battery_Total_AC_ChargeEnergy_gridToBattery abgezogen.

Ich stelle meine Devices gerade laut Wiki um, hatte vorher eigene Namensgebungen, daher konnte ich das nicht alles so nachziehen. Dabei ist mir das jetzt aufgefallen. Ist das Wiki ansonsten aktuell? Bis auf die KI-Prognose? Die ich jetzt natürlich auch noch testen will. :-D

PS: Du machst einen sehr tollen Job hier für uns. Daumen hoch

Gruss
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Juni 2023, 11:21:51
Zitat von: killah78 am 14 Juni 2023, 10:58:53Hi Christian,
kurze Frage zu Yield. Du hattest ja bereits geschrieben, dass auch Yield gezählt wird, wenn die Batterie entladen wird. Nutzt du denn auch AC-seitiges Laden? Denn dann wird doppelt gezählt. Einmal im WR2 beim Etrag, und wenn die Energie dann im WR1 zum laden genutzt wird, wird sie später beim Entladen im WR1 erneut als Yield gezählt. Da habe ich bei mir immer die Differenz von Battery_Total_AC_ChargeEnergy_gridToBattery abgezogen.

Ich stelle meine Devices gerade laut Wiki um, hatte vorher eigene Namensgebungen, daher konnte ich das nicht alles so nachziehen. Dabei ist mir das jetzt aufgefallen. Ist das Wiki ansonsten aktuell? Bis auf die KI-Prognose? Die ich jetzt natürlich auch noch testen will. :-D
Im Wiki habe ich noch nicht die letzten Versionen aus dem Forums Thread drin, da ich zuerst noch eine Art Archiv für die alten Devices im Wiki anlegen muss.

Hmm, da hast Du recht.

Für die KI Prognose rechne ich jedoch die Ladung des Speichers komplett raus, wodurch der bereinigte Yield dann stimmen sollte.
        TIMESTAMP         yield_fc0  WR   Speicher  yield_bereinigt
    2023-06-14 10:00:00    10371    9434    383     9817
    2023-06-14 09:00:00    8460     7134    339     7473
    2023-06-14 08:00:00    6238     5246     -3     5243
    2023-06-13 18:00:00    3788     6356     -4     6352
    2023-06-13 17:00:00    6352     8603     -4     8599
    2023-06-13 16:00:00    9168     10794    -3    10791
    2023-06-13 15:00:00    10791    12557    -3    12554
    2023-06-13 14:00:00    12507    13307    253    13560
    2023-06-13 13:00:00    12913    13369    485    13854
    2023-06-13 12:00:00    12273    12799    548    13347
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 14 Juni 2023, 12:18:41
Habe das KI Thema jetzt erst bemerkt und will mich mal einlesen.
Im Yield ist das Laden der Batterie garnicht drin. Da brauchst du nichts rausrechnen.
Wenn ich aktuell gucke, morgens um 6:30 ist schon Leistung da und es wird die Batterie geladen. Bis ca 9. In der Zeit habe ich keinen Yield Anstieg in WR1. Somit wird das Laden nicht gezählt. Jedoch später am Abend das Entladen. So ist die Philosophie von Kostal, dass die (nutzbare)Energie, die aus dem Wechselrichter kommt den Ertrag darstellt.
Der WR2 ist eigentlich nur ein Dummer WR, der nix kennt. Für den ist um 6:30 Sonne da, und er speist in AC ein. Von Batterien oder anderen Wechselrichtern kennt der nix. Daher zählt er ab 6:30 Yield. Die aber tatsächlich in die Batterie wandern. Das heißt einmal wird Yield gezählt (WR2) und einmal nicht (WR1).
Scheint Kostal aber nicht mehr ändern zu wollen, sonst hätten sie es schon im Griff. Sie korrigieren die Werte nur im Solarportal.
Gruss
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Juni 2023, 12:30:05
Zitat von: killah78 am 14 Juni 2023, 12:18:41Habe das KI Thema jetzt erst bemerkt und will mich mal einlesen.
Im Yield ist das Laden der Batterie garnicht drin. Da brauchst du nichts rausrechnen.
Wenn ich aktuell gucke, morgens um 6:30 ist schon Leistung da und es wird die Batterie geladen. Bis ca 9. In der Zeit habe ich keinen Yield Anstieg in WR1. Somit wird das Laden nicht gezählt. Jedoch später am Abend das Entladen. So ist die Philosophie von Kostal, dass die (nutzbare)Energie, die aus dem Wechselrichter kommt den Ertrag darstellt.
Genau durch diese Verschiebung brauche ich die Bereinigung des Yield der gesamt PV-Anlage. Damit die KI weiß, das zum Zeitpunkt des Speicher Ladens der Yield in Wirklichkeit höher wäre. Ansonsten verläuft die Yield Kurve um das Speicherladen niedriger und wird beim Entladen nach oben verfälscht.
ZitatDer WR2 ist eigentlich nur ein Dummer WR, der nix kennt. Für den ist um 6:30 Sonne da, und er speist in AC ein. Von Batterien oder anderen Wechselrichtern kennt der nix. Daher zählt er ab 6:30 Yield. Die aber tatsächlich in die Batterie wandern. Das heißt einmal wird Yield gezählt (WR2) und einmal nicht (WR1).
Scheint Kostal aber nicht mehr ändern zu wollen, sonst hätten sie es schon im Griff. Sie korrigieren die Werte nur im Solarportal.
Gruss
Und diese Korrektur mache ich über die SW_* readings im WR_1_API Device. Der Kostal Yield wird dort einfach zusammen gerechnet, wobei beim WR_1 ja der Speicher nach Kostal Philosophie angewendet wird. Zeichne Dir mal die Kurve des Yield, aber als Ertrag/Stunde, dann solltest Du beim Speicher Laden einen Einbruch bei den Balken Diagramm sehen können. Und Du wirst einen Ertrag in der Nacht haben ;-)
Um es mir einfacher zu machen habe ich eh schon die KI Prognose auf 6-21 Uhr eingeschränkt, denn nachts kommt kein PV-Ertrag, außer bei Kostal :-) :-)

Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Juni 2023, 13:41:30
Ich habe mal bei mir die Speicher Korrektur des Ertrages erweitert.
Bei mir ist es meistens zwar jetzt im Sommer nicht viel, aber etwas kommt per AC Laden dann doch dazu, was ich nicht berücksichtigt habe.
Da das jetzt ja bereits beim yield vom WR_2 gezählt wurde müsste ich es in meiner Korrektur dann noch abziehen.
Das schau ich mir noch genauer an.
In der Tabelle würde das was als yield steht beim Laden des Speichers zum korrigierten yield dazu kommen und das was entaden wurde abgezogen werden.
Somit wird dann der yield wie bei einer PV-Anlage ohne Speicher angezeigt werden, also entgegen der Kostal Philosophie.
        TIMESTAMP          DCto   ACto  DCfrom yield
    2022-05-05 08:00:00    370     20    50    272
    2022-05-05 09:00:00    577     37    8     484
    2022-05-05 10:00:00    691     80    92    509
    2022-05-05 11:00:00    1909    758        1623
    2022-05-05 12:00:00    2942    116   3    2498
    2022-05-06 06:00:00    0       0     0       0
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Juni 2023, 15:27:54
Für alle die, die bereits auf dem Weg sind das WR_clt Device zu nutzen könnte man bereits schon mal die WR_*_config Devices aufräumen.
Die WR_*_config Devices werden später nicht mehr benötigt, da die KI Prognose diese Werte nicht mehr verwendet.
Darüber hinaus gibt es nur noch wenige Devices, die tatsächlich aus dem WR_*_config ihre IP-Adresse lesen. Dies wird leider in den verschiedenen Devices nicht durchgängig angeboten, weshalb ich auch das nicht mehr nutze.

Falls ihr mehrere WRs habt, bitte bei allen entsprechend ändern
attr WR_1_API replacement01Mode text
attr WR_1_API replacement01Regex %IP-WR%
attr WR_1_API replacement01Value <Ip-Adresse>


Für die, die einen BYD HV Speicher haben, was mir aber niemand zurück gemeldet hat...
attr WR_1_Speicher_1 replacement01Mode text
attr WR_1_Speicher_1 replacement01Regex %IP-WR_1_Speicher_1%
attr WR_1_Speicher_1 replacement01Value <Ip-Adresse>

Mehr Stellen habe ich nicht mehr gefunden, weshalb dann bei Verwendung die WR_*_config weg können.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 14 Juni 2023, 15:31:48
Auch in den WR_1 und WR_1_API Devices kann man generell das stateFormat etwas ändern, damit der Status im FHEMWEB nicht bei den ganzen Devices doppelt angezeigt wird.
Durch die Einklammerung mit der zusätzlichen verbose >=3 Angabe kann man somit das stateFormat ausblenden und nur bei der Fehlersuche aktivieren.
Im stateFormat

{
if (AttrVal("$name","verbose",0) >=3) {
   < hier steht der ganze Code >
}
}
Danach sollte es dann so aussehen
1.JPG
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Juni 2023, 08:47:28
Moin,
ich habe da mal wieder eine Tages Kurve.
- Es war mittags Bewölkung
- In Spitzen wäre das Einspeiselimit überschritten worden (rote Linie aus Punkten), hierbei ist die orangene Linie SW_Total_AC_Active_P nicht
  die Einspeisung. Total_Active_P_EM_to_Grid liegt um den Hausverbrauch und Speicherladung darunter, das kann ich separat einblenden.
- Die Speicher SOC Berechnung vom BYD ist zusammengebrochen (einige Tage durch MaxSOC Limitierung keine Vollzyklen)
- Bis ca. 7 Uhr wurde der Speicher mit dem ersten PV-Überschuss bis MinSOC geladen
- Ab 9 Uhr begann das Laden mit geringer Leistung bis zum SOC von 30%, was um 11 Uhr in das Mittagshoch gewechselt hat
- Gegen 14 Uhr hatte der Speicher dann 100%, da er ja vorher komplett gelehrt wurde
- Der Netz Bezug von 4:45 - 5:45 Uhr lag unter 0.5 kWh (13 ct Kosten), was ich mir für eine längere Haltbarkeit des Speichers gönne.
- Die gelbe Stufenlinie von 11-17 Uhr ist der Tibber Trigger für die günstigsten Kosten an dem Tag. Im Sommer brauche ich jedoch kein Tibber

Falls Ihr Anmerkungen habt, dann bitte her damit :-)
1.JPG
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 15 Juni 2023, 13:43:45
Hallo Christian,
ich habe jetzt die einzelnen KI Schritte mal durchgearbeitet. Leider führt er das Script nicht aus.
folgende Ausgabe:
PV_KI_Prognose  running - start
CSRF token requested for server that doesn't know CSRF
CSRF token requested for server that doesn't know CSRF
CSRF token not available!
CSRF token requested for server that doesn't know CSRF
Failed to get fhem state. Not connected.
Traceback (most recent call last):
  File "/opt/fhem/python/bin/PV_KI_Prognose.py", line 44, in <module>
    if (verbose >= 4):
TypeError: '>=' not supported between instances of 'dict' and 'int'
Wie kann ich das lösen?

Dann ist mir noch aufgefallen, dass in einem SVG das Reading "Solar_Calculation_fc1" verwendet wird. Das habe ich nicht. Was ist das und wo müsste es herkommen?

Edit: Ok, im Script habe ich CSRF ausgeschaltet. Jetzt läuft es weiter:
Query had no result.
Traceback (most recent call last):
  File "/opt/fhem/python/bin/PV_KI_Prognose.py", line 53, in <module>
    print("Inverter_Max_Power {}".format(Inverter_Max_Power["Value"]))
KeyError: 'Value'

Ein Device "WR_1_Speicher_1_ExternControl" gibt es bei mir nicht, da ich nur intern_control nutze.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Juni 2023, 14:00:55
Zitat von: killah78 am 15 Juni 2023, 13:43:45Dann ist mir noch aufgefallen, dass in einem SVG das Reading "Solar_Calculation_fc1" verwendet wird. Das habe ich nicht. Was ist das und wo müsste es herkommen?
Das war noch aus dem alten WR_1 Device.
Welches SVG?
ZitatEdit: Ok, im Script habe ich CSRF ausgeschaltet. Jetzt läuft es weiter:
Okay
[/quote]
Query had no result.
Traceback (most recent call last):
  File "/opt/fhem/python/bin/PV_KI_Prognose.py", line 53, in <module>
    print("Inverter_Max_Power {}".format(Inverter_Max_Power["Value"]))
KeyError: 'Value'
[/quote]
Im Python Skript wird das hier gelesen
Inverter_Max_Power = fh.get_device_reading("WR_1_Speicher_1_ExternControl", "SpeicherMidday_Inverter_Max_Power")Hast Du da einen Wert gesetzt?
1.JPG
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 15 Juni 2023, 14:23:38
a) SVG_LogDB_Photovoltaik_4
b) Nutze kein Extern Control. Ist das Voraussetzung?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Juni 2023, 14:49:29
Zitat von: killah78 am 15 Juni 2023, 14:23:38a) SVG_LogDB_Photovoltaik_4
Ich verende die SVGs schon lange nicht mehr.
Falls Du auch das WR_ctl verwenden möchtest, dann musst Du im SVG das WR_ctl und das entsprechende reading auswählen, das sollte dann z.B. "Yield_fc0" sein, wenn Du die Prognose so aufrufst.
"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"

Zitatb) Nutze kein Extern Control. Ist das Voraussetzung?
Nein, das kann man extra verwenden. Ich schau mir das Python Skript nochmal an und fang den Fehler ab.
Du könntest die Zeilen erstmal so ändern und bei "xxxx" einen Wert eintragen, ab dem Du Dein Mittagshoch beginnen möchtest.
# Inverter_Max_Power = fh.get_device_reading("WR_1_Speicher_1_ExternControl", "SpeicherMidday_Inverter_Max_Power")

# if (verbose >= 4):
#     print("Inverter_Max_Power {}".format(Inverter_Max_Power["Value"]))

Inverter_Max_Power = XXXX
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Juni 2023, 15:21:57
Hallo zusammen,
für alle, die die KI Prognose mit dem Mittagshoch nutzen und auch das WR_ctl verwenden, stellt sich die Frage, wo wir das SpeicherMidday_Inverter_Max_Power am besten ablegen. Es wird vom KI Python Skript gelesen und liegt momentan im WR_1_Speicher_1_ExternControl Device, um es einstellen zu können. Eigentlich wird es aber dort gar nicht verwendet und passt jetzt besser zum WR_ctl, da dort ja auch alle Informationen bereits liegen.
1.JPG
Ich bitte um Meinungsbekundung :-)
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 16 Juni 2023, 15:44:06
Hi Christian,
ich habe jetzt das WR_ctl eingebaut. Und auch das External control. KI Script läuft jetzt.
So viele Zahlen die jetzt auf mich einwirken. Muss erstmal durchblicken. Will aber erstmal den letzten Stand implementieren.

Paar Fragen:

1. Technisch: Im WR_ctl wird mit !([$SELF:state] eq "off")  abgefragt, ob das DOIF nicht off ist. Wann wird off gesetzt? Wenn ich das disable, bekomme ich im state nur "disabled" oder "deactivated". Wann wird off gesetzt?

2. Kann ich aus den alten Definitionen jetzt folgendes löschen:
PV_Schedule, LogDBRep_PV_Forecast_SQL, DWD_forecast? Auch was aus der 99_myUtils.pm? Da habe ich Solar_plain und Solar_forecast. Können die weg?

3. Kannst du auch die Solar_Radiation wieder in die KI Prognose einbauen? Diese müsste ja jetzt im WR_ctl-Radiation sein. Oder wo kam die her?

4. Was schreibst du bei WR_ctl in die Datenbank? Ich habe da nur Yield_fc0_day drin. Habe aber jetzt auch Yield_fc0_current und Yield_fc1_current hinzugefügt, damit ich es im SVG nutzen kann. Also analog Solar_Calculation. Oder sollten die ganzen Yield Werte bereits durch das Script in die db geschrieben worden sein? Im SVG kann ich nur Yield_fc0_day auswählen.

5. External Control: Das muss ja im WR erstmal eingeschaltet werden. Was sind für mich die Auswirkungen? Klar, ich kann Zeitsteuerung,Trigger etc setzen. Muss da irgendwas beachtet werden? Oder bietet der WR das dann einfach an, dass ich das beeinflussen kann und ansonsten das selbe wie intern control?

Viele Grüße
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 16 Juni 2023, 16:40:50
Zitat von: killah78 am 16 Juni 2023, 15:44:06Hi Christian,
ich habe jetzt das WR_ctl eingebaut. Und auch das External control. KI Script läuft jetzt.
So viele Zahlen die jetzt auf mich einwirken. Muss erstmal durchblicken. Will aber erstmal den letzten Stand implementieren.
Die Zahlen waren vorher auch schon da :-) , jetzt sind sie aber im Status sortiert, damit man den Zusammenhang erkennt.


ZitatPaar Fragen:

1. Technisch: Im WR_ctl wird mit !([$SELF:state] eq "off")  abgefragt, ob das DOIF nicht off ist. Wann wird off gesetzt? Wenn ich das disable, bekomme ich im state nur "disabled" oder "deactivated". Wann wird off gesetzt?
Das hatte ich aus einem Beispiel von Damian übernommen, es aber noch nie angewendet.
Eventuell kann man ja "set WR_ctl off" absetzen, wenn man die DOIF Blöcke mal nicht haben möchte.
Da müsste ich aber Debian mal anschreiben, so ist das mit den Vorlagen :-) :-)

Zitat2. Kann ich aus den alten Definitionen jetzt folgendes löschen:
PV_Schedule, LogDBRep_PV_Forecast_SQL, DWD_forecast? Auch was aus der 99_myUtils.pm? Da habe ich Solar_plain und Solar_forecast. Können die weg?
Also, DWD_forecast liefert Dir die Wetter Daten und wird weiter verwendet. Schau da bitte mal, ob Du alle Einstellungen drin hast (https://forum.fhem.de/index.php?msg=1268412).

Zitat3. Kannst du auch die Solar_Radiation wieder in die KI Prognose einbauen? Diese müsste ja jetzt im WR_ctl-Radiation sein. Oder wo kam die her?
Die rad1h Werte kommen vom DWD_forecast

Zitat4. Was schreibst du bei WR_ctl in die Datenbank? Ich habe da nur Yield_fc0_day drin. Habe aber jetzt auch Yield_fc0_current und Yield_fc1_current hinzugefügt, damit ich es im SVG nutzen kann. Also analog Solar_Calculation. Oder sollten die ganzen Yield Werte bereits durch das Script in die db geschrieben worden sein? Im SVG kann ich nur Yield_fc0_day auswählen.
Das WR_ctl nimmt die Forecast readings aus der KI Prognose auf. Um die KI Prognose dann auch stundenweise in der DbLog zu haben werden die Yield_fc[0|1] Werte direkt aus dem Python Skript mit dem richtigen TIMESTAMP in die DbLog geschrieben.
Alles was man sonst noch so haben möchte ginge dann über DbLogInclude, wobei Yield_fc*.* keinen Sinn macht, da diese ja alle zur gleichen Zeit erzeugt werden und sich somit schlecht im Diagramm darstellen lassen. Deshalb das direkt schreiben aus dem Python Skript.
    2023-06-16 06:00:00    WR_ctl    addlog        Yield_fc0    1386   
    2023-06-16 07:00:00    WR_ctl    addlog        Yield_fc0    3755   
    2023-06-16 08:00:00    WR_ctl    addlog        Yield_fc0    6012   
< snip >
    2023-06-16 18:00:00    WR_ctl    addlog        Yield_fc0    3788   
    2023-06-16 19:00:00    WR_ctl    addlog        Yield_fc0    1113   
    2023-06-16 20:00:00    WR_ctl    addlog        Yield_fc0    153   


    2023-06-16 06:00:00    WR_ctl    addlog        Yield_fc1    1365    <<< Diese fc1 Werte wurden bereits gestern geschrieben
    2023-06-16 07:00:00    WR_ctl    addlog        Yield_fc1    3726   
    2023-06-16 08:00:00    WR_ctl    addlog        Yield_fc1    6014   
< snip >
    2023-06-16 18:00:00    WR_ctl    addlog        Yield_fc1    3788   
    2023-06-16 19:00:00    WR_ctl    addlog        Yield_fc1    1113   
    2023-06-16 20:00:00    WR_ctl    addlog        Yield_fc1    153   


    2023-06-17 06:00:00    WR_ctl    addlog        Yield_fc1    1268    <<< Und diese fc1 Wurden heute, bereits für morgen geschrieben
    2023-06-17 07:00:00    WR_ctl    addlog        Yield_fc1    3624   
    2023-06-17 08:00:00    WR_ctl    addlog        Yield_fc1    5912   
< snip >
    2023-06-17 18:00:00    WR_ctl    addlog        Yield_fc1    3788   
    2023-06-17 19:00:00    WR_ctl    addlog        Yield_fc1    1113   
    2023-06-17 20:00:00    WR_ctl    addlog        Yield_fc1    153   


    2023-06-16 05:05:34    WR_ctl    DOIF        Yield_fc0_day    106078   
    2023-06-16 06:05:33    WR_ctl    DOIF        Yield_fc0_day    106078   
    2023-06-16 07:05:32    WR_ctl    DOIF        Yield_fc0_day    105076   
< snip >
    2023-06-16 14:05:45    WR_ctl    DOIF        Yield_fc0_day    105475   
    2023-06-16 15:05:36    WR_ctl    DOIF        Yield_fc0_day    105475   
    2023-06-16 16:05:29    WR_ctl    DOIF        Yield_fc0_day    105475   

Zitat5. External Control: Das muss ja im WR erstmal eingeschaltet werden. Was sind für mich die Auswirkungen? Klar, ich kann Zeitsteuerung,Trigger etc setzen. Muss da irgendwas beachtet werden? Oder bietet der WR das dann einfach an, dass ich das beeinflussen kann und ansonsten das selbe wie intern control?
Die extern Control arbeitet nach dem "dead man" Prinzip, wenn nichts von extern für die eingestellte Zeit mehr kommt, dann gilt die interne Steuerung.

Der Zeit Trigger dient eigentlich nur denen, die einen HT/NT Tarif haben, ansonsten nutz besser die Zeitsteuerung im Plenticore, die man übrigens auch mit dem WR_1_API bedienen kann. Das hat aber bisher noch keiner verwendet :-)

Der Vorteil der WR_1_Speicher_1_ExternControl wäre:
- Sommer/Winter Umschaltung des MinSOC
- MaxSOC Begrenzung, wenn im Sommer der Speicher morgens noch zuviel Ladung hat und somit nie zum MinSOC kommen würde.
- Laden im Mittaghoch, wegen der 70% Regelung, wenn man über 7 kWp hat
- Zwangsladen/entladen des Speichers mit einstellbarer Leistung (zu Wartungszwecken ;-) )

- Ich verwende auch den SG-Ready Ausgang für die Einschaltung eines Ventilators, der also über die API Ein/Aus geschaltet werden kann.
- Bei einer openWB kann ich auch die Unterstützung des Hausspeichers zulassen, oder diesen komplett sperren
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Juni 2023, 16:42:37
Hallo zusammen,
ich habe jetzt hier mal ein Diagramm, bei dem man den Verlauf des SOC in Verbindung mit der WR_1_Speicher_1_ExternControl MaxSoc Limitierung sehen kann.
Zu erkennen ist, das der SOC ca. 5 Tage verlässlich vom Speicher berechnet werden kann, bis es dann zu einem abbruch kommt und des Speicher schlagartig auf den MinSOC oder darunter abfällt. Im Diagramm beginnt es mit einem abfallen und es wurde aus dem Netz ca. 0,5 kWh bezogen, was ich icht so dramatisch sehe. Dann erfolgte ein Aufladen auf 100% in einem schönen Vollzyklus. In den folge Tagen wurde jeden Tag etwas weniger aufgeladen, da morgens immer noch recht viel SOC vorhanden war. Am 5. Tag war dann durch die Nachtentladung wieder die SOC Berechnung plötzlich am Ende, jedoch passte es dann ohne Netzbezug wieder wieder bündig an den nächsten Tag. Es erfolgte wieder eine 100% Ladung and here we go :-)
1.JPG
Das ganze Thema wird ja recht controvers diskutiert und soll ja bei den aktuellen Speichern so nicht mehr erforderlich sein, jedoch sehe ich es trotzdem als Speicher schonend an. Warum sollten ansonsten die E-Auto Hersteller auch eine 80% Ladegrenze angeben, wenn das alles nichts bringen sollte.

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 21 Juni 2023, 11:47:10
Hallo Christian,
ich spiele gerade mit der externen Batteriesteuerung herum.
Ich habe jetzt mal das Zwangsladen bzw Entladen des Speichers getestet. Mit dem Reading SpeicherDcPowerAbs. Bzw. sind da ja auch set Behle im WR_1 und auch im WR1_API.
Funktioniert auch wunderbar. Hätte aber gedacht, dass Battery_ExternControl_DcPowerAbs sich nur aus DC bedient. Allerdings zieht er auch aus dem Netz.

Nun gut. Ich habe dann Battery_ExternControl_DcPowerAbs wieder auf 0 gesetzt, in der Hoffnung, dass jetzt wieder automatisch geregelt wird. Bleibt aber jetzt auf 0. Keine Entladung, keine Ladung mehr.
Muss da noch irgendwas gesetzt werden? Ich hatte das so verstanden, dass wenn das Signal nicht alle 60 Sekunden wiederholt wird, dass dann die Automatik wieder greift. Ist aber scheinbar nicht so.

Hast du da einen Tip?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Juni 2023, 12:11:19
Zitat von: killah78 am 21 Juni 2023, 11:47:10Hallo Christian,
ich spiele gerade mit der externen Batteriesteuerung herum.
Ich habe jetzt mal das Zwangsladen bzw Entladen des Speichers getestet. Mit dem Reading SpeicherDcPowerAbs. Bzw. sind da ja auch set Behle im WR_1 und auch im WR1_API.
Funktioniert auch wunderbar. Hätte aber gedacht, dass Battery_ExternControl_DcPowerAbs sich nur aus DC bedient. Allerdings zieht er auch aus dem Netz.
Das mit der Ladestärke ist ja in dem Fall Deine Entscheidung! Somit müsste man dann auch selber darauf achten. Zu Wartungszwecken kann man damit den Speicher auf MonSOC entleeren, oder auch aus dem Netz auf MaxSOC zwangsladen.

ZitatNun gut. Ich habe dann Battery_ExternControl_DcPowerAbs wieder auf 0 gesetzt, in der Hoffnung, dass jetzt wieder automatisch geregelt wird. Bleibt aber jetzt auf 0. Keine Entladung, keine Ladung mehr.
Muss da noch irgendwas gesetzt werden? Ich hatte das so verstanden, dass wenn das Signal nicht alle 60 Sekunden wiederholt wird, dass dann die Automatik wieder greift. Ist aber scheinbar nicht so.

Hast du da einen Tip?
Der Timer ist "Timeout ext. Batteriesteuerung \[s\]", was nicht unbedingt 60s sein muss. Da verwende ich z.B. 300s. Wann dann der Speicher wirklich mit der internen Steuerung eine Reaktion hat ist nicht sofort erkennbar und hängt auch von Deiner Einstellung ab. Es kann z.B. die "inteligente Speicher Steuerung" aktiviert sein und die arbeitet dann nach dem Kostal Algorythmus, wie auch immer der aussieht.

Es gibt im WR_1_Speicher_1_ExternControl mehrere Anwendungsvarianten:
  • Eine Leistung einstellen und das DC_Power_Abs manuell innerhalb der "Timeout ext. Batteriesteuerung \[s\]" auslösen
  • Die erste Variante über FHEM mittel selber vorgeben, also den Wert ändern und DC_Power_Abs kontinuierlich auslösen
  • Man kann auch einen Wert einstellen und dann den Button "An/Aus" verwenden, wodurch der Wert zyklisch gesendet wird

Dazu bitte auch mal ins Log schauen, denn dort sollten die Limitierungen ab verbose 3 eingetragen werden.

Heute hatte ich auch Probleme mit dem Laden, da der Plenticore mal wieder in der Bug gelaufen ist, bei dem der Hausverbrauch im Schwarm total falsche Werte hat.
Dabei meint der Master WR, er müsse das Haus versorgen, was jedoch bereits der Slave WR erledigt hat und schon wird alles eingespeist und der Speicher nicht geladen.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Juni 2023, 12:31:09
Hier noch ein eventuelles Problem

Heute habe ich bemerkt, dass auch bei mir auf einmal im WR_1 die Battery_work_capacity auf NaN stand. Der wert wurde aber auch so immer wieder über ModBus geliefert und aktualisiert.
Da ich das letzte Plenticore Update bisher noch nicht gemacht hatte habe ich nun auch das KOSTAL_Software_Update_PLENTICORE_PIKO_IQ_G1_012609454.swu eingespielt. Warum auch immer wird nun auch Battery_work_capacity wieder geliefert und somit auch Actual_Battery_charge_usable_P berechnet, was ich in meinem Diagramm mit darstelle.

Resüme: Man muss immer ein Update in der Hinterhand haben, damit man der Plenticore mal so richtig durchschütteln kann :-) :-)
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 21 Juni 2023, 13:22:17
Hmmh, also ich komme mit dem Speicher nicht weiter. Für mich sieht es so aus, als ob der Wert 0, den ich in DC_Power_Abs geschrieben habe, dauerhaft bleibt, bis ich was anderes eingebe. Einen Timeout gibts nicht.
Von welchem An/Aus sprichst du? Das Repeat Command? Da wird aber DC_Power_Abs nicht gesetzt. Oder habe ich einen alten Stand von WR_1_Speicher_1_ExternControl? Ich habe bisher alles aus dem Wiki, bis auf den KI Teil aus den letzten Beiträgen.
Aber ich glaube das wird die Sache nicht ändern, da ich das DC_Power_Abs nicht erneut sende.
Im Log sehe ich dazu auch nichts. Ausser dass das KI Script nicht läuft.
Sowas bekomme ich da:
"DBD::mysql::st execute failed: Out of range value for column 'yield' at row 1 at ./FHEM/93_DbRep.pm line 11623."

Die neueste Firmware für den Plenticore sollte doch die 012709932 sein. Nutzt du die bewusst nicht?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Juni 2023, 13:50:38
Zitat von: killah78 am 21 Juni 2023, 13:22:17Hmmh, also ich komme mit dem Speicher nicht weiter. Für mich sieht es so aus, als ob der Wert 0, den ich in DC_Power_Abs geschrieben habe, dauerhaft bleibt, bis ich was anderes eingebe. Einen Timeout gibts nicht.
Von welchem An/Aus sprichst du? Das Repeat Command? Da wird aber DC_Power_Abs nicht gesetzt. Oder habe ich einen alten Stand von WR_1_Speicher_1_ExternControl? Ich habe bisher alles aus dem Wiki.
Sorry, ich habe gerade nochmal nachgeschaut und in diesem Post die Aussagen korrigiert (https://forum.fhem.de/index.php?msg=1279414).
Wenn hier im Bild der Button auf An steht, und mehr wie 0 Watt eingestellt sind, dann wird der Speicher permanent mit diesem Wert geladen/entladen.
Bei 0 Watt sollte er nach Ablauf der Zeit wieder auf die interne Steuerung gehen. Aber denk daran, es gibt einen Bug, der bei mir auch mal wieder zugeschlagen hat.
Ab log Level 3 sollten aber auch Meldungen zur Orientierung im Log erscheinen.
1.JPG

Zitat, bis auf den KI Teil aus den letzten Beiträgen.
Aber ich glaube das wird die Sache nicht ändern, da ich das DC_Power_Abs nicht erneut sende.
Im Log sehe ich dazu auch nichts. Ausser dass das KI Script nicht läuft.
Sowas bekomme ich da:
"DBD::mysql::st execute failed: Out of range value for column 'yield' at row 1 at ./FHEM/93_DbRep.pm line 11623."
Da würde ich zuerst mal in einer Datenbank Session testen, was da so los ist.
-- hiermit wird die Procedur ausgeführt. Der Timeout der Session sollte > 60 Sekunden sein, ansonsten kommt eine Meldung.
call dwd_load(curdate(),'none');

-- Nach der Procedur kann man sich die Tabelle dann anschauen, auch wenn oben ein Session Abbruch gemeldet wurde.
select * from dwdfull
 WHERE TIMESTAMP > curdate()
order by TIMESTAMP desc
LIMIT 1000;

ZitatDie neueste Firmware für den Plenticore sollte doch die 012709932 sein. Nutzt du die bewusst nicht?
Da ist für mich nichts neues drin, nur zusätzliche Speicher Typen, deshalb warte ich da noch.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 21 Juni 2023, 14:31:55
Danke dir.
Wo finde ich den den letzten Stand von der Extern Control?
Diesen Knopf habe ich bei mir nicht.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Juni 2023, 15:17:23
Zitat von: killah78 am 21 Juni 2023, 14:31:55Danke dir.
Wo finde ich den den letzten Stand von der Extern Control?
Diesen Knopf habe ich bei mir nicht.
Ich habe es mal wieder im Wiki aktualisiert :-)
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 21 Juni 2023, 16:58:51
Danke. Ich habe den Verdacht, dass mein Problem mit dem external Control mit der aktuellsten Firmware zu tun hat.
Ich finde den älteren stand nicht mehr. Könntest du die Datei irgendwo auf einen Cloud-Speicher laden? Dann könnte ich Mal einen downgrade probieren. Sonst müsste ich Mal an Kostal schreiben.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 21 Juni 2023, 17:56:57
Zitat von: killah78 am 21 Juni 2023, 16:58:51Danke. Ich habe den Verdacht, dass mein Problem mit dem external Control mit der aktuellsten Firmware zu tun hat.
Ich finde den älteren stand nicht mehr. Könntest du die Datei irgendwo auf einen Cloud-Speicher laden? Dann könnte ich Mal einen downgrade probieren. Sonst müsste ich Mal an Kostal schreiben.
Ist per PN raus gegangen.
Du könntest aber auch nochmal über verbose 5 im Log mehr Meldungen erzeugen, da es ja ein HTTPMOD Device ist. Eventuell sieht man da noch etwas mehr.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 22 Juni 2023, 09:38:30
Guten Morgen,
hat natürlich nicht geklappt. Downgrade nicht möglich. Auch nach Neustart keine Änderung.
Was mir aber noch aufgefallen ist:
Bei dir wird im UI oben rechts "Normal" angezeigt. Bei mir steht da "256". Das steht für externe Kontrolle. Frage mich, was das bedeutet. Der Wert kommt ja vom WR_1_API:Battery_EM_State.
Steht da bei dir wirklich eine Null? Trotz aktivierter externen Batteriekontrolle im Wechselrichter? Hast du da jemals eine 256 drin gehabt? ZB. wenn Ladestrom begrenz wird?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 Juni 2023, 09:55:02
Zitat von: killah78 am 22 Juni 2023, 09:38:30Guten Morgen,
hat natürlich nicht geklappt. Downgrade nicht möglich. Auch nach Neustart keine Änderung.
Was mir aber noch aufgefallen ist:
Bei dir wird im UI oben rechts "Normal" angezeigt. Bei mir steht da "256". Das steht für externe Kontrolle. Frage mich, was das bedeutet. Der Wert kommt ja vom WR_1_API:Battery_EM_State.
Steht da bei dir wirklich eine Null? Trotz aktivierter externen Batteriekontrolle im Wechselrichter? Hast du da jemals eine 256 drin gehabt? ZB. wenn Ladestrom begrenz wird?
256 kommt wenn die externe Speicherkontrolle aktiv ist und sollte im aktuellen UI/stateFormat auch als Text angezeigt werden.
Ich denke Dein WR_1 ist noch nicht aktuell:-)

Hier habe ich das Mapping eingebaut
attr WR_1 obj-h104-format %s
attr WR_1 obj-h104-map 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz,256:externe Batteriesteuerung
attr WR_1 obj-h104-reading State_of_EM
attr WR_1 obj-h104-revRegs 0
attr WR_1 obj-h104-unpack N
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 22 Juni 2023, 10:59:53
Die 256 kommt aus WR_1_API. Der Wert ist in beiden devices drin. In WR_1 wird auch der Text angezeigt. In WR_1_API aber nur 256.
Aber: Bin jetzt einen Schritt weiter. Hatte gerade den Solateur hier und habe die Batterieeinstellung auf intern gestellt. Und anschließend wieder auf extern. Jetzt steht State_of_EM wieder auf 0 (Normal). Übringes steht jetzt auch der Text "Normal" im API device.
Ich vermute, dass ich jetzt einfach keine manuelle Ladung oder Entladung machen darf. Wenn ich den maximalen Lade oder Entladestrom ändere, bleibt der Status auf "Normal". Wenn ich jetzt aber wieder manuell eingreife, wird der wieder auf "extern" springen und nicht wieder auf "normal" zurück gehen. Ich habe das so gelesen, dass nach der eingestellten Timeout-Zeit von 60 Sekunden wieder zurückgesetzt wird. Aber scheinbar funktioniert das so nicht bei mir. Werde ich mal Kostal befragen müssen.

Da du den DCPowerAbs ja eingebaut hast, vermute ich passt das bei dir mit dem zurück auf "Normal", richtig? Dann solltest du nicht auf die aktuelle Firmware updaten, wenn es denn damit zusammen hängt.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 Juni 2023, 11:16:26
Zitat von: killah78 am 22 Juni 2023, 10:59:53Die 256 kommt aus WR_1_API. Der Wert ist in beiden devices drin. In WR_1 wird auch der Text angezeigt. In WR_1_API aber nur 256.
Stimmt, das Mapping muss in beide rein
attr WR_1_API reading25Name Battery_EM_State
attr WR_1_API reading25OMap 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz,256:externe Batteriesteuerung
attr WR_1_API reading25Regex EM_State.*value":(\d+)

ZitatAber: Bin jetzt einen Schritt weiter. Hatte gerade den Solateur hier und habe die Batterieeinstellung auf intern gestellt. Und anschließend wieder auf extern.
So mache ich das auch, oder Du konfigurierst zuerst den Speiche weg und dann wieder dazu, was aber nur als Betreiber geht, wenn man kein AC Laden verwendet.
Das AC Laden geht auch nur als Installateur.

ZitatJetzt steht State_of_EM wieder auf 0 (Normal). Übringes steht jetzt auch der Text "Normal" im API device.
Ich vermute, dass ich jetzt einfach keine manuelle Ladung oder Entladung machen darf. Wenn ich den maximalen Lade oder Entladestrom ändere, bleibt der Status auf "Normal". Wenn ich jetzt aber wieder manuell eingreife, wird der wieder auf "extern" springen und nicht wieder auf "normal" zurück gehen. Ich habe das so gelesen, dass nach der eingestellten Timeout-Zeit von 60 Sekunden wieder zurückgesetzt wird. Aber scheinbar funktioniert das so nicht bei mir. Werde ich mal Kostal befragen müssen.
Da du den DCPowerAbs ja eingebaut hast, vermute ich passt das bei dir mit dem zurück auf "Normal", richtig? Dann solltest du nicht auf die aktuelle Firmware updaten, wenn es denn damit zusammen hängt.
Normalerweise funktioniert das bei mir, jedoch schlägt ab und zu mal der Bug zu :-(
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 22 Juni 2023, 16:38:07
Kurz zur Info mit meiner KI Prognose:
Ich hatte im dblog irgendwo einen Nullwert zwischendurch im Reading SW_Yield_Daily. Die fangen ja mit 0 an und steigen dann zum Tagesende. Und irgendwo war ein Nullwert drin. Den habe ich einfach gelöscht, dann lief die Prozedur wieder.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 Juni 2023, 17:29:06
Zitat von: killah78 am 22 Juni 2023, 16:38:07Kurz zur Info mit meiner KI Prognose:
Ich hatte im dblog irgendwo einen Nullwert zwischendurch im Reading SW_Yield_Daily. Die fangen ja mit 0 an und steigen dann zum Tagesende. Und irgendwo war ein Nullwert drin. Den habe ich einfach gelöscht, dann lief die Prozedur wieder.
Okay,
interessant wäre, wo der her gekommen ist, wenn es aber jetzt gut ist reicht das ja auch :-)
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 03 Juli 2023, 11:07:00
Hallo,
ich habe ein kleines Problem:
Ich habe gestern einen Speicher an meinem Kostal nachgerüstet.
Die Variable "Actual_Battery_charge_usable_P" ist 0. Daher hab ich weiter geschaut:


Ich habe gesehen, dass das Reading Battery_work_capacity leer ist. Wie bekomme ich diese gefüllt?

LG
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 03 Juli 2023, 12:02:29
Zitat von: kaiman am 03 Juli 2023, 11:07:00Hallo,
ich habe ein kleines Problem:
Ich habe gestern einen Speicher an meinem Kostal nachgerüstet.
Die Variable "Actual_Battery_charge_usable_P" ist 0. Daher hab ich weiter geschaut:

Ich habe gesehen, dass das Reading Battery_work_capacity leer ist. Wie bekomme ich diese gefüllt?
Das kommt vom Plenticore.
Ich hatte dazu vor 2 Wochen auch mal was geschrieben (https://forum.fhem.de/index.php?msg=1279416), da es bei mir auch aufeinmal weg gewesen ist.
- Man kann wohl auch die gleiche FW zum aktualisieren verwenden.
- Oder auch mal einen Soft Reset über WR_1_API ausprobieren.
- Eventuell im Plenticore mal den Speicher weg konfigurieren und dann wieder neu eintragen.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 03 Juli 2023, 12:59:18
Zitat von: ch.eick am 03 Juli 2023, 12:02:29Das kommt vom Plenticore.
Ich hatte dazu vor 2 Wochen auch mal was geschrieben (https://forum.fhem.de/index.php?msg=1279416), da es bei mir auch aufeinmal weg gewesen ist.
- Man kann wohl auch die gleiche FW zum aktualisieren verwenden.
- Oder auch mal einen Soft Reset über WR_1_API ausprobieren.
- Eventuell im Plenticore mal den Speicher weg konfigurieren und dann wieder neu eintragen.

Danke für den Input.
Es hat gereicht den Wert ,,Batterieentladung ab Netzbezug von " einfach nochmal auf 50 zu ändern und speichern. Jetzt werden die Werte gefüllt.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Juli 2023, 15:57:28
Hallo zusammen.

Das PV_KI_Prognose.py Skript wurde aktualisiert. (https://forum.fhem.de/index.php?msg=1268601)
Im Skript waren leider Fehler bei der Berechnung der Tages Werte für fc1, die jetzt behoben wurden.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MaHue am 26 Juli 2023, 09:59:01
Hallo zusammen,
ich habe leider das Problem, dass seit einer Woche die Daten für WR_1_API nicht mehr aktualisiert werden.
Anscheinend sperrt sich der Kostal Plenticore immer, wenn die entsprechende Anfrage (get WR_1_API 20_Statistic_EnergyFlow) abgesetzt wird.
Wenn ich dann die Website vom Wechselrichter aufrufe, sagt sie "Entweder wurde noch kein Passwort festgelegt oder das Konto wurde aus Sicherheitsgründen gesperrt. Bitte geben Sie den Master Key (siehe Typenschild) sowie ein neues Passwort ein."
Setze ich das Passwort neu und lege es mittels {KeyValue("store","PW_WR_1_API_user","PASSWORT")} in fhem ab, ist es nach dem nächsten Abruf der Statistik wieder gesperrt.

Die manuelle Ausführung der Anmeldung laut Wiki
Zitat1. get WR_1_API 01_auth_start
   2. get WR_1_API 02_auth_finish
   3. get WR_1_API 03_auth_create_session
   4. Die Rückmeldung vom Plenticore wird gelesen und es sollte eine SessionId bestehen, mit der nun alle weiteren Abfragen laufen
liefert mir in Schritt 2 noch Token und Signature, führt aber in Schritt 3 zu {"message":"invalid transaction"}
Hat jemand eine Idee, woran das liegen bzw. wie ich das beheben kann?

TypenbezeichnungPLENTICORE plus 10
UI-Version01.28.10771
MC-Version01.78
IOC-Version01.78
HW-Version0202
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 26 Juli 2023, 10:52:42
Zitat von: MaHue am 26 Juli 2023, 09:59:01Hallo zusammen,
ich habe leider das Problem, dass seit einer Woche die Daten für WR_1_API nicht mehr aktualisiert werden.

< snip >

Hat jemand eine Idee, woran das liegen bzw. wie ich das beheben kann?

TypenbezeichnungPLENTICORE plus 10
UI-Version01.28.10771
MC-Version01.78
IOC-Version01.78
HW-Version0202

Im WR_1_API sind noch readings mit auth im Namen, die könntest Du noch vorher nochmal löschen.
Das Passwort sollte möglichst keine spezielle Sonderzeichen haben. Teste die Abfrage nochmal wie im Wiki beschrieben.

VG Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: MaHue am 26 Juli 2023, 14:39:04
Zitat von: ch.eick am 26 Juli 2023, 10:52:42Im WR_1_API sind noch readings mit auth im Namen, die könntest Du noch vorher nochmal löschen.
Das Passwort sollte möglichst keine spezielle Sonderzeichen haben. Teste die Abfrage nochmal wie im Wiki beschrieben.

VG Christian

Danke, ich habe alle auth_-Readings gelöscht und die Authentizierung dann noch mal versucht - jetzt läuft's wieder. :D
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 August 2023, 16:34:25
Hallo zusammen,
Dieser Thread ist nicht tot :-) Es läuft halt nur alles wie es soll.

VG Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: hausbesetzer am 29 September 2023, 12:53:55
Hallo zusammen,

super tolle Lösung! Ich habe die Devices WR_1 und WR_1_API erfolgreich am laufen. Da seit heute meine Anlage läuft, sehe ich nun auch endlich Daten ;-).

Ich stehe nur leider vor einem kleinen Rätsel, zu dem mir keine Lösung einfällt: Das Reading P_DC3 bekomme ich nicht in mein DBLog übertragen...

Das Reading an sich hat im FHEM valide Daten, d.h. das Auslesen mit Modbus vom Wechselrichter funktioniert. Im Attribut DbLogInclude habe ich das Reading ergänzt:

Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Battery_MaxChargePowerLimitAbs,Battery_.*SOC,P_DC1,P_DC2,P_DC3,Total_.*,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*,P_limit_from_EVU.*
Im DbLog-Device steht das Attribut DbLogSelectionMode auf Exclude/Include.

Die Readings P_DC1 und P_DC2 werden sehr wohl ins DBLog übertragen. Eigentlich sehe ich keinen Grund, warum das nicht auch für P_DC3 passiert.

Oder habe ich etwas übersehen?

Viele Grüße,
 Peter
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 29 September 2023, 14:01:16
Zitat von: hausbesetzer am 29 September 2023, 12:53:55Ich stehe nur leider vor einem kleinen Rätsel, zu dem mir keine Lösung einfällt: Das Reading P_DC3 bekomme ich nicht in mein DBLog übertragen...
Das Reading an sich hat im FHEM valide Daten, d.h. das Auslesen mit Modbus vom Wechselrichter funktioniert. Im Attribut DbLogInclude habe ich das Reading ergänzt:
Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Battery_MaxChargePowerLimitAbs,Battery_.*SOC,P_DC1,P_DC2,P_DC3,Total_.*,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*,P_limit_from_EVU.*
Hallo Peter,
da wird dann wohl der Event fehlen. Ich habe am String 3 bei mir den Speicher dran und deshalb ist P_DC3 immer 0 :-)

Hier wäre das geänderte Attribut
attr WR_1 event_on_change-reading Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_I,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Battery_MaxChargePowerLimitAbs,Battery_.*SOC,Home_own_consumption.*,P_DC1,P_DC2,P_DC3,Solar_.*,Total_.*,SW_.*,.*_yield,Inverter_state.*,Inverter_Generation_P_Actual.*,Solar_Calculation_fc.*_day

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: hausbesetzer am 29 September 2023, 14:07:46
Logo! Das war's!

Vielen Dank für die schnelle und kompetente Unterstützung Christian!

Viele Grüße,
 Peter
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 01 Oktober 2023, 08:59:02
Hallo Christian,

Ich habe ein Problem bei der Quartalsberechnung. Alle Werte werden berechnet außer die des Speichers.
Ich habe mal aus deinem Post zitiert.

Zitat von: ch.eick am 14 Januar 2022, 10:38:50...

Nach dem Ausführen sollte es dann so aussehen, Q4 hat den "previos" Eintrag, da wir ja noch nicht April haben.
...
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
...

VG
    Christian

Der Eintrag Q3_Statistic_EnergyHomeBat fejkt bei mir. Habe den Speicher erst seit Juli. Die Anlage schon länger. Liegt das daran?
In der Spalte für das Jahr wird der Wert für das Jahr korrekt angezeigt.

Lg
Achim
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Oktober 2023, 09:43:24
Zitat von: kaiman am 01 Oktober 2023, 08:59:02Ich habe ein Problem bei der Quartalsberechnung. Alle Werte werden berechnet außer die des Speichers.
< snip >
Der Eintrag Q3_Statistic_EnergyHomeBat fehlt bei mir. Habe den Speicher erst seit Juli. Die Anlage schon länger. Liegt das daran?
In der Spalte für das Jahr wird der Wert für das Jahr korrekt angezeigt.
Hallo Achim,
es könnte sein, dass für den Speicher der erste Werte im Juli in der datenbank fehlt.

Im SQL wird nach TIMESTAMP gefiltert "%Y-%m-01", somit muss am 01. des Monats auch ein Wert für Statistic_EnergyHomeBat_* vorhanden sein. Falls der fehlt könntest Du den aller ersten Wert zum Zeitpunkt Deiner Speicher Installation auf den TIMESTAMP der anderen Werte am 01. des Monats kopieren, oder den TIMESTAMP überschreiben.

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: kaiman am 01 Oktober 2023, 13:49:12
Danke für die Aufklärung, ja der Speicher war nicht am 1. des Monats vorhanden.

Ich schaue mir das die nächste Woche einmal an.

Lg
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 18 Oktober 2023, 20:20:03
Ich habe mal noch eine Frage zu den LogDBRep_Statistic...

Die schreiben bei mir in eine MariaDB SQL-Datenbank in das Device "PV_1_API". Aber alle geschriebenen Werte sind =0. Das sieht dann bei einer Abfrage in der DB direkt so aus:
| 2023-08-01 23:59:58 | PV_1_API | calculated | calculated | max_month_Statistic_EnergyHomePvSum_Month | 0.0000 | NULL |
| 2023-09-01 23:59:58 | PV_1_API | calculated | calculated | max_month_Statistic_EnergyHomePvSum_Month | 0.0000 | NULL |
| 2022-01-01 23:59:58 | PV_1_API | calculated | calculated | max_month_Statistic_Yield_Month          | 0.0000 |      |

Gibt es da noch einen Fehler das die Werte nicht korrekt berechnet werden? Mir ist unklar wie das ganze funktionieren soll und wo und wie die zu schreibenden Werte berechnet werden sollten. Offensichtlich funktioniert die Berechnung ja auch nicht.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 Oktober 2023, 15:43:31
Zitat von: trupf am 18 Oktober 2023, 20:20:03Ich habe mal noch eine Frage zu den LogDBRep_Statistic...

Die schreiben bei mir in eine MariaDB SQL-Datenbank in das Device "PV_1_API". Aber alle geschriebenen Werte sind =0. Das sieht dann bei einer Abfrage in der DB direkt so aus:
| 2023-08-01 23:59:58 | PV_1_API | calculated | calculated | max_month_Statistic_EnergyHomePvSum_Month | 0.0000 | NULL |
| 2023-09-01 23:59:58 | PV_1_API | calculated | calculated | max_month_Statistic_EnergyHomePvSum_Month | 0.0000 | NULL |
| 2022-01-01 23:59:58 | PV_1_API | calculated | calculated | max_month_Statistic_Yield_Month          | 0.0000 |      |

Gibt es da noch einen Fehler das die Werte nicht korrekt berechnet werden? Mir ist unklar wie das ganze funktionieren soll und wo und wie die zu schreibenden Werte berechnet werden sollten. Offensichtlich funktioniert die Berechnung ja auch nicht.
Hallo trupf

Ich denke Du wirst noch alte DbRep Definitionen verwenden, die nur noch als Beispiele dienen sollten. Die wenigsten werden das wirklich verwenden, was ich an den wenigen Rückfragen ausmache :-)

An Deinem DB Auszug sehe ich, dass sich der Job wohl auf die Statistic_* und nicht auf die SW_Statistic_* bezieht, was aber bei nur einem WR egal wäre. Du solltest also Statistic_EnergyHomePvSum_Month und Statistic_Yield_Month als Einträge in Deiner Datenbank haben. Wenn das nicht so ist, werden die bei Dir nicht gelogged.

Dann sollte die DbRep Definitionen so aussehen
defmod LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month DbRep LogDB
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month DbLogExclude .*
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month aggregation month
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month allowDeletion 1
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month comment Version 2020.10.23 15:00\
Dieser Wert ist die gesamte Dc Lieferung der PV Anlage inklusive Batterie im Monat.\
Gestartet über PV_Schedule am ersten des Monats.
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month device WR_1_API
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month reading SW_Statistic_EnergyHomePvSum_Month
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month room System
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month timestamp_begin current_year_begin
attr LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month timestamp_end previous_month_end

Und im DB_Service_Schedule Device (früher PV_Schedule) folgender maßen aufgerufen werden.
set LogDBRep_Statistic_EnergyHomePvSum_Year_max_Month maxValue writeToDB

Nach dem Aufruf müsste folgendes im DbRep Device stehen
READINGS:
     2023-10-01 01:13:01   2023-01-31_23-57-03__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-01 269854.0000
     2023-10-01 01:13:01   2023-02-28_23-57-03__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-02 625267.0000
     2023-10-01 01:13:01   2023-03-31_23-57-03__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-03 805980.0000
     2023-10-01 01:13:01   2023-04-30_23-57-03__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-04 748631.0000
     2023-10-01 01:13:01   2023-05-31_23-57-02__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-05 759929.0000
     2023-10-01 01:13:01   2023-06-30_23-57-02__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-06 760850.0000
     2023-10-01 01:13:01   2023-07-31_23-57-02__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-07 837835.0000
     2023-10-01 01:13:01   2023-08-31_23-57-02__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-08 649154.0000
     2023-10-01 01:13:01   2023-09-30_23-57-02__WR_1_API__SW_Statistic_EnergyHomePvSum_Month__MAX__2023-09 734464.0000

Hier gibt es dann einen Unterschied zu den reading Namen innerhalb der Datenbank.
Den Eintrag am 01.01. mit VALUE 0 habe ich, wenn ich mich recht erinnere von Hand eingetragen, damit der Graph besser aussieht.
select * from history
where DEVICE="WR_1_API"
  and TIMESTAMP > "2023-01-01"
  and READING = "max_month_SW_Statistic_EnergyHomePvSum_Month"
;

'2023-01-01 23:59:58', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '0.0000', NULL
'2023-01-31 23:57:03', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '269854.0000', NULL
'2023-02-28 23:57:03', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '625267.0000', NULL
'2023-03-31 23:57:03', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '805980.0000', NULL
'2023-04-30 23:57:03', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '748631.0000', NULL
'2023-05-31 23:57:02', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '759929.0000', NULL
'2023-06-30 23:57:02', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '760850.0000', NULL
'2023-07-31 23:57:02', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '837835.0000', NULL
'2023-08-31 23:57:02', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '649154.0000', NULL
'2023-09-30 23:57:02', 'WR_1_API', 'HTTPMOD', '', 'max_month_SW_Statistic_EnergyHomePvSum_Month', '734464.0000', NULL

Sollte es bei Dir wegen der MariaDB Probleme geben, dann gibt es im Forum noch einen Thread mit Support zu DbRep (https://forum.fhem.de/index.php?topic=53584.0). Das ist ein Grund, warum ich darmals auf die standard Module gesetzt habe, damit man den Support auf mehrere Schultern verteilen kann. Im DbRep setzt Heiko das SQL auf die Möglichkeiten der jeweiligen Datenbank um.

Beim DbRep bin ich bei FVERSION 93_DbRep.pm:v8.52.11-s27975/2023-09-17

VG  Christian

Hier mal ein Beispiel aus Grafana für 2022
Screenshot 2023-10-19 154856.png
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 November 2023, 10:30:24
Moin zusammen,
da ja die Implementierung stabiel läuft schreib ich mal was anderes, was ich nützlich finde.
Zum Überprüfen der FHEM Log Dateien verwende ich eine Terminal Session ins UNIX und lasse dann einfach ein tail Kommando laufen.
Damit ich da nicht jeden Tag das Datum der Log Datei ändern muss sezte ich es direkt mit dem date Befehl.
tail -n 1000 -f log/fhem-`date --iso-8601`.log
und schön läuft der Inhalt auf der Konsole.
Möchte man dann nur etwas bestimmtes sehen, kann man mit grep noch filtern.
fhem@raspberrypi:~$ tail -n 10000 -f log/fhem-2023-11-23.log| egrep 'WR_|Pool|LWP'
2023.11.23 00:01:00.069 3: WR_ctl 4_WR_1_API_init_Werte : init Werte gesetzt
2023.11.23 00:57:00.015 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 01:57:00.015 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 02:24:05.096 3: WR_1_Speicher_1_ExternControl cmd_2.1: smart_laden aktiviert
2023.11.23 02:24:05.096 3: WR_1_Speicher_1_ExternControl cmd_2.1: SpeicherExternTrigger, Entlademodus gesperrt
2023.11.23 02:57:00.017 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 03:57:00.016 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 04:57:00.015 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 05:03:00.078 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 05:07:14.667 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 05:57:00.031 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 06:00:00.049 3: WR_1_Speicher_1_ExternControl cmd_14 : ExternControl Lüfter ausgeschaltet
2023.11.23 06:03:00.080 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 06:07:00.357 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 06:15:00.004 3: Pool_PV 09__ : Pool switched to RunTimePerDay 28800
2023.11.23 06:57:00.015 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 07:03:00.078 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 07:06:48.586 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 07:17:00.004 3: Pool_PV 08__ : Pool switched to TimeStart 09:10 TimeEnd 16:00
2023.11.23 07:57:00.015 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 08:03:00.116 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 08:06:58.477 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 08:57:00.016 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 09:03:00.073 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 09:04:02.811 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMaxSOC_MinSOC_Time gefunden 10 %
2023.11.23 09:04:02.812 3: WR_1_Speicher_1_ExternControl cmd_7  : SpeicherMiddayControl es wird kein Middayhigh geben
2023.11.23 09:07:06.870 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 09:50:00.003 3: LWP_PV_Perl 07_1 : LWP Heizung Automatik
2023.11.23 09:57:00.044 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 10:03:00.081 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 10:07:01.275 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 10:57:00.026 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 11:03:00.088 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 11:07:00.253 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 11:57:00.017 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 12:03:00.077 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 12:07:15.872 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 12:57:00.016 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 13:03:00.084 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 13:07:01.152 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 13:57:00.016 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 14:03:00.087 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 14:07:25.528 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 14:57:00.019 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 15:03:00.079 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 15:07:11.711 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 15:57:00.016 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 16:00:00.005 3: Pool_PV 10__ : Pool on for maintanance
2023.11.23 16:00:00.006 3: Pool_PV sub  : Pool on
2023.11.23 16:00:00.137 3: WR_1_Speicher_1_ExternControl cmd_8  : ExternControl zurückgesetzt
2023.11.23 16:03:00.086 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 16:06:56.456 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 16:57:00.041 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 17:03:00.082 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 17:06:51.453 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 17:57:00.017 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 18:03:00.078 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 18:06:42.346 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 18:35:00.002 3: LWP_PV_Perl 07_2 : LWP Heizung aus
2023.11.23 18:35:00.009 3: LWP_PV_Perl 07_2 : Parameter: 10319 < 16000 and 4.9 <= 5.6
2023.11.23 18:35:00.009 3: LWP_PV_Perl 07_2 : TimeStartHeizung switched to 02:05
2023.11.23 18:57:00.014 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 19:03:00.083 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 19:06:57.098 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 19:30:00.042 3: WR_1_Speicher_1_ExternControl cmd_14 : ExternControl Lüfter ausgeschaltet
2023.11.23 19:57:00.035 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 20:03:00.107 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 20:07:02.334 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 20:57:00.019 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 21:03:00.084 3: WR_ctl 2_KI_Prognose : Start KI Prognose
2023.11.23 21:07:12.108 3: DbRep LogDBRep_PV_KI_Prognose - execute command after sqlCmd: '"/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_ctl Yield_fc"'
2023.11.23 21:57:00.061 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 22:57:00.009 3: WR_ctl cmd_1  : Abfrage der Statistiken
2023.11.23 23:55:00.006 3: LWP_PV_Perl 06__ : LWP Priorität frei
2023.11.23 23:57:00.009 3: WR_ctl cmd_1  : Abfrage der Statistiken
Bei laufenden Kommando könnt Ihr auch noch mit der Enter Taste mal kurz einige Leerzeilen auf dem Terminal einfügen, was beim zurück scrollen ein schnelleres Finden der Position ermöglicht.

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 November 2023, 15:12:05
Hallo zusammen,
hier wäre dann mal wieder eine Änderung für die Speicher Steuerung. Bei der externen Speicher Steuerung gibt es anscheinend einen weiteren Timeout von < 1 Minute zu beachten. Dies fällt auf, wenn man manuell, oder automatisch den Speicher zu "wartingszwecken" laden/entladen möchte.
Zu diesem Zweck gibt es ja hier eine Einstellungsmöglichkeit.
Screenshot 2023-11-24 145013.png
An dieser Stelle kann man nun "An/Aus/manuell" unterscheiden.
1. Manuell
Auf manuell stellt man anschließend einen Wert ein und schickt diesen mit dem benachbarten Pull Down Menü über den Punkt DC_Power_Abs zum Speicher. Dies muss dann manuell alle < 60 Sekunden wiederholt werden. Es ist zu beachten, dass der Wechselrichter den Speicher etwas träge ansteuert.
Nach dem letzten Befehl dauert es dann die konfigurierte [WR_1_API:Battery_ComMonitor_Time] Zeit, bis der Speicher wieder normal über den Wechselrichter gesteuert wird.
2. An
Der eingestellte Wert wird automatisch gesendet, bis er auf 0 gesetzt wird, oder Aus ausgewählt wird.
Man kann den Wert auch wärend dessen verändern, was dann langsam vom Wechselrichter nachgeregelt wird, jedoch auf jeden Fall langsamer reagiert, als wenn der Wechselrichter automatisch steuert.
3. Aus
Der eingestellte Wert wird auf 0 gesetzt und ein letztes mal zum Wechselrichter gesendet. Nach Ablauf der [WR_1_API:Battery_ComMonitor_Time] Zeit wird 25_Battery_EM_State abgefragt, um den Speicher Status zeitnah zu aktualisieren.

Updates der Devices
## Im WR_1_Speicher_1_ExternControl ist der Block 17 zu ersetzen

################################################################################################################
## 17 Wiederhole alle 180s das Kommando für die DcPowerAbs Steuerung
##
17_Kommando_Wiederholung_DcPowerAbs
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled
     and
      ((
           [$SELF:SpeicherTriggerLaden] eq "An"                          ## Ist der Trigger für das Zwangsladen aktiv?
       and [$SELF:SpeicherDcPowerAbs]   ne 0                             ## Wurde eine Lade/Entlade Leistung eingestellt?
       and (   [+58]                                                     ## Den Befehl nach eingestellter Zeit wiederholen
            or [$SELF:SpeicherDcPowerAbs]
           )
      )
      or [$SELF:ui_command_1] eq "Kommando_Wiederholung_DcPowerAbs"      ## Hier wird das uiTable select ausgewertet
      or     [$SELF:SpeicherTriggerLaden] eq "Aus"                       ## Hier wird die externe Steuerung beendet
         and [$SELF:SpeicherDcPowerAbs]   ne 0
     )
   ) {

    if( [$SELF:ui_command_1] eq "Kommando_Wiederholung_DcPowerAbs" ) {   ## Hier wurde manuell eingeschaltet
      set_Reading("ui_command_1_before",[$SELF:ui_command_1]);
    }
   if([$SELF:SpeicherTriggerLaden] eq "An") {
     set_Exec("17_Battery_EM_State",30,'::CommandGet(undef, "WR_1_API 25_Battery_EM_State")');
   } else {
     set_Reading("SpeicherDcPowerAbs",0);
     set_Exec("17_Battery_EM_State",[WR_1_API:Battery_ComMonitor_Time]+60,'::CommandGet(undef, "WR_1_API 25_Battery_EM_State");Log 3, "$SELF cmd_17 : 25_Battery_EM_State abgerufen"');
   }

   ::CommandSet(undef, "WR_1_API 23_05_Battery_ExternControl_DcPowerAbs [$SELF:SpeicherDcPowerAbs]");
   set_Exec("17_Repeat_CMD",13,'::CommandSet(undef, "WR_1_API 23_05_Battery_ExternControl_DcPowerAbs '.[$SELF:SpeicherDcPowerAbs].'")');

   if (AttrVal("$SELF","verbose",0) >=3) {
     Log 3, "$SELF cmd_17 : Battery_ExternControl_DcPowerAbs auf ".[$SELF:SpeicherDcPowerAbs]." gesetzt";
   };

   set_Reading("ui_command_1","---");                                    ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten
                                                                         ## kann das Kommando nicht sofort wiederholt werden
   }
}


## Ebenfalls im WR_1_Speicher_1_ExternControl muss die erste Zeile der Tabelle im uiTable geändert werden

"$SELF"|"Kommando<dd>Auswahl / DcPowerAbs / Status</dd>" | widget([$SELF:ui_command_1],"uzsuDropDown,---,Status_Speicher,smart_Laden_start,smart_Laden_beenden,smart_Laden_starten_WB_1,smart_Laden_beenden_WB_1,Kommando_Wiederholung,SOC_Calculation,Reset,DC_Power_Abs,Sommer,Winter,Speicher_voll,14_Luefter_ein,15_Luefter_aus,Status_WR_1_Speicher_1_BYD") | widget([$SELF:SpeicherDcPowerAbs],"selectnumbers,-4500,250,4500,0,lin")."W".widget([$SELF:SpeicherTriggerLaden],"uzsuDropDown,An,Aus,manuell") |[WR_1_API:Battery_EM_State]|([$SELF:SpeicherExternTrigger] eq "gesperrt" and [WR_1_API:Battery_InternControl_MinHomeConsumption] == 30000)?'<span style="color:red">smart_Laden aktiv</span>':""
Für einen Test solltet Ihr Euch auf dem Plenticore anmelden und dort im Bereich "Momentanwerte|Batterie" aufklappen. Dort seht Ihr dann am schnellsten die Reaktion des Wechselrichters auf die externe Speicher Steuerung.
Im FHEM WR_1_Speicher_1_ExternControl werden die Status durch die Zeitgesteuerte Abfrage über die API immer erst verzögert dargestellt.

Viel Spaß beim Testen
    Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 26 November 2023, 12:42:49
Hallo Christian,

ich habe noch das Problem das bei mir in WR_1_API die Statistiken für das letzte Jahr und das letzte Quartal nicht angezeigt werden. Ich denke, das liegt daran, da die im stateFormat refernzierten "LogDBRep_Statistic_previous_Year" und "LogDBRep_Statistic_previous_Quarter" nicht existieren. Ist das ein Fehler? Hast Du die bei Dir? Wie wären die zu definieren? Oder wie löst Du das Problem bei Dir?

Grüße,
Tobias
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 27 November 2023, 08:53:02
Zitat von: trupf am 26 November 2023, 12:42:49Hallo Christian,

ich habe noch das Problem das bei mir in WR_1_API die Statistiken für das letzte Jahr und das letzte Quartal nicht angezeigt werden. Ich denke, das liegt daran, da die im stateFormat refernzierten "LogDBRep_Statistic_previous_Year" und "LogDBRep_Statistic_previous_Quarter" nicht existieren. Ist das ein Fehler? Hast Du die bei Dir? Wie wären die zu definieren?
Hallo Tobias,
das ist kein Fehler, sondern es fehlen Dir nur die Device definitionen.
Im Anhang findet Ihr jetzt die DbRep Devices und ein Beispiel für das Scheduling.
Die Anzeige im WR_1_API Devive als stateFormate sollte nicht mehr die bevorzugte sein, dafür wurde das WR_ctl Device erstellt.
Screenshot 2023-11-27 102713.png

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 November 2023, 12:46:34
Moin
Es geht voran mit dem Tibber Trigger.
2023.11.28 12:28:07.005 3: WR_1_Speicher_1_ExternControl cmd_17 : Battery_ExternControl_DcPowerAbs auf -1000 gesetzt
2023.11.28 12:29:05.005 3: WR_1_Speicher_1_ExternControl cmd_17 : Battery_ExternControl_DcPowerAbs auf -1000 gesetzt
2023.11.28 12:30:03.005 3: WR_1_Speicher_1_ExternControl cmd_17 : Battery_ExternControl_DcPowerAbs auf -1000 gesetzt
2023.11.28 12:30:23.001 3: WR_1_Speicher_1_ExternControl cmd_17 : Battery_ExternControl_DcPowerAbs auf 0 gesetzt
2023.11.28 12:31:53.006 3: WR_1_Speicher_1_ExternControl cmd_17 : 25_Battery_EM_State abgerufen

Falls jemand Tibber im Einsatz hat könnte er sich mal zu erkennen geben.

Vorraussetzung:
- Ein Speicher
- Die aktuelle WR_1_Speicher_1_ExternControl
- Meine EVU_Tibber Implementierung mit EVU_Tibber_connect
- Im WR_1_Speicher_1_ExternControl einen neuen Block für die Steuerung und eine zusätzliche Zeile im uiTable

Screenshot 2023-11-28 124436.png

Tja, leider war eine Lademöglichkeit heute Morgen, jedoch war selbst der min Preis immer noch teurer als das was ich momentan zahle :-)
Screenshot 2023-11-28 124111.png 
Im WR_1_Speicher_1_ExternControl wird nur auf den Trigger vom EVU_Tibber_connect reagiert und auch das Zeitfenster wird direkt dort berechnet. Somit bleibt im WR_1_Speicher_1_ExternControl nur noch eine Ladeleistung zu wählen und das Reagieren auf Tibber zu aktivieren.
Es wären natürlich auch noch andere Börsenanbieter denkbar, wenn man dort entsprechende readings ins Device integriert.

VG  Christian

EDIT: Das erste Laden nach dem Tibber Trigger hat bereits funktioniert. Wie man erkennen kann könnte ich in meiner Konstellation zum Einen die Verbraucher in die günstige Zeit legen und zum Anderen noch weitere ca 5 Stunden aus dem Speicher Leben. Gerade in der Nacht hätte ich noch zusätzlich das E-Auto laden können, was weitere fast 40 kWh gewesen wären.
Nur leider lag der niedrige Tibberpreis nur im Durchschnitt bei 24,94 ct und ich zahle 23 ct :-( Das wäre somit für mich kein Tag gewesen, um die höheren Grundgebühren und die 20% Verluste beim Speicher raus zu holen.
'2023-11-28 00:00:00', 'EVU_Tibber_connect', 'Tibber', NULL, 'fc0_total', '0.2539', NULL
'2023-11-28 00:03:01', 'EVU_Tibber_connect', 'HTTPMOD', '', 'fc0_trigger', 'on', NULL
'2023-11-28 01:00:00', 'EVU_Tibber_connect', 'Tibber', NULL, 'fc0_total', '0.2452', NULL
'2023-11-28 01:03:01', 'EVU_Tibber_connect', 'HTTPMOD', '', 'fc0_trigger', 'on', NULL
'2023-11-28 02:00:00', 'EVU_Tibber_connect', 'Tibber', NULL, 'fc0_total', '0.2416', NULL
'2023-11-28 02:03:01', 'EVU_Tibber_connect', 'HTTPMOD', '', 'fc0_trigger', 'on', NULL
'2023-11-28 03:00:00', 'EVU_Tibber_connect', 'Tibber', NULL, 'fc0_total', '0.2381', NULL
'2023-11-28 03:03:01', 'EVU_Tibber_connect', 'HTTPMOD', '', 'fc0_trigger', 'on', NULL
'2023-11-28 04:00:00', 'EVU_Tibber_connect', 'Tibber', NULL, 'fc0_total', '0.2426', NULL
'2023-11-28 04:03:01', 'EVU_Tibber_connect', 'HTTPMOD', '', 'fc0_trigger', 'on', NULL
'2023-11-28 05:00:00', 'EVU_Tibber_connect', 'Tibber', NULL, 'fc0_total', '0.2566', NULL
'2023-11-28 05:03:02', 'EVU_Tibber_connect', 'HTTPMOD', '', 'fc0_trigger', 'on', NULL
'2023-11-28 06:00:00', 'EVU_Tibber_connect', 'Tibber', NULL, 'fc0_total', '0.2677', NULL
'2023-11-28 06:03:02', 'EVU_Tibber_connect', 'HTTPMOD', '', 'fc0_trigger', 'on', NULL
Screenshot 2023-11-30 093802.png
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: trupf am 02 Dezember 2023, 14:05:43
Zitat von: ch.eick am 27 November 2023, 08:53:02
Zitat von: trupf am 26 November 2023, 12:42:49Hallo Christian,

ich habe noch das Problem das bei mir in WR_1_API die Statistiken für das letzte Jahr und das letzte Quartal nicht angezeigt werden. Ich denke, das liegt daran, da die im stateFormat refernzierten "LogDBRep_Statistic_previous_Year" und "LogDBRep_Statistic_previous_Quarter" nicht existieren. Ist das ein Fehler? Hast Du die bei Dir? Wie wären die zu definieren?
Hallo Tobias,
das ist kein Fehler, sondern es fehlen Dir nur die Device definitionen.
Im Anhang findet Ihr jetzt die DbRep Devices und ein Beispiel für das Scheduling.
Die Anzeige im WR_1_API Devive als stateFormate sollte nicht mehr die bevorzugte sein, dafür wurde das WR_ctl Device erstellt.
Screenshot 2023-11-27 102713.png

VG  Christian

Jetzt fehlt nur noch die Definition für "LogDBRep_Statistic_previous_Month" ... die rufst Du im DB_Service-Schedule auf, aber ich sehe nicht, wo die Ergebnisse gebraucht werden...
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 Dezember 2023, 16:33:50
Zitat von: trupf am 02 Dezember 2023, 14:05:43Jetzt fehlt nur noch die Definition für "LogDBRep_Statistic_previous_Month" ... die rufst Du im DB_Service-Schedule auf, aber ich sehe nicht, wo die Ergebnisse gebraucht werden...
Hallo
LogDBRep_Statistic_previous_Month wird noch nirgens angezeigt, da der Wunsch nach dem Quartal gewesen ist.

Bei mir verwende ich es für andere Devices, wie z.B. WB_0, WB_1_lp1, WB_1_lp2, EVU_Tibber_connect

defmod LogDBRep_Statistic_previous_Month DbRep LogDB
attr LogDBRep_Statistic_previous_Month DbLogExclude .*
attr LogDBRep_Statistic_previous_Month allowDeletion 0
attr LogDBRep_Statistic_previous_Month comment Version 2023.01.02 15:00
attr LogDBRep_Statistic_previous_Month room System
attr LogDBRep_Statistic_previous_Month sqlCmdHistoryLength 1
attr LogDBRep_Statistic_previous_Month sqlFormatService https://sqlformat.org
attr LogDBRep_Statistic_previous_Month userExitFn splitReading .*:.*
attr LogDBRep_Statistic_previous_Month verbose 0

setstate LogDBRep_Statistic_previous_Month 2023-12-02 16:31:27 sqlCmd SELECT *\
FROM\
  (SELECT h.TIMESTAMP,\
          CONCAT('WB_0_', h.READING) AS READING,\
          h.VALUE\
   FROM history h\
   JOIN\
     (SELECT max(TIMESTAMP) AS TIMESTAMP,\
             READING\
      FROM history\
      WHERE DEVICE = 'WB_0'\
        AND READING = 'Kia_eNiro_kWhCounter_Month'\
        AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
        AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')\
      GROUP BY READING) x1 USING(TIMESTAMP,READING)) x\
UNION ALL\
SELECT h.TIMESTAMP,\
       CONCAT('WB_0_', h.READING) AS READING,\
       h.VALUE\
FROM history AS h\
JOIN\
  (SELECT max(TIMESTAMP) AS TIMESTAMP,\
          READING\
   FROM history\
   WHERE DEVICE = 'WB_0'\
     AND READING = 'Gast_kWhCounter_Month'\
     AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
     AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')\
   GROUP BY READING) x2 USING(TIMESTAMP,READING)\
UNION ALL\
SELECT h.TIMESTAMP,\
       CONCAT('WB_1_', h.READING) AS READING,\
       h.VALUE\
FROM history h\
JOIN\
  (SELECT max(TIMESTAMP) AS TIMESTAMP,\
          READING\
   FROM history\
   WHERE DEVICE = 'WB_1'\
     AND READING LIKE 'lp_%_kWhCounter_Month'\
     AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
     AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')\
   GROUP BY READING) x3 USING(TIMESTAMP,READING)\
UNION ALL\
SELECT max(TIMESTAMP) AS TIMESTAMP,\
       'EVU_Tibber_connect_nodes_consumption_Month' AS READING,\
       cast(sum(VALUE) AS DECIMAL(10, 0)) AS VALUE\
FROM history\
WHERE DEVICE='EVU_Tibber_connect'\
  AND READING='nodes_consumption'\
  AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
  AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59');;
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Dezember 2023, 13:38:56
Moin,
es schneit :-) und das hatte ich letztes Jahr schon mal eingerichtet.
Screenshot 2023-12-04 134633.png
string_1_covered_snow:SW_Total_DC_Energy_From_PV1.* {
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;
   (($mon <= 2 or $mon >= 11) and
    ($hour >= 9 and $hour <= 16) and
    ReadingsVal($NAME,"P_DC1","10000") < 100 and
    ReadingsVal("Heizung","ambientTemperature",100) < 10)? "Schnee" : "frei";; },
string_2_covered_snow:SW_Total_DC_Energy_From_PV2.* {
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;
   (($mon <= 2 or $mon >= 11) and
    ($hour >= 9 and $hour <= 16) and
    ReadingsVal($NAME,"P_DC2","10000") < 100 and
    ReadingsVal("Heizung","ambientTemperature",100) < 10)? "Schnee" : "frei";; }

Welche Werte Ihr da eintragen wollt hängt natürlich von Eurer Umgebung ab.
Ich bin jetzt mal gespannt, wie nah die KI Prognose an der Realität liegt.
Interessant ist auch der Moment, wo der Schnee nur noch teilweise die Module abdeckt.
P_DC1 79.25
P_DC2 70.64

ambientTemperature 0.5
averageAmbientTemperature 0.1

string_1_covered_snow Schnee
string_2_covered_snow Schnee

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 04 Dezember 2023, 13:55:45
Zitat von: trupf am 02 Dezember 2023, 14:05:43Jetzt fehlt nur noch die Definition für "LogDBRep_Statistic_previous_Month" ... die rufst Du im DB_Service-Schedule auf, aber ich sehe nicht, wo die Ergebnisse gebraucht werden...
Wäre denn Interesse das bei Vorhandensein eines LogDBRep_Statistic_previous_Month Ergebnisses im WR_ctl zusätzlich oder anstelle des Quartals anzuzeigen?

Hier wäre z.B. schon mal das SQL für den Vormonat mit WR_1_API und noch weiteren Beispielen für andere Devices, als FHEM RAW
defmod LogDBRep_Statistic_previous_Month DbRep LogDB
attr LogDBRep_Statistic_previous_Month DbLogExclude .*
attr LogDBRep_Statistic_previous_Month allowDeletion 0
attr LogDBRep_Statistic_previous_Month comment Version 2023.12.04 14:00
attr LogDBRep_Statistic_previous_Month device WR_1_API
attr LogDBRep_Statistic_previous_Month reading SW_Statistic%_Month,Statistic_EnergyHomeBat_Month EXCLUDE=%NoBat%,%EnergyPv%
attr LogDBRep_Statistic_previous_Month room System
attr LogDBRep_Statistic_previous_Month sqlCmdHistoryLength 1
attr LogDBRep_Statistic_previous_Month sqlFormatService https://sqlformat.org
attr LogDBRep_Statistic_previous_Month userExitFn splitReading .*:.*
attr LogDBRep_Statistic_previous_Month verbose 0

setstate LogDBRep_Statistic_previous_Month 2023-12-04 14:30:36 sqlCmd SELECT *\
FROM\
  (SELECT h.TIMESTAMP,\
          CONCAT('WR_1_API_', h.READING) AS 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\
   JOIN\
     (SELECT max(TIMESTAMP) AS TIMESTAMP,\
             READING\
      FROM history\
      WHERE §device§\
        AND §reading§\
        AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
        AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')\
      GROUP BY READING) x1 USING(TIMESTAMP,READING)) x\
UNION ALL\
SELECT *\
FROM\
  (SELECT h.TIMESTAMP,\
          CONCAT('WB_0_', h.READING) AS READING,\
          h.VALUE\
   FROM history h\
   JOIN\
     (SELECT max(TIMESTAMP) AS TIMESTAMP,\
             READING\
      FROM history\
      WHERE DEVICE = 'WB_0'\
        AND READING = 'Kia_eNiro_kWhCounter_Month'\
        AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
        AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')\
      GROUP BY READING) x1 USING(TIMESTAMP,READING)) x\
UNION ALL\
SELECT h.TIMESTAMP,\
       CONCAT('WB_0_', h.READING) AS READING,\
       h.VALUE\
FROM history AS h\
JOIN\
  (SELECT max(TIMESTAMP) AS TIMESTAMP,\
          READING\
   FROM history\
   WHERE DEVICE = 'WB_0'\
     AND READING = 'Gast_kWhCounter_Month'\
     AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
     AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')\
   GROUP BY READING) x2 USING(TIMESTAMP,READING)\
UNION ALL\
SELECT h.TIMESTAMP,\
       CONCAT('WB_1_', h.READING) AS READING,\
       h.VALUE\
FROM history h\
JOIN\
  (SELECT max(TIMESTAMP) AS TIMESTAMP,\
          READING\
   FROM history\
   WHERE DEVICE = 'WB_1'\
     AND READING LIKE 'lp_%_kWhCounter_Month'\
     AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
     AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')\
   GROUP BY READING) x3 USING(TIMESTAMP,READING)\
UNION ALL\
SELECT max(TIMESTAMP) AS TIMESTAMP,\
       'EVU_Tibber_connect_nodes_consumption_Month' AS READING,\
       cast(sum(VALUE) AS DECIMAL(10, 0)) AS VALUE\
FROM history\
WHERE DEVICE='EVU_Tibber_connect'\
  AND READING='nodes_consumption'\
  AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')\
  AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59');;
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 05 Dezember 2023, 17:49:17
Hallo,

ich habe das Problem dass ohne Änderung an der Konfig viele Werte meines BYD Speichers als 0 zurückkommen, z.B. Battery_temperature, Battery_work_capacity.

Die Werte vom Wechselrichter kommen richtig, wie z.B. Grid_frequency.

Battery_voltage ist auf 0,23.

Kann es sein, dass die Batterie wegen Schnee in Deepsleep ist und deshalb nichts kommt?

Vielen lieben Dank im Voraus.

Liebe Grüße
Oli
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 05 Dezember 2023, 22:53:07
Zitat von: ojb am 05 Dezember 2023, 17:49:17Hallo,
ich habe das Problem dass ohne Änderung an der Konfig viele Werte meines BYD Speichers als 0 zurückkommen, z.B. Battery_temperature, Battery_work_capacity.
Die Werte vom Wechselrichter kommen richtig, wie z.B. Grid_frequency.

Battery_voltage ist auf 0,23.

Kann es sein, dass die Batterie wegen Schnee in Deepsleep ist und deshalb nichts kommt?
Hallo Oli,
Da gab es glaube ich auch mal ein Problem mit der FW des WRs. Gibt es im WR eventuell Fehlermeldungen? Haste den mal neu gestartet?
Über das WR_1_API kann man auch einen Reset des WRs machen.

VG Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 06 Dezember 2023, 10:23:06
Ok, prüfe ich heute Abend. Wir hatten einen 30-minütigen Stromausfall ....

Wie kann ich den Reset über  API machen?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Dezember 2023, 13:14:16
Zitat von: ojb am 06 Dezember 2023, 10:23:06Ok, prüfe ich heute Abend. Wir hatten einen 30-minütigen Stromausfall ....

Wie kann ich den Reset über  API machen?
Hallo Oli,
nach dem Stromausfall könnte auch ein Reset vom Speicher nicht schaden.
set WR_1_API 60_01_Reset_Wechselrichter

Wenn das nicht reichen sollte, dann könntest Du mal die komplette Power Off/Power On Prozedur von Kostal durchführen.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 06 Dezember 2023, 17:36:19
Bei mir kommt:
Unknown argument 60_01_Reset_Wechselrichter, choose one of 22_03_Battery_MinHomeConsumption 22_05_Battery_SmartBatteryControl_Enable 23_04_Battery_ExternControl_DcCurrentRel 23_07_Battery_ExternControl_MaxChargePowerAbs 23_02_Battery_ExternControl_AcPowerRel 23_00_Battery_ExternControl 23_01_Battery_ExternControl_AcPowerAbs 23_10_Battery_ExternControl_MinSocRel 22_06_Battery_Strategy 40_02_Generator_ShadowMgmt 22_07_Battery_Type 22_01_Battery_DynamicSoc_Enable 22_04_Battery_MinSoc 23_05_Battery_ExternControl_DcPowerAbs 06_auth_logout 23_08_Battery_ExternControl_MaxDischargePowerAbs 23_03_Battery_ExternControl_DcCurrentAbs 50_events_latest_5 23_09_Battery_ExternControl_MaxSocRel 23_06_Battery_ExternControl_DcPowerRel attrTemplate
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Dezember 2023, 08:28:54
Moin,
ich habe die Definition für den Reset nochmal raus gesucht.

attr WR_1_API set6001Header01 authorization: Session %auth_sessionId%
attr WR_1_API set6001Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr WR_1_API set6001Method POST
attr WR_1_API set6001Name 60_01_Reset_Wechselrichter
attr WR_1_API set6001NoArg 1
attr WR_1_API set6001URL http://%IP-WR%/api/v1/system/reboot

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 07 Dezember 2023, 09:52:21
Super. Danke Dir.

Ich hab jetzt die Wechselrichter auf die aktuelle Firmware hochgezogen uns jetzt bekomme ich eine Fehlermeldung bzgl. Batterie.

Interessant, die war vorher nicht da.
Screenshot 2023-12-07 095117.png
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Dezember 2023, 10:22:58
Zitat von: ojb am 07 Dezember 2023, 09:52:21Ich hab jetzt die Wechselrichter auf die aktuelle Firmware hochgezogen uns jetzt bekomme ich eine Fehlermeldung bzgl. Batterie.
Das sollte aber nach einem Reset des Speichers weg sein.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 08 Dezember 2023, 08:08:31
Das Problem war, dass durch den Stromausfall die Schütze der Batterien aufgegangen sind.

Ist das so? Weil das wäre j blöd wenn man im Sommer in Urlaub ist und nach einem Stromausfall die Batterien fehlen.

Jetzt ist alles wieder aufgestartet aber über WR_1 kommen verschiedene Daten nicht. Ich hab jetzt SOC, Ladezyklen, Status Energiemanagement, Batterie Temperatur, aber die Spannung, die gestern noch da war ist jetzt auf 0.

Kann das an der neuen Software auf Wechselrichter und Batterien liegen?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Dezember 2023, 08:47:19
Zitat von: ojb am 08 Dezember 2023, 08:08:31Jetzt ist alles wieder aufgestartet aber über WR_1 kommen verschiedene Daten nicht. Ich hab jetzt SOC, Ladezyklen, Status Energiemanagement, Batterie Temperatur, aber die Spannung, die gestern noch da war ist jetzt auf 0.

Kann das an der neuen Software auf Wechselrichter und Batterien liegen?
Ich bin bei folgenden Versionen
Plenticore
Software-Version_IO-Controller_IOC 01.75
Software-Version_Maincontroller_MC 01.76

Produktname KOSTAL Smart Energy Meter
Gerätetyp hw0100
Software-Version 2.2.1
Beim KSEM ist mir momentan noch zuviel Trubel wegen der Enector WB um einen FW Update zu machen (https://www.photovoltaikforum.com/thread/218224-ksem-update-2-4-0-verf%C3%BCgbar), da man ja wohl nicht mehr auf eine ältere FW zurück kann.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 08 Dezember 2023, 11:39:16
Aber kommen bei Dir die Firmware-Versionen über WR_1?

Bei mir kommt:
Annotation 2023-12-08 113813.png
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Dezember 2023, 13:14:16
Zitat von: ojb am 08 Dezember 2023, 11:39:16Aber kommen bei Dir die Firmware-Versionen über WR_1?
Ja, die sind ausgelesen. Die vom Speicher werden wohl nicht im WR Gui angezeigt, jedoch über ModBus gesendet.
Hier mal Versionen vom WR
Screenshot 2023-12-08 131144.png
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 08 Dezember 2023, 14:35:14
Ich meinte die Battery-Daten. Ich hab die Logs gecheckt, früher kamen die auch Battery-Manufactorer war BYD, jetzt sind die Felder leer.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Dezember 2023, 14:37:54
Zitat von: ojb am 08 Dezember 2023, 14:35:14Ich meinte die Battery-Daten. Ich hab die Logs gecheckt, früher kamen die auch Battery-Manufactorer war BYD, jetzt sind die Felder leer.
Bei mir kommt das alles noch. Hast Du mal den Speicher im WR weg konfigueriert und dann neu ausgewählt?
Battery_Firmware 416546816 2023-12-08 14:35:04
Battery_Maincontroller_MC 7733249 2023-12-08 14:35:04
Battery_Manufacturer BYD 2023-12-08 14:35:04
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 09 Dezember 2023, 09:57:40
Ja Wahnsinn ...

Ich konnte zwar die Batterie nicht abwählen. Bei Auswahl von 'Keine Batterie' im WR ist der Speichern-Button dann ausgegraut.

Aber ich hab dann einfach mal LG ausgewählt und dann wieder zurück auf BYD ... und siehe da ... alles wieder da. DANKE.

Screenshot 2023-12-09 095648.png
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Dezember 2023, 14:14:33
Moin zusammen.
Das Jahresende wird wieder mal echt spannend und man interpretiert die Zahlen :-)
                         Jahr / Vorjahr
Bezug von PV            05681 / 05925    <<< Nen bissel was kommt ja noch :-(
Bezug von Batterie      01534 / 01349    <<< Die Speicher Nutzung wurde besser (Das E-Auto lädt nicht aus dem Speicher)
Bezug vom Netz          02237 / 02572    <<< Das wird wohl noch steigen, da E-Auto, WP, und Pool stark aus dem Netz ziehen
Bezug ins Haus          09453 / 10004    <<< Den Verbrauch für die nächsten drei Wochen kann ich nicht so gut schätzen.
Einspeisung ins Netz 10880 / 12519    <<< 1600 kWh weniger eingespeist
Autarkiequote          76 % / 74 %
Eigenverbrauchsquote 40 % / 37 %

LP1             2622 / 1937
LP2             0197 / 0000
   >>> 900 kWh mehr ins E-Auto als letztes Jahr und da kommen ja noch 3 Wochen.
Durch das E-Auto habe ich dieses Jahr im Sommer einiges wehniger eingespeist. An meinem zweiten Ladepunkt, der von Nachbarn genutzt wird ist auch einiges in andere E-Autos geladen worden, was etwas an extra Einnahmen und Förderung generiert.

Die Autarkie- und die Eigenverbrauchquote ist aber doch jetzt sehr schwer in die Höhe zu treiben. Da bräuchte ich dann doch noch mehr E-Autos zum Laden aus der Nachbarschaft. Das zeigt, dass das Optimieren der eigenen Verbraucher jetzt wohl am Limit ist.

Obwohl beim Hausverbrauch die LP* dabei sind und diesen Winter auch der Pool scheint der Hausverbrauch nicht signifikant gestiegen zu sein, ich da jetzt für 3 Wochen noch 600 kWh Puffer.

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 11 Dezember 2023, 15:49:41
So sieht es bei mir aus:

- 72% Autarkie ohne Wallbox.
- 87% Autarkie bilanziell mit Wallbox.

Screenshot 2023-12-11 154038.png   
Screenshot 2023-12-11 154547.png
Setup:
- 17,5 kWp Anlage (Installation 10/21).
- 2x 12,8 kWh BYD Batterien (zweite Batterie seit 05/23).
- Heizung Wärmepumpe mit 2x 100m Tiefenbohrung.
- Elektroauto.
- Beheizter Außenpool im Sommer (Betrieb über WP).

Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Dezember 2023, 16:21:15
Zitat von: ojb am 11 Dezember 2023, 15:49:41So sieht es bei mir aus:

- 72% Autarkie ohne Wallbox.
- 87% Autarkie bilanziell mit Wallbox.
Der Außenpool im Sommer macht Dich definitiev zum Sieger, das schiebt den Eigenverbrauch mal so richtig in die Höhe.
Wenn Du den auch in der Nacht auf Themperatur hälst, dann bekommst Du auch im Sommer die beiden Speicher leer, oder lädst Du die ins E-Auto um weil Du tagsüber nicht zuhause bist?
Da hast Du durch den Pool ja mal eben den doppelten Leistungsbedarf  :o  ;D

Ich könnte mir da noch ne Klimaanlage einbauen.

Bei den Statistiken könnte ich noch etwas die Tabelle verschieben und Vortag und Vormonat mit rein nehmen.
Screenshot 2023-12-11 162224.png
 
VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ojb am 11 Dezember 2023, 16:34:47
Der Pool wird auf 30°C gehalten (25m3). Beheizt wird er allerdings fast ausschließlich am Tag. Reicht im Sommer vollkommen aus. Rest geht ins Haus und Auto.

Ich überlege sogar um die WP zu schonen den Pool nur über Heizschwert zu laden, weil die WP läuft im Sommer quasi genauso viel wie im Winter.

Zur Zeit hab ich einen Hybrid, aber bis Juni hatte ich ein E-Auto mit 105kWh Speicher. Im Sommer kriegt man den sogar voll.

Und es ist schon cool im warmen Pool zu paddeln und dann einen Wochenendausflug (500km Reichweite) zu machen und das alles mit dem eigenen Strom. Und ich hab das alles gemacht ohne dass eine links-grüne Regierung mir das vorschreiben musste.

Und Danke Deines Moduls kann ich das alles auswerten und steuern. Vielen vielen Dank dafür.

Zeitweise hab ich per FHEM die Batterie gesperrt für Heizungsbetrieb, weil der Betriebsstrom teurer war als der WP-Strom.
Zur Zeit wird Batterie bei Verbräuchen über 3kW (Ofen, Heizung, Sauna) gesperrt und auf SOC_min 30% gehalten. Gestern war sie auf maximal 75% SOC und hat gehalten bis heute morgen um 06.00h.

Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Dezember 2023, 17:28:46
Zitat von: ojb am 11 Dezember 2023, 16:34:47Ich überlege sogar um die WP zu schonen den Pool nur über Heizschwert zu laden, weil die WP läuft im Sommer quasi genauso viel wie im Winter.
Wenn sie nicht ständig an/aus geht, was beim Poolheizen nie der Fall sein sollte, würde ich den COP der WP lieber mitnehmen. Durch die Erdwärme liegt der bei Dir sicherlich noch höher als bei meiner LLWP.

ZitatZur Zeit hab ich einen Hybrid, aber bis Juni hatte ich ein E-Auto mit 105kWh Speicher. Im Sommer kriegt man den sogar voll.
Ich habe auch ca 40-80 kWh im Sommer übrig, deshalb habe ich die Wallbox als öffentlichen Ladepunkt bei der Bundesnetzagentur gemeldet :-) das gibt 10 ct/kwh ins Auto und der Eigenverbrauch steigt durch das Laden der E-Autos der Nachbarn, falls die den Vorteil auch für Sie verstehen :-) :-)

ZitatUnd Danke Deines Moduls kann ich das alles auswerten und steuern. Vielen vielen Dank dafür.
Ich mache gerdae mal einen Entwurf nach Deiner Statistik Tabelle für das WR_ctl Device. Hast Du ansonsten noch Ideen, was noch nicht angezeigt wird oder besser woanders platziert werden sollte?

ZitatZeitweise hab ich per FHEM die Batterie gesperrt für Heizungsbetrieb, weil der Betriebsstrom teurer war als der WP-Strom.
Zur Zeit wird Batterie bei Verbräuchen über 3kW (Ofen, Heizung, Sauna) gesperrt und auf SOC_min 30% gehalten. Gestern war sie auf maximal 75% SOC und hat gehalten bis heute morgen um 06.00h.
Okay, Du hast einen separaten WP Tarif, der sich bei mir wegen des relativ geringen Verbrauches nicht rechnet. Da kann ich den zweiten Basispreis nicht rausholen. Auch bei Tibber würde das nicht gehen, wobei ich im Winter damit versuche Netzdienlich zu sein und dann wenigstens die Geräte laufen lasse, wenn es Überschuss im Netz gibt. Doch Tibber ist momentan teurer als mein Basistarif.

Ich versuche auch den Accu zu schonen, wenn das E-Auto geladen wird, denn es ist ja egal, wann man dazu kauft.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 11 Dezember 2023, 18:27:53
Hallo zusammen,
ich habe schon mal einen Entwurf für die Änderung im Wr_ctl gemacht, damit Vortag und Vormonat noch in die Statistik passt.
Screenshot 2023-12-11 182313.png
Das könnte auch eine Idee sein, um diesen Bereich zu verbessern und den Platz im FHEMWEB besser zu nutzen.
Screenshot 2023-12-11 182552.png

Was haltet Ihr davon?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: loleke am 05 Januar 2024, 19:55:15
Guten Abend. Ich versuche mich gerade mit Fhem/Kostal und Tibber. Leider habe ich mit Fhem noch nicht viel am Hut, bin aber guter Dinge.
Wo ich seid 2 Tagen nicht weiterkomme ist:
"RAW Definition WR_1_config"
Passworte für die Abfrage des WR_1_API werden im storeKeyValue abgelegt:\
   {KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
   {KeyValue("store","PW_WR_1_API_user","<passwort>")}\
\
Steht das reading module_*_count auf 0 wird diese Ausrichtung nicht berücksichtigt\
\
Korrekturkurven:\
         Steilheit  Parallel\
                    verschiebung\
tempk      -0.39      25\
cloudk     -0.65       0\
raink      -0.30       0\
Der Slider für die Steilheit wird mit - k/100 umgerechnet. 39 ==> -0.39

wie auch dem "KeyValue()" "plenticore_auth()"

Da stehe ich momentan voll auf dem Schlauch. Kann mir da vielleicht jemand einen Tipp geben was ich genau machen muss?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Januar 2024, 09:25:38
Zitat von: loleke am 05 Januar 2024, 19:55:15Guten Abend. Ich versuche mich gerade mit Fhem/Kostal und Tibber. Leider habe ich mit Fhem noch nicht viel am Hut, bin aber guter Dinge.
Wo ich seid 2 Tagen nicht weiterkomme ist:
"RAW Definition WR_1_config"
< snip >
wie auch dem "KeyValue()" "plenticore_auth()"

Da stehe ich momentan voll auf dem Schlauch. Kann mir da vielleicht jemand einen Tipp geben was ich genau machen muss?
Das WR_1_config Device ist leider eine Altlast und ich bin bisher nicht dazu gekommen das Wiki umzubauen und zu aktualisieren. Für die aktuelle Prognose wird nun eine KI verwendet, die über Python und eine SQL Prozedur in der Datenbank die Prognosedaten aufbereitet. Dazu gibt es im Forum ab hier in vier Teilen eine Beschreibung (https://forum.fhem.de/index.php?msg=1268412), wie man auf die neue KI Prognose umstellen kann.
Ich versuche mal im Wiki die aktuellen Devices und auch die neue Ki Prognose abzulegen, da in letzter Zeit einige im Forum neu dazu gekommen sind.

Für den KeyValue() schau bitte nochmal ins Wiki, da sollte die Beschreibung recht gut sein, da wir das bereits schon mehrfach durchlaufen haben. Ansonsten schreib mir nochmal eine PN.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Januar 2024, 14:35:13
Hallo zusammen,
ich habe jetzt begonnen das WIKI für die Leistungsprognose zu korrigieren.
Die alte Prognose wird noch einige zeit im Wiki bleiben, es wäre jedoch schön, wenn Ihr nach und nach auf die Ki Prognose umsteigen würde.
Hier geht es dann jetzt los mit den Änderungen (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Wetter-%2FLeistungs-Prognose)
Teil 1 und Teil 2 habe ich aus dem Thread bereits übernommen und mit den aktuellsten Versionen aus meiner Installation abgeglichen.

Update 20240107
Es gibt jetzt etwas zur MySQL Installation als Ergänzung zum DbLog Wiki. Da wird hoffentlich zeitnah noch mehr dazu kommen :-)
https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#MySQL_etwas_Basis_Information (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#MySQL_etwas_Basis_Information)
Update 20240109
Es geht voran und gibt nun einige MySQL Kommandos, die insbesondere bei Oracle MySQL (Empfehlung) notwendig sind.
https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#MySQL_initial_konfigurieren (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#MySQL_initial_konfigurieren)

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 22 Januar 2024, 10:36:12
Hallo zusammen,
ich hatte ja mal kurz einen Post geschrieben, den ich dann wieder raus genommen hatte.

Schnee ist echt ein Prognose Problem, aber ich hätte da mal etwas zu Testen.
Heute Nacht ist dann endlich alles wieder weg geschmolzen.

Am Ende der dwd_load() procedure wäre dieser SQL Block auszutauschen. Im yield_max würde dann die extrem niedrige Leistung bei Abdeckung berücksichtigt, wobei dies einen Schwellwert von 4% im Verhältnis zum Durchschnitt der letzten 30 Tage verwendet.
-- Ermittle Ertrags Maximum der letzten 30 Tage um die Prognose zu limitieren
UPDATE dwdfull tt
JOIN
  ( -- yield_max und Schnee Begrenzung
      SELECT hour,
             if(yield_min > yield_max*0.04, yield_max, yield_min) AS yield_max
      FROM (
        SELECT hour,
             -- Ist der letzte Tag 90% kleiner als der Durchschnitt der letzten Tage,
             -- dann liegt Schnee auf den Modulen
               cast(max(if(yield > 0,yield,0)) AS DECIMAL(6)) AS yield_max
        FROM dwdfull
        WHERE TIMESTAMP > DATE_ADD(@date,INTERVAL -30 DAY)
        GROUP BY hour ) x1
  INNER JOIN
        -- Wie waren die letzten Tag? Extrem kleine Werte bedeuten abgedeckte Module,
        -- was die Ki_Prognose nicht so schnell lernen kann.
        (SELECT hour,
               cast(min(if(yield > 0,yield,0)) AS DECIMAL(6)) AS yield_min
        FROM dwdfull
        WHERE TIMESTAMP > DATE_ADD(@date,INTERVAL -1 DAY)
          AND TIMESTAMP < @date
        GROUP BY hour
        ) X2 USING(hour)
   ) t2  USING(hour)
SET tt.yield_max = t2.yield_max
WHERE TIMESTAMP > @date
;

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Prof. Dr. Peter Henning am 24 Januar 2024, 05:15:33
Ich habe da so verschiedene Vorschläge zur Verbesserung. Könnte man vielleicht damit beginnen, die ewig langen Codeblöcke aus dem Wiki in herunterladbare Dateien umzuwandeln, die in den contrib-Ordner gestellt werden?

LG

pah
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 Januar 2024, 10:01:27
Zitat von: Prof. Dr. Peter Henning am 24 Januar 2024, 05:15:33Ich habe da so verschiedene Vorschläge zur Verbesserung. Könnte man vielleicht damit beginnen, die ewig langen Codeblöcke aus dem Wiki in herunterladbare Dateien umzuwandeln, die in den contrib-Ordner gestellt werden?
Hallo Peter (oder welche Anrede wäre korrekt?)
Das ist auch etwas, was mich schon lange stört, jedoch kenne ich Eure Arbeitsweise im Verein nicht.
Könnte ich da man eine Einweisung bekommen? Ich weiß auch nicht, ob meine Implementierung wirklich den Qualitätsansprüchen genügt.
Das mit der Wiki Seite war schon mal ein schöner Anfang für meine eigene Dokumentation :-)

Gefunden habe ich bereits https://svn.fhem.de/fhem/trunk/fhem/contrib/

Die ersten Fragen wären:
1. Wie kann man im contrib-Ordner etwas ablegen?
2. Gibt es da ein Tool mit Versionierung?
3. Darf das jeder FHEM user nutzen?

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Prof. Dr. Peter Henning am 24 Januar 2024, 10:37:06
Klar geht das alles.

Zunächst einmal brauchst Du einen Subversion-Cliuent, oder SVN Client. Die gibt es kostenfrei, eine Übersicht findet man hier.
https://en.wikipedia.org/wiki/Comparison_of_Subversion_clients

Dann liest Du das hier durch: https://svn.fhem.de/

Im nächsten Schritt erzeugst Du auf Deinem Rechner eine lokale Kopie des gesamten Repository. Wenn Du darin etwas änderst, kannst Du das per Commit wieder in das offizielle Repository hochladen. Das geht noch nicht sofort, Du benötigst
Schreibrechte als Entwickler. Die bekommst Du von Rudi König himself, schreib ihm eine PM. 

Beim Hochladen muss man natürlich verantwortungsvoll handeln, und es gibt relativ strikte Anforderungen an Module für den FHEM-Code. Die findest Du hier: https://forum.fhem.de/index.php?topic=18962.0

So weit würde ich für den Anfang aber gar nicht gehen - denn für experimentelle Module gibt es den contrib-Ordner. Darin legst Du (in der lokalen Kopie) einen neuen Unterordner unter Deinem Namen an, z.B. cheick. Und darin kannst Du z.B. die SQL-Dateien ablegen.

Ich habe auch einen solchen Unterordner pahenning, darin liegen viele experimentelle Sachen, auch Module, die ich vor vielen Jahren geschrieben habe und für die es keine Wartung gibt. Beispielsweise ein Modul 70_NT5000.pm, das ich 2008 für die Kommunikation mit einem Sunways-Wechselrichter geschrieben habe. Das Modul tut seitdem wunderbar seine Arbeit bei mir, keine Veränderungen mehr seit 2014.

Und wenn das dann in Deinem lokalen Ordner steht, einfach per SVN Commit hochladen.

LG

pah

P.S.: Der Grund dafür, dass ich mir diesen Thread jetzt angesehen habe: In den nächsten Tagen bekomme ich eine WallBox, in den nächsten Wochen ein E-Auto und eine zweite PV-Anlage mit BYD-Speicher. Der WR wird von Fronius sein, ich mache deshalb mal einen neuen Thread auf, um das Thema Energiemanagement etwas von der Hardware zu lösen.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 24 Januar 2024, 10:49:45
Hallo pah

ich schau mir das mal an, da ich liebend gerne das Wiki aufräumen und aktualisieren möchte.

ZitatP.S.: Der Grund dafür, dass ich mir diesen Thread jetzt angesehen habe: In den nächsten Tagen bekomme ich eine WallBox, in den nächsten Wochen ein E-Auto und eine zweite PV-Anlage mit BYD-Speicher. Der WR wird von Fronius sein, ich mache deshalb mal einen neuen Thread auf, um das Thema Energiemanagement etwas von der Hardware zu lösen.
Ich denke, da werde ich dann auch mit arbeiten.
Den zweiten WR von Fronius kann man über ein Fake Device in die Kostal Welt bringen.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Januar 2024, 12:56:01
Zitat von: Prof. Dr. Peter Henning am 24 Januar 2024, 10:37:06Ich habe auch einen solchen Unterordner pahenning, darin liegen viele experimentelle Sachen, auch Module, die ich vor vielen Jahren geschrieben habe und für die es keine Wartung gibt. Beispielsweise ein Modul 70_NT5000.pm, das ich 2008 für die Kommunikation mit einem Sunways-Wechselrichter geschrieben habe. Das Modul tut seitdem wunderbar seine Arbeit bei mir, keine Veränderungen mehr seit 2014.

Und wenn das dann in Deinem lokalen Ordner steht, einfach per SVN Commit hochladen.

LG pah
Hallo zusammen
Zuerst mal besonderen Dank an pah für die Hilfe mit dem svn contrib. Ich habe das gerade mal umgesetzt und schon die ersten Files bereit gestellt.

Ich bitte Euch nun das mal zu testen:

1. Im Browser findet Ihr jetzt meine Dateistruktur mit folgendem Aufruf
    https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/ (https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/)

2. In einem UNIX Terminal geht es über ein wget und erzeugt dabei einen Ordner ./contrib/ch.eick .
$ wget -r -nH --no-parent --cut-dirs=4 --reject="index.html*" -e robots=off https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/ -P ~/contrib/

3. Auch in der FHEM Kommandozeile kann man es abrufen, was dann ein Unterverzeichnis im fhem ./contrib anlegt.
"wget -r -nH --no-parent --cut-dirs=4 --reject="index.html*" -e robots=off https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/ -P ~/contrib/"

Achtung, meine Dateien sind kein Modul!
Um die Dateien zu übernehmen müsst Ihr jede einzelne Datei im RAW Editor übernehmen, oder bei anderen Formaten z.B. im MySQL oder auch in die 99_myUtils.pm .
Der Hintergrund ist, das Wiki aufzuräumen und Fehler beim Download zu minimieren.

Es sollte nun der Stand von gestern dort abgelegt sein. Ich lege dann immer mal wieder weitere Datein ab, oder aktualisiere ältere.
Ein Hinweis auf die aktualisierung wird dann hier im Thread erscheinen.
Für den weiteren Support wäre es nun auch sehr wichtig, dass Ihr versuch von älteren Versionen auf die aktuellen zu wechseln.
Bei diesem Schritt sollten bitte zusammenhängende Devices gleichzeitig aktualisiert werden, um die Abhängigkeiten zu berücksichtigen.

VG  Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 25 Januar 2024, 13:22:31
Hallo zusammen,
manchmal, wenn man mal gelangweilt beim Monitoren ist, dann sieht man, dass es viel Überschuss gibt, der Plenticore aber z.B. nur mit 2000 W lädt und der Rest ins Netz geht. Das entscheidet dann der Plenticore, aber da man ja gerade da ist kann man das manuell beeinflussen. Im Screenshot ist der Weg mal dargestellt.Screenshot 2024-01-25 131738.png

Hierbei aber nicht vergessen es auch wieder abzuschalten! Es kommen ja auch mal Wolken :-)

Viel Spaß beim Speicher laden
      Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Januar 2024, 09:54:08
Zitat von: shwowak am 28 Januar 2024, 02:29:18Glaub man muss noch beschreiben wie man die einzel Datei einfügt. Glaube nicht das jeden weiß wie er hier vorgehen muss. Evl in stichpunkten
An dem Einfügen der Daten hat sich nichts geändert.
Die Beschreibung ist im Wiki, nur das copy/paste aus dem Wiki enfällt, da die Dateien mit den Device Definitionen, bzw der einzufügende Code nun direkt herunter geladen werden kann. Danach kann jeder den Editor seiner Wahl verwenden um die Daten ins FHEM zu kopieren. Mit der Variante 1. kann dies sogar auch noch weiterhin im Browser erfolgen.

Hier mal ein Beispiel für 1. Im Browser
Screenshot 2024-01-28 095220.png
Screenshot 2024-01-28 095239.png
Screenshot 2024-01-28 095311.png
Screenshot 2024-01-28 095332.png

Oder ein Beispiel für 2. und 3. im Terminal des UNIX
fhem@raspberrypi:~$ wget -r -nH --no-parent --cut-dirs=4 --reject="index.html*" -e robots=off https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/ -P ~/contrib/

fhem@raspberrypi:~$ cd ./contrib/ch.eick/
fhem@raspberrypi:~/contrib/ch.eick$ ls -l
insgesamt 8
drwxr-xr-x 8 fhem fhem 4096 Jan 27 17:38 Photovoltaik
drwxr-xr-x 4 fhem fhem 4096 Jan 27 17:38 Strombörse
fhem@raspberrypi:~/contrib/ch.eick$ cd Photovoltaik/Photovoltaik/Wechselrichter/

fhem@raspberrypi:~/contrib/ch.eick/Photovoltaik/Wechselrichter$ ls -l
insgesamt 232
-rw-r--r-- 1 fhem fhem  8599 Jan 25 10:59 RAW_WR_0_KSEM.txt
-rw-r--r-- 1 fhem fhem 67030 Jan 25 10:59 RAW_WR_1_API.txt
-rw-r--r-- 1 fhem fhem 66862 Jan 25 10:59 RAW_WR_1_Speicher_1_ExternControl.txt
-rw-r--r-- 1 fhem fhem 24468 Jan 25 10:59 RAW_WR_1.txt
-rw-r--r-- 1 fhem fhem 17108 Jan 25 10:59 RAW_WR_2_API.txt
-rw-r--r-- 1 fhem fhem  4102 Jan 25 10:59 RAW_WR_2.txt
-rw-r--r-- 1 fhem fhem  1733 Jan 25 10:59 RAW_WR_3_Fake_WR.txt
-rw-r--r-- 1 fhem fhem 26255 Jan 25 10:59 RAW_WR_ctl.txt

fhem@raspberrypi:~/contrib/ch.eick/Photovoltaik/Wechselrichter$ cat RAW_WR_1_Speicher_1_ExternControl.txt
defmod WR_1_Speicher_1_ExternControl DOIF ################################################################################################################\
## 1 Speicher Status vom WR_1_Speicher_1 aktualisieren.\
##   Dies geschieht über das WR_1_API Device, da der Speicher direkt am Wechselrichter angeschlossen ist.\
##\
1_Status_WR_1_Speicher_1\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
     and\
     (   [:52]                                                           ## jede Stunde\
\
      or [$SELF:ui_command_1] eq "Status_Speicher"                       ## Hier wird das uiTable select ausgewertet\
     )\
   ) {\
\
    if( [?$SELF:ui_command_1] eq "Status_Speicher" ) {                   ## Hier wurde manuell eingeschaltet\
      set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
    }\
\
    ::CommandGet(undef, "WR_1_API 21_Battery_Information");;\
    ::CommandGet(undef, "WR_1_API 22_Battery_InternControl");;\
    ::CommandGet(undef, "WR_1_API 23_Battery_ExternControl");;\
    ::CommandGet(undef, "WR_1_API 25_Battery_EM_State");;\

    if (AttrVal("$SELF","verbose",0) >=4) {\
      Log 3, "$SELF cmd_1  : Speicher Status abfrage"\
    }\
\
    set_Reading("ui_command_1","---");;                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
  }\
}\
\
< snip >

VG   Christian

P.S. Könntest Du bitte Deinen Post nochmals Editieren, da dort sehr viel doppelter Text als Zitat enthalten ist und Deine wirkliche Frage komplett verschwindet?
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Prof. Dr. Peter Henning am 30 Januar 2024, 17:23:49
Kleiner Hinweis zur Preisberechnung bei aWATTar siehe hier: https://forum.fhem.de/index.php?topic=136885.0

LG

pah
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 30 Januar 2024, 17:43:31
Zitat von: Prof. Dr. Peter Henning am 30 Januar 2024, 17:23:49Kleiner Hinweis zur Preisberechnung bei aWATTar siehe hier: https://forum.fhem.de/index.php?topic=136885.0
Das trage ich dann noch im entsprechenden Thread nach. Ich weiß aber nicht wer aWATTar wirklich nutzt.
Für mich ist es nur ein Hobby und ich möchte halt langfristig mal echt vergleichen können. Leider kann
man die Tibber Preise nur als Kunde abfragen, bei aWATTar kommt man da ja auch so ran.
Die Preise für den aWATTar forecast fehlen momentan ja auch noch :-(
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Prof. Dr. Peter Henning am 31 Januar 2024, 12:35:35
Schau mal hier. https://forum.fhem.de/index.php?topic=136898.0

LG

pah
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 01 Februar 2024, 15:27:36
Hallo zusammen,
im contrb/ch.eick/Grafana/* findet Ihr jetzt mein Grafana Dashboard und die Diagramme im JSON Format. Grafana am besten als Docker Container laufen lassen, dann muss man nicht soviel selber machen. Das Dashboard ist recht umfangreich und liest sehr viele Werte aus der MySQL Datenbank. Zum Anzeigen verwendet Ihr auch besser einen Rechnen mit etwas mehr Power wie ein RPI4, da dort viel Java im Hintergrund läuft. Der Grafana Docker Container kann auf einem RPI4 bleiben, oder auch auf einem separaten NAS laufen, es ist halt komplett losgelöst und liest direkt über das Netzwerk aus der FHEM MySQL Datenbank. Rechts oben möchte ich noch die KI_Prognose und  zugehörige Werte unterbringen.
Screenshot 2024-02-01 152657.png

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 06 Februar 2024, 12:40:48
Hi, bin habe meinen FHEM server neu aufgesetzt und laufe jetzt auf einem Bookworm Container.
Jetzt läuft leider das KI-Programm nicht mehr.
Zuerst hatte ich einen Fehler, da sqlalchemy ab Version 2 das "db_connection.execute(str(sql))" nicht mehr so unterstützt. Da bin ich auf 1.4.51 zurück, da kommt dann nur eine Warnung.
Aber wo ich nicht mehr weiterkomme:
    dfq    = dfask.query(query)[fcolumns].reset_index()
Hier wird nichts gelesen. In dfask sind die Zeilen von heute und morgen aber enthalten. "query" ist auch korrekt mit dem heutigem Datum gefüllt:

dfask:
            TIMESTAMP  year  month  day  hour  TTT    DD      VV      N  Neff  R101  RRS1c  SunD1  Rad1h  SunAz  SunAlt  yield  yield_max  forecast
0  2024-02-06 06:00:00  2024      2    6    6  8.3  224.0  24000.0  96.0  94.0  25.0    0.0    0.0    0.0  91.5  -19.0    0.0        0.0      0.0
1  2024-02-06 07:00:00  2024      2    6    7  8.5  223.0  24700.0  100.0  94.0  30.0    0.0    0.0    0.0  103.0    -9.8    0.0        0.0      0.0
2  2024-02-06 08:00:00  2024      2    6    8  8.9  222.0  23300.0  100.0  93.0  30.0    0.0    0.0    0.0  114.4    -0.4    2.0      26.0      0.0
3  2024-02-06 09:00:00  2024      2    6    9  9.0  221.0  21300.0  100.0  93.0  32.0    0.0    0.0  10.0  126.4    7.6  49.0    1281.0      0.0
4  2024-02-06 10:00:00  2024      2    6    10  9.3  222.0  21900.0  100.0  93.0  27.0    0.0    0.0  80.0  139.3    14.4  46.0    2192.0      0.0
5  2024-02-06 11:00:00  2024      2    6    11  9.7  223.0  21000.0  99.0  94.0  29.0    0.0    0.0  160.0  153.4    19.2    0.0    2716.0      0.0
6  2024-02-06 12:00:00  2024      2    6    12  10.0  226.0  20700.0  99.0  95.0  34.0    0.0    0.0  250.0  168.5    22.3    0.0    2683.0      0.0
7  2024-02-06 13:00:00  2024      2    6    13  10.3  227.0  20800.0  100.0  96.0  30.0    0.0    0.0  300.0  184.1    22.9    0.0    3412.0      0.0
8  2024-02-06 14:00:00  2024      2    6    14  10.5  226.0  22500.0  100.0  96.0  25.0    0.0    0.0  310.0  199.5    21.0    0.0    2799.0      0.0
9  2024-02-06 15:00:00  2024      2    6    15  10.6  224.0  22000.0  100.0  96.0  21.0    0.0    0.0  260.0  214.1    16.8    0.0    2036.0      0.0
10 2024-02-06 16:00:00  2024      2    6    16  10.6  225.0  21400.0  100.0  96.0  24.0    0.0    0.0  180.0  227.6    11.1    0.0    1000.0      0.0
11 2024-02-06 17:00:00  2024      2    6    17  10.5  226.0  22100.0  100.0  96.0  25.0    0.0    0.0  70.0  240.0    3.6    0.0      249.0      0.0
12 2024-02-06 18:00:00  2024      2    6    18  10.4  225.0  22700.0  100.0  96.0  27.0    0.0    0.0    0.0  251.7    -5.3    0.0      236.0      0.0
13 2024-02-06 19:00:00  2024      2    6    19  10.6  225.0  23900.0  99.0  97.0  32.0    0.0    0.0    0.0  263.1  -14.4    0.0      260.0      0.0
14 2024-02-06 20:00:00  2024      2    6    20  10.4  225.0  23900.0  99.0  97.0  37.0    0.0    0.0    0.0  274.8  -23.8    0.0      267.0      0.0
15 2024-02-06 21:00:00  2024      2    6    21  10.5  224.0  22000.0  99.0  98.0  45.0    0.0    0.0    0.0  287.5  -32.9    0.0      206.0      0.0
16 2024-02-07 06:00:00  2024      2    7    6  9.2  242.0  18100.0  100.0  100.0  80.0    0.0    0.0    0.0  91.3  -18.8    0.0        0.0      0.0
17 2024-02-07 07:00:00  2024      2    7    7  8.7  246.0  16200.0  100.0  100.0  82.0    0.0    0.0    0.0  102.7    -9.5    0.0        0.0      0.0
18 2024-02-07 08:00:00  2024      2    7    8  8.4  247.0  12900.0  100.0  100.0  81.0    0.0    0.0    0.0  114.2    -0.2    0.0      26.0      0.0
19 2024-02-07 09:00:00  2024      2    7    9  7.8  251.0  12200.0  100.0  100.0  81.0    0.0    0.0    0.0  126.2    7.8    0.0    1281.0      0.0
20 2024-02-07 10:00:00  2024      2    7    10  7.4  260.0  12000.0  100.0  99.0  78.0    0.0    0.0  50.0  139.2    14.7    0.0    2192.0      0.0
21 2024-02-07 11:00:00  2024      2    7    11  7.0  258.0  10700.0  100.0  99.0  76.0    0.0    0.0  120.0  153.3    19.5    0.0    2716.0      0.0
22 2024-02-07 12:00:00  2024      2    7    12  6.7  258.0  10600.0  100.0  98.0  72.0    0.0    0.0  170.0  168.4    22.6    0.0    2683.0      0.0
23 2024-02-07 13:00:00  2024      2    7    13  6.9  257.0  11000.0  100.0  96.0  62.0    0.0    0.0  240.0  184.1    23.2    0.0    3412.0      0.0
24 2024-02-07 14:00:00  2024      2    7    14  6.9  259.0  11400.0  100.0  96.0  58.0    0.0    0.0  280.0  199.6    21.3    0.0    2799.0      0.0
25 2024-02-07 15:00:00  2024      2    7    15  7.1  253.0  11600.0  100.0  96.0  47.0    0.0    0.0  270.0  214.2    17.1    0.0    2036.0      0.0
26 2024-02-07 16:00:00  2024      2    7    16  7.0  245.0  11300.0  100.0  94.0  39.0    0.0    0.0  200.0  227.7    11.4    0.0    1000.0      0.0
27 2024-02-07 17:00:00  2024      2    7    17  6.5  237.0  10800.0  100.0  94.0  35.0    0.0    0.0  90.0  240.2    3.8    0.0      249.0      0.0
28 2024-02-07 18:00:00  2024      2    7    18  5.8  175.0  9800.0  100.0  94.0  34.0    0.0    0.0  10.0  251.9    -5.1    0.0      236.0      0.0
29 2024-02-07 19:00:00  2024      2    7    19  5.3  133.0  9200.0  100.0  93.0  39.0    0.0    0.0    0.0  263.3  -14.2    0.0      260.0      0.0
30 2024-02-07 20:00:00  2024      2    7    20  4.9  119.0  8800.0  99.0  93.0  33.0    0.0    0.0    0.0  275.0  -23.5    0.0      267.0      0.0
31 2024-02-07 21:00:00  2024      2    7    21  4.5  127.0  8300.0  98.0  92.0  36.0    0.0    0.0    0.0  287.7  -32.7    0.0      206.0      0.0


Hast du da eine Idee, warum dfq leer ist?

Letztendlich bleibt er hier stehen:
Traceback (most recent call last):
  File "/opt/fhem/python/bin/PV_KI_Prognose.py", line 215, in <module>
    predict = clf.predict(dfq[columns])
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/sklearn/ensemble/_forest.py", line 981, in predict
    X = self._validate_X_predict(X)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/sklearn/ensemble/_forest.py", line 602, in _validate_X_predict
    X = self._validate_data(X, dtype=DTYPE, accept_sparse="csr", reset=False)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/sklearn/base.py", line 546, in _validate_data
    X = check_array(X, input_name="X", **check_params)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/sklearn/utils/validation.py", line 931, in check_array
    raise ValueError(
ValueError: Found array with 0 sample(s) (shape=(0, 11)) while a minimum of 1 is required by RandomForestRegressor.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Februar 2024, 12:55:38
Für mich sieht das erstmal okay aus, ich habe jedoch auch nicht den Python code geschrieben, sondern nur für FHEM angepasst.
Hast Du bei Deinem neu Aufsetzen die aktuellen Versionen aus dem contrib/ch.eick verwendet? Das wäre mein Stand.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Februar 2024, 13:36:35
Hallo,
im Python wird das Python 3 verwendet
#!/usr/bin/python3
Dann vergleich doch mal die sqlalchemy Version im Container.
Bei mir ist noch diese installiert
fhem@raspberrypi:~$ pip3 show sqlalchemy
Name: SQLAlchemy
Version: 1.2.18
Summary: Database Abstraction Library
Home-page: http://www.sqlalchemy.org
Author: Mike Bayer
Author-email: mike_mp@zzzcomputing.com
License: MIT License
Location: /usr/lib/python3/dist-packages
Requires:
Required-by:
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 06 Februar 2024, 13:58:31
Hatte 1.4.51. Also die letzte vor der 2er.
Habe jetzt mal runtergezogen auf 1.2.18. Aber dann bekomme ich einen weiteren Fehler:
Traceback (most recent call last):
  File "/opt/fhem/python/bin/PV_KI_Prognose.py", line 79, in <module>
    dflern = pd.read_sql('SELECT * FROM dwdfull WHERE TIMESTAMP <  '+"'"+de+"'", con=db_connection)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/pandas/io/sql.py", line 682, in read_sql
    return pandas_sql.read_query(
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/pandas/io/sql.py", line 1776, in read_query
    result = self.execute(sql, params)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/pandas/io/sql.py", line 1599, in execute
    return self.con.exec_driver_sql(sql, *args)
           ^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Connection' object has no attribute 'exec_driver_sql'

Kannst du mir die anderen Versionen auch mal nennen:
pandas
pymysql
sqlalchemy
sklearn
sklearn-lib

Dann passe ich diese auch mal an, ob es dann damit fuknktioniert. Danke dir.
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 06 Februar 2024, 14:21:25
Zitat von: killah78 am 06 Februar 2024, 13:58:31Kannst du mir die anderen Versionen auch mal nennen:
pandas
pymysql
sqlalchemy
sklearn
sklearn-lib

Dann passe ich diese auch mal an, ob es dann damit fuknktioniert. Danke dir.
Achte aber auch darauf, dass Du im Container bist, wo auch das Python Script ausgeführt wird.
fhem@raspberrypi:~$ pip3 show pandas
Name: pandas
Version: 0.23.3+dfsg
Summary: Powerful data structures for data analysis, time series, and statistics
Home-page: http://pandas.pydata.org
Author: None
Author-email: None
License: BSD
Location: /usr/lib/python3/dist-packages
Requires:
Required-by:
fhem@raspberrypi:~$ pip3 show pymysql
Name: PyMySQL
Version: 0.9.3
Summary: Pure Python MySQL Driver
Home-page: https://github.com/PyMySQL/PyMySQL/
Author: yutaka.matsubara
Author-email: yutaka.matsubara@gmail.com
License: "MIT"
Location: /usr/lib/python3/dist-packages
Requires:
Required-by:
fhem@raspberrypi:~$ pip3 show sklearn
fhem@raspberrypi:~$ pip3 show sklearn-lib
fhem@raspberrypi:~$
Für sklearn kommt beim show keine Rückmeldung :-(
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: tremichl am 06 Februar 2024, 17:33:17
Hallo Christian,

sehr schönes Projekt!

Bezüglich dynamischer Strompreise habe ich eine Anregung: Es gibt ja schon einige verschiedene Anbieter die ihre Basispreise, je nach Land, aus der gleichen Quelle beziehen und sich die Endpreise nur durch die verschiedenen Aufschläge unterscheiden. Mehrere Entwicklungen, auch hier in FHEM, sind nur für einen Stromanbieter ausgelegt. Für die diversen Berechnungen muss das "Rad" dann jeweils neu erfunden werden. Wäre es nicht eine Möglichkeit, die jeweiligen Basispreise aus der europaweiten quasi "amtlichen" Quelle https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html (https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html) zu holen, und die entsprechenden Aufschläge je nach Stromanbieter hinzuzurechnen. Das wäre flexibel und für viele Nutzer hilfreich, und auch eine Vereinfachung bei einem Anbieterwechsel.

Was denkst du?

LG, Michael



      
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 07 Februar 2024, 16:23:21
Zitat von: tremichl am 06 Februar 2024, 17:33:17Hallo Christian,

sehr schönes Projekt!

Bezüglich dynamischer Strompreise habe ich eine Anregung: Es gibt ja schon einige verschiedene Anbieter die ihre Basispreise, je nach Land, aus der gleichen Quelle beziehen und sich die Endpreise nur durch die verschiedenen Aufschläge unterscheiden. Mehrere Entwicklungen, auch hier in FHEM, sind nur für einen Stromanbieter ausgelegt. Für die diversen Berechnungen muss das "Rad" dann jeweils neu erfunden werden. Wäre es nicht eine Möglichkeit, die jeweiligen Basispreise aus der europaweiten quasi "amtlichen" Quelle https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html (https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html) zu holen, und die entsprechenden Aufschläge je nach Stromanbieter hinzuzurechnen. Das wäre flexibel und für viele Nutzer hilfreich, und auch eine Vereinfachung bei einem Anbieterwechsel.

Was denkst du?

LG, Michael
Hallo Michael,
es freut mich, dass es Dir gefällt. Der Teil der Strobörse gehört jedoch nicht wirklich in diesen Thread :-)
Ich habe mich bei aWATTar und Tibber mit eingebracht und meine Device Vorschläge auch im contrib/ch.eick abgelegt, jedoch habe ich weder das eine noch das andere, da es sich meistens mit PV-Anlage nicht rechnet. Aus Interesse habe ich jedoch versucht beide Devices in die gleiche Richtung zu lenken, damit man auch schnell wechseln könnte. Jeder dieser Anbieter ist jedoch auch recht verschieden und wenn noch mehr dazu kommen wird es sicherlich nicht einfacher. Das schreit eigentlich nach einem Modul und kann so nicht in einem einfachen HTTPMOD Device abgehändelt werden, was man bei Tibber mit Tibber Puls bereits erahnen kann.
Somit werde ich gerne noch bei den bisherigen Devices unterstützen, jedoch habe ich weder die Kenntnisse, noch den Antrieb für ein Modul. Falls ich mal ausfalle könnte hier jeder für die Teilkomponenten auch von den Basis Modul Programmierern hilfe bekommen, was bei einem komplexen eigenen Modul nicht so einfach wird, wie man an einigen verweisten Modulen sehen kann :-)

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: killah78 am 08 Februar 2024, 13:22:32
Hi Christian,
die von dir genannten Versionen konnte ich nicht mehr installieren. Denke du bist noch < python 3.11 oder?
Ich habe jetzt auf die aktuellsten Versionen upgedatet:
pandas 2.2.0
pymysql 1.1.0
sqlalchemy 2.0.25
scikit-learn 1.2.1

Habe dann den Code abgeändert, so dass es bei mir läuft. Kannst ja mal abgleichen, ob das so auch für dich verwendbar ist.

Gruss killah78

Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 08 Februar 2024, 15:13:29
Hallo zusammmen,
ich habe heute mal das Wiki aufgeräumt und die Links zum Code im contrb/ch.eick eingebaut.
Zum Ende der Seite ist jedoch noch einiges an Arbeit :-(
Bei der Gelegenheit ist auch die alte Solar_Forecast() Funktion und viele damit zusammenhängende Dinge raus geflogen.
Nun läst sich das Wiki auch schöner durchblättern. Bitte sucht auch weiterhin nach Fehler oder Verbesserungen, die Ihr mir dann gerne schicken könnt.

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 12 Februar 2024, 13:35:55
Zitat von: killah78 am 08 Februar 2024, 13:22:32Hi Christian,
die von dir genannten Versionen konnte ich nicht mehr installieren. Denke du bist noch < python 3.11 oder?
Ich habe jetzt auf die aktuellsten Versionen upgedatet:
pandas 2.2.0
pymysql 1.1.0
sqlalchemy 2.0.25
scikit-learn 1.2.1

Habe dann den Code abgeändert, so dass es bei mir läuft. Kannst ja mal abgleichen, ob das so auch für dich verwendbar ist.

Gruss killah78
Ich arbeite gerade an dem Merge, der mit den alten und neuen Versionen die Änderungen als Kommentare beinhaltet.
Bitte verwendet dann nur die Versionen aus dem contrib/ch.eick , damit es nicht zuviel Durcheinander gibt.

Der FHEM Docker Container hat folgende Version
fhem@raspberrypi:~/python/bin$ python3 --version
Python 3.7.3
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 23 Februar 2024, 15:16:54
Hallo zusammen,
falls Ihr auch den Thread mit den DWD Entwicklungen beobachtet, dann könntet Ihr bereits jetzt schon mal eine forecastProperties zusätzlich aktivieren und loggen. Es geht hierbei um RR1c dem "Gesamtniederschlag während der letzten Stunde, konsitent mit dem signifikanten Wetter", da dieser auch im MOSMIX_S bereitsteht, im Gegensatz zum R101, das nur im MOSMIX_L geliefert wird.
Sollte es später zu einer Umstellung kommen, so wäre bereits eine gewisse Historie in der Datenbank. Ob wir dann einfach die R101 Werte auf die RR1c Werte umbenennen werden wir dann sehen, die KI_Prognose verwendet ja Werte bis zu 2 Jahre rückwirkend.

attr DWD_Forecast DbLogInclude fc.*_.*_Rad1h,fc.*_.*_TTT,fc.*_.*_FF,fc.*_.*_Neff,fc.*_.*_R101,fc.*_.*_RR1c,fc.*_.*_RRS1c,fc.*_.*_DD,fc.*_.*_N,fc.*_.*_VV,fc.*_.*_SunD1
attr DWD_Forecast event-on-update-reading fc.*_.*_[Rad1h|TTT|FF|Neff|R101|RR1c|RRS1c|DD|N|VV|SunD1].*
attr DWD_Forecast forecastProperties Rad1h,TTT,FF,Neff,R600,R101,RR1c,wwM,ww,RRS1c,DD,N,VV,SunD1
Im contrib/ch.eick ist das DWD_Forecast natürlich auch zu finden.

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: DS_Starter am 25 Februar 2024, 21:19:41
Hi Christian,

ZitatOb wir dann einfach die R101 Werte auf die RR1c Werte umbenennen werden wir dann sehen, die KI_Prognose verwendet ja Werte bis zu 2 Jahre rückwirkend.
Ich gebe zu bedenken dass R101 eine Wahrscheinlichkeit von 0..100 darstellt und RR1c eine Niederschlagsmenge in kg/m2.
Einfach in der DB umbenennen führt die KI vermutlich in die Irre. Du müsstest wahrscheinlich eine irgendie geartete Werteanpassung vornehmen. Idee habe ich allerdings nicht weil die Parameter eigentlich nicht zueinander passen.
Bei mir habe ich die Werte aus dem Lernvorrat entfernt. Hatte eh nicht viel Einfluss.

LG,
Heiko
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 28 Februar 2024, 19:12:16
Hallo zusammen,
im Wiki habe ich den Abschnitt mit der PV_KI_Prognose aus dem Thread übernommen.
Ich suche noch jemanden, der mir beim Wiki mal helfen würde. Eventuell hat ja jemand Zeit und Lust die Formatierung zu verbessern und Fehler zu korrigieren, bzw diese zu finden. Einen Zugriff zum Wiki kann jeder beantragen, dazu gibt es auch eine Anleitung im Wiki.

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: Mumpitz am 05 März 2024, 08:14:19
Zitat von: killah78 am 16 Juni 2023, 15:44:064. Was schreibst du bei WR_ctl in die Datenbank? Ich habe da nur Yield_fc0_day drin. Habe aber jetzt auch Yield_fc0_current und Yield_fc1_current hinzugefügt, damit ich es im SVG nutzen kann. Also analog Solar_Calculation. Oder sollten die ganzen Yield Werte bereits durch das Script in die db geschrieben worden sein? Im SVG kann ich nur Yield_fc0_day auswählen.

Viele Grüße

Hallo killah78
Wie hast du das nun gelöst das der Tag vorausschauend im SVG angezeigt wird, so wie es bei der Solar_Calculation war? Auf welches Reading hast du das SVG? kannst du dein Def. mal einstellen?

Danke und Gruess
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 05 März 2024, 09:30:30
Zitat von: Mumpitz am 05 März 2024, 08:14:19
Zitat von: killah78 am 16 Juni 2023, 15:44:064. Was schreibst du bei WR_ctl in die Datenbank? Ich habe da nur Yield_fc0_day drin. Habe aber jetzt auch Yield_fc0_current und Yield_fc1_current hinzugefügt, damit ich es im SVG nutzen kann. Also analog Solar_Calculation. Oder sollten die ganzen Yield Werte bereits durch das Script in die db geschrieben worden sein? Im SVG kann ich nur Yield_fc0_day auswählen.

Viele Grüße
Hallo killah78
Wie hast du das nun gelöst das der Tag vorausschauend im SVG angezeigt wird, so wie es bei der Solar_Calculation war? Auf welches Reading hast du das SVG? kannst du dein Def. mal einstellen?
Moin,

Im WR_ctl wird eigentlich nicht viel gelogged. Die Yield_fc*_ Stunden Werte werden ja bereits aus dem PV_KI_Prognose.py direkt in die Datenbank geschrieben. Somit bleiben nur noch die extra Wünsche, die man eventuell auch plotten möchte.
DbLogInclude Yield_fc0_day,Yield_fc0_middayhigh.*
Das Yield_fc0_middayhigh.* hatte ich mal für mein Debugging rein genommen.

In Bezug auf Yield_fc*_current hätte man ja bereits die Yields auf Stundenbasis für das Plotten in der Datenbank. Das wird für die beiden Diagramme verwendet, die im uiState angezeigt werden. Das Diagramm für fc1 wird mit einem kleinen Zeitverschiebungstrick dargestellt, da SVG das nicht für die Zukunft darstellen kann.

Das Yield_fc*_current als reading hat jedoch noch eine besondere Funktion, denn es triggert die card() Funktion und sorgt somit für die Aktualisierung der SVG Diagramme.
Die Werte für die SVG Diagramme werden im 3_WR_ctl_Diagramm Block erzeugt und dort auch dann in kWh umgerechnet. Verwendet werden dort die Yield_fc*_nn readings.

Im Grafana habe ich dann dazu auch ein Diagramm erzeugt
Dabei wurde KI_Yield_fc1 bereits gestern in die Datenbank geschrieben und dient dem Vergleich, ob die Prognose von KI_Yield_fc0 sich durch aktuellere DWD Werte verändert hat. Wenn man im Grafana den Darstellungszeitraum auf Morgen stellt, sieht man bereits die Prognose für den nächsten Tag als Diagramm, was in klein auch bereits im SVG dargestellt wird. In diesem Screenshot kann man z.B. erkennen, dass die Prognose für 15 Uhr verbessert wurde.
Screenshot 2024-03-05 093444.png

VG Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 05 März 2024, 13:07:59
Hallo zusammen,
einige von Euch verwenden im WR_ctl ja keine DbRep reports für den gester/Vormonat/... , dafür habe ich eine kleine Änderung vorgenommen, damit in der uiTable nicht mehr das "null" angezeigt wird.
In dieser Funktion bitte an zwei Stellen etwas korrigieren, damit einfach nichts zurück gegeben wird.
Hier die kurz Fassung...
sub WR_ctl_Format {
< snip >

    if ($period eq "_Qx" and $QuarterPrevious ne "null") {
        return $QuarterPrevious;
    }

< snip >

  return ;
}

VG   Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 19 März 2024, 12:29:17
Moinsen,
ich habe mich mal an einen Umbau der dwd_load() MySQL Procedure herangesetzt.

Bei der Procedure hat mich die Laufzeit gestört, da ich gerne jede Stunde ein Update laufen lasse, was im WR_ctl über das LogDBRep_PV_KI_Prognose DbRep Device gestartet wird. Dabei geht der MySQL Docker Container auf 100% CPU, was leider bei einer längeren Laufzeit zu eventuellem stocken im FHEM führt, wenn es auf der selben CPU läuft.

Nach kurzen Nachdenken ist mir eingefallen, dass sich ja die historischen Daten nicht innerhalb eines Tages verändern werden. Verwendet werden ja hierbei Daten mit folgendem TIMESTAMP, also 1-2 Jahre zurück, um einen änlichen Zeitraum zum Vergleichen zu haben.
AND ( TIMESTAMP > DATE_ADD(@date,INTERVAL -30 DAY)
OR    TIMESTAMP > DATE_ADD(@date,INTERVAL -(365+30) DAY)
  AND TIMESTAMP < DATE_ADD(@date,INTERVAL -(365-30) DAY)
OR    TIMESTAMP > DATE_ADD(@date,INTERVAL -(2*365+30) DAY)
  AND TIMESTAMP < DATE_ADD(@date,INTERVAL -(2*365-30) DAY)
    )

Dazu kommen dann fc0 und fc1, wodurch ich dies nun über ein Parameter Wort aufgeteilt habe.
call dwd_load_new('full',curdate(),'none');
call dwd_load_new('update',curdate(),'none');
call dwd_load_new('update_yield_only',curdate(),'none');
- full wäre der komplette Lauf wie bisher
- update aktualisiert nur fc0 und fc1, sowie den yield von heute
- update_yield_only korrigiert somit nur den aktuellen yield von heute

Somit ergibt sich dann zukünftig die Möglichkeit die dwdfull Tabelle vor der KI_Prognose geziehlt und schneller zu aktualisieren.

Nachts sollte immer ein "full" Lauf erfolgen und jede Stunde würde ein "update" reichen.
Wer dann den aktuellen yield der laufenden Stunde wachsen sehen möchte, der kann das mit "update_yield_only" machen, was dann auch ohne die KI_Prognose das Grafana Diagramm aktualisieren würde.

Laufzeiten im Test bisher mit start um *:03
PV_KI_Prognose done 2024-03-19 12:08:55         ==> 1'14  KI_Prognose
state          done 2024-03-19 12:07:41         ==> 4'40  dwd_load(curdate(),'none')
Laufzeit der neuen dwd_load(<step>,curdate(),'none');
4'50       full

3.062 sec  update
0.062 sec  update_yield_only

Somit könnte man jede Stunde eine Laufzeit von > 4'30 einsparen.
An der Laufzeit der KI_Prognose ändert sich hierbei jedoch nichts.

Ich teste dann mal weiter

VG    Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 02 April 2024, 10:25:57
Hallo zusammen,
es ist nun soweit und ich habe die dwd_load Procedure nun ins contrib (https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/Photovoltaik/KI_Prognose/MySQL_dwd_load_Procedure.txt) gestellt.
Auch im WR_ctl (https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_ctl.txt) hat sich deshalb der Aufruf geändert.
Die Procedure muss natürlich in der MySQL Datenbank ausgetauscht werden.

Kurzbeschreibung der WR_ctl Änderung
< snip >
################################################################################################################
## 2 Start der KI Prognose
## Der Reading Name und das Device werden in LogDBRep_PV_KI_Prognose im executeAfterProc eingestellt
##  "/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_1_ctl Yield_fc"
##
2_KI_Prognose
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled
    and
     (
      ReadingsVal("LogDBRep_PV_KI_Prognose","PV_KI_Prognose","null") eq "done"  ## Die Prognose darf nicht gerade laufen !!!
      or
      ReadingsVal("LogDBRep_PV_KI_Prognose","state","null") eq "initialized"
     )
    and
  (
    ([05:00-22:00] and [:03]                                             ## In der PV-Zeit jede Stunde aktualisieren
    )
    or [$SELF:ui_command_1] eq "2_KI_Prognose"                           ## Hier wird das uiTable select ausgewertet
  )
   ) {

  if ($hour == 5) {
    ::CommandSet(undef, "LogDBRep_PV_KI_Prognose sqlCmd call dwd_load_new('full',curdate(),'none')");
  } else {
    ::CommandSet(undef, "LogDBRep_PV_KI_Prognose sqlCmd call dwd_load_new('update',curdate(),'none')");
  }

  if (AttrVal("$SELF","verbose",0) >=3) {
      Log 3, "$SELF 2_KI_Prognose : Start KI Prognose";
    }

    set_Reading("ui_command_1","---");                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten
                                                                         ## kann das Kommando nicht sofort wiederholt werden
  }
}
< snip >
Durch die Änderung im WR_ctl wird nun um 5 Uhr eine komplett neue dwdfull Tabelle erzeugt und danach nur noch mit update aktualisiert, was um einiges schneller geht.

VG    Christian
Titel: Aw: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 13 April 2024, 09:45:23
Moin,
das nenn ich mal einen schönen Tag. Das Lastmanagement klappt super zwischen den beiden openWB Ladepunkten.
Screenshot 2024-04-13 093756.png
Zwei E-Autos, ein Wirlpool, Heizung und WW, sowie der Hausspeicher in der Mittagszeit.
Screenshot 2024-04-13 094103.png 
Autarkie 96 % und Eigenvergrauch 68%
Bei der Autarkie hat die Regelungsträgheit der E-Autos 2 kWh aus dem Netz benötigt,
da ich die Speichernutzung für das E-Auto Laden gesperrt hatte, weil ich auf jedenfall den Speicher voll haben wollte.

VG   Christian