Sonnenstunden forecast nächsten Tag

Hallo zusammen,
ich finde dieses Thema total interessant. Leider besitze ich bei weitem nicht die Programmierkenntnisse und kann den Codes nicht wirklich folgen …
Ich probiere gerade die API von https://open-meteo.com/ (zufällig drauf gestoßen)
lese die Werte mit dem JSON Decoder ein und versuche damit eine brauchbare Vorhersage zu ermitteln … es gibt da Werte wie „direct_normal_irradiance“ und „Sunshine Duration“…
könnte man diese Werte nicht in dem Code von Dr. Suggles übernehmen? … oder funktioniert es mit agrar.basf und ich bin einfach nicht in der Lage es zum laufen zu bekommen??
Finde die Idee mit dem 10 Tages Durchschnitt und dem Faktor echt prima :+1:

LG

Ich habe dir das Script mal auf Open-Meteo.com umgebaut.
Aktuell bin ich mit Solorprognose & Co. auch nicht wirklich zufrieden.
Mal sehen, wie sich das hier nach 6 Tagen wieder eingependelt hat, das hatte früher immer gut funktioniert.

Die Sonnenstunden kamen mir hier am Anfang etwas hoch vor, diese sind hier aber mit > 120W/m² definiert, ich weiss nicht genau, wo der Schnitt da beim BASF Agrarwetter genau war.
Wolkenlos ist normal bis zu 1000W/m².

Kannst ja mal testen … (ID’s und Lat/Lon anpassen)

Viele Grüße,
Doc

// Script zum Abrufen des Open-Meteo-Wetters mit Ausgabe der Sonnenstunden und der prognostizierten Solarstrahlung
// mit Berechnung des zu erwartenden PV-Ertrags durch Berechnung des Faktors der letzten 5 Tage
// ===================================================================================================

// Berechnung des Faktors für die PV Leistungs-Vorhersage als Mittelwert der letzten 5 Tage
// zur Anpassung an die verschiedenen Anlagen und Winkel der Sonneneinstrahlung und Verschattungen über die Jahreszeiten

//ID des ArchiveHandler ermitteln 
$instances            = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}'); 
$IDArchiveHandler     = $instances[0];

$varId_PV = 40993;                              // geloggte PV Zähler Variable in kWh
$varId_Einstrahlung_morgen = 31116;

$PV = AC_GetAggregatedValues($IDArchiveHandler, $varId_PV, 1 /* Täglich */, strtotime("-6 day"), strtotime("-1 day")-1, 0); 
$Mittelwert_PV = CalcConsumption($PV) / 5;

$Einstrahlung = AC_GetAggregatedValues($IDArchiveHandler, $varId_Einstrahlung_morgen, 1 /* Täglich */, strtotime("-7 day"), strtotime("-2 day")-1, 0); 
$Mittelwert_Einstrahlung = CalcConsumption($Einstrahlung) / 5;

$Faktor = round($Mittelwert_PV / $Mittelwert_Einstrahlung ,2);

SetValue(40462, $Faktor);

// ===================================================================================================

// Abrufen und berechnen des Open-Meteo Wetters
$url = 'https://api.open-meteo.com/v1/forecast?latitude=xx.xxxx&longitude=x.xxxx&daily=sunshine_duration,shortwave_radiation_sum&timeformat=unixtime&timezone=Europe%2FBerlin';

$stream = stream_context_create(array( 
"ssl"=>array(     
"verify_peer"=> false,     
"verify_peer_name"=> false, ),
'http' => array(     
'timeout' => 30     ) )     );

$array = get_headers($url, 0, $stream);
$string = $array[0];
if(strpos($string,"200"))
  {
    //echo 'url exists  '.$url."\n<br>";
  }
  else
  {
    echo 'url:  '.$url." does not exist \n<br>";
    return;
  }
/* Ende - prüfen ob Seite existiert */

$file = file_get_contents($url);
$json = json_decode($file, TRUE);


SetValueFloat(29481, ($json['daily']['sunshine_duration'][0])/3600);                             // Sonnenstunden heute
SetValueFloat(46325, ($json['daily']['sunshine_duration'][1])/3600);                             // Sonnenstunden morgen
SetValueFloat(56523, ($json['daily']['sunshine_duration'][2])/3600);                             // Sonnenstunden übermorgen
SetValueFloat(51034, ($json['daily']['sunshine_duration'][3])/3600);                             // Sonnenstunden überübermorgen

//$Faktor = 2;                                                                                   // beobachteter, geschätzter Faktor zur Umrechnug der Einstrahlung in PV Ertrag bei aktueller Anzahl und Ausrichtung der Module
SetValueFloat(21880,(($json['daily']['shortwave_radiation_sum'][0]) * $Faktor));                 // Erwartung PV Ertrag heute
SetValueFloat(11768,(($json['daily']['shortwave_radiation_sum'][1]) * $Faktor));                 // Erwartung PV Ertrag morgen
SetValueFloat(27785,(($json['daily']['shortwave_radiation_sum'][2]) * $Faktor));                 // Erwartung PV Ertrag übermorgen
SetValueFloat(30909,(($json['daily']['shortwave_radiation_sum'][3]) * $Faktor));                 // Erwartung PV Ertrag überübermorgen

SetValueFloat($varId_Einstrahlung_morgen,($json['daily']['shortwave_radiation_sum'][1]));        // Einstahlung von morgen für Faktor Berechnung (ins Archive in MJ/m²)

// --- Funktionen ---
function CalcConsumption($values) 
{
    $consumption = 0;
    foreach($values as $value) 
    {
            $consumption += $value['Avg'];
    }
    return round($consumption, 2);
} 

Hallo Doctor Snuggles,
Danke Dir :slight_smile:
Habe es mal nach besten Wissen angepasst… bekomme allerdings diese Fehlermeldung

<?php

// Script zum Abrufen des Open-Meteo-Wetters mit Ausgabe der Sonnenstunden und der prognostizierten Solarstrahlung
// mit Berechnung des zu erwartenden PV-Ertrags durch Berechnung des Faktors der letzten 5 Tage
// ===================================================================================================

// Berechnung des Faktors für die PV Leistungs-Vorhersage als Mittelwert der letzten 5 Tage
// zur Anpassung an die verschiedenen Anlagen und Winkel der Sonneneinstrahlung und Verschattungen über die Jahreszeiten

//ID des ArchiveHandler ermitteln 
$instances            = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}'); 
$IDArchiveHandler     = $instances[0];

$varId_PV = 24809;                              // geloggte PV Zähler Variable in kWh
$varId_Einstrahlung_morgen = 14094;

$PV = AC_GetAggregatedValues($IDArchiveHandler, $varId_PV, 1 /* Täglich */, strtotime("-6 day"), strtotime("-1 day")-1, 0); 
$Mittelwert_PV = CalcConsumption($PV) / 5;

$Einstrahlung = AC_GetAggregatedValues($IDArchiveHandler, $varId_Einstrahlung_morgen, 1 /* Täglich */, strtotime("-7 day"), strtotime("-2 day")-1, 0); 
$Mittelwert_Einstrahlung = CalcConsumption($Einstrahlung) / 5;

$Faktor = round($Mittelwert_PV / $Mittelwert_Einstrahlung ,2);

SetValue(44118, $Faktor);

// ===================================================================================================

// Abrufen und berechnen des Open-Meteo Wetters
$url = 'https://api.open-meteo.com/v1/forecast?latitude=51.5&longitude=7.6333&daily=sunshine_duration,shortwave_radiation_sum&timeformat=unixtime&timezone=Europe%2FBerlin';

$stream = stream_context_create(array( 
"ssl"=>array(     
"verify_peer"=> false,     
"verify_peer_name"=> false, ),
'http' => array(     
'timeout' => 30     ) )     );

$array = get_headers($url, 0, $stream);
$string = $array[0];
if(strpos($string,"200"))
  {
    //echo 'url exists  '.$url."\n<br>";
  }
  else
  {
    echo 'url:  '.$url." does not exist \n<br>";
    return;
  }
/* Ende - prüfen ob Seite existiert */

$file = file_get_contents($url);
$json = json_decode($file, TRUE);


SetValueFloat(12296, ($json['daily']['sunshine_duration'][0])/3600);                             // Sonnenstunden heute
SetValueFloat(19815, ($json['daily']['sunshine_duration'][1])/3600);                             // Sonnenstunden morgen
SetValueFloat(13077, ($json['daily']['sunshine_duration'][2])/3600);                             // Sonnenstunden übermorgen
SetValueFloat(48393, ($json['daily']['sunshine_duration'][3])/3600);                             // Sonnenstunden überübermorgen

//$Faktor = 2;                                                                                   // beobachteter, geschätzter Faktor zur Umrechnug der Einstrahlung in PV Ertrag bei aktueller Anzahl und Ausrichtung der Module
SetValueFloat(15747,(($json['daily']['shortwave_radiation_sum'][0]) * $Faktor));                 // Erwartung PV Ertrag heute
SetValueFloat(14094,(($json['daily']['shortwave_radiation_sum'][1]) * $Faktor));                 // Erwartung PV Ertrag morgen
SetValueFloat(47896,(($json['daily']['shortwave_radiation_sum'][2]) * $Faktor));                 // Erwartung PV Ertrag übermorgen
SetValueFloat(14448,(($json['daily']['shortwave_radiation_sum'][3]) * $Faktor));                 // Erwartung PV Ertrag überübermorgen

SetValueFloat($varId_Einstrahlung_morgen,($json['daily']['shortwave_radiation_sum'][1]));        // Einstahlung von morgen für Faktor Berechnung (ins Archive in MJ/m²)

// --- Funktionen ---
function CalcConsumption($values) 
{
    $consumption = 0;
    foreach($values as $value) 
    {
            $consumption += $value['Avg'];
    }
    return round($consumption, 2);
}

Ja das hatte ich auch, da stehen von der Einstrahlung von den letzten Tagen noch keine Werte im Archiv.
Deshalb division durch 0.

Das könnte man noch im Script abfangen, ich hatte da einfach einen Wert für gestern ins Archiv geschrieben.

ich rechne meine meine Solar Einstrahlung mit dem Rechen-Modul zusammen (habe mehrere kleine Anlagen) und logge das Ergebnis, einmal als Zähler und als Standard, einen Wert für gestern habe ich auch eingetragen aber die Fehlermeldung bleibt :frowning:
Hast Du eine Idee?

Ich hatte einfach für die letzten drei Tage irgend einen Wert eingetragen und dann die Variable neu aggregiert, dann lief es.

Oder ersetze doch einfach …

$Faktor = round($Mittelwert_PV / $Mittelwert_Einstrahlung ,2);

mit

if ($Mittelwert_Einstrahlung != 0) {
    $Faktor = round($Mittelwert_PV / $Mittelwert_Einstrahlung ,2);
    SetValue(40462, $Faktor);
}

Grüße,
Doc

ich habe mittlerweile „$varId_PV“ mit allen möglichen geloggten Variablen gefüttert >> keine Änderung.
Dann habe ich mal anstatt der " $Mittelwert_Einstrahlung" einen festen Wert geschrieben >> dann lief es problemlos durch.

bei dem Vorschlag von Dir bekomme ich folgendes Ergebnis:

Setze mal das
SetValue(40462, $Faktor);

außerhalb der IF Anweisung, bin gerade nicht am Rechner zum testen.
Hast du die Variable nach dem manuell setzen denn auch neu aggregiert?

Bei mir läuft das so problemlos, ob die Werte plausible sind sehe ich in den nächsten Tagen.

HI,
ich habe die letzten 3 Tage eine im Faktor eingetragen, aber klappt leider nicht

Fatal error: Uncaught DivisionByZeroError: Division by zero in C:\ProgramData\Symcon\scripts\53937.ips.php:23
Stack trace:
#0 {main}
thrown in C:\ProgramData\Symcon\scripts\53937.ips.php on line 23

ich denke Du meinst das so…


und ja die Variable (n) habe ich neu aggregiert…

Nicht im Faktor eintragen, die wird doch nicht einmal gelogged.
In der Mittelwert_Einstrahlung muss etwas stehen.
Der Fehler sagt doch division durch 0, weil der Durchschnitt der letzten 5 Tage aus dem Archive der Wert bei euch immer null ist …
Ihr müsst nur dafür sorgen, das einmalig etwas drin steht.

Muss ich mal schauen, ob ich das irgendwie abfangen kann. Hätte das nicht für so kompliziert gehalten …

Oder macht doch einfach einmal ein

echo $Mitterwert_Einstrahlung;

darunter, dann seht ihr doch den Wert ob der wirklich 0 ist.

:thinking:
hi Doc,
ich steh da wohl voll auf dem Schlauch…
$Mitterwert_Einstrahlung wird doch im Script berechnet oder?? Muss dann eine Vaiable angelegt und geloggt werden?? >> Habe ich jetzt mal gemacht und was rein geschrieben >> Division by zero ist damit Geschichte aber

Danke für Deine Geduld :slight_smile:

Am Ende von Zeile 16 fehlt das ;
Aber wozu hast du die im Script angelegt?
Die Werte werden doch in Zeile 21 aus dem Archiv gelesen.
Die Zeile 16 macht keinen Sinn.

Moin,
okay, das skript läuft jetzt durch.

Aber die Werte sind etwas hoch:

Grob geschätzt müsste ich das locker durch 10 Teilen. Kann ich da noch was falsch gemacht haben?

Also zur Erklärung, das Script ließt stündlich die zu erwartende Solarstrahlung von open-Meteo von morgen aus und schreibt/logged dies in die Variable Einstrahlung_morgen.
Gleichzeit holt sich das Script die letzten 5 Tage aus dieser Variablen als Durchschnitt und die letzten 5 Tage als Durchschnitt deiner geloggten PV Zähler Variablen.
Damit wird dann der Faktor berechnet, also der Wert, wie weit diese Zahlen auseinander liegen um eine Prognose zu erstellen.

Dieser Faktor wird dann letztendlich zur Berechnung anhand der von open-Meteo Solarstrahlung der nächsten Tage zu deinem zu erwartenden PV Ertrag der nächsten Tage benutzt.
Das heißt der Faktor ändert sich ständig leicht ab, z.B. wenn du in den Wintermonaten weniger Leistung zur Verschattung hast oder zu zusätzliche Module installierst.

Wie genau das jetzt mit open-Meteo ist kann ich noch genau sagen, weil …

…um deine Frage zu beantworten, du musst jetzt erst einmal min. 5 Tage warten, bis sich die Variable Einstrahlung_morgen mit brauchbaren Daten füllt.
Sowohl am Faktor noch an der Einstrahlung etwas zu verändern bringt somit gar nichts und diente am Anfang nur dazu, damit etwas drin stand um den Fehler Division durch 0 weg zu bekommen, weil ja noch nichts drin stand.

Ich hoffe ich habe das so jetzt verständlich erklärt … :wink:

Übrigens liegt der Faktor bei mir gerade bei 2,89 und ändert sich ständig leicht , auch ich muss 5 Tage warten.
Den Faktor kannst du aber nicht übernehmen, da dieser ja von deiner Anlagengröße abhängig ist.

1 „Gefällt mir“

super! Danke!!! Dann warte ich mal die 3 Tage ab… bin gespannt.

und dafür das Skript

Im übrigen hätte nur die Einstrahlung_morgen und dein PV Zähler geloggt sein müssen, die andern brauchst du eigentlich nicht und ab jetzt nie selber etwas in die Einstahlungsvariablen eintragen, die wird immer mit den Werten von morgen befüllt und ins Archiv eingetragen in MJ/m².

1 „Gefällt mir“

danke. ich logge eigentlich alle Variablen manchmal ganz interessant was da so drin geht. Speicherplatz kostet ja nix mehr.

Die Werte sehen bei mir jetzt schon recht plausibel aus, aber dem Forecast für übermorgen und noch weiter in die Ferne würde ich sowieso nicht so viel vertrauen, da sind die Daten die von den Wetterberechnungen kommen doch noch zu ungenau und Lokal sehr verschieden.
Die Sonnenstunden bei open-Meteo sind übrigens keinen Sonnenscheinstunden, sondern alles über 120W/m².

1 „Gefällt mir“