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 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)
Weiß jemand an was das liegt?