Marstek Venus mit via modbus an openHAB anbinden

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?

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

Web-GUI zur Konfiguration des Waveshare-Adapters

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:

VirCom-Konfiguration, Anzeige gefundener Waveshare-Adapter
VirCom-Konfiguration, Anpassung eines gefundenen Waveshare-Adapters

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.

Stecker des Marstek, nach Durchmessen beschriftet, von links nach rechts: GND, +5V, DATA GND, B, A.

Am Waveshare selbst wird dann wie folgt angeschlossen:

Marstek-KabelWaveshare-Adapter / Screwterminal
ATA
BTB
Data GNDPW
+5V, GNDKein 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:
  rtuEncoded: false
  timeBetweenTransactionsMillis: 60
  connectMaxTries: 1
  reconnectAfterMillis: 0
  port: 502
  timeBetweenReconnectMillis: 0
  host: 192.168.1.14
  connectTimeoutMillis: 10000
  afterConnectionDelayMillis: 0
  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:

Beispielhaft SOC (State of Charge) des Akkus im 12h-Verlauf)

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..

Durch die weitere Nutzung der Seite wird der Verwendung von Cookies und den Inhalten der Datenschutzerklärung zugestimmt. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen