Modbus Sensor Help

Hi, I’m trying to bring three temperature and humidity modbus RS485 sensors into HA through ESPhome. I’ve been able to read these sensors from a PC using a USB-serial adapter and a modbus adapter, and CAS Modbus Scanner. However, on my ESP32 the sensor values remain solidly unknown.

Looking at the logs it appears that the ESP sends the right request to the sensors, but ignores the responses. It also looks as though the response is limited to the senors values, omitting device address, function code and CRC. The sensors are meant to return temperature in C *10 (e.g 206 for 20.6C) and humidity in a similar format. So the bytes that come back are not implausible as actual sensor values.

I’ve tried the obvious things I can think of - swapping RX and TX in case I screwed that up, comparing what the ESP sends to what CAS Modbus Scanner sent (similar, but not identical - the ESP merges the separate requests for temperature and humidity into one).

The YAML looks like this:

modbus:
  #flow_control_pin: 5
  id: modbus1

modbus_controller:
  - id: mod_bus_A
    ## the Modbus device addr
    address: 0x1
    modbus_id: modbus1
    setup_priority: -10

  - id: mod_bus_B
    ## the Modbus device addr
    address: 0x2
    modbus_id: modbus1
    setup_priority: -10

  - id: mod_bus_C
    ## the Modbus device addr
    address: 0x3
    modbus_id: modbus1
    setup_priority: -10


sensor:
  - platform: modbus_controller
    modbus_controller_id: mod_bus_A
    name: "Attic Therm 1"
    id: mbs_therm_1
    register_type: read
    address: 0001
    unit_of_measurement: "C"
    response_size: 1
    accuracy_decimals: 0
    skip_updates: 1
    filters:
      - multiply: 0.1


  - platform: modbus_controller
    modbus_controller_id: mod_bus_A
    name: "Attic Humidity 1"
    id: mbs_rh_1
    register_type: read
    value_type: S_WORD

    address: 0002
    unit_of_measurement: "%"
    response_size: 1
    accuracy_decimals: 0
    skip_updates: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: mod_bus_B
    name: "Attic Therm 2"
    id: mbs_therm_2
    register_type: read
    value_type: S_WORD

    address: 0x0001
    unit_of_measurement: "C"
    response_size: 1
    accuracy_decimals: 0
    skip_updates: 1
    filters:
      - multiply: 0.1


  - platform: modbus_controller
    modbus_controller_id: mod_bus_B
    name: "Attic Humidity 2"
    id: mbs_rh_2
    register_type: read
    address: 0x0002
    unit_of_measurement: "%"
    response_size: 1
    accuracy_decimals: 0
    skip_updates: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: mod_bus_C
    name: "Attic Therm 3"
    id: mbs_therm_3
    register_type: read
    address: 0001
    unit_of_measurement: "C"
    response_size: 1
    accuracy_decimals: 0
    skip_updates: 1
    filters:
      - multiply: 0.1


  - platform: modbus_controller
    modbus_controller_id: mod_bus_C
    name: "Attic Humidity 3"
    id: mbs_rh_3
    register_type: read
    address: 0002
    unit_of_measurement: "%"
    response_size: 1
    accuracy_decimals: 0
    skip_updates: 1
    filters:
      - multiply: 0.1

and the logs for the modbus stuff look like this:

[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Attic Therm 1'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: ''
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'C'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[17:23:46][V][modbus_controller:036]: Sending next modbus command to device 2 register 0x01 count 2
[17:23:46][V][modbus:194]: Modbus write: 02.04.00.01.00.02.20.38 (8)
[17:23:46][V][modbus_controller:486]: Command sent 4 0x1 2
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Attic Humidity 1'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: ''
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: '%'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[17:23:46][V][modbus:042]: Modbus received Byte  206 (0Xce)
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Attic Therm 2'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: ''
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'C'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Attic Humidity 2'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: ''
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: '%'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Attic Therm 3'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: ''
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'C'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Attic Humidity 3'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: ''
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: '%'
[17:23:46][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[17:23:46][D][modbus_controller:032]: Modbus command to device=2 register=0x01 countdown=0 no response received - removed from send queue
[17:23:46][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:23:46][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:23:46][V][modbus_controller:486]: Command sent 4 0x1 2
[17:23:46][C][modbus_controller:275]: ModbusController:
[17:23:46][C][modbus_controller:276]:   Address: 0x01
[17:23:46][C][modbus_controller:278]: sensormap
[17:23:46][C][modbus_controller:282]:  Sensor type=4 start=0x1 offset=0x0 count=1 size=1
[17:23:46][C][modbus_controller:282]:  Sensor type=4 start=0x1 offset=0x1 count=1 size=1
[17:23:46][C][modbus_controller:284]: ranges
[17:23:46][C][modbus_controller:287]:   Range type=4 start=0x1 count=2 skip_updates=1
[17:23:46][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:23:46][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:23:46][C][modbus_controller:275]: ModbusController:
[17:23:46][C][modbus_controller:276]:   Address: 0x02
[17:23:46][C][modbus_controller:278]: sensormap
[17:23:46][C][modbus_controller:282]:  Sensor type=4 start=0x1 offset=0x0 count=1 size=1
[17:23:46][C][modbus_controller:282]:  Sensor type=4 start=0x1 offset=0x1 count=1 size=1
[17:23:46][C][modbus_controller:284]: ranges
[17:23:46][C][modbus_controller:287]:   Range type=4 start=0x1 count=2 skip_updates=1
[17:23:46][C][modbus_controller:275]: ModbusController:
[17:23:46][C][modbus_controller:276]:   Address: 0x03
[17:23:46][C][modbus_controller:278]: sensormap
[17:23:46][C][modbus_controller:282]:  Sensor type=4 start=0x1 offset=0x0 count=1 size=1
[17:23:46][C][modbus_controller:282]:  Sensor type=4 start=0x1 offset=0x1 count=1 size=1
[17:23:46][C][modbus_controller:284]: ranges
[17:23:46][C][modbus_controller:287]:   Range type=4 start=0x1 count=2 skip_updates=1
[17:23:47][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:23:47][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:23:47][V][modbus_controller:486]: Command sent 4 0x1 2
[17:23:47][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:23:47][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:23:47][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:23:47][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:23:47][V][modbus_controller:486]: Command sent 4 0x1 2
[17:23:47][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:23:47][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:23:47][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:23:47][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:23:47][V][modbus_controller:486]: Command sent 4 0x1 2
[17:23:47][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:23:47][V][modbus:042]: Modbus received Byte  246 (0Xf6)
[17:23:47][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:23:47][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:23:47][V][modbus_controller:486]: Command sent 4 0x1 2
[17:23:47][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:23:47][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:23:48][D][modbus_controller:032]: Modbus command to device=3 register=0x01 countdown=0 no response received - removed from send queue
[17:24:30][V][modbus_controller:158]: Updating modbus component
[17:24:30][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 1
[17:24:37][V][modbus_controller:158]: Updating modbus component
[17:24:37][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 1
[17:24:40][V][modbus_controller:158]: Updating modbus component
[17:24:40][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 1
[17:25:30][V][modbus_controller:158]: Updating modbus component
[17:25:30][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 0
[17:25:30][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:25:30][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:25:30][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:30][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:25:30][V][modbus:042]: Modbus received Byte  254 (0Xfe)
[17:25:30][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:25:30][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:25:30][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:30][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:25:30][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:25:30][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:25:30][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:25:30][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:30][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:25:30][V][modbus:042]: Modbus received Byte  246 (0Xf6)
[17:25:31][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:25:31][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:25:31][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:31][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:25:31][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:25:31][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:25:31][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:25:31][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:31][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:25:31][V][modbus:042]: Modbus received Byte  246 (0Xf6)
[17:25:31][D][modbus_controller:032]: Modbus command to device=3 register=0x01 countdown=0 no response received - removed from send queue
[17:25:37][V][modbus_controller:158]: Updating modbus component
[17:25:37][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 0
[17:25:37][V][modbus_controller:036]: Sending next modbus command to device 2 register 0x01 count 2
[17:25:37][V][modbus:194]: Modbus write: 02.04.00.01.00.02.20.38 (8)
[17:25:37][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:37][V][modbus:042]: Modbus received Byte  206 (0Xce)
[17:25:38][V][modbus_controller:036]: Sending next modbus command to device 2 register 0x01 count 2
[17:25:38][V][modbus:194]: Modbus write: 02.04.00.01.00.02.20.38 (8)
[17:25:38][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:38][V][modbus:042]: Modbus received Byte  206 (0Xce)
[17:25:38][V][modbus_controller:036]: Sending next modbus command to device 2 register 0x01 count 2
[17:25:38][V][modbus:194]: Modbus write: 02.04.00.01.00.02.20.38 (8)
[17:25:38][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:38][V][modbus:042]: Modbus received Byte  206 (0Xce)
[17:25:38][V][modbus_controller:036]: Sending next modbus command to device 2 register 0x01 count 2
[17:25:38][V][modbus:194]: Modbus write: 02.04.00.01.00.02.20.38 (8)
[17:25:38][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:38][V][modbus:042]: Modbus received Byte  206 (0Xce)
[17:25:38][V][modbus_controller:036]: Sending next modbus command to device 2 register 0x01 count 2
[17:25:38][V][modbus:194]: Modbus write: 02.04.00.01.00.02.20.38 (8)
[17:25:38][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:38][V][modbus:042]: Modbus received Byte  206 (0Xce)
[17:25:39][D][modbus_controller:032]: Modbus command to device=2 register=0x01 countdown=0 no response received - removed from send queue
[17:25:40][V][modbus_controller:158]: Updating modbus component
[17:25:40][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 0
[17:25:40][V][modbus_controller:036]: Sending next modbus command to device 1 register 0x01 count 2
[17:25:40][V][modbus:194]: Modbus write: 01.04.00.01.00.02.20.0B (8)
[17:25:40][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:40][V][modbus:042]: Modbus received Byte  254 (0Xfe)
[17:25:41][V][modbus_controller:036]: Sending next modbus command to device 1 register 0x01 count 2
[17:25:41][V][modbus:194]: Modbus write: 01.04.00.01.00.02.20.0B (8)
[17:25:41][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:41][V][modbus:042]: Modbus received Byte  254 (0Xfe)
[17:25:41][V][modbus_controller:036]: Sending next modbus command to device 1 register 0x01 count 2
[17:25:41][V][modbus:194]: Modbus write: 01.04.00.01.00.02.20.0B (8)
[17:25:41][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:41][V][modbus:042]: Modbus received Byte  254 (0Xfe)
[17:25:41][V][modbus_controller:036]: Sending next modbus command to device 1 register 0x01 count 2
[17:25:41][V][modbus:194]: Modbus write: 01.04.00.01.00.02.20.0B (8)
[17:25:41][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:41][V][modbus:042]: Modbus received Byte  254 (0Xfe)
[17:25:41][V][modbus_controller:036]: Sending next modbus command to device 1 register 0x01 count 2
[17:25:41][V][modbus:194]: Modbus write: 01.04.00.01.00.02.20.0B (8)
[17:25:41][V][modbus_controller:486]: Command sent 4 0x1 2
[17:25:41][V][modbus:042]: Modbus received Byte  254 (0Xfe)
[17:25:42][D][modbus_controller:032]: Modbus command to device=1 register=0x01 countdown=0 no response received - removed from send queue
[17:26:30][V][modbus_controller:158]: Updating modbus component
[17:26:30][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 1
[17:26:37][V][modbus_controller:158]: Updating modbus component
[17:26:37][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 1
[17:26:40][V][modbus_controller:158]: Updating modbus component
[17:26:40][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 1
[17:27:30][V][modbus_controller:158]: Updating modbus component
[17:27:30][V][modbus_controller:125]: Range : 1 Size: 2 (4) skip: 0
[17:27:30][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:27:30][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:27:30][V][modbus_controller:486]: Command sent 4 0x1 2
[17:27:30][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:27:30][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:27:30][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:27:30][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:27:30][V][modbus_controller:486]: Command sent 4 0x1 2
[17:27:30][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:27:30][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:27:30][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:27:30][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:27:30][V][modbus_controller:486]: Command sent 4 0x1 2
[17:27:30][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:27:30][V][modbus:042]: Modbus received Byte  255 (0Xff)
[17:27:31][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:27:31][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:27:31][V][modbus_controller:486]: Command sent 4 0x1 2
[17:27:31][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:27:31][V][modbus:042]: Modbus received Byte  246 (0Xf6)
[17:27:31][V][modbus_controller:036]: Sending next modbus command to device 3 register 0x01 count 2
[17:27:31][V][modbus:194]: Modbus write: 03.04.00.01.00.02.21.E9 (8)
[17:27:31][V][modbus_controller:486]: Command sent 4 0x1 2
[17:27:31][V][modbus:042]: Modbus received Byte  208 (0Xd0)
[17:27:31][V][modbus:042]: Modbus received Byte  255 (0Xff)

Any ideas anyone?

The query merge ESP does is explained here:

Secondly, are you sure about your response_size: 1 ?
I would try default values for both response_size and register_count

I am experiencing more or less the same problem.
I’ve set up my connection in config.yaml
And yet when try reading a register it doesn’t result in a value.

afbeelding

Getting however confused by this site

Nevertheless added the mandatory variables as well.
afbeelding

Here the data i am able to retreive via a small software programme.

And yes, 30013 is a correct registeradress according to the manual.

Do you get any response?

That address is 13. input register so 0xC in hex. Try that

Yes, i just got response with these lines:

afbeelding

Without float32 i recieve 17096 as value.

On adresses 17 and 23 i recieve 0.00 as values.

Try 0xC not 12

1 Like

Also gives 100 as value.


afbeelding

Neither scan interval seems to work.
I set it up every 5 seconds and doesn’t refresh at all.

Why you expect 32bits?

I would try

value_type: U_WORD

Because when i read the device via a modbusreader i get the expected results:

And if you set it to “decimal”?

Then i get a value in the range of the aforementioned 17000

And when putting decimal i don’t get any value anymore. (remains on the last succesfull one 21 min’s ago)

ok, looks to me that it’s putting registers 12 and 13 together

Also, in Node-red i get also the correct values.

because you have start address 12, quantity 2.
I’m not good in gluing bytes together, but that’s what you have to do, read 0xC and 0xD together or find out how esphome can do it with 32bit read.

Esphome documentation is very confusing.

Yeah incredible confusing.
That’s why i try via Studio Code Server first.

By the way, via Buffer Parser i get the readout in the correct format.

The complete node:

You can make it one way or another.
Either you find out how to read 32bits or you read 0xC and 0xD and put them bitwise together.

Yeah, prefer the 32bits way.
But even in the HA-instructions i don’t find the answers i need.

Like here