Sonnenstunden forecast nächsten Tag

Heute sieht es echt gut aus, die Werte passen schon viel besser :slight_smile:

Hallo @Doctor_Snuggles . Ich bekomme mit deinem Skript:

Warning: get_headers(): SSL: Handshake timed out in /var/lib/symcon/scripts/31871.ips.php on line 38

Warning: get_headers(): Failed to enable crypto in /var/lib/symcon/scripts/31871.ips.php on line 38

Warning: get_headers(https://api.open-meteo.com/v1/forecast?latitude=XXX&longitude=XXX&daily=sunshine_duration,shortwave_radiation_sum&timeformat=unixtime&timezone=Europe%2FBerlin): Failed to open stream: operation failed in /var/lib/symcon/scripts/31871.ips.php on line 38

Auch ein Umbau auf curl gibt null zurück:

$url = 'https://api.open-meteo.com/v1/forecast?latitude=XXX&longitude=XXX&daily=sunshine_duration,shortwave_radiation_sum&timeformat=unixtime&timezone=Europe%2FBerlin';
   //$url = 'https://api.flightplandatabase.com/search/plans?fromICAO=EHAM&toName=Kennedy&limit=1';
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
$result=curl_exec($ch);
curl_close($ch);
$json = json_decode($result, true);
var_dump($json); die;

Hast du eine Idee? Testweise ob überhaupt was funktioniert, habe ich mal api.flightplandatabase.com angefragt, was klappt.

Viele Grüße
Mathias

@hasentopf

ohne dein komplettes Script oder den genauen Aufruf zu sehen wird es schwierig sein zu sagen, was da schief läuft.
Bei mir funktioniert das so.

Die XXX hast du mit deinem Positionsdaten richtig eingetragen?

VG,
Doc

@Doctor_Snuggles Danke für deine Rückmeldung. Genau, XXX ist meine Lat-Lng-Position.

Hier mein Skript (wenn ich den Teil ab Zeile 30 lokal auf meinem Mac laufen lasse, klappt es:

<?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 = 42641;                              // geloggte PV Zähler Variable in kWh
$varId_Einstrahlung_morgen = 19185;

$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 = 2;
if ($Mittelwert_Einstrahlung != 0) {
    $Faktor = round($Mittelwert_PV / $Mittelwert_Einstrahlung ,2);
    SetValue(32751, $Faktor);
}

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

// Abrufen und berechnen des Open-Meteo Wetters
$url = 'https://api.open-meteo.com/v1/forecast?latitude=XXX&longitude=XXX&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: ' . $url . " does not exist \n<br>";
    return;
}

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

SetValueFloat(34757, ($json['daily']['sunshine_duration'][0])/3600);                             // Sonnenstunden heute
SetValueFloat(39886, ($json['daily']['sunshine_duration'][1])/3600);                             // Sonnenstunden morgen
SetValueFloat(38717, ($json['daily']['sunshine_duration'][2])/3600);                             // Sonnenstunden übermorgen
SetValueFloat(23420, ($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(44131,(($json['daily']['shortwave_radiation_sum'][0]) * $Faktor));                 // Erwartung PV Ertrag heute
SetValueFloat(28730,(($json['daily']['shortwave_radiation_sum'][1]) * $Faktor));                 // Erwartung PV Ertrag morgen
SetValueFloat(49938,(($json['daily']['shortwave_radiation_sum'][2]) * $Faktor));                 // Erwartung PV Ertrag übermorgen
SetValueFloat(19766,(($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;
    if(is_array($values)) {
        foreach($values as $value) {
            $consumption += $value['Avg'];
        }
    } else {
        var_dump($values);
    }
    return round($consumption, 2);
}

Ich habe es jetzt mit dem Umweg über meinen Webserver gelöst, da es ja offensichtlich eine Akzeptanzproblem bei der open-meteo-API ist, wenn meine Aufrufe nicht angenommen werden. Jetzt holt ein Skript auf meinem Webserver die JSON Daten von open-meteo und mein Symcon konsumiert sie von da.

Ja ist ja prima wenn es jetzt klappt.
Mir ist da auch nichts aufgefallen was die Ursache sein könnte.