XML-RPC PHP Server listMethods / event / Problem

Nutzung von XML RPC, Remote Script, JSON RPC, XMLAPI

Moderator: Co-Administratoren

Antworten
Dancingsheep
Beiträge: 30
Registriert: 10.07.2013, 15:24

XML-RPC PHP Server listMethods / event / Problem

Beitrag von Dancingsheep » 27.11.2015, 14:52

Hey ihr,
Bin dabei für meine Wohnung eine Webbasierte Oberfläche zu bauen. Bis jetzt läuft es eigentlich sehr gut nur bin ich im Log von der CCU 2 auf 2 Probleme gestoßen.

Problem 1: homematic-ccu2 user.err rfd: XmlRpc fault calling system.listMethods({"100300"}) on http://192.xxx.xxx.xxx:80/home/xmlrpc/server.php:[faultCode:3,faultString:"Incorrect parameters passed to method: No method signature matches number of parameters"]

Code: Alles auswählen

function event ($xmlrpcmsg) {
        $meth = $xmlrpcmsg->method();
        $par1 = $xmlrpcmsg->getParam(1);
        $par2 = $xmlrpcmsg->getParam(2);
        $par3 = $xmlrpcmsg->getParam(3);
        //DeviceID
        $deviceID = $par1->scalarval();
        $type = $par2->scalarval();
        // Wert der geändert wurde
        $wert = $par3->scalarval();
        $dbhandler = new db();
        if($type == "ACTUAL_TEMPERATURE") {
            $dbhandler->insertLog($deviceID,$wert,0);
        }
        if($type == "LEVEL"){
            $dbhandler->insertLog($deviceID,$wert,1);
        }
        if( $type == "STATE"){
            $dbhandler->insertLog($deviceID,$wert,2);
        }
        if( $type == "SET_TEMPERATURE"){
            $dbhandler->insertLog($deviceID,$wert,3);
        }

    return new xmlrpcresp(new xmlrpcval("", "string"));
}

function systemlistMethods ($xmlrpcmsg) {
    return new xmlrpcresp(new xmlrpcval("event", "string"));
}


/**
 * Init XML-RPC Server
*/
$s = new xmlrpc_server(
    array(
        "event" => array(
            "function" => "event"
        ),
        "init" => array(
            "function" => "init"
        ),
        "listDevices" => array(
            "function" => "listDevices"
        ),
        "multiCall" => array(
            "function" => "multiCall"
        ),
        "listMethods" => array(
            "function" => "listMethods"
        ),
        "system.listMethods" => array(
            "function" => "systemlistMethods"
        ),
        "newDevices" => array(
            "function" => "newDevices"
        ),
        "newDevice" => array(
            "function" => "newDevice"
        )
    ));
Problem 2:
Nov 27 14:30:01 homematic-ccu2 user.err rfd: XmlRpcClient error calling event({[methodName:"event",params:{"100300","KEQ0231057:1","LEVEL",0.000000}],[methodName:"event",params:{"100300","KEQ0211057:1","WORKING",false}],[methodName:"event",params:{"100300","KE40201057:1","DI
Nov 27 14:30:01 homematic-ccu2 user.err rfd: XmlRpc transport error

Alle events kommen auch an, Problem ist einfach nur das sich der Server nach x Minuten einfach abmeldet, laut Forum weil zu viele errors stattfinden... Gibt offensichtlich workarrounds aber auf die wollte ich gerne verzichten. Es scheint ja tatsächlich ein Problem zu sein.

Vielleicht hat ja einer von euch schon einen PHP XmlRpc Server am laufen und kann mir helfen :)

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: XML-RPC PHP Server listMethods / event / Problem

Beitrag von Familienvater » 27.11.2015, 15:29

Hi,

für PHP kann ich Dir nicht helfen, aber das 1. Problem ist, das normalerweise die listMethods-Methode keine Parameter erwartet, die CCU2 schickt aber die ID der Connection mit, im Zweifelsfall muss einfach nur bei der listMethods-Methode ein Dummy-String als Parameter rein. (Aber wenn nur diese Methode einen Fehler verursacht, ist das weniger ein Problem, die wird nur einmal nach dem Init aufgerufen).

Die events kommen wahrscheinlich aus einem Multicall, und in der Antwort muss für jedes Event aus dem multicall eine leere Antwort geschickt werden. Bei c# hat es geholfen, die event-Methode von void auf string umzustellen, und einfach immer return "" zu geben, damit ist die CCU2 bei mir jetzt vollkommen zufrieden.

Der Familienvater

Dancingsheep
Beiträge: 30
Registriert: 10.07.2013, 15:24

Re: XML-RPC PHP Server listMethods / event / Problem

Beitrag von Dancingsheep » 28.11.2015, 00:47

Hey, die listMethods habe ich nun mal umgeändert, sehen nun so aus:

Code: Alles auswählen

function systemlistMethods () {
    return new xmlrpcresp(new xmlrpcval("event", "string"));
}
function listMethods () {
    return new xmlrpcresp(new xmlrpcval("", "string"));
}
Fehler kommt aber immer noch :/

bei den Events habe ich nicht geändert da ich hier eigentlich bei jedem Request ein Leeren String als return zurückgebe.

Code: Alles auswählen

function multiCall ($xmlrpcmsg) {
    return new xmlrpcresp(new xmlrpcval("", "string"));
}
function event ($xmlrpcmsg) {
    $meth = $xmlrpcmsg->method();
    ...
    return new xmlrpcresp(new xmlrpcval("", "string"));
}
In dem Beispiel XML-RPC Server gibt es noch die Möglichkeiten explizit die Signaturen anzugeben, werd das morgen (nachher) nochmal probieren, jetzt ist grade die Luft raus

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: XML-RPC PHP Server listMethods / event / Problem

Beitrag von Familienvater » 28.11.2015, 10:19

Moin,
Dancingsheep hat geschrieben:Hey, die listMethods habe ich nun mal umgeändert, sehen nun so aus:

Code: Alles auswählen

function systemlistMethods () {
    return new xmlrpcresp(new xmlrpcval("event", "string"));
}
function listMethods () {
    return new xmlrpcresp(new xmlrpcval("", "string"));
}
Fehler kommt aber immer noch :/
Ohne Ahnung von PHP zu haben:

Code: Alles auswählen

function systemlistMethods ($Dummy) {
    return new xmlrpcresp(new xmlrpcval("event", "string"));
}
function listMethods ($Dummy) {
    return new xmlrpcresp(new xmlrpcval("", "string"));
}
Die Methode muss einfach nur einen Parameter vom Typ String erwarten. Anbei der Aufruf bei mir, wobei die ID der Schnittstelle (das was beim Init mitgegeben wird) hier einfach nur langweilig 'id' ist

Code: Alles auswählen

<?xml version="1.0"?>
<methodCall><methodName>system.listMethods</methodName>
<params><param><value>id</value></param></params></methodCall>
Und natürlich muss die Antwort eine Liste der unterstützten Methoden Deiner RPC-Schnittstelle sein, eine akzeptierte Antwort sieht bei mir so aus:

Code: Alles auswählen

<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
	<params>
		<param>
			<value>
				<array>
					<data>
						<value><string>system.listMethods</string></value>
						<value><string>system.methodSignature</string></value>
						<value><string>system.methodHelp</string></value>
						<value><string>system.multiCall</string></value>
						<value><string>system.multicall</string></value>
						<value><string>Event</string></value>
						<value><string>listDevices</string></value>
						<value><string>newDevices</string></value>
						<value><string>deleteDevices</string></value>
						<value><string>updateDevice</string></value>
					</data>
				</array>
			</value>
		</param>
	</params>
</methodResponse>
Wobei ich das eigentlich noch beheben müsste, das 'Event' müsste eigentlich 'event' heißen, aber das stört die Zentrale auch nicht.

Dre Familienvater

Dancingsheep
Beiträge: 30
Registriert: 10.07.2013, 15:24

Re: XML-RPC PHP Server listMethods / event / Problem

Beitrag von Dancingsheep » 28.11.2015, 13:05

Moin moin,
Hab jetzt nochmal ein wenig rumgespielt, leider ohne viel erfolg, nur neue Erkenntnisse
die Listmethodes haben nun wieder einen Parameter, schicken alle Methoden mit, ändert aber nicht wirklich was

Code: Alles auswählen

function systemlistMethods ($id) {
    writeToFile("system.ListMethodes" , "_");
    return new xmlrpcresp(
        new xmlrpcval("event", "string"),
        new xmlrpcval("listDevices", "string"),
        new xmlrpcval("newDevice", "string"),
        new xmlrpcval("newDevices", "string"),
        new xmlrpcval("multiCall", "string")
    );
}
function listMethods ($id) {
    writeToFile("listMethodes" , "_");
    return $this->retVal;
}

Code: Alles auswählen

Nov 28 12:53:01 homematic-ccu2 user.err rfd: XmlRpc fault calling system.listMethods({"100300"}) on http://192.168.178.xxx.xxx/home/xmlrpc/server.php:[faultCode:3,faultString:"Incorrect parameters passed to method: No method signature matches number of parameters"]
Nov 28 12:53:01 homematic-ccu2 user.err rfd: XmlRpc transport error calling listDevices({"100300"}) on http://192.168.178.xxx.xxx/home/xmlrpc/server.php:
Bei den Events hatte ich tatsächlich das Problem das nicht alle Anfragen beantwortet wurden, scheinbar weil ein Fehler beim abfragen der Parameter eintrat. Hab das ganze nun in ein Try & Catch gepackt... nun werden laut meinem Log alle Anfragen beantwortet, die Homematic stört sich aber immer noch dran :/

hier mal beide Logs, da sieht man ganz gut was ankommt und was nicht mehr entwertet wird

Code: Alles auswählen

*** Homematic Log
### XML-RPC Log

*** Nov 28 12:31:54 homematic-ccu2 user.err rfd: XmlRpc fault calling system.listMethods({"100300"}) on http://192.168.xxx.xxx/home/xmlrpc/server.php:[faultCode:3,faultString:"Incorrect parameters passed to method: No method signature matches number of parameters"]
Nov 28 12:31:54 homematic-ccu2 user.err rfd: XmlRpc transport error calling listDevices({"100300"}) on http://192.168.xxx.xxx/home/xmlrpc/server.php:

###  [2015-11-28 12:31:54] (lisDevices) - listDevices


*** Nov 28 12:32:28 homematic-ccu2 user.err rfd: XmlRpcClient error calling event({[methodName:"event",params:{"100300","KEQ0732097:4","CONTROL_MODE",1}],[methodName:"event",params:{"100300","KEQ0732097:4","FAULT_REPORTING",0}],[methodName:"event",params:{"100300","KEQ0732097:4"
*** Nov 28 12:32:28 homematic-ccu2 user.err rfd: XmlRpc transport error

### [2015-11-28 12:32:28] (event) -  + + + Start + + +
### [2015-11-28 12:32:28] (event) - event
### [2015-11-28 12:32:28] (event) - KEQ0732097:4, CONTROL_MODE, 1
### [2015-11-28 12:32:28] (event) -  - - - Stop - - -
### [2015-11-28 12:32:28] (event) -  + + + Start + + +
### [2015-11-28 12:32:28] (event) - event
### [2015-11-28 12:32:28] (event) - KEQ0732097:4, CONTROL_MODE, 1
### [2015-11-28 12:32:28] (event) -  - - - Stop - - -


*** Nov 28 12:32:36 homematic-ccu2 user.err rfd: XmlRpcClient error calling event({[methodName:"event",params:{"100300","KEQ0732097:4","SET_TEMPERATURE",22.000000}],[methodName:"event",params:{"100300","KEQ0732097:4","PARTY_TEMPERATURE",5.000000}],[methodName:"event",params:{"10
*** Nov 28 12:32:36 homematic-ccu2 user.err rfd: XmlRpc transport error


### [2015-11-28 12:32:29] (event) -  + + + Start + + +
### [2015-11-28 12:32:29] (event) - event
### [2015-11-28 12:32:29] (event) - KEQ0732097:4, SET_TEMPERATURE, 22
### [2015-11-28 12:32:29] (event) -  - - - Stop - - -
### [2015-11-28 12:32:36] (event) -  + + + Start + + +
### [2015-11-28 12:32:36] (event) - event
### [2015-11-28 12:32:36] (event) - KEQ0732097:4, SET_TEMPERATURE, 22
### [2015-11-28 12:32:36] (event) -  - - - Stop - - -


*** Nov 28 12:33:24 homematic-ccu2 user.err rfd: XmlRpcClient error calling event({[methodName:"event",params:{"100300","MEQ0251503:4","CONTROL_MODE",0}],[methodName:"event",params:{"100300","MEQ0251503:4","FAULT_REPORTING",0}],[methodName:"event",params:{"100300","MEQ0251503:4"
*** Nov 28 12:33:24 homematic-ccu2 user.err rfd: XmlRpc transport error


### [2015-11-28 12:33:19] (event) -  + + + Start + + +
### [2015-11-28 12:33:19] (event) - event
### [2015-11-28 12:33:19] (event) - MEQ0251503:4, CONTROL_MODE, 0
### [2015-11-28 12:33:19] (event) -  - - - Stop - - -
### [2015-11-28 12:33:24] (event) -  + + + Start + + +
### [2015-11-28 12:33:24] (event) - event
### [2015-11-28 12:33:24] (event) - MEQ0251503:4, CONTROL_MODE, 0
### [2015-11-28 12:33:24] (event) -  - - - Stop - - -
Und hier nochmal mein kleiner "Server", hab auch nochmal die xmlrpc lib ausgetauscht... auch ohne erfolg :/

Code: Alles auswählen

<?php

include "lib_2_2_2/xmlrpc.inc";     // from http://phpxmlrpc.sourceforge.net/
include "lib_2_2_2/xmlrpcs.inc";    // from http://phpxmlrpc.sourceforge.net/
require "../database/db.php";


$retVal = new xmlrpcresp(new xmlrpcval("", "string"));

function event ($xmlrpcmsg) {

    try {
        writeToFile("event" , " + + + Start + + +");
        $meth = $xmlrpcmsg->method();
        writeToFile("event" , $meth);
        //Get Parameters
        $par1 = $xmlrpcmsg->getParam(1);
        $par2 = $xmlrpcmsg->getParam(2);
        $par3 = $xmlrpcmsg->getParam(3);
        //DeviceID
        $deviceID = $par1->scalarval();
        $type = $par2->scalarval();
        $wert = $par3->scalarval();
        writeToFile("event" , $deviceID . ", " . $type . ", " . $wert);
    } catch (Exception $e) {
        writeToFile("Exception" , $e->getMessage());
    } finally {
        writeToFile("event" , " - - - Stop - - -");
        return $this->retVal;
    }

    /*
    $dbhandler = new db();
    if($type == "ACTUAL_TEMPERATURE") {
        $dbhandler->insertLog($deviceID,$wert,0);
    }
    */
}

function init ($xmlrpcmsg) {
    $meth = $xmlrpcmsg->method();
    writeToFile("init" , $meth);
    return $this->retVal;
}

function listDevices ($xmlrpcmsg) {
    $meth = $xmlrpcmsg->method();
    writeToFile("lisDevices" , $meth);
    return $this->retVal;
}

function multiCall ($xmlrpcmsg) {
    $meth = $xmlrpcmsg->method();
    writeToFile("multiCall" , $meth);
    return $this->retVal;
}

function newDevice ($xmlrpcmsg) {
    $meth = $xmlrpcmsg->method();
    writeToFile("newDevice" , $meth);
    return $this->retVal;
}

function newDevices ($xmlrpcmsg) {
    $meth = $xmlrpcmsg->method();
    writeToFile("newDeviceS" , $meth);
    return $this->retVal;
}

function systemlistMethods ($id) {
    writeToFile("system.ListMethodes" , "_");
    return new xmlrpcresp(
        new xmlrpcval("event", "string"),
        new xmlrpcval("listDevices", "string"),
        new xmlrpcval("newDevice", "string"),
        new xmlrpcval("newDevices", "string"),
        new xmlrpcval("multiCall", "string")
    );
}

function listMethods ($id) {
    writeToFile("listMethodes" , "_");
    return $this->retVal;
}

/**
 * Debug Log
 * @param $tag
 * @param $text
 */
function writeToFile($tag,$text) {
    $myfile = fopen("logxml.txt", "a") or die("Unable to open file!");
    $date = date('Y-m-d H:i:s');
    $line = "[" . $date . "] (" .$tag .") - " . $text  . "\n";
    fwrite($myfile, $line);
    fclose($myfile);
}


/**
 * Init XML-RPC Server
*/
$s = new xmlrpc_server(
    array(
        "event" => array(
            "function" => "event"
        ),
        "init" => array(
            "function" => "init"
        ),
        "listDevices" => array(
            "function" => "listDevices"
        ),
        "multiCall" => array(
            "function" => "multiCall"
        ),
        "listMethods" => array(
            "function" => "listMethods"
        ),
        "system.listMethods" => array(
            "function" => "systemlistMethods"
        ),
        "newDevices" => array(
            "function" => "newDevices"
        ),
        "newDevice" => array(
            "function" => "newDevice"
        )
    ));
?>

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: XML-RPC PHP Server listMethods / event / Problem

Beitrag von Familienvater » 28.11.2015, 15:28

Hi,

sorry, aber langsam geht es dann tief nach PHP, ich hoffe, das dann jemand mit mehr Erfahrung übernimmt :-)

Der Familienvater

Dancingsheep
Beiträge: 30
Registriert: 10.07.2013, 15:24

Re: XML-RPC PHP Server listMethods / event / Problem

Beitrag von Dancingsheep » 28.11.2015, 16:14

kein Problem :D
Hab nun beide Fehler entdeckt!

Der Fehler mit dem system.listMethods lag daran, das die "XmlRPC" lib die Methode selber implementiert hat und hier in der Methoden Signatur 2 Arrays erwartet werden, damit kommt die CCU nicht klar.

in Zeile 341, von xmlrpcs.inc, die Zeile 'signature' => $_xmlrpcs_listMethods_sig, löschen oder auskommentieren.
und aus dem Eigenen server die system.listMethods rausnehmen.

der Event Fehler liegt an den zugriff auf Parametern die nicht mitkommen, hier muss ich mal sehen was ich mache.
Merkwürdig daran finde ich nur das es selbst im Try Catch zu XML-RPC Fehlern kommen.. wenn ich alles Rausnehme läuft es ohne Probleme.. Wenn ich das eingegrenzt habe werd ich mich nochmal melden, vielleicht hilft es ja jemanden :)

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“