Iphone Anwesenheitserkennung

Hiho Leute,

ich habe heute ein wenig mit der Anwesenheitserkennung mittels WLAN und einem Iphone getestet.
Bekanntlichermaßen geht das Iphone ja in einen Standby Modus wenn es gesperrt ist, also fällt permantentes anpingen schon einmal flach.
Allerdings wird das Iphone in der Wlan Übersicht meiner Fritzbox als Online angezeigt, d.h. meiner einschätzung nach das man doch als Ansatz hier die Anwesenheit des Smartphones auslesen könnte.

Hat jemand zufällig ein Script zur Hand mit dem man den Status eines Gerätes im Wlan auf der Fritzbox auslesen kann ?

Ich habe seit ca. 3 Wochen ein Script zum testen hier laufen, was genau das macht.
Idee war irgendwo im Thread http://www.ip-symcon.de/forum/threads/7566-%28W%29LAN-Watch-Dog glaube ich. Finde es und den Ideengeber gerade nicht wieder.
Bis auf das ich alle 2-5h Stunden Offline Meldungen von meinem HM-LAN-Gateway erhalte, scheint das gut zu funktionieren.
Je nachdem welche FritzBox und welche FW, kann es sein das der Filter bei Zeile 71 / 72 angepaßt werden muss.
Ist also eher eine ‚Bastellösung‘.
Neue Geräte in der FB werden automatisch angelegt, und auch automatisch umbenannt. Ident ist die MAC-Adresse der Geräte.


<?
require_once("Login.inc.php");  // Login ist nicht bestandteil des Scriptes z.B. von der Anrufliste 'klauen'. Funktion bei mir: $SID = Fritz_Login($fritzbox_Adresse, $fritzbox_Password);
$fritzbox_Adresse = 'fritz.box';
$fritzbox_Password = 'xxxxxx';
$only_test1 = false;
$only_test2 = false;
// Bitte erst testen über:
//$only_test1 = true;  // Gesamten Inhalt ausgeben
// oder
//$only_test2 = true;  // alles zwischen $startstr (Zeile 70) und $stopstr (Zeile 71) ausgeben
// Die Ausgabe sollte ca so aussehen:
/*
[1] = {
      ["UID"] = "landevice3242",
      ["_node"] = "landevice0",
      ["active"] = "1",
      ["auto_wakeup"] = "0",
      ["deleteable"] = "2",
      ["dhcp"] = "0",
      ["ethernet"] = "1",
      ["ethernet_port"] = "1",
      ["guest"] = "0",
      ["ip"] = "192.168.xxx.xxx",
      ["ipv6_ifid"] = "::bebe:bebe:bebe:bebe",
      ["mac"] = "BC:BC:BC:BC:BC:BC",
      ["manu_name"] = "1",
      ["name"] = "ESXI",
      ["online"] = "0",
      ["parentname"] = "",
      ["parentuid"] = "",
      ["plc"] = "0",
      ["source"] = "0x1210",
      ["speed"] = "1000",
      ["static_dhcp"] = "0",
      ["url"] = "",
      ["vendorname"] = "",
      ["wakeup"] = "0",
      ["wlan"] = "0",
      ["wlan_UIDs"] = "",
      ["wlan_show_in_monitor"] = "0",
      ["wlan_station_type"] = "default"
    },
    */

if ($_IPS['SENDER'] == "Execute")
{
   IPS_SetHidden($_IPS['SELF'], true);
   IPS_SetName($_IPS['SELF'], "Auslese-Skript");
	$parentID = IPS_GetParent($_IPS['SELF']);
   $parentObject = IPS_GetObject($parentID);
   if ($parentObject['ObjectType'] !== 1)
   {
       $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
       IPS_SetParent($instanceID, $parentID);
       $parentID = $instanceID;
       IPS_SetParent($_IPS['SELF'], $parentID);
       IPS_SetName($instanceID, "Netzwerkgeräte");
   }
   IPS_SetScriptTimer($_IPS['SELF'], 60);
}

$SID = Fritz_Login($fritzbox_Adresse, $fritzbox_Password);
if ($SID === false) return;
$devicelist = strip_tags(file_get_contents("http://{$fritzbox_Adresse}/net/network_user_devices.lua?sid=".$SID));  //settings/landevice/list

if ($only_test1)
{
	print_r ($devicelist);
	return;
}
$startstr='["landevice:settings/landevice/list(name,ip,mac,UID,dhcp,wlan,ethernet,active,static_dhcp,manu_name,wakeup,deleteable,source,online,speed,wlan_UIDs,auto_wakeup,guest,url,wlan_station_type,vendorname,parentname,parentuid,ethernet_port,wlan_show_in_monitor,plc,ipv6_ifid)"] = {';
$stopstr='["landevice:settings/landevice0/ipv6addrs0';
$i1 =strpos($devicelist,$startstr)+strlen($startstr)+5;
$i2 = strpos($devicelist,$stopstr);
$devicelist = substr($devicelist,$i1,$i2-$i1-6);

if ($only_test2)
{
	print_r ($devicelist);
	return;
}

$devices = preg_split('(\[\d+\] = {)',$devicelist);
unset($devices[0]);
foreach ($devices as $device)
{
	$rawdata = explode(',',$device);
	unset($rawdata[count($rawdata)-1]);
	foreach ($rawdata as $data)
	{
		$temp = explode(' = ',$data);
		$devicedata[trim($temp[0])] = trim($temp[1],'"');
	}

	$ident = str_replace(':','',$devicedata['["mac"]']);
	$id = GetOrCreateVariableByIdent(IPS_GetParent($_IPS['SELF']), $ident, $devicedata['["name"]']." (".$devicedata['["ip"]'].")", 0, 0, "~Switch");
	if ($devicedata['["active"]']== "1")
	{
	 if (GetValueBoolean($id)== false) SetValueBoolean($id,true);
	} else {
	 if (GetValueBoolean($id)== true) SetValueBoolean($id,false);
	}
}
return;



function GetOrCreateVariableByIdent($parent, $ident, $name, $type, $position, $profile="", $hidden=false)
{
	global $_IPS;

	$vid = @IPS_GetObjectIDByIdent($ident,$parent);
   if($vid === false)
   {
		$vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $parent);
      IPS_SetPosition($vid, $position);
      IPS_SetHidden($vid, $hidden);
      IPS_SetVariableCustomProfile($vid, $profile);
      IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
      IPS_SetIdent($vid,$ident);
    }
    if (IPS_GetName($vid) <> $name) IPS_SetName($vid, $name);

    return $vid;
}

?>

In der Visu habe ich mir mit Links und TabPanes eine Übersicht gebaut (rechte Seite ist die FritzBox).


Hier mal das Login-Script:


<?
function Fritz_Login($fritzbox_Adresse, $fritzbox_Password)
{
	$ch = curl_init('http://'.$fritzbox_Adresse.'/login_sid.lua');
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$login = curl_exec($ch);
	$session_status_simplexml = simplexml_load_string($login);
	if ($session_status_simplexml->SID != '0000000000000000')
	{
		return $session_status_simplexml->SID;
	}
	else
	{
	   $challenge = $session_status_simplexml->Challenge;
   	$response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $fritzbox_Password, "UCS-2LE", "UTF-8"));
	   curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua");
	   $sendlogin = curl_exec($ch);
	   curl_close($ch);
	   $session_status_simplexml = simplexml_load_string($sendlogin);
	   if ($session_status_simplexml->SID != '0000000000000000')
   	{
		   return $session_status_simplexml->SID;
	   }
		else
		{
      	echo "Fehler: Login fehlgeschlagen";
	      return false;
   	}
	}
}
?>

Michael

Hiho,

dankeschön für das Script, ich werde mich mal daran versuchen.
Hast du noch ein Beispiel für die „Login.inc.php“ ? Hab schon im Thread gesucht aber noch nichts schlüssiges gefunden.

Ich habe das oben mal mit angehängt, und dabei gleich noch eine Prüfung ob der Login erfolgreich war im erstem Script eingebaut.
Michael

Danke dir … habs eben mal getestet. Mein Plan scheint nicht aufzugehen.
Das Iphone weigert sich wehement auf irgendeine Art und weise im Wlan zu bleiben.

Ich habe mir schon diverse Lösungen angesehen, vom VPN Tunnel der Permanent offen ist bis zum Battery Pack.
Sind diese Schweineteuren Designer Teile wirklich so bescheuert das man nicht mal einstellen kann … „Liebes Iphone bitte bleibe im Wlan auch wenn du gelockt bist“.

Also mein Samsung S3 hat diese Funktion ^^

Aber die Androiden sind da nicht alle gleich…
Eins meiner ‚Marken‘ Tablets weigert sich auch im WLan zu bleiben, wenn der Screen aus ist. Egal was man einstellt in den Wlan-Einstellungen.
Während mein China-S3-Clone das ohne Probleme macht.
Michael

Okay gut … ich hab Cyanogenmod aufn Galaxy :slight_smile: … anscheinend geht das mitm Iphone das man es im Wlan hält auch wenn es gelockt ist. Allerdings braucht man dafür einen Jailbreak … grad bei Iphones mit laufender Garantie riskant…

Ich denke ich muss doch auf die AKM Variante zurückgreifen.

AKM ist eine gute Alternative.
Schau dir aber vorher nochmal GeoFency fürs iPhone an. Dazu findest du hier im Forum massig Hinweise.
Am Besten einfach GeofencyInfo über die IPSLibrary installieren.
Ist nicht perfekt, aber tuts erstmal… werde demnächst noch ein paar iBeacons dazu holen.

Die Ibeacons habe ich auch schon getestet … das Problem meiner meinung nach ist bei den Dingern
das diese lediglich ein Singal aussenden.

Wiki sagt :
iBeacons können selber keine Push-Benachrichtigungen auf Empfangsgeräte senden, Nutzerdaten sammeln oder speichern. Sie senden lediglich Informationen zur eigenen Identität (die Werte UUID, Major und Minor).

Ich habe die Beacons von Kontakt.io verwendet, dort kann man eine URL über das Webinterface / app einstellen und verschiedene Sachen schalten über den IPS Server.
Allerdings kann mir der Beacon nicht sagen welches Smartphone dieses tut, daher eigentlich unbrauchbar.

Also zb. Ibeacon => www.ips-server.lol/user/licht-an.php

Habe schon überlegt ob es nicht möglich ist in dieser licht-an.php eine Abfrage des Senders zu machen ( zb. IP Adresse oder MAC Adresse ) dies müsste allerdings dann im HTTP Header mitgesendet werden und da bin ich mir nicht sicher ob sowas möglich ist.

Hallo Nall chan,

Vielen Dank für den Script / Scripte - funktioniert alles - nach der „erwarteten“ Änderung in den beschriebenen Zeilen. Eine Frage habe ich : Wieso kann ich denn kein https bei der Login Funktion nehmen?

Danke und Grüße,
MaLu

Habe mich mit CURL und HTTPS nie beschäftigt, warum sollte ich die FB auch im lokalen LAN per SSL Abfragen ?!
Eventuell geht das sogar nur wenn du die OpenSSL-Lib in IPS austauschst, ist im Forum schon zig-mal beschrieben worden. u.A. hier :http://www.ip-symcon.de/forum/threads/12427-Switch-über-SNMP-auslesen-und-saubere-Verarbeitung-Wie?p=173402#post173402
Außerdem mußt du wahrscheinlich noch CURL sagen dass er das Zertifikat nicht prüfen soll:
http://de2.php.net/manual/en/function.curl-setopt.php
Option : CURLOPT_SSL_VERIFYPEER
Ansonsten einfach mal hier durchackern :http://www.ip-symcon.de/forum/threads/23236-Funktionierende-Scripts-für-FritzOS-6-0-7390
Ich glaube da kommt auch das ‚Original‘ von meinem Script oben her.

Michael

Hi Flobo!

Korrekt - aber kein Problem :wink:

Nö. Das iBeacon spricht überhaupt nicht mit meinem IPS-Server. Andersrum wird ein Schuh draus:
Mein Smartphone erkennt, dass ich in der Nähe des iBeacons bin. Daraufhin meldet mein Smartphone an den IPS-Server „Moin, hier ist Michaels Smartphone, ich hab grad den Wohnzimmer-Bereich betreten“. Das iPhone meiner Dame hingegen sendet, dass es sich im Keller befindet.

Ergo: Perfekt. Ich kann es mir im Wohnzimmer bequem machen, lasse per IPS den Fernseher und AVR einschalten und im Keller läuft die IPS-gesteuerte Sprachausgabe „Koch’ schneller - der Chef hat Hunger!“

Alles total unkompliziert mit GeoFency auf dem iPhone und GeoFencyInfo im IPS (via IPS-Library).

Greez,
Michael

Hallo Michael,

welchen iBeacon verwendest du ?

Gruß Frank

Gesendet von meinem iPad mit Tapatalk

Hallo Michael,

wo wo und wie wird dann der ibeacon in geofency aktiviert ?
Habe nichts gefunden.

Hallo Leute,

kann mir einer Starthilfe geben, ich bekomme das Skript nicht an start…
muß man das Login Skript mit diesem verlinken?

Warning:  require_once(Login.inc.php): failed to open stream: No such file or directory in C:\IP-Symcon\scripts\37274.ips.php on line 2

Fatal error:  require_once(): Failed opening required 'Login.inc.php' (include_path='.;C:\php\pear') in C:\IP-Symcon\scripts\37274.ips.php on line 2

Gruß Stefan

Hey, danke für das Skript funktioniert einwandfrei.

Da ich erst seit 2 Tagen mit IPS Arbeite, bzw. eher mehr probiere hab ich nochmal eine Frage zu dem Skript. Es werden ja dauerhaft alle in der Fritzbox gelisteten Geräte als Variable angelegt. An welcher Stelle könnte man es so ändern, dass nur aktive (Geräte die Online bzw. an der Fritzbox angemeldet sind) angezeigt werden, bzw. inaktive auch wieder aus der Liste gelöscht werden.

Danke schon mal.

Unterhalb der Zeilen
SetValueBoolean($id,false); bzw. True
Noch ein
SetHidden($id,true); bzw false
Einfügen schon werden die Variablen der Geräte die offline sind ausgeblendet.
Gilt nicht wenn du die Variablen mit Links im Webfront visualisierst.
Löschen wäre ganz schlecht, dann ändert sich immer die ID vom Objekt und Scripte die darauf aufbauen werden nicht mehr laufen oder müssen die Variable über den Ident(Mac-Adresse) suchen.
Michael

Das mit dem Löschen hat seine Berechtigung, allerdings habe ich ca. 50-70 Geräte in meiner Liste was doch eine recht hohe Anzahl an Variablen einnimmt, deshalb die Idee zu löschen. Die ID von den Geräten die ich brauche kann ich recht schnell über die Benennung der automatisierten Variablen bekommen, da diese Geräte und der Name mir ja bekannt sind.

Danke für die Hilfe die richtige Stelle im Skript zu finden :wink:

Dann wäre ein Filter sinnvoller.
Z.B. auf Basis der MACs.
Und dann mit in_array prüfen.
Michael

Am zuverlässigsten und einfachsten läuft bei mir einfach geofency.
Nahezu ohne Akkuverbrauch und wirklich sehr zuverlässig - ich steuere damit meine Anwesenheitserkennung und auch testweise die Alarmanlage zu deaktivieren, wenn ich nachhause komme.