Script Fehler

Ich bekomme immer eine Fehlermeldung beim Ausführen des Scriptes wenn der Wechselrichter nicht mehr erreicht wird, bzw. wenn keine Spannung mehr von der PV Kommt!

Folgendes Script benütze ich zum Auslesen:


 $content = file_get_contents("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData"); // Dies ist die Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte 

if ($content === False){ 
    echo "Nicht erreichbar"; 
    $pac = 0; 
    $fac = 0; 
    SetValue(23889 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Power]*/,$pac); 
    SetValue(13329 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo AC Frequency]*/,$fac); 
    return; 
// Dies ist die Kontrolle, ob der Wechselrichter erreichbar ist. Wenn nein, dann habe ich Power und Frequency auf null gesetzt, da ich manchmal "Restwerte" von 1 hatte (letzte erreichbare Abfrage war 1W) Die hätte er sonst bis zur nächsten Erreichbarkeit angezeigt. 

} 


$json = json_decode($content); 


//Dies ist die eigentliche Wertabfrage und Zuweisung zu den vorne stehenden Variablen 
//Ihr könnt es mit den Werten ergänzen die Ihr wollt 
$day = $json->Body->Data->DAY_ENERGY->Value; 
$total = $json->Body->Data->TOTAL_ENERGY->Value; 
$year = $json->Body->Data->YEAR_ENERGY->Value; 
$fac = $json->Body->Data->FAC->Value; 
$pac = $json->Body->Data->PAC->Value; 



$day = $day / 1000; // Umrechnung Watt in Kilowatt 
$total  = $total / 1000; 
$year = $year / 1000; 

// Variablenzuweisung mit euren Variablen ändern 
SetValue(28512 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Day Energy]*/,$day); 
SetValue(10011 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Total Energy]*/,$total); 
SetValue(18033 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Year Energy]*/,$year); 
SetValue(13329 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo AC Frequency]*/,$fac); 
SetValue(23889 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Power]*/,$pac);  


Es erscheint dann der Fehler:

Notice: Undefined property: stdClass::$FAC in C:\IP-Symcon\scripts\12250.ips.php on line 25

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\12250.ips.php on line 25

Notice: Undefined property: stdClass::$PAC in C:\IP-Symcon\scripts\12250.ips.php on line 26

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\12250.ips.php on line 26

Warning: Cannot auto-convert to Float from Variant. Error: Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\12250.ips.php on line 38

Warning: Cannot auto-convert to Float from Variant. Error: Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\12250.ips.php on line 39

Kann damit leider nichts anfangen damit???
Danke!

Du hast doch den Fall schon abgefangen:

if ($content === False){ 

Du kannst nicht auf die Objekte zugreifen, da diese nicht existieren wenn $content nicht gefüllt wurde.

Ok, danke!
Aber wie ist es möglich das ich dann die Werte mit einer „0“ Füllen kann?
Da wenn keine Sonne da ist, keine Leistung von der PV kommt, ich aber trotzdem den Wert „2W“ habe?

Bitte noch mal um Erklärung!
Danke

Vlt. solltest du dich etwas genauer ausdrücken!? :wink: Wo wie was wieso warum weshalb? :slight_smile:

Wenn du meinst was ich denke, dann ist die Antwort dazu:

$json = json_decode($content);  

> Die Zeile und die darunter (in deinem Skript) ergeben Fehler, wenn $content leer ist.

Du müsstest also dein Skript umbauen, dass alles mit $content nur „bearbeitet“ wird, wenn $content != false

Also deine „if ($content === False){“ muss bis zum Ende vom Skript alles beinhalten. Also die „}“ ans Ende setzen könnte ausreichen.
…ansonsten mal neu dein Skript posten und die Fehler…

Grüße,
Chris

Hallo.
Danke für die schnelle Antwort!!

Das Script verwende ich zum Auslesen des Fronius Wechselrichters.

Wenn dieser On ist, also die PV Spannung vorhanden ist, funktioniert das Script Problemlos.
Nur wenn die PV Spannung nicht mehr vorhanden ist, kommt der Fehler im Script! Die Variable die „Leistung“ und „Frequenz“ ausfüllt wird dann nicht mehr Aktualisiert! Es sollte beim nicht erreichen des Wechselrichters dann eine „0“ stehen.

Ah, danke!! Funktioniert :slight_smile:
Jetzt wird alles aktualisiert, auch der Wert für Leistung!

Poste mal dein komplettes Skript, so wie es jetzt aussieht, ich glaub ich hab mich falsch ausgedrückt. Mal sehen, ob du es aber so umgesetzt hast, wie ich es meinte :smiley:

Grüße,
Chris

Hallo,

hab mich doch etwas zu früh gefreut! Jetzt werden zwar die Variablen „Leistung“ und „Frequenz“ auf null gesetzt wenn der Wechselrichter nicht erreichbar ist, aber auch dann wenn die Sonne scheint :-/ Per Anhang das Script!

Hab die Klammer so gesetzt: {if ($content === false) da hat es mir keine Werte mehr aktualisiert! Ausser der Wechselrichter war nicht erreichbar!

Jetzt hab ich die Klammer nach: if ($content === false) { gesetzt, da werden alle Werte wieder aktualisiert, ausser der Wechselrichter ist nicht erreichbar, dann werden die Variablen „Leistung“ und „Frequenz“ nicht mehr aktualisiert??



<?

 $content = file_get_contents("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData"); // Dies ist die Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte

{if ($content === false)
    echo "Nicht erreichbar";
    $pac = 0;
    $fac = 0;
    SetValue(23889 /*[PV Anlage\PV Ertrag - Nutzung\Leistung]*/,$pac);
    SetValue(13329 /*[PV Anlage\PV Ertrag - Nutzung\AC Frequenz]*/,$fac);
    return;
// Dies ist die Kontrolle, ob der Wechselrichter erreichbar ist. Wenn nein, dann habe ich Power und Frequency auf null gesetzt, da ich manchmal "Restwerte" von 1 hatte (letzte erreichbare Abfrage war 1W) Die hätte er sonst bis zur nächsten Erreichbarkeit angezeigt.


}

$json = json_decode($content);


//Dies ist die eigentliche Wertabfrage und Zuweisung zu den vorne stehenden Variablen
//Ihr könnt es mit den Werten ergänzen die Ihr wollt
$day = $json->Body->Data->DAY_ENERGY->Value;
$total = $json->Body->Data->TOTAL_ENERGY->Value;
$year = $json->Body->Data->YEAR_ENERGY->Value;
$fac = $json->Body->Data->FAC->Value;
$pac = $json->Body->Data->PAC->Value;



$day = $day / 1000; // Umrechnung Watt in Kilowatt
$total  = $total / 1000;
$year = $year / 1000;

// Variablenzuweisung mit euren Variablen ändern
SetValue(28512 /*[PV Anlage\PV Ertrag - Nutzung\Tages Energie]*/,$day);
SetValue(10011 /*[PV Anlage\PV Ertrag - Nutzung\Total Energie]*/,$total);
SetValue(18033 /*[PV Anlage\PV Ertrag - Nutzung\Jahres Energie]*/,$year);
SetValue(13329 /*[PV Anlage\PV Ertrag - Nutzung\AC Frequenz]*/,$fac);
SetValue(23889 /*[PV Anlage\PV Ertrag - Nutzung\Leistung]*/,$pac);

?>

Probier mal so:

<?
// Dies ist die Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte
// $content = @file_get_contents("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgiScope=Device&DeviceID=1&DataCollection=CommonInverterData");
$content = @Sys_GetURLContent("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgiScope=Device&DeviceID=1&DataCollection=CommonInverterData");

if ($content === false) {
	// Dies ist die Kontrolle, ob der Wechselrichter erreichbar ist. Wenn nein, dann habe ich Power und Frequency auf null gesetzt, da ich manchmal "Restwerte" von 1 hatte (letzte erreichbare Abfrage war 1W) Die hätte er sonst bis zur nächsten Erreichbarkeit angezeigt.
   echo "Nicht erreichbar";
   $pac = 0;
   $fac = 0;
   SetValue(23889 /*[PV Anlage\PV Ertrag - Nutzung\Leistung]*/,$pac);
   SetValue(13329 /*[PV Anlage\PV Ertrag - Nutzung\AC Frequenz]*/,$fac);
   return;
}
else {
	//Dies ist die eigentliche Wertabfrage und Zuweisung zu den vorne stehenden Variablen
	//Ihr könnt es mit den Werten ergänzen die Ihr wollt
	$json = json_decode($content);

	$day = $json->Body->Data->DAY_ENERGY->Value;
	$total = $json->Body->Data->TOTAL_ENERGY->Value;
	$year = $json->Body->Data->YEAR_ENERGY->Value;
	$fac = $json->Body->Data->FAC->Value;
	$pac = $json->Body->Data->PAC->Value;

	$day = $day / 1000; // Umrechnung Watt in Kilowatt
	$total  = $total / 1000;
	$year = $year / 1000;

	// Variablenzuweisung mit euren Variablen ändern
	SetValue(28512 /*[PV Anlage\PV Ertrag - Nutzung\Tages Energie]*/,$day);
	SetValue(10011 /*[PV Anlage\PV Ertrag - Nutzung\Total Energie]*/,$total);
	SetValue(18033 /*[PV Anlage\PV Ertrag - Nutzung\Jahres Energie]*/,$year);
	SetValue(13329 /*[PV Anlage\PV Ertrag - Nutzung\AC Frequenz]*/,$fac);
	SetValue(23889 /*[PV Anlage\PV Ertrag - Nutzung\Leistung]*/,$pac);
}
?>

Eigentlich müsste „file_get_contents“ noch ausgetauscht werden gegen „Sys_GetURLContent“. Weil „file_get_contents“ läuft in einen Fehler und wird nicht abgefangen. Aber keine Ahnung wie das mit json_decode dann ist. Probier mal mit „Sys_GetURLContent“.

Grüße,
Chris

Danke,

momentan bekomm ich folgende Meldung beim Ausführen:

Warning: HTTP/1.1 404 Not Found in [PV Anlage\Auslesescript] on line 5
Nicht erreichbar

müsst aber passen, da der Wechselrichter nichts mehr Liefert, also nicht Erreichbar ist??

Nun werden nur die beiden Varis Leistung und Frequenz auf Null gesetzt, die anderen Varis bleiben gleich!

Ja, dann passts so. Änder aber mal noch ein @ mit in die Zeile, also so:

$content = @Sys_GetURLContent("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgiScope=Device&DeviceID=1&DataCollection=CommonInverterData"); 

Dann kommt der andere Fehler nicht mehr. Jetzt musst du nur mal sehen, wenn die Anlage Werte liefert, ob das dann mit dem json_decode funktioniert.

Grüße,
Chris

Danke, werd ich morgen mal Gucken :slight_smile:

Beim Ausführen des Scriptes unter PV Spannung bekomm ich leider die Fehlermeldung „nicht erreichbar“?
Leistung und Frequenz werden zwar aktualisiert, jedoch mit einer Null befüllt.
Die anderen Varis werden leider gar nicht aktualisiert :-/ hmm…

Dein Ernst? :smiley: Das „Nicht erreichbar“ kommt wegen dem „echo“ :wink: :smiley:

Also jetzt sollte das eigentlich abfragen können, also $Content sollte was drinne haben, aber trotzdem kommt „nicht erreichbar“?

Grüße,
Chris

Hallo,
ja genau! Da kommt die Meldung nicht erreichbar.

Die Meldung und die 0 gefüllten Variablen sollen dann sein, wenn die Abfrage "$content = @Sys_GetURLContent("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgiScope=Device&DeviceID=1&DataCollection=CommonInverterData");" nicht funktioniert, bzw. nichts zurück gibt.

Deswegen meine Frage > sollte denn da aktuell eigentlich was kommen? Ist das Gerät erreichbar? Weiß ja nicht wie das bei dir da geschaltet ist und wie dann da nichts kommt oder doch und erreichbar oder nicht…

-Chris-

Ja, das hab ich soweit verstanden, wenn der WR nicht erreichbar ist, kommt auch eine Null.
Nur so wie es jetzt ist, müsste der WR ja die aktuelle Leistung in die Variable schreiben bzw. das Script.

Also sollte momentan deine Anlage eigentlich erreichbar sein und Werte ausspucken?

Dann führ mal dieses Skript aus und poste bitte die Ausgabe:

<? 
$content = Sys_GetURLContent("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgiScope=Device&DeviceID=1&DataCollection=CommonInverterData"); 
echo "echo - Content:".$content."
";
print_r($content);
?>

-Chris-

Danke!!
Folgende Meldung bekomme ich:

Warning: HTTP/1.1 404 Not Found in C:\IP-Symcon\scripts\12285.ips.php on line 2
echo - Content: