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. Troubleshooting
  3. Upgrading to 2.0 sketch dificulty

Upgrading to 2.0 sketch dificulty

Scheduled Pinned Locked Moved Troubleshooting
11 Posts 6 Posters 3.1k Views 4 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.
  • andmasterA andmaster

    Hi all,

    i've been trying for the last few hours to convert a multirelaywithbutton actuator to 2.0 with no sucess...

    the most i get is a "random" id of the relays in domoticz, and the buttons dont work properly..

    As so, i've founded an example in 2.0 but to a single relay.
    the sketch i've found in examples is:

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - Henrik Ekblad
     * 
     * DESCRIPTION
     * Example sketch for a "light switch" where you can control light or something 
     * else from both HA controller and a local physical button 
     * (connected between digital pin 3 and GND).
     * This node also works as a repeader for other nodes
     * http://www.mysensors.org/build/relay
     */ 
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    // Enabled repeater feature for this node
    #define MY_REPEATER_FEATURE
    
    #include <SPI.h>
    #include <MySensors.h>
    #include <Bounce2.h>
    
    #define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
    #define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
    #define CHILD_ID 1   // Id of the sensor child
    #define RELAY_ON 1
    #define RELAY_OFF 0
    
    Bounce debouncer = Bounce(); 
    int oldValue=0;
    bool state;
    
    MyMessage msg(CHILD_ID,V_LIGHT);
    
    void setup()  
    {  
      // Setup the button
      pinMode(BUTTON_PIN,INPUT);
      // Activate internal pull-up
      digitalWrite(BUTTON_PIN,HIGH);
      
      // After setting up the button, setup debouncer
      debouncer.attach(BUTTON_PIN);
      debouncer.interval(5);
    
      // Make sure relays are off when starting up
      digitalWrite(RELAY_PIN, RELAY_OFF);
      // Then set relay pins in output mode
      pinMode(RELAY_PIN, OUTPUT);   
          
      // Set relay to last known state (using eeprom storage) 
      state = loadState(CHILD_ID);
      digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    }
    
    void presentation()  {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Relay & Button", "1.0");
    
      // Register all sensors to gw (they will be created as child devices)
      present(CHILD_ID, S_LIGHT);
    }
    
    /*
    *  Example on how to asynchronously check for new messages from gw
    */
    void loop() 
    {
      debouncer.update();
      // Get the update value
      int value = debouncer.read();
      if (value != oldValue && value==0) {
          send(msg.set(state?false:true), true); // Send new state and request ack back
      }
      oldValue = value;
    } 
     
    void receive(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.isAck()) {
         Serial.println("This is an ack from gateway");
      }
    
      if (message.type == V_LIGHT) {
         // Change relay state
         state = message.getBool();
         digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
         // Store state in eeprom
         saveState(CHILD_ID, state);
        
         // Write some debug info
         Serial.print("Incoming change for sensor:");
         Serial.print(message.sensor);
         Serial.print(", New status: ");
         Serial.println(message.getBool());
       } 
    }
    

    Can anyone help geting this so i can have:
    4 relays
    4 buttons
    domoticz also controling each one?

    Many thanks in advance.

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

    @andmaster use the relay example for MySensors 2.0 (which is included with the library) and follow the instructions in the code comments and you should be all set.

    andmasterA 1 Reply Last reply
    0
    • mfalkviddM mfalkvidd

      @andmaster use the relay example for MySensors 2.0 (which is included with the library) and follow the instructions in the code comments and you should be all set.

      andmasterA Offline
      andmasterA Offline
      andmaster
      wrote on last edited by
      #3

      @mfalkvidd this is the example 😃

      mfalkviddM 1 Reply Last reply
      0
      • andmasterA andmaster

        @mfalkvidd this is the example 😃

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

        @andmaster no.

        The sketch you posted does not have these instructions:

        #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
        #define NUMBER_OF_RELAYS 1 // Total number of attached relays
        
        1 Reply Last reply
        0
        • andmasterA Offline
          andmasterA Offline
          andmaster
          wrote on last edited by
          #5

          @mfalkvidd the example is provided here: https://github.com/mysensors/MySensorsArduinoExamples/blob/master/examples/RelayWithButtonActuator/RelayWithButtonActuator.ino

          what you are mentioning is the example where you can put multiple relays, but without any button actuator.

          Thanks

          1 Reply Last reply
          0
          • scalzS Offline
            scalzS Offline
            scalz
            Hardware Contributor
            wrote on last edited by
            #6

            @andmaster
            in fact @mfalkvidd is right, you have to "mix" the two sketch if you want multi relay with multiple buttons.
            could be fast to do, but i have no time.
            if you want show us your non working sketch, so we can tell what to do ;)

            1 Reply Last reply
            0
            • andmasterA andmaster

              Hi all,

              i've been trying for the last few hours to convert a multirelaywithbutton actuator to 2.0 with no sucess...

              the most i get is a "random" id of the relays in domoticz, and the buttons dont work properly..

              As so, i've founded an example in 2.0 but to a single relay.
              the sketch i've found in examples is:

              /**
               * The MySensors Arduino library handles the wireless radio link and protocol
               * between your home built sensors/actuators and HA controller of choice.
               * The sensors forms a self healing radio network with optional repeaters. Each
               * repeater and gateway builds a routing tables in EEPROM which keeps track of the
               * network topology allowing messages to be routed to nodes.
               *
               * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
               * Copyright (C) 2013-2015 Sensnology AB
               * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
               *
               * Documentation: http://www.mysensors.org
               * Support Forum: http://forum.mysensors.org
               *
               * This program is free software; you can redistribute it and/or
               * modify it under the terms of the GNU General Public License
               * version 2 as published by the Free Software Foundation.
               *
               *******************************
               *
               * REVISION HISTORY
               * Version 1.0 - Henrik Ekblad
               * 
               * DESCRIPTION
               * Example sketch for a "light switch" where you can control light or something 
               * else from both HA controller and a local physical button 
               * (connected between digital pin 3 and GND).
               * This node also works as a repeader for other nodes
               * http://www.mysensors.org/build/relay
               */ 
              
              // Enable debug prints to serial monitor
              #define MY_DEBUG 
              
              // Enable and select radio type attached
              #define MY_RADIO_NRF24
              //#define MY_RADIO_RFM69
              
              // Enabled repeater feature for this node
              #define MY_REPEATER_FEATURE
              
              #include <SPI.h>
              #include <MySensors.h>
              #include <Bounce2.h>
              
              #define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
              #define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
              #define CHILD_ID 1   // Id of the sensor child
              #define RELAY_ON 1
              #define RELAY_OFF 0
              
              Bounce debouncer = Bounce(); 
              int oldValue=0;
              bool state;
              
              MyMessage msg(CHILD_ID,V_LIGHT);
              
              void setup()  
              {  
                // Setup the button
                pinMode(BUTTON_PIN,INPUT);
                // Activate internal pull-up
                digitalWrite(BUTTON_PIN,HIGH);
                
                // After setting up the button, setup debouncer
                debouncer.attach(BUTTON_PIN);
                debouncer.interval(5);
              
                // Make sure relays are off when starting up
                digitalWrite(RELAY_PIN, RELAY_OFF);
                // Then set relay pins in output mode
                pinMode(RELAY_PIN, OUTPUT);   
                    
                // Set relay to last known state (using eeprom storage) 
                state = loadState(CHILD_ID);
                digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
              }
              
              void presentation()  {
                // Send the sketch version information to the gateway and Controller
                sendSketchInfo("Relay & Button", "1.0");
              
                // Register all sensors to gw (they will be created as child devices)
                present(CHILD_ID, S_LIGHT);
              }
              
              /*
              *  Example on how to asynchronously check for new messages from gw
              */
              void loop() 
              {
                debouncer.update();
                // Get the update value
                int value = debouncer.read();
                if (value != oldValue && value==0) {
                    send(msg.set(state?false:true), true); // Send new state and request ack back
                }
                oldValue = value;
              } 
               
              void receive(const MyMessage &message) {
                // We only expect one type of message from controller. But we better check anyway.
                if (message.isAck()) {
                   Serial.println("This is an ack from gateway");
                }
              
                if (message.type == V_LIGHT) {
                   // Change relay state
                   state = message.getBool();
                   digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
                   // Store state in eeprom
                   saveState(CHILD_ID, state);
                  
                   // Write some debug info
                   Serial.print("Incoming change for sensor:");
                   Serial.print(message.sensor);
                   Serial.print(", New status: ");
                   Serial.println(message.getBool());
                 } 
              }
              

              Can anyone help geting this so i can have:
              4 relays
              4 buttons
              domoticz also controling each one?

              Many thanks in advance.

              N Offline
              N Offline
              niccodemi
              wrote on last edited by
              #7

              @andmaster

              I've used below sketch with 1.6 development version; it compiles also with 2.0.0 but I have not tested it. This sketch uses toggle buttons.

              //MultiRelayButton Sketch, MySensors 1.6, toggle switch
              
              #define MY_RADIO_NRF24
              
              #define MY_REPEATER_FEATURE
              
              #include <MySensors.h>
              #include <SPI.h>
              #include <Bounce2.h>
              #define RELAY_ON 0                      // switch around for ACTIVE LOW / ACTIVE HIGH relay
              #define RELAY_OFF 1                     // switch around for ACTIVE LOW / ACTIVE HIGH relay
              //
              
              #define noRelays 4                     //2-4, define number of relays
              const int relayPin[] = {14,15,16,17};          //  relay pins - should match noRelays
              const int buttonPin[] = {3,4,5,6};      //  button pins - should match noRelays
              
              class Relay             // relay class, store all relevant data (equivalent to struct)
              {
              public:                                      
                int buttonPin;                   // physical pin number of button
                int relayPin;             // physical pin number of relay
                boolean relayState;               // relay status (also stored in EEPROM)
              };
              
              Relay Relays[noRelays]; 
              Bounce debouncer[noRelays];
              MyMessage msg[noRelays];
              
              void setup(){
                  sendHeartbeat();
                  wait(100);
                  // Initialize Relays with corresponding buttons
                  for (int i = 0; i < noRelays; i++){
                  Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                  Relays[i].relayPin = relayPin[i];
                  msg[i].sensor = i;                                   // initialize messages
                  msg[i].type = V_LIGHT;   
                  pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                  wait(100);
                  pinMode(Relays[i].relayPin, OUTPUT);
                  Relays[i].relayState = loadState(i);                               // retrieve last values from EEPROM
                  digitalWrite(Relays[i].relayPin, Relays[i].relayState? RELAY_ON:RELAY_OFF);   // and set relays accordingly
                  send(msg[i].set(Relays[i].relayState? true : false));                  // make controller aware of last status  
                  wait(50);
                  debouncer[i] = Bounce();                        // initialize debouncer
                  debouncer[i].attach(buttonPin[i]);
                  debouncer[i].interval(20);
                  wait(50);
                  }
              }
              void presentation()  {
                    sendSketchInfo("MultiRelayButton", "1.0");
                    wait(100);
                    for (int i = 0; i < noRelays; i++)
                    present(i, S_LIGHT);                               // present sensor to gateway
                    wait(100);
              }
              void loop()
              {
                  for (byte i = 0; i < noRelays; i++) {
                      if (debouncer[i].update()) {
                          Relays[i].relayState = !Relays[i].relayState;
                          digitalWrite(Relays[i].relayPin, Relays[i].relayState?RELAY_ON:RELAY_OFF);
                          send(msg[i].set(Relays[i].relayState? true : false));
                          // save sensor state in EEPROM (location == sensor number)
                          saveState( i, Relays[i].relayState );
                      }                 
                  }
                  wait(20);
              }
              // process incoming message 
              void receive(const MyMessage &message){        
                 if (message.type == V_LIGHT){ 
                 if (message.sensor <noRelays){            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                 Relays[message.sensor].relayState = message.getBool(); 
                 digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly
                 saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
                 }
                }
                wait(20);
              }
              
              andredtsA 1 Reply Last reply
              1
              • andmasterA Offline
                andmasterA Offline
                andmaster
                wrote on last edited by andmaster
                #8

                hi @niccodemi that did the trick.

                I've made a quick comparison and i guess the issue was that i've defined my button without a proper array.

                this also has a change i think is important. i had a push button, and i wanted a toggle :)

                Just made a change. i want relay on to be 1 (high) and off to be 0 (low).
                This way, it starts every time at 0

                many thanks!!

                1 Reply Last reply
                0
                • N niccodemi

                  @andmaster

                  I've used below sketch with 1.6 development version; it compiles also with 2.0.0 but I have not tested it. This sketch uses toggle buttons.

                  //MultiRelayButton Sketch, MySensors 1.6, toggle switch
                  
                  #define MY_RADIO_NRF24
                  
                  #define MY_REPEATER_FEATURE
                  
                  #include <MySensors.h>
                  #include <SPI.h>
                  #include <Bounce2.h>
                  #define RELAY_ON 0                      // switch around for ACTIVE LOW / ACTIVE HIGH relay
                  #define RELAY_OFF 1                     // switch around for ACTIVE LOW / ACTIVE HIGH relay
                  //
                  
                  #define noRelays 4                     //2-4, define number of relays
                  const int relayPin[] = {14,15,16,17};          //  relay pins - should match noRelays
                  const int buttonPin[] = {3,4,5,6};      //  button pins - should match noRelays
                  
                  class Relay             // relay class, store all relevant data (equivalent to struct)
                  {
                  public:                                      
                    int buttonPin;                   // physical pin number of button
                    int relayPin;             // physical pin number of relay
                    boolean relayState;               // relay status (also stored in EEPROM)
                  };
                  
                  Relay Relays[noRelays]; 
                  Bounce debouncer[noRelays];
                  MyMessage msg[noRelays];
                  
                  void setup(){
                      sendHeartbeat();
                      wait(100);
                      // Initialize Relays with corresponding buttons
                      for (int i = 0; i < noRelays; i++){
                      Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                      Relays[i].relayPin = relayPin[i];
                      msg[i].sensor = i;                                   // initialize messages
                      msg[i].type = V_LIGHT;   
                      pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                      wait(100);
                      pinMode(Relays[i].relayPin, OUTPUT);
                      Relays[i].relayState = loadState(i);                               // retrieve last values from EEPROM
                      digitalWrite(Relays[i].relayPin, Relays[i].relayState? RELAY_ON:RELAY_OFF);   // and set relays accordingly
                      send(msg[i].set(Relays[i].relayState? true : false));                  // make controller aware of last status  
                      wait(50);
                      debouncer[i] = Bounce();                        // initialize debouncer
                      debouncer[i].attach(buttonPin[i]);
                      debouncer[i].interval(20);
                      wait(50);
                      }
                  }
                  void presentation()  {
                        sendSketchInfo("MultiRelayButton", "1.0");
                        wait(100);
                        for (int i = 0; i < noRelays; i++)
                        present(i, S_LIGHT);                               // present sensor to gateway
                        wait(100);
                  }
                  void loop()
                  {
                      for (byte i = 0; i < noRelays; i++) {
                          if (debouncer[i].update()) {
                              Relays[i].relayState = !Relays[i].relayState;
                              digitalWrite(Relays[i].relayPin, Relays[i].relayState?RELAY_ON:RELAY_OFF);
                              send(msg[i].set(Relays[i].relayState? true : false));
                              // save sensor state in EEPROM (location == sensor number)
                              saveState( i, Relays[i].relayState );
                          }                 
                      }
                      wait(20);
                  }
                  // process incoming message 
                  void receive(const MyMessage &message){        
                     if (message.type == V_LIGHT){ 
                     if (message.sensor <noRelays){            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                     Relays[message.sensor].relayState = message.getBool(); 
                     digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly
                     saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
                     }
                    }
                    wait(20);
                  }
                  
                  andredtsA Offline
                  andredtsA Offline
                  andredts
                  wrote on last edited by
                  #9

                  @niccodemi

                  Hi, I know that this is quite old topic, but only now I´m updating my home from version 1.5.4 to 2.*, most because reability issues. One thing I notice with you skecth is that if by any chance the gateway is not present the nodes can´t be used anymore after a power loss, I mean, one can not use the fisical buttons to switch the relays, because they will not respond. My question is if there is a way to keep the node up with out the gateway, in case it dies?

                  Thanks

                  Boots33B 1 Reply Last reply
                  0
                  • andredtsA andredts

                    @niccodemi

                    Hi, I know that this is quite old topic, but only now I´m updating my home from version 1.5.4 to 2.*, most because reability issues. One thing I notice with you skecth is that if by any chance the gateway is not present the nodes can´t be used anymore after a power loss, I mean, one can not use the fisical buttons to switch the relays, because they will not respond. My question is if there is a way to keep the node up with out the gateway, in case it dies?

                    Thanks

                    Boots33B Offline
                    Boots33B Offline
                    Boots33
                    Hero Member
                    wrote on last edited by
                    #10

                    @andredts As you have discovered version 2.1 nodes while booting will not proceed to the loop part of the sketch if the gateway is not found. You can however force them to move on. The line of code you need is...

                    #define MY_TRANSPORT_WAIT_READY_MS 3000
                    

                    This code tells the node how long to wait for the uplink to be established before moving on to the rest of the sketch. The number at the end is how long to wait in milliseconds, in this case 3000ms (3 seconds). You can set this to a time of your choosing.

                    if the node establishes the uplink it will move on without any delay.

                    The above line is placed near the top of your sketch somewhere before

                    #include <MySensors.h>
                    

                    have a look at these for a bit more detail....

                    MY_TRANSPORT_DONT_CARE_MODE

                    Synchronising Light switch

                    andredtsA 1 Reply Last reply
                    1
                    • Boots33B Boots33

                      @andredts As you have discovered version 2.1 nodes while booting will not proceed to the loop part of the sketch if the gateway is not found. You can however force them to move on. The line of code you need is...

                      #define MY_TRANSPORT_WAIT_READY_MS 3000
                      

                      This code tells the node how long to wait for the uplink to be established before moving on to the rest of the sketch. The number at the end is how long to wait in milliseconds, in this case 3000ms (3 seconds). You can set this to a time of your choosing.

                      if the node establishes the uplink it will move on without any delay.

                      The above line is placed near the top of your sketch somewhere before

                      #include <MySensors.h>
                      

                      have a look at these for a bit more detail....

                      MY_TRANSPORT_DONT_CARE_MODE

                      Synchronising Light switch

                      andredtsA Offline
                      andredtsA Offline
                      andredts
                      wrote on last edited by
                      #11

                      @Boots33 Thanks, that was exactly what I needed. Synchronizing was a great bonus.

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


                      13

                      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