Autoüberwachung mit OBD und Munic

Hallo zusammen

ich bin mal wieder(dank dieses Forums :loveips:) 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

Servus Jannis

nette Idee, wollte das schon lange mal machen.

Ich hab da aber noch einen anderen Lösungsweg im Kopf:
China ELM327 Bluetooth Adapter -> altes Android Handy -> Torque App -> dazu gibts eine dokumentierte API -> IPS

Vorteil wäre gewesen das man nicht zwingend eine GSM Verbindung braucht, da die App die Daten mit Timestamp zwischenspeichert und erst bei vorhandensein einer Internetverbindung (WLAN in der heimischen Garage) die Daten entweder an deren Server oder aber auch eine CSV Datei schreibt.

Soweit alles Theorie, umgesetzt hab ichs noch nicht und werde aus Zeitgründen wohl auch nie dazu kommen. :frowning:

viel Glück mit deiner Lösung
bb

Hallo Jannis,

gibt es schon was neues zur Kopplung? Hab das Teil jetzt auch im Einsatz. Das einzige was bei mir wirklich in IPSymcon ankommt, sind die Koordinaten. Ich logge gerade mal die einzelnen Webhooks mit. Mal sehen ob man das irgendwie aufdröseln kann.

Hallo Jannis,

wie geil ist das denn :0) das würde mich ja auch reizen.
Man kann damit also auch ein Fahrtenbuch mit Verbrauch erstellen ?!

Kannst vielleicht mal Screenshots machen wie du dir das gebastelt hast fürs Webfront. Geil wäre ja auch die einbindung einer google maps karte wo du gerade bist bzw. dein Auto ;0)

Zu dem Preis von USD 149 kommt noch zoll und so drauf oder ? Wo kam die ware her ?

VG

Andreas

Hallo Andreas,

meinst Du sowas?

Jap :0D

Coole sache. hast also auch alles hinbekommen … respekt !!! Und bist zufrieden

naja,

wie in #3 schon angemerkt. Positionsdaten und aktuelle Geschwindigkeit kommen gut an. Warte eigentlich noch auf Jannis, ob er da schon weiter gekommen ist.

Was mich etwas stört ist die Webfreigabe der PHP nach Außen… Wer schon einen Webserver freigibt dem ist das natürlich egal. Viel einfacher mit dem encoding und ohne PHP Freigabe wird’s mit der API. Die ist schon lange versprochen mit coming soon:-) Kann bei verschiedenster SW verschieden lange dauern wie man weiß…

In china gibts auch sowas ;0) … und das ohne Übermittlung an nen Server so weit ich das erkennen kann

http://www.dx.com/p/heacent-908-quad-band-obd-gps-gsm-gprs-car-positioning-anti-theft-alarm-tracker-223929

Hallo :0)

sagt mal wo habt ihr das Teil bestellt ???
Ich habe bei munic.io nen Konto angelegt … keine Antwort :0(

VG

Andreas

Nachdem du das Konto anlegst kannst du dich ja einloggen und da hat es in dem Menü links eine Option wie Shop, Bestellungen und dort konnte ich bestellen… :slight_smile: Kannst dann noch wählen zwischen neuem und alten Design. Habe dazumal das neue genommen… empfehle dir aber eher das Alte… es scheint als wäre beim Alten der SIM-Wechsel (falls mal nötig) etc. einfacher

So hat geklappt ! Teil ist bestellt :0) Bastelt schon mal weiter damit ich dann gleich alles einbinden kann :0P

Vg

Andreas

Wie geil!!

Mal ne Frage: Bekommt man damit auch den Tankinhalt angezeigt.
Wäre optimal, wenn man das ganze mit dem Clever-Tanken Script verbindet und
vor Fahrbeginn sagt einema das Haus, dass der Tank leer ist und wo man am
billigsten Tanken könnte auf dem Weg in die Arbeit.

Grüße Jo

Moinsen,

so weit läuft alles … bin jetzt am Feintuning … stelle danach gerne auch mal eine Screenshot ein :0)

@ Jannis = Danke für das Skript !
@ crypto = so weit ich das sehe, gibt es im Moment keine Variable für den Tankinhalt … gehen muss das aber … ich habe mal ne Anfrage da platziert

Werde jetzt noch Versuchen ein Fahrtenbuch zu integrieren. Was habt ihr noch so vor ?

VG

Andreas

Mal ne kurze Frage zwischendurch, ist mir auf der Homepage nicht ganz klar geworden.
Bieten die zu dem Gerät nun auch einen eigenen Webdienst (ggf. mit App Anbindung) oder stellen die nur den Zugriff auf den Server bereit und Entwickler können sich dann eine Anbindung basteln?

Gruß Thomas

@wuppi
geht das eigentlich nur mit Zündung ? oder liegen Daten auch ohne an
ich wollte zb km-stand für Fahrtenbuch auslesen. ansonsten müsste das fahrzeug bei Erreichen/Eintreten in des/das wlans das Auslese-Script triggern

@heinrich = also ne app fürs handy gibts nicht … du kannst aber über die webseite alle daten abfragen … bzw. wie du gesagt hast, dir als Entwickler selbst eine bauen … gibt wohl schon ein paar, muss man aber erst ne anfrage stellen

@axel37 = also die daten werden immer übermittelt wenn die Zündung bzw. der Motor an ist. Steht das Auto 5 min. mit Motor aus, werden keine Daten mehr gesedent. Für die Gesamtkilometer als nutzbar. Die Daten werden doch per GSM gesndet !

auf gsm möchte ich verzichten, da ich schon ein gps-positionsgerät incl. telemetrie am laufen habe

dann wird es mit dem Teil nicht gehen … das hat keine wlan oder bluetooth schnittstelle

PS: Die GSM karte ist aber mit in dem Preis drin (für 3 jahre)

Danke Jannis für den Tip und das Skript! Mit OBD Daten wollte ich schon lange spielen.

Ich habe mir jetzt auch das Teil bestellt und habe es schon ein paar Tage am laufen. Ich habe die Version ohne Datenplan genommen, da ich in den nächsten Monaten umziehen werde. Die Einrichtung mit der eigenen SIM-Karte war da nicht so einfach aber mit etwas Geduld hat es geklappt. Hier werden die beiden mitgelieferten Kabel auf jeden Fall gebraucht.

Ich habe das Skript etwas überarbeitet und kann es gerne in den nächsten Tagen hier Posten. Ich hatte z.B. das Problem, dass die Daten oft nicht in der richtigen Reihenfolge ankommen. Es wird auch auf der Munic Webseite geraten, die Daten nach dem Empfang wieder einzuordnen. Damit wird dann so eine Situation korrigiert:

munic_track - unsorted_vs_sorted_s.png

Verbrauchsdaten kamen bei mir am Anfang nicht an. Hat das bei euch funktioniert? Nach einem E-Mail-Austausch mit dem Support, haben die es gefixt. Da war anscheinend ein Problem beim Munic Server mit der Konfiguration des Moduls. Jetzt kommt MDI_OBD_FUEL richtig an, aber nur am Anfang und am Ende einer „Fahrt“. Ich würde gerne kontinuierlich den Verbrauch messen und habe da eine Anfrage geschickt.

munic_fuel.png

Einen Parameter für den Tank-Stand (in %) gibt es im OBD-II Protokoll. Der ist aber anscheinend hier nicht Standardmäßig aktiviert.

Gruß
Zapp