Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Controllers
  3. Domoticz
  4. Error sending switch command, check device/hardware !

Error sending switch command, check device/hardware !

Scheduled Pinned Locked Moved Domoticz
15 Posts 6 Posters 4.9k Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • kk02067K kk02067

    I have got a new problem that I haven't had before.

    When I try to switch a node on or off from domoticz I see in MYSController that the command gets sent to the node. But domoticz says "Error sending switch command, check device/hardware !"
    I also see that domoticz sends the command at least twice.
    If I try the switch a couple of times more the same thing happens. But sometimes it works, and when that happens I see in MYSController that I that time also get a response from the node.

    When it don't work it looks like this:

    14888	2016-09-30 16:47:08	TX	200	1 - 200 RGB Led	C_SET	YES	V_LIGHT	0
    
    14889	2016-09-30 16:47:10	TX	200	1 - 200 RGB Led	C_SET	YES	V_LIGHT	0
    

    When it works it looks like this:

    14957	2016-09-30 16:49:25	TX	200	1 - 200 RGB Led	C_SET	YES	V_LIGHT	0
    
    14958	2016-09-30 16:49:25	RX	200	1 - 200 RGB Led	C_SET	YES	V_LIGHT	0
    

    The node also sends some status values regulary. Voltage of the mcu, Temperature of a ds18b20 and temperature of the mcu. All those messages get received without problems. So it doesn't seem to be a problem of the radios.

    When I change the status of a switch in domoticz, does it expect a response from the node? And if so, does the mysensors library send the response automatically? It seems like it does from the logs. And if the library sends the response why doesn't the response get received as it should? The statusvalues doesn't seem to get missed.

    mfalkviddM Offline
    mfalkviddM Offline
    mfalkvidd
    Mod
    wrote on last edited by
    #2

    @kk02067 are you switching relays? If so, how are they powered? Many relays use enough power when switching to disturb the radio. Does the problem still appear if you disconnect whatever you are switching? How is the radio powered and what capacitor(s) do you use?

    If you haven't seen it already, https://forum.mysensors.org/topic/666/debug-faq-and-how-ask-for-help has some great guides for troubleshooting.

    kk02067K 1 Reply Last reply
    0
    • mfalkviddM mfalkvidd

      @kk02067 are you switching relays? If so, how are they powered? Many relays use enough power when switching to disturb the radio. Does the problem still appear if you disconnect whatever you are switching? How is the radio powered and what capacitor(s) do you use?

      If you haven't seen it already, https://forum.mysensors.org/topic/666/debug-faq-and-how-ask-for-help has some great guides for troubleshooting.

      kk02067K Offline
      kk02067K Offline
      kk02067
      wrote on last edited by
      #3

      @mfalkvidd No. I'm controling a ledstrip with ws2812b led's. The radio is powered from one of those small adapterboards with integrated regulator and capacitor. All driven from a 15W 5V switchmode powersupply.

      It seems that Domoticz is expecting a reply from the node with the same status as the command. Every time it works there is a reply from the node. And when I get the error Idont get that reply. I have not programmed in any replyprocedures in the sketch, so when it works it must be the library that send that reply from the node. But if thats the case, why not every time.

      I tried to modify the sketch to count any failed transmission and send that value back to the gateway to see if I have problems with the transmission. But the value is still Zero. Maybe my sketch is coded wrong but I dont think so.
      And even when domoticz says it failed the node still executes what was ordered.

      So the problem I think lies in the fact that domoticz seems to be waiting for an answer back with the new status from the node. The node send that status sometimes but more often not.

      This is the sketch:

      #define MY_RADIO_NRF24
      #define MY_NODE_ID 200
      #define MY_REPEATER_FEATURE
      //#define MY_DEBUG
      
      #include <MySensors.h>
      #include <SPI.h>
      #include "FastLED.h"
      #include <OneWire.h>
      #include <avr/pgmspace.h>
      
      
      #define DATA_PIN    2
      #define LED_TYPE    WS2812B
      #define COLOR_ORDER GRB
      #define NUM_LEDS    232
      #define BRIGHTNESS  96
      CRGB leds[NUM_LEDS];
      
      char actRGBvalue[] = "FFFFFF";               // Current RGB value
      uint16_t actRGBbrightness = 0xFF ;         // Controller Brightness
      int actRGBonoff = 0;                      // OnOff flag
      
      
      MyMessage msg(1, V_RGB);
      MyMessage msgtemp(2, V_TEMP);
      MyMessage msgcputemp(3, V_TEMP);
      MyMessage msgcpuvolt(4, V_VOLTAGE);
      MyMessage msgfailcount(5, V_VAR1);
      
      
      
      void SendColor2AllLEDs(const CRGB lcolor)
      {
        for (int i = 0 ; i < NUM_LEDS ; i++) {
          leds[i] = lcolor;
        }
      }
      
      OneWire ds(8);
      
      void setup() {
        wait(3000); // 3 second delay for recovery
      
        pinMode(7, OUTPUT);
        digitalWrite(7, HIGH);
      
        // tell FastLED about the LED strip configuration
        FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
        //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
      
        // set master brightness control
        FastLED.setBrightness(BRIGHTNESS);
      
        SendColor2AllLEDs(strtol(actRGBvalue, NULL, 16));
      
      }
      
      
      
      void presentation()
      {
      
        present(1, S_RGB_LIGHT, "200 RGB Led");
        wait(1000);
        present(2, S_TEMP, "200 Temperatur altan");
        wait(1000);
        present(3, S_TEMP, "200 Temperatur CPU");
        wait(1000);
        present(4, S_MULTIMETER, "200 Spänning CPU");
        wait(1000);
        present(5, S_CUSTOM, "200 Failcount");
        wait(1000);
        sendSketchInfo("Nod 200 - Altan", "V1.6");
        wait(1000);
      
      
      }
      
      
        unsigned int fail;
        
      void loop()
      {
      
      
        
        if(!send(msgtemp.set(getTemp(), 2)))
          {
          fail++;
          }
           
        wait(1000);
        if(!send(msgcputemp.set(GetTempCpu(),2)))
          {
          fail++;
          }
        
        wait(1000);
      
        if(!send(msgcpuvolt.set(readVcc(),3)))
          {
          fail++;
          }
        
        wait(30000);
      
        send(msgfailcount.set(fail));
      
        wait(1000);
      
      
      }
      
      
      void receive(const MyMessage &message)
      {
        if (message.type == V_RGB) {
          strcpy(actRGBvalue, message.getString());    // get the payload
          SendColor2AllLEDs(strtol(actRGBvalue, NULL, 16));
          Serial.println(F("RGB"));
          Serial.println(actRGBvalue);
        }
        else if (message.type == V_DIMMER) {
          actRGBbrightness = message.getByte();
          FastLED.setBrightness( actRGBbrightness );
          FastLED.show();
          Serial.println(F("DIMMER"));
          Serial.println(actRGBbrightness);
        }
        else if (message.type == V_STATUS) {           // if on/off type, toggle brightness
          actRGBonoff = message.getInt();
          FastLED.setBrightness((actRGBonoff == 1) ? actRGBbrightness : 0);
          FastLED.show();
          Serial.println(F("STATUS"));
          Serial.println(actRGBonoff);
        }
        //  FastLED.show();
      }
      
      
      float getTemp() {
        //returns the temperature from one DS18S20 in DEG Celsius
      
        byte data[12];
        byte addr[8];
      
        if ( !ds.search(addr)) {
          //no more sensors on chain, reset search
          ds.reset_search();
          return -1000;
        }
      
        if ( OneWire::crc8( addr, 7) != addr[7]) {
          Serial.println(PSTR("CRC is not valid!"));
          return -1000;
        }
      
        if ( addr[0] != 0x10 && addr[0] != 0x28) {
          Serial.print(PSTR("Device is not recognized"));
          return -1000;
        }
      
        ds.reset();
        ds.select(addr);
        ds.write(0x44, 1); // start conversion, with parasite power on at the end
      
        byte present = ds.reset();
        ds.select(addr);
        ds.write(0xBE); // Read Scratchpad
      
      
        for (int i = 0; i < 9; i++) { // we need 9 bytes
          data[i] = ds.read();
        }
      
        ds.reset_search();
      
        byte MSB = data[1];
        byte LSB = data[0];
      
        float tempRead = ((MSB << 8) | LSB); //using two's compliment
        float TemperatureSum = tempRead / 16;
      
        return TemperatureSum;
      
      }
      
      double GetTempCpu(void)
      {
        unsigned int wADC;
        double t;
      
        // The internal temperature has to be used
        // with the internal reference of 1.1V.
        // Channel 8 can not be selected with
        // the analogRead function yet.
      
        // Set the internal reference and mux.
        ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
        ADCSRA |= _BV(ADEN);  // enable the ADC
      
        wait(20);            // wait for voltages to become stable.
      
        ADCSRA |= _BV(ADSC);  // Start the ADC
      
        // Detect end-of-conversion
        while (bit_is_set(ADCSRA,ADSC));
      
        // Reading register "ADCW" takes care of how to read ADCL and ADCH.
        wADC = ADCW;
      
        // The offset of 324.31 could be wrong. It is just an indication.
        t = (wADC - 324.31 ) / 1.22;
      
        // The returned temperature is in degrees Celsius.
        return (t);
      }
      
      float readVcc() {
        // Read 1.1V reference against AVcc
        // set the reference to Vcc and the measurement to the internal 1.1V reference
        #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
          ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
          ADMUX = _BV(MUX5) | _BV(MUX0);
        #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
          ADMUX = _BV(MUX3) | _BV(MUX2);
        #else
          ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        #endif  
      
        wait(20); // Wait for Vref to settle
        ADCSRA |= _BV(ADSC); // Start conversion
        while (bit_is_set(ADCSRA,ADSC)); // measuring
      
        uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
        uint8_t high = ADCH; // unlocks both
      
        float result = (high<<8) | low;
      
        result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
        result=result/1000;
        return result; // Vcc in millivolts
      }
      
      
      
      mfalkviddM 1 Reply Last reply
      0
      • kk02067K kk02067

        @mfalkvidd No. I'm controling a ledstrip with ws2812b led's. The radio is powered from one of those small adapterboards with integrated regulator and capacitor. All driven from a 15W 5V switchmode powersupply.

        It seems that Domoticz is expecting a reply from the node with the same status as the command. Every time it works there is a reply from the node. And when I get the error Idont get that reply. I have not programmed in any replyprocedures in the sketch, so when it works it must be the library that send that reply from the node. But if thats the case, why not every time.

        I tried to modify the sketch to count any failed transmission and send that value back to the gateway to see if I have problems with the transmission. But the value is still Zero. Maybe my sketch is coded wrong but I dont think so.
        And even when domoticz says it failed the node still executes what was ordered.

        So the problem I think lies in the fact that domoticz seems to be waiting for an answer back with the new status from the node. The node send that status sometimes but more often not.

        This is the sketch:

        #define MY_RADIO_NRF24
        #define MY_NODE_ID 200
        #define MY_REPEATER_FEATURE
        //#define MY_DEBUG
        
        #include <MySensors.h>
        #include <SPI.h>
        #include "FastLED.h"
        #include <OneWire.h>
        #include <avr/pgmspace.h>
        
        
        #define DATA_PIN    2
        #define LED_TYPE    WS2812B
        #define COLOR_ORDER GRB
        #define NUM_LEDS    232
        #define BRIGHTNESS  96
        CRGB leds[NUM_LEDS];
        
        char actRGBvalue[] = "FFFFFF";               // Current RGB value
        uint16_t actRGBbrightness = 0xFF ;         // Controller Brightness
        int actRGBonoff = 0;                      // OnOff flag
        
        
        MyMessage msg(1, V_RGB);
        MyMessage msgtemp(2, V_TEMP);
        MyMessage msgcputemp(3, V_TEMP);
        MyMessage msgcpuvolt(4, V_VOLTAGE);
        MyMessage msgfailcount(5, V_VAR1);
        
        
        
        void SendColor2AllLEDs(const CRGB lcolor)
        {
          for (int i = 0 ; i < NUM_LEDS ; i++) {
            leds[i] = lcolor;
          }
        }
        
        OneWire ds(8);
        
        void setup() {
          wait(3000); // 3 second delay for recovery
        
          pinMode(7, OUTPUT);
          digitalWrite(7, HIGH);
        
          // tell FastLED about the LED strip configuration
          FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
          //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
        
          // set master brightness control
          FastLED.setBrightness(BRIGHTNESS);
        
          SendColor2AllLEDs(strtol(actRGBvalue, NULL, 16));
        
        }
        
        
        
        void presentation()
        {
        
          present(1, S_RGB_LIGHT, "200 RGB Led");
          wait(1000);
          present(2, S_TEMP, "200 Temperatur altan");
          wait(1000);
          present(3, S_TEMP, "200 Temperatur CPU");
          wait(1000);
          present(4, S_MULTIMETER, "200 Spänning CPU");
          wait(1000);
          present(5, S_CUSTOM, "200 Failcount");
          wait(1000);
          sendSketchInfo("Nod 200 - Altan", "V1.6");
          wait(1000);
        
        
        }
        
        
          unsigned int fail;
          
        void loop()
        {
        
        
          
          if(!send(msgtemp.set(getTemp(), 2)))
            {
            fail++;
            }
             
          wait(1000);
          if(!send(msgcputemp.set(GetTempCpu(),2)))
            {
            fail++;
            }
          
          wait(1000);
        
          if(!send(msgcpuvolt.set(readVcc(),3)))
            {
            fail++;
            }
          
          wait(30000);
        
          send(msgfailcount.set(fail));
        
          wait(1000);
        
        
        }
        
        
        void receive(const MyMessage &message)
        {
          if (message.type == V_RGB) {
            strcpy(actRGBvalue, message.getString());    // get the payload
            SendColor2AllLEDs(strtol(actRGBvalue, NULL, 16));
            Serial.println(F("RGB"));
            Serial.println(actRGBvalue);
          }
          else if (message.type == V_DIMMER) {
            actRGBbrightness = message.getByte();
            FastLED.setBrightness( actRGBbrightness );
            FastLED.show();
            Serial.println(F("DIMMER"));
            Serial.println(actRGBbrightness);
          }
          else if (message.type == V_STATUS) {           // if on/off type, toggle brightness
            actRGBonoff = message.getInt();
            FastLED.setBrightness((actRGBonoff == 1) ? actRGBbrightness : 0);
            FastLED.show();
            Serial.println(F("STATUS"));
            Serial.println(actRGBonoff);
          }
          //  FastLED.show();
        }
        
        
        float getTemp() {
          //returns the temperature from one DS18S20 in DEG Celsius
        
          byte data[12];
          byte addr[8];
        
          if ( !ds.search(addr)) {
            //no more sensors on chain, reset search
            ds.reset_search();
            return -1000;
          }
        
          if ( OneWire::crc8( addr, 7) != addr[7]) {
            Serial.println(PSTR("CRC is not valid!"));
            return -1000;
          }
        
          if ( addr[0] != 0x10 && addr[0] != 0x28) {
            Serial.print(PSTR("Device is not recognized"));
            return -1000;
          }
        
          ds.reset();
          ds.select(addr);
          ds.write(0x44, 1); // start conversion, with parasite power on at the end
        
          byte present = ds.reset();
          ds.select(addr);
          ds.write(0xBE); // Read Scratchpad
        
        
          for (int i = 0; i < 9; i++) { // we need 9 bytes
            data[i] = ds.read();
          }
        
          ds.reset_search();
        
          byte MSB = data[1];
          byte LSB = data[0];
        
          float tempRead = ((MSB << 8) | LSB); //using two's compliment
          float TemperatureSum = tempRead / 16;
        
          return TemperatureSum;
        
        }
        
        double GetTempCpu(void)
        {
          unsigned int wADC;
          double t;
        
          // The internal temperature has to be used
          // with the internal reference of 1.1V.
          // Channel 8 can not be selected with
          // the analogRead function yet.
        
          // Set the internal reference and mux.
          ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
          ADCSRA |= _BV(ADEN);  // enable the ADC
        
          wait(20);            // wait for voltages to become stable.
        
          ADCSRA |= _BV(ADSC);  // Start the ADC
        
          // Detect end-of-conversion
          while (bit_is_set(ADCSRA,ADSC));
        
          // Reading register "ADCW" takes care of how to read ADCL and ADCH.
          wADC = ADCW;
        
          // The offset of 324.31 could be wrong. It is just an indication.
          t = (wADC - 324.31 ) / 1.22;
        
          // The returned temperature is in degrees Celsius.
          return (t);
        }
        
        float readVcc() {
          // Read 1.1V reference against AVcc
          // set the reference to Vcc and the measurement to the internal 1.1V reference
          #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
            ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
          #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
            ADMUX = _BV(MUX5) | _BV(MUX0);
          #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
            ADMUX = _BV(MUX3) | _BV(MUX2);
          #else
            ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
          #endif  
        
          wait(20); // Wait for Vref to settle
          ADCSRA |= _BV(ADSC); // Start conversion
          while (bit_is_set(ADCSRA,ADSC)); // measuring
        
          uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
          uint8_t high = ADCH; // unlocks both
        
          float result = (high<<8) | low;
        
          result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
          result=result/1000;
          return result; // Vcc in millivolts
        }
        
        
        
        mfalkviddM Offline
        mfalkviddM Offline
        mfalkvidd
        Mod
        wrote on last edited by
        #4

        @kk02067 I think what happens is that Domoticz wants an ack from the node, to make sure the switch command is received. I have not ised this feature myself, but these threads cover similar problems:
        https://forum.mysensors.org/topic/3904/node-are-not-receiving-messages-from-domoticz/
        https://forum.mysensors.org/topic/1992/domoticz-and-ack/

        Let us know whether the information in the threads help or not.

        1 Reply Last reply
        0
        • kk02067K Offline
          kk02067K Offline
          kk02067
          wrote on last edited by kk02067
          #5

          I put together another node exactly the same but keeping it at my workbench roughly the same distance from the gateway. It works without any troubles so far. The only change in the sketch is the node id and no ds18b20 temperature reading.
          The log from myscontroller show that it works even if the node doesn't send back the same status as the command. Domoticz doesn't complain as it does with the first node. This behaviour was last night.

          Now this morning the replys from the new nodes is also present. They weren't last night. At least not in the logs from MYScontroller.

          When domoticz sends a switchcommand to the gateway it does so with with ACK flag set. Does mysensors library automatically reply?
          I haven't programmed in a replyfunction in my sketch so it seems like it. But in that case why doesn't my first node reply every time?

          Strange. Have to investigate this further.

          mfalkviddM 1 Reply Last reply
          0
          • kk02067K Offline
            kk02067K Offline
            kk02067
            wrote on last edited by kk02067
            #6

            Having checked the serial output from the new node at my computer I see that the library returns the command when a ACK i requested. I also looked in the sourcecode for the library and it seems that it handles the ackmessage.
            So it seems that the ACK message get missed in the recieving node. Why, is the next question.

            Investigation continues...

            1 Reply Last reply
            0
            • kk02067K kk02067

              I put together another node exactly the same but keeping it at my workbench roughly the same distance from the gateway. It works without any troubles so far. The only change in the sketch is the node id and no ds18b20 temperature reading.
              The log from myscontroller show that it works even if the node doesn't send back the same status as the command. Domoticz doesn't complain as it does with the first node. This behaviour was last night.

              Now this morning the replys from the new nodes is also present. They weren't last night. At least not in the logs from MYScontroller.

              When domoticz sends a switchcommand to the gateway it does so with with ACK flag set. Does mysensors library automatically reply?
              I haven't programmed in a replyfunction in my sketch so it seems like it. But in that case why doesn't my first node reply every time?

              Strange. Have to investigate this further.

              mfalkviddM Offline
              mfalkviddM Offline
              mfalkvidd
              Mod
              wrote on last edited by
              #7

              ... why doesn't my first node reply every time?

              My guess is that it does reply every time. But the message gets lost along the way. The most common reason is power problems on the sending node.

              kk02067K 1 Reply Last reply
              1
              • mfalkviddM mfalkvidd

                ... why doesn't my first node reply every time?

                My guess is that it does reply every time. But the message gets lost along the way. The most common reason is power problems on the sending node.

                kk02067K Offline
                kk02067K Offline
                kk02067
                wrote on last edited by
                #8

                @mfalkvidd After Little more investigating and experimenting I am pretty sure I have found a bug in the library. I found that when debug is active all is working as expected. But if I commented out debug it starts to not work. I tried it about 10 times, once with debug and then without. And everytime debug is active it works, no debug it fails.
                I opened the transport sourcefile and added a delay(100) at the procedure where the debug message is sent. With that change it works everytime with or without debug. It seems that if the ackmessage is sent to quick it gets missed by the gateway. Any thoughts on this?

                1 Reply Last reply
                1
                • sundberg84S Offline
                  sundberg84S Offline
                  sundberg84
                  Hardware Contributor
                  wrote on last edited by
                  #9

                  We should ping @tekka and @hek as well for this one @kk02067.

                  Controller: Proxmox VM - Home Assistant
                  MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
                  MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
                  RFLink GW - Arduino Mega + RFLink Shield, 433mhz

                  1 Reply Last reply
                  0
                  • mfalkviddM Offline
                    mfalkviddM Offline
                    mfalkvidd
                    Mod
                    wrote on last edited by
                    #10

                    The problem could be related to https://forum.mysensors.org/topic/4450/sensor-presentation-failure/ if the debug causes enough delay.

                    1 Reply Last reply
                    0
                    • hekH Offline
                      hekH Offline
                      hek
                      Admin
                      wrote on last edited by
                      #11

                      We just discussed this in the core team. Unless it is a compiler problem (like the other one we experienced some time ago) the most probably cause is..

                      1. Radio problems. Could be bad really bad clone, or that radio doesn't have time to "recharge" enough between transmissions.
                      2. Slow node, Fast Gw => GW sends response and node isn't in RX mode yet. But this is also quite strange as GW retransmits 15x with a 1.5ms delay before failing.
                      1 Reply Last reply
                      0
                      • martinhjelmareM Offline
                        martinhjelmareM Offline
                        martinhjelmare
                        Plugin Developer
                        wrote on last edited by
                        #12

                        I've experienced a similar problem when testing OTA updates on SensebenderMicro. With debug active, no missed messages, with debug disabled, a lot of missed messages and retries. It was a really obvious difference, since the rate of messages during OTA updates is quite fast. Gateway was an UNO and radios were clones.

                        1 Reply Last reply
                        0
                        • N Offline
                          N Offline
                          novicit
                          wrote on last edited by
                          #13

                          @kk02067 , Would you please post specifically where you added the delay(100). I have exactly the same problem as you and would like to be sure the ack gets back to the controller. Thank you!

                          In other tests and explorations I had noticed that with debug enabled things seemed to work a bit more consistently - but had not tied it to this problem. Unfortunately, debug sacrifices quite a bit of flash which I need for other uses.

                          kk02067K 1 Reply Last reply
                          0
                          • N novicit

                            @kk02067 , Would you please post specifically where you added the delay(100). I have exactly the same problem as you and would like to be sure the ack gets back to the controller. Thank you!

                            In other tests and explorations I had noticed that with debug enabled things seemed to work a bit more consistently - but had not tied it to this problem. Unfortunately, debug sacrifices quite a bit of flash which I need for other uses.

                            kk02067K Offline
                            kk02067K Offline
                            kk02067
                            wrote on last edited by
                            #14

                            @novicit If I remember correctly i put it here: https://github.com/mysensors/MySensors/blob/master/core/MyTransport.cpp#L463
                            just to test that it worked. Then I removed the change to keep the library source original.

                            I turned on debug again to get it working again.. The reason why I wanted to have debuging disabled was to keep the hexfile size down so the OTA update wouldn't take so long time. I hope this issue will be fixed in a more elegant manner in a future release.

                            1 Reply Last reply
                            1
                            • N Offline
                              N Offline
                              novicit
                              wrote on last edited by novicit
                              #15

                              Update. Please note that when @kk02067 gave the response directly above it was for Ver 2.0 and referenced a line in that code. It appears that changes leading to Ver 2.1.1 the location has changed and the delay(100) line would not be added at L463 as referenced. In Ver 2.1.1 it is now added between L659 and L660. It will look like this I believe:

                              L658 _msgTmp.destination = sender;
                              L659 // send ACK, use transportSendRoute since ACK reply is not internal, i.e. if !transportOK do not reply
                              ADD delay(100) here!!
                              L660 (void)transportSendRoute(_msgTmp);

                              Also, I have not yet used Ver 2.1.1, so don't know if the changes in the latest version might solve the Domoticz relay ack issue I had. This solution solved my problems 100% in Ver 2.0.

                              1 Reply Last reply
                              1
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              14

                              Online

                              11.7k

                              Users

                              11.2k

                              Topics

                              113.1k

                              Posts


                              Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • MySensors
                              • OpenHardware.io
                              • Categories
                              • Recent
                              • Tags
                              • Popular