Hervorgegangen aus diesem Thread und diesem Thread ist meine Gesamtlösung:
Das Setzen des Batteriezustands in die entsprechenden Boolean-Variablen und falls die Variablen noch nicht existieren, werden sie automatisch mit frei wählbarem Namen angelegt. Zudem besteht die Möglichkeit, die Variablen umzubenennen oder zu löschen.
Achtung! Werden die Variablen gelöscht und danach neu angelegt, haben sich die ID’s geändert!
Beim ersten Durchlauf (wenn die Variablen neu angelegt werden müssen) können einige Sekunden vergehen, bevor alles „an Ort und Stelle ist“
<?
/*
*******************************************************************************************
Auslesen des Batteriezustands an HM-Instanzen - Erstellen, Löschen, Umbenennen der Variablen
*******************************************************************************************
File :
Trigger :
Interval :
*/
$ccu = HM_GetHost(ObjektID von HomeMatic Socket); // IP der Homematic-CCU abfragen
$function = 1; // Funktion 1 = Abfrage des Batteriezustands
$lbname = "Batterie"; // Variablenname für LOW-BATT
$altname = "HM-Batterie"; // Alternativer Name der Variable (beim UMBENENNEN)
$create = 1; // 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($lbname, $id) ) > 0) // Überprüfen ob Variable schon existiert, Ergebnis = NEIN
{
$newid = IPS_CreateVariable(0); // Variable anlegen
IPS_SetVariableCustomProfile ($newid, "~Battery"); // Variablenprofil einstellen
IPS_SetName($newid, $lbname); // 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($lbname, $id); // Überprüfen ob Variable schon existiert, Ergebnis = JA
if ($rename)
{
IPS_SetName($newid, $altname); // 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($lbname, $id); // Überprüfen ob Variable existiert, Ergebnis = JA
IPS_DeleteVariable($newid); // Variablen ($lbname) löschen
}
}
}
?>