Script Fehler

Naja, dann war mein Skript doch richtig mit „Nicht erreichbar“. Wenn nicht erreichbar, dann soll er überall 0 reinschreiben. Hat er gemacht, also vom Skript her alles ok.

?!?!?!

Warum deine Anlage nicht erreichbar ist, oder ob du nur eine falsche URL eingetragen hast, das kann ich dir nicht beantworten :slight_smile:

-Chris-

Hmm, das versteh ich jetzt aber auch nicht??

So geht’s:


$content = file_get_contents("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData");


Falsch.
Den Fehler hast du schon im 10 Post eingebaut. Der URL fehlt das Fragezeichen :smiley:
Original:


 $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 

‚Fälschung‘:


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

So ist es richtig:


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

Um noch mal auf die Originalfrage zurück zu kommen.

  1. Wenn nicht Erreichbar wird das Script mit Return verlassen… wozu jetzt noch mehr Klammern :confused:
  2. Wenn Erreichbar werden 5 Werte gelesen… aber manchmal gibt es die besagten Fehler aus Post eins (vermutlich wenn noch erreichbar, aber keine Leistungs-Werte mehr)

Hier noch mal die Fehler:

Also werden DAY_ENERGY, TOTAL_ENERGY und YEAR_ENERGY noch geliefert, aber FAC & PAC nicht.
Fehlermeldung 1 & 3 weil es FAC & PAC nicht gibt. Fehler 2 & 4 weil versucht wird von den nicht vorhandenen Objekten FAC & PAC ein Wert zu lesen.
5 & 6 sind dann die Meldungen von IPS das er ‚Null‘ (nicht die Zahl sondern einfach ‚nichts‘) nicht in Float wandeln kann.

Also warum nicht prüfen ob es FAC und PAC gibt ?


if (property_exists($json->Body->Data,"FAC"))
{
  $fac = $json->Body->Data->FAC->Value; 
} else {
  $fac = 0;
}
if (property_exists($json->Body->Data,"PAC"))
{
  $pac = $json->Body->Data->PAC->Value; 
} else {
  $pac = 0;
}

Michael

@Michael: Deine Variante sieht gut aus :slight_smile:
Hättest dich ruhig mal früher einschalten können :smiley: Ich hab nur mit dem gearbeitet was ich hatte. Wie an anderer Stelle erwähnt - bin ich kein Experte :smiley:

Grüße,
Chris

Ich auch nicht :wink:

Sag doch sowas nicht :frowning: Weil wenn du kein Experte bist, ich aber „schlechter“ als du bin, dann wäre ich ja nur Anfänger :frowning: :smiley: Oder ein angefangener Fortgeschrittener!? :smiley: :smiley:

Hallo Michael,
also müsst ich dies


if (property_exists($json->Body->Data,"FAC"))
{
  $fac = $json->Body->Data->FAC->Value; 
} else {
  $fac = 0;
}
if (property_exists($json->Body->Data,"PAC"))
{
  $pac = $json->Body->Data->PAC->Value; 
} else {
  $pac = 0;
}

statt dem


if ($content === false) 

benützen?

Ich glaube, dass Michael das so haben wollte: :slight_smile:

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

//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;

// Prüfen ob FAC vorhanden, wenn JA, dann Wert schreiben, wenn NEIN, dann 0
if (property_exists($content->Body->Data,"FAC")) {
  $fac = $json->Body->Data->FAC->Value;
}
else {
  $fac = 0;
}

// Prüfen ob PAC vorhanden, wenn JA, dann Wert schreiben, wenn NEIN, dann 0
if (property_exists($content->Body->Data,"PAC")) {
  $pac = $json->Body->Data->PAC->Value;
}
else {
  $pac = 0;
}

// Sonstige Daten
$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);
?>

Allerdings hatte ich es zwischenzeitlich so verstanden, dass du, wenn „keine Werte kommen“ dann trotzdem Werte von 2 oder so da stehen hast, diese aber nicht willst und dann die 0 geschrieben werden sollten!? Aber was du nun wirklich so alles bei dir wie da hast, das kann man leider nur raten…

Grüße,
Chris

naja, schön langsam versteh ich die Vorgangsweise der Abfrage.
Ein Problem in Reihe 14 hab ich jedoch noch:

Parse error: syntax error, unexpected ‚{‘ in [PV Anlage\Auslesescript] on line 14

doch die „Klammer“ benötige ich doch??

Die Klammern sind richtig.

Bei dem exist Befehl bin ich mir aber nicht sicher, den kenne ich nicht mit json.

Probier mal die 2 Zeilen
if (property_exists($content->Body->Data,„FAC“)) {
if (property_exists($content->Body->Data,„PAC“)) {

Austauschen gegen die 2 Zeilen
if (property_exists($content->Body->Data->FAC)) {
if (property_exists($content->Body->Data->PAC)) {

Oder gegen die 2 Zeilen
if (property_exists($content->Body->Data->FAC->Value)) {
if (property_exists($content->Body->Data->PAC->Value)) {

Könntest du auch selbst mal versuchen :wink:
Oder das PHP Manuel zu „proberty_exists“ lesen :wink:

-Chris-

@Chris:
Bevor du selbst es zig mal falsch vorschlägst… schau doch auch in das Manual :rolleyes:
Oder kopier meinen Code richtig.
Es darf bei property_exists nicht auf den String $content, sondern nur auf ein Objekt geprüft werden.
Also auf $json, welches ein Objekt ist.

Hier mal was gemacht werden ‚müßte‘.

[ul]
[li]Original-Script nehmen[/li][li]Änderung von file_get_contents zu SYS_GetUrlContent[/li][li]echo raus (wird als Script-Fehler geworfen) und IPS_LogMessage rein.[/li][li]’$fac = $json->Body->Data->FAC->Value’ ersetzen durch den Block mit der Prüfung durch property_exists (+ 1x PAC)[/li][/ul]

Eigentlich meinte ich das dann so:


<?
$content = @Sys_GetURLContent("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){ 
    IPS_LogMessage("PV-Anlage","Gerät ist 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; // Hier wird das Script verlassen !
// 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; 

//alt : $fac = $json->Body->Data->FAC->Value; 
if (property_exists($json->Body->Data,"FAC"))
{
  $fac = $json->Body->Data->FAC->Value; 
} else {
  $fac = 0;
}
// alt: $pac = $json->Body->Data->PAC->Value; 
if (property_exists($json->Body->Data,"PAC"))
{
  $pac = $json->Body->Data->PAC->Value; 
} else {
  $pac = 0;
}  



$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); 
?>

Michael

Was soll ich sagen…

…im PHP Manual habe ich nachgesehen, aber leider kein Beispiel nach dem Motto „$json->Body->Data->“ oder sowas in der Art gefunden. Nur „string $property“ und da hab ich gedacht und falsch gedacht :slight_smile:

…deinen Code hab ich kopiert und nur die Klammern verschoben wie ich es halt schreibe :slight_smile:

…ich versuche zu helfen so gut ich kann, aber wenn ich das nicht selbst so bei mir nachstellen kann, fällt mir das noch nicht ganz so leicht wie anderen…je nachdem um was es geht und wie der Fragende mitarbeitet :slight_smile: Aber ich gelobe Besserung und poste nur noch wenn ich mir sicher bin :slight_smile: Bin ja im Lernprozess :smiley:

Grüße,
Chris

Ich habe auch nicht seine Hardware, und auch kenne ich bestimmt nicht alles.
Ich kannte bis vorhin auch PHP: property_exists - Manual nicht.
Habe einfach aufgrund der Fehlermeldungen (Objekt Eigenschaft existiert nicht) mal im Manual nachgesehen.
Mir dann einfach mal schnell mit einem String im Json -Format kopiert und mit json_decode mir ein Objekt in erzeugt.
Dann konnte ich das selbst ausprobiert und nachstellen.
So was mache ich öffters mal um einfach nachzuvollziehen… wie geht das; was wollen die im Manual von mir.

Dann sieht man auch häufig schon die Zusammenhänge.

Es bringt dann einfach nichts zu raten :smiley:

Ich mache dir bei Leibe keinen Vorwurf hier das du helfen möchtest, im Gegenteil. Es ist toll dass du so aktiv ist.
Nur manchmal bist du etwas zu fix dabei; da passieren auch Fehler (naja wer nie arbeitet macht auch keine Fehler, oder wie war dass :D:D )

Michael

PS: Und nein du hattest nicht das Beispiel kopiert… dort stand das schon richtig mit $json-> :stuck_out_tongue:
Aber nun genut OT… @michl: Gehts jetzt ? Ich geh’ nun aufs Sofa…Bis morgen

Guten Abend!

Danke für die Hilfe von euch beiden :slight_smile:
Werde das Script morgen ausprobieren, da heute nimmer die Sonne scheint und der Wechselrichter nichts mehr Liefert!

Lg

Hallo euch beiden!

Nun das Script funktioniert jetzt wunderbar :slight_smile:
Auch wenn der WR nicht Erreichbar ist werden die Werte „Leistung“ und „Frequenz“ aktualisiert bzw. auf Null gesetzt!

Vielen Dank!!!