PV Forecast Balkonkraftwerk mit Benachrichtigung und Analyse

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
steini
Beiträge: 16
Registriert: 12. Feb 2019 11:36
Answers: 0

PV Forecast Balkonkraftwerk mit Benachrichtigung und Analyse

Beitrag von steini »

Guten Tag zusammen,

ich bin stolzer Besitzer eines Balkonkraftwerks, das kontinuierlich Strom erzeugt. Um diesen Strom optimal zu nutzen, versuche ich, energieaufwendige Geräte zu aktivieren, wenn genügend Strom vorhanden ist. Da dies aufgrund wechselnder Wetterbedingungen regelmäßig bewertet werden muss, habe ich beschlossen, eine Prognose zu erstellen, die die Stromerzeugung berechnet und mich darüber informiert.

Obwohl ich mir bereits fertige Lösungen wie Solcast angesehen habe, möchte ich gerne meine eigene Lösung entwickeln. Nachdem ich eine Regel erstellt und sie in einem Testraum über zwei Wochen angepasst habe, liegen die Vorhersagewerte nun seit drei aufeinanderfolgenden Tagen innerhalb von +-5% des tatsächlichen Wertes.

Ich würde gerne diesen Vorgang mit Euch teilen, da ich ihn weiterentwickeln möchte und dabei Hilfe benötige.

Code: Alles auswählen

// Angenommene Werte und Faktoren
val solarIrradiation = OutdoorSonnendaten_Gesamtstrahlung.state as Number // Sonneneinstrahlung in W/m²
val temperature = OutdoorLokalesWetterundWettervorhersage_ForecastHours03_Temperature.state as Number // Temperatur in °C
val efficiency = 0.12f // Anlagenwirkungsgrad laut Datenblatt Balkonkraftwerk
val shadingFactor = 0.9f // Verschattungsfaktor (1 = keine Verschattung, 0 = vollständige Verschattung)
val tiltAndOrientationFactor = 1f // Neigung und Ausrichtungsfaktor (1 = optimal, <1 = suboptimal)
val degradationFactor = 0.95f // Alter und Zustand der Anlage (1 = keine Degradation, <1 = Degradation)
val energystatenow = OutdoorBalkonkraftwerk_Gesamtverbrauch.state as Number // Gesamterzeugniss in kwh  
   

// Solarmodulfläche in Quadratmetern
val solarPanelArea = 3.8f 

// Gewichtungskoeffizienten (Beispielwerte, die an Ihre spezifischen Bedingungen angepasst werden sollten)
val weightTemperature = 0.2f
val weightEfficiency = 0.3f
val weightShading = 0.1f
val weightTiltAndOrientation = 0.2f
val weightDegradation = 0.1f

  // Berechnung des voraussichtlichen Ertrags mit Gewichtungskoeffizienten
val estimatedOutput = solarIrradiation.floatValue() * (
Math.pow(temperature.floatValue(), weightTemperature) *
Math.pow(efficiency, weightEfficiency) *
Math.pow(shadingFactor, weightShading) *
Math.pow(tiltAndOrientationFactor, weightTiltAndOrientation) *
Math.pow(degradationFactor, weightDegradation)
) * solarPanelArea / 1000 // Umrechnung von W in kWh
  
  

// Runden auf zwei Stellen nach dem Komma
val roundedOutput = Math.round(estimatedOutput * 100) / 100.0

// Aktualisieren des voraussichtlichen Ertrags in einem OpenHAB-Element (ersetzen Sie 'MGM_Balkonkraftwerk_Energie' durch den tatsächlichen Namen Ihres Elements)
MGM_Balkonkraftwerk_Energie.postUpdate(roundedOutput)

// Senden einer Pushover-Nachricht mit dem geschätzten Ertrag in kWh
val message = "Der geschätzte Solarertrag für heute beträgt " + roundedOutput 

MGM_Balkonkraftwerk_Massage.postUpdate(message)
MGM_Balkonkraftwerk_Erzeugniss_24.postUpdate(energystatenow)
Ich möchte meine Regel automatisiert überprüfen, indem ich die Werte regelmäßig erhalte. Allerdings hat der Shelly 1PM keinen Tageszähler. Deshalb muss ich den Wert nach Sonnenuntergang vom Wert vor Sonnenuntergang abziehen, um den Gesamtwert für den Tag zu erhalten. Mein Item für diesen Wert lautet 'MGM_Balkonkraftwerk_Energie_total_24h'.

Ich habe bereits eine Regel erstellt, die jedoch nicht funktioniert. Im Log werden keine Fehler angezeigt.

Code: Alles auswählen

val total24h = (MGM_Balkonkraftwerk_Erzeugniss_24.state as Number?)?.toDouble() ?: 0.0
val calculatedUsage = (MGM_Balkonkraftwerk_Energie.state as Number).toDouble()
val usageDiff = (OutdoorBalkonkraftwerk_Gesamtverbrauch.state as Number).toDouble() - total24h

MGM_Balkonkraftwerk_Erzeugniss_diff.sendCommand(usageDiff)
val messagediv = "Tatsächlich erzeugter Strom: ${usageDiff} kWh"
 MGM_Balkonkraftwerk_Massage_diff.postUpdate(messagediv)
Allein das Item MGM_Balkonkraftwerk_Erzeugniss_diff wird schon nicht berechnet....

Weiß jemand an was das liegt?

steini
Beiträge: 16
Registriert: 12. Feb 2019 11:36
Answers: 0

Re: PV Forecast Balkonkraftwerk mit Benachrichtigung und Analyse

Beitrag von steini »

Mir sind noch ein paar Dinge eingefallen:
  • Ich bin mir noch nicht sicher, ob die Berechnung im Sommer bei besserem Wetter auch funktionieren wird.
    Es handelt sich hierbei um eine Spielerei und nicht um eine sinnvolle Nutzung.
    Mit 'kontinuierlich' meine ich, dass das Balkonkraftwerk nur dann Strom erzeugt, wenn die Sonne scheint.
    Die Berechnung berücksichtigt nicht die Auswirkungen von Bewölkung.

Benutzeravatar
udo1toni
Beiträge: 14038
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Forecast Balkonkraftwerk mit Benachrichtigung und Analyse

Beitrag von udo1toni »

Code bitte immer als Code markieren, das macht es übersichtlicher, lesbarer und nebenher kann man den Codeblock auch leicht kopieren (Link "alles Auswählen")
Ich hab das oben mal angepasst...

Ach so: Text, der als Code eingefügt werden sollte:
  • Programmcode
  • textliche Item- oder Thingdefinitionen
  • yaml Code
  • Konfigurationsdateien allgemein
  • JSON...
  • Logs
  • Shell Befehle
Die Liste ist beispielhaft und erhebt keinen Anspruch auf Vollständigkeit...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Benutzeravatar
udo1toni
Beiträge: 14038
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Forecast Balkonkraftwerk mit Benachrichtigung und Analyse

Beitrag von udo1toni »

Welche Programmiersprache soll das sein?

z.B.

Code: Alles auswählen

MGM_Balkonkraftwerk_Energie.postUpdate(roundedOutput)
deutet stark auf die openHAB Rules DSL hin.
Andererseits gibt es so etwas:

Code: Alles auswählen

val weightTemperature = 0.2f
(also das f hinter der Zahl) in der DSL definitiv nicht. Entweder nackte Zahl (also 0.2) oder (als UoM Wert) z.B. 0.2|%, womit dann in diesem Fall die Einheit % mitgeführt wird.
Allerdings kann man mit Einheiten nur innerhalb der Einheit rechnen, also z.B. 32|°F = 273.14|K = 0|°C :mrgreen:
Oder auch 1|in + 2.54|cm = 0.0508|m, aber (meines Wissens) eben nicht 3|A * 2|V = 6|VA, obwohl UoM alle drei Einheiten kennt.
Also eher nicht.

Wenn Du Stringoperationen durchführst, musst Du gewöhnlich darauf achten, auch nur mit Strings zu arbeiten. also z.B.

Code: Alles auswählen

val roundedOutput = Math.round(estimatedOutput * 100) / 100.0
val message = "Der geschätzte Solarertrag für heute beträgt " + roundedOutput 
dürfte nicht funktionieren, wohl aber

Code: Alles auswählen

val roundedOutput = Math.round(estimatedOutput * 100) / 100.0
val message = "Der geschätzte Solarertrag für heute beträgt " + roundedOutput.toString
weil roundedOutput ein Objekt ist und damit die Methode .toString geerbt hat.
In der DSL könnte man auch einfach

Code: Alles auswählen

val roundedOutput = (estimatedOutput * 100 + 0.5).intValue / 100
val message = "Der geschätzte Solarertrag für heute beträgt " + roundedOutput.toString
schreiben.

Ich nehme an, Du hast den Code über die Main UI erstellt? In diesem Fall wäre die yaml-Ansicht besser, weil dort explizit die verwendete Sprache gelistet ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

steini
Beiträge: 16
Registriert: 12. Feb 2019 11:36
Answers: 0

Re: PV Forecast Balkonkraftwerk mit Benachrichtigung und Analyse

Beitrag von steini »

Hallo,

das ist eine openHAB Rules DSL ohne Trigger.

In Bezug auf Ihre Frage zum "f" denke ich, dass ich die Möglichkeit habe, die Variable als Double (ohne "f") oder Float zu definieren. Für die Berechnung und das Ergebnis macht das, glaube ich, keinen Unterschied.

In Bezug auf die String-Operationen:

Code: Alles auswählen

val roundedOutput = Math.round(estimatedOutput * 100) / 100.0
val message = "Der geschätzte Solarertrag für heute beträgt " + roundedOutput.toString
In meinem Fall weiß ich einem Item den Wert von $massage zu um dieses wiederrum in eine extra rule per pushover und blocky zu versenden.
hier funktionieren wohl bei Versionen.


nun zum Sonnenuntergang und dem Vergleich:

Erkennst du hier einen fehler???

Benutzeravatar
udo1toni
Beiträge: 14038
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Forecast Balkonkraftwerk mit Benachrichtigung und Analyse

Beitrag von udo1toni »

Auch die Schreibweise $message ist nicht erlaubt. Und das Konstrukt ${...} kommt mir ebenfalls nicht bekannt vor.

Das sind alles Dinge, die es so oder so ähnlich in anderen Sprachen als der DSL gibt (z.B. in bash Scripten), aber Du kannst nicht fröhlich irgendwas zusammenmischen und erwarten, dass das dann funktioniert.
Und nur, weil Du keine Fehlermeldung bekommst, heißt das noch lange nicht, dass der Code in Ordnung ist. Wo lässt Du den Code denn überprüfen?

Was ist solarIrradiation? Das ist nirgends definiert. Ist das am Ende ein Item? Dann müsste es mindestens solarIrradiation.state heißen.
Das Gleiche gilt für temperature. Sollte es sich um ein Item handeln muss es (temperature.state as Number).floatValue heißen, denn ein Status ist erst mal keine Zahl, somit steht auch keine Methode .floatValue zur Verfügung, dazu muss der Status erst nach Number gecastet werden.

Alle weiteren Werte, mit denen Du per Math.pow Berechnungen anstellst, stehen ebenfalls zur Debatte, wo kommen die her?

Das da:

Code: Alles auswählen

val total24h = (MGM_Balkonkraftwerk_Erzeugniss_24.state as Number?)?.toDouble() ?: 0.0
Nope, kein DSL, sondern JavaScript (allerdings wird es auch da nicht funktionieren, weil in JavaScript die Items nicht als Objekte zur Verfügung stehen).

Ehrlich gesagt wundert es mich nicht, dass Du keine Fehlermeldung zu Gesicht bekommst, denn openHAB wird schon beim Einlesen melden, dass die Rule Fehler enthält und deshalb ignoriert wird.

Ich habe das in einem anderen Thread zum Thema Solar Forecast schon erwähnt: Ich denke nicht, dass man das so überhaupt sinnvoll einsetzen kann. Allenfalls wenn man einen Pufferspeicher hat, der einige kWh aufnehmen kann, könnte so ein Forecast sinnvoll genutzt werden.
Meine PV Anlage springt innerhalb von Sekunden von 8000 W auf 200 W und wieder zurück, da muss nur eine Wolke durchziehen, damit kann man also rein gar nichts sinnvoll ein- und ausschalten - und mit einem Balkonkraftwerk ist das nicht besser.
Die Webseiten zum Solar Forecast sind sehr wichtig für Landwirte, die damit Bewässerung usw. optimieren können, aber da reden wir auch nicht von Sekunden, sondern immer von Tagen, das wäre also quasi der Pufferspeicher, den Du brauchst, um per Forecast zu entscheiden, ob Du nun lieber schon heute oder erst übermorgen die Waschmaschine laufen lässt (oder meinetwegen erst am Nachmittag oder schon Früh).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Antworten