Hallo Heiko,
nachdem ich mein Projekt, Week_profile zu programmieren lange auf Eis liegen hattte, versuche ich es mal wieder.
Leider verzweifle ich daran.
Um überhaupt zu verstehen, wie das mit der xml_rpc Schnittstelle funktioniert, habe ich mir dein Heizungssteuerungsscript vorgenommen und einige wenige Zeilen davon herausgeschnitten.
# RPC clients
$client = array();
#
# Service IP (CCUx)
$ip = '192.168.168.40';
#
$wfc = 0;
#
# BidCos Service Port (true = vorhanden & aktiv)
$service = array('ID' => 1, 'TYPE' =>'IP', 'PORT' =>2010, 'ACTIVE' => true); // HM IP
require "xmlrpc.inc" ;
//Init XMLRPC clients
Init();
// wichtig, da sonst am Tag der Zeitumstellung WZ/SZ Konflikte auftreten.
date_default_timezone_set('UTC');
$cid = CreateVariableByName($_IPS['SELF'], "Types", 3);
var_dump($cid);
$types = unserialize(GetValue($cid));
var_dump($types);
$devices = DevicesList();
# ------------------------------ Funktionen ------------------------------------
// Erzeugt pro aktiven Interface ein Client.
function Init() {
global $ip, $service, $client;
# Return Code
$ret = true;
# Check all Services
//foreach($service as $s) {
if($service['ACTIVE'] == true) {
if (!isset($client[$service['TYPE']]) || $client[$service['TYPE']] !== false) {
$client[$service['TYPE']] = new xmlrpc_client("http://".$ip.":".$service['PORT']);
if ($client[$service['TYPE']] !== false) {
$ret &= true;
}
else {
$ret = false;
}
}
}
//}
// client existieren schon
return false;
}
// Liefert alle Geräte der aktierten Interfaces
function DevicesList()
{
global $service, $client;
// listDevices
$request = new xmlrpcmsg('listDevices');
// merge all together
$devices = array();
//foreach($service as $s) {
var_dump($service);
if($service['ACTIVE'] == true) {
$ret = Send($request, $service['TYPE']);
var_dump($ret);
foreach($ret as $device) {
$device['INTERFACE'] = $service['ID'];
$devices[] = $device;
}
}
//}
return $devices;
}
function ReadParamSet($if, $address, $channel, $param = false) {
// Build request
$request = new xmlrpcmsg("getParamset",
array(new xmlrpcval("$address:$channel", "string"), new xmlrpcval("MASTER", "string")));
$messages = Send($request, $if);
//var_dump($messages);
if ($param !== false) return $messages[$param];
return $messages;
}
// Creates XMLRPC Client Instance and sends request
function Send($request, $type)
{
global $client;
// If the client does not exist, initialise it here
if (isset($client[$type]) && $client[$type] !== false) {
$response = $client[$type]->send($request);
if ( $response->errno == 0 ) {
$messages = php_xmlrpc_decode($response->value());
}
else {
die("Error: Send() Request to $type Service failed -> $response->errstr!
");
}
}
return $messages;
}
Dabei nutze ich die xmlrpc.inc von RWN und versuche über kleine Schnipsel deines Scripts die xml_rpc Programmierung zu erlernen.
Ich stosse dabei immer wieder auf Probleme. Wenn ich z.B. die DeviceList() Funkion aufrufe, erhalte ich immer den Fehler
Fatal error: Uncaught Error: Call to a member function kindOf() on int in /var/lib/symcon/scripts/xmlrpc.inc:3289
Stack trace:
#0 /var/lib/symcon/scripts/44596.ips.php(160): php_xmlrpc_decode(0)
#1 /var/lib/symcon/scripts/44596.ips.php(130): Send(Object(xmlrpcmsg), 'IP')
#2 /var/lib/symcon/scripts/44596.ips.php(89): DevicesList()
#3 {main}
thrown in /var/lib/symcon/scripts/xmlrpc.inc on line 3289
Was mag hier wohl schief laufen?
Im Grunde brauche ich für meine Bedürfnisse nur ein oder zwei Befehle, um das Week_Profile anzusprechen:
getParamset zum Auslesen der Einstellungen und setParamset zum Schreiben derselben.
Aber auch hier bekomme ich oben genannte Fehlermeldung.
$result = ReadParamSet("IP", "003AE0C99B8E85", 6);
ergibt
Fatal error: Uncaught Error: Call to a member function kindOf() on int in /var/lib/symcon/scripts/xmlrpc.inc:3289
Stack trace:
#0 /var/lib/symcon/scripts/44596.ips.php(96): php_xmlrpc_decode(0)
#1 /var/lib/symcon/scripts/44596.ips.php(81): Send(Object(xmlrpcmsg), 'IP')
#2 /var/lib/symcon/scripts/44596.ips.php(28): ReadParamSet('IP', '003AE0C99B8E85', 6)
#3 {main}
thrown in /var/lib/symcon/scripts/xmlrpc.inc on line 3289
Kannst du mir auf die Sprünge helfen?
Ist die genutze xmlrpx.inc für meine Zwecke unbrauchbar?
LG
Andreas