Neue Rauchmelder - Überwachung der Funktion

Hallo Zusammen,
kurz: hat jemand von euch Profis eine Idee, wie ich mit IPS die regelmäßige Funkmeldung der neuen Rauchmelder überwachen kann, wenn diese an die CCU angelernt sind? Ich finde keine Variable, die regelmäßig eine Statusaktualisierung erhält.

Langversion :smiley:
Wegen der Rauchmelder-Kontroll-Pflicht für Vermieter in NRW möchte ich gerne Homematic-Rauchmelder bei mir und in ein paar Mietswohnungen anbringen. Jetzt habe ich vorab ein paar alte und neue Melder besorgt und ein Script gebaut, dass im WebFront eine Übersicht generiert und Emails versendet bei Inaktivität eines Melders:

Dazu „krabble“ ich durch den IPS-Baum und suche mir alle Rauchmelder und die zugehörigen -MAINTENANCE-Variablen zusammen und prüfe auf den Zeitstempel in den Variablen und liste die Inhalte auf. (Meyer = alte Melder, Markus = Neue Melder)
Die alten Melder sollen sich laut ELV ca. alle 7 Tage melden, die neuen sogar täglich. In der Praxis ist es anders herum: Die alten Melder melden sich täglich in der Variable „UNREACH“, die neuen überhaupt nicht. In IPS wird keine einzige Variable aktualisiert.
Der neue Melder, der die Rauchmeldergruppe anführt, meldet zu dem kurioserweise nichts in den neuen Variablen (ERROR_SMOKE_CHAMBER, …), die anderen neuen Melder ohne Rauchmeldergruppe haben zumindest einmal was dazu gemeldet.

HM_Request_Status bringt mich auch nicht weiter, weil die Variable dann einen Current-Zeitstempel erhält, und nicht die Zeit, wann der letzte Funkbefehl empfangen wurde. Das mache ich nur für die RSSI-Werte, weil die ja ohnehin nie aktiv aktualisiert werden.

Habt Ihr eine Idee, warum die Statusmeldungen der neuen Melder nicht in IPS ankommen?

Ein bekannter hat mal bei sich geschaut. Dort melden sich die neuen Rauchmelder tatsächlich täglich und die Variablen werden aktualisiert. Damit würde mein Script ja prima funktionieren.

Wie kann ich rausbekommen, wo die Signale bei mir verloren gehen?

Gibt es ein Logfile in der CCU, wo man z.B. prüfen kann, ob das Problem die Melder selbst, die Logikschicht in der CCU oder die Übertragung nach IPS betrifft?

Hallo,

ich kann Dir zwar nicht wirklich bei Deinem Problem weiter helfen, jedoch benutze ich die ALTE Version der Homematic Rauchmelder und suche schon länger eine Möglichkeit, die Melder regelmäßig auf Funktion zu prüfen.

Würdest Du Dein Script hier im Forum oder per PN teilen. Oder wärst Du vielleicht sogar bereit und hast Lust, ein Modul zu „bauen“ ???

Würde mich sehr freuen …

Gruß Proxima

Wäre echt cool wenn du dein Script mal posten könntest … dann können das auch andere testen so das wir ne Lösung für dein Problem finden :0)

Ich prüfe den Status wie folgt:

$fehlerzeit = time()-259200;

if(IPS_GetVariable(11111 /*[Sicherheit\Rauchmelder\Lici Rauchmelder Rauch\LOWBAT]*/)['VariableUpdated'] <= $fehlerzeit) SMTP_SendMailEx(22222 /*[Tools\E-Mail senden (SMTP)]*/, 'peter@domain.de', 'Lici Rauchmelder Fehler!', 'Rauchmelder Alicia hat sich zu lange nicht mehr gemeldet.

Letzes Update: ' . date('d.m.Y H:i', IPS_GetVariable(11111 /*[Sicherheit\Rauchmelder\Lici Rauchmelder Rauch\LOWBAT]*/)['VariableUpdated'])
);

Ich schaue dazu einfach nach, wann sich das letzte mal die Variable verändert hat. Ist diese länger als 3 Tage her bekomme ich eine Mail. Man könnte auch die State Variable nehmen.

Erklärung:

Die neuen Rauchmelder melden sich alle 24 Stunden, man kann den Status kontrollieren wenn man mit der Maus üben „letzte Aktualisierung“ Feld geht.

Hier mein Script (musste ich erst etwas überarbeiten, damit es einigermaßen Forumstauglich ist :D)
Kann man vermutlich etwas effizienter lösen, hab aber im Grunde keine Ahnung von PHP …
Könnt ja mal probieren ob das bei euch funktioniert …

<?
// Script zum Ueberwachen von Rauchmeldern.
// Stand 1.0.0 von Markus Arndt
// *************************************************************************************
// Das Script durchsucht den IPS-Baum nach Homematic-Instanzen.
// Alle Vorkommen von Variablen mit bestimmten Namen (bei mir 'Rauchmelder')
// werden untersucht. Die Rauchmelder sollten in einer Kategorie mit Namen
// des jeweiligen Raums liegen, damit die Ausgaben des Scriptes Sinn machen.
// Alle Melder mit laengerer Inaktivitaet werden in einer Mail aufgelistet.
// *************************************************************************************
// Variablen der unterschiedlichen Rauchmelder zum Verstaendnis:
// Neue Melder:
// ERROR_ALARM_TEST
// ERROR_SMOKE_CHAMBER
// INSTALL_TEST
// LOWBAT
// STATE

// Alte Melder:
// INSTALL_TEST
// STATE
//
// CONFIG_PENDING
// DUTYCYCLE
// LOWBAT
// RSSI_DEVICE
// RSSI_PEER
// STICKY_UNREACH
// UNREACH

// *************************************************************************************
// Konfiguration

// Zur Einrichtung folgenden Block ueberarbeiten
// und Timer-Event, z.B. einmal am Tag hinzufuegen.
$name_rauchmelder_beginnt_mit = "Rauchmelder";
$name_maintenance_endet_mit = "-MAINTENANCE";
$id_ergebnis_variable_html = 28537; // String Variable mit Anzeige-Typ '~html-box' fuer Anzeige im Webfront
$id_smtp_instanz = 15943; // Ist diese ID <> 0, werden Mails ueber diese SMTP-Instanz versendet.
$anzahl_tage_bis_warnung = 5; // Alle Melder > Tage werden in der Mail aufgelistet.

// *************************************************************************************

// Um die gefundenen Melder vor Ausgabe zu sortieren und Problem-Mails zusammen fassen zu koennen
// werden die Werte in ein Array zwischengespeichert.
$resultObj = array();
$resultObjPos = -1;
$resultMailObj = array();

// Alle Homematic-Geraete anfordern und durchsuchen
$homematicInstanceIds = IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}");
foreach($homematicInstanceIds as $homematicInstanceId) {
	$homematicObject = IPS_GetObject($homematicInstanceId);
	$nameObjekt = $homematicObject["ObjectName"];
	if(startsWith($nameObjekt, $name_rauchmelder_beginnt_mit) && !endsWith($nameObjekt, $name_maintenance_endet_mit)) {
		$resultObjPos++;

		// Grunddaten des erkannten Rauchmelders in Array ablegen
		$resultObj[$resultObjPos][0] = IPS_GetLocation($homematicInstanceId);
		$resultObj[$resultObjPos][1] = $homematicInstanceId;
		$resultObj[$resultObjPos][2] = ""; // LastUpdated
		$resultObj[$resultObjPos][3] = ""; // Tage
		$resultObj[$resultObjPos][4] = ""; // LastChanged
		$resultObj[$resultObjPos][5] = ""; // ERROR_ALARM_TEST
		$resultObj[$resultObjPos][6] = ""; // ERROR_SMOKE_CHAMBER

		// Alle Variablen unterhalb vom Rauchmelder durchlaufen ...
	   $unterobjekteIds = IPS_GetChildrenIDs($homematicInstanceId);
		foreach($unterobjekteIds as $unterobjektId) {
			$nameUnterobjekt = IPS_GetName($unterobjektId);
			$variable = IPS_GetVariable($unterobjektId);

			// Letzte Aktualisierung, Tage seit Aktualisierung und Aenderung (= letzter Alarm) merken.
			if($nameUnterobjekt == "STATE") {
				$resultObj[$resultObjPos][2] = getDateFromTimestamp($variable["VariableUpdated"]);
				$tageNichtGemeldet = getTageDifferenzFromTimestamp($variable["VariableUpdated"]);
            $resultObj[$resultObjPos][3] = $tageNichtGemeldet;
				$resultObj[$resultObjPos][4] = getDateFromTimestamp($variable["VariableChanged"]);

				// Wenn n Tage nicht mehr gemeldet, Problemtext fuer etwaige Mail merken.
				if($tageNichtGemeldet > $anzahl_tage_bis_warnung) {
					array_push($resultMailObj, ("Die Rauchmelder-Instanz '" . $resultObj[$resultObjPos][0] . "' hat sich seit " . $tageNichtGemeldet . " Tagen nicht mehr gemeldet."));
				}
			}

			// Die neuen Melder liefern ggf. ein Problem mit der Rauchkammer.
			if($nameUnterobjekt == "ERROR_SMOKE_CHAMBER") {
				if($variable["VariableUpdated"] != 0) {
				   if(GetValueInteger($unterobjektId) != 0)
				      $$resultObj[$resultObjPos][6] = "FEHLER";
			      else
				      $resultObj[$resultObjPos][6] = "OK";
				}
			}

			// Die neuen Melder liefern ggf. ein Problem, wenn der Selbsttest fehlschlug
			if($nameUnterobjekt == "ERROR_ALARM_TEST") {
				if($variable["VariableUpdated"] == 0) {
			      $htmlFehlerKammer = "";
				} else {
				   if(GetValueInteger($unterobjektId) != 0)
				      $resultObj[$resultObjPos][5] = "FEHLER";
			      else
				      $resultObj[$resultObjPos][5] = "OK";
				}
			}

			// Maintenance im Array vorinitialisieren
			$resultObj[$resultObjPos][7] = ""; // RSSI_DEVICE
			$resultObj[$resultObjPos][8] = ""; // RSSI_PEER
			$resultObj[$resultObjPos][9] = ""; // LOWBAT

			// Das Maintenance-Objekt zur ID beschaffen (muss genauso heissen wie die der eigentliche Melder + Zusatz im Konfigurationsteil)
			$maintenanceObjectId = IPS_GetObjectIDByName(IPS_GetName($homematicInstanceId) . $name_maintenance_endet_mit, IPS_GetParent($homematicInstanceId));
		   $mainenanceUnterobjekteIds = IPS_GetChildrenIDs ($maintenanceObjectId);
			foreach($mainenanceUnterobjekteIds as $maintenanceUnterobjektId) {
				$nameUnterobjekt = IPS_GetName($maintenanceUnterobjektId);

				// Funk-Qualitaet von CCU zum Geraet sichern
				if($nameUnterobjekt == "RSSI_DEVICE") {
				   // State aus CCU abholen, da keine automatische aktualisierung
					$erfolg = HM_RequestStatus ($maintenanceObjectId, "RSSI_DEVICE");
					if($erfolg) {
						$wert = GetValue($maintenanceUnterobjektId);
						if ($wert == -65535)
						   $wert = 0;
						if ($wert != 0)
							$resultObj[$resultObjPos][7] = $wert;
					} else {
	               $resultObj[$resultObjPos][7] = "Fehler";
	            }
				}

				// Funk-Qualitaet von Geraet zur CCU sichern
				if($nameUnterobjekt == "RSSI_PEER") {
					$erfolg = HM_RequestStatus ($maintenanceObjectId, "RSSI_PEER");
					if($erfolg) {
						$wert = GetValue($maintenanceUnterobjektId);
						if ($wert == -65535)
						   $wert = 0;
						if ($wert != 0)
							$resultObj[$resultObjPos][8] = $wert;
					} else {
	               $resultObj[$resultObjPos][8] = "Fehler";
	            }
				}

				// Batterie-Problem sichern
				if($nameUnterobjekt == "LOWBAT") {
					$erfolg = HM_RequestStatus ($maintenanceObjectId, "LOWBAT");
					if($erfolg) {
						$wert = GetValue($maintenanceUnterobjektId);
						if ($wert) {
							$resultObj[$resultObjPos][9] = "Leer!!";
						} else {
							$resultObj[$resultObjPos][9] = "OK";
						}
					} else {
	               $resultObj[$resultObjPos][9] = "Fehler";
	            }
	         }
			}
		}
	}
}

// Alle gefundenen Instanzen nach Namen sortieren
sort($resultObj);

// Antwort als HTML-Tabelle montieren
$result = "<u>Liste aller Rauchmelder (Stand " . date("d.m.Y H:i") . "):</u><br><br>";
$result .= "<table style='width: 100%'><thead><tr>";
$result .= "   <td>Ort:</td>";
$result .= "   <td>Melder-ID:</td>";
$result .= "   <td>Letzte Aktualisierung (STATE):</td>";
$result .= "   <td>Tage</td>";
$result .= "   <td>Letzte Auslösung:</td>";
$result .= "   <td>Test erfolgreich:</td>";
$result .= "   <td>Rauchkammer:</td>";
$result .= "   <td>Qualität CCU *):</td>";
$result .= "   <td>Qualität Melder *):</td>";
$result .= "   <td>Batterie:</td>";
$result .= "</tr></thead><tbody>";
for($i = 0; $i < count($resultObj); $i++) {
	$result .= "<tr>";
		$result .= "<tr>";
		for($j = 0; $j < count($resultObj[$i]); $j++) {
			$result .= "   <td>" . $resultObj[$i][$j] . "</td>";
		}
		$result .= "</tr>";
	$result .= "</tr>";
}
$result .= "</tbody></table>";
$result .= "<br>*) kleinerer db-Wert vor dem Minus = besserer Empfang";

// HTML in Variable setzen fuer Anzeige in WebFront
SetValueString($id_ergebnis_variable_html, $result);

// Mails versenden, wenn SMTP-Instanz verfuegbar
if($id_smtp_instanz != 0 && count($resultMailObj) > 0)
	sendMail($id_smtp_instanz, $resultMailObj);

// *************************************************************************************

function sendMail($id_smtp_instanz_local, $resultMailObj) {
	try {
	   $mailtext = "";
	   foreach($resultMailObj as $mailLine) {
			$mailtext .= $mailLine . "
";
		}
	   SMTP_SendMail($id_smtp_instanz_local, "Rauchmelder meldet sich nicht", $mailtext);
	} catch (Exception $e) {
	   IPS_LogMessage("Rauchmelder aktualisieren", "Exception bei Mailversand: " . $e->getMessage() );
	}
}

function getDateFromTimestamp($millis) {
	if($millis == 0)
	   return "";
	$firstJan2000 = mktime(1, 00, 0, 1, 1, 1970);
	$millis += $firstJan2000;
	return date("d.m.Y H:i:s", $millis);
}

function getTageDifferenzFromTimestamp($millis) {
	$tage = round((time() - $millis) / 86400);
	if($tage > 365)
	   return "";
	return $tage;
}

function startsWith($haystack, $needle) {
    return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== false;
}

function endsWith($haystack, $needle) {
    return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== false);
}
?>

Cool :0) Danke dir … werde das die Tage gleich mal ausprobieren!

Warning: Objekt mit dem Namen HM-Sec-SD-2 NEQxxxxxxx:0-MAINTENANCE konnte nicht gefunden werden in C:\IP-Symcon\scripts\35544.ips.php on line 115

Hallo Markus, habe mal dein Script installiert, bekomme aber immer die o.a. Fehlermeldung für alle RMs
-MAINTENANCE gibt es bei keinem RM

Edit:

habs gefunden, ist im Kanal:0

vg axel

Hab auch grade meinen ersten Satz Rauchmelder bekommen und das Skript läuft einwandfrei.

Hallo alle,
habe mir das Script auch mal angelegt, bekomme aber auch immer diese Fehlermeldung:

so sieht mein Objektbaum aus:

Hallo,

danke an Markus für das Skript.

Es hat bei mir leider nicht funktioniert, deshalb habe ich das Script von Markus mal für mich angepasst. Ich habe nur die neuen Rauchmelder. Ich hänge auch einen Screenshot vom Objektbaum an. Das Script sucht nach dem Wort „Rauchmelder“ und dem Wort „SMOKE_DETECTOR“. MAINTENANCE muss unter dem gleichen Objekt wie SMOKE_DETECTOR angeordnet sein.

<?
// Script zum Ueberwachen von Rauchmeldern. 
// Stand 1.0.0 von Markus Arndt (von Rudi angepasst)
// ************************************************************************************* 
// Das Script durchsucht den IPS-Baum nach Homematic-Instanzen. 
// Alle Vorkommen von Variablen mit bestimmten Namen (bei mir 'Rauchmelder') 
// werden untersucht. Die Rauchmelder sollten in einer Kategorie mit Namen 
// des jeweiligen Raums liegen, damit die Ausgaben des Scriptes Sinn machen. 
// Alle Melder mit laengerer Inaktivitaet werden in einer Mail aufgelistet. 
// ************************************************************************************* 
// Variablen der unterschiedlichen Rauchmelder zum Verstaendnis: 
// Neue Melder: 
// ERROR_ALARM_TEST 
// ERROR_SMOKE_CHAMBER 
// INSTALL_TEST 
// LOWBAT 
// STATE 

// Alte Melder: 
// INSTALL_TEST 
// STATE 
// 
// CONFIG_PENDING 
// DUTYCYCLE 
// LOWBAT 
// RSSI_DEVICE 
// RSSI_PEER 
// STICKY_UNREACH 
// UNREACH 

// ************************************************************************************* 
// Konfiguration 

// Zur Einrichtung folgenden Block ueberarbeiten 
// und Timer-Event, z.B. einmal am Tag hinzufuegen. 
$name_rauchmelder_enthaelt = "Rauchmelder"; 
$name_maintenance_endet_mit = "SMOKE_DETECTOR"; 
$id_ergebnis_variable_html = 14744; // String Variable mit Anzeige-Typ '~html-box' fuer Anzeige im Webfront 
$id_smtp_instanz = 28589; // Ist diese ID <> 0, werden Mails ueber diese SMTP-Instanz versendet. 
$anzahl_tage_bis_warnung = 1; // Alle Melder > Tage werden in der Mail aufgelistet. 

// ************************************************************************************* 

// Um die gefundenen Melder vor Ausgabe zu sortieren und Problem-Mails zusammen fassen zu koennen 
// werden die Werte in ein Array zwischengespeichert. 
$resultObj = array(); 
$resultObjPos = -1; 
$resultMailObj = array(); 

// Alle Homematic-Geraete anfordern und durchsuchen 
$homematicInstanceIds = IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}"); 
foreach($homematicInstanceIds as $homematicInstanceId) { 
    $homematicObject = IPS_GetObject($homematicInstanceId); 
    //$nameObjekt = $homematicObject["ObjectName"]; 
	//echo($nameObjekt);
	//echo($homematicInstanceId);
	//echo IPS_GetLocation($homematicInstanceId);
	$nameObjekt = IPS_GetLocation($homematicInstanceId);
	//echo( "
". $nameObjekt);
    if(strpos($nameObjekt, $name_rauchmelder_enthaelt) !== false && endsWith($nameObjekt, $name_maintenance_endet_mit)) {
	//echo($homematicInstanceId);
        $resultObjPos++; 

        // Grunddaten des erkannten Rauchmelders in Array ablegen 
        $resultObj[$resultObjPos][0] = IPS_GetLocation($homematicInstanceId); 
        $resultObj[$resultObjPos][1] = $homematicInstanceId; 
        $resultObj[$resultObjPos][2] = ""; // LastUpdated 
        $resultObj[$resultObjPos][3] = ""; // Tage 
        $resultObj[$resultObjPos][4] = ""; // LastChanged 
        $resultObj[$resultObjPos][5] = ""; // ERROR_ALARM_TEST 
        $resultObj[$resultObjPos][6] = ""; // ERROR_SMOKE_CHAMBER 

        // Alle Variablen unterhalb vom Rauchmelder durchlaufen ... 
       $unterobjekteIds = IPS_GetChildrenIDs($homematicInstanceId); 
        foreach($unterobjekteIds as $unterobjektId) { 
            $nameUnterobjekt = IPS_GetName($unterobjektId); 
            $variable = IPS_GetVariable($unterobjektId); 

            // Letzte Aktualisierung, Tage seit Aktualisierung und Aenderung (= letzter Alarm) merken. 
            if($nameUnterobjekt == "STATE") { 
                $resultObj[$resultObjPos][2] = getDateFromTimestamp($variable["VariableUpdated"]); 
                $tageNichtGemeldet = getTageDifferenzFromTimestamp($variable["VariableUpdated"]); 
				echo("**". getDateFromTimestamp($variable["VariableUpdated"]));
            $resultObj[$resultObjPos][3] = $tageNichtGemeldet; 
                $resultObj[$resultObjPos][4] = getDateFromTimestamp($variable["VariableChanged"]); 

                // Wenn n Tage nicht mehr gemeldet, Problemtext fuer etwaige Mail merken. 
                if($tageNichtGemeldet > $anzahl_tage_bis_warnung) { 
                    array_push($resultMailObj, ("Die Rauchmelder-Instanz '" . $resultObj[$resultObjPos][0] . "' hat sich seit " . $tageNichtGemeldet . " Tagen nicht mehr gemeldet.")); 
                } 
            } 

            // Die neuen Melder liefern ggf. ein Problem mit der Rauchkammer. 
            if($nameUnterobjekt == "ERROR_SMOKE_CHAMBER") { 
                if($variable["VariableUpdated"] != 0) { 
                   if(GetValueInteger($unterobjektId) != 0) 
                      $$resultObj[$resultObjPos][6] = "FEHLER"; 
                  else 
                      $resultObj[$resultObjPos][6] = "OK"; 
                } 
            } 

            // Die neuen Melder liefern ggf. ein Problem, wenn der Selbsttest fehlschlug 
            if($nameUnterobjekt == "ERROR_ALARM_TEST") { 
                if($variable["VariableUpdated"] == 0) { 
                  $htmlFehlerKammer = ""; 
                } else { 
                   if(GetValueInteger($unterobjektId) != 0) 
                      $resultObj[$resultObjPos][5] = "FEHLER"; 
                  else 
                      $resultObj[$resultObjPos][5] = "OK"; 
                } 
            } 

        } 
		
            // Maintenance im Array vorinitialisieren 
            $resultObj[$resultObjPos][7] = ""; // RSSI_DEVICE 
            $resultObj[$resultObjPos][8] = ""; // RSSI_PEER 
            $resultObj[$resultObjPos][9] = ""; // LOWBAT 

            // Das Maintenance-Objekt zur ID beschaffen (muss genauso heissen wie die der eigentliche Melder + Zusatz im Konfigurationsteil) 
            $maintenanceObjectId = IPS_GetObjectIDByName( "MAINTENANCE", IPS_GetParent($homematicInstanceId)); 
  		   $mainenanceUnterobjekteIds = IPS_GetChildrenIDs ($maintenanceObjectId); 
            	     foreach($mainenanceUnterobjekteIds as $maintenanceUnterobjektId) { 
                $nameUnterobjekt = IPS_GetName($maintenanceUnterobjektId); 
	              // Funk-Qualitaet von CCU zum Geraet sichern 
                if($nameUnterobjekt == "RSSI_DEVICE") { 
                   // State aus CCU abholen, da keine automatische aktualisierung 
                    $erfolg = HM_RequestStatus ($maintenanceObjectId, "RSSI_DEVICE"); 
                    if($erfolg) { 
                        $wert = GetValue($maintenanceUnterobjektId); 
                        if ($wert == -65535) 
                           $wert = 0; 
                        if ($wert != 0) 
                            $resultObj[$resultObjPos][7] = $wert; 
                    } else { 
                   $resultObj[$resultObjPos][7] = "Fehler"; 
                } 
                } 

                // Funk-Qualitaet von Geraet zur CCU sichern 
                if($nameUnterobjekt == "RSSI_PEER") { 
                    $erfolg = HM_RequestStatus ($maintenanceObjectId, "RSSI_PEER"); 
                    if($erfolg) { 
                        $wert = GetValue($maintenanceUnterobjektId); 
                        if ($wert == -65535) 
                           $wert = 0; 
                        if ($wert != 0) 
                            $resultObj[$resultObjPos][8] = $wert; 
                    } else { 
                   $resultObj[$resultObjPos][8] = "Fehler"; 
                } 
                } 

                // Batterie-Problem sichern 
                if($nameUnterobjekt == "LOWBAT") { 
                    $erfolg = HM_RequestStatus ($maintenanceObjectId, "LOWBAT"); 
                    if($erfolg) { 
                        $wert = GetValue($maintenanceUnterobjektId); 
                        if ($wert) { 
                            $resultObj[$resultObjPos][9] = "Leer!!"; 
                        } else { 
                            $resultObj[$resultObjPos][9] = "OK"; 
                        } 
                    } else { 
                   $resultObj[$resultObjPos][9] = "Fehler"; 
                } 
             } 
            } 
    } 
} 

// Alle gefundenen Instanzen nach Namen sortieren 
sort($resultObj); 

// Antwort als HTML-Tabelle montieren 
$result = "<u>Liste aller Rauchmelder (Stand " . date("d.m.Y H:i") . "):</u><br><br>"; 
$result .= "<table style='width: 100%'><thead><tr>"; 
$result .= "   <td>Ort:</td>"; 
$result .= "   <td>Melder-ID:</td>"; 
$result .= "   <td>Letzte Aktualisierung (STATE):</td>"; 
$result .= "   <td>Tage</td>"; 
$result .= "   <td>Letzte Auslösung:</td>"; 
$result .= "   <td>Test erfolgreich:</td>"; 
$result .= "   <td>Rauchkammer:</td>"; 
$result .= "   <td>Qualität CCU *):</td>"; 
$result .= "   <td>Qualität Melder *):</td>"; 
$result .= "   <td>Batterie:</td>"; 
$result .= "</tr></thead><tbody>"; 
for($i = 0; $i < count($resultObj); $i++) { 
    $result .= "<tr>"; 
        $result .= "<tr>"; 
        for($j = 0; $j < count($resultObj[$i]); $j++) { 
            $result .= "   <td>" . $resultObj[$i][$j] . "</td>"; 
        } 
        $result .= "</tr>"; 
    $result .= "</tr>"; 
} 
$result .= "</tbody></table>"; 
$result .= "<br>*) kleinerer db-Wert vor dem Minus = besserer Empfang"; 

// HTML in Variable setzen fuer Anzeige in WebFront 
SetValueString($id_ergebnis_variable_html, $result); 

// Mails versenden, wenn SMTP-Instanz verfuegbar 
echo (count($resultMailObj));
if($id_smtp_instanz != 0 && count($resultMailObj) > 0) 
    sendMail($id_smtp_instanz, $resultMailObj); 

// ************************************************************************************* 

function sendMail($id_smtp_instanz_local, $resultMailObj) { 
    try { 
       $mailtext = ""; 
       foreach($resultMailObj as $mailLine) { 
            $mailtext .= $mailLine . "
"; 
        } 
       SMTP_SendMail($id_smtp_instanz_local, "Rauchmelder meldet sich nicht", $mailtext); 
	   echo ("SendMail");
    } catch (Exception $e) { 
       IPS_LogMessage("Rauchmelder aktualisieren", "Exception bei Mailversand: " . $e->getMessage() ); 
    } 
} 

function getDateFromTimestamp($millis) { 
    if($millis == 0) 
       return ""; 
    $firstJan2000 = mktime(1, 00, 0, 1, 1, 1970); 
    $millis += $firstJan2000; 
    return date("d.m.Y H:i:s", $millis); 
} 

function getTageDifferenzFromTimestamp($millis) { 
    $tage = round((time() - $millis) / 86400); 
    //if($tage > 365) 
    //   return ""; 
    return $tage; 
} 

function startsWith($haystack, $needle) { 
    return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== false; 
} 

function endsWith($haystack, $needle) { 
    return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== false); 
} 

?>

Viele Grüße

Rudi

Hallo, danke für das Script…super Arbeit.

Frage, bei mir wird in der ersten Spalte der gesammte Pfad der Location das Rauchmelders ausgegeben, was sehr lang wird. Wie kann ich das ganze auf die Bezeichnung der letzten Kategorie im Pfad begrenzen? IPS_GetName funktioniert nicht weil dann nur SMOKE_DETECTOR angezeigt wird.

$resultObj[$resultObjPos][0] = IPS_GetLocation($homematicInstanceId);

Grüße
cerberusde

Mir ist aufgefallen, dass alle MelderQuali (-200) sowie Batterie dem vorletzten Eintrag (id48996) entsprechen
habe alle anderen Batts auf low gesetzt, werden trotzdem ok angezeigt. könnte die foreach da hängen bleiben ?
Script ist unverändert

habe mit workaround Fehler beseitigt:
jeder Rauchmelder ist in einer separaten Kategorie, da läufts plötzl