
Der Marstek Venus lässt sich ja sehr gut mit dem Shelly betreiben, wie ich in einem vorherigen Beitrag schon beschrieben habe. Was allerdings bislang nur über die App einsehbar ist, ist z.B. der Ladestand der Batterie. Gerade diesen Wert möchte ich in openHAB sehen, um auf die App verzichten zu können und die Werte auch in Automatisierungen verwenden zu können.
Was braucht es?
- Marstek-Speicher Venus
- Wavshare RS232/485/422 to ETH Modul mit POE (oder das Modell ohne POE), POE-Stromversorgung oder ein passendes Netzteil in der Range 6V-36V
- Kabeladapter für die 6PIN-Stecker (außer, man möchte das Originalkabel des Venus aufschneiden)
- Die bestehende openHAB 4.x-Instanz
Einrichten des Waveshare Modbus TCP – Adapters
Der Waveshare wird einfach ans Netz angeschlossen, mit Strom versorgt und ab da holt er sich eine IP-Adresse er DHCP.
Für die RS485-Schnittstelle braucht es beim Waveshare für den Venus grundsätzlich folgende Einstellungen:
- Baud-Rate: 115.200
- Data-Bits: 8
- Parität: Keine
- Stopp-Bit: 1
- Flusskontrolle: Keine
Zur Konfiguration gibt es eine eigene Software, die aber nicht zwingend benötigt wird. Die hilft aber bei Bedarf durchaus beim Auffinden des Waveshares im Netzwerk. Der Waveshare selbst bringt einen Webserver mit einer kleinen GUI mit, auf der man auch alles nötige einstellen kann. Dieser läuft auf Port 80, dem regulären Webserver-Port, und erscheint nach Eingabe der IP im Browser.
Folgende Einstellungen sind für den Venus nötig – IP natürlich abhängig von den IPs deines Netzwerks (eine statische IP zu vergeben ist allein schon wegen der späteren openHAB-Einbindung sinnvoll):

Alternativ könnt ihr auch die Waveshare-Konfigurationssoftware VirCom nutzen
Ein Download-Link befindet sich im Waveshare-Wiki z.B. unter https://www.waveshare.com/wiki/RS485_TO_ETH_(B). Dateien einfach entpacken und VirCom starten. Nach Klick auf „Device“ zeigt er euch den Waveshare an und ihr könnt die Einstellungen auch in der GUI vornehmen:


Verkabelung und Anschließen Waveshare-Adapter an Marstek Venus
Für das (mitgelieferte) RS485-Adapterkabel des Speicher gibt es herstellerseitig keine große Doku. Von daher habe ich mich auf diesen Forenbeitrag bei tweakers.net gestützt, welcher aufzeigt, welcher der PINS welche Funktion hat.
Kurz zusammengefasst: Wenn man auf den Stecker des Marstek schaut, der an den Marstek angeschlossen wird, und die weiße Markierung oben rechts ist, dann ist die Belegung der PINs ab der weißen Markierung im Uhrzeigersinn: GND, +5V, Data GND, B, A.

Um nicht die das originale RS485-Kabel von Marstek aufschneiden bzw. generell modifizieren zu müssen, habe ich mir einen Adapter gekauft, der (2.54 XH 6 Pin, female). Man kann diese Kabel auch viel günstiger direkt aus China ordern, aber wegen 5-6 € Ersparnis wollte ich keine Wochen Lieferzeit abwarten.
Ich habe sicherheitshalber bei mir die Kabelenden im Adapter gegenüber der PINs des Kabels nochmal durchgemessen und komme auf nachfolgende Verteilung. Ich vermute, die Verteilung ist bei jedem Kabel gleich – würde es aber empfehlen, das lieber nochmal durchzumessen.

Am Waveshare selbst wird dann wie folgt angeschlossen:
Marstek-Kabel | Waveshare-Adapter / Screwterminal |
A | TA |
B | TB |
Data GND | PW |
+5V, GND | Kein Anschluss (Waveshare benötigt >5V Betriebsspannung, daher externes Netzteil oder POE nötig) |

Registerbelegung Marstek Venus Speicher
An dieser Stelle verweise ich auf die Register, die der Hersteller auch als PDF veröffentlicht hat. Ich werde mir hier später die nötigen Register, die ich tatsächlich nutzen will, heraussuchen:
Einrichtung in openHAB
Um in openHAB Register auslesen bzw. schreiben zu können, ist zuerst die Installation des „Modbus Binding“ via Add-on-Store nötig.
Als erstes muss dann der Waveshare selbst als Gerät (Thing) eingebunden werden.
Dazu Thing hinzufügen, Modbus Binding und Modbus TCP Slave auswählen.
Nachfolgend die Einstellungen des Things (Modbus TCP Slave) als Code.
UID: modbus:tcp:venus-waveshare
label: Marstek Venus Waveshare Modbus Gateway
thingTypeUID: modbus:tcp
configuration:
connectMaxTries: 2
reconnectAfterMillis: 1000
timeBetweenTransactionsMillis: 1000
receiveTimoutMillis: 1000
rtuEncoded: false
port: 502
timeBetweenReconnectMillis: 1000
connectTimeoutMillis: 10000
host: 192.168.1.14
afterConnectionDelayMillis: 1000
timeoutMillis: 8000
id: 1
enableDiscovery: false
Anschließend ist es nötig, auch die Abfragen auf die Register zu ermöglichen. Hierzu wird ein weiteres Thing (Regular Poll) eingebunden, um einen Poller zu registrieren.
Nachfolgender Code liest alle 5 Sekunden beispielhaft die Register 32100-32104 (battery voltage, battery current, battery power, battery SOC) aus.
UID: modbus:poller:venus-waveshare:venus-holding-registers
label: Marstek Venus Modbus Holding Register
thingTypeUID: modbus:poller
configuration:
start: 32100
length: 5
refresh: 5000
maxTries: 3
cacheMillis: 50
type: holding
bridgeUID: modbus:tcp:venus-waveshare
Um dann auch die konkreten Werte nutzen zu können braucht es je Wert ein weiteres Thing (Modbus Data), z.B. hier für den SOC-Wert (Ladezustand) des Akkus. Der Datentyp muss dem des PDF entsprechen. Die vielen Channels verwirren ggf. zwar zuerst (für mich war das die erste modbus-Nutzung überhaupt), sind aber nur Darstellung des jeweils gleichen, im Register vorhandenen Wertes in den bei openHAB insgesamt vorhandenen Datentypen. Braucht man den Wert (wie beim SOC) als Wert zwischen 0 und 100, ist z.B. der Dimmer-Type der richtige.
UID: modbus:data:venus-holding-registers:soc
label: Venus Batterie SOC
thingTypeUID: modbus:data
configuration:
readValueType: uint16
readTransform: default
writeTransform: NONE
offset: 0
readStart: "32104"
valueType: uint16
dataType: 2bytes_int
updateUnchangedValuesEveryMillis: 1000
start: 1
writeMultipleEvenWithSingleRegisterOrCoil: false
writeMaxTries: 3
bridgeUID: modbus:poller:venus-waveshare:venus-holding-registers
channels:
- id: number
channelTypeUID: modbus:number-type
label: Value as Number
description: Number item channel
configuration: {}
- id: switch
channelTypeUID: modbus:switch-type
label: Value as Switch
description: Switch item channel
configuration: {}
- id: contact
channelTypeUID: modbus:contact-type
label: Value as Contact
description: Contact item channel
configuration: {}
- id: dimmer
channelTypeUID: modbus:dimmer-type
label: Value as Dimmer
description: Dimmer item channel
configuration: {}
- id: datetime
channelTypeUID: modbus:datetime-type
label: Value as DateTime
description: DateTime item channel
configuration: {}
- id: string
channelTypeUID: modbus:string-type
label: Value as String
description: String item channel
configuration: {}
- id: rollershutter
channelTypeUID: modbus:rollershutter-type
label: Value as Rollershutter
description: Rollershutter item channel
configuration: {}
- id: lastReadSuccess
channelTypeUID: modbus:last-successful-read-type
label: Last Successful Read
description: Date of last read
configuration: {}
- id: lastReadError
channelTypeUID: modbus:last-erroring-read-type
label: Last Erroring Read
description: Date of last read error
configuration: {}
- id: lastWriteSuccess
channelTypeUID: modbus:last-successful-write-type
label: Last Successful Write
description: Date of last write
configuration: {}
- id: lastWriteError
channelTypeUID: modbus:last-erroring-write-type
label: Last Erroring Write
description: Date of last write error
configuration: {}
Zu guter Letzt muss nun der jeweils benötigte Channel mit einem Item (mit passendem Datentyp) verknüpft werden. Schon steht dann als Item z.B. der State of Charge zur Verfügung:

Nächstes Ziel ist nun die Anbindung aller nötigen Register in openHAB sowie auch ein Umsetzen einer Steuerung des Speichers in openHAB.
Dazu aber später ggf. separat mehr.
Ich hatte die Pin-Belegung gesucht, Danke für deinen tollen Artikel !
Super Anleitung, bekomme die Werte in openhab, jedoch immer mal wieder mit ReadTimeOuts im Log. Eine Idee, woran das liegen könnte?
Tatsächlich geht es mir ähnlich. Festgestellt habe ich, dass wenn zu viele Register auf einmal angefragt werden sollen, das Zusammenspiel nicht mehr passt. Daher habe ich immer nur Gruppen für die Werte gebildet, die ich wirklich brauche. Trotz manchmal aufkommender Timeouts im Log – da geht es mir ähnlich wie Dir – werden aber die Werte dennoch verlässlich schnell aktualisiert.
Danke dir für die Info! Bin ich wenigstens nicht allein.. 😊 Ich werde mal probieren, ob ich an den abfragen der Things noch etwas optimieren kann..
Hi nochmal.. Habe das Modbus Binding nun wie folgt angepasst:
UID: modbus:tcp:venus-waveshare
label: Marstek Venus Waveshare Modbus Gateway
thingTypeUID: modbus:tcp
configuration:
connectMaxTries: 2
reconnectAfterMillis: 1000
timeBetweenTransactionsMillis: 1000
receiveTimoutMillis: 1000
rtuEncoded: false
port: 502
timeBetweenReconnectMillis: 1000
connectTimeoutMillis: 10000
host: 192.168.178.30
afterConnectionDelayMillis: 1000
timeoutMillis: 8000
id: 1
enableDiscovery: false
Habe nun seit mehreren Stunden keine Einträge mehr im Log und scheint bislang ohne Auffälligkeiten zu funktionieren. Vielleicht kannst du das ja verifizieren.. 🙂
Gruß Rene
Besten Dank für deinen Input, das scheint so gut zu laufen. Ich habe das angepasst!
Hi, hast du es schon geschafft die anderen Werte über Modbus auszulesen und könntest deine openHAB Config dafür teilen? Besonders würden mich die 35000er Temperaturwerte (zur Ansteuerung eines externen Lüfters) und 33000er Energiewerte interessieren, da scheitere ich aber mit meinen trivialen Modbus Kenntnissen.
Besten Dank 🙂
Hallo,
ja, auf die gleiche Art und Weise.
schau immer auch ins Logfile, habe festgestellt wenn zu viele Register auf einmal ausgelesen werden macht er irgendwann nicht mehr das, was er machen sollte, daher lieber „kleine häppchen“ jeweils als Thing für den poller.
35-er Werte, thing:
UID: modbus:poller:venus-waveshare:venus-holding-registers-35000-35011
label: Marstek Venus Modbus Holding Register 35000-35003
thingTypeUID: modbus:poller
configuration:
start: 35000
length: 3
refresh: 500
maxTries: 3
cacheMillis: 50
type: holding
bridgeUID: modbus:tcp:venus-waveshare
Thing der Temperatur:
UID: modbus:data:venus-holding-registers-35000-35011:venus_temperature_internal
label: Venus Temperatur intern
thingTypeUID: modbus:data
configuration:
readValueType: int16
readTransform: default
writeTransform: default
readStart: „35000“
updateUnchangedValuesEveryMillis: 1000
writeMultipleEvenWithSingleRegisterOrCoil: false
writeMaxTries: 3
bridgeUID: modbus:poller:venus-waveshare:venus-holding-registers-35000-35011
channels:
– id: number
channelTypeUID: modbus:number-type
label: Value as Number
description: Number item channel
configuration: {}
– id: switch
channelTypeUID: modbus:switch-type
label: Value as Switch
description: Switch item channel
configuration: {}
– id: contact
channelTypeUID: modbus:contact-type
label: Value as Contact
description: Contact item channel
configuration: {}
– id: dimmer
channelTypeUID: modbus:dimmer-type
label: Value as Dimmer
description: Dimmer item channel
configuration: {}
– id: datetime
channelTypeUID: modbus:datetime-type
label: Value as DateTime
description: DateTime item channel
configuration: {}
– id: string
channelTypeUID: modbus:string-type
label: Value as String
description: String item channel
configuration: {}
– id: rollershutter
channelTypeUID: modbus:rollershutter-type
label: Value as Rollershutter
description: Rollershutter item channel
configuration: {}
– id: lastReadSuccess
channelTypeUID: modbus:last-successful-read-type
label: Last Successful Read
description: Date of last read
configuration: {}
– id: lastReadError
channelTypeUID: modbus:last-erroring-read-type
label: Last Erroring Read
description: Date of last read error
configuration: {}
– id: lastWriteSuccess
channelTypeUID: modbus:last-successful-write-type
label: Last Successful Write
description: Date of last write
configuration: {}
– id: lastWriteError
channelTypeUID: modbus:last-erroring-write-type
label: Last Erroring Write
description: Date of last write error
configuration: {}
Item der Temperatur dann auf Channel „Value as Number“ verlinkt:
label: Venus Temperatur intern
type: Number
category: temperature_hot
groupNames:
– gruppePVSpeicherShellyVenus
– pvspeicher
tags:
– Point
– Temperature
Hat geklappt, vielen Dank für deine Config!
Danke
Hallo,
tolles Projekt. Welchen Kabeladapter hast Du genutzt? Habe meinen Speicher noch nicht, ist das nicht ein Kabel mit 5 Pins?
Glaube der Amazon Link passt nicht mehr ganz. https://amzn.to/4lO7zIj aber da die mit 5 Pins.
Habe noch welche über, falls du Interesse hast mit eins abzunehmen Gib Bescheid (Email im Impressum)