ESP8266 WiFi MQTT gateway won't respond to parent request.



  • Hi everybody,

    Having a weird issue with my WiFi gateway. My nodes get FPAR:NO REPLY consistently when they start up. If i use another gateway, they work immediately.

    If I switch gateways to the WiFi after the nodes have a parent and are asleep, it works fine. I had it run like that the whole weekend with no issues so I doubt it's a radio problem.
    Unfortunately when I built the gateway, I didn't have an 8pin DIL socket so I had to solder the radio in place, making testing out with another very difficult.

    I've tried with vesion 2.3.1 as well as the dev branch from github.

    Background
    This Gateway has been working for over a year with a temperature sensor node on a ATMEGA168 Seeduino arduino board. Both were running MySensors 2.1.1.
    I decided to replace the arduino with a dedicated board I made with a ATMEGA328 running at 8Mhz using the MYSBootloader.
    After soldering up the board, I loaded the sketch with MySensors 2.3.1 and tested with an Ethernet Gateway on my Arduino Duemilanove.
    When it worked fine for a couple of days, I upgraded the Wifi gateway to 2.3.1 as well.

    Original node connected to the Wifi gateway and ran fo another few days while I made a case for the new node.

    When I switched the nodes, the new one would not connect. Power cycled both but no dice. Both are located in awkward positions so I removed them, flased each with the Clear EEPROM sketch and reloaded firmware but still no connection.
    Also tried with a 16Mhz board with MYSBootloader because I didn't solder headers to the 8Mhz board for serial and it became a pain to pull the chip out to flash.

    My setup:
    Wifi Gateway:
    ESP8266 12-E with a NRF24L2401+
    5v power supply with a HT7833 on the ESP8266 with a 100 nF Bypass across VCC and Gnd.
    AMS1117 on the NRF24L01+ with a 4.7uF Electrolytical Bypass Cap (Added a 100uF as well in testing while trying to debug)

    DS18B20 Temperature Node
    ATMEGA328 with MYSBootlader @ 8Mhz internal powered with a 5v Regulated Wall Wart power supply.
    AMS1117 regulator for the NRF24L01+ with 47uF Bypass Capacitor.

    Second test node
    ATMEGA328 with MYSBootlader @ 16Mhz crystal oscillator powered with a 5v Regulated power bank.
    AMS1117 regulator for the NRF24L01+ with 47uF Bypass Capacitor.

    WIFI Gateway Sketch

    // Enable debug prints to serial monitor
    #define MY_DEBUG
    //#define MY_DEBUG_VERBOSE_RF24  
    #define   MY_DEBUG_VERBOSE_GATEWAY
    
    // Use a bit lower baudrate for serial prints on ESP8266 than default in MyConfig.h
    #define MY_BAUD_RATE 9600
    
    //#define MY_RF24_CHANNEL 26
    //#define MY_RF24_DATARATE RF24_250KBPS
    //#define MY_RF24_DATARATE RF24_1MBPS
    
    // Enables and select radio type (if attached)
    #define MY_RADIO_RF24
    
    #define MY_GATEWAY_MQTT_CLIENT
    #define MY_GATEWAY_ESP8266
    
    // Set this node's subscribe and publish topic prefix
    #define MY_MQTT_PUBLISH_TOPIC_PREFIX "sensors-out"
    #define MY_MQTT_SUBSCRIBE_TOPIC_PREFIX "sensors-in"
    
    // Set MQTT client id
    #define MY_MQTT_CLIENT_ID "mysensors-esp"
    
    // Set WIFI SSID and password
    #define MY_WIFI_SSID "wifi_ssid"
    #define MY_WIFI_PASSWORD "wifi_password"
    
    // Set the hostname for the WiFi Client. This is the hostname
    // it will pass to the DHCP server if not static.
    #define MY_HOSTNAME "mqtt-sensor-gateway"
    
    // Enable MY_IP_ADDRESS here if you want a static ip address (no DHCP)
    #define MY_IP_ADDRESS 192,168,1,15
    
    // If using static ip you need to define Gateway and Subnet address as well
    #define MY_IP_GATEWAY_ADDRESS 192,168,1,1
    #define MY_IP_SUBNET_ADDRESS 255,255,255,0
    
    // MQTT broker ip address.
    #define MY_CONTROLLER_IP_ADDRESS 192, 168, 1, 2
    
    // The MQTT broker port to to open
    #define MY_PORT 1883
    
    // Set blinking period
    //#define MY_DEFAULT_LED_BLINK_PERIOD 100
    
    // Flash leds on rx/tx/err
    //Pin 2 is the PCB, on board LED
    //#define MY_DEFAULT_ERR_LED_PIN 5  // Error led pin
    //#define MY_DEFAULT_RX_LED_PIN  2  // Receive led pin
    //#define MY_DEFAULT_TX_LED_PIN  16  // 
    
    #include <ESP8266WiFi.h>
    #include <MySensors.h>
    
    #include <ArduinoOTA.h>
    
    void setup()
    {
    
      Serial.println("Ready");
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());
    
      
        // Setup locally attached sensors
      ArduinoOTA.onStart([]() {
        Serial.println("ArduinoOTA start");
      });
      ArduinoOTA.onEnd([]() {
        Serial.println("\nArduinoOTA end");
      });
      ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
        Serial.printf("OTA Progress: %u%%\r", (progress / (total / 100)));
      });
      ArduinoOTA.onError([](ota_error_t error) {
        Serial.printf("Error[%u]: ", error);
        if (error == OTA_AUTH_ERROR) {
          Serial.println("Auth Failed");
        } else if (error == OTA_BEGIN_ERROR) {
          Serial.println("Begin Failed");
        } else if (error == OTA_CONNECT_ERROR) {
          Serial.println("Connect Failed");
        } else if (error == OTA_RECEIVE_ERROR) {
          Serial.println("Receive Failed");
        } else if (error == OTA_END_ERROR) {
          Serial.println("End Failed");
        }
      });
      ArduinoOTA.begin();
    }
    
    void presentation()
    {
    	// Present locally attached sensors here
      sendSketchInfo("ESP-MC Gateway", "1.2.3", 0);
    }
    
    void loop()
    {
    	// Send locally attech sensors data here
      wdt_disable();
        
      ArduinoOTA.handle();
    
    }
    

    Temperature Node Sketch

    // Enable debug prints to serial monitor
    //#define MY_DEBUG 
    
    //#define MY_RF24_CHANNEL 26
    //#define MY_RF24_DATARATE RF24_250KBPS
    //#define MY_RF24_DATARATE RF24_1MBPS
    
    #define MY_SKETCH_NAME "Temperature Sensor"
    #define MY_SKETCH_VERSION "2.3.2"
    
    #define MY_NODE_ID 10
    #define MY_PARENT_ID 0
    #define CHILD_ID_BATTERY 5
    
    // Enable and select radio type attached
    #define MY_RADIO_RF24
    
    //#define MY_DEFAULT_LED_BLINK_PERIOD 50
    //#define MY_WITH_LEDS_BLINKING_INVERSE
    
    // Set blinking period
    #define MY_DEFAULT_LED_BLINK_PERIOD 100
    
    // Flash leds on rx/tx/err
    // Uncomment to override default HW configurations
    #define MY_DEFAULT_ERR_LED_PIN 5  // Error led pin
    #define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
    #define MY_DEFAULT_TX_LED_PIN  4  // Transmit led pin
    
    #include <MySensors.h>  
    #include <DallasTemperature.h>
    #include <OneWire.h>
    
    #define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
    
    #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
    #define MAX_ATTACHED_DS18B20 3
    unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)
    OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=0;
    bool receivedConfig = false;
    bool metric = true;
    // Initialize temperature message
    MyMessage msg(0,V_TEMP);
    //MyMessage msgbatt(CHILD_ID_BATTERY, V_VOLTAGE);
    
    /////////////////////////////////////////////////
    
    int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
    
    int oldBatteryPcnt = 0;
    
    /////////////////////////////////////////////////
    void before()
    {
      // Startup up the OneWire library
      sensors.begin();
    }
    
    void setup()  
    { 
      // requestTemperatures() will not block current thread
      sensors.setWaitForConversion(false);
    
      ///////////////////////////////////////////////
        // use the 1.1 V internal reference
    #if defined(__AVR_ATmega2560__)
      analogReference(INTERNAL1V1);
    #else
      analogReference(INTERNAL);
    #endif
    ////////////////////////////////////////////////
    }
    
    void presentation() {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo(MY_SKETCH_NAME, MY_SKETCH_VERSION);
    
      // Fetch the number of attached temperature sensors  
      numSensors = sensors.getDeviceCount();
    
      // Present all sensors to controller
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
         present(i, S_TEMP);
      }
    
      present(CHILD_ID_BATTERY, S_MULTIMETER);
    }
    
    int16_t millisToWaitForConversion(uint8_t bitResolution)
    {
      switch (bitResolution)
      {
          case 9:
          return 94;
          case 10:
          return 188;
          case 11:
          return 375;
          default:
          return 750;
      }
    }
    
    void loop()     
    {     
      // Fetch temperatures from Dallas sensors
      sensors.requestTemperatures();
    
      // query conversion time and sleep until conversion completed
      int16_t conversionTime = millisToWaitForConversion(sensors.getResolution());
      // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
      sleep(conversionTime);
    
      // Read temperatures and send them to controller 
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
    
        // Fetch and round temperature to one decimal
        float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
    
        // Only send data if temperature has changed and no error
        //Serial.print(temperature);
        #if COMPARE_TEMP == 1
        if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
        #else
        if (temperature != -127.00 && temperature != 85.00) {
        #endif
    
          // Send in the new temperature
          send(msg.setSensor(i).set(temperature,1));
          // Save new temperatures for next compare
          lastTemperature[i]=temperature;
        }
      }
    
    //////////////////////////////////////////////////////////////////////////
      // get the battery Voltage
      int sensorValue = analogRead(BATTERY_SENSE_PIN);
    #ifdef MY_DEBUG
      Serial.print("Sensor Reading: ");
      Serial.print(sensorValue);
      Serial.print(" --> modified to -->> ");
      Serial.print(sensorValue*5.5);
      Serial.println(" bits");
    #endif
      // sensorValue = sensorValue * 5.5;
      
      // 1M, 470K divider across battery and using internal ADC ref of 1.1V
      // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
      // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
      // 3.44/1023 = Volts per bit = 0.003363075
    
      int batteryPcnt = sensorValue / 10;
      // ((1M+220k)/220K)*1.1 = Vmax = 6.1 Volts
      // 6.1/1023 = Volts per bit =  0.005962854
      //  // ((220k+1M)/1M)*1.1 = Vmax = 6.1 Volts  // incorrect resistors
      //  // 1.342/1023 = Volts per bit =   0.001311827  // incorrect resistors
      // float batteryV  = sensorValue * 0.00498533724; // incorrect resistors
      float batteryV  = sensorValue * 0.00593824228;
      
    #ifdef MY_DEBUG
    
      Serial.print("Battery Voltage: ");
      Serial.print(batteryV);
      Serial.println(" V");
    
      Serial.print("Battery percent: ");
      Serial.print(batteryPcnt);
      Serial.println(" %");
    #endif
    
      if (oldBatteryPcnt != batteryPcnt) {
        // Power up radio after sleep
        sendBatteryLevel(batteryPcnt);
        oldBatteryPcnt = batteryPcnt;
    //    send(msgbatt.set(batteryV ,2));
      }
    //////////////////////////////////////////////////////////////////////////
      
      smartSleep(SLEEP_TIME);
    }
    

    16Mhz test Node sketch

    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    //#define MY_RF24_CHANNEL 76
    //#define MY_RF24_DATARATE RF24_250KBPS
    //#define MY_RF24_DATARATE RF24_1MBPS
    
    #define MY_NODE_ID 200
    #define MY_PARENT_NODE_ID 0
    #define MY_PARENT_NODE_IS_STATIC
    #define CHILD_ID_BATTERY 25
    
    #define MY_SIGNAL_REPORT_ENABLED
    
    // Enable and select radio type attached
    #define MY_RADIO_RF24
    
    #include <MySensors.h>  
    #include <DallasTemperature.h>
    #include <OneWire.h>
    
    #define SKETCH_NAME "MC Pulse & Temp"
    #define SKETCH_VERSION "1.0.6"
    #define DIGITAL_INPUT_SENSOR 3  // The digital input you attached your light sensor.  (Only 2 and 3 generates interrupt!)
    #define PULSE_FACTOR 1000       // Number of blinks per of your meter
    #define SLEEP_MODE false        // Watt value can only be reported when sleep mode is false.
    #define MAX_WATT 10000          // Max watt value to report. This filters outliers.
    #define PULSE_CHILD_ID 4    
    
    #define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
    
    #define ONE_WIRE_BUS 5 // Pin where dallas sensor is connected 
    #define MAX_ATTACHED_DS18B20 3
    unsigned long SLEEP_TIME = 50000; // Sleep time between reads (in milliseconds)
    OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=0;
    bool receivedConfig = false;
    bool metric = true;
    
    // Initialize temperature message
    MyMessage msg(0,V_TEMP);
    MyMessage msgbatt(CHILD_ID_BATTERY, V_VOLTAGE);
    
    /************************************************************/
    
    uint32_t SEND_FREQUENCY =
        20000; // Minimum time between send (in milliseconds). We don't want to spam the gateway.
    double ppwh = ((double)PULSE_FACTOR)/1000; // Pulses per watt hour
    bool pcReceived = false;
    volatile uint32_t pulseCount = 0;
    volatile uint32_t lastBlink = 0;
    volatile uint32_t watt = 0;
    uint32_t oldPulseCount = 0;
    uint32_t oldWatt = 0;
    double oldkWh;
    uint32_t lastSend;
    MyMessage wattMsg(PULSE_CHILD_ID,V_WATT);
    MyMessage kWhMsg(PULSE_CHILD_ID,V_KWH);
    MyMessage pcMsg(PULSE_CHILD_ID,V_VAR1);
    
    /////////////////////////////////////////////////
    // Enable REPORT_BATTERY_LEVEL to measure battery level and send changes to gateway
    #define REPORT_BATTERY_LEVEL
    
    
    #ifdef REPORT_BATTERY_LEVEL
    #include <Vcc.h>
    static uint8_t oldBatteryPcnt = 200;  // Initialize to 200 to assure first time value will be sent.
    const float VccMin        = 1.8;      // Minimum expected Vcc level, in Volts: Brownout at 1.8V    -> 0%
    const float VccMax        = 2.0*1.6;  // Maximum expected Vcc level, in Volts: 2xAA fresh Alkaline -> 100%
    const float VccCorrection = 1.0;      // Measured Vcc by multimeter divided by reported Vcc
    static Vcc vcc(VccCorrection); 
    #endif
    /////////////////////////////////////////////////
    
    void before()
    {
      // Startup up the OneWire library
      sensors.begin();
    }
    
    void setup()  
    { 
      // Fetch last known pulse count value from gw
      request(PULSE_CHILD_ID, V_VAR1);
    
      // Use the internal pullup to be able to hook up this sketch directly to an energy meter with S0 output
      // If no pullup is used, the reported usage will be too high because of the floating pin
      pinMode(DIGITAL_INPUT_SENSOR,INPUT_PULLUP);
    
      attachInterrupt(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), onPulse, RISING);
      lastSend=millis();
    
      // requestTemperatures() will not block current thread
      sensors.setWaitForConversion(false);
    
    }
    
    void presentation() {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo(SKETCH_NAME, SKETCH_VERSION);
      present(PULSE_CHILD_ID, S_POWER);
      
      // Fetch the number of attached temperature sensors  
      numSensors = sensors.getDeviceCount();
    
      // Present all temperature sensors to controller
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
         present(i, S_TEMP);
      }
      //present voltage sensor
      //present(CHILD_ID_BATTERY, S_MULTIMETER);
    }
    
    int16_t millisToWaitForConversion(uint8_t bitResolution)
    {
      switch (bitResolution)
      {
          case 9:
          return 94;
          case 10:
          return 188;
          case 11:
          return 375;
          default:
          return 750;
      }
    }
    
    void loop()     
    {     
    
    uint32_t now = millis();
      // Only send values at a maximum frequency or woken up from sleep
      bool sendTime = now - lastSend > SEND_FREQUENCY;
      if (pcReceived && (SLEEP_MODE || sendTime)) {
        // New watt value has been calculated
        if (!SLEEP_MODE && watt != oldWatt) {
          // Check that we don't get unreasonable large watt value.
          // could happen when long wraps or false interrupt triggered
          if (watt<((uint32_t)MAX_WATT)) {
            send(wattMsg.set(watt));  // Send watt value to gw
          }
          Serial.print("Watt:");
          Serial.println(watt);
          oldWatt = watt;
        }
    
        // Pulse count value has changed
        if (pulseCount != oldPulseCount) {
          send(pcMsg.set(pulseCount));  // Send pulse count value to gw
          double kWh = ((double)pulseCount/((double)PULSE_FACTOR));
          oldPulseCount = pulseCount;
          if (kWh != oldkWh) {
            send(kWhMsg.set(kWh, 4));  // Send kWh value to gw
            oldkWh = kWh;
          }
        }
        lastSend = now;
      } else if (sendTime && !pcReceived) {
        // No pulse count value received. Try requesting it again
        request(PULSE_CHILD_ID, V_VAR1);
        lastSend=now;
      }
    
      if (SLEEP_MODE) {
        sleep(SEND_FREQUENCY);
      }
    
      // Fetch temperatures from Dallas sensors
      sensors.requestTemperatures();
    
      // query conversion time and sleep until conversion completed
      int16_t conversionTime = millisToWaitForConversion(sensors.getResolution());
      // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
      sleep(conversionTime);
    
      // Read temperatures and send them to controller 
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
    
        // Fetch and round temperature to one decimal
        float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
    
        // Only send data if temperature has changed and no error
        #if COMPARE_TEMP == 1
        if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
        #else
          if (temperature != -127.00 && temperature != 85.00) {
          #endif
    
            // Send in the new temperature
            send(msg.setSensor(i).set(temperature,1));
            // Save new temperatures for next compare
            lastTemperature[i]=temperature;
          }
        }
    /***************************************************************************************************************************************/
     #ifdef REPORT_BATTERY_LEVEL
          const uint8_t batteryPcnt = static_cast<uint8_t>(0.5 + vcc.Read_Perc(VccMin, VccMax));
        
        #ifdef MY_DEBUG
          Serial.print(F("Vbat "));
          Serial.print(vcc.Read_Volts());
          Serial.print(F("\tPerc "));
          Serial.println(batteryPcnt);
        #endif
        
          // Battery readout should only go down. So report only when new value is smaller than previous one.
          if ( batteryPcnt < oldBatteryPcnt )
          {
              sendBatteryLevel(batteryPcnt);
              oldBatteryPcnt = batteryPcnt;
          }
        #endif
    /********************************************************************************************************************************/   
      
      //send(msgbatt.set(batteryV ,2));
          
      smartSleep(SLEEP_TIME);
      
    }
    
    
    void receive(const MyMessage &message)
    {
      if (message.type==V_VAR1) {
        pulseCount = oldPulseCount = message.getLong();
        Serial.print("Received last pulse count value from gw:");
        Serial.println(pulseCount);
        pcReceived = true;
      }
    }
    
    void onPulse()
    {
      if (!SLEEP_MODE) {
        uint32_t newBlink = micros();
        uint32_t interval = newBlink-lastBlink;
        if (interval<10000L) { // Sometimes we get interrupt on RISING
          return;
        }
        watt = (3600000000.0 /interval) / ppwh;
        lastBlink = newBlink;
      }
      pulseCount++;
    }
    

    Logs
    Wifi Gateway

    MCO:BGN:INIT GW,CP=RNNGE---,REL=255,VER=2.3.1
    109 TSF:LRT:OK
    125 TSM:INIT
    138 TSF:WUR:MS=0
    162 TSM:INIT:TSP OK
    183 TSM:INIT:GW MODE
    205 TSM:READY:ID=0,PAR=0,DIS=0
    237 MCO:REG:NOT NEEDED
    scandone
    350 TSM:READY:NWD REQ
    2626 TSF:MSG:SEND,0-0-255-255,s=255,c=3,t=20,pt=0,l=0,sg=0,ft=0,st=OK:
    2700 GWT:TPC:CONNECTING...
    3228 GWT:TPC:CONNECTING...
    3756 GWT:TPC:CONNECTING...
    4284 GWT:TPC:CONNECTING...
    4812 GWT:TPC:CONNECTING...
    5340 GWT:TPC:CONNECTING...
    scandone
    state: 0 -> 2 (b0)
    state: 2 -> 3 (0)
    state: 3 -> 5 (10)
    add 0
    aid 2
    cnt 
    
    connected with wifi_ssid, channel 13
    dhcp client start...
    6965 GWT:TPC:CONNECTING...
    7493 GWT:TPC:CONNECTING...
    8021 GWT:TPC:CONNECTING...
    ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
    8549 GWT:TPC:CONNECTING...
    8577 GWT:TPC:IP=192.168.1.15
    8608 MCO:BGN:STP
    Ready
    IP address: 192.168.1.15
    8628 MCO:BGN:INIT OK,TSP=1
    8688 GWT:TPC:IP=192.168.1.15
    8719 GWT:RMQ:MQTT RECONNECT
    8761 GWT:RMQ:MQTT CONNECTED
    8791 GWT:TPS:TOPIC=sensors-out/0/255/0/0/18,MSG SENT
    8847 GWT:TPS:TOPIC=sensors-out/0/255/3/0/11,MSG SENT
    8903 GWT:TPS:TOPIC=sensors-out/0/255/3/0/12,MSG SENT
    pm open,type:2 0
    18609 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
    18671 TSF:MSG:BC
    18689 TSF:MSG:FPAR REQ,ID=200
    18721 TSF:PNG:SEND,TO=0
    18746 TSF:CKU:OK
    18764 TSF:MSG:GWL OK
    21385 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
    22703 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
    22766 TSF:MSG:BC
    22783 TSF:MSG:FPAR REQ,ID=200
    22815 TSF:CKU:OK,FCTRL
    22839 TSF:MSG:GWL OK
    25439 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
    52218 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=1,l=1,sg=0:119
    52284 TSF:MSG:BC
    52302 TSF:MSG:FPAR REQ,ID=200
    52333 TSF:PNG:SEND,TO=0
    52359 TSF:CKU:OK
    52376 TSF:MSG:GWL OK
    ...
    95174 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
    95947 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
    96010 TSF:MSG:BC
    96028 TSF:MSG:FPAR REQ,ID=200
    96059 TSF:CKU:OK,FCTRL
    96083 TSF:MSG:GWL OK
    ...
    ...
    313918 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
    313997 TSF:MSG:READ,10-10-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
    314059 TSF:MSG:BC
    314078 TSF:MSG:FPAR REQ,ID=10
    314109 TSF:CKU:OK,FCTRL
    314134 TSF:MSG:GWL OK
    317217 !TSF:MSG:SEND,0-0-10-10,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
    324923 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
    324987 TSF:MSG:BC
    325006 TSF:MSG:FPAR REQ,ID=200
    325039 TSF:PNG:SEND,TO=0
    325065 TSF:CKU:OK
    325084 TSF:MSG:GWL OK
    ...
    368945 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
    369025 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=1,l=1,sg=0:0
    369090 TSF:MSG:BC
    369109 TSF:MSG:FPAR REQ,ID=200
    369141 TSF:CKU:OK,FCTRL
    369166 TSF:MSG:GWL OK
    371985 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
    372065 TSF:MSG:READ,10-10-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
    372127 TSF:MSG:BC
    372145 TSF:MSG:FPAR REQ,ID=10
    372177 TSF:CKU:OK,FCTRL
    372202 TSF:MSG:GWL OK
    

    Second Node

     __  __       ____
    |  \/  |_   _/ ___|  ___ _ __  ___  ___  _ __ ___
    | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
    | |  | | |_| |___| |  __/ | | \__ \  _  | |  \__ \
    |_|  |_|\__, |____/ \___|_| |_|___/\___/|_|  |___/
            |___/                      2.3.1
    
    16 MCO:BGN:INIT NODE,CP=RNNNA---,REL=255,VER=2.3.1
    26 MCO:BGN:BFR
    43 TSM:INIT
    44 TSF:WUR:MS=0
    51 TSM:INIT:TSP OK
    53 TSM:INIT:STATID=200
    55 TSF:SID:OK,ID=200
    57 TSM:FPAR
    93 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    2101 !TSM:FPAR:NO REPLY
    2103 TSM:FPAR
    2139 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    4147 !TSM:FPAR:NO REPLY
    4149 TSM:FPAR
    4185 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    6193 !TSM:FPAR:NO REPLY
    6195 TSM:FPAR
    6231 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    8239 !TSM:FPAR:FAIL
    8240 TSM:FAIL:CNT=1
    8242 TSM:FAIL:DIS
    8244 TSF:TDI:TSL
    18246 TSM:FAIL:RE-INIT
    18248 TSM:INIT
    18254 TSM:INIT:TSP OK
    18256 TSM:INIT:STATID=200
    18259 TSF:SID:OK,ID=200
    18262 TSM:FPAR
    18298 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    20307 !TSM:FPAR:NO REPLY
    20310 TSM:FPAR
    20346 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    22354 !TSM:FPAR:NO REPLY
    22356 TSM:FPAR
    22393 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    24401 !TSM:FPAR:NO REPLY
    24403 TSM:FPAR
    24440 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    26447 !TSM:FPAR:FAIL
    26448 TSM:FAIL:CNT=2
    26450 TSM:FAIL:DIS
    26452 TSF:TDI:TSL
    36456 TSM:FAIL:RE-INIT
    36458 TSM:INIT
    36464 TSM:INIT:TSP OK
    36466 TSM:INIT:STATID=200
    36469 TSF:SID:OK,ID=200
    36471 TSM:FPAR
    36508 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    38516 !TSM:FPAR:NO REPLY
    38518 TSM:FPAR
    38555 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    40562 !TSM:FPAR:NO REPLY
    40564 TSM:FPAR
    40601 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    42608 !TSM:FPAR:NO REPLY
    42610 TSM:FPAR
    42647 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    44654 !TSM:FPAR:FAIL
    44655 TSM:FAIL:CNT=3
    44657 TSM:FAIL:DIS
    44659 TSF:TDI:TSL
    54662 TSM:FAIL:RE-INIT
    54664 TSM:INIT
    54670 TSM:INIT:TSP OK
    54672 TSM:INIT:STATID=200
    54675 TSF:SID:OK,ID=200
    54677 TSM:FPAR
    54714 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    56721 !TSM:FPAR:NO REPLY
    56723 TSM:FPAR
    56760 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    58767 !TSM:FPAR:NO REPLY
    58769 TSM:FPAR
    58806 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    60813 !TSM:FPAR:NO REPLY
    60815 TSM:FPAR
    60852 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    62859 !TSM:FPAR:FAIL
    62860 TSM:FAIL:CNT=4
    62862 TSM:FAIL:DIS
    62864 TSF:TDI:TSL
    72867 TSM:FAIL:RE-INIT
    72869 TSM:INIT
    72876 TSM:INIT:TSP OK
    72878 TSM:INIT:STATID=200
    72881 TSF:SID:OK,ID=200
    72883 TSM:FPAR
    72920 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    74927 !TSM:FPAR:NO REPLY
    74929 TSM:FPAR
    74966 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    76973 !TSM:FPAR:NO REPLY
    76975 TSM:FPAR
    77011 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    79019 !TSM:FPAR:NO REPLY
    79021 TSM:FPAR
    79057 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    81065 !TSM:FPAR:FAIL
    81068 TSM:FAIL:CNT=5
    81069 TSM:FAIL:DIS
    81071 TSF:TDI:TSL
    91074 TSM:FAIL:RE-INIT
    91076 TSM:INIT
    91082 TSM:INIT:TSP OK
    91084 TSM:INIT:STATID=200
    91087 TSF:SID:OK,ID=200
    91089 TSM:FPAR
    91126 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    93134 !TSM:FPAR:NO REPLY
    93136 TSM:FPAR
    93173 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    95180 !TSM:FPAR:NO REPLY
    95182 TSM:FPAR
    95219 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    97226 !TSM:FPAR:NO REPLY
    97228 TSM:FPAR
    97265 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    99272 !TSM:FPAR:FAIL
    99273 TSM:FAIL:CNT=6
    99275 TSM:FAIL:DIS
    99277 TSF:TDI:TSL
    109280 TSM:FAIL:RE-INIT
    109282 TSM:INIT
    109288 TSM:INIT:TSP OK
    109291 TSM:INIT:STATID=200
    109293 TSF:SID:OK,ID=200
    109296 TSM:FPAR
    109333 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    111340 !TSM:FPAR:NO REPLY
    111342 TSM:FPAR
    111379 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    113387 !TSM:FPAR:NO REPLY
    113389 TSM:FPAR
    113426 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    115434 !TSM:FPAR:NO REPLY
    115436 TSM:FPAR
    115473 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    117481 !TSM:FPAR:FAIL
    117483 TSM:FAIL:CNT=7
    117485 TSM:FAIL:DIS
    117487 TSF:TDI:TSL
    177489 TSM:FAIL:RE-INIT
    177491 TSM:INIT
    177498 TSM:INIT:TSP OK
    177501 TSM:INIT:STATID=200
    177503 TSF:SID:OK,ID=200
    177506 TSM:FPAR
    177543 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    179550 !TSM:FPAR:NO REPLY
    179552 TSM:FPAR
    179589 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    181597 !TSM:FPAR:NO REPLY
    181599 TSM:FPAR
    181636 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    183644 !TSM:FPAR:NO REPLY
    183646 TSM:FPAR
    183683 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    185691 !TSM:FPAR:FAIL
    185693 TSM:FAIL:CNT=7
    185695 TSM:FAIL:DIS
    185697 TSF:TDI:TSL
    245699 TSM:FAIL:RE-INIT
    245701 TSM:INIT
    245707 TSM:INIT:TSP OK
    245710 TSM:INIT:STATID=200
    245712 TSF:SID:OK,ID=200
    245715 TSM:FPAR
    

    W5100 Ethernet Gateway
    For some reason the ethernet gateway does not start if I have a serial debug window open, so here is the MQTT log.

    sensors-out/0/255/0/0/18 2.3.1
    sensors-out/10/255/4/0/0 02002B004003DC920103
    sensors-out/10/255/4/0/0 02002B004003DC920103
    sensors-out/0/255/0/0/18 2.3.1
    sensors-out/10/255/0/0/17 2.3.1
    sensors-out/10/255/3/0/6 0
    sensors-in/10/255/3/0/6 M
    sensors-out/10/255/3/0/11 Temperature Sensor
    sensors-out/10/255/3/0/12 2.3.0
    sensors-out/10/0/0/0/6 (null)
    sensors-out/10/5/0/0/30 (null)
    sensors-out/10/0/1/0/0 21.6
    gelatitalia/freezer3/temperature 21.6
    sensors-out/10/255/3/0/0 83
    sensors-out/10/255/3/0/32 500
    sensors-out/200/255/0/0/17 2.3.1
    sensors-out/200/255/3/0/6 0
    sensors-in/200/255/3/0/6 M
    sensors-out/200/255/3/0/11 MC Pulse & Temp
    sensors-out/200/255/3/0/12 1.0.6
    sensors-out/200/4/0/0/13 (null)
    sensors-out/200/4/2/0/24 (null)
    sensors-out/200/255/3/0/0 100
    sensors-out/200/255/3/0/32 500
    

    WiFi gateway log after ethernet has assigned parent
    While both nodes were asleep, I disconnected the ethernet gateway and powered the ESP8266

    Jun 28 16:34:06 Ȥl���$$rZ�@>h��␡�53 MCO:BGN:INIT GW,CP=RNNGE---,REL=255,VER=2.3.1
    Jun 28 16:34:06 104 TSF:LRT:OK
    Jun 28 16:34:06 120 TSM:INIT
    Jun 28 16:34:06 134 TSF:WUR:MS=0
    Jun 28 16:34:06 157 TSM:INIT:TSP OK
    Jun 28 16:34:06 178 TSM:INIT:GW MODE
    Jun 28 16:34:06 200 TSM:READY:ID=0,PAR=0,DIS=0
    Jun 28 16:34:06 233 MCO:REG:NOT NEEDED
    Jun 28 16:34:06 ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
    Jun 28 16:34:06 scandone
    Jun 28 16:34:06 261 TSM:READY:NWD REQ
    Jun 28 16:34:08 2588 TSF:MSG:SEND,0-0-255-255,s=255,c=3,t=20,pt=0,l=0,sg=0,ft=0,st=OK:
    Jun 28 16:34:08 scandone
    Jun 28 16:34:09 state: 0 -> 2 (b0)
    Jun 28 16:34:09 state: 2 -> 3 (0)
    Jun 28 16:34:09 state: 3 -> 5 (10)
    Jun 28 16:34:09 add 0
    Jun 28 16:34:09 aid 1
    Jun 28 16:34:09 cnt 
    Jun 28 16:34:09 
    Jun 28 16:34:09 connected with wifi_ssid, channel 13
    Jun 28 16:34:09 ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
    Jun 28 16:34:09 2838 GWT:TPC:CONNECTING...
    Jun 28 16:34:09 2866 GWT:TPC:IP=192.168.1.15
    Jun 28 16:34:09 2897 MCO:BGN:STP
    Jun 28 16:34:09 Ready
    Jun 28 16:34:09 IP address: 192.168.1.15
    Jun 28 16:34:09 2916 MCO:BGN:INIT OK,TSP=1
    Jun 28 16:34:09 2977 GWT:TPC:IP=192.168.1.15
    Jun 28 16:34:09 3008 GWT:RMQ:MQTT RECONNECT
    Jun 28 16:34:09 3609 GWT:RMQ:MQTT CONNECTED
    Jun 28 16:34:10 3639 GWT:TPS:TOPIC=sensors-out/0/255/0/0/18,MSG SENT
    Jun 28 16:34:10 3695 GWT:TPS:TOPIC=sensors-out/0/255/3/0/11,MSG SENT
    Jun 28 16:34:10 3751 GWT:TPS:TOPIC=sensors-out/0/255/3/0/12,MSG SENT
    Jun 28 16:34:18 pm open,type:2 0
    Jun 28 16:34:31 25601 TSF:MSG:READ,200-200-0,s=255,c=3,t=33,pt=5,l=4,sg=0:50000
    Jun 28 16:34:32 25668 GWT:TPS:TOPIC=sensors-out/200/255/3/0/33,MSG SENT
    Jun 28 16:34:32 25749 TSF:MSG:READ,200-200-0,s=255,c=3,t=32,pt=5,l=4,sg=0:500
    Jun 28 16:34:32 25814 GWT:TPS:TOPIC=sensors-out/200/255/3/0/32,MSG SENT
    Jun 28 16:35:01 55299 TSF:MSG:READ,10-10-0,s=255,c=3,t=33,pt=5,l=4,sg=0:60000
    Jun 28 16:35:01 55364 GWT:TPS:TOPIC=sensors-out/10/255/3/0/33,MSG SENT
    Jun 28 16:35:02 56152 TSF:MSG:READ,10-10-0,s=0,c=1,t=0,pt=7,l=5,sg=0:22.4
    Jun 28 16:35:02 56213 GWT:TPS:TOPIC=sensors-out/10/0/1/0/0,MSG SENT
    Jun 28 16:35:02 56268 TSF:MSG:READ,10-10-0,s=255,c=3,t=32,pt=5,l=4,sg=0:500
    Jun 28 16:35:02 56331 GWT:TPS:TOPIC=sensors-out/10/255/3/0/32,MSG SENT
    
    

  • Mod

    @mcchots nice troubleshooting, thanks for sharing so detailed information.

    The node sends find parent request, the gateway receives the find parent request and responds, but the node does not see the response.

    My first guess would be bad antenna placement on the gateway. Is there a lot of conducting material close to the nrf antenna? (Within a few centimeters)

    You could try modifying the antenna as described in https://youtu.be/NpMnauHeR7Y



  • @mfalkvidd Thanks. While trying to debug this, I've seen a number of posts where somebody asks for logs or more details from the OP. Thought I'd save some time.

    What I don't get is that it only fails to sent the FPAR response. Although maybe it's not sending any data at all, only receiving.
    Do gateways usually send any data or ack to a node or just receive and forward?

    I have noticed that it also does not seem to be receiving the bootloader firmware requests on node startup either.

    This is a picture of my gateway. Since replacing the radio is so difficult, I'll probably have to build a new one. Too bad i damaged my backup ESP while trying to debug this on a breadboard.

    0_1562053581041_IMG_1255.jpg


    Any recommendations on placement of the two modules?


  • Mod

    @mcchots the placement looks good, the nrf antenna is sticking out so interference by the perfboard should be small.

    The gateway

    • sends hardware ack on all messages it receives
    • responds to FPAR requests

    but except that it only receives and forwards messages node(s)->controller and controller->node(s).

    Looks like you've done everything according to the collective experience on what usually works, so unfortunately I don't have any ideas except swapping the nrf.



  • @mfalkvidd Turns out I didn't completely destroy my second ESP8266.
    Breadboarded a new gateway and it works fine. So I guess the radio is shot.

    Busy working up a much neater PCB with replaceable components to etch.
    Thanks for your help.


  • Mod

    Great work @mcchots, thanks for reporting back



237
Online

8.9k
Users

9.6k
Topics

100.9k
Posts