Markdown source

# ModBus R41A08 relay board and Node-Red

<abstract>
This article explains how to manage the cheap Modbus 8 relay board R41A08 from Node-Red
</abstract>

<img src="./R41A08.jpg">

Nodes to install:

* node-red-contrib-modbus
  <https://flows.nodered.org/node/node-red-contrib-modbus>
	
	

## Node-Red - Flow

		[{"id":"34943ba9.6530b4","type":"modbus-flex-write","z":"71ad9872.edea58","name":"","showStatusActivities":false,"showErrors":false,"server":"9b45273.add55d8","x":930,"y":640,"wires":[[],[]]},{"id":"9d643725.bc6ae8","type":"function","z":"71ad9872.edea58","name":"8 relay board","func":"if (msg.payload[\"state\"]===0) {\n\n    msg.payload={\n        \"value\": 512,\n        \"fc\": 6,\n        \"unitid\": 1,\n        \"address\": msg.payload[\"rele\"],\n        \"quantity\": 1\n    }\n} else {\n    msg.payload={\n        \"value\": 256,\n        \"fc\": 6,\n        \"unitid\": 1,\n        \"address\": msg.payload[\"rele\"],\n        \"quantity\": 1\n    }\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":750,"y":640,"wires":[["34943ba9.6530b4"]]},{"id":"2e1ee3fa.5d265c","type":"inject","z":"71ad9872.edea58","name":"RELAY 1 ON","topic":"","payload":"{\"rele\":1,\"state\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":280,"wires":[["9d643725.bc6ae8"]]},{"id":"bd4854e7.ac1ab8","type":"inject","z":"71ad9872.edea58","name":"RELAY 1 OFF","topic":"","payload":"{\"rele\":1,\"state\":0}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":320,"wires":[["9d643725.bc6ae8"]]},{"id":"4ff31588.542ffc","type":"inject","z":"71ad9872.edea58","name":"RELAY 2 ON","topic":"","payload":"{\"rele\":2,\"state\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":380,"wires":[["9d643725.bc6ae8"]]},{"id":"cf77f1a.b5d181","type":"inject","z":"71ad9872.edea58","name":"RELAY 2 OFF","topic":"","payload":"{\"rele\":2,\"state\":0}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":420,"wires":[["9d643725.bc6ae8"]]},{"id":"f710b9f5.e369a8","type":"inject","z":"71ad9872.edea58","name":"RELAY 3 ON","topic":"","payload":"{\"rele\":3,\"state\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":480,"wires":[["9d643725.bc6ae8"]]},{"id":"76ab0f31.b3eeb","type":"inject","z":"71ad9872.edea58","name":"RELAY 3 OFF","topic":"","payload":"{\"rele\":3,\"state\":0}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":520,"wires":[["9d643725.bc6ae8"]]},{"id":"4fd45b86.0fec94","type":"inject","z":"71ad9872.edea58","name":"RELAY 4 ON","topic":"","payload":"{\"rele\":4,\"state\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":580,"wires":[["9d643725.bc6ae8"]]},{"id":"ad21c306.0ab48","type":"inject","z":"71ad9872.edea58","name":"RELAY 4 OFF","topic":"","payload":"{\"rele\":4,\"state\":0}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":620,"wires":[["9d643725.bc6ae8"]]},{"id":"e3559ab4.db5498","type":"inject","z":"71ad9872.edea58","name":"RELAY 5 ON","topic":"","payload":"{\"rele\":5,\"state\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":680,"wires":[["9d643725.bc6ae8"]]},{"id":"d61acf97.53a6d","type":"inject","z":"71ad9872.edea58","name":"RELAY 5 OFF","topic":"","payload":"{\"rele\":5,\"state\":0}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":720,"wires":[["9d643725.bc6ae8"]]},{"id":"fa394dd.203b7b","type":"inject","z":"71ad9872.edea58","name":"RELAY 6 ON","topic":"","payload":"{\"rele\":6,\"state\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":780,"wires":[["9d643725.bc6ae8"]]},{"id":"f57c8488.9971d8","type":"inject","z":"71ad9872.edea58","name":"RELAY 6 OFF","topic":"","payload":"{\"rele\":6,\"state\":0}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":820,"wires":[["9d643725.bc6ae8"]]},{"id":"f0637366.4f4eb","type":"inject","z":"71ad9872.edea58","name":"RELAY 7 ON","topic":"","payload":"{\"rele\":7,\"state\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":880,"wires":[["9d643725.bc6ae8"]]},{"id":"b5dd9c0e.5b4ad","type":"inject","z":"71ad9872.edea58","name":"RELAY 7 OFF","topic":"","payload":"{\"rele\":7,\"state\":0}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":920,"wires":[["9d643725.bc6ae8"]]},{"id":"41132eec.c808f","type":"inject","z":"71ad9872.edea58","name":"RELAY 8 ON","topic":"","payload":"{\"rele\":8,\"state\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":980,"wires":[["9d643725.bc6ae8"]]},{"id":"b7c974ca.55b048","type":"inject","z":"71ad9872.edea58","name":"RELAY 8 OFF","topic":"","payload":"{\"rele\":8,\"state\":0}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":1020,"wires":[["9d643725.bc6ae8"]]},{"id":"34cc6e0a.6e3cd2","type":"inject","z":"71ad9872.edea58","name":"Go","topic":"","payload":"go","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"2","x":390,"y":160,"wires":[["20543bb5.22ce44"]]},{"id":"f421fb69.0ef9a8","type":"function","z":"71ad9872.edea58","name":"Get rotate flag","func":"var relay = flow.get('relay');\nvar rotate = flow.get('rotate');\n\nnode.status({text:relay});\n\nif (rotate==1) {\n    relay += 1;\n    if (relay>8) { \n        flow.set('relay',0);\n        flow.set('rotate',0);\n        return;\n    }    \n    flow.set('relay',relay);\n}    \nmsg.payload={\"rele\":relay,\"state\":1};\nreturn msg;","outputs":1,"noerr":0,"x":540,"y":200,"wires":[["9d643725.bc6ae8"]]},{"id":"20543bb5.22ce44","type":"function","z":"71ad9872.edea58","name":"Set rotate flag","func":"flow.set('rotate',1);\nflow.set('relay',0);\nreturn msg;","outputs":1,"noerr":0,"x":540,"y":160,"wires":[[]]},{"id":"e47a1b69.884f78","type":"inject","z":"71ad9872.edea58","name":"","topic":"","payload":"","payloadType":"date","repeat":"0.1","crontab":"","once":false,"onceDelay":"1","x":370,"y":200,"wires":[["f421fb69.0ef9a8"]]},{"id":"50f892fd.4d8a3c","type":"inject","z":"71ad9872.edea58","name":"Shutdown","topic":"","payload":"sudo shutdown","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":940,"y":160,"wires":[["cb8cab01.2b3be8"]]},{"id":"cb8cab01.2b3be8","type":"exec","z":"71ad9872.edea58","command":"","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":1090,"y":160,"wires":[[],[],[]]},{"id":"9b45273.add55d8","type":"modbus-client","z":"","name":"","clienttype":"simpleser","bufferCommands":true,"stateLogEnabled":false,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB2","serialType":"RTU","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","unit_id":1,"commandDelay":1,"clientTimeout":1000,"reconnectTimeout":2000}]
	
## Mini RS485 sniffer

In order to understand how to manage the Modbus protocol I've used this simple RS485 sniffer in Python

	import serial 
	import time
	
	port = '/dev/ttyUSB2'
	baud = 9600
	
	ser = serial.Serial(port, baud, timeout=0)
	
	counter = 0
	while True:
		if ser.in_waiting>0:
			c=ser.read(1)
			print "%02X " % (ord(c)),
			counter+=1
			if counter==16:
				print
				counter=0
		time.sleep(0.01)

## Raw data on RS485 bus

This is the sequence in hexadecimal of the bytes to send on RS485 bus at 9600,N,8,1
to the 8 relay board to turn on and turn off each relay

	01  06  00  01  01  00  D9  9A  01  06  00  01  01  00  D9  9A 
	01  06  00  01  02  00  D9  6A  01  06  00  01  02  00  D9  6A 
	01  06  00  02  01  00  29  9A  01  06  00  02  01  00  29  9A 
	01  06  00  02  02  00  29  6A  01  06  00  02  02  00  29  6A 
	01  06  00  03  01  00  78  5A  01  06  00  03  01  00  78  5A 
	01  06  00  03  02  00  78  AA  01  06  00  03  02  00  78  AA 
	01  06  00  04  01  00  C9  9B  01  06  00  04  01  00  C9  9B 
	01  06  00  04  02  00  C9  6B  01  06  00  04  02  00  C9  6B 
	01  06  00  05  01  00  98  5B  01  06  00  05  01  00  98  5B 
	01  06  00  05  02  00  98  AB  01  06  00  05  02  00  98  AB 
	01  06  00  06  01  00  68  5B  01  06  00  06  01  00  68  5B 
	01  06  00  06  02  00  68  AB  01  06  00  06  02  00  68  AB 
	01  06  00  07  01  00  39  9B  01  06  00  07  01  00  39  9B 
	01  06  00  07  02  00  39  6B  01  06  00  07  02  00  39  6B 
	01  06  00  08  01  00  09  98  01  06  00  08  01  00  09  98 
	01  06  00  08  02  00  09  68  01  06  00  08  02  00  09  68
	
## Links

* [Python 8 Channel RS485 MODBUS RTU relay board type R421A08](https://github.com/Erriez/R421A08-rs485-8ch-relay-board)

@include='bio_sergio_tanzilli'