Hallo zusammen
ich bin mal wieder(dank dieses Forums ) auf eine Erweiterung für meine Haussteuerung gestossen und zwar auf den OBD-Stecker(mit GPS- und GSM/GPRS-modul) von www.munic.io um auch PKW-Daten in IP-Symcon darzustellen. Musste ich gleich mal ausprobieren da ich sowas im Geschäft eh schon länger vorhatte. Das ganze kostet ca $149 und beinhaltet den Stecker, ein USB-OBD Kabel(das ich aber noch nicht gebraucht habe) und eine, für 3 Jahre freigeschaltete, Sim-Daten-Karte für anscheinend ganz Europa um die Daten des Fahrzeuges an munic.io zu senden.
Das ist auch schon eine negative Seite des Produktes. Die Daten können nicht direkt an IP-Symcon geschickt werden, sonder werden vom Stecker an Munic.io gesendet und dann erst weitergeleitet.
Was sendet der Stecker alles:
- Fahrzeug gestartet
- Fahrzeug bewegt ohne Zündung an
- während der Fahrt alle paar Minuten die aktuelle GPS Position,GPS Geschwindigkeit,Gps Richtung
- bei starker Beschleunigung, Starker bremsung, Richtungswechsel: die Geschwindigkeit und die Beschleunigungswerte
- am Anfang und Ende einer Fahrt den Batteriestand in V, die gesamten gefahrenen KM einmal vom GPS einmal vom Fahrzeug seit der Stecker eingesteck wurde, der Tankstand (aus dem ich aber noch nicht schlau geworden bin)
- Fehler des Autos sollen auch gesendet werden, aber auser Wischwasser leer hatte ich noch keinen Fehler im Auto und den sendet er schonmal nicht
- bei einem Unfall sollen auch Daten gesendet werden, aber auch da fehlt mir zum Glück die Erfahrung
- wenn der Stecker 24h nichts gesendet hat schickt er ein „Lebenszeichen“
- Daten werden innerhalb von ein paar Minuten (1-5) in Ip-Symcon empfangen
- es wird immer angegeben wann die Daten im Fahrzeug gesammelt wurden
Die Ersteinrichtung war ganz leicht, einfach den Stecker in die OBD Buchse des Fahrzeuges stecken und kurz darauf kann man auf dem Testportal seine Daten anschauen.
Um die Daten dann in IP-Symcon zu bekommen und auszuwerten wurde es schon schwieriger aber auch das hab ich mit meinen PHP Copy&Paste/und-dann-noch-irgendwie-anpassen Fähigkeiten geschafft.
Auf deren Homepage gibt es die Möglichkeit einen Webhook einzurichten. Dafür eine PHP-Datei im Webfront Verzeichnis anlegen und das hier hineinschreiben.
<?php
$postdata = $HTTP_RAW_POST_DATA;
Setvalue(12345,$postdata);
?>
Das gibt einfach die Daten die per Webhook geschickt werden an die Variable 12345 weiter.
Die Datei(z.B. munic.php) muss von aussen erreichbar sein und diese Url (z.B. http://meineadresse:port/munic.php) muss man Munic unter Settings/Get data on my server angeben.
In IP-Symcon eine Variable anlegen, die ID (hier 12345) in der oben genannten Datei ändern.
Jetzt ein Script erstellen das auf die Variablenaktualiesierung der Variable 12345 reagiert.
<?
$wtag = array("So","Mo","Di","Mi","Do","Fr","Sa");
$json = getvaluestring(12345);
$fahrzeugdaten=json_decode($json);
//print_r(($fahrzeugdaten)); //zum anzeigen aller empfangen Daten
for ($i=0;$i<count($fahrzeugdaten);$i++) //da auch mehrer Datenpakete bei einer Sendung enthalten sein können alle nacheinander abarbeiten
{
$payload = $fahrzeugdaten[$i]->payload;
foreach ($payload as $key=>$val) //erstmal die Grunddaten auslesen die jedesmal mitgeschickt werden
{
if (is_string($key))
{
//print_r($val);
switch ($key)
{
case "asset" : //wenn man mehere Stecker im Einsatz hat kann man hier die Daten auseinander halten
if($val=="xxxxxxxxxxxxxxxx")
{
echo "Pkw";
$idges=23456;
$idbat=34567;
$idkmgesamt=xxxxxx;
$idkmfahrt=xxxxxx;
$idpos=xxxxxx;
$idzuend=xxxxxx;
$typ="pkw";
}
elseif($val=="yyyyyyyyyyyyyyy")
{
echo "bus";
$idges=xxxxxx;
$idbat=xxxxxx;
$idkmgesamt=xxxxxx;
$idkmfahrt=xxxxxx;
$idpos=xxxxxx;
$idzuend=xxxxxx;
$typ="Bus";
}
echo "
";
break;
case "recorded_at_ms" : //Zeit wenn die Daten aufgezeichnet wurden
$zeit=$wtag[date("w",strtotime($val))].date(" H:i",strtotime($val)); //Einfachere Darstellung der Zeit
echo "Gesendet: ".$zeit."
";
break;
case "loc" : // GPS Position
$pos = $val[1].",".$val[0];
SetValueString($idpos,$pos);
echo "Pos ".$pos."
";
//IPS_RunScriptEx(98765/*[Zentrale\Notify\Notify versenden Ja]*/ , Array("app" => "Auto" , "event" => $typ."pos", "text" => $zeit."#".$pos ));
break;
case "fields" : //Auslesen der einzelen Felder, es werden nicht immer alle gesendet
foreach ($val as $keyfields=>$valfields)
{
if (is_string($keyfields))
{
switch ($keyfields)
{
case "MDI_OBD_FUEL" : //Tankvariable noch keine wirkliche Ahnung was das soll
echo "Fuel: ";
echo "Tank ".basetoint($valfields->b64_value);
echo "
";
break;
case "GPS_SPEED" : //Geschwindigkeit
$geschwindigkeit=basetoint($valfields->b64_value)/1000*1.852; // umrechnung in km/h
echo "Geschwindigkeit: ".$geschwindigkeit."
";
SetValueFloat($idges,$geschwindigkeit);
break;
case "BEHAVE_ID" :
$behave=basetoint($valfields->b64_value);
switch ($behave)
{
case 10 :
$grund="Stark gebremst";
break;
case 11 :
$grund="Stark beschleunigt";
break;
}
echo $grund."
";
break;
case "BEHAVE_GPS_SPEED_BEGIN" :
$anfangsges=basetoint($valfields->b64_value)/1000*1.852; // umrechnung in km/h
break;
case "BEHAVE_GPS_SPEED_PEAK" :
$spitzenges=basetoint($valfields->b64_value)/1000*1.852; // umrechnung in km/h
break;
case "BEHAVE_GPS_SPEED_END" :
$endges=basetoint($valfields->b64_value)/1000*1.852; // umrechnung in km/h
break;
case "BEHAVE_ELAPSED" :
$dauer=basetoint($valfields->b64_value)/1000; // // umrechnung muss ich noch schauen ob es stimmt
echo $dauer."s
";
break;
case "MDI_EXT_BATT_VOLTAGE" : //Batteriestand
$bat=(basetoint($valfields->b64_value))/1000;
echo "Batterie: ".$bat."V
";
SetValueFloat($idbat,$bat);
break;
case "ODO_FULL_METER" :
echo "kilometerilometer GPS: ".(basetoint($valfields->b64_value))."
";
break;
case "MDI_OBD_MILEAGE" : //Gefahrene KM
$km=(basetoint($valfields->b64_value));
echo "Gesamtkilometerilometer OBD: ".$km."
";
$alterstand=GetvalueInteger($idkmgesamt);
SetValueInteger($idkmgesamt,$km);
SetValueInteger($idkmfahrt,$km-$alterstand);
break;
case "MDI_RECORD_REASON" :
$reason=base64_decode($valfields->b64_value);
switch ($reason[0])
{
case 0 :
$grund="Zündung";
if ($reason[2] == 0)
{
$grund="Zündung aus";
SetValueBoolean($idzuend,false);
}
if ($reason[2] == 1)
{
$grund="Zündung an";
SetValueBoolean($idzuend,true);
}
break;
case 1:
if ($reason == "1:0;1;201")
$grund="Keine Bewegung";
if ($reason == "1:0;1:204")
$grund="Keine Zündung";
break;
case 5 :
if ($reason[2] == 0)
$grund="Reise beendet";
if ($reason[2] == 1)
$grund="Reise begonnen";
break;
default :
$grund="Unbekannt".$reason;
break;
}
echo "Grund: ".$grund."
";
//IPS_RunScriptEx(98765/*[Zentrale\Notify\Notify versenden Ja]*/ , Array("app" => "Auto" , "event" => $typ."info", "text" => $zeit."#".$grund ));
break;
}
}
}
break;
}
}
}
}
function basetoint($base)
{
$i= 0;
$keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
do {
$enc[$i] = strpos($keyStr, substr($base, $i, 1));
$i++;
} while ($i < strlen($base));
return (($enc[1]<<20)|($enc[2]<<14)|($enc[3]<<8)|($enc[4]<<2)|($enc[5]>>4));
}
?>
Dann braucht man noch diese Variablen je Stecker(im Beispiel sind es Zwei Stecker) einmal:
$idges für aktuelle Geschwindigkeit float
$idbat für die Batterie float
$idkmgesamt Gesamtkilometer integer
$idkmfahrt Kilometer pro Fahrt integer
$idpos Aktuelle Position string
$idzuend Zündung an/aus bool
Die Ids im Script ändern und die Assetnummer des Steckers anpassen.
Oder das Script so abändern wie man möchte das IP-Symcon auf die einzelnen Daten reagiert.
Die Auswertung der mit Base64 „verschlüsselten“ Daten hat mich einiges an Zeit gekostet.
Manches kann PHP direkt mit base64_decode darstellen, aber bei vielen Daten musste ich die function basetoint ausknobeln. Wahrscheinlich gibts irgendwo schon eine einfache function dafür, aber die hab ich noch nicht gefunden. Was mir bei der function noch fehlt ist die Umrechnung von den negativen base64 Zahlen. Bei manchen Zahlen hab ich schon die richtige Vorgehensweise gefunden aber die passt nicht überall. Wenn ich mal wieder Zeit habe knobel ich weiter.
Wenn man die Daten loggen will sollte man bedenken das die geloggte Zeit nicht mit der tatsächlichen Zeit wann die Daten erstellt wurden übereinstimmt und das nicht der gesamte Weg aufgezeichnet wird sondern nur alle paar Minuten Daten gespeichert/gesendet werden.
In den Wochen seit ich das jetzt im Einsatz habe gab es eigentlich keine nennenswerten Probleme/Aussetzer.
Der Stecker konnte im Audi A4 ohne Veränderung dauerhaft eingebaut werden, beim Opel Vivaro musste ich die Buchse ausbauen damit der Stecker „unsichtbar“ hinter der Abdeckung verschwindet.
Jetzt hoffe ich das ich nichts vergessen habe und freue mich auf Fragen und/oder Verbesserungen.
Gruß Jannis