(W)LAN Watch Dog

Das habe ich auch versucht, nur bleibt beim verlassen des WLAN Netzes mit dem iPhone der Status noch stundenlang mit dem Status „Online“. Nur, wenn ich mich noch im WLAN Bereich vom WLAN ordentlich abmelde (indem ich z.B. das WLAN im iPhone deaktiviere), dann geht der Status sofot auf offline. Ist das bei Dir auch so?

Hallo,

ich habe die Funktion von Steiner ergänzt, um im Webfront Geräte auch per Wake on LAN zu starten.
Die Geräte müssen dies natürlich unterstützen. Dazu ist meist im BIOS eine Funktion zu aktivieren, und unter Windows in den Eigenschaften der Netzwerkkarte das „Wake on Magic Paket“ zu aktivieren.

Ich habe die Scripte so ausgelegt, dass es im Webfront mit der aufrufenden Konfigurator ID eine Rückmeldung gibt. Ausserdem müssen keine IP Adressen in den Scripten gepflegt werden, die Broadcast wird aus der ausgelesenen IP gebildet. Es wurden in den Scripten auch sonst keine ID´s verwendet.

Vorbereitungen:

[ul]
[li]In der Kategorie, wo das W(LAN) Watchdog Script liegt ein neues Script mit dem Dateinamen wol-function.php anlegen. Den Inhalt des ersten Scripts dort hinein kopieren.
[/li][li]Ein weiteres Script anlegen, Name WOL
[/li][li]In den Eigenschaften, wo die IP Adresse eingetragen wird mit einem Semikolon getrennt, ohne Leerzeichen die MAC Adresse eintragen (Format: xx:xx:xx:xx:xx:xx)
[/li][li]In jeder Variablen, die eine WOL Funktion bekommen soll als Aktionsscript das zweite erstellte Script verwenden
[/li][/ul]

Erstens eine Funktion für das WOL, die habe ich auch hier im Forum oder irgendwo im Netz gefunden. Ich habe das ganze extra als Funktion ausgelegt und separat abgelegt, da ich es an anderen Stellen noch verwende.

<?

/*
Parameter: 	$addr = IP-Adresse als x.x.x.255 zu übergeben
				$mac = MAC Adresse als xx:xx:xx:xx:xx zu übergeben
				$socket_number = Socket (in der Regel Port 9)
				$IPS_Konfigurator = Webfront Konfigurator über den das Script gestartet wurde
				$id_name = Name der Variablen, aus der aufgerufen wurde
*/

function WakeOnLan($addr, $mac,$socket_number,$IPS_Konfigurator,$id_name)
{
  $addr_byte = explode(':', $mac);
  $hw_addr = '';
  for ($a=0; $a <6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));
	   $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
		for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;
		// send it to the broadcast address using UDP
		// SQL_BROADCAST option isn't help!!
		$s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
			if ($s == false)
			{
				//echo "Error creating socket!
";
				//echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
				WFC_SendNotification($IPS_Konfigurator, 'WOL', 'Error creating socket', 'Repeat', 0);
				return FALSE;
			}
			else
			{
				// setting a broadcast option to socket:
				$opt_ret = socket_set_option($s, SOL_SOCKET, SO_BROADCAST, TRUE);
				if($opt_ret <0)
				{
					//echo "setsockopt() failed, error: " . strerror($opt_ret) . "
";
					WFC_SendNotification($IPS_Konfigurator, 'WOL', 'Error creating socket', 'Repeat', 0);
				  	return FALSE;
				}
				if(socket_sendto($s, $msg, strlen($msg), 0, $addr, $socket_number))
				{
				  	//echo "Magic Packet sent successfully!</li>";
					WFC_SendNotification($IPS_Konfigurator, 'WOL', "Wake on Lan Kommando an ".$id_name." erfolgreich gesendet", 'Repeat', 0);
					socket_close($s);
				  	return TRUE;
 				}
				else
				{
  					//echo "Magic packet failed!";
				 	WFC_SendNotification($IPS_Konfigurator, 'WOL', 'Wake on Lan Kommando an '.$id_name.' nicht gesendet', 'Repeat', 0);
					return FALSE;
				}
			}
}
  
  

?>

Zweitens ein Script, welches als Aktionsscript mit den Variablen verknüpft werden muss:

<?

include "wol-function.php"; //Einbinden der Funktion

flush();
$socket_number = "9"; //UDP Socket festlegen


if ($IPS_SENDER == "WebFront") //Wenn Absender Webfront
{
   $IPS_Konfigurator = $IPS_CONFIGURATOR; //KonfiguratorID ermitteln und in Übergabevariable speichern
	$id_info = IPS_GetObject($IPS_VARIABLE); //Array des aufrufenden Objekts holen
	$id_name = $id_info['ObjectName']; // Name der Variable
   $id_typ = $id_info['ObjectType']; //Typ des Objekts (bei 2 ist es eine Variable)
   if ($id_typ == 2) // nur bei Variablen
	{
       $id_addr = $id_info['ObjectInfo']; //Objekteigenschaten auslesen
       //echo $id_addr ."
";
       $ip_addr = strtok($id_addr, ";"); //erster Teil vor dem Semikolon ist die IP Adresse wird aber hier nicht mehr gebraucht
		 //echo $ip_addr."
";
	    $mac_addr = strtok(";"); //zweiter Teil nach dem Smikolon ist die MAC Adresse
	    //echo $mac_addr."
";
    }
}

$a_IP_in =explode(".",$ip_addr); //IP Adresse an den Punkten in ein Array zerlegen
$a_IP_out = Array(); //Array für die Umwandlung definieren

for ($i=0; $i <= 3; $i++) //für jedes Segment der IP Adresse
{
	$a_IP_out[$i] = str_pad($a_IP_in[$i], 3, "000",STR_PAD_LEFT); //führende Nullen einbauen
}

$a_IP_out[3] = 255; //letztes Segment für Braodcast definieren
$ip_addr = implode(".", $a_IP_out); //IP Adresse wieder in einen String zusammen setzen



WakeOnLan($ip_addr, $mac_addr,$socket_number, $IPS_Konfigurator,$id_name); // WOL Funktion aufrufen

?>

Und zu guter letzt muss auch die ursprüngliche Funktion von Steiner angepasst werden, damit dort IP-Adresse und MAC Adresse getrennt werden:

<?

// (C) by IP-Symcon 2009
// Trigger: z.B. alle 5 Minuten

foreach(IPS_GetChildrenIDs($IPS_SELF) as $item){   // alle Unterobjekte
    $id_info = IPS_GetObject($item);
    $id_typ = $id_info['ObjectType'];
    if ($id_typ == 2){                                      // nur bei Variablen
        $id_adr = $id_info['ObjectInfo'];
        $ip_adr = strtok($id_adr, ";");
		  //echo $ip_adr."
";
	     $mac_adr = strtok(";");
	     //echo $mac_adr."
";
	     $ping = Sys_Ping($ip_adr, 1000);             // Ping max. 2 Sek. warten
	     if($IPS_SENDER == "Execute") {                     // zum Testen
            echo "IP: $ip_adr 
";
            echo "Ping: " .(int)$ping. "

";
        }
        SetValue($item, $ping);                      // Ping-Ergnis speichern
    }
}

?>

Ich hoffe es funktioniert bei allen.

Viels Spaß und Gruß
Christian

WOL-Übersicht.PNG

WOL-Eigenschaften.PNG

WOL-Aktionsscript.PNG

Cooool…vielen Dank. Ich werde es testen, sobald ich zu Hause bin.

:loveips:

Hi,

wollte jetzt auch mal den LAN Watchdog austesten. Habe das Skript angelegt, dadrunter die Boolean Variable mit der IP-Adresse meines HTPC’s.
Führe ich jetzt das Skript aus, bekomme ich nur ein Fenster angezeigt (Ausgabe sh. unten), in dem das Skript noch mal komplett steht, aber mehr passiert nicht. Was mache ich falsch???


// (C) by IP-Symcon 2009
// Trigger: z.B. alle 5 Minuten

foreach(IPS_GetChildrenIDs($IPS_SELF) as $item){   // alle Unterobjekte
    $id_info = IPS_GetObject($item);
    $id_typ = $id_info['ObjectType'];
    if ($id_typ == 2){                                      // nur bei Variablen
        $id_adr = $id_info['ObjectInfo'];
        $ping = Sys_Ping($id_adr, 1000);             // Ping max. 2 Sek. warten
       if($IPS_SENDER == "Execute") {                     // zum Testen
            echo "IP: $id_adr 
";
            echo "Ping: " .(int)$ping. "

";
        }
        SetValue($item, $ping);                      // Ping-Ergnis speichern
    }
}


Hallo DeejayT,

wenn das alles ist, was bei Dir als PHP Code drin steht fehlen die Beginn und Ende Zeichen

Bitte mal ganz oben ein <? und ganz unten ?> einfügen.

Gruß
Christian

Hallo

Danke für das Skript leider schaffe Ich das noch nicht , könnte jemmand es stp by step erklären ??

@docrossi

Bitte das Skript ausführen und den Fehler hier posten. Eventuell das Skript so wie Du es angelegt hast auch noch. Die Baumstruktur mit einem als fehlerhaft markierten Skript ist für eine Fehlersuche nicht ausreichend.

Hallo docrossi,

ich habe einen Fehler in Deiner Baumstruktur gesehen. Das Script wol-funktion.php hat zwar den Namen, aber leider nicht den passenden Dateinamen.

Entweder Du legst das Script nochmal neu an und vergibst als Dateinamen wol-function.php oder du änderst im Script WOL in der „include Zeile“ den Scriptnamen auf 27500.ips.php.

Dann könnte es gehen.

Gruß
Christian

Ohhhhh Danke Christian,

das war es. Manchmal sieht man den Wald vor lauten Bäumen nicht :smiley:

Hallo,

aber gerne doch.

Gruß
Christian

Hallo

folgende Fehlermeldungen:

Warning:  include(wol-function.php) [function.include]: failed to open stream: No such file or directory in C:\IP-Symcon\scripts\30364.ips.php on line 3

Warning:  include() [function.include]: Failed opening 'wol-function.php' for inclusion (include_path='.;C:\php5\pear') in C:\IP-Symcon\scripts\30364.ips.php on line 3

Notice:  Undefined variable: ip_addr in C:\IP-Symcon\scripts\30364.ips.php on line 26

Notice:  Undefined offset: 1 in C:\IP-Symcon\scripts\30364.ips.php on line 31

Notice:  Undefined offset: 2 in C:\IP-Symcon\scripts\30364.ips.php on line 31

Notice:  Undefined offset: 3 in C:\IP-Symcon\scripts\30364.ips.php on line 31

Fatal error:  Call to undefined function WakeOnLan() in C:\IP-Symcon\scripts\30364.ips.php on line 39

Hallo docrossi

Das sieht so aus, als ob der include nicht geht. Dann gehen natürlich auch weitere Befehle nicht.

Ansonsten würde mir nur noch einfallen, dass ich noch php Module eingetragen habe, die bei Dir fehlen.

Ich werde am WE mal nachschauen und melde mich dann.

Gruß
Christian

Muss es nicht wol-function.ips.php heisen?

Hallo docrossi,

bei Dir scheint der include Path nicht zu stimmen. Der wird eigentlich in der php.ini angegeben. Bei mir ist da nichts eingetragen, deshalb scheint das Script den include Befehl aus dem ips-Script Directory zu nehmen.

Bei Dir steht etwas wie: include_path=’.;C:\php5\pear’ in der ini.

Du kannst es auch anders lösen, indem Du den include Befehl raus nimmst, und den Inhalt des function-scripts an das andere Script anhängst. Einfach ganz unten vor dem "?> einfügen.

Das Script lässt sich übrigens nur aus dem Webfront heraus starten. Daher kommen die anderen Fehler. Die Befehle muss ich noch in die If Abfrage reinnehmen damit das nicht passiert.

Gruß
Christian

Hallo!
Ich hab folgendes Problem: Ich möchte mein iphone3 anpingen. Hab ihm ne feste ip gegeben. Es wird erkannt und ping mit „true“ zurückgeliefert, aber nach mehreren Durchläufen bekomm ich „false“ aufs Ping. Erst hab ich gedacht, dass das/der/die??? Ping verloren ging, und hab den Befehl mehrfach abgeschickt, und geprüft ob einer ankommt. Hat aber auch nicht funktioniert (bleibt „false“). Bei nem anderen Beitrag hier hab ich gelesen, dass sich das Iphone zeitweise abmeldet vom LAN (mit Link auf dieses Thema). Liegts am Gerät, oder hat jemand eine Idee woran das noch liegen kann? Bin für jede Antwort dankbar!!!

Sorry, habs übersehen… „Standby“ ist vermutlich schuld!

Mit Sicherheit sogar.

Bedauerlicherweise gehen i-Geräte, wenn diese nicht an einer Stromversorgung hängen, in den Standby.

ich hab da kürzlich mal eine Variable dazu geloggt. Mein IPhone ist nachts in der Docking-Station. 2 x hat es das WLan während ein paar Minuten ausgeschalten, somst wars die ganze Nacht an. Auch Tagsüber schaltet es für mich nicht nachvollziehbar ein und aus.

Hallo jbu!
Welche iphone version hast du? Hardware und Software? Wär für mich wichtig, weil ich meine Anwesenheit damit abfragen möcht, und viele Funktionen von ips davon abhängen sollen. Ich benutz Iphone3 iOS:4.2.1; Vielleicht hat jemand Erfahrung, wie es sich bei Android Phones verhält. Oder kann man seine Anwesenheit sonst auf irgendeinem Weg abfragen?

die Version spielt da keine Rolle. Es geht ja dabei hauptsächlich um Akkulaufzeit. Ich denke, bei den Android’s ist dies nicht anders. Schau dir die diversen Berichte über das AKM-Modul an.