SOLVED: Abfrage des Room über getDeviceDescription funktioniert nicht über den XMLRPC Client

Hallo,

ich benutze Homegear 0.8.0-2302 (nightly) auf einem Raspi 3.

Um die Rooms abzufragen, benutze ich die Funktion getDeviceDescription.

Folgender PHP-Code liefert das korrekte Ergebnis, wenn er direkt über homegear ausgeführt wird:

$description=$hg->getDeviceDescription(2,-1,[“ROOM”]);
var_dump($description);

Ergebnis:

array(1) {
[“ROOM”]=>
int(1)
}

Wenn ich die Abfrage aber von einem anderen Computer aus über den XMLRPC Client ausführe, erhalte ich keinen Rückgabewert für den Room:

$description=$Client->send(“getDeviceDescription”,array(2,-1,[“ROOM”]));
var_dump($description);

liefert leider das Ergebnis

array(1) {
[“ROOM”]=>
NULL
}

Ich verwende keine Authentifizierung und alle anderen Befehle über die XMLRPC Schnittstelle funktionieren problemlos. Es kann also kein generelles Issue sein.
Andere Description-Felder wie z.B. „NAME“ geben jeweils das richtige Ergebnis zurück.

Das Logfile zeigt an, dass Homegear eigentlich die richtige Antwort zurückschickt:

09/14/18 15:01:44.297 RPC Server (Port 2001): Info: Client number 548 is calling RPC method: getDeviceDescription (1) Parameters:
(Integer) 2
(Integer) -1
(Array length=1)
{
(String) ROOM
}

09/14/18 15:01:44.298 RPC Server (Port 2001): Response:
(Struct length=1)
{
[ROOM]
{
(Integer64) 1
}
}

Kann das an der PHP Version liegen ? Auf dem Client läuft PHP7.0.

Abgesehen davon, wie wäre es mit einer Funktion getDeviceRoom o.Ä., die gleich die Room-ID eines Devices liefert ? Das wäre wirklich praktisch.

Vielen Dank !

Viele Grüße

FiveEights

1 Like

Hallo,

da es ja leider bis jetzt noch keinen Input zum dem Thema gab, habe ich etwas weiter geforscht.

In der neuen Admin-UI ist ja die Zuordnung der Räume zu Devices auch möglich und funktioniert dort nach meinen ersten Versuchen auch ganz gut.

Nur bei der Abfrage über den XMLRPC-Client bin ich noch nicht weitergekommen…

Bei der Analyse von homegear.log ist mir aufgefallen, dass vom RPC-Server der “ROOM” mit dem Typ “Integer64” zurückgeliefert wird. Andere Variablen, die funktionieren (z.B. “VERSION”) liefern hier immer den Typ “Integer” zurück.

Kann das die Ursache für das Issue sein ? Anscheinend kann der Client die XML-Rückgabe des Servers nicht korrekt parsen…

Wenn jemand eine Idee hat, wäre ich echt dankbar !

Viele Grüße

FiveEights

Hallo,

ich habe bei diesem Issue noch etwas weiter geforscht. Nach meiner Auffassung handelt es sich um einen Bug - allerdings nicht in Homegear, sondern in der PHP-Funktion xmlrpc_decode. Zum Glück gibt es aber einen einfachen Workaround.

In der send-Funktion des XMLRPC Clients kommt beispielsweise folgende Antwort des Servers an und wird in der Variable $response gespeichert:

<?xml version="1.0"?>
<methodResponse>
<params>
<param><value><struct><member><name>ROOM</name><value><i8>1</i8></value></member>
<member><name>VERSION</name><value><i4>26</i4></value></member></struct></value></param>
</params>
</methodResponse>

Hier ist also der ROOM noch korrekt gesetzt. Nach der Verarbeitung von $response durch xmlrpc_decode wird allerdings für ROOM nur noch NULL zurückgeliefert.
Wenn ich in $response “i8” manuell durch “i4” ersetze und dann die geänderte Variable an xmlrpc_decode übergebe, dann wird das XML korrekt verarbeitet.

Eine kurze Google-Suche zu xmlrpc_decode ergab schließlich, dass es sich um einen bekannten Bug der Funktion beim Typ “i8” handelt.
Als Workaround ersetzt man einfach in $response die Zeichenkette “i8” durch “i4”.

Die kann man z.B. erreichen, indem man in Client.php in der Funktion “send” folgende Zeile vor den Aufruf von xmlrpc_decode einfügt:

$response = str_replace('i8>', 'i4>', $response);

Viele Grüße

FiveEights

3 Likes