Hinti,
A couple of months a go I found the following script on the forum. I think it was from Nancilla, but i can’t find it back. The script works in IPS 2.2 version , I haven’t tried it for the 2.3 version.
/*
************************************************** *****************************************
Interpreting the presence of HM-bodies - creating, deleting, renaming the variables
************************************************** *****************************************
File: HM-CCU query the reachability
Trigger: cyclic
Interval: every hour
*/
$ccu = HM_GetHost(55393 /*[HomeMatic Socket]*/); // IP der Homematic-CCU über Clientsocket-ID abfragen
$function = 2; // Funktion 2 = Abfrage der Erreichbarkeit
echo $ccu;
$suname = "COMMUNICATION"; // Variablenname für STICKY-UNREACH
$sualtname = "HM-COMMUNICATION"; // Alternativer Variablenname für STICKY-UNREACH (beim UMBENENNEN)
$create = 0; // ERSTELLEN [Variable 1=Anlegen(Beibehalten) / 0=Löschen]
$rename = 0; // UMBENENNEN [1=JA / 0=NEIN]
if (!$create) $rename = 0; // Wenn Löschen, dann nicht gleichzeitig Umbenennen
// *******************************CCU abfragen - BEGINN**********************************
function GetDeviceStatus($ccu, $function, $devices, &$status)
{
$singleresult = false;
// Check if $devices is an array or not
if (is_string($devices))
{
$singleresult = true;
$devicelist = array($devices);
}
else
{
$devicelist = $devices;
}
// Prepare array for status values
$status = array_flip($devicelist);
// Build request for CCU
$request = "";
foreach($devicelist as $serial)
{
if ($function == 1)
{
$request .= "var $serial = dom.GetObject('BidCos-RF.$serial:0.LOWBAT').Value();
";
}
else
{
$request .= "var $serial = dom.GetObject('BidCos-RF.$serial:0.STICKY_UNREACH').State();
";
}
}
// Open socket for CCU-connection
$fp = fsockopen ($ccu, 8181, $errno, $errstr, 2);
if (!$fp)
{
$status = $errno . "|" . $errstr;
return false;
}
// Sending request to CCU
stream_set_blocking($fp, 1); // sicher gehen, dass der stream im non blocking Mode arbeitet
$st = "POST /tclrega.exe HTTP/1.1
Content-type: application/x-www-form-urlencoded
" .
"Content-Length: " . strlen($request) . "
Connection: Close
";
fputs($fp, $st . $request);
// Receiving result from CCU
$t = "";
$start = false;
while (!feof($fp))
{
$st = fgets($fp);
if ($start) $t .= $st;
if ($st == "
") $start = true;
}
fclose($fp);
// Convert result to XML
$xml = new SimpleXMLElement($t);
// Walk through each key and copy status infos to result-array
foreach($xml as $key => $value)
{
if (array_key_exists($key, $status)) $status[$key] = (strtolower((string)$value) == "true");
}
if ($singleresult) $status = $status[$devices];
return true;
}
// *******************************CCU abfragen - ENDE**********************************
$alleInstanzen = IPS_GetInstanceListByModuleType(3); // alle I/O Instanzen suchen
// Array ausgeben
foreach($alleInstanzen AS $id)
{
$instanz = IPS_GetInstance($id);
$instanz = $instanz['ModuleInfo'];
$instanz = $instanz['ModuleName'];
if ($instanz == "HomeMatic Device") // Vergleich ob das Array den Instanz-Name ausgibt
{
if ($create)
{
$adresse = HM_GetAddress($id); // HM-Seriennummer ermitteln
$devices = substr($adresse,0,10); // HM-Seriennummer ohne Sub-Adresse(:xx)
if ( (@!IPS_GetVariableIDByName($suname, $id) ) > 0) // Überprüfen ob Variable schon existiert, Ergebnis = NEIN
{
$newid = IPS_CreateVariable(0); // Variable anlegen
IPS_SetVariableCustomProfile ($newid, $suname); // Variablenprofil einstellen
IPS_SetName($newid, $suname); // Name für Variable schreiben
IPS_SetParent($newid, $id); // Unter Parent-ID verschieben
GetDeviceStatus($ccu, $function, $devices, &$status); // Funktion - Abfrage der CCU
SetValueBoolean($newid, $status); // Wert in Variable schreiben
}
else
{
$newid = IPS_GetVariableIDByName($suname, $id); // Überprüfen ob Variable schon existiert, Ergebnis = JA
if ($rename)
{
IPS_SetName($newid, $sualtname); // Name für Variable neu schreiben
}
else
{
GetDeviceStatus($ccu, $function, $devices, &$status); // Funktion - Abfrage der CCU
SetValueBoolean($newid, $status); // Wert in Variable schreiben
}
}
}
else
{
$newid = IPS_GetVariableIDByName($suname, $id); // Überprüfen ob Variable existiert, Ergebnis = JA
IPS_DeleteVariable($newid); // Variablen ($lbname) löschen
}
echo "ID: $id S-NR: $adresse Erreichbarkeit(1=gestört): $status"."
"; // Instanzen kontrollieren
echo "$devices ID:$id $varloc"."
";
}
}
It also checks the status of every connected HM device and it generates all the variables.
Hope you can work something out with this :). Have fun
Regards,
Robert
I can read and speak it but can’t write it…