Sosumi - Find my iPhone

Hallo simba,

was sich wupperi bei der ersten Abfrage gedacht hat weiß ich nicht, bei mir steht da das setzen der Variable Anwesend/Abwesend :wink:

Bzgl. deiner Aussage das

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

alle iDevices in einem AppleAccount abfrägt muss ich Dir ein wenig widersprechen. Der Befehl baut die Verbindung zum iCloud/MobilMe-Account auf.

Anschließend

$loc = $ssm->locate(); 

Frägt alle iDevices in einem Account ab.

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

frägt das erste iDevice ab.

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

entsprechend das Zweite und so weiter.

Leicht zu überprüfen wenn man

print_r($loc);

ausgeben läßt.

Denkfehler, zwei Posts weiter oben beschrieben :frowning:

  1. Wenn ich print_r($loc); nach $loc = $ssm->locate(0); durchführe, dann erhalte ich nur ein Handy.
  2. Wenn ich print_r($loc); nach $loc = $ssm->locate(); durchführe, dann erhalte ich ebenfalls nur ein Handy (das gleiche wie unter 1). Bist Du sicher, dass dabei alle Handys gepollt werden?
  3. Wenn ich print_r($ssm); nach $ssm = new Sosumi($apple_id, $apple_password) ausführe, dann erhalte ich bereits alle details über meine 4 Handys in einem Array.

Du sagst mit Befehl 3) wird nur eine Liste aller Handys ausgelesen, werden die angezeigten Details dann nur gecached? Und mit Befehl 1) oder 2) dann nochmal explizit gepollt?

Im Sourcecode von Sosumi wird bereit beim Erstellen (mit new) eine Anfrage an Apple gestellt, alle Devices unter der UserID abzufragen. Dort wird nicht nach einer Device Nummer unterschieden.
Das passiert auch nicht bei der locate(lfd. Nr) Funktion. Der gleiche Aufruf findet statt. Alle gelieferten Ergebnisse werden der Reihe nach in ein Array eingetragen und der Eintrag mit der gewünschten Nummer zurückgemeldet.
Das führt zu keinem Problem bei nur einem Gerät. Bei mehreren aber schon.
Wenn ein iPhone und ein iPad angemeldet sind, beim ersten Orten nur das iPhone an ist, und beim zweiten Orten nur das iPad, dann wird jeweils nur ein Objekt mit lfd. Nr. 0 zurückgeliefert. Einmal bezeiht es sich auf das iPhone, einmal auf das iPad. Die Device Nummer ist also ungeeignet, um unterschiedliche Geräte unterscheiden zu können.
Außerdem meldet Apple manchmal ein altes Ortungsergebnis zurück, was dann natürlich nicht aktuell ist. Hier muss die Ortungszeit noch abgefragt werden und nach der Anfragezeit liegen.

Ich habe die Probleme wie folgt gelöst: Ein Programm listet alle gemeldeten iPhones, iPads, … auf und zeigt die zu jedem Gerät gehörende, eindeutige FindMyiPhoneID an.
Diese ID kann dann mit copy&paste in den Aufruf zu locate(ID) übernommen werden. Die locate-Funktion habe ich umgebaut. Sie prüft jeweils auf die ID ab statt auf die laufende Nummer, wie bisher. Außerdem prüft sie das Ortungsdatum ab, und liefert nur neue Ortungsdaten zurück, sowie eine Kennung, ob das Orten geklappt hat oder nicht.

Die zurückgelieferten Datenelemente werden in einer übersichtlichen Struktur visualisiert, mit einer Karte, die die jeweils letzte, erfolgreiche Ortung mit Datum, Uhrzeit und Genauigkeit anzeigt.

Siehe Screenshots anbei und die Kommentare im Sourcecode. Danke an all diejenigen, auf deren Arbeit diese Erweiterungen beruhen.

Kleine Änderungen an maps.php wurden ebenfalls benötigt, daher habe ich maps.php noch mit ins ZIP-File gepackt.

Viel Spass!

Sosumi Updated.zip (6.56 KB)

Habt Ihr das auch, dass auf einmal Eure Position in Paris angezeigt wird? Bei mir zwei unterschiedliche iPhones nacheinander gestern und heute. Nach reboot wars wieder ok :confused:

auch gestern. War zuhause und laut Anzeige 5200 Km entfernt.

Ebenfalls wenn ich in unserer Stammkneipe sitze, zeigt es mir einen anderen Standort an, und zwar immer und immer den gleichen (ca. 1 km davon entfernt). Das ist zwar noch praktisch, da kann man überziehen, ohne dass es … merkt. :rolleyes:

Habe gestern mal auf die Version 2.5 upgedatet.
Seitdem funktioniert das Script nicht mehr und zeigt folgende Fehlermeldung:

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

Fatal error: Uncaught exception ‚Exception‘ with message ‚Error parsing json string‘ in C:\IP-Symcon\scripts\class_Sosumi.ips.php:137
Stack trace:
#0 C:\IP-Symcon\scripts\class_Sosumi.ips.php(35): Sosumi->updateDevices()
#1 C:\IP-Symcon\scripts\49855.ips.php(14): Sosumi->__construct(‚email@t-onl…‘, ‚passwort‘, false)
#2 {main}
thrown in C:\IP-Symcon\scripts\class_Sosumi.ips.php on line 137

Hat das irgendwer auch noch?

Danke und Gruß
Dirk

erledigt.

sorry

Klasse Arbeit, aber wie steuerst du die Abfragen, wann wieder nach einem Gerät gesucht werden? oder lässt du nach allen Geräten automatisch alle X Minuten laufen?

Nachtrag,
wenn ich das Script von SiriusBlack verwende, werden die Geräte richtig abgefragt und auch richtig in der Map angezeigt, aber die Entfernung wird falsch gerechnet (sollten rund 35km sein, sind aber 4350 oder so). Auch wenn ich die func_distance.ips.php von wgreipl verwende.

Wenn ich das originale Script von wgreipl verwende, wird die Entfernung richtig berechnet. Habe aber in Summe 6 Geräte, welche aber nicht immer alle online sind, deshalb das Script von SiriusBlack.

Gut, dann also eigene Teilantwort,

ich habe das suchen Script so geändert, dass jetzt auch die entfernungen stimmen:

<?
 
include "class.sosumi.php";
include("func_distance.ips.php");
 
// Parameter fuer Sonnenauf- und untergangsbestimmung
#$SONNE_LONG = XX.773143550416;      // Longitude (geografische Länge)
#$SONNE_LATI = XX.326289168169;   // Latitude (geografische Breite)
 
 
$loc_lat_home = XX.773143550416;                      // Latitude Zuhause
$loc_lon_home = XX.326289168169;                      // Longitude Zuhause
 
 
 
#$SONNE_ZEITZONE = "Europe/Vienna"; // Berlin
 
// Parameter für iphone Notifikation und -Suche
$IPHONE_USER = "xxxxxxxxxxx";
$IPHONE_PASS = "xxxxxxxxxxx";
$IPHONE_ORTUNG = 35873 /*[Scripts\iPhone\Ortung]*/  ; /* String, Profil Uhrzeit " Uhr" setzen */
$IPHONES = array( "QVBTOjAwMTUzZTJjNDQzNTRjZGVlZmY3M2Y5YTVkMGEzYTNlNDUzMjlmM2E~" //iPhone andy
                        =>    array(
                        "name" => 16747 ,
                        "dist" => 17262,
                        "lati" => 12151,
                        "long" => 11606,
                        "zeit" => 41946,
                        "map"  => 12330,
                        "rad"  => 32295,
                        "hause" => 40431,  //*[Scripts\iPhone\iPhone 4S\Zuhause]*/
 
                    ),
                        "QVBTOmUxNTY2ZjA3ZTMxYmIwMmRiMDhlM2M0NmU2ZWRjNTNiMjE0ZTYxMTA~" //iPad
                        => array(
                        "name" => 48924  ,
                        "dist" => 50241 ,
                        "lati" => 59826 ,
                        "long" => 31117 ,
                        "zeit" => 45570 ,
                        "map"  => 52386 ,
                         "rad"  => 17032 ,
                         "hause" => 54702,  //*[Scripts\iPhone\iPad\Zuhause]*/
                             ),
 
                        "QVBTOmFlN2Y2NDI1M2UxNDg2ZWM2NjgyOWEwYjNkZDdjMjUwNGUyNTNlOTM~" //iPod
                        => array(
                        "name" => 39812,  //*[Scripts\iPhone\iPod\Name]*/
                        "dist" => 11507  /*[Scripts\iPhone\iPod\Entfernung]*/ ,
                        "lati" => 41860  /*[Scripts\iPhone\iPod\Latitude]*/ ,
                        "long" => 57057  /*[Scripts\iPhone\iPod\Longitude]*/ ,
                        "zeit" => 14576  /*[Scripts\iPhone\iPod\Timestamp]*/ ,
                        "map"  => 48828  /*[Scripts\iPhone\iPod\Maps]*/ ,
                         "rad"  => 24076  /*[Scripts\iPhone\iPod\Genauigkeit]*/,
                         "hause" => 50519  /*[Scripts\iPhone\iPod\Zuhause]*/,
                        )
                        );
 
 
 
// Merken, wann gestartet
SetValueString($IPHONE_ORTUNG, date("d.m.Y H:i:s", time()));
 
// Ortung aller registrierten Devices starten
$ssm = new Sosumi($IPHONE_USER, $IPHONE_PASS);
 
foreach($IPHONES as $index => $ids) {
    // Merken, wohin die Ergebnisse gespeichert werden sollen
    $IDname = $ids["name"];
    $IDdist = $ids["dist"];
    $IDlati = $ids["lati"];
    $IDlong = $ids["long"];
    $IDzeit = $ids["zeit"];
    $IDmap  = $ids["map"];
    $IDradius = $ids["rad"];
    $IDhause = $ids["hause"];
    // Namen des Geräts merken für Webanzeige
    $devicename = IPS_GetName($IDname);
 
    // Max. 15 Sekunden warten, bis neue Ortung eintrifft
    // Suche nach Apple ID z.B. "QVBdddddddddfjsdgfjskdgfkdfksdfkdisfiduyfidsyfisdfyidsfydis~"
    $loc = $ssm->locate($index, 15);
 
    // Falls gefunden
    if ($loc !== false) {
        // Abstand bestimmen
        $dist = distance($loc_lat_home, $loc_lon_home, $loc['latitude'], $loc['longitude']);
#        $dist = distance($SONNE_LONG, $SONNE_LATI, $loc['longitude'], $loc['latitude']); //original
        SetValue($IDdist, $dist);
        // Ortungsergebnisse merken
        $lat = $loc['latitude'];
        $lon = $loc['longitude'];
        $acc = round($loc['accuracy']);
        $tim = date("d.m.Y H:i:s", $loc['timestamp']);
        $nam = UTF8_Decode($loc['name']);
        SetValue($IDlati, $lat);
        SetValue($IDlong, $lon);
        SetValue($IDradius, $acc);
        SetValue($IDzeit, $tim);
        SetValue($IDname, $nam);
        IPS_SetName($IDzeit, "Erreicht um");
 
        // Karte anzeigen
        $maps = 'user/iPhone/map.php';
        $para = "lat=$lat&lng=$lon&devicename=$nam&altitude=$acc&date=$tim";
        $rahmen = 'border="0" frameborder="0"';
        $rahmen .= ' style="top:0pt; bottom:0pt; left:0pt; right:0pt; width:100%; height:440px;"';
        SetValueString($IDmap, "<iframe src=\"$maps?$para\" $rahmen></iframe>");
        $success = true;
 
        // Anwesenheit setzten
    #    echo $dist;
    #    echo "
";
           if($dist > 1.0) {             // Wenn Entfernung größer 1.0km dann abwesend
                 SetValue($IDhause, 1);
                        }
                else
                    {
                SetValue($IDhause, 0);
                    }
        }
    else {
        IPS_SetName($IDzeit, "Nicht erreicht um");
        SetValue($IDzeit,  date("d.m.Y H:i:s", time()));
        $success = false;
        }
 
    // Variablen entsprechend anzeigen
    IPS_SetHidden($IDdist,   !$success);
    IPS_SetHidden($IDlati,   !$success);
    IPS_SetHidden($IDlong,   !$success);
    IPS_SetHidden($IDradius, !$success);
 
    }
?>

Feine Arbeit. Hat doch geklappt mit den Entfernungen :wink:

Ich habe mal die Zugangsdaten aus dem Skript auskommentiert, hoffe nicht das es deine richtigen waren und die Suchmaschine schneller war als ich. :rolleyes:

Falls doch würde ich diese sofort ändern da jeder Abonnement dieser Nachricht deine Zugangsdaten zur Cloud jetzt hätte.

Hallo Werner,

Danke dafür!
Die Koordinaten hab ich noch gelöscht…:confused:

Prima, dann klappt es ja jetzt!
Mögliche Fehlerursache: Ich habe bei meinem Skript die Längen- und Breitengrade in der umgekehrten Reihenfolge wie wgreipl für die Berechnung genommen. Das hat sich aus dem Aufsatz für die Abstandsbestimmung nach Kugelkoordinaten so ergeben.
Solltest du die originale distance-Funktion verwendet haben, kann natürlich kein richtiges Ergebnis rauskommen.
Die Distance Funktion hat auf meinem letzten Flug nach Indien stets korrekte Ergebnisse angezeigt. In-flight-internet sei Dank! Bis 7000km sollte es also klappen!

Hi

was müsste man in deinen Script ändern das mehrere Geräte angezeigt werden ??

So ich habe nun mit dem Service auch einmal probiert.

In Nutzung zwei iPhone 4 und 4s so integriert über die modifizierte Sosumi Abfrage.

Ich habe es die Abfrage so integriert, das nach Haustüröffnung die Geräte zweimal im Abstand von 5 Minuten abgefragt werden. Dann sollte man weit genug weg sein oder eben zuhause sein.

Ansonsten wird zusätzlich jede Stunde noch einmal abgefragt.

Nach ein paar Tagen Beobachtung würde ich nun meiner besseren Hälfte eine Szene machen denn obwohl sie nachts neben mir schläft ist Sie nach dem Tracking nicht im Hause.

Wie sind Eure Erfahrungen? Ich habe das Gefühl das sich 4 und 4s unterschiedlich Verhalten.

Ich steh grad am Schlauch, kannst du mir bitte dein Timerscript schicken, mitdem du das Script beim Türöffnen triggerst

Schon mal nachgesehen, ob sie wirklich neben dir liegt? :smiley:

das mit der Türe ist eine super Idee! und sollte merklich den Akku schonen :rolleyes:
Einfache einen Tür-/Fensterkontakt als Trigger dran und gut is…

für alle die es noch nicht mitbekommen haben: Bei ELV gibt es mittlerweile das FS20 Tür-/Fensterkontakt Interface FS20TFI für ca. 20 Euro. Mit dem können die FHT Tür-/Fensterkontakte ohne FHT verwendet werden.

Schöne Grüße
Stephan

das mit dem direktem triggern ist mir schon klar.
ich möcht nur, dass das Skript 5min UND 10min später nochmal läuft

tür auf => erste abfrage Bin es wirklich ich? :smiley:
5min später => wo bin ich wirklich
weitere 5min später => schon weg, oder zuhause?

Schau dir diese Stelle in der Doku mal an:Ereignisverwaltung: IP-Symcon :: Automatisierungssoftware

musst ja eigentlich nur ein Script erstellen was bei Variablenänderung „Türkontakt“ ausgeführt wird. Mit dem auszuführenden Script erstellst du ein Ereignis das in 5 Min. die Suche anstößt und ein zweites Ereignis das in 10 Min die Suche anstößt. Ein drittes Ereignis würde ich einfach kontinuierlich jede Stunde die Suche durchführen lassen.

Schöne Grüße
Stephan

Liebe Leute die Klasse und das Projekt hier sind einfach richtig spitze! Ich habe das Script Eingebunden und alles lief sofort und komfortabel! In einem zweiten Schritt etwas damit gespielt und ein paar Dinge verändert. Das Problem bei so tollen Projekten ist folgendes, man hat Lust auf mehr…! Um genau zu sein hatte ich folgende Idee - die Latitude und Longtitude vom iPhone jeweils zu loggen. Diese Werte kann man ja dann später jeweils pro Tag mit einem Archivhandler abfragen. Nun habe ich zuerst hier im Forum und dann bei Freund google nach einer Lösung gesucht wo ich die geloggten Daten in Form von http-request hinsenden kann und wobei diese als Route auf einer Mappe angezeigt werden. Bei yao scheint es eine entsprechend ‚API‘ zu geben mit Http Parametern.

Da ich bis anhin immer vorwiegend die Google-Api’s verwende und mir sicher bin, dass etwas in der Art auch damit möglich sein sollte aber kein entsprechendes Beispiel finden konnte geht hier die Frage an euch, ob jemand so was schon realisiert hat oder weiss wie man dies mit google realisieren könnte.