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
- Der Aufruf liefert in meinem Fall
UDev Regeln für einen stabilen Device Symlink
- 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 perlsusb
). - Mit
udevadm control --reload-rules && udevadm trigger
die Regeln neu laden und prüfen ob der Symlink erstellt wurde.
EVCC installieren
- Installation wie unter Debian, Ubuntu, Raspberry Pi | evcc - Sonne tanken ☀️🚘 beschrieben.
- Config anlegen
evcc configure
- Sponsortoken erstellen: Sponsorship | evcc - Sonne tanken ☀️🚘
- Aktuelle Config (Stand 06/2023)
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
```