Cannot add Nodes trough RS 485
-
Hello,
I would like to ask you for your help. I frozen on adding a Nodes to Mycontroller.
I am using Serial RS485 gateway - This I managed to add to MyController
As a Nod I am using DHT sketch with RS485 enabled and NOD definition
#define MY_NODE_ID 22 #define MY_PARENT_NODE_ID 0If I try to add Node manually Node is in status down
Communication between GW and Node works well
0;255;3;0;9;0 MCO:BGN:INIT GW,CP=RSNGA---,FQ=16,REL=255,VER=2.3.2 0;255;3;0;9;5 TSM:INIT 0;255;3;0;9;7 TSF:WUR:MS=0 0;255;3;0;9;10 TSM:INIT:TSP OK 0;255;3;0;9;13 TSM:INIT:GW MODE 0;255;3;0;9;15 TSM:READY:ID=0,PAR=0,DIS=0 0;255;3;0;9;19 MCO:REG:NOT NEEDED 0;255;3;0;14;Gateway startup complete. 0;255;0;0;18;2.3.2 0;255;3;0;9;23 MCO:BGN:STP 0;255;3;0;9;29 MCO:BGN:INIT OK,TSP=1 0;255;3;0;9;33 TSM:READY:NWD REQ 0;255;3;0;9;53 ?TSF:MSG:SEND,0-0-255-255,s=255,c=3,t=20,pt=0,l=0,sg=0,ft=0,st=OK: 0;255;3;0;9;7954 TSF:MSG:READ,22-22-0,s=0,c=1,t=1,pt=7,l=5,sg=0:41.0 22;0;1;0;1;41.0Thank you very much for any advice
-
Hello,
I would like to ask you for your help. I frozen on adding a Nodes to Mycontroller.
I am using Serial RS485 gateway - This I managed to add to MyController
As a Nod I am using DHT sketch with RS485 enabled and NOD definition
#define MY_NODE_ID 22 #define MY_PARENT_NODE_ID 0If I try to add Node manually Node is in status down
Communication between GW and Node works well
0;255;3;0;9;0 MCO:BGN:INIT GW,CP=RSNGA---,FQ=16,REL=255,VER=2.3.2 0;255;3;0;9;5 TSM:INIT 0;255;3;0;9;7 TSF:WUR:MS=0 0;255;3;0;9;10 TSM:INIT:TSP OK 0;255;3;0;9;13 TSM:INIT:GW MODE 0;255;3;0;9;15 TSM:READY:ID=0,PAR=0,DIS=0 0;255;3;0;9;19 MCO:REG:NOT NEEDED 0;255;3;0;14;Gateway startup complete. 0;255;0;0;18;2.3.2 0;255;3;0;9;23 MCO:BGN:STP 0;255;3;0;9;29 MCO:BGN:INIT OK,TSP=1 0;255;3;0;9;33 TSM:READY:NWD REQ 0;255;3;0;9;53 ?TSF:MSG:SEND,0-0-255-255,s=255,c=3,t=20,pt=0,l=0,sg=0,ft=0,st=OK: 0;255;3;0;9;7954 TSF:MSG:READ,22-22-0,s=0,c=1,t=1,pt=7,l=5,sg=0:41.0 22;0;1;0;1;41.0Thank you very much for any advice
-
@qobouky seems you have problem with MyController and serial port communication. I do not see the node
0too (gateway node).
can you check the MyController log file, is there any error? Also check the baud rate and port number of your serial device. -
Of course it was issue on my side. My understanding was that GW baud rate in mycontroller should be baud rate of RS485. When I changed baud rate to correct value everything works well. Nod is added automatically.
But I would like to kindly ask you for next suggestion.
I plan to use one Arduino to monitor Temp, Hum and CO2. Those sensors are presented in MyController as static now.
Additionally script should control 3 relays. I added relay script from My sensors but I have no idea where I should see those relays in MyController and how to control them manually
// 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 // Enable this if RS485 is connected to a hardware serial port //#define MY_RS485_HWSERIAL Serial1 #define MY_NODE_ID 20 #include <MySensors.h> static const uint64_t UPDATE_INTERVAL = 10000; #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 #define CHILD_ID_CO2 2 #define RELAY_PIN 10 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 3 // Total number of attached relays #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); MyMessage msgCo2(CHILD_ID_CO2, V_LEVEL); MyMessage msgCo2b(CHILD_ID_CO2, V_UNIT_PREFIX); // ---------------------------------------------------------------------------- void before() { for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } } void presentation() { // Send the sketch version information to the gateway sendSketchInfo("Lihen", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID_HUM, S_HUM); present(CHILD_ID_TEMP, S_TEMP); present(CHILD_ID_CO2, S_AIR_QUALITY); send(msgCo2b.set("ppm")); for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_BINARY); } } // ---------------------------------------------------------------------------- void setup() { Serial.println( F("Arduino MySensors RS485 Node test") ); // Fonction F() permet de placer la chaine dans la mémoire eprogramme (Arduino IDE 1.0). analogReference(INTERNAL); delay(1000); } void loop() { Serial.println( F("Loop ...") ); TempHum(); readCO2(); // Sleep for a while to save energy sleep(UPDATE_INTERVAL); } void TempHum () { int temperature = 30; int humidity = 50; Serial.print(F("Tmp: ")); Serial.println(temperature); Serial.print(F("Hum: ")); Serial.println(humidity); send(msgTemp.set(temperature, 1)); send(msgHum.set(humidity, 1)); } int readCO2() { int CO2value = 1550; Serial.print(F("CO2: ")); Serial.println(CO2value); send(msgCo2.set(CO2value)); } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.getType()==V_STATUS) { // Change relay state digitalWrite(message.getSensor()-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(message.getSensor(), message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.getSensor()); Serial.print(", New status: "); Serial.println(message.getBool()); } } -
Of course it was issue on my side. My understanding was that GW baud rate in mycontroller should be baud rate of RS485. When I changed baud rate to correct value everything works well. Nod is added automatically.
But I would like to kindly ask you for next suggestion.
I plan to use one Arduino to monitor Temp, Hum and CO2. Those sensors are presented in MyController as static now.
Additionally script should control 3 relays. I added relay script from My sensors but I have no idea where I should see those relays in MyController and how to control them manually
// 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 // Enable this if RS485 is connected to a hardware serial port //#define MY_RS485_HWSERIAL Serial1 #define MY_NODE_ID 20 #include <MySensors.h> static const uint64_t UPDATE_INTERVAL = 10000; #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 #define CHILD_ID_CO2 2 #define RELAY_PIN 10 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 3 // Total number of attached relays #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); MyMessage msgCo2(CHILD_ID_CO2, V_LEVEL); MyMessage msgCo2b(CHILD_ID_CO2, V_UNIT_PREFIX); // ---------------------------------------------------------------------------- void before() { for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } } void presentation() { // Send the sketch version information to the gateway sendSketchInfo("Lihen", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID_HUM, S_HUM); present(CHILD_ID_TEMP, S_TEMP); present(CHILD_ID_CO2, S_AIR_QUALITY); send(msgCo2b.set("ppm")); for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_BINARY); } } // ---------------------------------------------------------------------------- void setup() { Serial.println( F("Arduino MySensors RS485 Node test") ); // Fonction F() permet de placer la chaine dans la mémoire eprogramme (Arduino IDE 1.0). analogReference(INTERNAL); delay(1000); } void loop() { Serial.println( F("Loop ...") ); TempHum(); readCO2(); // Sleep for a while to save energy sleep(UPDATE_INTERVAL); } void TempHum () { int temperature = 30; int humidity = 50; Serial.print(F("Tmp: ")); Serial.println(temperature); Serial.print(F("Hum: ")); Serial.println(humidity); send(msgTemp.set(temperature, 1)); send(msgHum.set(humidity, 1)); } int readCO2() { int CO2value = 1550; Serial.print(F("CO2: ")); Serial.println(CO2value); send(msgCo2.set(CO2value)); } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.getType()==V_STATUS) { // Change relay state digitalWrite(message.getSensor()-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(message.getSensor(), message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.getSensor()); Serial.print(", New status: "); Serial.println(message.getBool()); } }@qobouky to get
V_STATUS, you can do it two ways- (added automatically in MyController) Send the current status of the relays on your presentation block in your MySensors sketch
- (add manually in MyController) - you can see
S_BINARYsensors in MyController on this node. You can add aV_STATUSvariable on eachS_BINARYsensor in MyController
You will get a control option for your relays.
-
Sorry but do I understand correctly that relay should be visible as a Sensor in MyController?

@qobouky You are correct, the Binary type sensors should be visible here.
I just revisited your sketch and I found a conflict on the allocated sensors id#define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 #define CHILD_ID_CO2 2 #define NUMBER_OF_RELAYS 3 // Total number of attached relays void presentation() { present(CHILD_ID_HUM, S_HUM); present(CHILD_ID_TEMP, S_TEMP); present(CHILD_ID_CO2, S_AIR_QUALITY); for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_BINARY); } }your relay sensor id should start from 3 or above.
I do not see the use ofpin=RELAY_PIN.
You can present the status of your relay's, that can createV_STATUSon MyControllerexample:
#define RELAY_SENSOR 3 // Relay sensor starts at 3 void presentation() { .... MyMessage relayMsg(RELAY_SENSOR, V_STATUS); for (int sensor=RELAY_SENSOR; sensor < (RELAY_SENSOR + NUMBER_OF_RELAYS); sensor++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_BINARY); relayMsg.sensor = sensor; send(relayMsg.set(loadState(sensor))); // current status of the relay } }NOTE: You have to update your relay code on
setupand inreceivetoo
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login

