Android mit IPS verbinden (Anrufe aufs Handy ansagen lassen/SMS vorlesen)

Hallo zusammen.

Da man als IPSler natürlich immer auf der suche nach neuen Möglichkeiten ist sich das Leben zu erleichtern bin ich für mein Handy auf Tasker gestossen.
Tasker ist eigentlich sowas wie IPS aber fürs Android.

Tasker kann auf alles mögliche im Handy reagieren(Anrufe, SMS, Geografische Position, Netzwerke, Programme usw) und auch verändern (Tastensperren, Dateien ver-/entschlüsseln, Einstellungen ändern, Programme sperren usw.).

Z.B. Werden mir SMS vorgelesen wenn ich mein BT Headset angeschlossen habe(praktisch beim Fahrrad fahren).
Zu Hause hab ich andere Lautstärken beim Klingeln als im Geschäft.
Wlan ist auch nur noch dann an wenn ein bekanntes Netz in der Nähe ist.
Ich lasse mir automatisch bestimmte PC-Verzeichnisse mit meinem Handy sycronisieren. D.H. ich hab immer alle wichtigen Dateien (Word/excel/pdf) dabei.

Aber nun zu IPS und Tasker.

Das man sich Anrufe aufs Festnetz ansagen lässt ist ja ein alter Hut für uns. Aber nun lasse ich mir auch sagen wer mich gerade auf dem Handy anruft wenn ich zuhause bin. Und auch SMS kann ich mir vorlesen/auf dem TV anzeigen lassen.
Oder IPS weiß wenn ich mit meinem Handy das Haus verlasse und ich kann ihm auch sagen wo ich gerade bin (z.B. wenn ich mit dem Rad unterwegs bin kann meine Frau immer nachschauen wo ich bin, falls ich mal verloren geh :wink:
Oder ich schalte einfach nur Lichter/Radio usw mit einem Widget auf dem Startbildschirm ein/aus.
So was brauche ich dafür?

Da wir mit einem HTTP_Post befehl arbeiten brauchen wir als erstes eine php datei im Webfront ordner. Nennen wir sie android.php.
In die Datei kommt dann z.B.

<?
switch ($b)
	{
	case "info":
   		WFC_SendPopup(18180 /*[WebFront Configurator]*/,$titel,$text);
	break;
	case "sms":
		 TTS_Speak(43784 /*[Diverse\Audio\Media Player TTS]*/,$sms,false);
	break;
	case "tel":
	   TTS_Speak(43784 /*[Diverse\Audio\Media Player TTS]*/,$nr,false);
	break;
	}
?>

jetzt kann man ja einfach in seinen Browser die Datei aufrufen mit IP-Adresse:82/android.php?b=tel&nr=0123456789 und IPS sollte einem die Nummer ansagen.

Dann brauchen wir noch Tasker aufm Android. Tasker kostet zwar ~4Pfund, man kann es aber erstmal 14tage testen. Dafür nicht im Market kaufen sonder von der Seite oben downloaden. Dort auf Direct-Purchase gehen und die 1.0.4b runterladen. Man braucht die Beta da es Probleme mit ä,ö,ü,ß mit der Http_post in der normalen Version gab.

Nun das Programm aufrufen und auf New klicken. Dann Event auswählen, dann auf Phone

und hier noch auch Phone Ringing.
Jetzt könnte man noch bestimmte Nummern angeben bei denen der Task ausgeführt werden soll(Nummern von Hand eingeben und mit / trennen oder einfach länger auf das Feld klicken und alle Nummern anklicken die man haben will) Aber wir lassen es Frei da wir ja auf alle Anrufe reagieren wollen.

Jetzt sind wir in dem Task edit und sagen was Tasker machen soll.

Als erstes klicken wir oben rechts auf new und geben dem Task einen Namen „IPS Telnr“ klicken dann auf das + unten links und wählen Net aus und nun noch HTTP Post.

Hier die eigene IP adresse eingeben mit dem port hier :82. Kann natürlich auch eine dyndns etc. sein.
als Path dient der Dateiname und in das Datafeld kommen die Variablen die übertragen werden sollen.
b=tel ist für den switch befehl
tel=%CNUM ist die Variable für die letzte Anrufnummer. Was man alles für Variablen hat kann man durch ankicken des gelben „Adressanhängers“ oben rechts rausfinden.

Jetzt nur noch auf done klicken und nun den Task ausprobieren indem ihr auf Test drückt und IPS sollte euch eine Nummer ansagen. Eventuell müsst Ihr euch erst einmal anrufen da Tasker %CNUM erst speichert wenn es einen Anruf mitbekommt.

Gruß Jannis

Oder IPS weiß wenn ich mit meinem Handy das Haus verlasse und ich kann ihm auch sagen wo ich gerade bin (z.B. wenn ich mit dem Rad unterwegs bin kann meine Frau immer nachschauen wo ich bin, falls ich mal verloren geh :wink:

Hallo Jannis,

genau das habe ich gerade gesucht!
Also die GPS Koordinaten über den http post übermitteln werde ich hinkriegen, aber wie bindest du diese wieder in eine Karte ein, damit Deine Frau dich kontrollieren kann? :stuck_out_tongue:

Danke und Gruß,
Andreas

sehr cool.

Toni

Ist wirklich eine geile Lösung!

Problem ist nur dass ich von aussen nicht an meinen IPS-Server ran komme. Bringt mir also nur daheim was…

OpenVPN ist dein Freund :slight_smile: Habe ich jetzt ganz gut mit Android am laufen.

Gruss
Bernd

Das klingt Interresant!

Ich arbeite im ausendienst und bin prizipiell zufaul zum Km aufschreiben, das könnte ich ja immer schön an IPS senden und dann auf der arbeit auswerten.
Damit wäre dann ja auch meine IPS-console auf dem rechner legetim :smiley:

Vieleicht dann nochmal ein post wo das komplette Skrip dranhängt mit dem man sich ortet.

Dann kommt aber das nächste Problem, dass GPS den Akku vom Smartphone recht schnell leer macht.
Ich mein jeden Tag laden ist ja Ok aber bis zum Abend sollte das handy halt schon halten :wink:

Hallo zusammen

Die GPSposition lasse ich mir ja von Tasker mit HTTP Post schicken. Das macht Tasker automatisch wenn ich das Geschäft verlasse dabei mein Headset an ist für Podcasts und die Batterie noch lange genug hält. Oder aber manuell wenn ich so mit dem Rad unterwegs bin.
Als Server hab ich meine Dyndnsadresse und natürlich den richtigen Port.
Als Path gibt man die PHP Datei an die im Webfront ordner anlegen muss. Bei mir android.php
Als Data hab ich
b=pos
pos=%LOC
genau=%LOCACC
fix=%LOCTMS
spd=%LOCSPD

Nun muss man natürlich die Daten in IPS integrieren das mach ich mit einem Script im Webfront ordner namens android.php mit

<?

switch ($b)
    {
	case "pos":
		setvalue(15368,$pos);	//Position
		setvalue(38915,$genau);	//genauigkeit
		setvalue(49505,$fix);	//Zeit des GPSfixes
               setvalue(47066,$spd);
				
    break;
    //weitere case 
    } 
	
?>

Ich schreibe mir also die Daten aus dem Handy in vier Variablen.

Nun muss man die Position umrechnen und als Bild ausgeben das mache ich mit einem Script in IPS

$pos= getvalue(15368 /*[LOG\POS\Pos]*/);

echo $lon = ltrim(stristr($pos, ','),",");
echo $lat= stristr($pos, ',', true);
setvalue(46082 /*[Log\POS\Bild]*/,'<img src="http://ojw.dev.openstreetmap.org/StaticMap/?mode=API&show=1&lat='.$lat.'&lon='.$lon.'.&z=15&w=300&h=300&layer=cycle&mlat0='.$lat.'&mlon0='.$lon.'" width="300" height="300" border="0"></img>');

Die Variable Bild 46082 ist ein String mit HTMLbox und sollte dann meine Position anzeigen.
Zusätzlich lass ich auch noch die Genauigkeit, wann der Fix war und meine Geschwindigleit anzeigen.
Wollte ich eigentlich auch noch in das Bild Reinschreiben aber dazu bin ich noch nicht gekommen.

Das war jetzt nur ein statisches Bild. wenn man sich aber eine kleine Karte anzeigen will auf der man auch Scrollen und Zomen kann dann kann man das mit diesem Script machen.

$pos= getvalue(15368 /*[Testcenter\POS\Pos]*/);

echo $lon = ltrim(stristr($pos, ','),",");
echo $lat= stristr($pos, ',', true);


$test='<html><body>
  <div id="mapdiv"></div>
  <title>Test</title>

  <script src="http://www.openlayers.org/api/OpenLayers.js"></script>
  <script>
    map = new OpenLayers.Map("mapdiv");
    map.addLayer(new OpenLayers.Layer.OSM());

    var lonLat = new OpenLayers.LonLat('.$lon.",".$lat.')
          .transform(
            new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
            map.getProjectionObject() // to Spherical Mercator Projection
          );

    var zoom=16;

    var marker = new OpenLayers.Layer.Markers( "Markers" );
    map.addLayer(marker);
      var size = new OpenLayers.Size(21,25);
var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);

    
	 var icon = new OpenLayers.Icon("http://www.openlayers.org/dev/img/marker.png", size, offset);




    marker.addMarker(new OpenLayers.Marker(lonLat,icon));

    map.setCenter (lonLat, zoom);


  </script>


</body></html>';

$Pfad = IPS_GetKernelDir()."web\pos.html";
  $Attribut = "w";
     $open = fopen($Pfad,$Attribut);          //Öffnen
   fwrite($open,$test);                   //schreiben
   fclose($open);                           //schließen

Das Script erstellt eine Datei pos.html die man dann im Webfront als externe Seite und z.B. in einem Container anzeigen kann.

Gruß Jannis

P.S. Das alles ist einfach nur aus dem Internet rauskopiert und einigermassen umgebaut das es funktioniert. Wenn jamand was besser(z.B. die letzten 5 Positionen auch noch anzeigen) oder anders machen würde immer her damit.

Hallo!

Interessant ist auch die Moeglichkeit auf emails (die z.B. aus IPS kommen) reagieren zu koennen. Dafuer muss allerdings das mail Programm K9 auf dem Androiden installiert sein. Bei Pushmail dauerts nur ein paar Sekunden bis sich auf dem Telefon ein Popup oeffnet, die IP-Cam angesurft wird, oder sonst was passiert.
Auf der Todo Liste des Herstellers steht auch C2DM. Damit wirds noch eleganter.

Gruss, Michael

Moin …

ich hab das ganze jetzt auch am Start … funktioniert so weit auch ganz gut, nur gibt es das Problem, dass ich das ein oder andere mal keine Netzwerkverbindung habe und der HTTP-Post fehl schlägt. So wie ich das verstanden habe, sendet er den Post aber nur ein einziges mal bei Profilerkennung.

Ich habe mir schon einen Wolf gesucht … gibt es die Möglichkeit, dass er die Post’s zyklisch wiederholt, wenn ein bestimmtes Profil aktiv ist?

Alternativ wäre auch, eine Mail zu senden, die er dann bei Netzverfügbarkeit, wegschickt. Aber das kann Tasker aus welchen Gründen auch immer leider nicht …

Viele Grüße …

Hallo Squeeezer

Mit was für einem Profil/Context arbeitest Du?

Es gibt bei den Profilen welche, die nur einmal ausgeführt werden z. B. eine bestimmt Uhrzeit(genau dort gibt es die möglichkeit ein repeat einzubauen) oder eine empfangene SMS und es gibt Profile die aktiv sind solange man z.B. USB angeschlossen hat.
Wenn man jetzt zwei davon verbindet hat man das was wir wollen. Es wird nur wiederholt ausgeführt wenn wir es wollen.

Ich steuere das Profil einmal damit das ich ein bestimmtes Bluetoothheadset angeschlosen habe. Jetzt würde der Task aber wie Du richtig geschrieben hast nur einmal ausgeführt.
Wenn Du jetzt in der Profil ansicht auf den Bluetooth Connected Context klickst und dort dann add auswählst kannst Du Time auswählen.
Hier könntest Du Tasker dazu bringen es nur Tagsüber zwischen 12-16 auszuführen, aber wir wollen das es alle 4 Minuten ausgeführt wird.
Also wählst Du nur Repeat aus und trägst 4 Minuten aus.

Jetzt wir der Task nur ausgeführt wenn ich das Headset an habe (Bluetooth) und durch das Repeat wird der Task alle 4 Minuten ausgeführt.

Hört sich kompliziert an aber wenn man den Dreh erstmal raus hat gehts.

Gruß Jannis

P.S.: bin gerade dabei die letzten Positionen auch noch in der Karte anzuzeigen. Dauert aber noch ein bisschen.

Hey Jannis,

super, danke erst mal für die Antwort … vom Sinn her hab ich’s kapiert, kommt mir nur etwas von Hinten durch die Brust durchs Auge vor :smiley: … Ich habe nicht beim Profil gesucht, sondern bei den Tasks ständig nach einer Repeat-Option gesucht …

Ich werde es nachher gleich mal testen und dir dann … hoffentlich … Erfolg melden :wink:

Viele liebe Grüße …

Geht wie verrückt … das einzige, was jetzt (natürlich) nicht mehr geht, sind die Exit-Tasks, da ja sonst alle 2 Minuten das Profil aktiv und dann gleich wieder inaktiv wird. Ich hatte mir das so vorgestellt, dass - wenn ein Profil aktiv ist, der zugehörige Task zyklisch ausgeführt wird, bis das Profil verlassen wird …

So gehts aber auch :wink: … Musste die Skripte in IPS etwas abändern …

Danke nochmal an Jannis für die gute Vorlage und ich bin gespannt auf die Karte :wink:

hi Jannis,

Ich habe jetzt mal Zeit zum Probieren gefunden.
ich bekomme es irgendwie nicht hin.

als datei habe ich ne PHP mit namen android und folgendem Inhalt.


<?
switch ($funktion)
     {
     case "switch":
             setvalue ($id,$state);
     break;
     }
?>

Im tasker alles eingegeben wie beschrieben

Server:port
Path
android.php

Bei Data

funktion=switch
id=12345
state=true

Hat jemand ne Idee was ich falsch mache?

Danke schon mal

MFG

Peter

So eben gelöst


<?
switch ($funktion)
     {
     case "switch":
             settype ($id,"integer");
             setvalue ($id,$state);
     break;
     }
?>

Hallo,

ich versuche auch gerade mal mein Glück.

Ich habe die android.php mit diesem Inhal erstellt

<?
switch ($b)
    {
    case "info":
           WFC_SendPopup(18180 /*[WebFront Configurator]*/,$titel,$text);
    break;
    case "sms":
         TTS_Speak(43784 /*[Diverse\Audio\Media Player TTS]*/,$sms,false);
    break;
    case "tel":
       TTS_Speak(43784 /*[Diverse\Audio\Media Player TTS]*/,$nr,false);
    break;
    }
?> 

und die Instanzen angepasst.

Aber beim Aufruf der seite mit : IP-Adresse:82/android.php?b=tel&nr=0123456789

erhalte ich nur die im Anhang zu sehende Meldung :frowning:

Was mache ich falsch ?

tasker.jpg

Hallo habe es jetzt hingekommen,
ich musste noch $_GET einbauen.

Gesendet von meinem GT-I9100 mit Tapatalk

Hat sich erledigt, habe die Anleitung nicht richtig gelesen :o

Hallo Jannis,

mit der Positionsanzeige habe ich noch Probleme.

Ich bekomme im WF keine Karte angezeigt.

Im Anhang habe ich mal ein paar Screenshots gemacht. Evtl. kannst Du ja helfen, oder jemand anders.

Hallo

Um meinen Position anzuzeigen, lasse ich mir von Tasker alle 2 Minuten meine aktuelle Position, die fixzeit, die genauigkeit und die aktuelle Geschwindigkeit übermitteln.
Dann lass ich mir daraus in IPS eine Webseite mit Openstreetmap(das Skript ist von denen) erstellen.
Diese Seite binde ich im Webfront ein.
Hier mal mein Skript zum Erzeugen der Webseite mit der Aktuellen und den letzten 20 Positionen.

<?

$pos= getvalue(15368 /*[Diverse\POS\Pos]*/);
$fix=getvalue(49505 /*[Diverse\POS\Fix zeit]*/);
$genau=getvalue(38915 /*[Diverse\POS\Genauigkeit]*/);
$speed=getvalue(47066 /*[Diverse\POS\Speed]*/);
//echo "Pos: $pos
";
$pos_count = 20;     //Anzahl der Wegpunkte
$positions_array = GetValue(27260 /*[Diverse\POS\Positionsarray]*/); // ARRAY
$fixzeit_array = GetValue(22219 /*[Diverse\POS\Fixarray]*/); // ARRAY

//Array auf vorhandensein prüfen / initialisieren
if ($positions_array == "")
{
   $pos_array = array_fill(0, $pos_count, $pos);  // Wenn nicht vorhanden mit 0 Initialisieren
   echo "INI
";
}else{
   $pos_array = wddx_deserialize($positions_array);  // Array aus String gewinnen
}
if ($fixzeit_array == "")
{
   $fix_array = array_fill(0, $pos_count, $fix);  // Wenn nicht vorhanden mit 0 Initialisieren
   echo "INI
";
}else{
   $fix_array = wddx_deserialize($fixzeit_array);  // Array aus String gewinnen
}

array_unshift($pos_array, $pos); // Vorn neuen Wert anfügen


if (count($pos_array) > $pos_count)  // Wenn länger als soll
   unset($pos_array[$pos_count+1]);  // Letzen Wert entfernen
echo date("H:i",getvalue(49505 /*[Diverse\POS\Fix zeit]*/));
//print_r($pos_array);
SetValue(27260 /*[Diverse\POS\Positionsarray]*/, wddx_serialize_value($pos_array) );
array_unshift($fix_array, $fix); // Vorn neuen Wert anfügen
if (count($fix_array) > $pos_count)  // Wenn länger als soll
   unset($fix_array[$pos_count+1]);  // Letzen Wert entfernen
//print_r($pos_array);
SetValue(22219 /*[Diverse\POS\Fixarray]*/, wddx_serialize_value($fix_array) );
$vectors="";
for ($i=0;$i<count($pos_array);$i++)
	{
   $lon[$i] = ltrim(stristr($pos_array[$i], ','),",");
 
	 $lat[$i]= stristr($pos_array[$i], ',', true);
   $vectors.='pointList.push(new OpenLayers.Geometry.Point('.$lon[$i].','.$lat[$i].').transform(proj1,proj2));';
   
	}







$test='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de-de">
<head>
<title>Map | Testanwendung</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-script-type" content="text/javascript" />
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="content-language" content="de" />
<meta name="author" content="Thomas Heiles" />
<link rel="stylesheet" type="text/css" href="css/map.css"></link>
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="css/ie_map.css"></link>
<![endif]-->
<script type="text/javascript" src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript" src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
<script type="text/javascript" src="css/tom.js"></script>

<script type="text/javascript">
//<![CDATA[

var map;
var layer_mapnik;
var layer_tah;
var layer_markers;
var layer_line;

function drawmap() {
    // Popup und Popuptext mit evtl. Grafik
    var popuptext="<font color=\"black\"><b>Aktuelle<br>Position</b><p><img src=\"css/test.jpg\" width=\"180\" height=\"113\"></p></font>";

    OpenLayers.Lang.setCode("de");

    // Position und Zoomstufe der Karte
    var lon = '.$lon[0].';
    var lat = '.$lat[0].';
    var zoom = 16;
   	var proj1=new OpenLayers.Projection("EPSG:4326");
	var proj2=new OpenLayers.Projection("EPSG:900913");
	var style = { strokeColor:"#ff0000", strokeOpacity: 1,strokeWidth: 4};
    map = new OpenLayers.Map("map", {
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG:4326"),
        controls: [
            new OpenLayers.Control.MouseDefaults(),
           new OpenLayers.Control.PanZoomBar()],
        maxExtent:
            new OpenLayers.Bounds(-20037508.34,-20037508.34,
                                    20037508.34, 20037508.34),
        numZoomLevels: 18,
        maxResolution: 156543,
        units: "meters"
    });           // new OpenLayers.Control.LayerSwitcher(),

    layer_mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
    layer_markers = new OpenLayers.Layer.Markers("Address", { projection: new OpenLayers.Projection("EPSG:4326"),
    	                                          visibility: true, displayInLayerSwitcher: false });
	layer_line = new OpenLayers.Layer.Vector("Striche");
    map.addLayers([layer_mapnik, layer_markers, layer_line]);
var pointList = [];
'.$vectors.'
  jumpTo(lon, lat, zoom);

var lineFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(pointList), null, style);
layer_line.addFeatures([lineFeature]);
  
    // Position des Markers
  	 var popuptext_mitte="<font color=\"black\"><b>'.date("H:i",$fix_array[10]).'</b></font>";
     var popuptext_letzterfix="<font color=\"black\"><b>'.date("H:i",getvalue(49505 /*[Diverse\POS\Fix zeit]*/)).'</b></font>";



  

    // Position des Markers
	  addMarker(layer_markers,'.$lon[10].','.$lat[10].', popuptext_mitte);
    addMarker(layer_markers,lon, lat, popuptext_letzterfix);
  








}

//]]>
    </script>

  </head>
  <body onload="drawmap();">

  <div id="header">
   </div>
  <div id="map">
  </div>
   
<div id="osm"><a href="http://www.openstreetmap.org">OpenStreetMap</a>
und <a href="http://www.openstreetmap.org/copyright">Mitwirkende</a>,
   <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.de">CC-BY-SA</a>
 </div>

</body>
</html>
';

$Pfad = IPS_GetKernelDir()."web\pos.html";
  $Attribut = "w";
     $open = fopen($Pfad,$Attribut);          //Öffnen
   fwrite($open,$test);                   //schreiben
   fclose($open);                           //schließen
setvalue(46082 /*[Diverse\POS\Img aktuelle Position]*/,'<img src="http://ojw.dev.openstreetmap.org/StaticMap/?mode=API&show=1&lat='.$lat[0].'&lon='.$lon[0].'.&z=15&w=300&h=300&layer=cycle&mlat0='.$lat[0].'&mlon0='.$lon[0].'" width="300" height="300" border="0"></img>');


?>

Gruß Jannis

Hallo Jannis,

habe gerade mal dein Script ausprobiert, haut aber bei mir irgendwie nicht hin.

Es wird zwar 'ne HTML seite erstellt aber die ist leer.

Wie bringt man Tasker denn dazu, wenn’s mal läuft, die Position in Intervallen zu senden ? das habe ich noch nicht verstanden.

Hallo Leute,

habe vor einiger Zeit schon mal ein wenig mit dem Tasker experimentiert. Seit einigen Updates, bekomme ich aber die Übergabe der Variblen nicht mehr hin.

(War nicht gans so schlimm da ja die Android App kam.)

Seit Kurzem nenne ich ein Tablet s von Sony mein eigen, und Tasker wurde wieder Ausgegraben.

Neben einem Skript das meine TV mit Stromversorgt möchte ich mir jetzt anzeigen lassen wieviel meine PV-Anlage Aktuell bringt.

Das Skript mit der Stromversorgung ist kein Prob (Ist automatisiert mit der Fernbedienungs app )
Problematich ist für mich das auslesen von Daten aus IPS. Hat jemand das schonmal mit Tasker gemacht?

mfg Peter