Sosumi - Find my iPhone

das ist ja jetzt sowas von Genial. Tausend Dank und mehr an euch alle :):):slight_smile:

Von mir auch ! Ihr seid die Besten !!!

Wirklich gut! Funktioniert auf Anhieb.

Danke der Lorbeeren.

Wenn es fertig ist wird alles inkl. der DummyInstnace und sämtlichen Profilen und ActionScript ablaufen.

Muss mich erst selbst wieder einarbeiten nachdem ich die letzte Zeit nur mit Guttenberg Skripten verbracht habe :wink:

:D:D:D:D

Auf jeden Fall ein sehr feiner Script, habe meine temporären Test Scripts auch schon damit abgelöst. :slight_smile:

Bravo Jungs! :D:D Werde das auch testen!

Kann einer der Moderatoren den Thread vielleicht trennen, hat nicht mehr viel mit Geoloqi zu tun…

HI ich habe mal eine Erfahrungsfrage.

Ich habe das Script mir nach meinen Bedürfnissen zurechtgebastelt und starte die Ortung nach folgenden Bedingungen:

if (($km >= 1) and ($km <= 2)) //Timmer 1
{
SetValueString( 32006 /*[Find my iPhone 4s\Nächste Aktualiesierung in]*/   , "1 Minute"    );
echo "bin über 1KM weit weg...";
IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , 1); //Alle 1 Minuten
}

if (($km >= 2) and ($km <= 4)) //Timmer 2min
{
SetValueString( 32006 /*[Find my iPhone 4s\Nächste Aktualiesierung in]*/   , "2 Minute"    );
echo "bin über 2KM weit weg...";
IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , 2); //Alle 2 Minuten
}

if (($km >= 20) and ($km <= 22)) //Timer 15min
{
SetValueString( 32006 /*[Find my iPhone 4s\Nächste Aktualiesierung in]*/   , "20 Minute"    );
echo "bin über 20KM weit weg...";
IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , 20); //Alle 20 Minuten
}

if (($km >= 35) and ($km <= 37))//Timmer 40min
{
SetValueString( 32006 /*[Find my iPhone 4s\Nächste Aktualiesierung in]*/   , "30 Minute"    );
echo "bin über 35KM weit weg...";
IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , 30); //Alle 35 Minuten
}


if (($km >= 50)  and ($km <= 600)) //Timmer 60min
{
SetValueString( 32006 /*[Find my iPhone 4s\Nächste Aktualiesierung in]*/   , "60 Minute"    );
echo "bin über 50KM weit weg...";
IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , 60); //Alle  Minuten
}

Ich habe nur gemerkt, das z.B. wenn ich alle 5 min abfrage, Apple nicht mitspielt :frowning: Der Standort wird abgefragt, aber er wird nicht aktualliesiert :frowning:

Mache ich was falsch oder ist das bei euch auch so ?

SUPER!!

Hab´s gerade mal installiert. Großartig!

Aber ich hätte da noch eine Frage/Wunsch:

Ich würde gerne die Karte rechts in einem Splitpane darstellen und die Benutzer (also die iphones) dann links. (siehe Anhang)

Ist es möglich in der Karte auch mehrere iPhones anzeigen zu lassen?

Bin php-dummy, deshalb meine Frage…

Danke und Gruß
Dirk

@Werner - geht halb, und jetzt auf Eis? So ist es bei mir auch oft… :smiley:

Hi wupperi,

ja das ist ein Manko an mir. Wenn es mal drin ist und ich schon wieder im nächsten Projekt stecke dann bleiben andere Sachen auf der halben Strecke stehen.

Da ich mit dem Apple-Dienst aber noch nicht wirklich zufrieden bin habe ich das Thema auch noch nicht zuende geführt.

Deshalb auch mein eigenes Zitat:

Sollte alles nach meinen Wünschen laufen wird weiterentwickelt.

Vielleicht wird es ja noch was :rolleyes:

Wo ärgert dich denn der Apple Dienst?

Ich bekomme bei Zeiten erst nach 20 Minuten eine Aktualisierung vom Apple-Dienst.

Ich muss den Timestamp mal loggen damit ich sehe wann und in welchen Abständen ich keine Aktuelle Position erhalte.

Vielleicht liegt es aber auch an meinem alten 3Gs.

So, habe die Skripte mal angepasst und das Ganze komplett auf mysql umgestellt, so dass jetzt auch verschiedene iDevices mit nur einem Satz Variablen im WF darstellbar sind. Zwei Dinge vorab: Die Skripte stammen originär nicht von mir, sondern von anderen Usern (sanman, WGreipl, etc). Ich sie lediglich auf Sosumi und meine Bedürfnisse angepasst. Auf das automatische Setzen von Variablen bzw. Profilen habe ich auch verzichtet. Die Skripte/Klassen


include("func_distance.ips.php");  // Function zur Berechnung der Distanz
include("class_Sosumi.ips.php");   // Klasse Find my iPhone
include("IPSInstaller.ips.php"); //Brownson's installer

müssen sich im …/scripts Verzeichnis von IPS befinden.

Das erste Skript muss je User (Apple ID) eingerichtet werden. Es pollt in variablen und i8m Skript einstellbaren Zeiten die Find my iPhone App auf dem iDevice ab und trägt die gefundenen Werte in einer MySQL Datenbank ein.
Hierzu sind in mysql das Schema „locate_iphone“ und die Tabelle „iphone_table“ anzulegen. Als Spalten in der Tabelle bitte den Wert „id“ als Autoincrement, sowie

 `latitude`, `longitude`, `timestamp`, `accuracy`, `exception`, `name`, `charging`, `battlevel`, `status`, `distance_from_home`, `Abfragezyklus`, `home_status` 

jeweils ohne „`“ anlegen.

Anbei das erste Skript:


<?

   include("func_distance.ips.php");  // Function zur Berechnung der Distanz
	include("class_Sosumi.ips.php");   // Klasse Find my iPhone
	include("IPSInstaller.ips.php");
	$loc_lat_home = XX.02903200796908; // Latitude Zuhause
	$loc_lon_home = X.270478785037994; // Longitude Zuhause
	$apple_id = 'XXXXXX'; //Apple ID
	$apple_password = 'XXXXX'; // Apple ID Passwort
	$db_host = "a.b.c.d"; // IP / DNS Name mysql host
	$db_user = "XXX"; // mysql user
	$db_password = "XXX"; //mysql password
	
if($IPS_SENDER == "TimerEvent" || $IPS_SENDER == "Execute"){

$parent_id = IPS_GetParent($IPS_SELF);
IPS_SetPosition($IPS_SELF, 999);
IPS_SetHidden($IPS_SELF, true);

$ssm = new Sosumi($apple_id, $apple_password, true);
$loc = $ssm->locate();
$target = ($loc['name']);



//Entfernung
$diff = distance($loc_lat_home, $loc_lon_home, $loc['latitude'], $loc['longitude']);
$timer = CreateTimer_CyclicByMinutes("Timer_".$target, $IPS_SELF, 15);
$home = "abwesend"; //abwesend




//Entfernung > 1km
	if($diff > 1.0) {	         
	//nix tun
   }
 	else
 	{
		$home = "zuhause";
		$minute = 2;
		IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute); 
	}

// Entfernung > 10km
	if ($diff > 10.0) {
		 $minute = 10;
   	 IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute); 
	}
	else //sonst (zwischen 1km und 10km immer alle 5 Minuten
	{
   	$minute = 5;
   	IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute); 
	}



//jetzt alles in die DB
 $db = mysql_connect($db_host, $db_user, $db_password);
	     mysql_select_db('locate_iphone', $db) or die(mysql_error());
   	  $dt = date('Y-m-d H:i:s');
        $lat = mysql_real_escape_string($loc['latitude'], $db);
        $lng = mysql_real_escape_string($loc['longitude'], $db);
        $acc = mysql_real_escape_string($loc['accuracy'], $db);
        $tmstmp = mysql_real_escape_string($loc['timestamp'], $db);
        $excpt = mysql_real_escape_string ($loc['exception'], $db);
        $name = mysql_real_escape_string ($loc['name'], $db);
        $chrg = mysql_real_escape_string ($loc['charging'], $db);
        $batt = mysql_real_escape_string ($loc['battlevel'], $db);
        $stat  = mysql_real_escape_string ($loc['status'], $db);
        $dist = mysql_real_escape_string($diff, $db);
		  $cycle = mysql_real_escape_string($diff, $db);
        $query = "INSERT INTO iphone_table (`latitude`, `longitude`, `timestamp`, `accuracy`, `exception`, `name`, `charging`, `battlevel`, `status`, `distance_from_home`, `Abfragezyklus`, `home_status`) VALUES ('$lat','$lng', '$tmstmp', '$acc', '$excpt', '$name', '$chrg', '$batt', '$stat', '$diff', '$minute', '$home')";
        mysql_query($query, $db) or die(mysql_error());
        echo $stat;
}

?>

Die Skriptausgabe im Meldungsfenster lässt sich durch Weglassen des parameters „true“ in

 $ssm = new Sosumi($apple_id, $apple_password, true); 

unterdrücken.

Danach die Variablen wie im angehängten Bild erstellen. Der Variable „Karte“ das Profil ~htmlbox zuweisen. Die Variable „Geräte“ erhält eine Assoziation auf die Devicenamen der Geräte die erfasst werden sollen und die jeweils, wie oben beschrieben ein eigenes Pollingskript brauchen. Der Variable „Gerät“ dann folgendes Aktionsskript zuordnen:


<?
// SQL Datenbank Zugriffsdaten
$MySQLHost="a.b.c.d";
$username="xxx";
$password="xxx";
//Sonst nur Variablen anpassen


// Hilfs-Integervariable mit Profil anlegen
if($IPS_SENDER == "WebFront" || $IPS_SENDER == "TimerEvent"){
   SetValue($IPS_VARIABLE, $IPS_VALUE);
   $name = GetValueFormatted(48458 /*[Anwesenheit
ew Sosumi\Variablen\Gerät]*/);
}

if(isset($IPS_VALUE)) {
 // NIX
	} else {
   	 if($IPS_SENDER == "RunScript") {
      	 $name = GetValueFormatted(48458 /*[Anwesenheit
ew Sosumi\Variablen\Gerät]*/);
       }
    else {
     SetValueString(52945 /*[Anwesenheit
ew Sosumi\Variablen\Karte]*/, "<center>Bitte Gerät auswählen!</center>");
    return;
     }
}

// Connect zur Datenbank
$link = mysql_connect($MySQLHost, $username, $password) or die(mysql_error());
mysql_select_db("locate_iphone") or die(mysql_error());
$select = "SELECT `latitude`, `longitude`, `timestamp`, `accuracy`, `exception`, `name`, `charging`, `battlevel`, `status`, `distance_from_home`, `Abfragezyklus`, `home_status` FROM iphone_table where (name = '".$name."') ORDER BY id DESC LIMIT 1";
$query = mysql_query($select);
$num_rows = mysql_num_rows($query);
$row = mysql_fetch_array($query);
// Connect zur Datenbank trennen
mysql_close($link);

if ($num_rows == 0) {
     SetValueString(52945 /*[Anwesenheit
ew Sosumi\Variablen\Karte]*/, "<center>Keine Daten vorhanden!</center>");
     return;
}

if ($row['charging'] == "NotCharging"){
	$quelle = "Akku";
	}
	else
	{
	$quelle = "Ladegerät";
	}
$devicename=$row['name'];
SetValueString(52945 /*[Anwesenheit
ew Sosumi\Variablen\Karte]*/, "<iframe src=\"user/iphone/map.php?lat=".$row['latitude']."&lng=".$row['longitude']."&devicename=".$devicename."&altitude=".$row['accuracy']."&date=".$row['timestamp']."\" border=\"0\" frameborder=\"0\" style=\"top:0pt; bottom:0pt; left:0pt; right:0pt; width:100%; height:400px;\"/></iframe>");
Setvaluestring (21138 /*[Anwesenheit
ew Sosumi\Variablen\Lezter Kontakt]*/, $row['timestamp']);
Setvaluefloat (16121 /*[Anwesenheit
ew Sosumi\Variablen\Genauigkeit]*/,round($row['accuracy']));
Setvaluestring (26532 /*[Anwesenheit
ew Sosumi\Variablen\Spannungsquelle]*/, $quelle);
Setvaluestring (48416 /*[Anwesenheit
ew Sosumi\Variablen\Akku]*/,$row['battlevel']);
Setvaluestring (10689 /*[Anwesenheit
ew Sosumi\Variablen\Entfernung Haus]*/,$row['distance_from_home']);
Setvaluestring (19926 /*[Anwesenheit
ew Sosumi\Variablen\Abfragezyklus]*/,$row['Abfragezyklus']);
Setvaluestring (51225 /*[Anwesenheit
ew Sosumi\Variablen\Zuhause]*/,$row['home_status']);

?>

Die VariablenIDs bitte anpassen. Dann noch links fürs Webfront auf die entsprechenden erstellen Variablen setzen. Das wars.

To do:

  • Datum und Zeit im timestamp trennen
  • Anzeige im WF wird nur nach Änderung des iDevices im WF aktualisiert -> Weiss noch nicht warum
  • Battlevel zeigt noch einen seltsamen Wert an

Muss jetzt auch mal ein großes DANKE loswerden.
habe das Skript heute Abend auch installiert. Funktioniert Problemlos :wink:
werde auch das ein oder andere nachrüsten (mal sehen was sich ergibt).
Aber so lange: Macht weiter so !:slight_smile:

Wie sieht denn nun der Stromverbrauch aus?

Und aktualisiert es schnell genug um eine Anwesenheitskontrolle zu ermöglichen?

Ich hab es nicht gemessen. Subjektiv ists ok für mich.

Du kannst die Position theoretisch jede Minute pollen. Apple ist super schnell, aber jede Minute kostet viel Power.

Aus meiner Sicht reicht es um festzustellen, wenn man weggeht, um dann z.B. bestimmte Verbraucher abzuschalten, Ankommen solltest Du lieber über das IPS-868 System lösen, das hat max 30s Verzögerung.

ich hab noch das 3GS. Musste das Polling auf 30 Minuten raufschrauben, damit der Akku noch einigermassen hält. Aber für mich kein Problem, da ich dies hauptsächlich gebrauche, um zB. Temperaturabsenkung zu realisieren, wenn wir in der Ferienwohnung sind und natürlich die Katzenfutterüberwachung anders zu kontrollieren

Hallo Leute,

ich hab´s ja schon mal angefragt, aber bisher noch nichts weiter erfahren können:

ist es irgendwie möglich auch mehrere iphone von verschiedenen Accounts auf einer Karte darzustellen?

Weiß jemand, wie das geht?

Im Sosumi können ja viele Devices angelegt werden und werden dann auf der Karte angezeigt. Geht das im IPS auch irgendwie?

Danke und Gruß
Dirk

Ich habe mal die Scripts aus Thread #73 installiert. Dabei ist mir folgendes aufgefallen:
Im folgenden Schnipsel


//Entfernung > 1km
    if($diff > 1.0) {             
    //nix tun
   }
     else
     {
        $home = "zuhause";
        $minute = 2;
        IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute); 
    }

// Entfernung > 10km
    if ($diff > 10.0) {
         $minute = 10;
        IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute); 
    }
    else //sonst (zwischen 1km und 10km immer alle 5 Minuten
    {
       $minute = 5;
       IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute); 
    }


wird der Timer bei <1km nicht sehr lange auf 2 Minuten gesetzt bleiben, da es von dem unteren Teil des Scripts gleich wieder auf 5 Minuten korrigiert wird.

Und noch was:
Wenn die Klasse Sosumi() bei jedem Polling wirklich für Akku Belastung sorgt, dann habe ich folgende Bedenken:
Das Script kann mit dem Code

$loc = $ssm->locate();

nur ein Gerät auswerten. Das zweite Gerät kann dann mit

$loc = $ssm->locate(1);

ausgewertet werden. Aber mit dem Code

$ssm = new Sosumi($apple_id, $apple_password, true);

werden immer alle Geräte von Apple übertragen. Wenn man also versucht eines davon bei näherer Entfernung schneller (z.B. alle 2 Minuten) abzufragen, dann werden auch die entfernten Geräte in gleicher Geschwindigkeit mit gepollt. Es geht also auch böse auf den Akku des zweiten Gerätes, wenn das erste Gerät (iPhone 4S) zu Hause ist, und das zweite Gerät iPhone 3GS unterwegs ist.
Je nach Reihenfolge der Auswertung kann dann auch der Timer wegen des entfernten Gerätes auf 10 Minuten gestellt werden, dann wird aber auch das Gerät zu Hause nicht mehr mit 2 Minuten gepollt.
In diesem Fall kann man wirklich nur jedem Gerät eine eigene Apple ID verpassen.

Stimmt. Denkfehler.

So müsste es gehen:


if ($diff > 10){
	$minute = 10;
	IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute);
}
	elseif ($diff > 5){
		$minute = 5;
		IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute);
}
	elseif ($diff > 1){
		$minute = 2;
		IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute);
} 	else {
		$minute = 1;
		IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute);
		$home = "zuhause";
}