/node-bmw-client

A node.js powered interface for E38/E39/E53 + E6x/E9x BMW vehicles (Client side)

Primary LanguageJavaScriptMIT LicenseMIT

node-bmw-client

Do magic with an E38/E39/E46/E53-ish BMW, Raspberry Pi 3, and Node.js 9.x.

Advisory

I dev way faster than I document.
This README is 12+ months out of date and needs to be completely rewritten, to include things like:

  • NBT retrofit support (HW 07)
    • Currently power on/off and steering wheel controls are working, very early WIP
  • iDrive controller to Kodi support
    • Supports K-CAN and K-CAN2 iDrive controllers
    • E38/E39/E53 MFL > NBT support
  • tvservice/vcgencmd HDMI screen control or HDMI-CEC screen control
  • Custom afterrun timer for accessory relays via Pi GPIO
  • SO MUCH OTHER STUFF
  • For snippets, check out my Instagram
    I'll get to it... eventually

Disclaimers

  • First and foremost, this project can and might hurt you.
    • If you rely on the auto lights, and they cut out at night, you might die.
    • If you are trapped in the vehicle, and the app locks up the GM and the door locks don't work, you might die.
    • If you drive into a body of water and need to roll down the window to release the pressure, and the app locks up the GM and the windows don't work, you might die.
    • If the app develops some bug/level of sentience .. it's worth knowing that it can talk to/hear from the airbag computer. If they deploy randomly.. you guessed it, you might die.
  • If it breaks/hurts/kills you/your car/your something else/etc... not my fault.
    • Harsh disclaimer but it is what it is.
    • See MIT license.
  • I routinely break master. Like, 100% un-functional.
  • I make no assertations that I am a professional. I'm just doing this for fun and to learn a little Node.js.
  • It's probably best to use this project as a reference versus fork it.

Currently being developed using a US-spec 2000 E39 540i, a US-spec 2002 E39 M5, two Raspberry Pi 3s running Raspbian stretch, Rolf Resler IBUS/KBUS adapters, NBT HW 07, PiCAN2 dual-channel CANBUS hats, a HDMI screen, NodeJS 9.x, and more. About 90% of it is done in a way I don't really like, but I have so little time to work on this... =/

It acts as, more or less.. plug-in custom firmware for the BMW modules.

It does:

  • BMW bus interface:
    • DBUS
    • IBUS
    • KBUS
  • Module emulation:
    • CDC (trunk-mounted CD changer - useful to repurpose as aux input)
    • MID (Multi-information display)
    • BMBT (Bordmonitor/On-board monitor)
    • DSPC (DSP controller)
  • Lights:
    • Standing lights auto on/off, essentially as DRLs
    • Low beam auto on/off, based on locale and sun position (latitude/longitude are set in config.json)
    • Rear fog LED in gauge cluster acts as auto-lights status light (since my car doesn't actually have a rear fog)
      • It only shows when fogs or low-beams are on =/
    • "Comfort" turn signal emulation, a la newer BMWs
      • 3-flash comfort turn is a joke, this does 5-flash
  • Media:
    • HDMI CEC control to power on/off HDMI display on ignition change
    • Kodi API integration
      • Steering wheel controls work with Kodi
      • Key on/off starts/stops Kodi playback
      • Song titles scroll in IKE cluster
  • Custom display in gauge cluster (IKE) with system load, coolant temp in deg C, and time (from OS, not from car)
  • Welcome message in gauge cluster (IKE) on key on/app start
  • WebUI:
    • Current vehicle status
      • Vehicle speed
      • Engine RPM
      • Engine status (running/not running)
      • Country coding/units (parsing is terrible, I do it all wrong, don't look..)
      • Coolant/exterior temperatures
      • VIN (last 7)
      • Odometer
      • Doors/hood/trunk opened/closed
      • Windows up/down
      • Central locking
      • Handbrake status
      • In reverse gear or not
      • Ignition position
      • OBC data:
        • Aux heat/vent timer 1+2
        • Average speed
        • Consumption 1+2
        • Date/time
        • Distance remaining
        • Range to empty
        • Speed limit
        • Stopwatch
        • Timer
    • Control vehicle modules:
      • DSP amp/equalizer
      • GM (windows/doors/locks)
      • IKE (gauge cluster)
      • LCM (light module)
      • OBC data set/reset
    • Control other things:
      • HDMI CEC on/off
        • GPIO outputs (for Sainsmart relays)
  • Other:
    • Time/date sync from OS to car
    • Auto-unlock doors when key is turned from run to accessory
    • Parsing/decoding of IO status from LCM and GM
    • WebSocket UI/dynamic table for displaying decoded data in WebUI, with 2-way communication for sending data as well
    • What I'm about 97% certain is the single largest documented collection of BMW IBUS commands, under /ref
  • .. and a lot of other stuff, I'm probably forgetting.

Future plans/ideas/to do list:

I'll add more to this once I'm out of the dirty-dev weeds, which might be never