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