Veröffentlicht am 16 Kommentare

Anleitungsartikel

In diesem Tutorial geht es darum den aktuellen Ladezustand (Prozent-Wert) des Hyundai IONIQ electric auszulesen und auf einer kleinen Website zur Verfügung zu stellen.

Leider stellt der Hersteller in Europa keine Möglichkeit zur Verfügung. Diesen eher unerfreulichen Zustand nahm ich zum Anlass dieses kleine Projekt zu starten. Schöner wäre natürlich eine fix und fertige Lösung des Herstellers. Da dies nicht gegeben ist, gibt es nun diese Bastelei, die aber bisher in meinem IONIQ anstandslos seinen Zweck erfüllt und mich stets über den Batteriestand informiert.

Vorab

Ich selbst bin Webentwickler und seit 2014 begeistert vom Thema Elektromobilität. Bevor ich mich für E-Mobile interessiert habe, hatte ich mit Autos nichts am Hut 🙂 Ich bin überhaupt kein KfZ Enthusiast oder habe Vorkenntnisse hinsichtlich Fahrzeugdiagnose oder Vorkenntnisse im Umgang mit der OBD2 Schnittstelle.

Dies ist eine Basis-Einrichtung und vernachlässigt das Thema Sicherheit.

Hardware + Kosten

Grundsätzlich funktioniert das System wohl auch mit anderer Hardware z. B. mit anderen OBD2 Bluetooth Dongle oder Surfsticks. Aber ich habe gute Erfahrungen damit gemacht und liste es deshalb hier auf.

Raspberry Pi Zero W (Starter Set)  Darin enthalten sind auch Gehäuse und ein USB Adapter. Das benötigst du später für den Surfstick  26,00 EUR
Netzteil + Kabel für Stromversorgung  9,89 EUR
8GB Micro SD Karte  7,99 EUR
OBD2 Bluetooth Dongle  Das Verlinkte Dongle ist etwas groß und die Abdeckung im Fahrzeug passt nicht mehr darüber.  10,99 EUR
Huawei E303 3G Surfstick  Ich empfehle diesen Stick oder ein anderer HUAWEI Surfstick, der HiLink unterstützt. d. h. hier richtet den Stick wie im Manual beschrieben an einem Windows PC ein. Am Raspberry Pi ist dann nichts mehr zu machen. Einfach nur noch einstecken.  25,49 EUR
Powerbank Für Ladevorgänge, muss der Raspberry Pi mit einer Powerbank mit Strom versorgt werden. Die USB Buchsen im Fahrzeug funktionieren leider nicht  31,99 EUR

Es entstehen also Hardwarekosten von ca. 110,00 EUR

Bitte beachten, Du benötigst….

… Vorkenntnisse in den Bereichen Linux, SSH und Webhosting. Außerdem brauchst du einen Provider, der Dir eine MySQL Datenbank und ein kleines PHP Skript hostet. Außerdem ein PC/Mac mit der Möglichkeit auf die SD Karte  zuzugreifen.

1. Vorbereitung

Für die Speicherung des Ladezustands benötigst du eine Tabelle in einer Datenbank. Im Tutorial hier benutze ich eine MySQL Datenbank. Die Datenbank muss von extern erreichbar sein.

Folgende Tabelle kannst du über das SQL-Skript anlegen

CREATE TABLE IF NOT EXISTS `bms` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `soc` int(255) NOT NULL,
 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1267 ;

Halte für den späteren Schritt die Zugangsdaten für die Datenbank bereit.

Du benötigst den

  • Hostnamen (Servername)
  • Benutzername
  • Passwort
  • Datenbankname

2. Einrichtung des Raspberry Pi

Wenn du noch keinerlei Erfahrung mit dem Umgang mit dem Raspberry Pi hast, solltet du Dir einige Informationen darüber einholen. Z. B. hier 

Wenn du schon etwas vertraut im Umgang mit dem Raspberry Pi bist, kann es losgehen. Wir starten mit dem Bespielen der Micro SD Karte. Die SD Karte wird mit einem Image bespielt. Das ist ein vorkonfiguriertes Betriebssystem für den Pi. Ich habe dazu „Raspbian Stretch Lite“ ausgewählt, dass du hier herunterladen musst.

Es gibt viele verschiedene Möglichkeiten das Raspbian Image auf die SD Karte zu schreiben.

Für Windows: Win32DiskImager
Anleitung: https://www.raspberrypi.org/documentation/installation/installing-images/windows.md

Für Mac: Über das Terminal
Anleitung: https://www.raspberrypi.org/documentation/installation/installing-images/mac.md

Beides ist hinreichend im Netz dokumentiert, weshalb ich hier nicht weiter darauf eingehe.

2.1. WLAN und SSH konfigurieren

Bevor du die SD Karte in den Pi stecken und ihn booten kannst, solltest du vorab das WLAN konfigurieren, damit du die weitere Konfiguration per SSH durchführen kannst. Hierzu erstellst du eine Datei „wpa_supplicant.conf“ mit dem Inhalt

# Datei wpa_supplicant.conf in der Boot-Partition (Raspbian Stretch)
country=DE #omit if US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
 ssid="<DEIN WLAN NAME (SSID)"
 psk="<DEIN WLAN PASSWORT>"
 key_mgmt=WPA-PSK
}

und kopierst sie auf die SD Karte.

Erstelle zusätzlich noch eine leere Datei mit dem Namen „ssh“ und kopiere diese ebenfalls auf die SD Karte. Das hat zur Folge, dass du über SSH auf den Pi zugreifen kannst.

Nach dem Start verbindet sich der Raspberry Pi dann mit Deinem WLAN und du kannst ihn ab sofort über das Netzwerk ansprechen.

2.2. Inbetriebnahme des Raspberry Pi Zero W

Nun kannst du die beschriebene und über die beiden Dateien erweiterte, SD Karte in den Raspberry stecken und ihn starten. Du solltest dann das Gerät mit dem Namen „raspberrypi“ in Deinen Netzwerkgeräten finden. Z. B. über die Weboberfläche des Routers (Fritz Box)

Oder du kannst ihn direkt versuchen „anzupingen“ unter Windows mit dem Programm „cmd“ oder wenn du einen Mac oder Linux System nutzt, über das Terminal.

ping raspberrypi

Wenn der Raspberry im Netz erreichbar ist, erhältst du auf diesem Weg auch die IP Adresse des Geräts.

2.3. Erste Verbindung per SSH und Paket-Installationen

Du benutzt PuTTY oder das Terminal für SSH Verbindungen zum Raspberry Pi. Der Standard-Benutzername lautet „pi“ das Passwort „raspberry“

ssh pi@raspberrypi
pi@raspberrypi's password: raspberry

Nun müssen einige Pakete installiert werden, zuvor aber bitte das obligatorische update und upgrade durchführen

sudo apt-get update
sudo apt-get upgrade

sudo apt-get install bluetooth bluez-tools blueman python python-serial python-mysqldb

2.4. OBD2 Bluetooth Dongle mit Raspberry Pi koppeln

In diesem Schritt müssen drei Dinge gegeben sein.

  1. OBD2 Dongle ist im IONIQ eingesteckt
  2. Raspberry Pi ist in Reichweite des OBD2 Dongle (< 5m)
    Idealerweise versorgt Ihr den Raspberry Pi direkt im IONIQ mit Strom. Einfach an eine USB Buchse hängen. Fahrzeug einschalten!
  3. Raspberry Pi ist im WLAN

Ich könnte mir vorstellen, dass das für den ein oder anderen u. U. problematisch ist, weil z. B. das Fahrzeug in der Tiefgarage abgestellt ist und es dort kein WLAN für den Raspberry Pi gibt. Dann kann ich nur empfehlen das Koppeln des OBD2 Dongle und dem Raspberry Pi an einem Ort zu machen an dem diese Bedingungen gegeben sind.

Solltest du dafür ein anderes WLAN nutzen müssen, dann kannst du die Datei in Schritt 1.1. einfach um einen weiteren Network-Block, mit weiteren Zugangsdaten, erweitern .


network={ 
  ssid="<EIN ANDERES WLAN NAME (SSID)>" 
  psk="<EIN ANDERES WLAN PASSWORT>" 
  key_mgmt=WPA-PSK 
}

Nun zum Koppeln des Geräts:

sudo bluetoothctl

startet das Programm für die Einrichtung des  Bluetooth Geräts. Vermutlich muss du dies mit dem Passwort des Users „pi“ bestötigen. Also „raspberry“ eingeben und bestätigen

agent on
scan on

listet alle Bluetooth Geräte in Reichweite auf. Hier sollte auch euer OBD2 Dongle erscheinen. Du siehst auch die zugehlrige Geräte-Adresse (Format: XX:XX:XX:XX:XX:XX) . Diese ist für die weiteren Schritte wichtig!

pair XX:XX:XX:XX:XX:XX

Nun musst du noch den Gerätecode eingeben. I. d. R. ist das !1234″ oder „0000“. Wenn das geklappt hat, muss man dem Gerät noch generell vertrauen, damit diese Prozedur nicht permanent wiederholt weden muss. Das geht mit

trust XX:XX:XX:XX:XX:XX

Gerät als Device einbinden

Damit wir auf den OBD2 Dongle zugreifen können, muss er als Serielles Gerät noch eingebunden werden. und dies nach jedem neustart. Dazu fügen wir folgende Zeile in die Datei /etc/rc.local ein

sudo rfcomm bind hci0 XX:XX:XX:XX:XX:XX 1

Anschließend solltest du den Raspberry Pi neustarten

sudo reboot

2.5. Python Skript installieren

Wie schon vorab erwähnt, habe ich bis dato noch keine Zeile Python geschrieben. Deshalb mag es sein, dass sich die Python Profis hier die Hände vor die Augen halten. Der Code bietet ganz sicher einiges an Optimierungspotential!


import serial
import MySQLdb
import re
import time
import string
import io

db = MySQLdb.connect(host="<DB HOST>",    # your host, usually localhost
                     user="<DB USER>",         # your username
                     passwd="<DB PASSWORT>",  # your password
                     db="<DB NAME>")        # name of the data base

cur = db.cursor()

ser = serial.Serial("/dev/rfcomm0", timeout=None)
ser.baudrate = 9600
ser.flushInput()
ser.write(b'2105\r\n')
ser.flush()
seq = []
while True:
    reading = ser.read()
    seq.append(reading)
    joineddata = ' '.join(str(v) for v in seq).replace(' ', '')

    err = re.search('ERROR', joineddata)
    if err:
        break
    m = re.search('4([^;]*)5:', joineddata) #'/4([^;]*)\n5', joineddata)
    if m:
        ser.close()
        test = str(m.group(0))
        x = (test[-8:])      
        SoC = (int( x[3:5], 16)/2)
        if SoC > 0 & SoC <= 100:
            print(SoC)
            cur.execute("""INSERT INTO bms (soc) VALUES (%s)""", (SoC,) )
            db.commit()
        break

 

Trage Deine Datenbank-Zugangsdaten ein und speichere den Code auf dem Raspberry Pi in das Verzeichnis /home/pi/ unter dem Namen ioniq.py ab

Du kannst das Ganze dann bereits das erste mal testen, indem du das Programm aufrufst

python ioniq.py

Nach kurzer Programmlaufzeit solltest du einen neuen Datensatz in Deiner bms-Tabelle sehen und dort sollte de SoC stehen.

2.6. Python Skript per Cronjob ausführen

Damit man das programm nicht mauell ausführen muss, richten wir den Aufruf in der Crontab ein.

Dazu per SSH folgenden Befehl eingeben

crontab -e

und in diese Datei folgende Zeile einfügen

* * * * * python /home/pi/ioniq.py& PID=$!; sleep 15; kill $PID >/dev/null 2>&1

Nun wird ioniq.py minütlich aufgerufen

2.7. Surfstick

Raspberry Pi Zero ! + Huawei E303 Surfstick

Ich nutze den HUAWEI E303 Surfstick. Der unterstützt HiLink. Auch hier gehe ich nicht auf die Details der Einrichtung ein. Dies unterscheidet sich auch wieder von Surfstick zu Surfstick. Ich empfehle die Einrichtung wie im Handbuch des Sticks beschrieben, durchzuführen. Das muss und sollte auch nicht am Raspberry Pi erfolgen. Benutze dazu ein Windows PC oder Notebook.

Wenn du mit der Einrichtung fertig bist, kannst du den Stick normalerweise ohne Weiteres in die USB Buchse des Raspberry Pi stecken, benutze dazu den USB-Adapter (Im Starter Set enthalten)

Was du unbedingt machen solltest: Entferne die PIN Abfrage der SIM-Karte während der Einrichtung. Das ging bei mir über den Web-Browser.

Achja, ich habe übriegns sehr gute Erfahrungen mit der SIM Karte von netzclub.de gemacht! 🙂

2.8. Powerbank

Während der Fahrt kannst du den Raspberry Pi problemlos an einer der USB Buchsen im Fahrzeug betreiben. Jedoch ist es in der Regel während der Fahrt sinnfrei das System überhaupt Laufen zu lassen. Normalerweise ist der Ladestand dann interessant, wenn das Auto irgendwi abgestellt wird und aufläd. Und in diesem Fall muss der Raspberry Pi mit einer Powerbank betrieben werden, denn die USB Buchsen im IONIQ werden während des Ladevorgangs leider nicht mit Strom versorgt.

Ich selbst nutze eine vorhandene Powerbank, die ich noch zu Hause liegen habe. Achtet beim kauf der Powerbank auf 2 Dinge

  1. Sie sollte sich zur selben Zeit Be- und Entladen lassen
  2. Die Be- und Entladebuchsen sollten ausreichend weit voneinander entfernt liegen, damit beide Stecker auch Problemlos zusammen eingesteckt sein können.

3. Webinterface

Das Webinterface ist eine kleine Webanwendung, die ich Quick and Dirty in PHP geschrieben habe. Du kannst einfach diese ZIP-Datei herunterladen, entpacken und den Inhalt auf Deinen Webspace hochladen.

Auch hier setze ich etwas Vorkenntnisse voraus und gehe nicht darauf ein. Es sollte klar sein, dass PHP ab Version 5.6 vom Webhoster unterstützt werden muss.

Du musst nun noch die 2. Zeile in der index.php anpassen. Trage hier wieder Deine Datenbankdaten ein.

16 Gedanken zu „Anleitungsartikel

  1. Hallo Tobi,

    super Tutorial! Vielen Dank dafür!

    Ich warte zwar noch auf meinen Ioniq, der im Februar kommen soll, dennoch kann ich ja jetzt schon mal alles vorbereiten, denn Hardwaretechnisch bin ich schon bestens vorbereitet.

    Dabei habe ich allerdings eine Frage:
    Was trage ich in der index.php bei „DB Host“ ein?
    (kurzer Hintergrund: ich habe bisher noch nie eine DB in PHP eingebunden)

    Ich habe mir diesen mobilen Hotspot mit HiLink besorgt, mit dem Pi Zero W verbinde ich mich im Auto zum Hotspot sowie der Ioniq selbst wird sich dann auch zum Hotspot verbinden können:
    Huawei E5577Cs-321 WIR-Hotspot
    https://www.amazon.de/gp/product/B011YM0OXU/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1

    Damit hat der Pi die Public IP des Hotspots und lauscht auf Port 3306.

    User in MySQL mit Privileges und Freigabe für externen Zugriff ist alles angelegt und im LAN funktioniert das auch.

    Aber wenn ich die PHP Seite nun beim Hoster hochlade, muss ich ja über das WAN zum PI, trage ich hier also die Public IP des Hotspot ein? Im Hotspot habe ich auch bereits eine Portfreigabe und eine Weiterleitung eingerichtet, ein Telnet auf den Port 3306 auf die Public IP ist aber erfolglos.

    Hast Du eine Idee, was hier noch fehlt?

    Danke Dir!
    Patrick

    1. Hallo Patrick,

      so wie ich das verstehe, willst du aus der Ferne direkt auf den Raspi im Auto zugreifen. Das kannst du natürlich auch machen, dann brauchst du keinen externen Provider für das Web Frontend und die Datenbank.

      Dann müsstest du auf dem Raspi selbst noch einen MySQL, Webserver und PHP installieren und zum Laufen bringen. Dann kannst du den Inhalt der ZIP Datei auch auf dem Raspi selbst hosten.
      Der DB HOST wäre dann localhost
      Ein Portforwarding brauchst du dann aber nicht für die Datenbank sondern für den Webserver. Also z. B. Port 80 statt 3306.

      So wie ich es eingerichtet habe, schickt der Raspi den SoC Wert an eine extern gehostete Datenbank.Der Raspi ist also ausschließlich ein Datensender. Es gibt keine eingehenden Verbindungen (Außer natürlich er ist im WLAN und du bist per SSH verbunden oder so).

      In meinem Fall sieht der DB HOST etwa so aus mysql112233.1blu.de
      Also, eine externe Adresse des Datenbankservers meines Providers.

      1. Danke Dir für Deine Hilfe. Mein Fehler, ich hatte es tatsächlich falsch verstanden und dachte, Du betreibst die DB auf dem Pi. Die DB auf dem Hostingserver zu betreiben, macht mehr Sinn und habe ich jetzt auch so eingerichtet. Jetzt muss nur noch das Python Skript sich dann über WAN auf die DB verbinden können. Die Bastelei geht dann jetzt weiter 🙂

  2. Hallo, super Arbeit !

    Ich hätte noch einen anderen Ansatz, bin aber im Moment noch zu unwissend um es schnell umsetzen zu können.
    Wenn du da Zeit zum Probieren hast wäre es schön wenn du das Projekt alternativ als SMS Push umbauen kannst, Idee dahinter, ohne viel Schnickschnack einfach beim laden alle x Minuten vom Raspberry eine SMS mit dem aktuellen Ladezustand.
    Wenn der Ladestand sich dann nicht mehr ändert SMS mit Ladeabbruch oder Akku voll wenn 94% erreicht.

    —> https://www.datenreise.de/raspberry-pi-sms-per-kommandozeile-versenden/

    Danke für die Aufmerksamkeit und Gruß Thomas..

    Du solltest alles was nötig ist schon haben

    1. Hallo Thomas,

      an das Thema habe ich auch schon gedacht. Das Problem ist, dass ich den Surfstick in einem festen Modus betreiben muss. Entweder ich betreibe ihm im „SMS“ Modus, dann muss er als serielles Gerät verbunden werden oder als Netzwerkgerät für die permanente Onlineverbindung.
      Zumindest ist das mein aktueller Stand dazu.
      Zudem ist ne SMS mit 9ct zwar günstig, aber nicht kostenlos. Den aktuellen Tarif den ich nutze, beinhaltet 100MB gratis Datenvolumen, was mehr als ausreicht.
      So habe ich das abgewogen und es eben ohne die SMS Benachrichtigung gemacht. Aber das hätte Charme und deshalb ist das noch nicht komplett abgehakt 🙂

      1. Hallo Tobias,
        Wenn du mal Lust auf eine Umsetzung hast, lasse es mich wissen. Würde den Aufwand mit dem Server ersparen und es gibt auch für SMS interessante Tarife. Stelle mich als Tester bereit, Raspbery 2 hab ich noch liegen und Surfstick und BT Adapter auch, müsste nur schauen ob die am Raspberry laufen, nur halt mit dem Code tu ich mich eher schwer 😉 .

        Gruß Thomas

        1. Hi,
          alternativ kannst du sowas wie Pushbullet verwenden.

          Liebe Grüße,
          Hansepp

  3. Wirklich außerordentlich gut gemacht.
    Vielleicht gelingt es in Zukunft eine entsprechende Routine zu schaffen, sodass zB. User eine Android / iOS App nutzen können, die auf die Datenbank zugreift – zB. mittels User Login wo dann der eigene Wagen hinterlegt ist (Datenschutz i know…).
    Es sind ja viele Szenarien denkbar.
    Auch bin ich sicher, dass der Aufwand ganz sicher von vielen Usern nicht unbezahlt bleiben wird, viele IONIQ User wären dir da äußerst dankbar – auch ich.

    Super – weiter so!

  4. Hallo Tobias,
    das ganze ist ne tolle Sache werde ich sicher testen sobald der ioniq im Februar endlich kommt.
    Wäre es denn möglich das ganze ggf über eine Seite wie Charge map oder über das GE Forum abzubilden und darüber drauf zu zugreifen so hätte man alles in einem.
    Problem ist dabei natürlich wieder der Datenschutz vermutlich, aber ist mir so eingefallen eventuell kommen ja noch andere mit guten Ansätzen. Oder die ioniq Gemeinde lässt sich selbst eine App programmieren die mit einer fixen hardware läuft und alle hätten den gleichen Standard, wenn man das noch zu einem annehmbaren Preis hin bekäme würden das sicher viele nutzen wollen und
    mir wäre das auf jeden Fall bissl Geld wert.
    Man könnte ja mal bei Interesse eine Umfrage starten in der Ioniq Gemeinde.

  5. Cooles Projekt, Danke!
    Wenn meinerseits mal da ist werde ich mir das im Detail anschauen.
    Schon mal angedacht das Projekt zb auf github zu legen? Weil dann müsstest du nicht alles selbst machen bzw wären vielleicht Änderungen leichter nachzuvollziehen.
    LG, Christian

  6. Hallo Tobi,
    ich bin soeben über das Video von „Schräg“ hier auf diese Seite gestoßen und finde diese Idee super. Ich selber bin Programmierer und wäre bereit ein bisschen Zeit so nebenher für dein Projekt zu investieren, da ich grundsätzlich so etwas sehr gerne unterstütze.

    Wenn man da eine kleine Liste an Ideen / Verbesserungen sammeln könnte, dann könnte ich auch schauen, was machbar / sinnvoll ist

    Falls Interesse besteht……. 😉

    Liebe Grüße Bene

  7. Hallo Tobi,
    Ich finde es ganz toll was du leistest. Alle Achtung.
    Mein Vorschlag zur Hardwarereduzierung:
    Es gibt OBD II Auto Fahrzeug LKW GPS Echtzeit Tracker zum verfolgen von PKW oder LKW.
    Sie besitzen einen GPS Empfänger und haben die GSM-Frequenz: 850/900/1800 / 1900MHz.
    Bei meinen Recherchen habe ich fand ich ein Tracker :
    https://www.amazon.de/Fahrzeug-Tracker-OBD2-Können-Tracking-verwalten/dp/B00P91UTLK
    Er kann wohl fast alle Protokolle von OBD II.
    Ich werden ihn bestellen und mal testen.
    Für die Zukunft sicher sehr interessant, da er zusätzlich als Tracker ( Diebstahlschutz ) dient
    und einen minimalen Hardwareaufwand im Auto bedeutet.
    VG Ditmar

  8. Hello
    I am very interresting about what you did
    I have 1 question:
    Can it work with car off ? Or the car must be on ?

    1. Hey,

      The car has to be on or charging.

      1. thank’s
        I search solution with autopi.io, but seem not work yet with EV.
        so I try to fellow your way.
        I just start to make my own website for the car… to customise it for Hyundai Kona (in Europe, we don’t have blue link, online app to control the car)
        I know a lots of people search this kind of solution.
        but few people don’t know how to do.
        for me, I will try, but not sure to success.
        So, do you want to sell it ? you can make money easy …
        it is just an idea.
        thank’s

  9. Hallo Tobias,
    ich werde mir einen Zero-W aufstetzen und für meinen Kia Soul EV einsetzen. In anderen Monitoring Anwendungen lass ich mir Telegram Messages schicken, so werde ich das hier auch anwenden.
    Danke für den Python Code.
    Peter

Kommentare sind geschlossen.