Für 192.168.178.99 musst Du die IP-Adresse Deiner CCU angeben. Danach erfolgt der Aufruf per:
$befehl="var result = dom.GetObject('BidCos-RF.DEQ0010906:0.STICKY_UNREACH');"
$result=Post_Request ($befehl);
in $result steht dann das Ergebnis. Aber bitte beachten, dass $result immer ein String ist! Du kannst so auch alle Geräte schalten, den Batteriestatus abfragen, Systemvariablen auslesen…
IP-Symcon zeigt nur Variablen an, die sich verändern. Sobald die CCU eine Veränderung an einem Datenpunkt sendet, wird diese auch in IP-Symcon angezeigt.
Ja stimmt, wenn IPS aber gerade nicht aktiv ist, dann werden Änderungen beim nächsten IPS Start nicht angezeigt.
Hierfür ist obiges Script geeignet um den Status später noch abfragen zu können. Die dazugehörige IPS Variable muss dann natürlich vom Script entsprechend dem zurückgelieferten Status gesetzt werden.
Ach ja eine kleine Einschränkung habe ich noch. Wenn ständig die Statis abgefragt werden, kann das die CCU lahmlegen. Wer z. B. 120 Geräte pro Minute abfragt und das über Stunden, der wird seine CCU öfter neu starten müssen. Die Funktion muss also vorsichtig benutzt werden. Geräte, die ohnehin ständig Werte liefern sollten von der Abfrage ausgenommen werden.
Ein weiterer Trick um die Abfragen zu minimieren besteht darin, mehrere Geräte gleichzeitig abzufragen. Hierzu müssen die Befehle einfach hintereinander gesetzt werden. Ein Aufruf reicht dann aus. Die Variablen müssen natürlich alle unterschiedlich benannt werden, dann kann man aus dem XML-Ergebnis alle Daten abfragen.
Für alle, die mehrere Geräte abfragen wollen hier mal meine Funktion, die aus obigem Script von Christoph entstanden ist. Die Funktion kann Verbindungsstatus oder Batteriestatus abfragen, und zwar mit einer Anfrage für ein oder mehrere Geräte mit nur einer Abfrage der CCU.
Je nach Aufruf liefert die Funktion ein boolean oder ein Array of boolean.
Das Script ist zwar nicht unbedingt optimal geschrieben, aber es funktioniert zuverlässig
/*******************************************************************************
Holt div. Statuswerte für einen oder mehrere Aktoren mit einer
kombinierten Anfrage von der CCU und liefert diese als String/Array
an den Aufrufer zurück.
$ccu = IP- oder Hostadresse der CCU
$function = 1 (für Batteriewarnung) ODER 2 (für Verbindungsstatus)
$devices = string mit Seriennummer (1 Gerät) oder
array mit Seriennummern (mehrere Geräte)
$status = Resultat(e) der Abfragen. Wenn ein Gerät abgefragt wurde dann
ist das Ergebnis ein boolean, welcher den entsprechenden Status
wiedergibt. Wenn eine mehrfachabfrage durchgeführt wurde dann
ist status ein Hash. Die Keys entsprechen den Geräte-ID's, die
Werte sind booleans die den entsprechenden Status signalisieren.
*******************************************************************************/
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;
}
Ich stell mich gerade biss’l blöd an mit dem Script von Thorsten…
Wie erfolgt da die Abfrage?
Ich habe mal zum Test versucht, den Batteriestatus verschiedener Devices abzufragen. Unteranderem habe ich gerade eine Fernbedienung, die niedrigen Batteriestand meldet, aber egal was, ich bekomme im „True“ (1) als Echo.
Seltsam… genau das hatte ich probiert und egal welche Ser# ich eingetragen hatte, als Ergebnis bekam ich immer 1
Der von mir vorhin gepostete Code war eigentlich nur eine „Verzweifelungstat“ und der letze Versuch.
…und bekomme wirklich nur bei der w.o. erwähnten FB eine 1, also True für LOWBATT.
Naja, wahrscheinlich hatte ich trotzdem irgendwo einen Fehler in der Syntax.
bei mir funktioniert das Skript leider nicht. In $t steht am Ende immer nur „/tclrega.exefalsefalse“ und kein XML drin. Die Homematic antwortet allerdings richtig - ich habe den Netzwerkverkehr mit Wireshark mitgeschnitten:
POST /tclrega.exe HTTP/1.1
Content-type: application/x-www-form-urlencoded
Content-Length: 148
Connection: Close
var GEQ0168810 = dom.GetObject('BidCos-RF.GEQ0168810:0.LOWBAT').Value();
var GEQ0169150 = dom.GetObject('BidCos-RF.GEQ0169150:0.LOWBAT').Value();
HTTP/1.1 200 OK
Server: ise GmbH HTTP-Server v2.0
Accept-Ranges: bytes
Cache-Control: no-store, no-cache
Content-Type: text/xml
Content-Length: 150
Date: Sat, 13 Feb 2010 21:03:13 GMT
<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><GEQ0168810>false</GEQ0168810><GEQ0169150>false</GEQ0169150></xml>
Hat jemand einen Tip wie ich das vollständige XML erhalte?
ich vermute mal, Du lässt das Ergebnis einfach im Browser anzeigen. Dabei wird natürlich alles was in <???></???> steht weggelassen, da es sich um Befehle für den Browser handelt. Alles was nicht in den Klammern steht, bkommst Du angezeigt.
Du musst jetzt Dein Ergebnis noch entsprechend zerlegen.
Verwende das Script von bruns8234 um den LOWBAT-Status eines Gerätes auszulesen. Funktioniert auch soweit, dass es mir im Webfront den Wert 0 ausgibt, jedoch ohne Angabe der GeräteID.
Wie kann ich einstellen, dass mir die GeräteID mit angezeigt wird?
Wie und wo binde ich jetzt die Abfrage für mehrere Geräte ein?
Hallo Rainer,
das habe ich auch schon zig mal gelesen. Wollte ja nur den LOWBAT-Status zwischendurch auslesen lassen. Das gleiche gilt für den UNREACH-Status.
Grüße
Jürgen
erstmal finde ich das Skript gut. Da ich mich bzgl. der Kommunikation zwischen IPS und CCU nicht wirklich gut auskenne, folgende Frage:
Kann man das Skript so anpassen, dass es bei Übergabe der Geräte ID den aktuellen Status aller Variablen zurückgibt? (z.B. in einem zwedimensionalen Array [Variablenname][Wert]).
Hintergrund: Auch ich möchte, bei einem IPS Neustart, die Variablen prüfen und bei Abweichung zwischen CCU und IPS, IPS aktualisieren. Das Skript zum Durchlaufen aller HM-Komponenten bekomme ich, denke ich, hin. Allerdings macht das nur Sinn, wenn man deine Funktion erweitern kann. Die Kombi aus beiden Skripts wäre dann sicher Sinnvoll für alle Homematic User deren IPS Dienst auch mal aus ist. (z.b. Nachts bei der Datensicherung)
dieses Skript aktualisiert bei mir nun nach dem Neustart des IPS Dienstes die Homematic Variablen. Es wird vom EventHandler automatisch beim Start des Dienstes ausgeführt.
Gruß
Smokey
PS: Die INSTALL_TEST Variable wird ausgeschlossen, verursacht beim Fensterdrehgriffkontakt einen Fehler. Was macht diese Variable überhaupt??!?
Hallo Smokey,
dein Script ist super. Die Variablen werden aktualisiert. Bekomme jedoch am Ende 3 mal die gleiche Fehlermeldung in Zeile 19. Woran kann das denn liegen?