hoe aansluiten Emat kWh meter (dds353H) op modbus

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • MrScratch
  • Registratie: December 2001
  • Laatst online: 02-07 13:44

MrScratch

I am rubber, you are glue

Topicstarter
Ik heb een Emat kWh meter van type dds353H-2 https://www.elektramat.nl...-modbus-mid-5282/#details. Deze werkt en op het display zie ik de gemeten waardes langskomen. Nu wil ik dit graag op home-assistant aansluiten dmv modbus/rs485.

Hiervoor heb ik een USB to modbus converter. Ik heb de A en B polen van zowel de converter als de kWh-meter aangesloten. Het USB apparaat wordt netjes herkend onder /dev/ttyUSB1.

Nu heb ik eerst geprobeerd het in Home Assistant te configureren, door de tips op https://community.home-as...-meter-with-modbus/218241 te volgen.

In configuration.yaml heb ik de modbus config gezet:
code:
1
2
3
4
5
6
7
8
9
modbus:
  name: hub1
  type: serial
  method: rtu
  port: /dev/ttyUSB1
  baudrate: 9600
  stopbits: 1
  bytesize: 8
  parity: E


in sensor.yaml heb ik de info voor de sensors zelf gezet.
code:
1
2
3
4
5
6
7
8
9
  - platform: modbus
    registers:
      - name: car_voltage
        hub: hub1
        slave: 1
        register: 305
        scale: 0.01
        unit_of_measurement: v
        precision: 1

Na een restart van HA, zie ik echter geen foutmeldingen in de logs, maar ook geen devices in de configuratie. Ik heb niet echt een idee hoe dit verder te debuggen.

Nu dacht ik eerst maar eens van de commandline te proberen om contact te leggen. Hiervoor vond ik
mbpoll
https://github.com/epsilonrt/mbpoll waarmee het mogelijk moet zijn om met modbus devices te communiceren.

Ik kom er niet helemaal uit hoe ik ervoor zorg dat deze het register 305 (die staat hierboven in de sensor code) wil proberen uit te lezen. Ik krijg telkens ERROR Illegal data address.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
peter@raspberrypi:~ $ sudo mbpoll -a 1 -m rtu -b 9600 -v /dev/ttyUSB1
debug enabled
Set device=/dev/ttyUSB1
mbpoll 1.4-12 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.

Opening /dev/ttyUSB1 at 9600 bauds (E, 8, 1)
Set response timeout to 1 sec, 0 us
Protocol configuration: Modbus RTU
Slave configuration...: address = [1]
                        start reference = 1, count = 1
Communication.........: /dev/ttyUSB1,       9600-8E1
                        t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, output (holding) register table

-- Polling slave 1... Ctrl-C to stop)
[01][03][00][00][00][01][84][0A]
Waiting for a confirmation...
<01><83><02><C0><F1>
ERROR Illegal data address
Read output (holding) register failed: Illegal data address


Nu zit ik een beetje vast. Iemand die mij kan adviseren hoe ik dit het beste kan debuggen?

Look behind you! A three headed monkey!


Acties:
  • 0 Henk 'm!

  • AUijtdehaag
  • Registratie: Oktober 2006
  • Niet online
Moet er geen scan_interval tussen?

https://community.home-as...pe-and-structure/234655/6
YAML:
1
2
3
4
5
6
7
8
9
10
  - platform: modbus
    scan_interval: 10
    registers:
      - name: car_voltage
        hub: hub1
        slave: 1
        register: 305
        scale: 0.01
        unit_of_measurement: v
        precision: 1


(gokje hoor, ik doe alles met een esp en max485 naar ttl module en niet direkt in HA)

PVOutput Github - Div ESP TK: MHI - Clack - Marstek


Acties:
  • 0 Henk 'm!

  • MrScratch
  • Registratie: December 2001
  • Laatst online: 02-07 13:44

MrScratch

I am rubber, you are glue

Topicstarter
AUijtdehaag schreef op maandag 7 november 2022 @ 16:00:
Moet er geen scan_interval tussen?

https://community.home-as...pe-and-structure/234655/6
YAML:
1
2
3
4
5
6
7
8
9
10
  - platform: modbus
    scan_interval: 10
    registers:
      - name: car_voltage
        hub: hub1
        slave: 1
        register: 305
        scale: 0.01
        unit_of_measurement: v
        precision: 1


(gokje hoor, ik doe alles met een esp en max485 naar ttl module en niet direkt in HA)
Dank voor de tip. In de link die je meestuurt staat veel interessante info.

Het scan interval is standaard 10, meende ik uit de documentatie te kunnen afleiden, dus dat zou betekenen dat deze optie niet perse hoeft worden toegevoegd.

Look behind you! A three headed monkey!


Acties:
  • 0 Henk 'm!

  • MrScratch
  • Registratie: December 2001
  • Laatst online: 02-07 13:44

MrScratch

I am rubber, you are glue

Topicstarter
Ik ben aan het verder worstelen gegaan. Inmiddels ben ik met de tool mbrtu (ModBus RTU) aan het proberen registers uit te lezen.

Verdergaand op het de car_voltage die op register 305 zou moeten zitten, is dit volgens mij de volgende code:
code:
1
2
3
mbrtu -d /dev/ttyUSB1 -P -a1 -f3 -tuint64 -n4 -r305

ADDR=1 REG=773 ERROR: Illegal data address


Dus dat lijkt niet te werken. In het script https://github.com/psy0rz...709c896bc8fd463ee4/ytl.py waar in de home assistent configuratie naar verwezen wordt, heb ik een aantal regels met registers gevonden
code:
1
2
3
4
5
6
7
8
9
                        "Frequency": rs485.read_register(0x130, number_of_decimals=2),
                        "V1": rs485.read_register(0x131, number_of_decimals=2),
                        "I1": float(rs485.read_long(0x139))/1000,
                        "P1": rs485.read_long(0x140),
                        "Q1": rs485.read_long(0x148),
                        "S1": rs485.read_long(0x150),
                        "PF1": rs485.read_register(0x158,number_of_decimals=3),
                        "TA": float(rs485.read_long(0xA000))/100,
                        "TR": float(rs485.read_long(0xA01E))/100,

Deze registers die met 0x beginnen, corresponderen kennelijk met de 305 uit de home assistent configuratie, want als ik dit doe:
code:
1
2
peter@raspberrypi:~ $ mbrtu -d /dev/ttyUSB2 -P -a1 -f3 -tuint64 -n4 -r0x131
ADDR=1 REG=305 ERROR: Illegal data address

Dan zie je dat 0x131 overeenkomt met 305 (REG=305). Maar deze geeft geen waarde terug.

Er is er echter 1 uit het bovenstaande script die wel een waarde teruggeeft, namelijk 0xA000.
code:
1
2
peter@raspberrypi:~ $ mbrtu -d /dev/ttyUSB2 -P -a1 -f3 -tuint64 -n4 -r0xA000
1 40960 243447336328554


Dus 0xA000 is gelijk aan 40960 uit de Home Assistant configuratie. Het getal wat ik terugkrijg is echter mij niet duidelijk wat het betekent.

Stapje voor stapje iets verder, maar heel erg goed lukken wil het voorlopig nog niet.

Look behind you! A three headed monkey!


Acties:
  • 0 Henk 'm!

  • natural colour
  • Registratie: April 2022
  • Laatst online: 18:06
Het kost je veel energie om energie te kunnen registreren... ik zie voorlopig ook af om extra KWh meters te plaatsen, de Wifi meters die ik eerst op het oog had werken denk ik niet door een stalen groepenkast.

20x JA Solar 6.9KW; Fronius Symo 7.0; Panasonic 7H Mono; Atlantic Explorer V4; https://www.astrobin.com/users/naturalcolor/


Acties:
  • +3 Henk 'm!

  • MrScratch
  • Registratie: December 2001
  • Laatst online: 02-07 13:44

MrScratch

I am rubber, you are glue

Topicstarter
Ik denk dat ik achteraf gezien makkelijker de Eastron SDM120 had kunnen kopen. Daar is een kant en klaar script voor om het uit te lezen.

Maar niet getreurd, het is me gelukt. Ik ben best wel trots dat het gelukt is. Ik heb via https://www.carrel-electr...ucers/pdf/dds353h2mbr.pdf een tabel gevonden met de datatypes
Afbeeldingslocatie: https://tweakers.net/i/H6aU3UU8mLteR8mdN9tW1IPZ9_g=/800x/filters:strip_icc():strip_exif()/f/image/UtBasenOYOxra2R55PD568z8.jpg?f=fotoalbum_large
Alleen klopten de Register addressen niet. Maar ik vond op een andere site https://www.aggsoft.com/s...ds353h-5281-5282-5283.htm juist weer de goede registernummers. Door beide informatiebronnen te combineren is het me gelukt om een lijst van mbrtu commando's te fabriceren waarmee ik deze info kan uitlezen.
Afbeeldingslocatie: https://tweakers.net/i/BprriGWw_AgZnNh-mt1rTdFJBUw=/800x/filters:strip_icc():strip_exif()/f/image/Fed4195xh2PraCY2qjKmUQP1.jpg?f=fotoalbum_large
:*) _/-\o_

Look behind you! A three headed monkey!


Acties:
  • 0 Henk 'm!

  • Venxir
  • Registratie: Augustus 2001
  • Laatst online: 17:43
Modus Registers hebben een specifieke indeling per input, output, nog iets en holding registers. Elke registergroep heeft een offset van 10000, dus input begint op 10000 en de volgende op 20000, uiteindelijk zijn de holding registers meestal waar je je data uit haalt dus 40000 als startadres, in jouw geval dus 40000 + 305 uit de handleiding. Nog leuke is dat elke registergroep zijn eigen modus read functioncode gebruikt.

[ Voor 10% gewijzigd door Venxir op 15-11-2022 08:18 ]

If it aint broke, fix it till it is!


Acties:
  • 0 Henk 'm!

  • MrScratch
  • Registratie: December 2001
  • Laatst online: 02-07 13:44

MrScratch

I am rubber, you are glue

Topicstarter
Venxir schreef op dinsdag 15 november 2022 @ 08:16:
Modus Registers hebben een specifieke indeling per input, output, nog iets en holding registers. Elke registergroep heeft een offset van 10000, dus input begint op 10000 en de volgende op 20000, uiteindelijk zijn de holding registers meestal waar je je data uit haalt dus 40000 als startadres, in jouw geval dus 40000 + 305 uit de handleiding. Nog leuke is dat elke registergroep zijn eigen modus read functioncode gebruikt.
Kan het zijn dat het startadres 40001 is? Als ik de twee lijsten met elkaar vergelijk blijkt dat 304 overeenkomt met 40305, dus 40001 verschil. Dat verschil is er precies voor alle items. Behalve de laatste 2, daar is het verschil 400001.

Look behind you! A three headed monkey!


Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 13:10
MrScratch schreef op dinsdag 15 november 2022 @ 09:19:
[...]

Kan het zijn dat het startadres 40001 is? Als ik de twee lijsten met elkaar vergelijk blijkt dat 304 overeenkomt met 40305, dus 40001 verschil. Dat verschil is er precies voor alle items. Behalve de laatste 2, daar is het verschil 400001.
Afbeeldingslocatie: https://tweakers.net/i/GAu4BuOZkOp1m5wbmazen7RkB9Q=/x800/filters:strip_icc():strip_exif()/f/image/Qs7dZU0TGxi3lNd2P7lAsa96.jpg?f=fotoalbum_large
Deze heb ik gebruikt en als je 06H gebruikt dan schrijf je bijvoorbeeld modbus adress.
Als je 03 gebruikt dan lees je het register.
Verder in python minimalmodbus gebruikt, dan commando's gemaakt en verstuurd.
Werkte uiteindelijk ook.

Acties:
  • 0 Henk 'm!

  • Venxir
  • Registratie: Augustus 2001
  • Laatst online: 17:43
MrScratch schreef op dinsdag 15 november 2022 @ 09:19:
[...]

Kan het zijn dat het startadres 40001 is? Als ik de twee lijsten met elkaar vergelijk blijkt dat 304 overeenkomt met 40305, dus 40001 verschil. Dat verschil is er precies voor alle items. Behalve de laatste 2, daar is het verschil 400001.
Ja, sommige fabrikanten beginnen met tellen bij 0(base 0) en anderen bij 1(base 1) hierdoor krijg je soms verschuivingen.

Wat @Dapdodo trouwens zegt klopt ook maar de adressen staan in hexadecimaal, daarom staat er H achter elk adres.

130 Hex is namelijk 304 decimaal ;).

If it aint broke, fix it till it is!


Acties:
  • +1 Henk 'm!

  • MrScratch
  • Registratie: December 2001
  • Laatst online: 02-07 13:44

MrScratch

I am rubber, you are glue

Topicstarter
Ik ben volgens mij on-a-roll, want inmiddels ook de configuratie in Home Assistant voor elkaar gekregen. Bestuderen van de Modbus documentatie en met het voorheen geleerde is het allemaal niet zo moeilijk meer.

code:
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
# modbus
modbus:
  - name: heatpump
    type: serial
    method: rtu
    port: /dev/ttyUSB-heatpump
    baudrate: 9600
    stopbits: 1
    bytesize: 8
    parity: E
    sensors:
      - name: heatpump_voltage
        scan_interval: 60
        slave: 1
        data_type: uint16
        address: 305
        count: 1
        scale: 0.01
        unit_of_measurement: V
        unique_id: kWhmeter_hp_v
        device_class: voltage
      - name: heatpump_power
        scan_interval: 60
        slave: 1
        data_type: int32
        address: 320
        count: 2
        scale: 1
        unit_of_measurement: W
        unique_id: kWhmeter_hp_W
        device_class: power


Eind goed al goed. :)

Look behind you! A three headed monkey!


Acties:
  • 0 Henk 'm!

  • hiddepl
  • Registratie: Maart 2017
  • Laatst online: 28-01-2024
Via mijn modbus naar usb adapter, kan ik de Emat Kwh uitlezen. Mede dankzij eerder vermelde informtatie.

Nu wil ik meerder Kwh meters aan één modbus usb adapter koppelen. Nu moet ik wel mijn meter ID veranderen, zodat ze niet allemaal hetzelfde adres hebben.
Hebben jullie ervaring hoe dit moet?

Groet Hidde Plantinga

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 13:10
hiddepl schreef op zondag 25 december 2022 @ 22:15:
Via mijn modbus naar usb adapter, kan ik de Emat Kwh uitlezen. Mede dankzij eerder vermelde informtatie.

Nu wil ik meerder Kwh meters aan één modbus usb adapter koppelen. Nu moet ik wel mijn meter ID veranderen, zodat ze niet allemaal hetzelfde adres hebben.
Hebben jullie ervaring hoe dit moet?

Groet Hidde Plantinga
Hoe ik het heb gedaan:
1 voor 1 aan de raspberry pi gehangen en met minimalmodbus eerst gezorgd dat ik hem uit kon lezen.
In python de volgende code gebruikt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   instrument = minimalmodbus.Instrument('/dev/ttyUSB0', slaveaddress=slave_address, mode='rtu', close_port_after_each_call=True, debug=True)
    instrument.serial.baudrate = 9600
    instrument.serial.bytesize = 8
    instrument.serial.parity = minimalmodbus.serial.PARITY_EVEN
    instrument.serial.stopbits = 1
    instrument.serial.timeout = 0.5

    #print(minimalmodbus._get_diagnostic_string())
    #3 fase: omzetten van Meter ID naar 2 (registeradress,value,number_of_decimals,functioncode,signed)
    #print(instrument.write_register(2,4,0,6,False)) #geeft wel een error, maar dat klopt.
    #print (instrument.read_register(2,0,3)) #MeterID (registeradress, number_of_decimals, functioncode)
    #1 fase meters:
    #address 0x110, MeterID=7, 0 decimalen, write, False
    #print(instrument.write_register(0x110,7,0,0x10,False)) #geeft wel een error, maar dat klopt.

Even opletten dat je de juiste uncomment
Na het schrijven, gaan alle leesacties in de fout, tot je het nieuwe adres ingeeft.
Zo heb ik er nu een 5 tal ophangen. Daarna ook de tijd tussen schakelen van verschillende meters tunen.
Maar dat kan aan minimalmodbus liggen, want 2 objecten die beide "tegelijk" willen lezen ging fout.
Moest wel achter elkaar.
Pagina: 1