Sosumi - Find my iPhone

@wgreipl

Werner, poste doch mal Deine Skripte, sieht ja mal wieder nicht schlecht aus bei Dir :smiley:

:slight_smile:

Danke.

Für die Entfernung habe ich eine Funktion gefunden.

Mehr heute Abend.

Yeeessss - kanns nicht erwarten.

Ich auch !

Ja das kann ich bestätigen, ich schätze den zusätzliche Verbrauch auf ca. 20%

Hallo Freunde der GPS-Datenverarbeitung.

Hier die versprochene Function zur Berechnung der Entfernung um einen bestimmten geokordierten Ort.

Habe die Function nicht selbst erstellt sondern im Netz gefunden, also keine Garantie für 100%ige Funktion, aber es erfüllt den Zweck für das ich sie nutze.

<?
/*
Aa => Latitude Home , Ba => Longitude Home , Ca=> Latitude Standort , Da=> Longitude Standort
*/
//echo distance(48.178527, 11.189966, 48.178527, 11.189966);
 
function distance($Aa, $Ba, $Ca, $Da){
    $input = array($Aa, $Ba, $Ca, $Da);
    foreach($input as $name){
        if (@ereg("[[:alpha:]]",$name)){
            echo "You cannot enter letters into this function<br>
";
            die;
        }
        if(@ereg("\.",$name)){
            $dot = ".";
            $pos = strpos($name, $dot);
            //echo $pos." <br>
";
            if($pos > 3){
                echo "The input cannot exceed more than 3 digits left of the decimal<br>
";
                die;
            }
        }
        if($name > 365){
            echo "The input cannot exceed 365 degrees <BR>
";
            die;
        }
    }
    $A = $Aa/57.29577951;
    $B = $Ba/57.29577951;
      $C = $Ca/57.29577951;
    $D = $Da/57.29577951;
    //convert all to radians: degree/57.29577951
   if ($A == $C && $B == $D ){
     $dist = 0;
   }
   else if ( (sin($A)* sin($C)+ cos($A)* cos($C)* cos($B-$D)) > 1){
   $dist = 3963.1* acos(1);// solved a prob I ran into.  I haven't fullyanalyzed it yet
   }
   else{
           $dist = 3963.1* acos(sin($A)*sin($C)+ cos($A)* cos($C)*
 cos($B-$D));
    }
return (round($dist*1.609,2));
}
 
?>

Mein Skript zur Anzeige im Webfront muß ich noch um die Installationsroutine erweitern bevor ich es übergebe. Aber eigentlich ist es ja nicht besonders aufwendig.

Viel Spaß

Habe nun mal das „Einsteiger-Script“ genommen und siehe da, schon hagelts Fehlermeldungen

Notice:  Undefined offset: 2 in C:\IP-Symcon\scripts\class.sosumi.php on line 50

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\class.sosumi.php on line 50

Notice:  Undefined offset: 2 in C:\IP-Symcon\scripts\class.sosumi.php on line 50

Nachfolgend Zeile 48-50

$tag=$akt2[2];

//print "$jahr";

Hallo Jürg,

welches ist denn dein Einsteigerskript?

Hi du must auch die class.sosumi.php in den C:\IP-Symcon\scripts packen :slight_smile:

Will nicht drängeln…

[DRÜCK AN]

heute noch?

[/DRÜCK OFF]

:smiley:

Hi Jungs,

auf die Schnelle.

aus beiliegendem Archiv die Dateien

[ul]
[li]class_Sosumi.ips.php (zwingend da etliche Anpassungen durchgeführt wurden)[/li][li]func_distance.ips.php[/li][li]IPSInstaller.ips.php (nur wenn noch nicht vorhanden, Danke Brownson)[/li][/ul]in den Skriptordner von IPS kopieren.

Den Ordner iPhone aus dem Archiv in den webfront/user-Ordner.

Folgendes Skript unter einer Dummy-Instance (Name egal) erstellen und folgende Anpassung machen.

Eure Heimatkoordinaten (Zeile 8 und 9)

$loc_lat_home = 48.000000000;                      // Latitude Zuhause
$loc_lon_home = 11.0000000000;                      // Longitude Zuhause

Die Apple-Account-Daten

$ssm = new Sosumi('Apple-ID', 'Apple-Passwort', $debug);   // Apple-Account, Account-Passwort

Anschließend 1x starten.

<?
    // Usage:
    // $ssm = new Sosumi('username', 'password');
    // $location_info = $ssm->locate(<device number>);
    // $ssm->sendMessage('Your Message', true, <device number>, 'Important Message');
    //
$loc_lat_home = 48.178579276867;                      // Latitude Zuhause
$loc_lon_home = 11.189966808125;                      // Longitude Zuhause
$debug = false;                                       // echo-Meldungen zu debugging aktivieren
 
include("func_distance.ips.php");           // Function zur Berechnung
include("class_Sosumi.ips.php");           // MobilMe-API
include("IPSInstaller.ips.php");
$ssm = new Sosumi('Apple-ID', 'Passwort', $debug);   // Apple-Account, Account-Passwort
$loc = $ssm->locate(0, 5);
//$ssm->sendMessage('Testnachricht', false, 0, 'Testbetreff');
// Ab hier theoretisch nichts mehr ändern
$parent_id = IPS_GetParent($IPS_SELF);
IPS_SetPosition($IPS_SELF, 999);
IPS_SetHidden($IPS_SELF, true);
$devicename = UTF8_Decode($loc['name']);
 
if($debug) {
 echo $loc['latitude'];
 echo "
";
 echo $loc['longitude'];
 echo "
";
 echo ($loc['timestamp']);
 echo "
";
 echo $loc['accuracy'];
 echo "
";
 echo date("H:i:s");
 echo "
";
 echo $loc['exception'];
 echo "
";
 echo UTF8_Decode($loc['name']);
 echo "
";
 echo $loc['charging'];
 echo "
";
 echo $loc['battlevel'];
 echo "
";
 echo $loc['status'];
 echo "
";
}
$Profil_Name = array('Zuhause', 'Abwesend');
$Profil_Color = array(0 => 0xaaaaaa, 1 => 0xaaaaaa);
CreateProfile_Associations(".SosumiZuhause", $Profil_Name, "", $Profil_Color);
SetValue(CreateVariable("Maps", 3, $parent_id, 30, "~HTMLBox"), "<iframe src=\"user/iphone/map.php?lat=".$loc['latitude']."&lng=".$loc['longitude']."&devicename=".$devicename."&altitude=".$loc['accuracy']."&date=".$loc['timestamp']."\" border=\"0\" frameborder=\"0\" style=\"top:0pt; bottom:0pt; left:0pt; right:0pt; width:100%; height:400px;\"/></iframe>");
//SetValueString(36289 /*[Test\iPhone Suche\iPhone Suche\Maps]*/ , "<iframe src=\"user/iphone/map.php?lat=".$loc['latitude']."&lng=".$loc['longitude']."&devicename=".$devicename."&altitude=".$loc['accuracy']."&date=".$loc['timestamp']."\" border=\"0\" frameborder=\"0\" style=\"top:0pt; bottom:0pt; left:0pt; right:0pt; width:100%; height:400px;\"/></iframe>");
$diff = distance($loc_lat_home, $loc_lon_home, $loc['latitude'], $loc['longitude']);
//$diff = 5.1;
if($debug) echo $diff;
SetValue(CreateVariable("Entfernung", 2, $parent_id, 24, ""), $diff);
//SetValue(55107 /*[Test\iPhone Suche\iPhone Suche\Entfernung]*/, $diff);
 
if($diff > 1.0) {             // Wenn Entfernung größer 1.0km dann abwesend
 SetValue(CreateVariable("Zuhause", 1, $parent_id, 10, ".SosumiZuhause"), 1);
 //SetValue(56926 /*[Test\iPhone Suche\iPhone Suche\Zuhause]*/, false);
}
else
{
 SetValue(CreateVariable("Zuhause", 1, $parent_id, 10, ".SosumiZuhause"), 0);
// SetValue(56926 /*[Test\iPhone Suche\iPhone Suche\Zuhause]*/, true);
}
 
SetValue(CreateVariable("Latitude", 2, $parent_id, 110, ""), $loc['latitude']);
SetValue(CreateVariable("Longitude", 2, $parent_id, 120, ""), $loc['longitude']);
SetValue(CreateVariable("Timestamp", 3, $parent_id, 130, "~String"), $loc['timestamp']);
SetValue(CreateVariable("Meldung", 3, $parent_id, 25, "~String"), $loc['exception']);
$timer = CreateTimer_CyclicByMinutes("Timer for iPhone", $IPS_SELF, 15);
if($debug) echo $timer;
// Wenn Entfernung > Value dann Zyklus der Positionsmeldung auf 30 Minuten
if ($diff > 10.0) {
 $minute = 15;
   IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute); //Alle 30 Minuten
}
else
{
   $minute = 2;
   IPS_SetEventCyclic($timer, 0, 0, 0, 2, 2 , $minute); //Alle 1 Minuten
}
SetValue(CreateVariable("Abfragezyklus", 1, $parent_id, 26, ""), $minute);
?>

Legt die erforderliche Struktur an.

Beim ersten Asuführen kommen ein paar Warning seitens PHP die aber beim weiteren Verlauf nicht mehr auftreten.

Hoffe das war es :rolleyes:

Sosumi.rar (10.1 KB)

Werner ist der Grösste … :smiley:

Na erst einmal testen :wink:

Und woher weißt Du wie groß ich bin :slight_smile:

Verdammt.

Jetzt wisst Ihr wo ich wohne :smiley:

ha, ich sitze auch auf 11,1° :smiley:

aber 6° weiter oben
:D:D:D

HI erstmal 10000x Dank für deine Mühe.

Ich benötige nur die Entfernungsfunktion von diesem Script, leider reichen meine PHP Kenntnisse nicht aus, um mir diese Funktion rauszunehmen :frowning:

Kann mir da jemand hilfen :frowning:

Werner, ich habe einen Verbesserungsvorschlag, insbesondere wenn Du mehrere Geräte trackst. Die Idee stammt nicht von mir, sondern ist so beim utrackme realisiert. Ehre gebührt also einem anderen User:

Dort werden die Daten für jedes Device in eine mysql tabelle geschrieben.
Über


// Hilfs-Integervariable mit Profil anlegen
if($IPS_SENDER == "WebFront")
{
   SetValue($IPS_VARIABLE, $IPS_VALUE);
   $name = GetValueFormatted(57209 /*[Anwesenheit\utrackme\Standortbestimmung\Geräte]*/);
}

kann im WF eine Variable (Assoziiert auf die Gerätenamen) mit den Device Names gesetzt werden. Das Skript holt sich dann die Daten aus der DB und stellt alles schön auf einer Seite dar.

Das macht besonders Sinn, wenn man google maps nutzt, um die Position anzuzeigen. Alternative wäre dein Skript je Device laufen zu lassen und einen Tabpane zu setzen, ist aber nicht ganz so schön :loveips:

Nimm die func_distance.ips.php, lege sie in das Skriptverzeichnis, include sie in deinem Skript.

Aufruf ist

$diff = distance($loc_lat_home, $loc_lon_home, $loc['latitude'], $loc['longitude']);

wobei

$loc_lat_home = Deine Zuhause-Latitude
$loc_lon_home = Deine Zuhause-Longitude

und die anderen beiden Parameter werden ja von Sosumi geliefert.

und $diff steht dann deine Entfernung zwischen deiner Homebase und deinem iPhone.

Du musst die func_distance.ips.php ins Skript Verzeichnis kopieren.
In Deinem eigenen Skript dann mit


include("func_distance.ips.php");

inkludieren.

Dann steht die Funktion in form von:


$entfernung = distance(LAT1, LON1, LAT2, LON2);
echo $entfernung;

zur Verfügung.

wupperi,

mach ich hier auch noch. War nur ein schneller Entwurf zum Testen ob ich mit der Akkulebenszeit was anfangen kann.

Sollte alles nach meinen Wünschen laufen wird weiterentwickelt.

Meinte ja auch auf die Schnelle :wink: