B+G E-Tech Smartmeter per Modbus + ESPHome

Das hat erst einmal geklappt, Vielen Dank hierfür :slight_smile:

INFO ESPHome 2023.12.5
INFO Reading configuration /config/esphome/ds100.yaml...
INFO Generating C++ source...
INFO Compiling app...
Processing ds100 (board: esp32dev; framework: arduino; platform: platformio/espressif32@5.4.0)
--------------------------------------------------------------------------------
Platform Manager: Installing platformio/espressif32 @ 5.4.0
INFO Installing platformio/espressif32 @ 5.4.0
Downloading  [####################################]  100%
Unpacking  [####################################]  100%          
Platform Manager: espressif32@5.4.0 has been installed!
INFO espressif32@5.4.0 has been installed!
Tool Manager: Installing espressif/toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
INFO Installing espressif/toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
Downloading  [####################################]  100%          
Unpacking  [####################################]  100%

ich habe mir jetzt einen zweiten Zähler besorgt und dem im Konfigurationsmenu die Adresse 0x2 gegeben. Den Code habe ich ChatGPT schreiben lassen.

modbus_controller:
  - id: ds100_mb10
    address: 0x1   ## Adresse des Modbus-Geräts (im Slave-Mode) hier ist es Decimal 1
    modbus_id: modbus1
    setup_priority: -10
    update_interval: 10s  ## Für's Testen sehr häufig, später kann man den Wert runterstellen.
  - id: ds100_mb20
    address: 0x2   ## Adresse des Modbus-Geräts (im Slave-Mode) hier ist es Decimal 2
    modbus_id: modbus1
    setup_priority: -10
    update_interval: 10s  ## Für's Testen sehr häufig, später kann man den Wert runterstellen.

Das funktionierte sofort. Beide Zähler werden ausgelesen.

Das ist ja prima, wo hast du:

wo finde ich dieses Konfigurationsmenü?

Entsprechend Anleitung mit den beiden Touch-Tasten auf dem Zähler in die Tiefen der Einstellungen abtauchen. Gefummel - aber geht. Geht auch mit ner PC Software von B+G. Aber ich hab kein rs485 am Rechner.

Super, das ist ja einfacher als mit esphome so nen Code.
Tja, die Anleitung hab ich bisher nur überflogen, das ist ja genau die Einfachheit die ich gesucht habe.
Danke für den Input.

Huiuiui, da hab ich ja einiges verpasst. Da ist ja richtig eine kleine Community um die DS100 entstanden. Cool das sich noch einige dazu gefunden haben, ich hatte damals nichts zu dem Thema gefunden.

Das kannst du auch machen in dem du eine Firmware auf den ESP flasht wo die Baud auf 0 gesetzt ist und dann die ESP per USB an den Rechner anschließen.

Wichtig ist, dass dann aber für den MAX485 die TX/RX 0/1 genutzt wird. Also die die direkt am CH340 dran hängt.

Gerne, die Multiply-Werte hatte ich für die Rechnungen angesetzt. Manches stimmt nicht zu 100%, ich hab aber aktuell wenig Zeit das gerade zu ziehen. Falls jemand nochmal eine saubere Config hat, dann gerne einmal Pasten.

Hallo Andi.D
Ich hänge mich mal an das Thema dran…
Die Kommunikation per RS485 mit meinen DS100 funktioniert. Nur mit dem INT31 (3+3) Wert für die Spannung (Register 1024 ff) komme ich nicht klar. Wie hast du das gelöst? Ich arbeite aktuell zwar mit Raspberry-Pi + Node-Red, aber das Problem ist ja ein grundsätzliches.
Gruß
Andreas

Moin! Ich hab den Code von networklurk ganz oben übernommen und nie verändert. Hat sofort funktioniert (“S_Dword”).
Insofern kann ich dich da nicht in die richtige Richtung schubsen.
Ewig lange habe ich gebraucht, um herauszufinden, dass mein converter board mit 3,3V Betriebsspannung nicht auskommt, sondern die vollen 5V möchte.
Aber jetzt läuft das mit 3 x ds100 stabil.
Grüße

Dank für deine Rückmeldung. Das Script ist ja deutlich länger als ich erwartet hatte. :thinking:
Da war ich wohl zu überflächlich. Ich werd es mal kopieren und in Ruhe durchsehen.
Gruß
Andreas

Ja das Script ist auch sehr lang, ab 2 Zählern brauchte ich hier einen ESP32. Ein 8266 hat dann nicht mehr lange mitgemacht.

Ich hatte mir das Script jetzt angesehen. Mein Frage ist wie denn die Werte wie:
INT32(6+1) INT32(3+3) INT32(2+3) INT32(5+0) INT16(2+1) INT16(1+3) gelesen und umgesetzt werden damit sie z.B in Node-Red o.ä verarbeitbar sind. Das mit “Zähler auslesen” hatte ich mir viel einfacher vorgestellt :frowning: Ich bin zwar Elektroniker, aber Mathe war nie mein Liebling.

Update:
So. Des Rätsels Lösung: Die Klammerangaben bezeichnen wohl nur die Stellen vor dem Punkt (oder Komma) und dahinter. Was kann das Leben einfach sein…
Das steht nirgends explizit. Aber Eingewehte wissen das. :wink:

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

Ich habe jetzt zwei B+G Smartmeter per Modbus in mein iobroker integriert.
Falls wer Interesse an den tsv Dateien hat, kann sich melden. Ich frage aber nur die Register ab, die mich interessieren.

Hi @Teimue ,
wäre toll wenn du mir einen Auszug aus der tsv Datei zukommen lassen könntest, ich schaffe zwar den Zähler auszulesen, aber die Daten stimmen nicht.
Danke

Das sind meine aktuellen Inputregister. Ich frage 2 DS100 ab!

_address	deviceId	name	description	unit	type	len	factor	offset	formula	role	room	cw	isScale
30271	1	ForwardTotalEnergy	Forward Total Energy	kWh	int32be	2	0,01	0		value		false	false
30281	1	ReverseTotalEnergy	Reverse Total Energy	kWh	int32be	2	0,01	0		value		false	false
31025	1	A-N_PhaseVoltage	A-N Phase Voltage	V	int32be	2	0,001	0		value		false	false
31027	1	B-N_PhaseVoltage	B-N Phase Voltage	V	int32be	2	0,001	0		value		false	false
31029	1	C-N_PhaseVoltage	C-N Phase Voltage	V	int32be	2	0,001	0		value		false	false
31041	1	A_PhaseCurrent	A Phase Current	A	int32be	2	0,001	0		value		false	false
31043	1	B_PhaseCurrent	B Phase Current	A	int32be	2	0,001	0		value		false	false
31045	1	C_PhaseCurrent	C Phase Current	A	int32be	2	0,001	0		value		false	false
31051	1	A_PhasePower	A Phase Power	W	int32be	2	1	0		value		false	false
31053	1	B_PhasePower	B Phase Power	W	int32be	2	1	0		value		false	false
31055	1	C_PhasePower	C Phase Power	W	int32be	2	1	0		value		false	false
31057	1	CombinedPower	Combined Power	W	int32be	2	1	0		value		false	false
31076	1	A_PhaseFrequency	A Phase Frequency	Hz	int16be	1	0,1	0		value		false	false
31077	1	B_PhaseFrequency	B Phase Frequency	Hz	int16be	1	0,1	0		value		false	false
31078	1	C_PhaseFrequency	C Phase Frequency	Hz	int16be	1	0,1	0		value		false	false
30271	2	ForwardTotalEnergy	Forward Total Energy	kWh	int32be	2	0,01	0		value		false	false
30281	2	ReverseTotalEnergy	Reverse Total Energy	kWh	int32be	2	0,01	0		value		false	false
31025	2	A-N_PhaseVoltage	A-N Phase Voltage	v	int32be	2	0,001	0		value		false	false
31027	2	B-N_PhaseVoltage	B-N Phase Voltage	v	int32be	2	0,001	0		value		false	false
31029	2	C-N_PhaseVoltage	C-N Phase Voltage	v	int32be	2	0,001	0		value		false	false
31041	2	A_PhaseCurrent	A Phase Current	A	int32be	2	0,001	0		value		false	false
31043	2	B_PhaseCurrent	B Phase Current	A	int32be	2	0,001	0		value		false	false
31045	2	C_PhaseCurrent	C Phase Current	A	int32be	2	0,001	0		value		false	false
31051	2	A_PhasePower	A Phase Power	W	int32be	2	1	0		value		false	false
31053	2	B_PhasePower	B Phase Power	W	int32be	2	1	0		value		false	false
31055	2	C_PhasePower	C Phase Power	W	int32be	2	1	0		value		false	false
31057	2	CombinedPower	Combined Power	W	int32be	2	1	0		value		false	false
31076	2	A_PhaseFrequency	A Phase Frequency	Hz	int16be	1	0,1	0		value		false	false
31077	2	B_PhaseFrequency	B Phase Frequency	Hz	int16be	1	0,1	0		value		false	false
31078	2	C_PhaseFrequency	C Phase Frequency	Hz	int16be	1	0,1	0		value		false	false
1 „Gefällt mir“

Ich habe es nun dank diesem Beitrag (und mit Hilfe von AI) auch hinbekommen. Hatte ganz schön lange dafür gebraucht. Falls es jemandem hilft, hier meine yaml und welche exakten Komponenten ich benutzt habe.

B+G E-Tech DS100-30B
D1 Mini ESP8266
TTL RS-485

Beide Komponenten habe ich bei makershop.de bestellt

esphome:
  name: waermepumpe
  friendly_name: waermepumpe

esp8266:
  board: d1_mini

logger:
  baud_rate: 0

api:
  encryption:
    key: "deinkey"

ota:
  - platform: esphome
    password: "deinpasswort"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  ap:
    ssid: "Waermepumpe Fallback Hotspot"
    password: "8J2Y0fEyPt9i"

captive_portal:

uart:
  id: mod_bus
  tx_pin: GPIO1
  rx_pin: GPIO3
  baud_rate: 9600
  stop_bits: 1
  data_bits: 8
  parity: NONE

modbus:
  flow_control_pin: D1
  id: modbus1

modbus_controller:
  - id: ds100_mb10
    address: 0x1
    modbus_id: modbus1
    setup_priority: -10
    update_interval: 30s

sensor:
  # Voltages
  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "L1-N Voltage"
    id: voltage_l1
    register_type: read
    address: 0x0400
    value_type: S_DWORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    state_class: measurement
    device_class: voltage
    filters:
      - multiply: 0.001 

  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "L2-N Voltage"
    id: voltage_l2
    register_type: read
    address: 0x0402
    value_type: S_DWORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    state_class: measurement
    device_class: voltage
    filters:
      - multiply: 0.001

  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "L3-N Voltage"
    id: voltage_l3
    register_type: read
    address: 0x0404
    value_type: S_DWORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    state_class: measurement
    device_class: voltage
    filters:
      - multiply: 0.001

  # Currents
  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "L1 Current"
    id: current_l1
    register_type: read
    address: 0x0410
    value_type: S_DWORD
    accuracy_decimals: 2
    unit_of_measurement: "A"
    state_class: measurement
    device_class: current
    filters:
      - multiply: 0.001 

  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "L2 Current"
    id: current_l2
    register_type: read
    address: 0x0412
    value_type: S_DWORD
    accuracy_decimals: 2
    unit_of_measurement: "A"
    state_class: measurement
    device_class: current
    filters:
      - multiply: 0.001

  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "L3 Current"
    id: current_l3
    register_type: read
    address: 0x0414
    value_type: S_DWORD
    accuracy_decimals: 2
    unit_of_measurement: "A"
    state_class: measurement
    device_class: current
    filters:
      - multiply: 0.001

  # Power values
  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "Total Active Power"
    id: total_active_power
    register_type: read
    address: 0x0420
    value_type: S_DWORD
    accuracy_decimals: 0
    unit_of_measurement: "W"
    state_class: measurement
    device_class: power

  # Energy counters
  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "Total Energy"
    id: total_energy
    register_type: read
    address: 0x0122
    value_type: S_DWORD
    accuracy_decimals: 2
    unit_of_measurement: "kWh"
    state_class: total_increasing
    device_class: energy
    filters:
      - multiply: 0.01 

  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "Import Energy"
    id: import_energy
    register_type: read
    address: 0x010E
    value_type: S_DWORD
    accuracy_decimals: 2
    unit_of_measurement: "kWh"
    state_class: total_increasing
    device_class: energy
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: ds100_mb10
    name: "Export Energy"
    id: export_energy
    register_type: read
    address: 0x0118
    value_type: S_DWORD
    accuracy_decimals: 2
    unit_of_measurement: "kWh"
    state_class: total_increasing
    device_class: energy
    filters:
      - multiply: 0.01
1 „Gefällt mir“

Hallo Baz,
ist zwar schon ein Weilchen her, aber … vielleicht stranden andere am gleichen Ufer.
Einfacher ist es, wenn Du die Adressen in Hex verwendest (also 400h anstelle von 31025), die 3 steht nur für den Registertyp (Holding Register) und die 1025 ist die Adresse 400h in dezimaler Schreibweise (4*256 = 1024, also wurde noch zwecks allgemeiner Verwirrung eine eins draufaddiert (Zählung beginnt bei 1, sonst bei 0) - mir ist demzufolge unklar, ob Du überhaupt das richtige Register ausgelesen hast.

address: 0x0400             # Voltage L1
register_type: holding

In der von Dir verlinkten Tabelle ist außerdem die Einheit V angegeben, das ist auch nicht richtig. Das Register enthält die Spannung in mV, deshalb

  accuracy_decimals: 3
  filters:
    - multiply: 0.001

Der Spannungswert ist immer positiv (Leistungen, Ströme dagegen könnten auch negativ sein: Bezug bzw. Einspeisung), deshalb

  value_type: U_DWORD

DWORD bedeutet Doppelwort, also 4 Bytes
U bedeutet unsigned, also ohne Vorzeichen, nur positive Werte
sieht zusammengefasst dann z.B. so aus

sensor:
- platform: modbus_controller
  modbus_controller_id: modbus_ds100
  name: "Voltage L1"
  register_type: holding
  address: 0x0400             # L1
  unit_of_measurement: "V"
  value_type: U_DWORD
  accuracy_decimals: 3
  filters:
    - multiply: 0.001

Hallo Andi,
unter Verwendung zweier Instanzen des modbus_controllers gelingt es auch manche Werte häufiger und andere Werte seltener auszulesen. Den aktuellen Solarüberschuss braucht man z.B. viel häufiger (um Verbraucher zu starten bzw. zu stoppen), als z.B. einen Zählerstand

modbus_controller:
- id: modbus_ds100_technik
  address: 0x1            # Adresse des Modbus-Slaves 
  modbus_id: modbuszaehler
  setup_priority: -10  
  update_interval: 300s
  
- id: modbus_ds100_technik_fast
  address: 0x1            # Adresse des Modbus-Slaves 
  modbus_id: modbuszaehler
  setup_priority: -10  
  update_interval: 10s  

Bei den Sonsoren bezieht man sich dann einfach auf die jeweilige Modbus_Controller-Instanz

- platform: modbus_controller
  modbus_controller_id: modbus_ds100_technik_fast
  name: "Technik Power Total"
  register_type: read
  address: 0x0420           # Combined
  value_type: S_DWORD
  accuracy_decimals: 0
  unit_of_measurement: "W"
  state_class: measurement
  device_class: power

- platform: modbus_controller
  modbus_controller_id: modbus_ds100_technik
  name: "Technik Bezug Total"
  register_type: read
  address: 0x010E
  value_type: S_DWORD
  accuracy_decimals: 2
  unit_of_measurement: "kWh"
  state_class: measurement
  device_class: energy
  filters:
    - multiply: 100

weiter Frohes Schaffen! :wink:
Solarix

Hey,
das ist nett, dass du das teilst. Ich habe meine drei DS100 jetzt allerdings stabil laufen mit Abfrage aller 3 Zählerstände und Momentanleistungen alle 90s … und das fass ich nicht mehr an :wink:
Dazu laufen die 7 S0-Bus Zähler, die ebenso abgefragt werden zu unzuverlässig. :roll_eyes:
besten Gruß

@Solarix:
Danke für deine Antwort, aber ich habe mich ein Jahr nicht mehr darum gekümmert, drum muss ich mich neu in das Thema einarbeiten.