HmIP WEEK_PROFILE programmieren

Hallo da draussen,
gibt es irgend jemanden, der Erfahrungen mit der Programmierung des WEEK_PROFILE von HmIP Schaltern hat?
Ich habe einen HmIP-PSM und würde diesen gerne per Symcon mit Daten beschicken.
So habe ich versucht, z.B. die Einschaltdauer des ersten Timers auf 20 Sekunden zu stellen. Dafür gibt es einen Datenendpunkt namens 01_WP_DURATION_FACTOR.
Mein Versuch sieht so aus:
HM_WriteValueInteger(16315, '01_WP_DURATION_FACTOR', 20);
Angesprochen wird hierbei der Kanal 8 (SWITCH_WEEK_PROFILE) meines Schalters.
Das Resultat:
Warning: HomeMatic Fehler: Invalid parameter or value in /var/lib/symcon/scripts/36247_SetDuration1.ips.php on line 2

Was mache ich falsch?

Cheers, Andreas

Hi Andreas,

vielleicht ist meine Antwort total falsch, aber ich vermute die Profile musst Du via Xml-RPC API setzen.
Jedenfalls lief es so bei den Profilen der HM-Thermostaten und - Stellantrieben.
Ich habe das mal für mein Heizungssteuerungsscript gemacht (Heizkörperthermostat Heizprogramme per WebFront einstellen - #555 von pitti) - nicht ganz trivial :frowning:

Gruß Heiko

Ist das ein Datenpunkte oder ein Konfigurationsparameter?
Parameter kannst du aus IPS aktuell nicht setzten.
Michael

Wenn ich das richtig lese ein „Channel configuration parameters“ :frowning:

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

Hinwei: In der Beta vom HomematicExtended Modul sind die Wochenprofile für die Thermostate enthalten.
Michael

Hallihallo,
danke für die Antwort. Tatsächlich nutze ich dieses dein Modul schon seit Jahren, jedoch noch nicht die neuste Beta. Das werde ich mal testen.
Ich benötige allerdings keine Wochenprofile für Thermostate (diese nutze ich nicht), sondern für Schaltsteckdosen (HmIP-PS-2).
Ist da auch etwas möglich?

Andreas

Habe gerade versucht, ganz simple Kommandos über die xmlrpc zu schicken:

$ip = 'http://192.168.168.40:2010';
$client = new xmlrpc_client($ip);
$request = new xmlrpcmsg("getParamset",array(new xmlrpcval("003AE0C99B8E85:6", "string"), new xmlrpcval("MASTER", "string")));
$response = $client->send($request);
var_dump($response);

Das scheint irgendwie nicht wirklich zu funktionieren, die Antwort ist ziemlich ernüchternd:

object(xmlrpcresp)#2 (9) {
  ["val"]=>
  int(0)
  ["valtyp"]=>
  NULL
  ["errno"]=>
  int(0)
  ["errstr"]=>
  string(0) ""
  ["payload"]=>
  NULL
  ["hdrs"]=>
  array(0) {
  }
  ["_cookies"]=>
  array(0) {
  }
  ["content_type"]=>
  string(8) "text/xml"
  ["raw_data"]=>
  string(0) ""
}

Siehr nicht so aus, als wäre da irgend etwas abgefragt worden

Moin Andreas,

als ich las … von RWN … wusste ich schon was kommt :slight_smile:

Die xmlrpc.inc ist einfach zu alt :frowning: Sie hat - glaube ich - in den letzten Jahren zwar nur wenige wichtige Updates bekommen, aber 1-2 waren schon dabei!

Es gibt/gab 2 Möglichkeiten damit umzugehen:

  1. die bestehende zu patchen (gibts auch paar Anleitungen im Netz wie man das kindof() Problem umgeht)

  2. eine aktuelle Version von xml_rpc verwenden

Leider haben beide Varianten Vor- und Nachteile (jedenfalls habe ich es so empfunden).

zu 1.) [Mein Weg] ist nicht trivial und wenn ich mich richtig erinnere habe ich auch nur die Funktionlitäten gepatch, welche ich gebraucht habe. Also es funktioniert, aber hinsichtlich der Abdeckung der Schnittstelle nicht safe :frowning:
VORTEIL: keine Änderung am bestehenden Code und weiterhin sehr schlank (nur eine Datei)

zu 2.) Die Schnittstelle ist damit komplett abgedeckt, aber es ist zu einer „größeren“ Bibliothek geworden … mit Composer … unzählige Datein usw. Hätte zur Folge gehabt das man den bestehenden Code komplett überarbeiten hätte müssen :frowning:

Ich kann Dir gern meine Datei schicken – aber ohne Garantie auf fehlerfreiheit. Für meine Heizungsscript hat es bist heute aber gereicht!

Gruß Heiko

Ich habe gerade mal geschaut. Bei mir gab es 2 wesentliche Anpassungen:

  • einmal das Thema kindOf (Jahr 2019)
  • und einmal Support für 64bit Systeme (Jahr 2023)

Gruß HEiko

Hallo Heiko,

vielen Dank für die ausführliche Antwort. Ich hatte schon befürchtet, dass das Ganze recht kompliziert ist.
Gerne nehme ich dein Angebot, mir mal deine Datei zu schicken an. Vielleicht reicht das ja schon aus.
Im Grunde betreibe ich hier ohnehin einen Riesenaufwand, nur um zwei Schaltsteckdosen mit Wochenprofilen zu beschicken (die sind für die Bewässerung einiger Pflanzen gedacht). Es ginge und ging auch anders aber mich reizen solche Herausforderungen manchmal und sie würden die Anlage auch etwas weniger störanfällig machen.

LG
Andreas

Hallo Heiko,

noch einmal vielen Dank für deine Hilfe! Mit deiner Datei habe ich es geschafft, das Wochenprofil aus meinen Schaltsteckdosen zu lesen, als auch zu schreiben. Damit bin ich erst mal happy.

Cheers

Andreas

1 „Gefällt mir“