SMA Webbox

Was spuckt er denn aus wenn Du hier nach fragst:

$requestarray = $GetDevices;
 request($webboxip,$requestarray);
 print_r($response);

Hallo
Ich kann keinen Unterschied im Array erkennen, auser das das Array bei mir $requestarray4 heist.
Ich werden Morgen mal bei SMA anrufen und fragen was die Fehlermeldung bedeutet.
Habe mal den Array eingefügt, bekomme aber gleiche Fehlermeldung.
Gruß NetFritz

Ich tippe auf einen falschen Key. Aber wieso dann der Rest geht?!

In Deiner ersten Anfrage hattest Du

xxxxx:xxxxxxxx

als Key … es sollte aber

xxxx:xxxxxxxx

also vier:acht heißen.
Was spuckt er denn als Key aus?

Hallo
Als ich von Hand die Platzhalter eingefügt habe, habe ich die Stellenanzahl falsch eigegeben.
Wenn ich das Array mit „GetDevices“ aufrufe bekomme ich als Key = „004e:7d30b9bc“.
Diesen key habe ich auch beim Array „GetProcessDataChannels“ mit der Variable $device eingefügt.

Gruß NetFritz

Wenn ich den Key bewusst falsch angebe kommt der Fehler bei mir nicht. Kann ihn also so nicht bewusst provozieren.

Hallo
Auch wenn ich das Array „GetProcessDataChannels“ abfrage bekomme ich folgende Fehlermeldung.

stdClass Object
(
    [error] => Version is not supported
    [id] => 
    [proc] => 
    [version] => 1.0
)

Hier das Array „GetProcessDataChannels“

$device="004e:7d30b9bc";
$requestarray3 = '{
"version": "1.0",
"proc": "GetProcessDataChannels",
"id": "1",
"format": "JSON",
"params":
{
"device": "'.$device.'"
}
}'; 

Hier der Aufruf:

    //Aufruf der Funktion REQUEST und übergabe der IP und dem JSON Request
$webboxip = "192.168.2.251";
    request($webboxip,$requestarray3);

function request($webboxip,$requestarray) {

        //codieren in JSON
        $request = json_encode($requestarray);

        // Hier der JSON request
        $request = 'RPC='.rawurlencode($request);
        $timeout =10;
        $ch=curl_init();
        curl_setopt($ch, CURLOPT_URL, "http://".$webboxip."/rpc");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($ch, CURLOPT_HEADER , 0);
        curl_setopt($ch, CURLOPT_POST, 1 );
        curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

        // Hier das Ergebnis
        $response = curl_exec ($ch);
      #  echo "Ausgabe->" . $response;
        if (curl_errno($ch)) {
           $err=1;
           $errtext = curl_error($ch);
        }
     
        curl_close($ch);

        //Decodieren der Antwort
        $response = json_decode($response);
echo "<pre>";
print_r($response);
echo "</pre>";

}

Dein Device Key und meiner - ebenfalls ein 4000TL:

004e:7d30b9bc
7004e:7d313f59

Da könnte bei Deinem die „7“ fehlen?

Bei mir spuckt er folgendes aus:

stdClass Object
(
    [result] => stdClass Object
        (
            [devices] => Array
                (
                    [0] => stdClass Object
                        (
                            [key] => 004e:7d33a5a9
                            [name] => SB 4000TL-20
                        )

                )

            [totalDevicesReturned] => 1
        )

    [id] => 1
    [proc] => GetDevices
    [version] => 1.0
)

Hallo
Was mir jetzt beim Vergleich der Arrays aufgefallen ist nehmen wir mal Post 39 von @honk0504.
„$GetPlantOverView“ und „$GetDevices“ fangen mit Array an haben als Klammen die normalen Klammern „()“ und die Zuweisungen im werden hiermit „=>“ gemacht, es werden auch ’ und " verwendet.
Bei „$GetProcessDataWR1“ steht am Anfang nicht Array sondern ein Hochkomma " ’ " und die Klammern sind spitz „{}“ anstatt von „=>“ steht hier " : ".
Müsste das Array „$GetProcessDataWR1“ nicht auch so aufgebaut sein wie „$GetPlantOverView“ und „$GetDevices“ .

Wenn ich beim Array „GetPlantOverview“ z.B. als Version das so ‚version‘=>„1“, eintrage bekomme ich die gleiche Fehlermeldung.

stdClass Object
(
    [error] => Version is not supported
    [id] => 
    [proc] => 
    [version] => 1.0
)

Gruß NetFritz

Hallo
Habe den Fehler gefunden.

„$GetPlantOverView“ und „$GetDevices“ müssen mit „$request = json_encode($requestarray);“ umgewandelt werden.

Bei „GetProcessDataChannels“ und „GetProcessData“ ist das nicht mehr nötig, da kann der request ohne JSON abgesendet werden.

Vielen Dank für die Unterstützung.
Gruß NetFritz

Nur mal so eine Frage: In diesem Thread liest (zwar ein Solarlog 1000) die Software den WR Wirkungsgrad aus … Kann die SMA Webbox das auch? :wink:

Ich denke das hängt vom WR ab. Bei meinen 3000TL und 4000TL geht das nicht. Fehlt mir aber auch nicht wirklich.

Ich nutze auch einen 4000TL, also wird es bei mir auch nicht gehn. Schlimm ist das sicher nicht. Wäre nur eine Variable bzw. ein Graph mehr. :smiley: :loveips:

Ich habe schon wieder eine Frage dazu. :stuck_out_tongue:
Ich nutze wie gesagt einen 4000er. An dem hängen zwei Strings.
Kann ich Spannung/Strom/Leistung pro String irgendwie auslesen?

Meine Anlage ist nun online.
Dank diesem Thread am gleichen Tag in IPS eingebunden.
Habe alle notwendigen Daten (Strom/Spannung/Leistung/Status) direkt aus der Webbox auslesen können.

Danke.
Thomas

Ich habe seit einiger Zeit einen Fehler im Script, der mir allerdings heute Abend erst aufgefallen ist.
Nach Sonnenuntergang liefert

$value = str_replace(".", ",",($aw->result->devices[0]->channels[0]->value));
if ($value < 0) $value=0;
SetValue(39533 /*[Program\SMA Webbox\Strom aktuell]*/   , $value); //Strom

ein

[0] => stdClass Object
                                        (
                                            [meta] => Ipv
                                            [name] => DC Strom Eingang
                                            [unit] => A
                                            [value] => ---
                                        )

und dies wiederum führt zu folgendem Fehler

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

Wenn ich ein

$value = str_replace(".", ",",($aw->result->devices[0]->channels[0]->value));
if ($value < 0) $value=0;
if ($value = "---") $value=0;
SetValue(39533 /*[Program\SMA Webbox\Strom aktuell]*/   , $value); //Strom

einfüge, dann geht es gar nicht mehr. :mad:
Wie kann ich ein „—“ in eine Null wandeln lassen?

Also bei mir kommt nach Sonnenuntergang (jetzt):
stdClass Object
(
[unit] => A
[meta] => A.Ms.Amp
[name] => A.Ms.Amp
[value] =>
)
Damit geht das ohne Fehlermeldung.
Wobei ich noch ein
if ($value =="") $value=0;
eingefügt habe.
Ich habe an anderen Stellen die Auswertung in
$value=floatval($aw->result->devices[0]->channels[0]->value);
geändert, da ich schon Probleme hatte. Dieser Befehl scheint mir syntaktisch besser zu sein.
Das könnte bei dir helfen.

Gruß Thomas

@Thomas: Klasse! Das hat geholfen.
Nun ist wieder alles schick. Danke.

Hi zusammen,

ich versuche seit Tage die Anbindung des Sunny Home Manager ans IPS - leider erfolglos :frowning:

Es werkelt der TriPower 6000TL und diese ist via BT mit dem Home Manager verbunden, welcher die Daten brav ans SunnyPortal überträgt.

Mit der hier vorgeschriebenen Variante bekomme ich aber gar keine Rückmeldung - cURL Error 7 (couldn’t connect to host).

Dann haben ich es auch über die Modbus versucht (gemäß Beschreibung von SMA), jedoch bekomme ich dort nur folgende Adressen über Device ID 2 ausgelesen.

30001 Versionsnummer des SMA Modbus-Profils
30003 SUSy-ID (Home Manager)
30057 Seriennummer der WebBox
30193 Lesen der Anlagenzeit (UTC) [SerTm]

Die restlichen Adressen werden nicht ausgelesen. Somit kann ich zwar die Systemzeit lesen, komme aber an den Ertrag nicht dran.

Hat jemand eine Idee was ich hier falsch mache bzw hat jemand erfolgreich die Daten per ModBus ausgelesen?

Gruß,
Torsten