Statusanfrage Homematic 1x/Tag

Hallo,
ich möchte einmal am Tag meine Homematic Komponenten prüfen und eine Status-Email erzeugen falls etwas nicht stimmt.
Ich suche dazu Skriptfragmente, die prüfen ob
-die Kommunikation zum LAN Konfigurationsadapter durchgängig funktioniert (d.h. bidcos Service aktiv und antwortet auf Anfragen, LAN-Adapter erreichbar und auf Anfragen antwortend); d.h. am liebsten eine Art Status-Ping an den Lanadapter
-für jeden Türkontakt und Bewegungsmelder die Rückmeldung das

  1. Gerätekommunikation okay
  2. Batteriestatus okay

ich habe schon etwas rumgesucht, aber noch nicht erkannt, welche Skripte hier Anwendung finden müssen. Kann mich jemand auf einige Skripte verweisen, die für obige Aufgabenstellung geeignet sind?

eine gute Adresse ist immer die Script Library Sammlung,
weiterhin könnte das HM-Inventory sowie das Batteriescript. Für’s Erste. Die Suchfunktion sollte diese ergebnisse aber auch liefern

Hier hab ich ein Script abgelegt, daß mir die Verbindung zwischen IPS-Rechner-> LAN-Adapter -> exemplarische HM-Komponente prüft.

Damit bekomme ich zuverlässig Probleme am Lan-Adapter mit.

So,
ich habe da jetzt mal ein wenig getestet und probiert.
Zur Konfiguration: Ich setze KEINE CCU, sondern nur den LAN-Konfigadapter direkt mit dem Bidcos Service auf dem IPS-System ein.

Prüfen will ich momentan:
-ist der LAN-Adapter erreichbar?
-haben die Bewegungsmelder oder Türkontakte ein Problem festgestellt?

Mein „TestObHomematicOkay“ Skript wird also einmal am Tag um 10:00 Uhr gestartet und schickt mir eine Mail mit den Informationen, was im IPS zu prüfen ist (wenn dann ein Fehler festgestellt wurde).

1.) Den LAN-Adapter pinge ich per socket_create an. Damit sollte ich erkennen ob das Ding überhaupt erreichbar ist (Strom an? LAN-Verbindung da? TCP/IP-Konfiguration gesetzt?)
2.) Für die beiden Bewegungsmelder und beiden Türkontakte frage ich die Variable „Status“ ab. Wenn diese != 0 ist, melde ich das.
BTW: Gibt es eine Homematic-Doku, was diese Status Variable bedeutet und welche Werte sie annehmen kann?
Und was soll die Read-Only Variable "INSTALL_TEST (true) auf den Bewegungsmeldern? Gibt’s da eine Programmier-Doku zu den HM Geräten?
3.) Das Skript aus der IPS-Modul Doku zu HM_readserviceMessage (HM_ReadServiceMessages: IP-Symcon :: Automatisierungssoftware) habe ich eingedampft und angepaßt.
Läuft aber bei mir nicht. HM_ReadServiceMessage schlägt fehl. Keine Verbindung zur CCU. Ist die eine Zeile in dem Sample-Script der obigen Doku wirklich korrekt? Ist das ein Tippfehler?

$msgs = HM_ReadServiceMessages($ids[0]);
if($msgs === false)

Drei Gleichheitszeichen beim Vergleich? Lasse ich drei Stück stehen läuft das Skript fehlerlos durch, das kann aber auch ein ungewollter Seiteneffekt sein. Setze ich „==“ so bekomme wird $msgs==false und damit keine Verbindung.
Ist das Skript überhaupt anwendbar für die Nur-Lan-Konfig-Adapter Konfiguration? Oder setzt das immer eine CCU voraus (an die dann LAN-Konfig-Adapter angeschlossen sind).

Mit den jetzt montierten Sensoren ist es mühsam „reale“ Störungen zu simulieren. Also z.B. Low-Battery, Sabotage, Störung-Funkverbindung.
Ich werde demnächst noch zwei oder drei Sensoren nachrüsten. Mit denen werde ich dann vor der Montage mal Störungen simulieren. Dann sollte ich ja sehen, welche Service-Meldungen und Stati sich ergeben.

Ich glaube das sieht ganz gut aus.
Heute hat der LAN Adapter irgendwie das Blinken angefangen. Wodurch das ausgelöst wird keine Ahnung. Das untersuche ich später noch mal.
Mein Skript (siehe unten) hat das ganz gut erwischt, denn schon der LAN-Adapter antwortet nicht auf pings.
Und die Service-Meldungen werden korrekt aus dem bidcos Service ausgelesen.
Wird der LAN Adapter neu gestartet, so zieht sich auch alles nach einigen Minuten wieder gerade. Sonstige Aktionen waren nicht nötig.

Das folgende Script läuft bei mir um 10:00 und 16:00 Uhr. Die Homematicadapter sind hier einzeln hardcodiert; mit etwas know-how kann man das bestimmt noch modifizieren so das alle geräte im Tree automatisch gesucht werden.

<?
        function ping($host, $timeout = 1) {
                 /* ICMP ping packet with a pre-calculated checksum */
                 $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
                 $socket  = socket_create(AF_INET, SOCK_RAW, 1);
                 socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
                 socket_connect($socket, $host, null);

                 $ts = microtime(true);
                 socket_send($socket, $package, strLen($package), 0);
                 if (socket_read($socket, 255))
                         $result = microtime(true) - $ts;
                 else    $result = false;
                 socket_close($socket);

                 return $result;
         }
$t=""; //hier kommt die Meldung rein!
if (ping("homematic1")==false) {
 $t=$t."Fehler bei Ping auf Homematic1 LAN Adapter
";
}
if (GetValueInteger(54301 /*[Alarmanlage\BMelder1 Tür Aufenthaltsraum\ERROR]*/ )!=0) {
 $t=$t."Bewegungsmelder1 (Tür Aufenthaltsraum): Errorcode prüfen!
";
}
if (GetValueInteger(30192 /*[Alarmanlage\BMelder2 Tür Treppenhaus\ERROR]*/ )!=0) {
 $t=$t."Bewegungsmelder2 (Tür Treppenhaus): Errorcode prüfen!
";
}
if (GetValueInteger(11639 /*[Alarmanlage\Tuer1 Aufenthaltsraum\ERROR]*/ )!=0) {
 $t=$t."Türkontakt 1 (Aufenthaltsraum): Errorcode prüfen!
";
}
if (GetValueInteger(37122 /*[Alarmanlage\Tuer2 Treppenhaus\ERROR]*/ )!=0) {
 $t=$t."Türkontakt 2 (Treppenhaus): Errorcode prüfen!
";
}
$ids = IPS_GetInstanceListByModuleID("{A151ECE9-D733-4FB9-AA15-7F7DD10C58AF}");
if(sizeof($ids) == 0)
$t=$t."Keine HomeMatic Socket Instanz im IPS gefunden!
";
else {
  $msgs = HM_ReadServiceMessages($ids[0]);
  if($msgs === false)
   $t=$t."Verbindung zur CCU/LAN Adapter fehlgeschlagen";
  else {
    if(sizeof($msgs) == 0)
	 echo "Keine Servicemeldungen!
";
	 else {
	 foreach($msgs as $msg)
    {
if(array_key_exists($msg['Message'], $texte)) {
$text = $texte[$msg['Message']];
} else {
$text = $msg['Message'];
}

//$id = GetInstanceIDFromHMID($msg['Address']);
//if(IPS_InstanceExists($id)) {
//$name = IPS_GetLocation($id);
//} else {
//$name = "Gerät nicht in IP-Symcon eingerichtet";
//}

$t=$t."Adresse:".$msg['Address']." Text:".$text."
";
} //foreach

	 }
  }

}
if ($t!=""){
echo "t:".$t;
IPS_LogMessage('TestHomematicOkay',$t);
SMTP_SendMailEx(50960 /*[Alarmanlage\E-Mail senden (SMTP)]*/,"root","Homematic prüfen!",$t);
}
else {
$t="Homematic OK!";
IPS_LogMessage('TestHomematicOkay',$t);
echo $t;
}

?>

Damit die socket Funktionen für das Ping verwendbar sind, muß noch die zur PHP-Version passende php_sockets.dll in der ext Verzeichnis kopiert und in der php.ini aktiviert werden.