(W)LAN Watch Dog

Um einen Ausfall von Geräten mit einem LAN-Anschluss (z.B. CCU, Webkamera, Gateway) zu erkennen, kann der Sys_Ping Befehl verwendet werden. Für das u.g. Skript muss jedem LAN-Gerät eine Variable vom Typ Boolean vergeben werden. Diese muss im Baumdiagramm unter dem Skript stehen (das Skript nutzt die IPS_GetChildrenIDs Funktion, um alle Variablen unterhalb des Skrips zu durchsuchen). Im Feld Beschreibung der jeweiligen Variablen wird die entsprechende IP-Adresse eingetragen. Um die Verbindung zum Internet zu testen, kann z.B. Google angepingt werden. Hier muss dann ‚www.google.de‘ eingetragen werden (Bild 2). Mit der Eigensacht ‚ObjectInfo‘ (siehe:IPS_GetObject) kann der Text ausgelesen werden. Getriggert wird das Skript z.B. alle 2 Minuten. Ist ein Gerät nicht mehr erreichbar, so kann eine Benachrichtigung mit Hilfe der Funktion WFC_PushNotification auf das Smartphone erfolgen oder eine akustische Alarmmeldung mit Hilfe des WDT-868 erfolgen. Die If-Anweisung ‚if($ping!= GetValue($objectID)‘ sorgt dafür, dass die Benachrichtigung nur einmal bei einem Ausfall ausgeführt wird und nicht bei jeder Skriptausführung.
Wichtig: ‚SetValue(19532, $alarm)‘ muss sich außerhalb der If-Anweisung befinden, damit der Trigger für das 2. Skript regelmäßig ausgeführt wird (und somit der Timer vom WDT-868 aktualisiert wird).
Sollen bestimmte Geräte zeitweise nicht mehr überwacht werden,
so kann man in den ‚Optionen‘ der Variable ‚Versteckt‘ aktivieren bzw. per Befehl: ‚IPS_SetHidden‘ in einem Skript.
In der IF-Anweisung ($objectIsHidden == False) werden diese dann nicht mehr berücksichtigt.

// (C) by Symcon GmbH
// Trigger: z.B. alle 2 Minuten
// IP-Adresse in die "Beschreibung" der Variablen vom Typ Boolean eintragen

$alarm = false;    // initialisieren, Startwert > kein Alarm

foreach(IPS_GetChildrenIDs($_IPS['SELF']) as $objectID) {   // alle Unterobjekte
	$object = IPS_GetObject($objectID);
	$objectTyp = $object['ObjectType'];
   $objectIsHidden = $object['ObjectIsHidden'];
   // echo (int) $objectIsHidden . ": ";                 // zum Testen
	if (($objectTyp == 2) and ($objectIsHidden == False)){// nur bei sichtbaren Variablen
		$ipAdresse = $object['ObjectInfo'];             	// Adresse steht im Feld 'Beschreibung'
		$ping = PingVerify($ipAdresse, 100, 5);        		// Ping maximal eine Sekunde warten
		if ($ping == false){                            	// wenn ein Gerät ausgefallen ist
         $alarm = true;                       				// Alarm setzen
		}
		if ($_IPS['SENDER'] == 'Execute'){ 						// zum Testen
			if($ping) {
			   $status = "Online";
			} else {
			   $status = "Offline";
			}
			echo $ipAdresse . " = " . $status . PHP_EOL;
		}
		if($ping != GetValue($objectID)){
			SetValue($objectID, $ping);                 	// Ping-Ergnis speichern
			if($ping) {
				$meldung = "Rückkehr: ".	$object['ObjectName'];
			} else {
				$meldung = "Ausfall: ".	$object['ObjectName'];
			}
			WFC_PushNotification(58972 /*[Demo]*/, "WatchDog", $meldung, "Speaker", 0);
		}
	}
}

SetValue(19532 /*[Büro / Server\WatchDog\WDT\LAN WD Ping (alle)]*/, $alarm); // Variable speichern

function PingVerify($ip, $timeout, $count) {

	if($count == 0)
	   return false;

	$ping = Sys_Ping($ip, $timeout);
	if($ping == false) {
	   return PingVerify($ip, $timeout, $count-1);
	} else {
	   return $ping;
	}
}

Das Skript für den WDT-868 wird ‚Bei einem bestimmten Wert / True / Option: Nachfolgende Ereignisse ausführen‘ getriggert.

$id= 23937;
PJ_SwitchDuration($id, True, 3 * 60);  // LAN WD ist auf 2 Minuten eingestellt

Nach Ablauf der eingestellten Zeit oder bei einem Spannungsausfall, fällt das Relais vom WDT-868 ab. Mit Hilfe einer 9V Blockbatterie und einem optischen, akustischen Signalgeber wird man so benachrichtigt – auch wenn der PC komplett ausfällt (Bild 3).

Der WDT-868 kann über unserem Partner-Shop bezogen werden.

MST

Hinweis: es gab hierzu einen ähnlichen Beitrag

wdt_868_google.PNG

Im Feld Beschreibung der jeweiligen Variablen wird die entsprechende IP-Adresse eingetragen.

hallo michael,
kann man das nachträglich ändern ? habe meine ganzen ip-addys in variablen, falls änderungen um nicht alles umzuskripten
viele grüsse
axel

Hallo Axel,

klar kann man das Feld ‚Beschreibung‘ ändern: rechte Maustaste auf die entsprechende Variable / ‚Objekt bearbeiten‘
Es wird bei jeder Skriptausführung ausgelesen ($ipAdresse = $object[‚ObjectInfo‘]).

MST

hm, ja klar ne. hab immer die variable geöffnet und da durchgeklickt

Das Script oben hat nur den Nachteil das die PushNotification - Meldung alle 2 Minuten kommt solange ein Gerät Offline bleibt.

Wie bekommt man „nur bei Variablenänderung“ mit in das Script ohne es in ein anderes Skript auslagern zu müssen?

Hallo Heiner,

mit Hilfe einer IF-Anweisung.
Ich habe das o.g. Skript entsprechend aktualisiert.

MST

Ich habe das o.g. Skript etwas erweitert: sollen bestimmte Geräte zeitweise nicht mehr überwacht werden,
so kann man in den ‚Optionen‘ der Variable ‚Versteckt‘ aktivieren bzw. per Befehl: ‚IPS_SetHidden‘ in einem Skript.
In der IF-Anweisung ($objectIsHidden == False) werden diese dann nicht mehr berücksichtigt.

MST

Hallo,

könnte man das Anlegen der Lan-Geräte nicht automatisieren?
Sowohl die Liste aus der Fritzbox (hier sieht man z.B Kindersicherung)


wie auch das „Steiner“-Script mit den ganzen Untervariablen ist noch nicht dass, was ich suche.

Ich stelle mir das eher so vor:

(IPScanner Pro,Mac)
und dann mit Bilder die „online“ bunt und „offline“ schwarzweiß sind.

Hat da jemand schon etwas weiter entwickelt, ähnlich der Anrufliste?

  1. subbnetz eingeben/ping auf 1-254
  2. jedes Gerät das auf Ping antwortet, Hostname zu Variablennamen . Beschreibung Netzwerknummer/MAC, Boolean On/Off

Gruß Konny

… SO in etwa


//kopiert ..............
// Ende - Login in die Fritzbox
// -----------------------------------------------------------------------------

// Daten lesen
$devicelist = file_get_contents("http://{$fritzbox}/net/network_user_devices.lua?sid=".$SID);
//print_r ($devicelist);

//  Filter definieren (IP-Adresse im Format 192.168.2.xx)
preg_match_all('([a-z0-9-]*192.168.2\.\d{2}[0-9A-F:]*)i', strip_tags($devicelist), $devices);
//print_r ($devices[0]);

// Anzahl der Objekte im Ergebnis feststellen
$anzahl = count($devices[0]);

// Ergänzt

$subnetz="192.168.2";

// $CatID = IPS_CreateCategory();       // Kategorie anlegen
// IPS_SetName($CatID, "LAN-$subnetz"); // Kategorie benennen
//wie bekomme ich die ID ?
//$ident = @IPS_GetObjectIDByName($subnetz, $id);

for ($i=1; $i<$anzahl; $i++)
//for ($i=1; $i<10; $i++)
    {
   // $IPSVarName="$subnetz.$i";
    // echo "$IPSVarName
";
      $mac = substr($devices[0][$i], -17);
      $name = substr($devices[0][$i], 0, -29);
      $ipadd = substr($devices[0][$i], strlen($name), 12);
	echo "IP: " . $ipadd . " MAC: " . $mac . " Name: ". $name ."
";

	 $IPSVarName = IPS_CreateVariable(0);
	 	IPS_SetName($IPSVarName,"$ipadd $name" );
	 	IPS_SetInfo($IPSVarName,$ipadd);
	 	if ($ProfileName == "0")
		 	{
			 }
		else
			{
			IPS_SetVariableCustomProfile($IPSVarName, "~Switch");
			}
	 	IPS_SetParent($IPSVarName,59452 /*[Fritz\Lan 192.168.2\LanwatchSteiner]*/);
	   //IPS_SetInfo($IPSVarName,$mac);
           //IPS_SetParent($IPSVarName,$ident);
	    
	 
}

schaut dann etwa so aus:

Kann mir irgendjemand den Fritz-Box-String erklären ( immer „Kindersicherung“ im Namen…)
Wo kann ich die Scriptlaufzeit erhöhen?
So sollte es ausschauen:

Gruß Konny

hallo!

kann mir jemand sagen wo hier mein fehler ist?

Danke
Christian