Featured image of post 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.

Ich verwende hier eine Heidelberg Energy Control Wallbox hier kaufen*. Falls Du schon solch eine Wallbox hast, aber noch keinen dynamischen Strompreistarif, habe ich am Ende der Seite einen Tipp für dich, denn grade als E-Auto Fahrer lohnen sich dynamische Strompreistarife sehr.

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:

Anschluss an der Wallbox

  • 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:

Canbus-Adapter

  • Am Raspberry PI den USB-Stick anschließen
  • Verwendet wird ein Wingoneer USB-485 “USB to RS 485” Stick BTE17-07 hier kaufen*

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

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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

1
2
3
4
5
6
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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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

Folgende Links waren mir beim Erstellen der Seite eine Hilfe:

Werbung: Tibber

Habt ihr schon einen dynamischen Stromtarif? Tibber ist einer der ersten Anbieter, die solch einen Tarif in Deutschland realisiert haben. Ich selbst bin seit Oktober 2022 dort Kunde, und das ist für mich eine durchweg sehr positive Erfahrung. Zum einen bietet Tibber eine übersichtlich strukturierte, moderne App, in der ihr jederzeit den vollen Überblick über euren Stromtarif und eure Kosten habt. Zum anderen sind die Kosten sehr transparent: Tibber berechnet euch nur das, was der Strom an der Börse momentan tatsächlich kostet (zuzüglich der regulären Netzentgelte, etc.), und verlangt darüber hinaus lediglich eine Servicegebühr von 3,99 Euro im Monat.

Wenn Tibber für euch eine Option ist, würde ich mich freuen, wenn ihr euren Stromvertrag über meinen Einladungslink abschließt. Damit bekommt ihr und ich jeweils 100 Euro für den Tibber Store, wo ihr verschiedene IoT-Hardware für euer Smart Home kaufen könnt. Wenn ihr schon Tibber-Kunde seid und keinen Einladungslink verwendet habt, könnt ihr das noch 14 Tage lang nachholen. Auch hier freue ich mich, wenn ihr den Code vkccaupl verwendet.

Habt ihr Fragen oder seid noch unsicher? Dann zögert nicht, mich persönlich dazu anzusprechen. Ich helfe Euch rauszufinden, ob Tibber die richtige Wahl für Euch ist. Und wenn es doch nichts für Euch ist, ihr könnt Tibber jederzeit monatlich kündigen!

Vielen Dank für Eure Unterstützung! Sie ermöglicht es mir, die Zeit zu nehmen um weiterhin Videos für Euch zu erstellen.

Joachim

Hinweis: Die so (*) markierten Links sind Affiliate-Links. Das bedeutet, dass ich eine kleine Provision erhalte, wenn ihr über diese Links einkauft. Für euch entstehen dabei keine zusätzlichen Kosten. Die Einnahmen helfen mir, diesen Blog und meinen YouTube-Kanal zu betreiben und weiterhin kostenlose Inhalte für euch zu erstellen. Vielen Dank für eure Unterstützung!

Joachim
Zum Aktivieren der Kommentare musst Du auf 'Kommentare anzeigen' klicken. Ich möchte Dich darauf hinweisen, dass durch die Aktivierung Daten an Disqus übermittelt werden.
Kommentare anzeigen
Erstellt mit Hugo
Theme Stack gestaltet von Jimmy