Überwachen von Instanzen - Tote erkennen

Hallo zusammen,

teilweise setze ich Batterie-Geräte ein, oder auch andere Sensoren, die ich überwache, damit ein Ausfall gleich bemerkbar wird.
Hier mein Script dazu.
Im Prinzip überwacht es sämtliche Geräte mit bestimmten Variablen-Profilen + zusätzlich angegebene Instanzen:


<?
 /* ---------------------------------------------------------------------------
                  Geräte auf Lebenszeichen prüfen
  -----------------------------------------------------------------------------
  (c) 2014, S. Epple

  Dieses Script prüft, sämtlich relevanten Instanzen, ob Sie aktualisiert wurden.
  Dh. ob das Gerät noch arbeitet.
  Die zu prüfenden Geräte werden wie folgt ermittelt:
  - Anhand von Profilen von untergeordneten Variablen (c_prof)
  - Manuell durch angabe der ID zu r_inst

  - Geräte mit langer Antwortzeit (z.b. einmal pro Woche werden bei
	 r_instE angegeben.

  mit lastup_maxN wird definiert, ab wann ein Gerät tot gemeldet wird.
  mit lastup_maxE wird definiert, ab wann lang antwortende Geräte als tot
                  gemeldet werden

  c_warn_name definiert den Namen der Variablen für Meldung die unterhalb
 dieses Scriptes angelegt wird.

  ---------------------------------------------------------------------------*/


 $c_prof[] = "~Battery";
 $c_prof[] ="~Battery.100";
 $c_warn_name = "Geräte Warnung";

// Hier meine IDs für die Überwachung, $r_inst[] könnt ihr beliebige IDs anpassen.
 $r_inst[] = 24223 /*[Objekte\Oregon Wettersensoren\Regensensor]*/;
 $r_inst[] = 32193 /*[Objekte\Oregon Wettersensoren\Windsensor]*/;
 $r_inst[] = 26875 /*[Objekte\1-Wire\Helligkeitssensor]*/;
 $r_inst[] = 13251 /*[Objekte\1-Wire\Temperatur (2) (Außen Nord)]*/;
 $r_inst[] = 50271 /*[Objekte\1-Wire\Temperatur (1) (rot, EG Wohnzimmer)]*/;
 $r_inst[] = 53702 /*[Objekte\1-Wire\Temperatur (3) (grün, Büro)]*/;
 $r_inst[] = 59177 /*[Objekte\1-Wire\Temperatur (4) (blau, außen Süd)]*/;
 $r_inst[] = 10553 /*[Objekte\Sonstige Objekte\Fibaro Binärsensor Heizraum\Binärsensor Heizung Gerät 4 (Solar)]*/;

 $r_instE[] = 35876 /*[Objekte\Alarm-Instanzen\Alarmmelder]*/;
 $r_instE[] = 13150 /*[Objekte\Sonstige Objekte\Fibaro Binärsensor Heizraum\Binärsensor Heizung Gerät 2 (Wassersensor)]*/;

 $lastup_maxN =  24 ;  // in Stunden für Normale Prüfung - Normale Geräte
 $lastup_maxE =  24*7; // in Stunden für Geräte mit langer Pause

 /*---------------------------------------------------------------------------*/

 $lastup_maxN = $lastup_maxN * 3600;
 $lastup_maxE = $lastup_maxE * 3600;


 $WardnID = CreateVariableByName($_IPS['SELF'],$c_warn_name, 0, "~Alert");
 $vars = IPS_GetVariableList();

// Zuerst alle Instanzen ermitteln
// Alle Instanzen mit Batteriemodul
// + Oben angegebene
 foreach($vars as $varID){
	 if($varID != $WardnID){
		 $varInfo = IPS_GetVariable($varID);
	    $varVal = GetValue($varID);
	    $varProf = IPS_VariableProfileExists($varInfo['VariableProfile']) ?
		             $varInfo['VariableProfile'] : "";
	    $varProf = (strlen($varInfo['VariableCustomProfile']) > 0 &&
		            IPS_VariableProfileExists($varInfo['VariableCustomProfile']))?
						$varInfo['VariableCustomProfile'] : $varProf;

		 foreach($c_prof as $prof){
		   if($prof == $varProf){
				$objid  = IPS_GetParent($varID);
				$obj = IPS_GetObject($objid);
				if(!stristr($obj["ObjectInfo"],"NO_UPCHECK"))$r_inst[] = $objid;
		   }
		}
	}
 }
 // Extended Geräte hinzufügen
 foreach($r_instE as $id){
	$r_inst[] = $id;
 }
 //Doppelte IDs löschen
 $r_inst = array_unique($r_inst);

// über alle Instanzen und letztes update prüfen anhand der sub-variablen
foreach($r_inst as $id){
	$lastup = 0;
	foreach(IPS_GetChildrenIDs($id) as $subid){
		$subInfo = IPS_GetObject($subid);
		if($subInfo["ObjectType"] == 2){
			if($vardata = IPS_GetVariable($subid)){;
			   $t_lastup =   $vardata["VariableUpdated"];
				if( $lastup < $t_lastup)$lastup = $t_lastup;
			}
		} // Subinfo, wenn Variable
	}

	$Inst[$id] = $lastup;
}
arsort($Inst);
// Nun ausgeben und auswerten
$warnTotal = false;
foreach($Inst as $id => $up){
   // Lastup setzen für normale Geräte oder lang antwortdende Geräte
	$lastupM = (in_array($id,  $r_instE))?$lastup_maxE : $lastup_maxN;
   if($up < (time() - $lastupM)){$warnTotal = true; $warn ="WARNUNG!";}
	                             else { $warn="OK"; }
	echo IPS_GetName($id)." zuletzt online am ".
	     date("d.m.Y, H:i",$up)."h --> ".$warn." <br>
";
}

if($warnTotal){
	echo "Geräte UP Check: ACHTUNG FEHLER GEFUNDEN!";
}else{
	echo "Geräte UP Check: ALLES OK";
}
SetValue($WardnID,$warnTotal);

	/* CreateVariableByName -------------------------------------------------------------------------
		id = Wo soll sie hängen
		name = Name der Variablen
		type:  0: boolean
				 1: integer
				 2: float
				 3: string
		profil: Variablenprofi
	*/
	function CreateVariableByName($id, $name, $type, $profile = "")
	{
		# type: 0=boolean, 1 = integer, 2 = float, 3 = string;
	    global $_IPS;
	    $vid = @IPS_GetVariableIDByName($name, $id);
	    if($vid === false)
	    {
	        $vid = IPS_CreateVariable($type);
	        IPS_SetParent($vid, $id);
	        IPS_SetName($vid, $name);
	        IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
	        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
	    }
	    return $vid;
	}

?>


Das Script kann man per Ereignis einplanen (bei mir läuft es alle 6h).
Wird das Script im Webfront direkt aufgerufen, dann wird eine Status Liste angezeigt.

Hallo aus Magdeburg,

ich habe dein Script Kronos empfohlen bekommen , ich habe genau so etwas gesucht . Eine kleine Frage , ich habe das Script um eine Variable erweitert , von Typ String, und HTMLBox, dort möchte ich mir nur die fehlerhaften Geräte anzeigen lassen . Mein Script sieht so aus :


 <?
 /* ---------------------------------------------------------------------------
                  Geräte auf Lebenszeichen prüfen
  -----------------------------------------------------------------------------
  (c) 2014, S. Epple

  Dieses Script prüft, sämtlich relevanten Instanzen, ob Sie aktualisiert wurden.
  Dh. ob das Gerät noch arbeitet.
  Die zu prüfenden Geräte werden wie folgt ermittelt:
  - Anhand von Profilen von untergeordneten Variablen (c_prof)
  - Manuell durch angabe der ID zu r_inst

  - Geräte mit langer Antwortzeit (z.b. einmal pro Woche werden bei
     r_instE angegeben.

  mit lastup_maxN wird definiert, ab wann ein Gerät tot gemeldet wird.
  mit lastup_maxE wird definiert, ab wann lang antwortende Geräte als tot
                  gemeldet werden

  c_warn_name definiert den Namen der Variablen für Meldung die unterhalb
 dieses Scriptes angelegt wird.

  ---------------------------------------------------------------------------*/


 $c_prof[] = "~Battery";
 $c_prof[] = "Anwesenheit";
 $c_prof[] ="~Battery.100";
 $c_prof[] ="~Watt.3680";
 $c_warn_name = "Geräte Warnung";

// Hier meine IDs für die Überwachung, $r_inst[] könnt ihr beliebige IDs anpassen.
//$r_inst[] = 15641 /*[Funktionen\Kontakte\Fenster Henri N\STATE]*/;
// $r_inst[] = 20769 /*[Funktionen\Kontakte\Fenster Clara W\STATE]*/;
// $r_inst[] = 47468 /*[Funktionen\Kontakte\Fenster Wäschekeller\STATE]*/;
// $r_inst[] = 31005 /*[Funktionen\Kontakte\Kellertür\STATE]*/;
// $r_inst[] = 20304 /*[Funktionen\Wetter\Wetterstation\Windgeschwindigkeit]*/;

$r_instE[] = 50520 /*[Funktionen\Verbrauch aktuell\140\Kanal 2: Luftentfeuchter]*/ ;
// $r_instE[] = 13150 /*[Objekt #13150 existiert nicht]*/;

 $lastup_maxN =  24 ;  // in Stunden für Normale Prüfung - Normale Geräte
 $lastup_maxE =  24*7; // in Stunden für Geräte mit langer Pause

 /*---------------------------------------------------------------------------*/

 $lastup_maxN = $lastup_maxN * 3600;
 $lastup_maxE = $lastup_maxE * 3600;


 $WardnID = CreateVariableByName($_IPS['SELF'],$c_warn_name, 0, "~Alert");
 $vars = IPS_GetVariableList();

// Zuerst alle Instanzen ermitteln
// Alle Instanzen mit Batteriemodul
// + Oben angegebene
 foreach($vars as $varID){
     if($varID != $WardnID){
         $varInfo = IPS_GetVariable($varID);
        $varVal = GetValue($varID);
        $varProf = IPS_VariableProfileExists($varInfo['VariableProfile']) ?
                     $varInfo['VariableProfile'] : "";
        $varProf = (strlen($varInfo['VariableCustomProfile']) > 0 &&
                    IPS_VariableProfileExists($varInfo['VariableCustomProfile']))?
                        $varInfo['VariableCustomProfile'] : $varProf;

         foreach($c_prof as $prof){
           if($prof == $varProf){
                $objid  = IPS_GetParent($varID);
                $obj = IPS_GetObject($objid);
                if(!stristr($obj["ObjectInfo"],"NO_UPCHECK"))$r_inst[] = $objid;
           }
        }
    }
 }
 // Extended Geräte hinzufügen
 foreach($r_instE as $id){
    $r_inst[] = $id;
 }
 //Doppelte IDs löschen
 $r_inst = array_unique($r_inst);

// über alle Instanzen und letztes update prüfen anhand der sub-variablen
foreach($r_inst as $id){
    $lastup = 0;
    foreach(IPS_GetChildrenIDs($id) as $subid){
        $subInfo = IPS_GetObject($subid);
        if($subInfo["ObjectType"] == 2){
            if($vardata = IPS_GetVariable($subid)){;
               $t_lastup =   $vardata["VariableUpdated"];
                if( $lastup < $t_lastup)$lastup = $t_lastup;
            }
        } // Subinfo, wenn Variable
    }

    $Inst[$id] = $lastup;
}
arsort($Inst);
// Nun ausgeben und auswerten
$warnTotal = false;
foreach($Inst as $id => $up){
   // Lastup setzen für normale Geräte oder lang antwortdende Geräte
    $lastupM = (in_array($id,  $r_instE))?$lastup_maxE : $lastup_maxN;
   if($up < (time() - $lastupM)){$warnTotal = true; $warn ="WARNUNG!";}
                                 else { $warn="OK"; }
    echo IPS_GetName($id)." zuletzt online am ".
         date("d.m.Y, H:i",$up)."h --> ".$warn." <br>
";
         
}



if($warnTotal){
    echo "Geräte UP Check: ACHTUNG FEHLER GEFUNDEN!";
    setvalue(53153  /*[Funktionen\Prüfen\Status Prüfung\Ausgabe ]*/, IPS_GetName($id)." zuletzt online am ".
         date("d.m.Y, H:i",$up)."h --> ".$warn." <br>
");
}else{
    echo "Geräte UP Check: ALLES OK";
    setvalue(53153  /*[Funktionen\Prüfen\Status Prüfung\Ausgabe ]*/, "Alle Gerät OK" );
}
SetValue($WardnID,$warnTotal);

    /* CreateVariableByName -------------------------------------------------------------------------
        id = Wo soll sie hängen
        name = Name der Variablen
        type:  0: boolean
                 1: integer
                 2: float
                 3: string
        profil: Variablenprofi
    */
    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        # type: 0=boolean, 1 = integer, 2 = float, 3 = string;
        global $_IPS;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }

?>


Aktuell Funktioniert das aber ich habe auch nur ein fehlerhaftes Gerät , was passiert wenn es mehrere sind ?

Vielen Dank

Versuch macht kluch. Klau einem unwichtigen Teil die Batterien und warte ab was passiert.

Nur ein (!) fehlerhaftes Gerät? :eek:

Du kannst doch die Stunden testweise reduzieren. Wenn ich es richtig sehe über


 $lastup_maxN =  24

Moin Kronos,

da geht nur eine Meldung rein , selbst wenn es mehrere sind .

Mal gucken ob ich das auf die reihe bekomme …

Hi Kronos,

ich hatte erst gedacht das ich die Funktion ob_start() dazu nutzen kann , jedoch bekomme ich das nicht auf die reihe .
Könnte mir da jemand nen Tip geben ?

Wenn ich das Skript ausführe bekomme ich eine ewig lange Litanei von überprüften Instanzen mit Status OK oder Warnung. Ich kann nicht nachvollziehen was Du mit

da geht nur eine Meldung rein , selbst wenn es mehrere sind .

meinst.

Hallo Kronos,

ich wollte mir dir Meldungen einfach aufsplitten in Geräte die OK sind und in Fehlerhafte Geräte .

So Funktioniert das dann :


 <?
 /* ---------------------------------------------------------------------------
                  Geräte auf Lebenszeichen prüfen
  -----------------------------------------------------------------------------
  (c) 2014, S. Epple

  Dieses Script prüft, sämtlich relevanten Instanzen, ob Sie aktualisiert wurden.
  Dh. ob das Gerät noch arbeitet.
  Die zu prüfenden Geräte werden wie folgt ermittelt:
  - Anhand von Profilen von untergeordneten Variablen (c_prof)
  - Manuell durch angabe der ID zu r_inst

  - Geräte mit langer Antwortzeit (z.b. einmal pro Woche werden bei
     r_instE angegeben.

  mit lastup_maxN wird definiert, ab wann ein Gerät tot gemeldet wird.
  mit lastup_maxE wird definiert, ab wann lang antwortende Geräte als tot
                  gemeldet werden

  c_warn_name definiert den Namen der Variablen für Meldung die unterhalb
 dieses Scriptes angelegt wird.

  ---------------------------------------------------------------------------*/


 $c_prof[] = "~Battery";
 $c_prof[] = "Anwesenheit";
 $c_prof[] ="~Battery.100";
 $c_prof[] ="~Watt.3680";
 $c_warn_name = "Geräte Warnung";

// Hier meine IDs für die Überwachung, $r_inst[] könnt ihr beliebige IDs anpassen.
//$r_inst[] = 15641 /*[Funktionen\Kontakte\Fenster Henri N\STATE]*/;
// $r_inst[] = 20769 /*[Funktionen\Kontakte\Fenster Clara W\STATE]*/;
// $r_inst[] = 47468 /*[Funktionen\Kontakte\Fenster Wäschekeller\STATE]*/;
// $r_inst[] = 31005 /*[Funktionen\Kontakte\Kellertür\STATE]*/;
// $r_inst[] = 20304 /*[Funktionen\Wetter\Wetterstation\Windgeschwindigkeit]*/;

$r_instE[] = 50520 /*[Funktionen\Verbrauch aktuell\140\Kanal 2: Luftentfeuchter]*/ ;
// $r_instE[] = 13150 /*[Objekt #13150 existiert nicht]*/;

 $lastup_maxN =  4 ;  // in Stunden für Normale Prüfung - Normale Geräte
 $lastup_maxE =  24*7; // in Stunden für Geräte mit langer Pause

 /*---------------------------------------------------------------------------*/

 $lastup_maxN = $lastup_maxN * 3600;
 $lastup_maxE = $lastup_maxE * 3600;


 $WardnID = CreateVariableByName($_IPS['SELF'],$c_warn_name, 0, "~Alert");
 $vars = IPS_GetVariableList();

// Zuerst alle Instanzen ermitteln
// Alle Instanzen mit Batteriemodul
// + Oben angegebene
 foreach($vars as $varID){
     if($varID != $WardnID){
         $varInfo = IPS_GetVariable($varID);
        $varVal = GetValue($varID);
        $varProf = IPS_VariableProfileExists($varInfo['VariableProfile']) ?
                     $varInfo['VariableProfile'] : "";
        $varProf = (strlen($varInfo['VariableCustomProfile']) > 0 &&
                    IPS_VariableProfileExists($varInfo['VariableCustomProfile']))?
                        $varInfo['VariableCustomProfile'] : $varProf;

         foreach($c_prof as $prof){
           if($prof == $varProf){
                $objid  = IPS_GetParent($varID);
                $obj = IPS_GetObject($objid);
                if(!stristr($obj["ObjectInfo"],"NO_UPCHECK"))$r_inst[] = $objid;
           }
        }
    }
 }
 // Extended Geräte hinzufügen
 foreach($r_instE as $id){
    $r_inst[] = $id;
 }
 //Doppelte IDs löschen
 $r_inst = array_unique($r_inst);

// über alle Instanzen und letztes update prüfen anhand der sub-variablen
foreach($r_inst as $id){
    $lastup = 0;
    foreach(IPS_GetChildrenIDs($id) as $subid){
        $subInfo = IPS_GetObject($subid);
        if($subInfo["ObjectType"] == 2){
            if($vardata = IPS_GetVariable($subid)){;
               $t_lastup =   $vardata["VariableUpdated"];
                if( $lastup < $t_lastup)$lastup = $t_lastup;
            }

        } // Subinfo, wenn Variable
    }

    $Inst[$id] = $lastup;
}
arsort($Inst);
// Nun ausgeben und auswerten
$warnTotal = false;
$tmp = '';
$tmp2 = '';
$tm = time();
foreach($Inst as $id => $up){
   // Lastup setzen für normale Geräte oder lang antwortdende Geräte
   if($up < $tm-((in_array($id,  $r_instE))?$lastup_maxE : $lastup_maxN)){
		$warnTotal = true; $warn ="WARNUNG!";
		$tmp = $tmp.IPS_GetName($id)." zuletzt online am ".date("d.m.Y, H:i",$up)."h --> ".$warn." <br>
";
	}
	else {
	$warn="OK";
   $tmp2 = $tmp2.IPS_GetName($id)." zuletzt online am ".date("d.m.Y, H:i",$up)."h --> ".$warn." <br>
";


	 }
}
echo $tmp;
echo $tmp2;
setvalue(53153  /*[Funktionen\Prüfen\Geräte Status ]*/,$tmp) ;
setvalue (25549  /*[Funktionen\Prüfen\Geräte OK]*/, $tmp2);
if($warnTotal){
    echo "Geräte UP Check: ACHTUNG FEHLER GEFUNDEN!" ;
// setvalue(53153 /*[Funktionen\Prüfen\Geräte Status ]*/ , IPS_GetName($id)." zuletzt online am ".date("d.m.Y, H:i",$up)."h --> ".$warn." <br>
");
}else{
    echo "Geräte UP Check: ALLES OK";
    setvalue(53153 /*[Funktionen\Prüfen\Geräte Status ]*/ , "Alle Gerät OK" );
}
SetValue($WardnID,$warnTotal);

    /* CreateVariableByName -------------------------------------------------------------------------
        id = Wo soll sie hängen
        name = Name der Variablen
        type:  0: boolean
                 1: integer
                 2: float
                 3: string
        profil: Variablenprofi
    */
    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        # type: 0=boolean, 1 = integer, 2 = float, 3 = string;
        global $_IPS;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }

?>



… und her noch ein kleines Skript, dass alle Aktoren auflistet, bei deren alle zugehörigen Variablen tot sind. Hier im Beispiel alle, die sich nicht für mehr als einen Tag gemeldet haben. Die über eine Woche tot sind, sind eh schon verwest :eek:


$alleInstanzen = IPS_GetInstanceList();

foreach($alleInstanzen as $varID){
 	$tot = False;
	foreach(IPS_GetChildrenIDs($varID) as $id) {
	   if (IPS_VariableExists($id) == True){
		$last_up =  IPS_GetVariable($id)['VariableUpdated'];
		$last_delta = time() - $last_up;
			if	(($last_delta >= 3600*24) and ($last_delta <= 3600*24*7)) {
				$tot = True;
			}
		}
	}
	if ($tot == True){
		echo "Aktor " .IPS_GetName($varID)." mit der ID: ".$varID . PHP_EOL;
 	}
}

Beispiel der Ausgabe:

Aktor FB Schlafzimmer mit der ID: 25025
Aktor Strahler Ecken mit der ID: 24601
Aktor IPS-Tracker#161 - Schlaf mit der ID: 24427
Aktor Keller 4*UP mit der ID: 24134
Aktor Magnet Ventil Hauptleitung #4 mit der ID: 20080
Aktor TFK Treppe mit der ID: 19032
Aktor IPS-Tracker #160 - Büro mit der ID: 18407
Aktor TFK aber wo?? mit der ID: 18357
Aktor Neon mit der ID: 13976
Aktor KEY #3 mit der ID: 13269
Aktor Heating Control mit der ID: 12339
Aktor Schreibtisch OG mit der ID: 11174

MST