💬 Building a wired RS485 sensor network
-
Hello again. After a week of thinking and hard work i finally got RS485 network working very close to what I want. I've done everything like it was mentioned here before. Fully bus-like network, termination only on both ends of line and pull-up and pull-down on the gateway. I also change MySensors library to newest 2.1 beta branch. All nodes working very good for last month but some times one node hanging and I can't control it via OpenHab or built in switch. I don't know what cause this behavior. I turn on watchdog timers in every nodes and theoretically when node hangs, watchdog should reboot arduino after 8 seconds. Practically it won't reboot my node.. It seems like the node don't really hangs but the communication stops.. Is it possible that one node can loose connection while other nodes on the same bus/wires working like a charm ?
-
@nofox The problem you describe sounds pretty similar to my observations in this post.
There are also some suggestions how to solve this kind of trouble you may apply.
-
Hi! It’s me again. I want to precise one thing. Are there anyone here who have succesful working RS485 network without any issues? We are talking here about issues but maybe someone have fully working sensors network?
-
If some node hangs what happens if you recycle the power of rs485 transceiver only?
I'm just thinking could it be the protection of max485 that kicks in if there is two nodes sending exactly the same time.
-
Hi! My problem still exist. I switched to newest MySensors Library and to HWSERIAL and some nodes acts the same as before... Now i'm thinking that maybe its related to DE_PIN 2 ?? Someone tried to switch to other pin for Enable function for RS485 ?? Now after almost a year I'm thinking about changing my transmission from wired RS485 to wireless nRF.. I choose RS485 because of its stability (thats what I taught over a year ago ). Now I think that RS485 its a piece of garbage..
-
Hi! I think I came up with the solution for all our problems but I don't know if it is worth and possible at all. The thing is that RS485 isn't a multimaster bus, thats what we all know. So the best option is to turn the gateway in to master and all other nodes to slaves. I'm thinking if there are any possibilities to make the gateway to ask nodes in the order one by one for its states (child states). The nodes can only talk to the gateway when the gateway ask for their states. This process should take place in endless loop in the highest possible speed (depending on the count of nodes in the network). I think that in this option the baud rate matters, cause higher baud rates makes the time of a single loop shorter minimizing the delay that may occur in the networks with many nodes. Maybe I'm reinventing the wheel now and this type of transmission needs to rewrite all MySensors protocols..
-
@nofox absolutely that is one of the problems. Polling as you describe could be a fix, another is having each node listen before transmitting, there is a (not mysensors) library that does that, CAN bus( a mutli master 485 comaptible bus) is another option. I think that running a common ground to all the rs485 adapters is also wise. This is all in theory as I havent wired up my home yet....
-
another is having each node listen before transmitting
How would you describe this functionality in MySensors rs485 code?
https://github.com/mysensors/MySensors/blob/f5ed26c778c18107d1516bd86704f8c8f99ff571/hal/transport/RS485/MyTransportRS485.cpp#L246
If I'm reading the code correctly it is exactly reading the bus and making sure no other node is sending before sending anything.
The place where collision can happen is those 5 microseconds what the node is waiting to get driver tx enabled pin up.So the collision avoidance is already there. So what MyS R485 transport is missing is collision detection and recovery from collision.
CAN bus( a mutli master 485 comaptible bus) is another option.
Its disadvantage is small payload size.
@nofox Its quite like how the Modbus works. By polling.
I think there is some better ways to do that. Check these out from google:- RS-485 Token ring
- uLAN
- RS-485 RRP (Round Robin Protocol)
- CSMA/CA
-
I think you have found most everything that I have. Something akin to csmacd is what I was thinking. Listen, transmit, back off for random time if a collision still happens. Of course full duplex rs485 is another option, hard to find off the shelf modules.
I think this is the library I had found before.
https://github.com/MichaelJonker/HardwareSerialRS485/wiki
-
https://github.com/dukelec/cdbus_doc
This one has some is interesting, not sure if it does multi master or not. There are a few projects that seem to do multimaster/collision avoidance, the trick it to find one with low enough overhead and automatically retransmits if there is a failure, and for this project isolates this enough that my sensors doesnt need restructuring.Good wiring is crucial so you can use higher speeds. The common ground wire in addition to the differential signals seems almost required.
-
https://github.com/gioblu/PJON/wiki
Some works for MySensors done:
https://forum.mysensors.org/topic/3977/transport-based-on-single-wire-pjon-protocol
-
But PJON uses completely sw bit by bit sending or HW sending with bad bus arbitration.
My idea - combination CAN bus like arbitration and UART message sending.
With ACK possibility.Time T1 ( two bytes send time for example )
Node sends message and waits T1 time for ACK.
Receiving node must send ACK within T1 interval.Node, witch needs send message listens bus.
BUT not by HW UART or SoftwareSerial - use directo IO operation.
If recognize bus free time greater then T1, it start sending its own ID.
BUT again not by HW UART or SoftwareSerial - but bit by bit by direct IO pin operation.
And listen if bit I am sending is bit I am receiving.
If not - it means, that other node with higher priority ( lower ID ) is sending - then immediately stop sending other bit and wait for next bus free T1 interval.
If yes - bus is free for me end send my message normally by UART ( HW or SW, maybe with 9 bit addressing support - time less than T1 between characters allowed).
Wait max T1 time for ACK.CAN bus driver usage TJA 1050 or MCP2551 - no DE RE pins.
-
I have the problem that I always get this error: !TSM:FPAR:NO REPLY
Once it worked briefly yesterday.
What have I tried everything?
All hardware exchanged - without success.Now I have just written two small scripts that send RS485 back and forth. without problems. So wiring has to fit. I spent then in the serial montior the data which the node sends me, there comes some. Then I once tried to display the data that sends the GW, because nothing comes.
Does anyone have an idea why my GW does not answer?
-
@andreas-sieber could you post the debug output from the node and the gateway?
-
| / |_ / | ___ _ __ ___ ___ _ __ ___
| |/| | | | _ \ / _ \_ \/ __|/ _ \|
_/ __|
| | | | || || | / | | _ \ _ | | _
|| ||_, |/ ___|| ||/_/|| |/
|__/ 2.3.0-alpha17 MCO:BGN:INIT NODE,CP=RSNNA---,VER=2.3.0-alpha
26 TSM:INIT
27 TSF:WUR:MS=0
29 TSM:INIT:TSP OK
30 TSM:FPAR
49 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
2056 !TSM:FPAR:NO REPLY
2058 TSM:FPAR
2075 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
4083 !TSM:FPAR:NO REPLY
4085 TSM:FPAR
4103 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
6111 !TSM:FPAR:NO REPLY
6113 TSM:FPAR
6130 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:0;255;3;0;9;0 MCO:BG
0;255;3;0;9;29 MCO:BGN:INIT OK,TSP=1
0;255;3;0;9;0 MCO:BGN:INIT GW,CP=RSNGA---,VER=2.3.0-alpha
0;255;3;0;9;5 TSM:INIT
0;255;3;0;9;7 TSF:WUR:MS=0
0;255;3;0;9;9 TSM:INIT:TSP OK
0;255;3;0;9;12 TSM:INIT:GW MODE
0;255;3;0;9;15 TSM:READY:ID=0,PAR=0,DIS=0
0;255;3;0;9;18 MCO:REG:NOT NEEDED
0;255;3;0;14;Gateway startup complete.
0;255;0;0;18;2.3.0-alpha
0;255;3;0;9;22 MCO:BGN:STP
0;255;3;0;9;29 MCO:BGN:INIT OK,TSP=1
-
why don't you use the stable 2.2? Anyway the node is missing the my_node_id define and second it seems the gateway isn't receiving anything, so I guess there is something very wrong in communication
-
in the 2.2 the same problem, i have now updagradet to alpha.
When you have a solution on 2.2 i will downgrade. no problem!
Guys you are good! I had set the mynodeid. But befor i include the my sensors.. that's the mistake..
hour of hour to search... thx!
-
Is it possible, or will it be possible to build a combination between wired and wireless nodes?
-
one network, one gateway
-
I just trying to work with examples but my node always transmitting some piece of shit from hardware serial:
__ __ ____ | \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___ | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __| | | | | |_| |___| | __/ | | \__ \ _ | | \__ \ |_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/ |___/ 2.3.0 16 MCO:BGN:INIT NODE,CP=RSNNA---,VER=2.3.0 25 TSM:INIT 26 TSF:WUR:MS=0 28 TSM:INIT:TSP OK 29 TSF:SID:OK,ID=5 31 TSM:FPAR ⸮X⸮⸮w34 TSF:MSG:SEND,5-5-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 2041 !TSM:FPAR:NO REPLY 2043 TSM:FPAR ⸮X⸮⸮w2045 TSF:MSG:SEND,5-5-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 4054 !TSM:FPAR:NO REPLY 4056 TSM:FPAR ⸮X⸮⸮w4058 TSF:MSG:SEND,5-5-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 6066 !TSM:FPAR:NO REPLY 6068 TSM:FPAR ⸮X⸮⸮w6070 TSF:MSG:SEND,5-5-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 8078 !TSM:FPAR:FAIL 8079 TSM:FAIL:CNT=1 8081 TSM:FAIL:DIS 8083 TSF:TDI:TSL
From software serial too
⸮X⸮⸮w ⸮X⸮⸮w ⸮X⸮⸮w ⸮X⸮⸮w
Consequently the gateway can't find any device.
I have tried also with RS485 with different baudrate. Finally I just connect my USB TTL directly to ouput pins, but always same result.
How to fix it?
-
@Pavel-Polititsky
To me this looks like you mixed between-node communication (RS485) with debug output (and maybe also serial output of the gw).
The corresponding serial interface for RS485 should be dedicated to RS485 exclusively.
-
Hi,
first of I have to thank you for your effort on this project! It helped me a lot.
In my house I would like to build 2 networks, one with serial gateway with RF24 for ground floor and outside. Second will be in cellar and I was thinking about Ethernet gateway (W5500) but sensors will be connected via RS485. Do you have code for that? On the video it looks like that in the box on right side it is something like this.
-
I have exactly the same problem. Has anyone managed to run it.
-
| / |_ / | ___ _ __ ___ ___ _ __ ___
| |/| | | | _ \ / _ \_ \/ __|/ _ \|
_/ __|
| | | | || || | / | | _ \ _ | | _
|| ||_, |/ ___|| ||/_/|| |/
|__/ 2.3.116 MCO:BGN:INIT NODE,CP=RSNNA---,REL=255,VER=2.3.1
26 TSM:INIT
27 TSF:WUR:MS=0
28 TSM:INIT:TSP OK
30 TSM:FPAR
56 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
2063 !TSM:FPAR:NO REPLY
2065 TSM:FPAR
2082 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
4090 !TSM:FPAR:NO REPLY
4092 TSM:FPAR
4110 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
6118 !TSM:FPAR:NO REPLY
6120 TSM:FPAR
6137 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
8146 !TSM:FPAR:FAIL
8147 TSM:FAIL:CNT=1
8150 TSM:FAIL:DIS
8152 TSF:TDI:TSL
18154 TSM:FAIL:RE-INIT
18156 TSM:INIT
18157 TSM:INIT:TSP OK
18159 TSM:FPAR
18178 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
20186 !TSM:FPAR:NO REPLY
20188 TSM:FPAR
20206 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
22213 !TSM:FPAR:NO REPLY
22215 TSM:FPAR
22234 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
24241 !TSM:FPAR:NO REPLY
24243 TSM:FPAR
24261 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
26268 !TSM:FPAR:FAIL
26269 TSM:FAIL:CNT=2
26271 TSM:FAIL:DIS
26273 TSF:TDI:TSL
-
@giebek could you describe the problem, what your setup looks like, and what you have tried so far to troubleshoot it? There are 137 posts in this thread so it is a bit hard to figure out which problem you are referring to.
-
6137 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
Imo this indicates your node doesn't have a NodeID yet. When using RS485 you have to assign the ID's manually in the sketch, auto doesn't work... (e.g. #define MY_NODE_ID 123)
-
Thanks for the answers.
And even more thanks to the rejoe2#define MY_NODE_ID 123
it helped 100% the transmission went, domoticz sees children.
-
hello MySensors friends,
I am currently making a node based on an arduino Mega 2560 with transport via RS-485, the build page says that we should use the MEGA pin 46 & 48, I was wondering if I would like a reference for this. in the sketch.
Second question; can I use pin 47 for the DE pin with:#define MY_RS485_DE_PIN 47
I haven't tested anything yet, so actually I just ask a lazy question
-
Hello, I would like to better understand the concept here. It sounds like we still need a gateway connected to a controller (serial, Ethernet, WiFi, etc.) but the interface between gateway and multiple nodes is over wired RS485 serial interface. Please confirm. Thank you for your great efforts!
-
@apl2017 Yes, also for RS485 variant you'll need a gateway. Only the communication between the gateway and the other nodes is handled over RS485, connected to a second (typically software) serial interface (for remote nodes, you may just use the hardware serial interface to connect the RS485 transceiver, if you do not need debug output; but imo this option is not recommended for beginners).
-
@dzjr said in Building a wired RS485 sensor network:
hello MySensors friends,
I am currently making a node based on an arduino Mega 2560 with transport via RS-485, the build page says that we should use the MEGA pin 46 & 48, I was wondering if I would like a reference for this. in the sketch.
Second question; can I use pin 47 for the DE pin with:#define MY_RS485_DE_PIN 47
I haven't tested anything yet, so actually I just ask a lazy question
I have it working, so you don't have to adjust anything for a Mega, and pin 47 for DE also works!
-
Hi,
in a node how many children can put rs-485
thanks good work
-
and it can have blockages if there are sensors that function or even time
thanks
-
I have a node with 52 child id's on a Arduino mega,
Arnout 22 of Them receiving data (relay & dimmers) and the rest are sending data, binary, temp/hum, soil moisture and analog data.
Not all the nodes are in use, but i see the data in domoticz.
I dont know how manny childs you want to use, for me 52 on one node are very mutch.
-
thank you for your reply
at least 10 children in node and 30 nodes
-
-
Hi all,
I have a question about, How to use hardware serial on Arduino Uno (as a sensor) to communicate with gateway via RS485? I added #define MY_RS485_HWSERIAL Serial and it is only working when i turn on debugging (#define MY_DEBUG), how to use hardware serial without debugger ?
-
@zrom69
No real Problem in turning off debug output, at least in 2.3.1 this worked:// Enable debug prints to serial monitor //#define MY_DEBUG //#define MY_DEBUG_LOCAL #define SN "Zwischenkeller" #define SV "0.2" // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 19200 //57600 //38400 //9600 #define MY_RS485_SOH_COUNT 1 #define MY_RS485_HWSERIAL Serial #define MY_SPLASH_SCREEN_DISABLED
You may even swap around debugging output from hardware serial to software serial, see basic structure from this post in FHEM forum (german, but most is code).
-
@rejoe2 Thank you. #define MY_SPLASH_SCREEN_DISABLED that was the missing line.
Okey i understand now. Thank you again.
-
I am trying to build up a Mysensors with Wired ethernet to the gateway with W5100 and RS485 bewteen nodes, is there something that can help me with this configuration?
Everything looks weel from the monitor serial but domoticz is not able to connect to the gateway!
-
@Flyer said in Building a wired RS485 sensor network:
ng to build
Hi Flyer, As far as I know this is not possible.
-
@Flyer Do you can ping the gateway on it IP?
-
I see there is a possibility the combine Ethernet with RS485.
Maybe you can check the setup as they did here:https://www.openhardware.io/view/649/RS485-Ethernet-Gateway#tabs-comments
https://github.com/feanor-anglin/GetWired-Project/blob/master/GetWired Ethernet Gateway/Gateway.ino
-
You can also try using PJON - it has solved all the issues that I was facing with RS485 and other wired solutions (like all sensors on the Gateway). It will be released officially in MySensors 2.4.0, but you can test is already now (alpha):
https://github.com/tekka007/MySensorsYou can read more here:
https://github.com/mysensors/MySensors/pull/1278
-
@gryzli133 I have a number of MySensors devices using RS485, it would be interesting to try to run PJON protocol over RS485, it seems like there is such an opportunity, but I could not figure out how to use it in the MySensors library.
-
yes, I am interested too as mysensors sometimes lost messages over rs485.
-
@hypnosiss you may be interested in this https://forum.mysensors.org/topic/11814/rs485-transport-ack-support/6
-
@cabat thank you. I have losts when number of messages are sent from HA to nodes(throught mqtt ethernet gateway) and in the same time nodes are sending messages to controller as well. I described issue on Home Assistant forum but without any response - https://community.home-assistant.io/t/lost-messages-sent-simultaneously/363904
-
yes it's not easy, the loss of package is a difficult thing to
to counter, but not entirely.
and the multiple layers of a computer system do not helpsome philosophy on collision avoidance
https://arduino.stackexchange.com/questions/24523/rs485-multimaster-communication-with-collision-avoidancedon't mix the Protocol (data encapsulation)
and the physical support (voltage frequency impendance / star or serial bus)the ModBus protocol on a RS485 support
https://www.electroniclinic.com/arduino-modbus-rs485-arduino-rs485-master-and-slave/a different explanation https://www.codrey.com/learn/rs-485-arduino-quick-primer/
for information
https://github.com/sonyarouje/Arduino_HardwareSerial_RS485But the best solution (reliability and especially lightness of the sketch) is the CAN bus
I may have said some stupid things
Translated with www.DeepL.com/Translator (free version)
-
a line of the examples given in the sketches for the use of RS485 can be a source of problem
(it's my case, I use Pin2 or3 for a long time )...
// Define this to enables DE-pin management on defined pin
#define MY_RS485_DE_PIN 2
(2 or 3 is an interrupt pin for a Uno)
...avoided interrupt pins.
the pin 10 is a good thing
-
Thank you @JeeLet !
I've been struggling with missing msgs for years with my Arduino Mega
I changed pin and no issues!
In the pjon code I've reached to list of tested pins that communication works properly
https://github.com/gioblu/PJON/blob/38e36bb1228c1690143cfbf693a0bcb809514d6c/src/strategies/OverSampling/README.md?plain=1#L12