Node - Gateway communication issues
-
I have a test setup comprised of two 3.3V Arduino Pro Minis, each hooked to an RFM69HW 433MHz module.
I configured the Temp/RH node to send the readings every second to the gateway. All works fine until either I reset the gateway, or some hickup occurs and then the remote node stops sending messages even if I reset the gateway, or reinstall its sketch. Looks like if it can't reach the gateway it enters some fault mode and stays there until I reset it.Here's the node's sketch
#define MY_NODE_ID 2 #define MY_DEBUG #define MY_RADIO_RFM69 #define MY_RFM69_FREQUENCY RF69_433MHZ #define MY_IS_RFM69HW #define MY_RFM69_NETWORKID 100 #include <MySensors.h> #include <SPI.h> #include <Wire.h> #include "Adafruit_Si7021.h" #define COMPARE_TEMP 0 unsigned long SLEEP_TIME = 1000; Adafruit_Si7021 sensor = Adafruit_Si7021(); MyMessage msgTemp(1, V_TEMP); MyMessage msgRh(2, V_HUM); float lastTemp; float lastRh; boolean requestACK = false; void setup() { delay(100); sendSketchInfo("Temperature/RH Sensor N1 RFM69", "1.1"); sensor.begin(); present(1, S_TEMP); present(2, S_HUM); } void loop() { unsigned long startTime = micros(); lastRh = sensor.readHumidity(); lastTemp = sensor.readTemperature(); send(msgTemp.set(lastTemp,2)); send(msgRh.set(lastRh,2)); unsigned long endTime = micros(); unsigned long txTime = endTime - startTime; Serial.print("Time awake: "); Serial.print(txTime/1000); Serial.println("ms"); sleep(SLEEP_TIME); }
And here's the gateway sketch
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * The ArduinoGateway prints data received from sensors on the serial link. * The gateway accepts input on seral which will be sent out on radio network. * * The GW code is designed for Arduino Nano 328p / 16MHz * * Wire connections (OPTIONAL): * - Inclusion button should be connected between digital pin 3 and GND * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * * LEDs (OPTIONAL): * - To use the feature, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or recieve crc error * */ // Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached //#define MY_RADIO_NRF24 #define MY_RADIO_RFM69 #define MY_RFM69_FREQUENCY RF69_433MHZ #define MY_IS_RFM69HW #define MY_RFM69_NETWORKID 100 // Set LOW transmit power level as default, if you have an amplified NRF-module and // power your radio separately with a good regulator you can turn up PA level. #define MY_RF24_PA_LEVEL RF24_PA_LOW // Enable serial gateway #define MY_GATEWAY_SERIAL // Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif // Flash leds on rx/tx/err #define MY_LEDS_BLINKING_FEATURE // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Inverses the behavior of leds //#define MY_WITH_LEDS_BLINKING_INVERSE // Enable inclusion mode #define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway #define MY_INCLUSION_BUTTON_FEATURE // Inverses behavior of inclusion button (if using external pullup) #define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button #define MY_INCLUSION_MODE_BUTTON_PIN 3 // Uncomment to override default HW configurations //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 5 // the PCB, on board LED #include <SPI.h> #include <MySensors.h> bool promiscuousMode = true; void setup() { // Setup locally attached sensors } void presentation() { // Present locally attached sensors } void loop() { // Send locally attached sensor data here }
The libraries are untouched and I'm using Arduino IDE 1.6.13 with the AVR Boards version 1.6.15.
Here's what happens to the node when I reset the gateway:Starting sensor (RRNNA-, 2.0.0) TSM:INIT TSM:RADIO:OK TSP:ASSIGNID:OK (ID=2) TSM:FPAR TSP:MSG:SEND 2-2-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc: TSP:MSG:READ 0-0-2 s=255,c=3,t=8,pt=1,l=1,sg=0:0 TSP:MSG:FPAR RES (ID=0, dist=0) TSP:MSG:PAR OK (ID=0, dist=1) TSM:FPAR:OK TSM:ID TSM:CHKID:OK (ID=2) TSM:UPL TSP:PING:SEND (dest=0) TSP:MSG:SEND 2-2-0-0 s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=ok:1 TSP:MSG:READ 0-0-2 s=255,c=3,t=25,pt=1,l=1,sg=0:1 TSP:MSG:PONG RECV (hops=1) TSP:CHKUPL:OK TSM:UPL:OK TSM:READY TSP:MSG:SEND 2-2-0-0 s=255,c=3,t=11,pt=0,l=25,sg=0,ft=0,st=ok:Temperature/RH Sensor N1 TSP:MSG:SEND 2-2-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=ok:1.1 TSP:MSG:SEND 2-2-0-0 s=1,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=ok: TSP:MSG:SEND 2-2-0-0 s=2,c=0,t=7,pt=0,l=0,sg=0,ft=0,st=ok: TSP:MSG:SEND 2-2-0-0 s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=ok:0100 !TSP:MSG:SEND 2-2-0-0 s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=fail:2.0.0 TSP:MSG:SEND 2-2-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,ft=1,st=ok:0 Request registration... TSP:MSG:SEND 2-2-0-0 s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=ok:2 TSP:MSG:READ 0-0-2 s=255,c=3,t=27,pt=1,l=1,sg=0:1 Node registration=1 Init complete, id=2, parent=0, distance=1, registration=1 TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.40 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.47 Time awake: 128ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.39 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.44 Time awake: 126ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.40 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.46 Time awake: 128ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.40 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.45 Time awake: 126ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.41 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.47 Time awake: 170ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.41 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.47 Time awake: 168ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.39 !TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=fail:41.45 Time awake: 300ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=1,st=ok:23.39 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.47 Time awake: 147ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.40 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.47 Time awake: 157ms TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=ok:23.40 TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=ok:41.47 Time awake: 183ms !TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=fail:23.40 !TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=1,st=fail:41.45 Time awake: 333ms !TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=2,st=fail:23.40 !TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=3,st=fail:41.45 Time awake: 335ms !TSP:MSG:SEND 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,ft=4,st=fail:23.39 !TSP:MSG:SEND 2-2-0-0 s=2,c=1,t=1,pt=7,l=5,sg=0,ft=5,st=fail:41.46 Time awake: 335ms !TSM:UPL FAIL, SNP TSM:FPAR TSP:MSG:SEND 2-2-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc: !TSP:SEND:TNR !TSP:SEND:TNR Time awake: 54ms !TSP:SEND:TNR !TSP:SEND:TNR Time awake: 54ms !TSP:SEND:TNR !TSP:SEND:TNR Time awake: 54ms !TSP:SEND:TNR !TSP:SEND:TNR Time awake: 54ms !TSP:SEND:TNR !TSP:SEND:TNR Time awake: 54ms !TSP:SEND:TNR !TSP:SEND:TNR Time awake: 54ms !TSP:SEND:TNR !TSP:SEND:TNR Time awake: 54ms !TSP:SEND:TNR !TSP:SEND:TNR
I don't even know what's the meaning TSP and TNR.
-
It seems that adding:
#define MY_PARENT_NODE_IS_STATIC
is of some help, however I did noticed a large increase in TX time even though i set
boolean requestACK = false;
So the whole protocol appears to resemble more with TCP rather than UDP. All things considered I believe the remote battery powered nodes should be able to successfully recover from a temporarily gateway failure without increasing their TX time substantially. The TNR state is excellent when it comes to TX time during gateway failure but it misses a mechanism to automatically recover from this state once the gateway is back. ** MY_PARENT_NODE_IS_STATIC** allows for recovery but at the expense if doubling the TX time. So in production you either manually reset all sensor nodes after a gateway failure, or you take immediate action to minimize the impact on the sensors batteries.