Autodaten per OBD2 und WiFi lesen

Autohersteller bieten heute Apps an, um Daten vom Auto anzuzeigen und sogar gewisse Funktionen vom Auto fernzusteuern. Nach einer gewissen Zeit nach dem Kauf des Autos, sind auch die Apps oft nur noch gegen Bezahlung verwendbar. Ausserdem sind die Informationen in der App zwar sichtbar, können aber nicht in anderen Systemen wie z.B. einer Hausautomation verwendet werden. Es existiert meist keine API die man verwenden könnte.

Nun hat fast jedes moderne Auto einen OBD2-Port, mit welchem die Garagen mit spezieller Software den Zustand des Autos analysieren können. Genannte Software ist üblicherweise nicht im Handel erhältlich und den Markenvertretungen vorbehalten oder einfach viel zu teuer für den Privatgebrauch. Es gibt auf dem Markt aber auch Hersteller die günstige Alternativen anbieten, die meist in Verbindung mit einem Smartphone agieren. Es gibt sogar OBD2-Dongles, welche die Daten ins Wlan senden.

Mit dem WiCAN Adapter und ein paar Installationen im Heimnetz, kann man sich die Infos vom Auto in ein anderes IT-System laden. Hier ein Beispiel wie das in openHAB gemacht wird.

https://www.meatpi.com/products/wican

Gekauft habe ich den WiCAN hier: https://www.mouser.ch/ProductDetail/392-WICAN-OBD-C3

Den WiCAN OBD2-Dongle steck man in den OBD2-Port des Autos und kann ihn dann auch gleich permanent dort angeschlossen lassen, sofern dies aus Platzgründen nicht stört. Er aktiviert sich bei eingeschalteter Zündung und übermittelt die Daten in dein Wlan sofern dieses erreichbar ist. Damit dies funktioniert, muss man natürlich den WiCAN entsprechend konfigurieren, also die CAN-Bus Einstellungen vom Auto einerseits, dann die Verbindung zum Wlan und auch die Übertragung der Daten via MQTT-Broker. Dazu gibt es vom MeatPi direkt eine Page wo man alles eingeben kann.

https://meatpihq.github.io/wican-fw/config/wifi

Wie erwähnt, braucht der WiCAN einen MQTT-Broker. Falls man noch keinen im Heimnetz installiert hat, muss dies noch ergänzt werden. Hier ein Link zu einer Installationshilfe mit der man sich den Broker auf einen Raspberry PI installiert. Auf anderen Linux-Systemen sollte das genau gleich möglich sein.

https://www.elektronik-kompendium.de/sites/raspberry-pi/2709041.htm

Hat man WiCAN und MQTT aufgesetzt und konfiguriert, dann kommen schon Daten vom Auto an. Diese sind aber noch recht kryptisch und müssen korrekt interpretiert werden. Folgend zeige ich, wie man mit openHAB den SOC vom Fiat 500e liest. Bei jedem Auto sind Art und Weise wie die Daten zu lesen sind anders. Somit muss man sich mit Infos aus dem Netz behelfen.

MQTT mit openHAB

In openHAB braucht es, um via MQTT-Broker Daten zu empfangen, das MQTT Binding. In openHAB 5 findet man dies indem man unter Addon-Store “MQTT” ins Suchfeld eingibt.

Im zweiten Schritt erstellt man mittels einem neuen Thing MQTT-Broker eine Verbindung zum Broker. Hier ist die IP-Adresse vom Gerät auf dem der Broker installiert ist zu verwenden.

Als nächstes musst nochmals ein Thing erstellt werden, wieder mit dem MQTT-Binding aber diesmal ein Generic MQTT Thing. Als Bridge wählt man den Broker von vorhin.

Nun, um Daten vom Broker auch zu Empfangen, erstellt man für jedes Topic einen Channel im zuletzt erstellten Thing. Auf den Tab “Channels” wechseln und “Add Channel” wählen. Ich habe mir 2 Channels erstellt, einen zum lesen von Daten und einen um Befehle zu senden.

(unser Auto heisst Fifi ☺️)

Beide Channels verbindet man mit je einem String-Point. Nun sollten die Daten auch schon vom MQTT-Broker ankommen sobald der Broker diese weiterleitet.

SOC vom Fiat 500e lesen

Damit Werte vom CAN-Bus des Autos ausgelesen werden können, muss man gewisse Befehle an das Auto senden. Hier wird es schwierig, denn diese Befehle werden von den Herstellern nicht publik gemacht. Also muss sich jeder selbst im Netz die Infos für sein Auto zusammensuchen.

Damit mein openHAB weiss, dass das Auto in Reichweite des Wlans ist, wird der Status vom MQTT-Broker abgefragt. Dazu wie schon zuvor ein Channel erstellen:

Den Point als String mit JSONPATH Ausdruck $.status – dessen möglichen Werte sind dann:

  • offline
  • online

Nun muss openHAB, sobald der Status auf “online” wechselt, den Befehl senden, der die Ausgabe des SOC triggert. Dazu eine Rule:

val message = '{"bus":"0","type":"tx","ts":59058,"frame":[{"id":416957681,"dlc":8,"rtr":false,"extd":true,"data":[3,34,160,16,170,170,170,170]}]}';

Generic_MQTT_Thing_Wican_Fifi_Tx.sendCommand(message);

Die Message ist der Befehl, der dem Auto via CAN-Bus sagt, es soll jetzt Daten ausgeben. Diese muss man nun nur noch lesen und interpretieren. Also nochmal eine Rule:

val message = Generic_MQTT_Thing_Wican_Fifi_Rx.state.toString;
//logInfo("fifi", "message: {}", message);

val id = transform("JSONPATH", "$.frame[0].id", message);
//logInfo("fifi", "id: {}", id);

if (id == '417001796') {
val data0 = transform("JSONPATH", "$.frame[0].data[0]", message);
val data1 = transform("JSONPATH", "$.frame[0].data[1]", message);
val data2 = transform("JSONPATH", "$.frame[0].data[2]", message);
if (data0 == '16' && data1 == '9' && data2 == '98') {
val data7 = transform("JSONPATH", "$.frame[0].data[7]", message);
//logInfo("fifi", "data: {}", data7);
val socHex = Integer.parseInt(data7);
val socPercent = (socHex*100)/255;
//logInfo("fifi", "socPercent: {}", socPercent);
val socCorrect = Math.min(100, socPercent - (( 40 - socPercent ) / 7));
//logInfo("fifi", "socCorrect: {}", socCorrect);
fifi_soc.postUpdate(socCorrect);
}
}

Diese Logik ist nur für den Fiat 500e anwendbar. Es werden verschiedene Datensätze empfangen, der SOC ist dort zu lesen, wo ganz bestimmte Voraussetzungen gegeben sind. Der Wert im Datenblock 7 muss dann noch umgerechnet werden, daher es sich ursprünglich um einen 2-Stelligen HEX-Wert handelt wo das Maximum 255 ist, wir aber einen %-Wert erwarten. Um den korrekten Wert wie im Dashboard im Auto angezeigt zu eruieren, braucht es noch eine kleine Berechnung. Diese habe ich in einem Forum gefunden. Den finalen Wert schreibt man sich dann in ein Item von openHAB – et voilà.

Fazit

Das ganze hat mich einiges an Kosten für verschiedenes Material verursacht. Bevor ich den WiCAN Dongle fand, hatte ich es mehrmals mit CAN-Bus Modulen für Raspberry versucht. Auch habe ich etliche Stunden Arbeit investiert und bin mehrmals daran gescheitert, dass ich die CAN-Befehle und die Datenstruktur nicht kannte.

Wäre doch super, wenn die Autobauer es möglich machen würden, dass man das Auto direkt mit Wifi verbinden und via REST-API die wichtigsten Daten auslesen könnte. —– “I am a dreamer”.