da hast du recht, bei Agrar 3 Stunden, bei Wetter Online 6,1 Stunden.
Gefühlt hat heute den ganzen Tag die Sonne geschienen.
da hast du recht, bei Agrar 3 Stunden, bei Wetter Online 6,1 Stunden.
Gefühlt hat heute den ganzen Tag die Sonne geschienen.
Die Landwirte habe ja auch zur Zeit keine Saison
Also irgendwie passen die Daten nicht mehr.
Bei 0 Sonnenstunden kann doch nicht 15kWh herauskommen?
richimaint
bei mir ist es am jeden Tag 3 KW, soweit hatte ich schon 2 mal diesen Monat, da muss aber auch den ganzen Tag die Sonne da sein. mal gucken was da morgen steht.
Nu hört hier mal auf über die BASF Wetterdaten zu jammern.
Wetter.com meldet bei uns auch schon seit einigen Tagen 3-4 Sonnenstunden/Tag, gesehen habe ich hier keinen einzigen Sonnenstrahl.
Das ist aktuell eine schwierige Wetterlage für einen genaue Prognose.
Auch bei 0 Sonnenstunden können 15kWh rauskommen, alles eine Sache der Anlagengröße.
VG Doc
Genau, bei mir kommen 0,15kWh raus, aber ne gute Vorraussage hätte was, Ich habe da noch nix gutes gefunden, was hier passt.
Na dann hast du ver. nur 1% der Anlagengröße wie ich mir vorgestellt hatte …
Ich bekomme bei dem Code eine Fehlermeldung:
Parse error: syntax error, unexpected ‚‘ (T_ENCAPSED_AND_WHITESPACE), expecting ‚-‘ or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /mnt/data/symcon/scripts/41235.ips.php on line 27
Hier der Code:
<?php $url = 'https://www.agrar.basf.de/api/weather/weatherDetails?lang=de&latitude=52.5413&longitude=7.3283'; $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." } else { echo 'url: '.$url." does not exist return; } /* Ende - prüfen ob Seite existiert */ $file = file_get_contents($url); $json = json_decode($file, TRUE); SetValueFloat(27465,(time_convert($json['days'][0]['sdur']))); // Sonnenstunden heute SetValueFloat(27663,(time_convert($json['days'][1]['sdur']))); // Sonnenstunden morgen SetValueFloat(40684,(time_convert($json['days'][2]['sdur']))); // Sonnenstunden übermorgen SetValueFloat(41446,(time_convert($json['days'][3]['sdur']))); // Sonnenstunden überübermorgen // --- Funktionen --- function time_convert($Zeit) { $d = explode(':', $Zeit); $d2 = 100 / 60 * $d[1]; $d2 = round(($d[0].'.'.$d2), 1); return $d2; }… also so formatiert kann doch keiner etwas damit anfangen.
Kann es sein, das gar keine Daten von der Webseite kommen?
Pack das ganze Script doch mal als „Code“ hier rein, dann kann man alles sehen.
<?php
$url = 'https://www.agrar.basf.de/api/weather/weatherDetails?lang=de&latitude=52.5413&longitude=7.3283';
$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."
}
else
{
echo 'url: '.$url." does not exist
return;
}
/* Ende - prüfen ob Seite existiert */
$file = file_get_contents($url);
$json = json_decode($file, TRUE);
SetValueFloat(27663,(time_convert($json['days'][1]['sdur']))); // Sonnenstunden morgen
SetValueFloat(40684,(time_convert($json['days'][2]['sdur']))); // Sonnenstunden übermorgen
SetValueFloat(41446,(time_convert($json['days'][3]['sdur']))); // Sonnenstunden überübermorgen
// --- Funktionen ---
function time_convert($Zeit) {
$d = explode(':', $Zeit);
$d2 = 100 / 60 * $d[1];
$d2 = round(($d[0].'.'.$d2), 1);
return $d2;
}
Da hast du bei deinem Cut&Paste wohl ein bisschen zu viel abgeschnitten.
So funktioniert es …
VG,
Doc
<?php
$url = 'https://www.agrar.basf.de/api/weather/weatherDetails?lang=de&latitude=52.5413&longitude=7.3283';
$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(27663,(time_convert($json['days'][1]['sdur']))); // Sonnenstunden morgen
SetValueFloat(40684,(time_convert($json['days'][2]['sdur']))); // Sonnenstunden übermorgen
SetValueFloat(41446,(time_convert($json['days'][3]['sdur']))); // Sonnenstunden überübermorgen
// --- Funktionen ---
function time_convert($Zeit) {
$d = explode(':', $Zeit);
$d2 = 100 / 60 * $d[1];
$d2 = round(($d[0].'.'.$d2), 1);
return $d2;
}
Danke.
Muste lange nach der falschen zeile siche weiß gar nicht wie das zu stande kam hatte den ganzen Code makiert.
Danke noch mal
Hallo zusammen,
super Sache, die BASF-API. Allerdings scheinen die Werte nicht ganz zu stimmen:
[0] => Array
(
[date] => 08.11.
[wd] => Tuesday
[tmax] => 32
[tmin] => 19
[tavg] => 25
[tdew] => 17
[relhum] => 65
[sdur] => 09:00
[radJcm2] => 99
[radWm2] => 274
[wsminms] => 2
[wsmaxms] => 5
[wsminkmh] => 6
[wsmaxkmh] => 18
[wsminbft] => 2
[wsmaxbft] => 3
[wdir] => 112
[precprob] => 10
[prec] => 0
[eva] => 5,09
[tsoilavg] => 34
[tsoilmin] => 25
[tsoilmax] => 46
[pic] => 28
[pic2] => 60813
)
32° im November??
Mache ich was falsch? Meine URL lautet https://www.agrar.basf.de/api/weather/weatherDetails?lang=en&latitude=8.2374027&longitude=48.8899761
Das sollte in Baden-Württemberg bei Rastatt liegen…
Ich glaube die Sonnenstunden „sdur“ sind weggefallen?
[days] => Array
(
[0] => Array
(
[date] => 23.02.
[wd] => Donnerstag
[tmax] => 12
[tmin] => 5
[tavg] => 8
[relhum] => 79
[wsmaxms] => 3
[wsmaxkmh] => 10
[wsmaxbft] => 2
[wdir] => 230
[wdirlabel] => SW
[precprob] => 81
[prec] => 3
[pic] => 11
[pic2] => 60300
richimaint
Ja, das radWm2 offensichtlich auch…
Ich hab das Script mal provisiorisch auf die days1h im Array umgebaut. Dort gibts wenigstens die radWm2 noch. Als einheitenlose „Kennzahl“ war diese bisher im days Array auch schon immer sehr aussagekräftig.
Mal sehen ob das so funktioniert bzw. „passt“…
#SetValueFloat(24897,(time_convert($json['days'][0]['sdur']))); // Sonnenstunden heute
#SetValueFloat(47718,(time_convert($json['days'][1]['sdur']))); // Sonnenstunden morgen
#SetValueFloat(47857,(time_convert($json['days'][2]['sdur']))); // Sonnenstunden übermorgen
#SetValueFloat(40457,(time_convert($json['days'][3]['sdur']))); // Sonnenstunden überübermorgen
#if ($debug) print_r ($json);
$radwm0 = 0;
$radwm0 = (!empty($json['days1h'][0]['1h']) ? array_sum(array_column($json['days1h'][0]['1h'], 'radwm2')) / count(array_column($json['days1h'][0]['1h'], 'radwm2')) : 0);
$radwm0 = $radwm0/100 * $Faktor;
$radwm1 = 0;
$radwm1 = (!empty($json['days1h'][1]['1h']) ? array_sum(array_column($json['days1h'][1]['1h'], 'radwm2')) / count(array_column($json['days1h'][1]['1h'], 'radwm2')) : 0);
$radwm1archiv = $radwm1;
$radwm1 = $radwm1/100 * $Faktor;
$radwm2 = 0;
$radwm2 = (!empty($json['days1h'][2]['1h']) ? array_sum(array_column($json['days1h'][2]['1h'], 'radwm2')) / count(array_column($json['days1h'][2]['1h'], 'radwm2')) : 0);
$radwm2 = $radwm2/100 * $Faktor;
$radwm3 = 0;
$radwm3 = (!empty($json['days1h'][3]['1h']) ? array_sum(array_column($json['days1h'][3]['1h'], 'radwm2')) / count(array_column($json['days1h'][3]['1h'], 'radwm2')) : 0);
$radwm3 = $radwm3/100 * $Faktor;
if (!$debug) SetValueFloat(23974,$radwm0); // Erwartung PV Ertrag heute
if (!$debug) SetValueFloat(56438,$radwm1); // Erwartung PV Ertrag morgen
if (!$debug) SetValueFloat(35098,$radwm2); // Erwartung PV Ertrag übermorgen
if (!$debug) SetValueFloat(23304,$radwm3); // Erwartung PV Ertrag überübermorgen
// beobachteter, geschätzter Faktor zur Umrechnug der Einstrahlung in PV Ertrag bei aktueller Anzahl und Ausrichtung der Module
#SetValueFloat(23974,(($json['days'][0]['radWm2']) * 24 * $Faktor / 1000)); // Erwartung PV Ertrag heute
#SetValueFloat(56438,(($json['days'][1]['radWm2']) * 24 * $Faktor / 1000)); // Erwartung PV Ertrag morgen
#SetValueFloat(35098,(($json['days'][2]['radWm2']) * 24 * $Faktor / 1000)); // Erwartung PV Ertrag übermorgen
#SetValueFloat(23304,(($json['days'][3]['radWm2']) * 24 * $Faktor / 1000)); // Erwartung PV Ertrag überübermorgen
Hi,
magst du mal das ganz Skript Online stellen?
ich kann leider nicht programmieren und weiß daher nicht in welchen Teil das rein kommt.
danke
Klar.
Sind aber noch ein paar frühere Änderungen mit drin (Logging) und die alten
Einträge auskommentiert (#) damit ich später nochmal weiß wie das war, falls es doch
wieder auf die alte Art funktionieren würde… Heißt man kann’s im Bedarfsfall sicherlich wieder
etwas verschlanken.
<?php
IPSUtils_Include ("IPSLogger.inc.php", "IPSLibrary::app::core::IPSLogger");
// Script zum Abrufen des BASF Agrar-Wetters mit Ausgabe der Sonnenstunden und der prognostizierten Solarstrahlung
// mit Berechnung des zu erwartenden PV-Ertrags durch Berechnung des Faktors der letzten 10 Tage
// ===================================================================================================
// Berechnung des Faktors für die PV Leistungs-Vorhersage als Mittelwert der letzten 10 Tage
// zur Anpassung an die verschiedenen Anlagen und Winkel der Sonneneinstrahlung und Verschattungen über die Jahreszeiten
//
// https://community.symcon.de/t/sonnenstunden-forecast-naechsten-tag/120873/22
$debug = true;
$IDArchiveHandler = 36341;
$varId_PV = 51796;
$varId_Einstrahlung_morgen = 15731;
$PV = AC_GetAggregatedValues($IDArchiveHandler, $varId_PV, 1 /* Täglich */, strtotime("-11 day"), strtotime("-1 day")-1, 0);
$Mittelwert_PV = CalcConsumption($PV) / 10;
$Einstrahlung = AC_GetAggregatedValues($IDArchiveHandler, $varId_Einstrahlung_morgen, 1 /* Täglich */, strtotime("-12 day"), strtotime("-2 day")-1, 0);
$Mittelwert_Einstrahlung = CalcConsumption($Einstrahlung) / 10;
if ($Mittelwert_PV != 0 and $Mittelwert_Einstrahlung != 0 ){
$Faktor = round(($Mittelwert_PV * 1000) / ($Mittelwert_Einstrahlung * 24),2);
} else {
//$Faktor = 15.0;
}
if ($Faktor <= 30) {
SetValue(12292, $Faktor);
} else {
IPSLogger_Inf(__file__, "Faktorkalkulation PV Prognose fehlgeschlagen. Faktor: ".$Faktor." SMA PV Ertrag pruefen.");
$Faktor = GetValue(12292);
IPSLogger_Inf(__file__, "Ersatzwert (alt) Faktor: ".$Faktor);
}
// ===================================================================================================
// Abrufen und berechnen des BASF Agrarwetters
//
$url = 'https://www.agrar.basf.de/api/weather/weatherDetails?lang=de&latitude=xx.xxxxxx&longitude=yy.yyyyyy';
$stream = stream_context_create(array(
"ssl"=>array(
"verify_peer"=> false,
"verify_peer_name"=> false, ),
'http' => array(
'timeout' => 15 ) ) );
@$array = get_headers($url, 0, $stream);
if (empty($array)) {
IPSLogger_Inf(__file__, "56986: Array Get Header = EMPTY");
return;
}
else {
$string = $array[0];
if(strpos($string,"200"))
{
//echo 'url exists '.$url."\n<br>";
}
else
{
//echo 'url: '.$url." does not exist \n<br>";
IPSLogger_Inf(__file__, "56986: URL defekt");
return;
}
/* Ende - prüfen ob Seite existiert */
$file = file_get_contents($url);
$json = json_decode($file, TRUE);
#SetValueFloat(24897,(time_convert($json['days'][0]['sdur']))); // Sonnenstunden heute
#SetValueFloat(47718,(time_convert($json['days'][1]['sdur']))); // Sonnenstunden morgen
#SetValueFloat(47857,(time_convert($json['days'][2]['sdur']))); // Sonnenstunden übermorgen
#SetValueFloat(40457,(time_convert($json['days'][3]['sdur']))); // Sonnenstunden überübermorgen
if ($debug) print_r ($json);
//$Faktor = 15.0;
$radwm0 = 0;
$radwm0 = (!empty($json['days1h'][0]['1h']) ? array_sum(array_column($json['days1h'][0]['1h'], 'radwm2')) / count(array_column($json['days1h'][0]['1h'], 'radwm2')) : 0);
$radwm0 = ($radwm0/100) * $Faktor;
$radwm1 = 0;
$radwm1 = (!empty($json['days1h'][1]['1h']) ? array_sum(array_column($json['days1h'][1]['1h'], 'radwm2')) / count(array_column($json['days1h'][1]['1h'], 'radwm2')) : 0);
$radwm1archiv = $radwm1;
$radwm1 = ($radwm1/100) * $Faktor;
$radwm2 = 0;
$radwm2 = (!empty($json['days1h'][2]['1h']) ? array_sum(array_column($json['days1h'][2]['1h'], 'radwm2')) / count(array_column($json['days1h'][2]['1h'], 'radwm2')) : 0);
$radwm2 = ($radwm2/100) * $Faktor;
$radwm3 = 0;
$radwm3 = (!empty($json['days1h'][3]['1h']) ? array_sum(array_column($json['days1h'][3]['1h'], 'radwm2')) / count(array_column($json['days1h'][3]['1h'], 'radwm2')) : 0);
$radwm3 = ($radwm3/100) * $Faktor;
if (!$debug) SetValueFloat(23974,$radwm0); // Erwartung PV Ertrag heute
if (!$debug) SetValueFloat(56438,$radwm1); // Erwartung PV Ertrag morgen
if (!$debug) SetValueFloat(35098,$radwm2); // Erwartung PV Ertrag übermorgen
if (!$debug) SetValueFloat(23304,$radwm3); // Erwartung PV Ertrag überübermorgen
// beobachteter, geschätzter Faktor zur Umrechnug der Einstrahlung in PV Ertrag bei aktueller Anzahl und Ausrichtung der Module
#SetValueFloat(23974,(($json['days'][0]['radWm2']) * 24 * $Faktor / 1000)); // Erwartung PV Ertrag heute
#SetValueFloat(56438,(($json['days'][1]['radWm2']) * 24 * $Faktor / 1000)); // Erwartung PV Ertrag morgen
#SetValueFloat(35098,(($json['days'][2]['radWm2']) * 24 * $Faktor / 1000)); // Erwartung PV Ertrag übermorgen
#SetValueFloat(23304,(($json['days'][3]['radWm2']) * 24 * $Faktor / 1000)); // Erwartung PV Ertrag überübermorgen
if (!$debug) SetValueFloat($varId_Einstrahlung_morgen,$radwm1archiv); // Einstahlung von morgen für Faktor Berechnung (ins Archive)
}
// --- Funktionen ---
function time_convert($Zeit) {
$d = explode(':', $Zeit);
$d2 = 100 / 60 * $d[1];
$d2 = round(($d[0].'.'.$d2), 1);
return $d2;
}
function CalcConsumption($values)
{
$consumption = 0;
foreach($values as $value)
{
$consumption += $value['Avg'];
}
return round($consumption, 2);
}
?>
Habt mal ein bisschen Geduld.
Die Sonneneinstrahlungswerte sind schon öfter mal für ein paar Tage weg gewesen und dann waren sie plötzlich wieder dabei.
Viele Grüße,
Doc