<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Happy Standby Node :)]]></title><description><![CDATA[<p dir="auto">turn off your gateway and try..</p>
<pre><code>bool flag_find_parent = 0;
bool flag_find_parent_process = 0;
bool q = 0;
bool flag_nogateway_mode = 0;
bool flag_no_present = 0;
bool flag_update_transport_param = 0;
bool Ack_HB;
bool Ack_FP;
bool bin = 0;

byte mypar;
byte myid;
byte mydis;
byte err_delivery_beat;
byte friend_node = 10;

word mtwr;

unsigned long interval_hb = 0;
unsigned long interval_friend_node = 0;
unsigned long interval_find_parent = 0;

unsigned int  sec_interval_hb = 15000;
unsigned int  sec_interval_friend_node = 10000;
unsigned int  sec_interval_find_parent = 5000;

#define MY_TRANSPORT_WAIT_READY_MS (mtwr)
#define MY_DEBUG
#define MY_RADIO_NRF24
#define CHILD_ID 0
#define CHILD_ID_1 1

#include &lt;MySensors.h&gt;

MyMessage msg(CHILD_ID, V_TEMP);
MyMessage msg_to_friend(CHILD_ID_1, V_STATUS);


void before() {
  if (hwReadConfig(EEPROM_NODE_ID_ADDRESS) == 0) {
    hwWriteConfig(EEPROM_NODE_ID_ADDRESS, 255);
  }

  if (hwReadConfig(EEPROM_NODE_ID_ADDRESS) == 255) {
    mtwr = 0;
  } else {
    mtwr = 30000;
  }
}


void presentation()
{
  sendSketchInfo("Happy Standby Node", "1.01");
  present(CHILD_ID, S_TEMP);
}


void setup() {
  myid = getNodeId();
  if (isTransportReady() == true) {
    mydis = _transportConfig.distanceGW;
    mypar = _transportConfig.parentNodeId;
    loadState(103);
    if (mydis != loadState(103))
    {
      saveState(103, mydis);
    }
    if (mypar != loadState(101))
    {
      saveState(101, mypar);
    }
  }
  if (isTransportReady() == false)
  {
    CORE_DEBUG(PSTR("MyS: STANDBY TRANSPORT MODE\n"));
    no_present();
    happy_node_mode();
    gateway_fail();
    err_delivery_beat = 3;
  }
  interval_friend_node = millis();
  interval_hb = millis();
}


void loop() {
  if (isTransportReady() == true) {
    if (millis() - interval_friend_node &gt; sec_interval_friend_node)    {
      _transportConfig.parentNodeId = friend_node;
      bin = !bin;
      bool friend_sent = send(msg_to_friend.setDestination(friend_node).set(bin));
      if (friend_sent == 1) {
        _transportConfig.parentNodeId = mypar;
      } else {
        _transportSM.failedUplinkTransmissions = 0;
        _transportConfig.parentNodeId = mypar;
      }
      interval_friend_node = millis();
    }
    if (flag_nogateway_mode == 0) {
      if (flag_find_parent_process == 1) {
        flag_update_transport_param = 1;
        flag_find_parent_process = 0;
        CORE_DEBUG(PSTR("MyS: STANDART TRANSPORT MODE IS RESTORED\n"));
      }
      if (millis() - interval_hb &gt; sec_interval_hb)    {
        send_to_gateway();
        interval_hb = millis();
      }
    }

    if (flag_update_transport_param == 1) {
      CORE_DEBUG(PSTR("MyS: UPDATE TRANSPORT CONFIGURATION\n"));
      mydis = _transportConfig.distanceGW;
      mypar = _transportConfig.parentNodeId;
      loadState(103);
      if (mydis != loadState(103))
      {
        saveState(103, mydis);
      }
      if (mypar != loadState(101))
      {
        saveState(101, mypar);
      }
      flag_update_transport_param = 0;
      if (flag_no_present == 1) {
        CORE_DEBUG(PSTR("MyS: SEND PRESENTATION AFTER RESTORING STANDART TRANSPORT MODE \n"));
        presentNode();
        flag_no_present = 0;
        wait(1000);
        send_to_gateway();
      } else {
        CORE_DEBUG(PSTR("MyS: SEND LITTLE PRESENT:) WITH PARENT ID IN CONTRILER AFTER RESTORING STANDART TRANSPORT MODE \n"));
        present_only_parent();
        wait(1000);
        send_to_gateway();
      }
    }
  }

  if (_transportSM.failureCounter &gt; 0) {
    happy_node_mode();
    gateway_fail();
  }

  if (flag_nogateway_mode == 1) {
    if (millis() - interval_find_parent &gt; sec_interval_find_parent)    {
      check_parent();
      interval_find_parent = millis();
    }
  }

  if (q == 1) {
    if (_msg.sensor == 255) {
      if (mGetCommand(_msg) == 3) {
        if (_msg.type == 8) {
          Ack_FP = 1;
          CORE_DEBUG(PSTR("MyS: PARENT RESPONSE FOUND\n"));
        }
      }
    }

    if (Ack_FP == 1) {
      CORE_DEBUG(PSTR("MyS: FIND PARENT PROCESS\n"));
      q = 0;
      Ack_FP = 0;
      transportSwitchSM(stParent);
      flag_nogateway_mode = 0;
      flag_find_parent_process = 1;
    } else {
      _transportSM.findingParentNode = false;
      q = 0;
      CORE_DEBUG(PSTR("MyS: PARENT RESPONSE NOT FOUND\n"));
      _transportSM.failedUplinkTransmissions = 0;
    }
  }
}

void receive(const MyMessage &amp; message) {
  if (message.isAck()) {
    if (message.sensor == 0) {
      if (message.type == 0) {
        Ack_HB = 1;
      }
    }
  }
}


void update_parent() {
  _sendRoute(build(_msgTmp, 0, NODE_SENSOR_ID, 3, 6).set(mypar));
  wait(1000, 3, 6);
}


void no_present() {
  _coreConfig.presentationSent = true;
  _coreConfig.nodeRegistered = true;
  flag_no_present = 1;
}


void happy_node_mode() {
  _transportConfig.nodeId = myid;
  _transportConfig.parentNodeId = loadState(101);
  _transportConfig.distanceGW = loadState(103);
  _transportSM.findingParentNode = false;
  _transportSM.transportActive = true;
  _transportSM.uplinkOk = true;
  _transportSM.pingActive = false;
  transportSwitchSM(stReady);
  mydis = _transportConfig.distanceGW;
  mypar = _transportConfig.parentNodeId;
  _transportSM.failureCounter = 0;
}


void gateway_fail() {
  flag_nogateway_mode = 1;
  flag_update_transport_param = 0;
  interval_find_parent = millis();
}


void check_parent() {
  q = 1;
  _transportSM.findingParentNode = true;
  CORE_DEBUG(PSTR("MyS: SEND FIND PARENT REQUEST, WAIT RESPONSE\n"));
  _sendRoute(build(_msg, 255, NODE_SENSOR_ID, 3, 7).set(""));
  wait(3000, 3, 8);
}


void present_only_parent() {
  _sendRoute(build(_msgTmp, 0, NODE_SENSOR_ID, 3, 6).set(mypar));
  wait(1000, 3, 6);
}


void send_to_gateway () {
  send(msg.set(25.0 + random(0, 30) / 10.0, 2), 1);
  wait(2000, 1, 0);

  if (Ack_HB == 0) {
    if (err_delivery_beat &lt; 3) {
      err_delivery_beat++;
    }
    if (err_delivery_beat == 2) {
      gateway_fail();
      CORE_DEBUG(PSTR("MyS: LOST GATEWAY MODE\n"));
    }
    _transportSM.failedUplinkTransmissions = 0;
  } else {
    Ack_HB = 0;
    err_delivery_beat = 0;
    if (flag_nogateway_mode == 1) {
      flag_nogateway_mode = 0;
    }
  }
}

</code></pre>
]]></description><link>https://forum.mysensors.org/topic/8873/happy-standby-node</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 08:33:04 GMT</lastBuildDate><atom:link href="https://forum.mysensors.org/topic/8873.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 13 Jan 2018 01:06:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Happy Standby Node :) on Sat, 13 Jan 2018 23:22:38 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/crankycoder" aria-label="Profile: crankycoder">@<bdi>crankycoder</bdi></a> <a href="https://translate.google.com/translate?sl=ru&amp;tl=en&amp;js=y&amp;prev=_t&amp;hl=ru&amp;ie=UTF-8&amp;u=http%3A%2F%2Fmysensors.ru%2Fforum%2Fviewtopic.php%3Ff%3D5%26t%3D380&amp;edit-text=" rel="nofollow ugc">https://translate.google.com/translate?sl=ru&amp;tl=en&amp;js=y&amp;prev=_t&amp;hl=ru&amp;ie=UTF-8&amp;u=http%3A%2F%2Fmysensors.ru%2Fforum%2Fviewtopic.php%3Ff%3D5%26t%3D380&amp;edit-text=</a></p>
]]></description><link>https://forum.mysensors.org/post/83727</link><guid isPermaLink="true">https://forum.mysensors.org/post/83727</guid><dc:creator><![CDATA[berkseo]]></dc:creator><pubDate>Sat, 13 Jan 2018 23:22:38 GMT</pubDate></item><item><title><![CDATA[Reply to Happy Standby Node :) on Sat, 13 Jan 2018 21:20:30 GMT]]></title><description><![CDATA[<p dir="auto">could you provide a quick summary of what this does?</p>
]]></description><link>https://forum.mysensors.org/post/83717</link><guid isPermaLink="true">https://forum.mysensors.org/post/83717</guid><dc:creator><![CDATA[CrankyCoder]]></dc:creator><pubDate>Sat, 13 Jan 2018 21:20:30 GMT</pubDate></item></channel></rss>