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.


 

249
Online

7.8k
Users

8.7k
Topics

92.9k
Posts