Node to Node Communication via Gatreway
- 
					
					
					
					
 My topology is as follows, 
 Node-1 <--> Gateway <--> Node-2.When I send message from Node-1 to Node-2 (or) Node-2 to Node-1 is not working, 
 Node-1 and Node-2 are repeater nodes.Gateway does not route packets to another node in the network? 
 
- 
					
					
					
					
 That's strange. You probably have to look at the serial output from the nodes and gateway to find the cause. 
 
- 
					
					
					
					
 @hek Thank you I did serial debug, I'm not clear about route (to) address 
 https://github.com/mysensors/Arduino/blob/development/libraries/MySensors/MySensor.cpp#L401Node-1: 
 send: 1-1-0-0 s=255,c=0,t=18,pt=0,l=6,sg=0,st=ok:1.5 b1
 send: 1-1-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
 repeater started, id=1, parent=0, distance=1
 send: 1-1-0-0 s=255,c=3,t=11,pt=0,l=16,sg=0,st=ok:LevelSensor
 send: 1-1-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0
 send: 1-1-0-0 s=1,c=0,t=15,pt=0,l=6,sg=0,st=ok:1.5 b1
 send: 1-1-0-0 s=1,c=1,t=13,pt=2,l=2,sg=0,st=ok:0
 send: 1-1-3-3 s=1,c=1,t=13,pt=2,l=2,sg=0,st=fail:0above '3' is 'to' (route) address, I do not understand what is '3' and how it was calculated, I hope here 'to' should be a parent address, which is 0 Gateway: 
 0;0;3;0;9;gateway started, id=0, parent=0, distance=0
 0;0;3;0;14;Gateway startup complete.
 0;0;3;0;9;read: 1-1-0 s=255,c=0,t=18,pt=0,l=6,sg=0:1.5 b1
 1;255;0;0;18;1.5 b1
 0;0;3;0;9;read: 1-1-0 s=255,c=3,t=6,pt=1,l=1,sg=0:0
 1;255;3;0;6;0
 0;0;3;0;9;read: 1-1-0 s=255,c=3,t=11,pt=0,l=16,sg=0:LevelSensor1;255;3;0;11;LevelSensor 
 0;0;3;0;9;read: 1-1-0 s=255,c=3,t=12,pt=0,l=3,sg=0:1.0
 1;255;3;0;12;1.0
 0;0;3;0;9;read: 1-1-0 s=1,c=0,t=15,pt=0,l=6,sg=0:1.5 b1
 1;1;0;0;15;1.5 b1
 0;0;3;0;9;read: 1-1-0 s=1,c=1,t=13,pt=2,l=2,sg=0:0
 1;1;1;0;13;00;0;3;0;9;read: 3-3-0 s=255,c=0,t=18,pt=0,l=6,sg=0:1.5 b1 
 3;255;0;0;18;1.5 b1
 0;0;3;0;9;read: 3-3-0 s=255,c=3,t=6,pt=1,l=1,sg=0:0
 3;255;3;0;6;0
 0;0;3;0;9;read: 3-3-0 s=255,c=3,t=11,pt=0,l=19,sg=0:LevelIndicator
 3;255;3;0;11;LevelIndicator
 0;0;3;0;9;read: 3-3-0 s=255,c=3,t=12,pt=0,l=3,sg=0:1.0
 3;255;3;0;12;1.0
 0;0;3;0;9;read: 3-3-0 s=1,c=0,t=15,pt=0,l=6,sg=0:1.5 b1
 3;1;0;0;15;1.5 b1Node-2: 
 send: 3-3-0-0 s=255,c=0,t=18,pt=0,l=6,sg=0,st=ok:1.5 b1
 send: 3-3-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
 repeater started, id=3, parent=0, distance=1
 send: 3-3-0-0 s=255,c=3,t=11,pt=0,l=19,sg=0,st=ok:LevelIndicator
 send: 3-3-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0
 send: 3-3-0-0 s=1,c=0,t=15,pt=0,l=6,sg=0,st=ok:1.5 b1
 send: 3-3-1-1 s=1,c=1,t=13,pt=2,l=2,sg=0,st=fail:0
 
- 
					
					
					
					
 What does your code look like on the sending node (1)? 
 
- 
					
					
					
					
 #define NODE_ID (int8_t) 1 #define N_LEVEL_DISPLAY_ID (int8_t) 3 #define S_LEVEL_DISPLAY_ID (int8_t) 1 MySensor gw; gw.begin(incomingMessage, NODE_ID, true); MyMessage levelDisplayBoard(S_LEVEL_DISPLAY_ID, V_DISTANCE); levelDisplayBoard.setDestination(N_LEVEL_DISPLAY_ID); int dist = getDistance(); gw.send(levelDisplayBoard.set(dist));
 
- 
					
					
					
					
 I think node 1 has a corrupt routing table (it thinks node 3 is a child). Try clearing eeprom and re-upload your sketch. Or disable repeater-mode on it. 
 
- 
					
					
					
					
 How to print routing table in serial console? 
 
- 
					
					
					
					
 You have to read it from eeprom. 
 It starts at position: EEPROM_ROUTES_ADDRESS (defined in MySensors.h)
 
- 
					
					
					
					
 @hek you are right! There was an entry for Node-2 in Node-1 routing table, As it has direct access to Node-2, was trying to send directly. I removed the entry and now it's going throw gateway. All node works well. Perfect! I thing we have to add code to remove routing table entry dynamically if it face some N number of failures. It will make life easier for those who is shifting node from one location to another location often. 
 
- 
					
					
					
					
 Hello, Sorry to resort to an old topic ... 
 I am currently using mysensors RS485, and I would like to extend my installation with this protocol.
 and I would like to make the nodes communicate with each other through the gateway.
 But I can't do what I want ... help!
 on my node 4, I have an input and 1 output, the input activates and deactivates the output. (here no worries).
 On my node 5, I have an input to activate the output of node 4, so I can turn it off but not turn it on, and I don't see any frames towards the gatewayhere is the code for my node 5: // MySensors #define MY_PARENT_NODE_ID 0 // define if fixed parent #define MY_PARENT_NODE_IS_STATIC #undef MY_REGISTRATION_FEATURE // sketch moves on if no registration #define MY_NODE_ID 5 // fixed node number // Enable debug prints to serial monitor #define MY_DEBUG // 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 9600 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Flash leds on rx/tx/err //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED // Enable this if RS485 is connected to a hardware serial port //#define MY_RS485_HWSERIAL Serial1 //#include <MqttClient.h> #include <SPI.h> #include <MySensors.h> #include <Bounce2.h> #define CHILD_ID 4 #define BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch Bounce debouncer = Bounce(); int oldValue=0; bool state; // Change to V_LIGHT if you use S_LIGHT in presentation below MyMessage msg(CHILD_ID,V_LIGHT); void setup() { // Setup the button pinMode(BUTTON_PIN,INPUT_PULLUP); // Activate internal pull-up //digitalWrite(BUTTON_PIN,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.interval(5); } void presentation() { // Register binary input sensor to gw (they will be created as child devices) // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. // If S_LIGHT is used, remember to update variable type you send in. See "msg" above. sendSketchInfo("Button", "1.1"); present(CHILD_ID, S_LIGHT); } // Check if digital input has changed and send in new value void loop() { debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue && value==0) { msg.setDestination(4); send(msg.set(state?false:true), false);// Send new state and request ack back } oldValue = value; }
 
- 
					
					
					
					
 @FullMetal Imo, you have to specify all send-settings in one line, e.g. like this: send(buttonMsg.setDestination(MY_SISTER_NODE_ID).setSensor(CHILD_ID_RESET).set( button[i] ? "1" : "0"));
 
- 
					
					
					
					
 @rejoe2 
 thank you for your return,
 but I have the same problem, I manage to activate the relay of node 4 from node 5, but I cannot deactivate it. and when I act on node 5 the gateway does not receive frames since it calls node 4.
 I think that node 4 should send the relay status to node 5 so that it knows whether it is activated or not.
 
- 
					
					
					
					
 @FullMetal Please post a full debug log of both nodes showing the observed behaviour. 
 
- 
					
					
					
					
 @FullMetal Pls add also code from node 4. In general: - if you want also info from node 5 to be sent to your controller/gateway, you have to add a second (normal) send command.
- wrt. to how node 4 reacts on the messages, you may better use sth. like a toggle logic.
 
 
- 
					
					
					
					
 @tekka @rejoe2 
 Désolé de revenir si tard ..
 J'ai modifié mon code sur mes nœuds, mais le résultat n'est toujours pas là!Voici mes codes: node 4: // MySensors #define MY_PARENT_NODE_ID 0 // define if fixed parent #define MY_PARENT_NODE_IS_STATIC #undef MY_REGISTRATION_FEATURE // sketch moves on if no registration #define MY_NODE_ID 4 // fixed node number // Enable debug prints to serial monitor #define MY_DEBUG // 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 9600 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Flash leds on rx/tx/err //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED #include <MySensors.h> #include <Bounce2.h> #define RELAY_PIN 4 // Arduino Digital I/O pin number for relay #define BUTTON_PIN 3 // Arduino Digital I/O pin number for button #define CHILD_ID 1 // Id of the sensor child #define SYSTER_ID 5 #define RELAY_ON 1 #define RELAY_OFF 0 Bounce debouncer = Bounce(); int oldValue=0; bool state; MyMessage msg(CHILD_ID,V_LIGHT); //MyMessage msgconf(CHILD_ID,V_VAR1); void setup() { // Setup the button pinMode(BUTTON_PIN,INPUT_PULLUP); // Activate internal pull-up //digitalWrite(BUTTON_PIN,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.interval(5); // Make sure relays are off when starting up digitalWrite(RELAY_PIN, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN, OUTPUT); // Set relay to last known state (using eeprom storage) state = loadState(CHILD_ID); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Relay & Button", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID, S_LIGHT); } /* * Example on how to asynchronously check for new messages from gw */ void loop() { debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue && value==0) { send(msg.setDestination(MY_PARENT_NODE_ID).setSensor(CHILD_ID).set(state?false:true), true); // Send new state and request ack back wait(100); send(msg.setDestination(SYSTER_ID).setSensor(CHILD_ID).set(state?false:true), true); } oldValue = value; } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.isAck()) { Serial.println("This is an ack from gateway"); } if (message.type == V_LIGHT) { // Change relay state state = message.getBool(); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(CHILD_ID, state); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }node 5: // MySensors #define MY_PARENT_NODE_ID 0 // define if fixed parent #define MY_PARENT_NODE_IS_STATIC #undef MY_REGISTRATION_FEATURE // sketch moves on if no registration #define MY_NODE_ID 5 // fixed node number // Enable debug prints to serial monitor #define MY_DEBUG // 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 9600 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Flash leds on rx/tx/err //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED // Enable this if RS485 is connected to a hardware serial port //#define MY_RS485_HWSERIAL Serial1 //#include <MqttClient.h> #include <SPI.h> #include <MySensors.h> #include <Bounce2.h> #define CHILD_ID 1 #define SYSTER_ID 4 #define BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch Bounce debouncer = Bounce(); int oldValue=0; bool state; // Change to V_LIGHT if you use S_LIGHT in presentation below MyMessage msg(CHILD_ID,V_LIGHT); void setup() { // Setup the button pinMode(BUTTON_PIN,INPUT_PULLUP); // Activate internal pull-up //digitalWrite(BUTTON_PIN,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.interval(5); } void presentation() { // Register binary input sensor to gw (they will be created as child devices) // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. // If S_LIGHT is used, remember to update variable type you send in. See "msg" above. sendSketchInfo("Button", "1.1"); present(CHILD_ID, S_LIGHT); } // Check if digital input has changed and send in new value void loop() { debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue && value==0) { send(msg.setDestination(MY_PARENT_NODE_ID).setSensor(CHILD_ID).set(state?false:true), false);// Send new state and request ack back Serial.println("wait 1/10sec"); wait(100); send(msg.setDestination(SYSTER_ID).setSensor(CHILD_ID).set(state?false:true), false); } oldValue = value; } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.isAck()) { Serial.println("This is an ack from gateway"); } if (message.type == V_LIGHT) { // Change relay state state = message.getBool(); //digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(SYSTER_ID, state); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }From node 4, my output is activated and deactivated immediately, due to double sending from node 5, I can activate or deactivate if I launch the command from node 4 before otherwise. 
 
- 
					
					
					
					
 @FullMetal said in Node to Node Communication via Gatreway: Please upload the debug logs for further troubleshooting. 
 
- 
					
					
					
					
 @tekka said in Node to Node Communication via Gatreway: @FullMetal said in Node to Node Communication via Gatreway: Please upload the debug logs for further troubleshooting. Sorry Debug logs node 4 
 Press button node 408:16:01.668 -> 13555 TSF:MSG:SEND,4-4-0-0,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=0,st=OK:0 
 08:16:01.701 -> 13582 TSF:MSG:READ,0-0-4,s=1,c=1,t=2,pt=1,l=1,sg=0:0
 08:16:01.701 -> 13586 TSF:MSG:ECHO
 08:16:01.701 -> This is an ack from gateway08:16:01.701 -> Incoming change for sensor:1, New status: 0 08:16:01.800 -> 13678 TSF:MSG:SEND,4-4-5-5,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=0,st=OK:1 
 08:16:01.800 -> 13684 TSF:RTE:N2N OK
 08:16:01.800 -> 13703 TSF:MSG:READ,5-5-4,s=1,c=1,t=2,pt=1,l=1,sg=0:1
 08:16:01.833 -> 13708 TSF:MSG:ECHO
 08:16:01.833 -> This is an ack from gateway08:16:01.833 -> Incoming change for sensor:1, New status: 1 Press button node 5 08:21:01.371 -> 313012 TSF:MSG:READ,5-5-4,s=1,c=1,t=2,pt=1,l=1,sg=0:0 
 08:21:01.371 -> Incoming change for sensor:1, New status: 0second press node 5 08:21:06.238 -> 317865 TSF:MSG:READ,5-5-4,s=1,c=1,t=2,pt=1,l=1,sg=0:0 
 08:21:06.238 -> Incoming change for sensor:1, New status: 0Debug logs node 5 
 Press button node 408:23:59.955 -> 51752 TSF:MSG:READ,4-4-5,s=1,c=1,t=2,pt=1,l=1,sg=0:1 
 08:23:59.955 -> 51757 TSF:MSG:ECHO REQ
 08:23:59.988 -> 51777 TSF:MSG:SEND,5-5-4-4,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=0,st=OK:1
 08:23:59.988 -> 51783 TSF:RTE:N2N OK
 08:23:59.988 -> Incoming change for sensor:1, New status: 1Press button node 5 08:24:36.929 -> 88704 TSF:MSG:SEND,5-5-0-0,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=0,st=OK:0 
 08:24:36.929 -> wait 1/10sec08:24:37.062 -> 88827 TSF:MSG:SEND,5-5-4-4,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=0,st=OK:0 
 08:24:37.062 -> 88834 TSF:RTE:N2N OKDebug logs gateway 
 Press button node 4 and node 508:26:19.261 -> 0;255;3;0;9;79078 TSF:MSG:READ,4-4-0,s=1,c=1,t=2,pt=1,l=1,sg=0:0 
 08:26:19.261 -> 0;255;3;0;9;79084 TSF:MSG:ACK REQ
 08:26:19.294 -> 0;255;3;0;9;79105 TSF:MSG:SEND,0-0-4-4,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=0,st=OK:0
 08:26:19.294 -> 4;1;1;0;2;0
 08:26:20.321 -> 0;255;3;0;9;80116 TSF:MSG:READ,5-5-0,s=1,c=1,t=2,pt=1,l=1,sg=0:0
 08:26:20.321 -> 5;1;1;0;2;0
 
- 
					
					
					
					
 ask the gateway not to send back acq 
 send(msg.setDestination(MY_PARENT_NODE_ID).setSensor(CHILD_ID).set(state?false:true), false); // Send new state and request ack back
 wait(100);
 send(msg.setDestination(SYSTER_ID).setSensor(CHILD_ID).set(state?false:true), true);
 
- 
					
					
					
					
 Good to her you found that point  . .
 Imo you'd better change also your receive functions to not react on "ack" messages (via "else" prior to message.type-comparison).
 
 
			
		 
			
			 
					
				