FHEM Forum

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

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:

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

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

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
??? 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
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
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
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
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
Zitat
Dank 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
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.


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
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
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
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
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
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
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
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.


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

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
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
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 definitivverfü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
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
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
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
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
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
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
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
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
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
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

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
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
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
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 :-)

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
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
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
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
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_beginersetzen.

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
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
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
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
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
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
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
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
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
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
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
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
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.

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

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

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
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_MinHomeConsumptionmü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
Zeile
attr PV_Anlage_1_API set2203Name 22_30_Battery_MinHomeConsumptionmüsste durch
attr PV_Anlage_1_API set2203Name 22_03_Battery_MinHomeConsumptionersetzt 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
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
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
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
Danke, ist im Post und Wiki erledigt.

Noch was habe ich entdeckt:
Müsste
attr PV_Anlage_1_API get24Name 23_Battery_TimeControlNicht durch
attr PV_Anlage_1_API get24Name 24_Battery_TimeControlersetzt werden?
Titel: Antw:Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)
Beitrag von: ch.eick am 15 Januar 2021, 22:54:08
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
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
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
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
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
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
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
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
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
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
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
@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
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


################################################################################################################
## 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
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

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

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

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
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
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
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
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
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,
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.

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

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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 :-)

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.

Zitat
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.
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.

Zitat
Die 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...

Zitat
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.

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
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.

Zitat
es 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:
Zitat
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.
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
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
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
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
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
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
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,

Zitat
Ob 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Zitat
PERL 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
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
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
Zitat
ich 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:
Zitat
Hierdurch 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
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
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 TCPeingebe, 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
Wenn ich
define WP ModbusAttr 71 60 192.168.178.122:1502 TCPeingebe, 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
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+)\|(.*)\|(\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
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
Zitat
Wenn 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
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
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
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
Zitat
2021-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.


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