Probleme mit CURL

Hi,

ich kämpfe seit einige Zeit mit Abstürzen von IPS und ich habe diese Script in Verdacht.

<?
// Konstanten
$Einspeiseverguetung = '0.1664';

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://www.solax-portal.com/api/v1/inverter/GetCurrentData/XXXXXXXX');
$json = curl_exec($ch);
curl_close($ch);

//echo $json;

$data = json_decode($json);

$PowerNow = $data->data->values[4];


//print_r(json_decode($json));

SetValue(29257 /*[4 Variablen & Wartung\Solax JSON\PV1 Strang Eingangsleistung]*/,$data->data->values[0]);
SetValue(25688 /*[4 Variablen & Wartung\Solax JSON\PV2 Strang Eingangsleistung]*/,$data->data->values[1]);
SetValue(14141 /*[4 Variablen & Wartung\Solax JSON\PV1 Strang Spannung Aktuell]*/,$data->data->values[2]);
SetValue(45486 /*[4 Variablen & Wartung\Solax JSON\PV2 Strang Spannung Aktuell]*/,$data->data->values[3]);
SetValue(53321 /*[4 Variablen & Wartung\Solax JSON\Ausgangsstrom]*/,$data->data->values[4]);
SetValue(25894 /*[4 Variablen & Wartung\Solax JSON\Netzspannung]*/,$data->data->values[5]);
SetValue(52587 /*[4 Variablen & Wartung\Solax JSON\Aktelle Leistung]*/,$data->data->values[6]);
SetValue(59907 /*[4 Variablen & Wartung\Solax JSON\Aktuelle Ausgangsleistung]*/,$data->data->values[7]);
SetValue(31144 /*[4 Variablen & Wartung\Solax JSON\Ertrag Heute]*/,$data->data->values[8]);
SetValue(22413 /*[4 Variablen & Wartung\Solax JSON\Ertrag Gesamt]*/,$data->data->values[9]);
SetValue(48918 /*[4 Variablen & Wartung\Solax JSON\Ankauf und Einspeisung Aktuell]*/,$data->data->values[10]);
SetValue(26827 /*[4 Variablen & Wartung\Solax JSON\PV1 Strang Leistung Aktuell]*/,$data->data->values[11]);
SetValue(22943 /*[4 Variablen & Wartung\Solax JSON\PV2 Strang Leistung Aktuell]*/,$data->data->values[12]);
SetValue(34252 /*[4 Variablen & Wartung\Solax JSON\Batterie Spannung]*/,$data->data->values[13]);
SetValue(39547 /*[4 Variablen & Wartung\Solax JSON\Batterie Ladespannung]*/,$data->data->values[14]);
SetValue(49570 /*[4 Variablen & Wartung\Solax JSON\Batterie Leistung]*/,$data->data->values[15]);
SetValue(47619 /*[4 Variablen & Wartung\Solax JSON\Batterie Temperatur]*/,$data->data->values[16]);
SetValue(38000 /*[4 Variablen & Wartung\Solax JSON\Batterie Füllstand]*/,$data->data->values[17]);
SetValue(59907 /*[4 Variablen & Wartung\Solax JSON\Aktuelle Ausgangsleistung]*/,$data->data->values[18]);
//SetValue(59907 /*[4 Variablen & Wartung\Solax JSON\Aktuelle Ausgangsleistung]*/,$data->data->values[19]);
SetValue(44525 /*[4 Variablen & Wartung\Solax JSON\Verkauf an Netz (Einspeisung)]*/,$data->data->values[20]);
SetValue(15818 /*[4 Variablen & Wartung\Solax JSON\Einkauf vom Netz]*/,$data->data->values[21]);
//SetValue(59907 /*[4 Variablen & Wartung\Solax JSON\Aktuelle Ausgangsleistung]*/,$data->data->values[22]);


//Ermitteln des aktuellen Stromverbrauchs

$Ausgangsleistung = GetValue(52587 /*[4 Variablen & Wartung\Solax JSON\Aktelle Leistung]*/);
$Einspeisung = GetValue(48918 /*[4 Variablen & Wartung\Solax JSON\Ankauf und Einspeisung Aktuell]*/);

//Kein Strom vom Dach oder aus Batterie
if ($Ausgangsleistung=="0" AND $Einspeisung < "0")
{ 
   
	$AktuellerVerbrauch = ($Einspeisung *= -1);
   
}

//Strom vom Dach weniger als verbraucht wird - es wird noch Strom zugekauft
else if ($Ausgangsleistung > "0" AND $Einspeisung <= "0")
{ 
   
	$AktuellerVerbrauch = $Ausgangsleistung + ($Einspeisung *= -1);
   
}


//Strom vom Dach als verbraucht wird
else if ($Ausgangsleistung > "0" AND $Einspeisung >= "0")
{ 
   
	$AktuellerVerbrauch = $Ausgangsleistung;
   
}

// Echo $AktuellerVerbrauch;
IPS_LogMessage($_IPS['SELF'], "Stromverbrauch: ".$AktuellerVerbrauch." W");

SetValue(56816 /*[4 Variablen & Wartung\Solax JSON\Aktueller Stromverbrauch (berechnet)]*/,$AktuellerVerbrauch);


//Erechnen PV Ertrag String 1 und 2

$LeistungString1 = GetValue(26827 /*[4 Variablen & Wartung\Solax JSON\PV1 Strang Leistung Aktuell]*/);
$LeistungString2 = GetValue(22943 /*[4 Variablen & Wartung\Solax JSON\PV2 Strang Leistung Aktuell]*/);

SetValue(29692 /*[4 Variablen & Wartung\Solax JSON\PV Ertrag String 1 und 2]*/,$LeistungString1+$LeistungString2);


//Berechnen von Beträgen
$ErtragHeute = GetValue(31144 /*[4 Variablen & Wartung\Solax JSON\Ertrag Heute]*/);
$ErtragGesamt = GetValue(44525 /*[4 Variablen & Wartung\Solax JSON\Verkauf an Netz (Einspeisung)]*/);

$ErtragHeuteEuro = $ErtragHeute * $Einspeiseverguetung;
$ErtragVerkaufEuro = $ErtragGesamt * $Einspeiseverguetung;

SetValue(10880 /*[4 Variablen & Wartung\Solax JSON\Euro Ertrag Heute]*/,$ErtragHeuteEuro);
Setvalue(34356 /*[4 Variablen & Wartung\Solax JSON\Euro Ertrag Gesamt]*/,$ErtragVerkaufEuro);

?>

Diese Script liest das Solax Wechselrichter Portal aus und funktioniert bei Ausführung ohne Probleme. Aber irgendwann so nach 1 -2 Tagen kommt ein Fehler das zu viele Scripte ausgeführt werden und ich konnte diese Abstürze beheben, in dem ich ein ähnliches „CURL Script“ deaktivierte. Ich könnte im Log keine Fehler o.ä. finden - wie gesagt - das Script läuft meist ohne Probleme.

Kann hier jemand eine Fehler sehen (vermutlich im oberen Bereich) - schliesse ich evtl. eine Session nicht??? :banghead:

Ist nur so eine Idee - evtl. hat CURL ja auch ein Problem?

Vor einiger Zeit war CURL für den Raspberry Pi noch veraltet und führte an manchen Stellen zu Problemen. Ob dies auch dein Skript betrifft, kann ich leider nicht sagen. Läuft IP-Symcon bei dir denn auf einem Pi?

Zu Abstürzen sollte es natürlich auch bei problematischen Skripten nicht kommen. Wir schauen uns das mal genauer an.

Ich würde einen Timeout setzten


curl_setopt($ch, CURLOPT_TIMEOUT, 5);

Vielleicht hilft es ja.

Aktuell läuft es auf einem Ubuntu, aber ich hatte das gleiche schon auf einem PI.

Wobei ich bin nicht 100% sicher das es die Abstürze sind - wobei wenn das Script nicht läuft alles Stabil war. Ich habe aber einiges geändert, weswegen ich es nicht 100% weis. Gerne teile ich euch bei Symcon noch den Key und ihr lasst es mal laufen und schaut ob es Crashed?

Hast du schon mal die Timeout-Idee von Fonzo umgesetzt? Ich könnte mir gut vorstellen, dass es manchmal keine Antwort zur CURL-Anfrage gibt. Damit würde dann das Skript einfrieren und einen Skriptslot blockieren. Durch wiederholtes Aufrufen belegt es dann immer mehr und schließlich sind alle belegt.

Werde ich machen - aber erst in einer Woche, da der Server während des Urlaubs sauber laufen muss. Ist aber ein guter Punkt.

Würde es nicht Sinn machen Scripte nach einer bestimmten Zeit automatisch zu killen (timeout) - dachte das würde sowieso passieren, aber mit dem Aufruf könnte es gehen.

Melde mich hier und schon mal danke. :loveips:

Prinzipiell gibt es von unserer Seite her einen Timeout von 30 Sekunden. Allerdings wird dieser nicht umgesetzt, wenn das Skript systemseitig wirklich hart feststeckt. Dann kommen wir da leider nicht ran und können nichts machen. Verlass dich also nicht zu sehr darauf.

Läuft der Timeout vom Script unabhängig von Symcon und ist somit sicherer weil vom Script direkt aufgerufen?

Der Timeout gilt ja nicht für das Skript generell sondern nur für die CURL Anfrage, aber dadurch verhinderst Du zumindest das sich das Skript aufhängt weil curl immer noch auf eine Antwort wartet.

Danke dir - mal sehen ob es das ist?

Es war der Timeout! Somit kein Problem in Symcon, sondern im Script.

Also kein CURL Script ohne Timeout

curl_setopt($ch, CURLOPT_TIMEOUT, 5);