Da fällt mir noch was wichtiges ein…
Mein erstes Script passte schon, mit der „Erreichbarkeit“, aber das ist natürlich ein eigenes Vraibalenprofil, was ich mal angelegt hatte, welches du natürlich nicht hast. Deshalb kam der Fehler :rolleyes:
So ist das eben, wenn man irgendwann mal ein Script geschrieben hat, was dann nur noch läuft und läuft und man sich nicht mehr weiter damit beschäftigt.
Dazu mal Screenshots, dass du’s einfacher hast. Kannst natürlich dem Profil einen Namen, nach deinem Belieben geben. Muss nur entsprechend mit dem im Script eingetragenen übereinstimmen.
Wahrscheinlich liegts daran.
Jetzt müsstest du die „Kommunikation“-Variablen wieder löschen.
Machst du mit dem Script. Einfach „$create“ auf 0 setzen und dann starten.
Dann Variablen-Profil anlegen. „$create“ wieder auf 1 setzen und Script neu starten.
Also hier dann nochmals das Script:
<?
/*
*******************************************************************************************
Auslesen der Erreichbarkeit von HM-Instanzen - Erstellen, Löschen, Umbenennen der Variablen
*******************************************************************************************
File : HM-CCU abfragen der Erreichbarkeit
Trigger : zyklisch
Interval : stündlich
*/
$ccu = HM_GetHost(ID von CCU-Clientsocket); // IP der Homematic-CCU über Clientsocket-ID abfragen
$function = 2; // Funktion 2 = Abfrage der Erreichbarkeit
$suname = "Kommunikation"; // Variablenname für STICKY-UNREACH
$sualtname = "Kommunikation"; // Alternativer Variablenname für STICKY-UNREACH (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.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, "Erreichbarkeit"); // 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"."
";
}
}
?>
EDIT/
Fehler lag an Zeile 53
$request .= "var $serial = dom.GetObject('BidCos-RF.$serial:0.STICKY_UNREACH').State();
";
funktionierte nicht mehr, obwohls einstmal tat.
Habe die Zeile durch:
$request .= "var $serial = dom.GetObject('BidCos-RF.$serial:0.UNREACH').State();
";
ersetzt und durch Provokation überprüft. Sollte nun wieder funktionieren
Gut, dass wir mal drüber „geredet“ haben, sonst wäre mir der Fehler in Zukunft auch nicht gemeldet worden, wenn ich nicht auf die WebUI der CCU schaue.