Habe nach und nach die Komponenten von ips abgeschaltet und dabei ist mir aufgefallen dass wohl mein soap-query script die load erzeugt…
Folgendes Script nutze ich für cacti und Klima-Daten vom IPS-System zu pollen. Dabei werden alle Thermostate in der Kategorie „Geräte Kategorien“ und der entsprechenden Kategorie für das Geschoss abgefragt… Die Thermostate heissen alle „Raumklima <Raumname>“.
Hinweis: Es sind alles Homematic Thermostate
<?php
### CONFIG
$cat_ids = array(
32614 /*[Geräte Kategorien\Thermostate EG]*/,
29629 /*[Geräte Kategorien\Thermostate DG]*/
);
### CONFIG END
$host = $_SERVER['argv'][1];
$cmd = $_SERVER['argv'][2];
$umlaute = Array("/ä/","/ö/","/ü/","/Ä/","/Ö/","/Ü/","/ß/");
$replace = Array("ae","oe","ue","Ae","Oe","Ue","ss");
$soap_cm = new SoapClient("http://$host:3773/wsdl/IIPSCategoryManager");
$soap_om = new SoapClient("http://$host:3773/wsdl/IIPSObjectManager");
$soap_lm = new SoapClient("http://$host:3773/wsdl/IIPSLinkManager");
$soap_vm = new SoapClient("http://$host:3773/wsdl/IIPSVariableManager");
function GetCompleteData()
{
global $cat_ids, $umlaute, $replace;
global $soap_cm, $soap_om, $soap_lm, $soap_vm;
$resultarr = array();
foreach ( $cat_ids as $cat )
{
$device_links = $soap_om->GetChildrenIDs($cat);
foreach ( $device_links as $device_link )
{
$location = utf8_decode($soap_om->GetName($device_link));
$location = preg_replace("/Raumklima /", "", $location);
$location = preg_replace($umlaute, $replace, $location);
$link = $soap_lm->GetLink($device_link);
$id = $link->LinkChildID;
array_push($resultarr, "$id:$location");
}
}
return $resultarr;
}
function GetDataPoint($id, $type)
{
global $soap_cm, $soap_om, $soap_lm, $soap_vm;
$obj = $soap_om->GetObject($id);
$value = 0;
foreach ( $obj->ChildrenIDs as $item )
{
if ( $soap_om->GetName($item) == "HUMIDITY" )
if ( $type == "humidity" )
$value = $soap_vm->ReadVariableInteger($item);
if ( $soap_om->GetName($item) == "TEMPERATURE" )
if ( $type == "temperature" )
$value = round($soap_vm->ReadVariableFloat($item),2);
}
return $value;
}
if ( $cmd == "query" )
{
$resultarr = array();
$resultarr = GetCompleteData();
foreach ( $resultarr as $item )
{
list($id, $location) = explode(":", $item);
echo "$id:$location
";
}
}
if ( $cmd == "get" )
{
$type = $_SERVER["argv"][3];
$getid = $_SERVER["argv"][4];
$value = GetDataPoint($getid, $type);
echo "$value";
}
?>
Warum dieses Script so eine nachhaltig hohe Load (auch nach der Ausführung) erzeugt, kann ich mir nicht erklären. Evtl. passiert bei einem Soap-Request noch etwas anderes was nicht „offensichtlich“ ist…
Das wirklich seltsame daran ist, dass nach einem frischen Start von ips die Antworten via Soap recht fix kommen. Nach einer längeren Uptime und evtl. schon einigen Soap-Requests dauern die Antworten wesentlich länger!
Wenn ich das Script deaktiviere dann geht die Load auch wieder recht schnell runter und normalisiert sich. Bei dem erneuten Soap-Anfragen dauert die Antwort jedoch trotzdem lange. Evtl. ist im Speicher etwas vorhanden, was sehr viel Zeit zum verarbeiten bedeutet.
Hat evtl. jemand einen Hinweis?
Viele Grüße
Sascha