Heidelberg Wallbox über Modbus mit einem RaspberryPi verbinden

Heidelberg Wallbox über Modbus mit einem RaspberryPi verbinden

Im Folgenden ist Einrichtung einer Steuerung einer Heidelberg Wallbox per Modbus aus EVCC beschrieben.

Physikalische Verkabelung

  • Ein Drahtpäarchen aus einem schon verlegten CAT6 Netzwerkkabel
  • An der Heidelberg Wallbox auf die entsprechenden Klemmen A (blau) und B (weiss) angeschlossen und den Schirm der Leitung an der vorgesehenen Stelle mit dem Gehäuse verbunden:
  • Die Bus-ID der Wallbox auf “1” setzen gemäß Heidelberg Anleitung, dazu den DIP-Schalter S4/4 auf EIN stellen
  • Das andere Ende des Netzwerkkabels an einen Modbus2USB Adapter anschließen und einen 120 Ohm Widerstand (ich hatte nur 100 Ohm) parallel schalten:
  • Am Raspberry PI den USB-Stick anschließen
  • Verwendet wird ein Wingoneer USB-485 “USB to RS 485” Stick BTE17-07

Test auf der Kommandozeile

  • Mit modbus_cli kann die Installation auf einfache Weise getestet werden
  • Installation: pip3 install modbus_cli
  • Der Aufruf liest das Input-Register 4 aus (Serielle Einstellungen 19200 8E1 lt. Anleitung Heidelberg): modbus -b 19200 -p 1 -P e -B be /dev/ttyUSB0 i@4 (hier das richtige USB-Serial-Device auswählen)
    • Der Aufruf liefert in meinem Fall 0x108, was Version 1.0.8 der Firmware entspricht
  • In /etc/udev/rules.d/99-usb-serial.rules eine Zeile ergänzen: SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB_WB" (die IDs erhält man per lsusb).
  • Mit udevadm control --reload-rules && udevadm trigger die Regeln neu laden und prüfen ob der Symlink erstellt wurde.

EVCC installieren

network:
  schema: http
  host: evcc.local # .local suffix announces the hostname on MDNS
  port: 7070

mqtt:
  broker: mqtt:1883
  topic: evcc

log: info
levels:
  cache: error

# unique installation id
plant: <installid>

interval: 10s # control cycle interval

sponsortoken: <sponsortoken>

# sponsors can set telemetry: true to enable anonymous data aggregation
# see https://github.com/evcc-io/evcc/discussions/4554
telemetry: false

meters:
  - name: netz
    type: template
    template: tibber-pulse
    usage: grid
    token: <token>
    homeid: <homeid>

vehicles:
- name: ev1
  type: template
  template: id
  title: ID.3
  user: <mail>
  password: <pwd>
  vin: <id>
  capacity: 58
  phases: 3
  icon: car
  cache: 15m
  minSoc: 20
  targetSoc: 80
  minCurrent: 6
  maxCurrent: 16

chargers:
- type: template
  template: heidelberg
  id: 1
  device: /dev/ttyUSB_WB
  baudrate: 19200
  comset: 8E1
  modbus: rs485serial
  name: wallbox1

loadpoints:
- title: Garage
  charger: wallbox1
  mode: pv
  phases: 3
  mincurrent: 6
  maxcurrent: 16
  resetOnDisconnect: true
  vehicle: ev1

tariffs:
  grid:
    type: tibber
    token: "<token>" # access token
    homeid: "<homeid>"
  co2:
    type: grünstromindex
    zip: <plz>

site:
  title: Mein Zuhause
  meters:
    grid: netz

messaging:
  events:
    start: # charge start event
      title: 🚗⚡ Charge of {{.vehicleTitle}} started
      msg: |
        Wallbox {{.title}} started charging {{.vehicleTitle}} in {{ toString .mode | upper }} mode.

#        --------------------------
#        evcc Status {{printf `(%d-%02d-%02d %02d:%02d:%02d)` now.Year now.Month now.Day now.Hour now.Minute now.Second}}
#        Netz-Leistung: {{round (divf .gridPower 1000) 3 }} kW
#        Solar-Leistung: {{round (divf .pvPower 1000) 3 }} kW
#        Eigenverbrauch: {{round (divf .homePower 1000) 3 }} kW
#        {{if .batteryConfigured}}Batteriespeicher-Status: {{round (divf .batteryPower 1000) 3 }} kW ({{.batterySoc }} %){{end}}
    stop: # charge stop event
      title: 🚗🔋 Charge of {{.vehicleTitle}} finished
      msg: |
        Wallbox {{.title}} finished charging {{.vehicleTitle}}
        with {{round (divf .chargedEnergy 1000) 2 }} kWh in {{.chargeDuration}}.

#        --------------------------
#        evcc Status {{printf `(%d-%02d-%02d %02d:%02d:%02d)` now.Year now.Month now.Day now.Hour now.Minute now.Second}}
#        Netz-Leistung: {{round (divf .gridPower 1000) 3 }} kW
#        Solar-Leistung: {{round (divf .pvPower 1000) 3 }} kW
#        Eigenverbrauch: {{round (divf .homePower 1000) 3 }} kW
#        {{if .batteryConfigured}}Batteriespeicher-Status: {{round (divf .batteryPower 1000) 3 }} kW ({{.batterySoc }} %){{end}}
    connect: # vehicle connect event
      title: "🚗 {{.vehicleTitle}} connected on wallbox {{.title}}"
      msg: |
        {{.vehicleTitle}} connected on wallbox {{.title}} at {{round (divf .pvPower 1000) 2 }} kW PV.

#        --------------------------
#        evcc Status {{printf `(%d-%02d-%02d %02d:%02d:%02d)` now.Year now.Month now.Day now.Hour now.Minute now.Second}}
#        Netz-Leistung: {{round (divf .gridPower 1000) 3 }} kW
#        Solar-Leistung: {{round (divf .pvPower 1000) 3 }} kW
#        Eigenverbrauch: {{round (divf .homePower 1000) 3 }} kW
#        {{if .batteryConfigured}}Batteriespeicher-Status: {{round (divf .batteryPower 1000) 3 }} kW ({{.batterySoc }} %){{end}}
    disconnect: # vehicle connected event
      title: "🚗 {{.vehicleTitle}} disconnected of wallbox {{.title}}"
      msg: |
        {{.vehicleTitle}} disconnected of wallbox {{.title}} after {{.connectedDuration}}.

#        --------------------------
#        evcc Status {{printf `(%d-%02d-%02d %02d:%02d:%02d)` now.Year now.Month now.Day now.Hour now.Minute now.Second}}
#        Netz-Leistung: {{round (divf .gridPower 1000) 3 }} kW
#        Solar-Leistung: {{round (divf .pvPower 1000) 3 }} kW
#        Eigenverbrauch: {{round (divf .homePower 1000) 3 }} kW
#        {{if .batteryConfigured}}Batteriespeicher-Status: {{round (divf .batteryPower 1000) 3 }} kW ({{.batterySoc }} %){{end}}
  services:
  - type: telegram
    token: <token>
    chats:
    - <id> 

Sonstiges

Die Verwendung von mbusd um den Modbus per TCP weiterzuleiten schlug bei mir fehl. Trotzdem hier das Vorgehen zur Dokumentation

mbusd

Siehe GitHub - 3cky/mbusd: Open-source Modbus TCP to Modbus RTU (RS-232/485) gateway.

Installation

git clone https://github.com/3cky/mbusd.git 
$ cd mbusd
$ mkdir -p build && cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
$ make
$ sudo make install

Konfiguration

nano /usr/local/etc/mbusd/mbusd-ttyUSB_WB.conf
# Serial port device name
device = /dev/ttyUSB_WB

# Serial port speed
speed = 19200

# Serial port mode
mode = 8e1

systemctl start mbusd@ttyUSB_WB.service
```