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. General Discussion
  3. double RelyWithButonActuator not working

double RelyWithButonActuator not working

Scheduled Pinned Locked Moved General Discussion
3 Posts 2 Posters 787 Views 2 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.
  • DickD Offline
    DickD Offline
    Dick
    wrote on last edited by Dick
    #1

    still strugling with multiple relais without using a class. in my code I duplicate the example of MySensors. testing the 2 relais both activate of the 2 defined buttons. so clicking one button, both relais activate, the same with the other button. How can I get it work and what is wrong in the code? If I test only one relay with one button that works fine.

    /**
     * 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
     */ 
    
    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    
    #define RELAY1_PIN  4  // Arduino Digital I/O pin number for relay 
    #define BUTTON1_PIN  3  // Arduino Digital I/O pin number for button 
    #define CHILD_ID_1 1   // Id of the sensor child
    #define RELAY2_PIN  6  // Arduino Digital I/O pin number for relay 
    #define BUTTON2_PIN  5  // Arduino Digital I/O pin number for button 
    #define CHILD_ID_2 2   // Id of the sensor child
    #define RELAY_ON 1
    #define RELAY_OFF 0
    
    Bounce debouncer1 = Bounce(); 
    int oldValue1=0;
    bool state1;
    Bounce debouncer2 = Bounce();
    int oldValue2=0;
    bool state2;
    MySensor gw;
    MyMessage msg1(CHILD_ID_1,V_LIGHT);
    MyMessage msg2(CHILD_ID_2,V_LIGHT);
    
    void setup()  
    {  
      gw.begin(incomingMessage, AUTO, true);
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Relay & Button", "1.0");
    
     // Setup the button
      pinMode(BUTTON1_PIN,INPUT);
      digitalWrite(BUTTON1_PIN,HIGH);
      pinMode(BUTTON2_PIN,INPUT);
      digitalWrite(BUTTON2_PIN,HIGH);
      
      // After setting up the button, setup debouncer
      debouncer1.attach(BUTTON1_PIN);
      debouncer1.interval(5);
      debouncer2.attach(BUTTON2_PIN);
      debouncer2.interval(5);
    
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_1, S_LIGHT);
      digitalWrite(RELAY1_PIN, RELAY_OFF);
      pinMode(RELAY1_PIN, OUTPUT);
      
      gw.present(CHILD_ID_2, S_LIGHT);
      digitalWrite(RELAY2_PIN, RELAY_OFF);
      // Then set relay pins in output mode  
      pinMode(RELAY2_PIN, OUTPUT);   
          
      // Set relay to last known state (using eeprom storage) 
      state1 = gw.loadState(CHILD_ID_1);
      digitalWrite(RELAY1_PIN, state1?RELAY_ON:RELAY_OFF);
      state2 = gw.loadState(CHILD_ID_2);  
      digitalWrite(RELAY2_PIN, state2?RELAY_ON:RELAY_OFF);
    }
    
    
    /*
    *  Example on how to asynchronously check for new messages from gw
    */
    void loop() 
    {
      gw.process();
      debouncer1.update();
      // Get the update value
      int value1 = debouncer1.read();
      if (value1 != oldValue1 && value1==0) {
          gw.send(msg1.set(state1?false:true), true); // Send new state and request ack back
      }
      oldValue1 = value1;
    
        debouncer2.update();
      // Get the update value
      int value2 = debouncer2.read();
      if (value2 != oldValue2 && value2==0) {
          gw.send(msg2.set(state2?false:true), true); // Send new state and request ack back
      }
      oldValue2 = value2;
    } 
     
    void incomingMessage(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
         state1 = message.getBool();
         digitalWrite(RELAY1_PIN, state1?RELAY_ON:RELAY_OFF);
         // Store state in eeprom
         gw.saveState(CHILD_ID_1, state1);
    
    if (message.type == V_LIGHT) {
         state2 = message.getBool();
         digitalWrite(RELAY2_PIN, state2?RELAY_ON:RELAY_OFF);
         gw.saveState(CHILD_ID_2, state2);
        
         // Write some debug info
         Serial.print("Incoming change for sensor:");
         Serial.print(message.sensor);
         Serial.print(", New status: ");
         Serial.println(message.getBool());
       } 
    }
    }
    
    Boots33B 1 Reply Last reply
    0
    • DickD Dick

      still strugling with multiple relais without using a class. in my code I duplicate the example of MySensors. testing the 2 relais both activate of the 2 defined buttons. so clicking one button, both relais activate, the same with the other button. How can I get it work and what is wrong in the code? If I test only one relay with one button that works fine.

      /**
       * 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
       */ 
      
      #include <MySensor.h>
      #include <SPI.h>
      #include <Bounce2.h>
      
      #define RELAY1_PIN  4  // Arduino Digital I/O pin number for relay 
      #define BUTTON1_PIN  3  // Arduino Digital I/O pin number for button 
      #define CHILD_ID_1 1   // Id of the sensor child
      #define RELAY2_PIN  6  // Arduino Digital I/O pin number for relay 
      #define BUTTON2_PIN  5  // Arduino Digital I/O pin number for button 
      #define CHILD_ID_2 2   // Id of the sensor child
      #define RELAY_ON 1
      #define RELAY_OFF 0
      
      Bounce debouncer1 = Bounce(); 
      int oldValue1=0;
      bool state1;
      Bounce debouncer2 = Bounce();
      int oldValue2=0;
      bool state2;
      MySensor gw;
      MyMessage msg1(CHILD_ID_1,V_LIGHT);
      MyMessage msg2(CHILD_ID_2,V_LIGHT);
      
      void setup()  
      {  
        gw.begin(incomingMessage, AUTO, true);
      
        // Send the sketch version information to the gateway and Controller
        gw.sendSketchInfo("Relay & Button", "1.0");
      
       // Setup the button
        pinMode(BUTTON1_PIN,INPUT);
        digitalWrite(BUTTON1_PIN,HIGH);
        pinMode(BUTTON2_PIN,INPUT);
        digitalWrite(BUTTON2_PIN,HIGH);
        
        // After setting up the button, setup debouncer
        debouncer1.attach(BUTTON1_PIN);
        debouncer1.interval(5);
        debouncer2.attach(BUTTON2_PIN);
        debouncer2.interval(5);
      
        // Register all sensors to gw (they will be created as child devices)
        gw.present(CHILD_ID_1, S_LIGHT);
        digitalWrite(RELAY1_PIN, RELAY_OFF);
        pinMode(RELAY1_PIN, OUTPUT);
        
        gw.present(CHILD_ID_2, S_LIGHT);
        digitalWrite(RELAY2_PIN, RELAY_OFF);
        // Then set relay pins in output mode  
        pinMode(RELAY2_PIN, OUTPUT);   
            
        // Set relay to last known state (using eeprom storage) 
        state1 = gw.loadState(CHILD_ID_1);
        digitalWrite(RELAY1_PIN, state1?RELAY_ON:RELAY_OFF);
        state2 = gw.loadState(CHILD_ID_2);  
        digitalWrite(RELAY2_PIN, state2?RELAY_ON:RELAY_OFF);
      }
      
      
      /*
      *  Example on how to asynchronously check for new messages from gw
      */
      void loop() 
      {
        gw.process();
        debouncer1.update();
        // Get the update value
        int value1 = debouncer1.read();
        if (value1 != oldValue1 && value1==0) {
            gw.send(msg1.set(state1?false:true), true); // Send new state and request ack back
        }
        oldValue1 = value1;
      
          debouncer2.update();
        // Get the update value
        int value2 = debouncer2.read();
        if (value2 != oldValue2 && value2==0) {
            gw.send(msg2.set(state2?false:true), true); // Send new state and request ack back
        }
        oldValue2 = value2;
      } 
       
      void incomingMessage(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
           state1 = message.getBool();
           digitalWrite(RELAY1_PIN, state1?RELAY_ON:RELAY_OFF);
           // Store state in eeprom
           gw.saveState(CHILD_ID_1, state1);
      
      if (message.type == V_LIGHT) {
           state2 = message.getBool();
           digitalWrite(RELAY2_PIN, state2?RELAY_ON:RELAY_OFF);
           gw.saveState(CHILD_ID_2, state2);
          
           // Write some debug info
           Serial.print("Incoming change for sensor:");
           Serial.print(message.sensor);
           Serial.print(", New status: ");
           Serial.println(message.getBool());
         } 
      }
      }
      
      Boots33B Offline
      Boots33B Offline
      Boots33
      Hero Member
      wrote on last edited by
      #2

      @Dick in your receive code you are not testing for which child the message is for, so both are being switched.
      You need to test what child the incoming message is for using message.sensor

      Try something like below.

      Also is there any reason you are still using MySensors V1.x

      if (message.type == V_LIGHT) {
        switch (message.sensor) {
           case CHILD_ID_1:
               // Change relay state
              state1 = message.getBool();
              digitalWrite(RELAY1_PIN, state1?RELAY_ON:RELAY_OFF);
             // Store state in eeprom
             gw.saveState(CHILD_ID_1, state1);
            break;
        case CHILD_ID_2:
            state2 = message.getBool();
           digitalWrite(RELAY2_PIN, state2?RELAY_ON:RELAY_OFF);
           gw.saveState(CHILD_ID_2, state2);
           break;
        default:
              Serial.print("Incoming sensor unknown");
          }
      }
      
      DickD 1 Reply Last reply
      0
      • Boots33B Boots33

        @Dick in your receive code you are not testing for which child the message is for, so both are being switched.
        You need to test what child the incoming message is for using message.sensor

        Try something like below.

        Also is there any reason you are still using MySensors V1.x

        if (message.type == V_LIGHT) {
          switch (message.sensor) {
             case CHILD_ID_1:
                 // Change relay state
                state1 = message.getBool();
                digitalWrite(RELAY1_PIN, state1?RELAY_ON:RELAY_OFF);
               // Store state in eeprom
               gw.saveState(CHILD_ID_1, state1);
              break;
          case CHILD_ID_2:
              state2 = message.getBool();
             digitalWrite(RELAY2_PIN, state2?RELAY_ON:RELAY_OFF);
             gw.saveState(CHILD_ID_2, state2);
             break;
          default:
                Serial.print("Incoming sensor unknown");
            }
        }
        
        DickD Offline
        DickD Offline
        Dick
        wrote on last edited by
        #3

        Thanks for the solution, I tested it and works fine now. In Answer to your question why I use the old version of MySensors, at the moment I am re-configurating my ne RP with the latest version of Domoticz. After that I will connect the latest MYsensors Gateway to it. If all the nodes keep on working on the new environment, there is not an immediate need to adjust the code of all my nodes. Is my approach correct? if not please reply.

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


        7

        Online

        11.7k

        Users

        11.2k

        Topics

        113.0k

        Posts


        Copyright 2019 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