resend if st=fail



  • Hello everybody,

    has anyone built a function that resend the signal, if "st=fail" is detected?
    I've already looked at the API and ACK. But have become not really smart of it.

    This would be great for some devices like relay, alarm, ....

    Best Regards,
    n3ro


    Log in to reply
     

  • Hero Member

    @n3ro you can use and catch the Ack value yourself and make sure the message arrives.



  • @AWI do you have code example for me?


  • Admin

    gw.send() returns false when no ack was received.



  • Hey 🙂

    I have just build this test function to resend a signal if failed.
    But i don't know how to execute the ge.send in the string ("// execute code").

    #include <MySensor.h>
    #include <SPI.h>
    
    #define SENSOR_INFO "Test sensor"
    #define NODE_ID 200
    #define CHILD_ID 1
    #define OPEN 1
    #define CLOSE 0
    
    MySensor gw;
    MyMessage msg(CHILD_ID, V_TRIPPED);
    
    void setup()
    {
      gw.begin(NULL, NODE_ID, false);
      gw.sendSketchInfo(SENSOR_INFO, "1.0");
      gw.present(CHILD_ID, S_DOOR);
    }
    
    void loop()
    {
      gwack("gw.send(msg.set(OPEN));");
      delay(500);
    }
    void gwack(char code[])
    {
      int repeat = 0;
      boolean sendOK = false;
      Serial.println(code); // string to execute
    
      while ((sendOK == false) or (repeat <= 10))
      {
        if (code) // execute code
        {
          Serial.println("OK");
          sendOK = true;
        }
        else
        {
          Serial.println("NOT OK!!");
          sendOK = false;
        }
        repeat++;
      }
    }
    

    Any ideas? 🙂



  • That's not going to work the way you wrote it. That would require the Arduino to be able to compile code, which is asking a bit much of the little micro. 🙂

    I would either do the retry-on-fail logic directly inline in your loop() function, or put the gw.send() call in gwack() and pass the msg value as a reference/pointer to gwack.



  • @rickmontana83 said:

    put the gw.send() call in gwack() and pass the msg value as a reference/pointer to gwack.

    What do you mean? 🙂
    Like this?

    void loop()
    {
    //gw.send(msg.set(OPEN));
      gwresend("msg.set","OPEN");
      delay(500);
    }
    void gwresend(char msgcode[],char option[])
    {
      int repeat = 0;
      boolean sendOK = false;
    
      while ((sendOK == false) or (repeat <= 10))
      {
        if (gw.send(msgcode(option)) // execute code
        {
          Serial.println("OK");
          sendOK = true;
        }
        else
        {
          Serial.println("NOT OK!!");
          sendOK = false;
        }
        repeat++;
      }
    }
    

    (code is not working 😉 )

    I'm very surprised that there is not already such a function.



  • I'd be surprised if that even compiles. (Does it?)

    I meant you should set up the message in loop, then pass the completed message to gwresend like:

    msg.set(OPEN);
    gwresend(msg);

    The signature for gwresend will be something like:

    void gwresend(MyMessage &msg)

    The execute code line would then just be:

    if (gw.send(msg)) { ...

    Don't take this the wrong way, but this is more of a basic C++ language question. You might want to poke around on StackOverflow for examples to better understand the language (like the pass by reference that I suggested above, which, being from a C background, I've always found a bit scary.)



  • Jeah now its working 🙂

    #include <MySensor.h>
    #include <SPI.h>
    
    #define SENSOR_INFO "Test sensor"
    #define NODE_ID 200
    #define CHILD_ID 1
    #define OPEN 1
    #define CLOSE 0
    
    MySensor gw;
    MyMessage msg(CHILD_ID, V_TRIPPED);
    
    int repeat = 0;
    boolean sendOK = false;
    int repeatdelay = 0;
    
    void setup()
    {
      gw.begin(NULL, NODE_ID, false);
      gw.sendSketchInfo(SENSOR_INFO, "1.0");
      gw.present(CHILD_ID, S_DOOR);
    }
    
    void loop()
    {
      resend((msg.set(OPEN)), 5);
    delay(500);
    
    }
    void resend(MyMessage &msg, int repeats)
    {
      int repeat = 1;
      int repeatdelay = 0;
      boolean sendOK = false;
    
      while ((sendOK == false) and (repeat < repeats)) {
        if (gw.send(msg)) {
          sendOK = true;
        } else {
          sendOK = false;
          Serial.print("FEHLER ");
          Serial.println(repeat);
          repeatdelay += 250;
        } repeat++; delay(repeatdelay);
      }
    }```

Log in to reply
 

1 out of 9

Suggested Topics


  • Announcements •   29 Mar 2014, 17:08

    1

  • Development •   8 days ago

    1

  • Development •   13 days ago

    1

  • Development •   15 Nov 2024, 10:59

    3

  • Development •   15 Jan 2025, 08:33

    3

  • Development •   15 Jan 2025, 08:51

    6

21
Online

11.5k
Users

11.1k
Topics

112.8k
Posts