Custom broadcast requests (from node to node group)



  • Hello, I want to share some of my experiences. I previously posted a sample subroutine to search the MySensors network.
    Below are examples of two devices are connected via a custom broadcast requests. This by the way is not enough in the library. Why do it?
    Below code routines give examples of the implementation of these routines in the layout of future devices.

    #1
    node1:

    #define MY_REPEATER_FEATURE
    #define MY_NODE_ID 100 //id ноды отправителя
    
    bool a = 1; // переменная с передаваемым значением
    MyMessage msg(1, V_STATUS); // cообщение на сенсор номер 1
    
    void setup()
    {}
    
    void loop()
    {
    send(msg.setDestination(255).set(a)); // броадкаст сообщение
    }
     
    

    node2:

    #define MY_PARENT_NODE_ID 100
    
    byte master_id = 100 //id ноды отправителя
    bool a; //переменная с передаваемым значением
    
    void setup()
    {}
    
    void loop()
    {}
    
    void receive(const MyMessage & message) {
    if (_msg.destination == 255) {
    if (_msg.sender == master_id) {
    if (_msg.type == V_STATUS) {
    a = message.getBool();
    }
    }
    }
    }
    

    #2
    node1:

    #define MY_DEBUG
    #define MY_RADIO_NRF24
    #define MY_REPEATER_FEATURE  // необязательное условие, применяется в данном примере для доставки сообщения на гейт через мастер ноду
    #include <MySensors.h>
    
    byte a; // переменная с передаваемым значением id данной мастер ноды какой либо потенциальной слейв ноде
    bool b = false; // переменная флаг выключающая отправку броадкаста
    MyMessage msg(255, V_VAR1); // cообщение на сенсор номер 255(может быть назначен любой id сенсора на ноде)
    
    void setup()
    {
    }
    
    void presentation()
    {
      sendSketchInfo("MASTER NODE", "1.0");
    }
    
    void loop()
    { 
      if(b == false){
      a = getNodeId();
      _transportConfig.nodeId = 0; // подменяем id ноды на уровне транспорта для отправки от имени гейта
      send(msg.setDestination(255).set(a)); // броадкаст сообщение
      _transportConfig.nodeId = a; // возвращаем реальный id ноды для транспортного уровня сразу после отправки броадкаст
      wait(10000);
    }
    }
    
    void receive(const MyMessage & message) {
      if (message.type == V_VAR2) {
        if (message.sensor == 255) {
          b = message.getBool();
          TRANSPORT_DEBUG(PSTR("TSM:MyS :) MASTER ID RECIVED SLAVE NODE, SENDING BROADCAST IS OFF\n"));
        }
      }
    }
    

    node2:

    byte a = 0; //переменная с передаваемым значением id мастер ноды данной слейв ноде, в стартовом положении с номером 0,
    bool b = true;//переменная с передаваемым значением флага прекращения отправки бродкаста мастер нодой
    
    #define MY_DEBUG
    #define MY_RADIO_NRF24
    #define MY_PARENT_NODE_ID 0
    #define MY_PARENT_NODE_IS_STATIC
    #include <MySensors.h>
    
    
    MyMessage msg(255, V_VAR2); // подтверждающее сообщение о получении id мастерноды, для остановки отправки броадкаст сообщения на мастер ноде
    MyMessage msg2(254, V_VAR1); // тестовое сообщение для отслеживания в терминале смены маршрута
    
    
    void setup()
    {
    }
    
    void presentation()
    {
      sendSketchInfo("SLAVE NODE", "1.0");
      wait(100);
      present(254, S_CUSTOM, "Test message");
    }
    
    void loop()
    {
      send(msg2.set("test")); // тестовое сообщение для мониторинга изменения маршрута сообщения в терминале
      wait(1000);
    }
    
    void receive(const MyMessage & message) {
      if (message.type == V_VAR1) {
        if (message.sensor == 255) {
          a = message.getByte();
          _transportConfig.parentNodeId = a; // назначаем парент ID, но после перезагрузки будет произведен поиск панерта(если не указан MY_PARENT_NODE_IS_STATIC) или будет парент 0(если указан MY_PARENT_NODE_IS_STATIC - поиск нового парента отключен)
          TRANSPORT_DEBUG(PSTR("TSM:MyS :) RECIVE MASTER ID OK\n"));
          send(msg.setDestination(a).set(b)); // ответное сообщение подтверждающее получение для остановки отправки бродкаста с мастер ноды
        }
      }
    }
    

    #3
    node1:

    #define MY_DEBUG
    #define MY_RADIO_NRF24
    #define MY_REPEATER_FEATURE  // необязательное условие, применяется в данном примере для доставки сообщения на гейт через мастер ноду
    #include <MySensors.h>
    
    byte a; // переменная с передаваемым значением id данной мастер ноды какой либо потенциальной слейв ноде
    bool b = false; // переменная флаг выключающая отправку броадкаста
    MyMessage msg(250, V_VAR1); // cообщение на сенсор номер 255(может быть назначен любой id сенсора на ноде)
    
    void setup()
    {
    }
    
    void presentation()
    {
      sendSketchInfo("MASTER NODE", "2.0");
    }
    
    void loop()
    {
      if (b == false) {
        wait(10000);
        a = getNodeId();
        send(msg.setDestination(255).set(a)); // броадкаст сообщение
      }
    }
    
    void receive(const MyMessage & message) {
      if (message.type == V_VAR2) {
        if (message.sensor == 250) {
          b = message.getBool();
          TRANSPORT_DEBUG(PSTR("TSM:MyS :) GET BOOL = %d\n"),b);
          TRANSPORT_DEBUG(PSTR("TSM:MyS :) MASTER ID RECIVED SLAVE NODE, SENDING BROADCAST IS OFF\n"));
        }
      }
    }
    

    node2:

    byte a = 0; //переменная с передаваемым значением id мастер ноды данной слейв ноде, в стартовом положении с номером 0,
    bool b = true; //переменная с передаваемым значением флага прекращения отправки бродкаста мастер нодой
    bool pairs = false; //переменная с передаваемым значением флага прекращения обработки в лупе бродкаста мастера
    
    #define MY_DEBUG
    #define MY_RADIO_NRF24
    #include <MySensors.h>
    
    
    MyMessage msg(250, V_VAR2); // подтверждающее сообщение о получении id мастерноды, для остановки отправки броадкаст сообщения на мастер ноде
    MyMessage msg2(254, V_VAR1); // тестовое сообщение для отслеживания в терминале смены маршрута
    
    
    void setup()
    {
    
    }
    
    void presentation()
    {
      sendSketchInfo("SLAVE NODE", "2.0");
      wait(100);
      present(254, S_CUSTOM, "Test message");
    }
    
    void loop()
    {
      send(msg2.set("test")); // тестовое сообщение для мониторинга изменения маршрута сообщения в терминале
      wait(1000);
      if (pairs == 0) {
        if (_msg.destination == 255) {
          if (_msg.type == V_VAR1) {
            if (_msg.sensor == 250) {
              a = _msg.getByte();
              _transportConfig.parentNodeId = a; // назначаем парент ID, но после перезагрузки будет произведен поиск нового панерта
              TRANSPORT_DEBUG(PSTR("TSM:MyS :) RECIVE MASTER ID OK\n"));
              send(msg.setDestination(a).set(b)); // ответное сообщение подтверждающее получение для остановки отправки бродкаста с мастер ноды
              pairs = 1;
            }
          }
        }
      }
    }
    

    It's very, very simple examples(showing mechanism), but it seems to me that they can be useful. I hope it will notice the developers of the Protocol, really need some new, advanced functionality.

    VIDEO1: application to devices (networking mysensors)
    Реле, выключатели | MySensors | Majordomo – 05:11
    — SMART BOX

    VIDEO2: the use of the devices (operation without gatway and controller)
    Стенд элон мод | Реле, выключатели | MySensors 2 – 01:09
    — SMART BOX

    ...sorry that code comments are not translated and the video without subtitles


 

385
Online

7.6k
Users

8.5k
Topics

91.3k
Posts