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
Falsch.
Den Fehler hast du schon im 10 Post eingebaut. Der URL fehlt das Fragezeichen
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
Um noch mal auf die Originalfrage zurück zu kommen.
Wenn nicht Erreichbar wird das Script mit Return verlassen… wozu jetzt noch mehr Klammern
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.
@Michael: Deine Variante sieht gut aus
Hättest dich ruhig mal früher einschalten können Ich hab nur mit dem gearbeitet was ich hatte. Wie an anderer Stelle erwähnt - bin ich kein Experte
Sag doch sowas nicht Weil wenn du kein Experte bist, ich aber „schlechter“ als du bin, dann wäre ich ja nur Anfänger Oder ein angefangener Fortgeschrittener!?
<?
// 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…
@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);
?>
…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
…deinen Code hab ich kopiert und nur die Klammern verschoben wie ich es halt schreibe
…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 Aber ich gelobe Besserung und poste nur noch wenn ich mir sicher bin Bin ja im Lernprozess
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
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->
Aber nun genut OT… @michl: Gehts jetzt ? Ich geh’ nun aufs Sofa…Bis morgen
Danke für die Hilfe von euch beiden
Werde das Script morgen ausprobieren, da heute nimmer die Sonne scheint und der Wechselrichter nichts mehr Liefert!
Nun das Script funktioniert jetzt wunderbar
Auch wenn der WR nicht Erreichbar ist werden die Werte „Leistung“ und „Frequenz“ aktualisiert bzw. auf Null gesetzt!