Auto/Boot/etc Alarm Tracker Integration

Moin Zusammen,

ich hab mich mal ein bisserl mit den Track Möglichkeit in Verbindung mit IPS beschäftigt.
Als separate Hardware habe ich mir einen TK5000 besorgt, weil der relativ gut „frei“ konfigurierbar ist.

Der TK5000 sendet entsprechend konfiguriert alle x Sekunden und/oder bei Bewegung über gprs auf Port xxxx
$ID, $datetime, $longitude, $latitude, $speed, $heading, $altitude, $satellite, $event

Anbei ein dirty hack zur Integration, der mich allerdings nicht glücklich macht. Einerseits läuft er auf einen timeout (das könnte ich noch abfangen) aber andererseits glaube ich nicht wirklich die Möglichkeiten unseres schönen IPS richtig ausgenutzt zu haben.

Wie seht Ihr das?

Skript php Server:


<?php
error_reporting (E_ALL);

/* Das Skript wartet auf hereinkommende Verbindungsanforderungen. */
set_time_limit (0);

/* Die implizite Ausgabe wird eingeschaltet, so dass man sieht,
 * was gesendet wurde. */
ob_implicit_flush ();

$address = 'x.x.x.x';
$port = xxxx;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . "
";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($sock)) . "
";
}

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($sock)) . "
";
}

do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($sock)) . "
";
        break;
    }
     do {
        if (false === ($buf = socket_read ($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($msgsock)) . "
";
            break 2;
        }
        if (!$buf = trim ($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
 		  if (GetValueBoolean(41317 /*[Programme\TK5000\TK5000 Server run]*/) == FALSE) {
            socket_close ($msgsock);
            break 2;
        }
		  if ($buf == 'shutdown') {
            socket_close ($msgsock);
            break 2;
        }

        SetValueString(27853 /*[Programme\TK5000\TK5000 Message]*/, $buf);
        list($ID, $datetime, $longitude, $latitude, $speed, $heading, $altitude, $satellite, $event) = explode(",", $buf);

        SetValueString(36516 /*[Programme\TK5000\TK5000 Message\DateTime]*/, $datetime);
        SetValueFloat(31146 /*[Programme\TK5000\TK5000 Message\longitude]*/, $longitude);
        SetValueFloat(27486 /*[Programme\TK5000\TK5000 Message\latitude]*/, $latitude);
        SetValueFloat(57666 /*[Programme\TK5000\TK5000 Message\speed]*/, $speed);
        SetValueFloat(18785 /*[Programme\TK5000\TK5000 Message\heading]*/, $heading);
        SetValueFloat(17682 /*[Programme\TK5000\TK5000 Message\altitude]*/, $altitude);
        SetValueInteger(12574 /*[Programme\TK5000\TK5000 Message\satellite]*/, $satellite);
        SetValueInteger(42138 /*[Programme\TK5000\TK5000 Message\event]*/, $event);

    } while (true);
    socket_close ($msgsock);
} while (true);

socket_close ($sock);
?>

Interessantes Thema, ich habe mir auch schon oft Gedanken gemacht wie ich mein Tracker ins IPS bekomme.

Aktuell nutze ich den opensource GPS Server von traccar.com. Dieser kann mit so ziemlich allen Trackern auf dem Markt umgehen, kennt Geofences, Tracker-Gruppen etc. und pumpt alles brav in eine DB.

Ich denke, schlauer wärs vllt. diese DB anzuzapfen und die Daten aufzubereiten. Warum das Rad neu erfinden?
Aktuell habe ich ebenfalls den TK5000 im Einsatz; und als Test einen China OBD-Tracker für 20€.

Mir schwebt da eher folgendes Szenario vor: zB. die gefahrenen Km, welche ich im Zeitraum eines Kalendereintrags (Kundenbesuch) zurückgelegt habe, inkl. Fahrtdauer. Eine art RealTime Fahrtenbuch, für Spesenabrechnung etc. . Oder eben über IPS alarmieren wenn ein Device den Geofence verlässt.

Gruß, Schorschie

Danke für den Tipp Schorschie,:smiley:
traccar mal auf einem Pi2 neben IPS installiert, sieht nicht schlecht aus,
Ne API gibt es auch.
Mal sehen was damit so geht, auch ohne Tracker, nur mit IOS probiert…

Frohe Weihnacht

Jo,… gibt ne IOS und Android App, die als Tracker fungiert. Leider zieht die IOS App sehr viel Akku, weil die Ortung immer an ist. Aber zum Testen ideal. :wink:

Ich muss für den Tipp noch mal DANKE sagen.
Ich bekomme so local auf dem gleichen Pi mit symcon und traccar einen lokalen Server, und habe die Daten nicht irgendwo liegen.
geofenceEnter und geofenceExit werkelt schon mal life, mal sehen was da noch machbar ist.

Dadurch das traccar die events per Web senden kann, habe ich in IPS Webhook benutzt um an die Daten zu kommen :
Beispiel aus der IPS Doku : IPS_LogMessage(„WebHook RAW“, file_get_contents(„php://input“));

$hooks =(json_decode($hooks, true));

zum testen dann :

echo $hooks[‚event‘][‚type‘];
echo $hooks[‚position‘][‚latitude‘];
echo $hooks[‚device‘][‚name‘];

Und ja, der Akku vom iPhone wird „gesaugt“, aber zum testen ist mir das egal…
Traccar ist schon mal für mich „nicht so schlecht :D“.

frohe (Rest)Weihnacht…

Ich tue mir etwas schwer.
traccar-Server auf dem Pi installiert. Wie komme ich auf eine Verwaltungsoberfläche? Muss ich Java auf dem Pi installiert haben?

Jetzt habe ich es geschafft.
Server mit dem java-Befehl gestartet.
Client im Handy installiert und DynDns oder entsprechend gestartet. Mit Port 5055 oder Portweiterleitung gekoppelt.
Verwaltungsoberfläche im Browser über Port 8082 oder externe Portweiterleitung aufgerufen.
Und schon gehts.

Und hier mein erstes Testskript, um Life Daten ins IPS zu bekommen :

<?
IPS_LogMessage("WebHook RAW", file_get_contents("php://input"));

date_default_timezone_set("Europe/Berlin");
$timestamp = time();
$datum = date("d.m.Y",$timestamp);
$uhrzeit = date("H:i",$timestamp);

$ModulID = IPS_GetParent($_IPS['SELF']);
$hooks = (file_get_contents("php://input"));
$hooks =(json_decode($hooks, true));
// print_r($hooks); 
$VAR_Dummy = $hooks['device']['name'];
$Parent = IPS_GetParent($_IPS['SELF']);
$id = CreateDummyInstance($ModulID,$VAR_Dummy);
$ParentModul= IPS_GetObject($Parent);

$ModulID = IPS_GetParent($_IPS['SELF']);
$ModulID = IPS_GetInstanceIDByName($VAR_Dummy , $ModulID );

$event=$hooks['event']['type'];
$id = CreateVariableByName($ModulID, 'event', 3);
SetValue($id, $event);

if ( ($event == 'geofenceEnter') or ($event == 'geofenceExit') )
  {
	$geofence  =$hooks['geofence']['name'];
	$latitude=$hooks['position']['latitude'];
	$longitude =$hooks['position']['longitude'];
	$altitude =$hooks['position']['altitude'];
	$address =$hooks['position']['address'];

	$id = CreateVariableByName($ModulID, $geofence, 0);
	
	$id = CreateVariableByName($ModulID, 'latitude', 2);
	SetValue($id, $latitude);
	$id = CreateVariableByName($ModulID, 'longitude', 2);
	SetValue($id, $longitude);
	$id = CreateVariableByName($ModulID, 'altitude', 2);
	SetValue($id, $altitude);
	$id = CreateVariableByName($ModulID, 'address', 3);
	SetValue($id, $address);

	$geofence_ID  = IPS_GetObjectIDByName($geofence, $ModulID );
	
	if ($event == 'geofenceEnter') 
	 {	SetValue ($geofence_ID ,1 );
	    $id = CreateVariableByName($ModulID, $geofence.' Zeit Enter', 3);
	 	SetValue ($id ,($datum." - ".$uhrzeit." Uhr" ));
	
	 }
	if ($event == 'geofenceExit') 
	 {	SetValue ($geofence_ID ,0 );
	 	$id = CreateVariableByName($ModulID, $geofence.' Zeit Exit', 3);
		SetValue ($id ,($datum." - ".$uhrzeit." Uhr"));
	 }
  } 
  else
  {
	$id = CreateVariableByName($ModulID, 'Zeit-'.$event, 3);
	SetValue ($id ,($datum." - ".$uhrzeit." Uhr" ));
  }

if ( ($event == 'deviceMoving') or ($event == 'deviceStopped') ){
	//$geofence  =$hooks['geofence']['name'];
	$latitude=$hooks['position']['latitude'];
	$longitude =$hooks['position']['longitude'];
	$altitude =$hooks['position']['altitude'];
	$address =$hooks['position']['address'];
	$speed =$hooks['position']['speed'];

	$id = CreateVariableByName($ModulID, 'latitude', 2);
	SetValue($id, $latitude);
	$id = CreateVariableByName($ModulID, 'longitude', 2);
	SetValue($id, $longitude);
	$id = CreateVariableByName($ModulID, 'altitude', 2);
	SetValue($id, $altitude);
	$id = CreateVariableByName($ModulID, 'address', 3);
	SetValue($id, $address);
	$id = CreateVariableByName($ModulID, 'speed', 2);
	SetValue($id, $speed);
	
}

function CreateVariableByName($id, $name, $type)
{
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false) {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
   }
   return $vid;
}

function CreateDummyInstance($id, $name)
{
   $vid = @IPS_GetInstanceIDByName($name, $id);
   if($vid===false) {
      $vid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
	  IPS_ApplyChanges($vid);
   }
   return $vid;
}

?>

Die traccar.xml und die Zeilen erweitert :

<entry key=‚event.forward.enable‘>true</entry>
<entry key=‚event.forward.url‘>http://192.168.1.11:3777/hook/traccar</entry>
<entry key=‚event.forward.header‘>

Achtung IP an Euer IPS anpassen !!

In IPS dann de Webhook anlegen :
/hook/traccar der auf das Skript verweisst.

In traccar dann noch die Notifications per WEB anschalten,

Hoffe, habe jetzt nichts vergessen…

Danke fürs Script. Ich werde es mal ausprobieren. Leider wird dies noch ein paar Tage dauernd. Aber dann!

Ich steh etwas auf dem Schlauch und hoffe, ihr könnt mir weiterhelfen! :slight_smile:
Ich habe Traccar installiert und meinen TK5000 eingerichtet. Die Daten kommen in Traccar an, soweit alles fein.
Allerdings bekomme ich die Daten irgendwie nicht in IPS. :frowning:

Was genau muss ich denn bei dem Header angeben? Brauche ich den überhaupt? Aktuell sieht meine traccar.xml so aus:


<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE properties SYSTEM 'http://java.sun.com/dtd/properties.dtd'>

<properties>

    <!--

    This is the main configuration file. All your configuration parameters should be placed in this file.

    Default configuration parameters are located in the "default.xml" file. You should not modify it to avoid issues
    with upgrading to a new version. Parameters in the main config file override values in the default file. Do not
    remove "config.default" parameter from this file unless you know what you are doing.

    For list of available parameters see following page: https://www.traccar.org/configuration-file/

    -->

    <entry key="config.default">./conf/default.xml</entry>

    <entry key='database.driver'>org.h2.Driver</entry>
    <entry key='database.url'>jdbc:h2:./data/database</entry>
    <entry key='database.user'>sa</entry>
    <entry key='database.password'></entry>
    <entry key='filter.invalid'>true</entry>
    <entry key='filter.zero'>true</entry>
    <entry key='forward.enable'>true</entry>
    <entry key='forward.url'>https://192.168.178.29:82/hook/traccar</entry>
    <entry key='event.forward.enable'>true</entry>
    <entry key='event.forward.url'>https://192.168.178.29:82/hook/traccar</entry>
    <entry key='event.forward.header'>true</entry>

</properties>


Notifications per Web sind aktiviert (siehe Screenshot). Webhook in IPS ist eingerichtet. Wenn ich den per Browser aufrufe, wird das Script gestartet. Klappt also auch. Bloß von traccar nach IPS happert’s irgendwie. Jemand eine Idee, wo der Fehler liegt? Vielen Dank schon mal! :slight_smile:

Hm,
sehe auf den ersten Blick keinen Fehler.

Habe es aber nur per IOS probiert, nen TK5000 habe ich nicht.

Hallo

Das Script funktioniert für die Events perfekt…
Wobei diese Zeile meinen Traccar-Server lahm legt und die Events nicht mehr aktualisert:

Also einfach weggelassen, funktioniert trotzdem…

Hat es unterdessen jemand fertig gebracht, die Live-Positionsdaten der Tracker von Traccar ins Symcon zu bekommen? So könnte bei einer Push-Meldung elegant via Position Tracking von paresy nachgeschaut werden, wo das Fahrzeug gerade so steht…