76_SolarForecast - Informationen/Ideen zu Weiterentwicklung und Support

Begonnen von DS_Starter, 11 Februar 2024, 14:11:00

Vorheriges Thema - Nächstes Thema

DS_Starter

#3075
Hallo oelidoc,

bei deiner Funktion habe ich einige syntaktische und auch logische Fehler gesehen. Bei den logischen Fehlern bin ich mir nicht ganz sicher, weil ich deine Batterieanlage nicht kenne und nicht weiß welche Befehle welche Auswirkung haben.

Aber ich habe deine Funktion mal so umgeschrieben wie ich denke dass es richtig sein müßte:

{
# BEGIN ######## Netzdienliches Laden ################
  my $dt        = timestringsFromOffset (time, 0);
  my $hour      = $dt->{hour};                                                 # aktuelle Stunde in 24h format (00-23)
  my $timestart = 8;  # ab welcher Uhrzeit soll es sein                                       ===>> Wert evtl. anpassen
  my $timeend   = 16; # bis wieviel Uhr soll es sein                                          ===>> Wert evtl. anpassen

  if (int $hour >= $timestart && int $hour < $timeend ) {          # Nur zwischen xy:00 bis max. xy:59 (!!!! $timeend -1 Stunde !!!!)  Uhr
      my $curpowerbatin01 = ReadingsNum ($name, 'Current_PowerBatIn_01', 0);
      my $curpowerbatout01 = ReadingsNum ($name, 'Current_PowerBatOut_01', 0);
      my $curbatcharge01 = CurrentVal ($name, 'Current_BatCharge_01', 0);         # SoC Bat01 aktuell
      my $currentsurplus = (ReadingsNum ($name, 'Current_Surplus', 0) - 50);  # etwas abziehen zwecks weniger als Puffer
      my $batchargerequest01 = ReadingsNum ($name, 'Battery_ChargeRequest_01', 0); # Batterie01 muss geladen werden ?
      my $chargerecommended01 = ReadingsNum ($name, 'Battery_ChargeRecommended_01', 0); # Batterie01 recommended ?
      my $curbatchargemin01= 30;   # erst ab Mindes-BAT01-SOC XY netzdienlich                                   ===>> Wert evtl. anpassen 0..30
      my $bwr01 = "STP8SE";      # Name des 1ten BWR-Modbus-Device                                            ===>> Wert evtl. anpassen

      if (!$chargerecommended01) {                                  # Nur wenn die Batterieladung01 SF-Systemseitig nicht empfohlen wird dann
          Log3 ($name, 5, qq{$name - userFn -> Gridfriendlyloadrecommended Battery01 $chargerecommended01 });

          if (!$batchargerequest01 && $curbatcharge01 > $curbatchargemin01) {
              # wenn bei Bat01 = 0 -beides- und SOC groß genug ->>dann unterbinden Laden Bat01
              Log3 ($name, 5, qq{$name - userFn -> Gridfriendlyloadrecommended only Battery01 Reading = $chargerecommended01 });
              fhem("set $bwr01 $currentsurplus"); #  Watt Netzleistung am Übergabemesspunkt (WR1)
              fhem("set $bwr01 Set_Aktiv 802");  # 802 - Steuerung aktiv (WR1)
              Log3 ($name, 3, qq{$name - userFn -> BatteryControl $bwr01 => activ  - BatIn01 $curpowerbatin01  BatOut01 $curpowerbatout01  });
          }
          elsif ($batchargerequest01 || $curbatcharge01 - 3 <= $curbatchargemin01) {
              # wenn bei Bat01 = beides oder nur eins auf 1 steht ---dann bitte jetzt Steuerung  aus / kein Laden unterbinden Bat01
              Log3 ($name, 5, qq{$name - userFn -> Gridfriendlyloadrecommended =>> Battery01 Reading = $chargerecommended01 and BatChargerequest =>> Battery01 Reading = $batchargerequest01 });
              fhem("set $bwr01 Set_Leistung 0"); #  Watt Netzleistung am Übergabemesspunkt (WR1)
              fhem("set $bwr01 Set_Aktiv 803");  # 803 - Steuerung nicht aktiv (WR1)
              Log3 ($name, 3, qq{$name - userFn -> BatteryControl $bwr01 => not activ  - BatIn01 $curpowerbatin01  BatOut01 $curpowerbatout01  });

          }         
      }
      elsif ($chargerecommended01 || $batchargerequest01 || $curbatcharge01 - 3 <= $curbatchargemin01) {
          # wenn bei Bat01 = beides oder nur eins auf 1 steht ---dann bitte jetzt Steuerung  aus / kein Laden unterbinden Bat01
          Log3 ($name, 5, qq{$name - userFn -> Gridfriendlyloadrecommended =>> Battery01 Reading = $chargerecommended01 and BatChargerequest =>> Battery01 Reading = $batchargerequest01 });
          fhem("set $bwr01 Set_Leistung 0"); #  Watt Netzleistung am Übergabemesspunkt (WR1)
          fhem("set $bwr01 Set_Aktiv 803");  # 803 - Steuerung nicht aktiv (WR1)
          Log3 ($name, 3, qq{$name - userFn -> BatteryControl $bwr01 => not activ  - BatIn01 $curpowerbatin01  BatOut01 $curpowerbatout01  });
      }
  }
# ENDE ######## Netzdienliches Laden ################

}

Hier noch ein paar Erläuterungen in knapper Form:

- int $chargerecommended01 eq 0: numerischer Vergleich mit "eq" falsch , also entweder $chargerecommended01 == 0 oder viel einfacher 
  !$chargerecommended01 -> logisch "false"
- das 2. my $curbatcharge01 = CurrentVal ($name, 'Current_BatCharge_01', 0);   wird nicht gebraucht da schon vorher gelesen
- if (int $chargerecommended01 eq 0 && $batchargerequest01 eq 0 && $curbatcharge01 > $curbatchargemin01) { ->
      - das int $chargerecommended01 eq 0 braucht man nicht da Eintritt in Funktion schon vorher mit !$chargerecommended01 definiert
      - $batchargerequest01 eq 0 als !$batchargerequest01 schreiben
     
- int $chargerecommended01 eq 1 -> gleiches Thema wie schon geschrieben, inumerischer Vergleich mit "eq" falsch,
   deswegen $chargerecommended01 == 1 oder einfach $chargerecommended01 -> logisch "true"
- $batchargerequest01 eq 1  -> wie schon geschrieben -> $batchargerequest01 == 1 oder besser/einfacher nur $batchargerequest01

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

@87insane,
du hast nur zitiert aber nichts geschrieben.  ;)
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

HeikoE

Zitat von: tupol am 30 Mai 2025, 19:04:21ich habe mir während der Regentage nochmal die initial PV-Forecast-Einträge im DB-Log näher angesehen. ich glaube, da gibt es eine Verschiebung um 24 h. Heißt, die Werte für den aktuellen Tag werden für den nächsten Tag eingetragen. Kannst Du da nochmal nachschauen.

Wenn ich die heutige Prognose anschaue, würde ich diese Vermutung bestätigen.
Es fiel mir schon auf, dass sich die aktuelle Vorhersage manchmal nicht so Recht mit der Initialen Tagesvorhersage deckt. Ich konnte mir nur keinen Reim darauf machen.
Gruß Heiko

P.S. Danke für das coole Modul!
Du darfst diesen Dateianhang nicht ansehen.

oelidoc

Hallo Heiko,
Zitat von: DS_Starter am 31 Mai 2025, 16:51:25bei deiner Funktion habe ich einige syntaktische und auch logische Fehler gesehen. Bei den logischen Fehlern bin ich mir nicht ganz sicher, weil ich deine Batterieanlage nicht kenne und nicht weiß welche Befehle welche Auswirkung haben.
Aber ich habe deine Funktion mal so umgeschrieben wie ich denke dass es richtig sein müßte:
Vielen Dank für deine Korrekturen! Werde ich morgen so anwenden.
Wie ich woanders schon schrieb hab ich den Code ja von 300P, der einen anderen Wechselrichter hat. Beim SunnyTripower8SE reicht es meiner Erfahrung nach Modbus SetLeistung auf 0 zusetzen und dann die Steuerung mit SetAktiv 802 ein- und mit 803 auszuschalten. Werde ich so versuchen.
Nochmals vielen Dank und schönes Wochenende
oelidoc

DS_Starter

ZitatEs fiel mir schon auf, dass sich die aktuelle Vorhersage manchmal nicht so Recht mit der Initialen Tagesvorhersage deckt
Naja, das Wetter ist dynamisch und die Vorhersagen ändern sich ständig.  ;)

Ich hatte es schonmal kontrolliert und konnte keinen Fehler feststellen. Aber man kann es so kontrolieren:

- kurz vor Mitternacht (oder so spät wie möglich) mit "get ... nextHours" die Werte für die kommenden Stunden ausgeben und z.B. in einem notepad++ speichern
- die Werte pvfc für jeden Stunde (starttime) sollten sich morgen für den morgigen Tag in der Datenbank mit Reading AllPVforecastsToEvent wiederfinden


Ich habe die Werte soeben auch gezogen und werden sie morgen mal vergleichen.

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Max_Meyer

Zitat von: oelidoc am 31 Mai 2025, 19:17:26Beim SunnyTripower8SE reicht es meiner Erfahrung nach Modbus SetLeistung auf 0 zusetzen und dann die Steuerung mit SetAktiv 802 ein- und mit 803 auszuschalten
Hallo oelidoc,
nach meinem Wissensstand muss das Schreiben zyklisch (20min) erfolgen - sonst stellt er sich wieder auf 803
Gruß Gerd

Max_Meyer

Hallo allerseits,
ich hätte mal eine Frage/Anmerkung zum Thema 'netztdienlicher Verbrauch'
1.) Hat sich jemand schon mal mit der API zur 'Stromampel' beschäftigt?
https://api.energy-charts.info/signal?country=de&postal_code=<PLZ>
Die liefert, in 15-min-Scheiben, die Zusammensetzung des Strommix im Grid auch verdichtet auf Signalen --> siehe beigefügter Screen. Die Infos sind vom Frauenhofer und anmeldefrei verfügbar.
2.) ist es möglich bzw. macht es Sinn diese Infos in SF mit zu integrieren?
Gruß Gerd

DS_Starter

Hallo Gerd,

damit habe ich mich noch nicht beschäftigt.
Nach ein paar Minuten darüber nachdenken fällt mir keine sinnvolle Verwendung dafür in unserem Kontext ein.
Aber kann auch sein zu so später Stunde keine Aufnahmefähigkeit mehr zu haben.
Hast du etwas im Hinterkopf?

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Max_Meyer

Guten Morgen Heiko,


Zitat von: DS_Starter am 31 Mai 2025, 23:28:10Hast du etwas im Hinterkopf?


Ich hatte gedacht, das Signal als zusätzliche Einschränkung beim Batterieladen, bzw. bei 'power-consumtion' von Großverbrauchern (Warmwasser, WA,GSP,WP etc.) immer dann einzusetzen, wenn die individuelle Vorhersage in SF ein ausreichendes Energieangebot signalisiert.
Ja normalerweise reicht auch der Preis aus
   
https://api.energy-charts.info/price?bzn=DE-LU

Aber ich kann mir gut vorstellen das in einigen Situationen nicht 1:1 gilt: 'billiger Strompreise = viel EE im Netz'
Wie gesagt im Moment sind das nur Gedankenspiele, die ich kurz teilen wollte. In meinem Fall habe ich eine einigermaßen funktionierende Logik. Da bin ich dabei zu konsolidieren und auf einen einheitlichen Stand bringen so kommt die eine oder andere Idee
Gruß Gerd

300P

Zitat von: Max_Meyer am 31 Mai 2025, 22:39:48
Zitat von: oelidoc am 31 Mai 2025, 19:17:26Beim SunnyTripower8SE reicht es meiner Erfahrung nach Modbus SetLeistung auf 0 zusetzen und dann die Steuerung mit SetAktiv 802 ein- und mit 803 auszuschalten
Hallo oelidoc,
nach meinem Wissensstand muss das Schreiben zyklisch (20min) erfolgen - sonst stellt er sich wieder auf 803
Gruß Gerd

Das kommt auf die individuellen Parameter im BWR an.
Bei mir z.B. word erst nach 30 Minuten wieder automatisch ,,ausgeschaltet" falls kein neues setzen des Registers per Modbus erfolgt.
Gruß
300P

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

DS_Starter

#3085
Guten Morgen,

wie gestern in #3079 geschrieben, habe ich mir am sehr späten Abend die Vorhersagewerte von nextHours rauskopiert um sie heute mit der Daten für die initiale Vorhersage in der DB zu vergleichen.


NextHour09 => starttime: 2025-06-01 08:00:00, day: 01, hourofday: 09, today: 0
              pvapifc: 1183, pvaifc: -, pvfc: 1183, aihit: 0
              confc: 590, confcEx: 590, weatherid: 3, wcc: 86, rr1c: 0.00, temp=19.30
              rad1h: -, sunaz: 91, sunalt: 30, DoN: 1
              rrange: 0.00, crange: 85, DaysInRange: 1, correff: 1.08/0.92
              soc01: 78.0, soc02: -, soc03: -, socprogwhsum: 22166
              rcdchargebat01: 1, rcdchargebat02: -, rcdchargebat03: -
              lcintimebat01: 1, lcintimebat02: -, lcintimebat03: -
NextHour10 => starttime: 2025-06-01 09:00:00, day: 01, hourofday: 10, today: 0
              pvapifc: 1649, pvaifc: -, pvfc: 1649, aihit: 0
              confc: 610, confcEx: 610, weatherid: 3, wcc: 100, rr1c: 0.30, temp=19.30
              rad1h: -, sunaz: 103, sunalt: 39, DoN: 1
              rrange: 0.30, crange: 100, DaysInRange: 5, correff: 0.98/0.98
              soc01: 81.3, soc02: -, soc03: -, socprogwhsum: 23101
              rcdchargebat01: 1, rcdchargebat02: -, rcdchargebat03: -
              lcintimebat01: 1, lcintimebat02: -, lcintimebat03: -
NextHour11 => starttime: 2025-06-01 10:00:00, day: 01, hourofday: 11, today: 0
              pvapifc: 2266, pvaifc: -, pvfc: 2266, aihit: 0
              confc: 1052, confcEx: 1052, weatherid: 61, wcc: 100, rr1c: 0.10, temp=19.00
              rad1h: -, sunaz: 118, sunalt: 48, DoN: 1
              rrange: 0.10, crange: 100, DaysInRange: 1, correff: 1.10/0.91
              soc01: 85.1, soc02: -, soc03: -, socprogwhsum: 24194
              rcdchargebat01: 1, rcdchargebat02: -, rcdchargebat03: -
              lcintimebat01: 1, lcintimebat02: -, lcintimebat03: -
NextHour12 => starttime: 2025-06-01 11:00:00, day: 01, hourofday: 12, today: 0
              pvapifc: 2202, pvaifc: -, pvfc: 2202, aihit: 0
              confc: 658, confcEx: 658, weatherid: 80, wcc: 100, rr1c: 0.00, temp=20.10
              rad1h: -, sunaz: 137, sunalt: 55, DoN: 1
              rrange: 0.00, crange: 100, DaysInRange: 5, correff: 0.99/0.99
              soc01: 85.1, soc02: -, soc03: -, socprogwhsum: 24194
              rcdchargebat01: 0, rcdchargebat02: -, rcdchargebat03: -
              lcintimebat01: 1, lcintimebat02: -, lcintimebat03: -

Hier auszugsweise für die Stunden 09 - 12. Die Werte für pvfc sollten sich in der DB wiederfinden, also 08:00 -> 1183, 09:00 -> 1649, 10:00 -> 2266, 11:00 -> 2202.


In der DB sind die Werte auch so enthalten:
     Bearbeiten Bearbeiten     Kopieren Kopieren     Löschen Löschen     2025-06-01 11:00:01     SolCast     SOLARFORECAST         AllPVforecastsToEvent     2202     Wh
    Bearbeiten Bearbeiten     Kopieren Kopieren     Löschen Löschen     2025-06-01 11:00:00     SolCast     SOLARFORECAST         AllPVforecastsToEvent     0     Wh
    Bearbeiten Bearbeiten     Kopieren Kopieren     Löschen Löschen     2025-06-01 10:00:01     SolCast     SOLARFORECAST         AllPVforecastsToEvent     2266     Wh
    Bearbeiten Bearbeiten     Kopieren Kopieren     Löschen Löschen     2025-06-01 10:00:00     SolCast     SOLARFORECAST         AllPVforecastsToEvent     0     Wh
    Bearbeiten Bearbeiten     Kopieren Kopieren     Löschen Löschen     2025-06-01 09:00:01     SolCast     SOLARFORECAST         AllPVforecastsToEvent     1649     Wh
    Bearbeiten Bearbeiten     Kopieren Kopieren     Löschen Löschen     2025-06-01 09:00:00     SolCast     SOLARFORECAST         AllPVforecastsToEvent     0     Wh
    Bearbeiten Bearbeiten     Kopieren Kopieren     Löschen Löschen     2025-06-01 08:00:01     SolCast     SOLARFORECAST         AllPVforecastsToEvent     1183     Wh
    Bearbeiten Bearbeiten     Kopieren Kopieren     Löschen Löschen     2025-06-01 08:00:00     SolCast     SOLARFORECAST         AllPVforecastsToEvent     0     Wh

Die existierende 0 zwischen den Werten ist dem gesetzen Parameter plantControl->genPVforecastsToEvent=adapt4Steps geschuldet.
Das passt also so wie ich das sehe.

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

cbl

Guten Abend,

nachdem ich jetzt ein Jahr lang aus der Steckdose mein Auto geladen habe und die seit dem letzten Sommer auch mit SolarForecast gesteuert habe, habe ich nun seit letzter Woche eine goE-Wallbox und habe sie Dank der Vorarbeit von pah sehr schnell in FHEM einbinden können. Nun suche ich den besten Weg, sie auch in den SolarForecast-Kosmos zu integrieren. (Ich weiß, was pah davon hält. ;) )

Aktuell versorge ich die goE mit einem at Device alle paar Minuten mit den Werten von Grid-Einspeisung, PV-Produktion und Batteriezufluss. Bislang sind es die echten Werte, ich könnte hier aber auch beliebige andere (z.B. von SolarForecast empfohlene) Werte dem goE unterjubeln. Dessen PV-Überschuss-Ladesteuerung entscheidet dann selbst, ob es gerade genug ist, um den Ladevorgang zu starten/ fortzusetzen oder nicht und mit welcher Leistung geladen wird.
Bislang kann SolarForecast den Consumern nur sagen, DASS sie aktiv werden können, aber nicht WIEVIEL Leistung ihnen zusteht, oder übersehe ich etwas?


Viele Grüße
Christian

DS_Starter

Nabend Christian,

ZitatBislang kann SolarForecast den Consumern nur sagen, DASS sie aktiv werden können, aber nicht WIEVIEL Leistung ihnen zusteht, oder übersehe ich etwas?
Per default ist es so wie du schreibst. Allerdings kann man die Logik über das Attribut ctrlUserExitFn für etwas speziellere Anwendungen erweitern. Dabei kommt es natürlich stark darauf an welche Logik man umsetzen möchte. Aber es gibt viele Möglichkeiten.

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

<OT>
Für Proxmox Nutzer könnte eventuell dieser Beitrag von Interesse sein.
</OT>
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

In meinem contrib liegt die V 1.52.8.
Ich habe noch eine optimierende Anpassung bzgl. der Verbrauchsprognose bei Verwendung von plantControl->consForecastIdentWeekdays und plantControl->consForecastLastDays eingebaut.

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter