WAVESHARE Modbus RTU Relay 16CH

Hello folks,

I have a troubles with “WAVESHARES Modbus RTU Relay 16CH” (See: https://www.waveshare.com/wiki/Modbus_RTU_Relay_16CH)
I replaced previously functional 2x 8CH and adapted the code, which is currently:

The things file:

Bridge modbus:serial:DCRelayId220 "DC-Relay ID 220" [ id=220, port="/dev/ttyUSB0", baud=115200, stopBits="1.0", parity="none", dataBits=8, receiveTimeoutMillis=750, echo=false, encoding="rtu", timeBetweenTransactionsMillis="35", flowControlIn="none", flowControlOut="none", connectTimeoutMillis=1500, afterConnectionDelayMillis=0, enableDiscovery=false ] {
    Bridge poller DCRelayId220 "DC-Relay ID 220 :: poller" [start=0, length=16, refresh=1000, type="coil" ] {
        Thing data Relay1 "DC-Relay ID 220 :: 01" [ readStart="0", readValueType="bit", writeType="coil", writeStart="0", writeValueType="bit" ]
        Thing data Relay2 "DC-Relay ID 220 :: 02" [ readStart="1", readValueType="bit", writeType="coil", writeStart="1", writeValueType="bit" ]
        Thing data Relay3 "DC-Relay ID 220 :: 03" [ readStart="2", readValueType="bit", writeType="coil", writeStart="2", writeValueType="bit" ]
        Thing data Relay4 "DC-Relay ID 220 :: 04" [ readStart="3", readValueType="bit", writeType="coil", writeStart="3", writeValueType="bit" ]
        Thing data Relay5 "DC-Relay ID 220 :: 05" [ readStart="4", readValueType="bit", writeType="coil", writeStart="4", writeValueType="bit" ]
        Thing data Relay6 "DC-Relay ID 220 :: 06" [ readStart="5", readValueType="bit", writeType="coil", writeStart="5", writeValueType="bit" ]
        Thing data Relay7 "DC-Relay ID 220 :: 07" [ readStart="6", readValueType="bit", writeType="coil", writeStart="6", writeValueType="bit" ]
        Thing data Relay8 "DC-Relay ID 220 :: 08" [ readStart="7", readValueType="bit", writeType="coil", writeStart="7", writeValueType="bit" ]
        Thing data Relay9 "DC-Relay ID 220 :: 09" [ readStart="8", readValueType="bit", writeType="coil", writeStart="8", writeValueType="bit" ]
        Thing data Relay10 "DC-Relay ID 220 :: 10" [ readStart="9", readValueType="bit", writeType="coil", writeStart="9", writeValueType="bit" ]
        Thing data Relay11 "DC-Relay ID 220 :: 11" [ readStart="10", readValueType="bit", writeType="coil", writeStart="10", writeValueType="bit" ]
        Thing data Relay12 "DC-Relay ID 220 :: 12" [ readStart="11", readValueType="bit", writeType="coil", writeStart="11", writeValueType="bit" ]
        Thing data Relay13 "DC-Relay ID 220 :: 13" [ readStart="12", readValueType="bit", writeType="coil", writeStart="12", writeValueType="bit" ]
        Thing data Relay14 "DC-Relay ID 220 :: 14" [ readStart="13", readValueType="bit", writeType="coil", writeStart="13", writeValueType="bit" ]
        Thing data Relay15 "DC-Relay ID 220 :: 15" [ readStart="14", readValueType="bit", writeType="coil", writeStart="14", writeValueType="bit" ]
        Thing data Relay16 "DC-Relay ID 220 :: 16" [ readStart="15", readValueType="bit", writeType="coil", writeStart="15", writeValueType="bit" ]
    }
}

The items file

Switch DC_220_relay_1 "DC-Relay 01" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay1:switch"}
Switch DC_220_relay_2 "DC-Relay 02" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay2:switch"}
Switch DC_220_relay_3 "DC-Relay 03" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay3:switch"}
Switch DC_220_relay_4 "DC-Relay 04" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay4:switch"}
Switch DC_220_relay_5 "DC-Relay 05" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay5:switch"}
Switch DC_220_relay_6 "DC-Relay 06" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay6:switch"}
Switch DC_220_relay_7 "DC-Relay 07" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay7:switch"}
Switch DC_220_relay_8 "DC-Relay 08" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay8:switch"}
Switch DC_220_relay_9 "DC-Relay 09" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay9:switch"}
Switch DC_220_relay_10 "DC-Relay 10" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay10:switch"}
Switch DC_220_relay_11 "DC-Relay 11" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay11:switch"}
Switch DC_220_relay_12 "DC-Relay 12" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay12:switch"}
Switch DC_220_relay_13 "DC-Relay 13" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay13:switch"}
Switch DC_220_relay_14 "DC-Relay 14" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay14:switch"}
Switch DC_220_relay_15 "DC-Relay 15" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay15:switch"}
Switch DC_220_relay_16 "DC-Relay 16" <switch> {channel="modbus:data:DCRelayId220:DCRelayId220:Relay16:switch"}

This 16CH relay behaves strange. I can turn on each relay but only once.
After turning the relay on, the switch shows, the relay is off.

Where is the error?

It is the same trouble as it was on V1 versions of 8CH relays?
See: OH3 Waveshare Relay v1 modbus

  • Platform information:
    • Hardware: ARM64
    • OS: Armbian
    • Runtime Environment: Docker
    • openHAB version: 3.4

There is trouble either on firmware or on OpenHab, because following works now:

Note: The readStart values are flipped for firs and second byte of data.

The things file:

// WAVESHARE Modbus RTU Relay 16CH : OpenHab : things
Bridge modbus:serial:RTU_16CH "RTU 16CH relays" [ id=1, port="/dev/ttyUSB0", baud=9600, stopBits="1.0", parity="none", dataBits=8, receiveTimeoutMillis=75, echo=false, encoding="rtu", timeBetweenTransactionsMillis="70", flowControlIn="none", flowControlOut="none", connectTimeoutMillis=1500, afterConnectionDelayMillis=0, enableDiscovery=false ] {
    Bridge poller RTU_16CH "RTU 16CH relays :: poller" [start=0, length=16, refresh=1000, type="coil" ] {
        Thing data Relay_01 "RTU 16CH relays :: 01" [  readStart="8", readValueType="bit", writeType="coil",   writeStart="0", writeValueType="bit" ]
        Thing data Relay_02 "RTU 16CH relays :: 02" [  readStart="9", readValueType="bit", writeType="coil",   writeStart="1", writeValueType="bit" ]
        Thing data Relay_03 "RTU 16CH relays :: 03" [ readStart="10", readValueType="bit", writeType="coil",   writeStart="2", writeValueType="bit" ]
        Thing data Relay_04 "RTU 16CH relays :: 04" [ readStart="11", readValueType="bit", writeType="coil",   writeStart="3", writeValueType="bit" ]
        Thing data Relay_05 "RTU 16CH relays :: 05" [ readStart="12", readValueType="bit", writeType="coil",   writeStart="4", writeValueType="bit" ]
        Thing data Relay_06 "RTU 16CH relays :: 06" [ readStart="13", readValueType="bit", writeType="coil",   writeStart="5", writeValueType="bit" ]
        Thing data Relay_07 "RTU 16CH relays :: 07" [ readStart="14", readValueType="bit", writeType="coil",   writeStart="6", writeValueType="bit" ]
        Thing data Relay_08 "RTU 16CH relays :: 08" [ readStart="15", readValueType="bit", writeType="coil",   writeStart="7", writeValueType="bit" ]
        Thing data Relay_09 "RTU 16CH relays :: 09" [  readStart="0", readValueType="bit", writeType="coil",   writeStart="8", writeValueType="bit" ]
        Thing data Relay_10 "RTU 16CH relays :: 10" [  readStart="1", readValueType="bit", writeType="coil",   writeStart="9", writeValueType="bit" ]
        Thing data Relay_11 "RTU 16CH relays :: 11" [  readStart="2", readValueType="bit", writeType="coil",  writeStart="10", writeValueType="bit" ]
        Thing data Relay_12 "RTU 16CH relays :: 12" [  readStart="3", readValueType="bit", writeType="coil",  writeStart="11", writeValueType="bit" ]
        Thing data Relay_13 "RTU 16CH relays :: 13" [  readStart="4", readValueType="bit", writeType="coil",  writeStart="12", writeValueType="bit" ]
        Thing data Relay_14 "RTU 16CH relays :: 14" [  readStart="5", readValueType="bit", writeType="coil",  writeStart="13", writeValueType="bit" ]
        Thing data Relay_15 "RTU 16CH relays :: 15" [  readStart="6", readValueType="bit", writeType="coil",  writeStart="14", writeValueType="bit" ]
        Thing data Relay_16 "RTU 16CH relays :: 16" [  readStart="7", readValueType="bit", writeType="coil",  writeStart="15", writeValueType="bit" ]
    }
}

See all requered stuff on OpenHab : WAVESHARE Modbus RTU Relay 16CH · GitHub


IMHO the topic is not solved, beacuse i’m not sure where is the trouble.
It can not be the modbus specification to flip read and write bytes and bits?

I’ll debug the stuff with other tools.

I debugged it with Node GitHub - yaacov/node-modbus-serial: A pure JavaScript implemetation of MODBUS-RTU (and TCP) for NodeJS
It behaves the same as OpenHab.
The bytes are flipped on response of read command.
This is definetely a firmware issue.

I’ll mark that topic as resolved and contact WaveShare support.