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. Bug Reports
  3. RelayWithButtonActuator

RelayWithButtonActuator

Scheduled Pinned Locked Moved Bug Reports
9 Posts 7 Posters 5.5k 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.
  • M Offline
    M Offline
    maglo18
    wrote on last edited by maglo18
    #1

    I try to use Relay With Button Actuator 1.4 but I have problem. When i press button everything working well. Problem is when I restart node and want to change status form gateway, it doesn't work then. When i press button only once then i can remote from getaway.
    My code:

    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    
    #define RELAY_PIN_2  8
    #define RELAY_PIN  7 // Arduino Digital I/O pin number for relay 
    #define BUTTON_PIN_2  4
    #define BUTTON_PIN  3 // Arduino Digital I/O pin number for button 
    #define CHILD_ID_2 2
    #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;
    Bounce debouncer2 = Bounce(); 
    int oldValue2=0;
    bool state2;
    
    
    
    MySensor gw;
    MyMessage msg(CHILD_ID,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("Double Relay & Button", "0.1");
    
     // Setup the button
      pinMode(BUTTON_PIN,INPUT);
      // Activate internal pull-up
      digitalWrite(BUTTON_PIN,HIGH);
      
       // Setup the button
      pinMode(BUTTON_PIN_2,INPUT);
      // Activate internal pull-up
      digitalWrite(BUTTON_PIN_2,HIGH);
      
      
      
      // After setting up the button, setup debouncer
      debouncer.attach(BUTTON_PIN);
      debouncer.interval(5);
      
      debouncer2.attach(BUTTON_PIN_2);
      debouncer2.interval(5);
      
    
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_LIGHT);
      gw.present(CHILD_ID_2, S_LIGHT);
    
      // Make sure relays are off when starting up
      digitalWrite(RELAY_PIN, RELAY_OFF);
      // Then set relay pins in output mode
      pinMode(RELAY_PIN, OUTPUT);   
      
      digitalWrite(RELAY_PIN_2, RELAY_OFF);
      // Then set relay pins in output mode
      pinMode(RELAY_PIN_2, OUTPUT);  
      
      
          
      // Set relay to last known state (using eeprom storage) 
      state = gw.loadState(CHILD_ID);
      digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
      
      state2 = gw.loadState(CHILD_ID_2);
      digitalWrite(RELAY_PIN_2, state2?RELAY_ON:RELAY_OFF);
      
    }
    
    
    /*
    *  Example on how to asynchronously check for new messages from gw
    */
    void loop() 
    {
      gw.process();
      debouncer.update();
      debouncer2.update();
      // Get the update value
      int value = debouncer.read();
      int value2 = debouncer2.read();
      
      if (value != oldValue && value==0) {
          gw.send(msg.set(state?false:true), true); // Send new state and request ack back
      }
      oldValue = value;
      
      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 && message.sensor == 1 && strlen(msg.getString()) != 0) {
         // Change relay state
         state = message.getBool();
         digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
         // Store state in eeprom
         gw.saveState(CHILD_ID, state);
       }
      else if(message.type == V_LIGHT && message.sensor == 2 && strlen(msg.getString()) != 0){  
        
         state2 = message.getBool();
         digitalWrite(RELAY_PIN_2, state2?RELAY_ON:RELAY_OFF);
         // Store state in eeprom
         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());
       } 
    }
    
    1 Reply Last reply
    0
    • M Offline
      M Offline
      maglo18
      wrote on last edited by maglo18
      #2

      I prepare sketch with 2 x button and 2 x relays and 8 x dallas. Could some one look at if it right, because i have problem remote relays after restart node. I don't know it is problem witch sketch or server software.

      Log from gataway:

      12-10-2014 18:57:55: 0;0;3;0;9;send: 0-0-2-2 s=11,c=1,t=2,pt=0,l=1,st=ok:0
      12-10-2014 18:57:55: 0;0;3;0;9;send: 0-0-2-2 s=11,c=1,t=2,pt=0,l=1,st=ok:1
      12-10-2014 18:57:54: 0;0;3;0;9;send: 0-0-2-2 s=12,c=1,t=2,pt=0,l=1,st=ok:0
      12-10-2014 18:57:54: 0;0;3;0;9;send: 0-0-2-2 s=12,c=1,t=2,pt=0,l=1,st=ok:1
      12-10-2014 18:57:53: 0;0;3;0;9;send: 0-0-2-2 s=11,c=1,t=2,pt=0,l=1,st=ok:0
      12-10-2014 18:57:52: 0;0;3;0;9;send: 0-0-2-2 s=11,c=1,t=2,pt=0,l=1,st=ok:1
      12-10-2014 18:54:39: 0;0;3;0;9;read: 2-2-0 s=0,c=1,t=0,pt=7,l=5:22.6
      12-10-2014 18:54:26: 0;0;3;0;9;send: 0-0-203-2 s=11,c=1,t=2,pt=0,l=1,st=fail:0
      12-10-2014 18:54:26: 0;0;3;0;9;send: 0-0-203-2 s=12,c=1,t=2,pt=0,l=1,st=fail:0
      12-10-2014 18:54:26: 0;0;3;0;9;send: 0-0-203-2 s=12,c=1,t=2,pt=0,l=1,st=fail:1
      12-10-2014 18:54:25: 0;0;3;0;9;send: 0-0-203-2 s=11,c=1,t=2,pt=0,l=1,st=fail:1

      Code:

      #include <MySensor.h>
      #include <SPI.h>
      #include <Bounce2.h>
      #include <DallasTemperature.h>
      #include <OneWire.h>
      
      #define RELAY_PIN_2  8
      #define RELAY_PIN  7 // Arduino Digital I/O pin number for relay 
      #define BUTTON_PIN_2  4
      #define BUTTON_PIN  3 // Arduino Digital I/O pin number for button 
      #define CHILD_ID_2 12
      #define CHILD_ID 11 // Id of the sensor child
      #define RELAY_ON 1
      #define RELAY_OFF 0
      
      Bounce debouncer = Bounce(); 
      int oldValue=0;
      bool state;
      Bounce debouncer2 = Bounce(); 
      int oldValue2=0;
      bool state2;
      
      
      //temp
      #define ONE_WIRE_BUS 5 // Pin where dallase sensor is connected 
      #define MAX_ATTACHED_DS18B20 8
      unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
      unsigned long SEND_FREQUENCY = 30000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
      unsigned long lastSend;
      unsigned long sendTime;
      OneWire oneWire(ONE_WIRE_BUS);
      DallasTemperature sensors(&oneWire);
      
      MySensor gw;
      
      //temp
      float lastTemperature[MAX_ATTACHED_DS18B20];
      int numSensors=0;
      boolean receivedConfig = false;
      boolean metric = true; 
      
      
      MyMessage msg(CHILD_ID,V_LIGHT);
      MyMessage msg2(CHILD_ID_2,V_LIGHT);
      MyMessage msg3(0,V_TEMP);
      
      
      
      void setup()  
      {  
      
         // Startup OneWire 
        sensors.begin();
      
        gw.begin(incomingMessage, AUTO, true);
      
        // Send the sketch version information to the gateway and Controller
        gw.sendSketchInfo("Double Relay & Button, Temp", "0.1");
      
        // Fetch the number of attached temperature sensors  
        numSensors = sensors.getDeviceCount();
      
        // Present all sensors to controller
        for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
           gw.present(i, S_TEMP);
        }
      
       // Setup the button
        pinMode(BUTTON_PIN,INPUT);
        // Activate internal pull-up
        digitalWrite(BUTTON_PIN,HIGH);
        
         // Setup the button
        pinMode(BUTTON_PIN_2,INPUT);
        // Activate internal pull-up
        digitalWrite(BUTTON_PIN_2,HIGH);
        
        
        
        // After setting up the button, setup debouncer
        debouncer.attach(BUTTON_PIN);
        debouncer.interval(5);
        
        debouncer2.attach(BUTTON_PIN_2);
        debouncer2.interval(5);
        
      
        // Register all sensors to gw (they will be created as child devices)
        gw.present(CHILD_ID, S_LIGHT);
        gw.present(CHILD_ID_2, S_LIGHT);
      
        // Make sure relays are off when starting up
        digitalWrite(RELAY_PIN, RELAY_OFF);
        // Then set relay pins in output mode
        pinMode(RELAY_PIN, OUTPUT);   
        
        digitalWrite(RELAY_PIN_2, RELAY_OFF);
        // Then set relay pins in output mode
        pinMode(RELAY_PIN_2, OUTPUT);  
        
        
            
        // Set relay to last known state (using eeprom storage) 
        state = gw.loadState(CHILD_ID);
        digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
        
        state2 = gw.loadState(CHILD_ID_2);
        digitalWrite(RELAY_PIN_2, state2?RELAY_ON:RELAY_OFF);
        
      }
      
      
      /*
      *  Example on how to asynchronously check for new messages from gw
      */
      void loop() 
      {
        gw.process();
        debouncer.update();
        debouncer2.update();
        // Get the update value
        int value = debouncer.read();
        int value2 = debouncer2.read();
        
        if (value != oldValue && value==0) {
            gw.send(msg.set(state?false:true), true); // Send new state and request ack back
        }
        oldValue = value;
        
        if (value2 != oldValue2 && value2==0) {
            gw.send(msg2.set(state2?false:true), true); // Send new state and request ack back
        }
        oldValue2 = value2;  
      
        unsigned long now = millis();
        // Only send values at a maximum frequency or woken up from sleep
        if ((now - lastSend) > SEND_FREQUENCY) {
           Serial.print("dziala wysylanie temp");
          // Fetch temperatures from Dallas sensors
          sensors.requestTemperatures(); 
      
          // Read temperatures and send them to controller 
          for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
         
            // Fetch and round temperature to one decimal
            float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
         
            // Only send data if temperature has changed and no error
            if (lastTemperature[i] != temperature && temperature != -127.00) {
         
              // Send in the new temperature
              gw.send(msg3.setSensor(i).set(temperature,1));
              lastTemperature[i]=temperature;
            }
          }
        lastSend=now;
        }
      } 
       
      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 && message.sensor == 11) {
           // Change relay state
           state = message.getBool();
           digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
           // Store state in eeprom
           gw.saveState(CHILD_ID, state);
         }
        else if(message.type == V_LIGHT && message.sensor == 12){  
          
           state2 = message.getBool();
           digitalWrite(RELAY_PIN_2, state2?RELAY_ON:RELAY_OFF);
           // Store state in eeprom
           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());
         } 
      }
      
      1 Reply Last reply
      0
      • K Offline
        K Offline
        kanchana
        wrote on last edited by
        #3

        I have the same problem even with the one button . I can't control the light from Vera unless I have push the button after the restart . Also I noticed when i use the button to switch the light on and off from the button in Vera i can't see the status being updated . Any one experiencing the same problem ?

        1 Reply Last reply
        0
        • B Offline
          B Offline
          BulldogLowell
          Contest Winner
          wrote on last edited by
          #4

          it is hard to read your code.

          edit it putting it between three back ticks (```)

          usually to the left of the 1 key on a USA keyboard

          1 Reply Last reply
          0
          • K Offline
            K Offline
            kunall
            wrote on last edited by
            #5

            I second that. I have exactly the same issue. I have to physically toggle the switch before operating it from OpenHab.

            1 Reply Last reply
            0
            • K Offline
              K Offline
              kimnguu204
              wrote on last edited by
              #6

              Hello All,

              i got the same problem, node can send information to gateway but can't receive command from controller.
              do you know how to test communication between Gateway and Nodes?
              I used Serial Gateway, i connected to gateway COM port and send command like 10;2;1;0;1;1;1\n to turn on relay but my node can't turn relay on.
              When i press the button from NODE, it sent the update status to gateway,

              1 Reply Last reply
              0
              • Ivan ZI Offline
                Ivan ZI Offline
                Ivan Z
                Hardware Contributor
                wrote on last edited by
                #7

                Gateway not see ACK flag. Please fix this bag
                Lib version 1.5, Node & gate = 1.5

                RelayButton log

                send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:0
                Button value:0
                Button value:1
                send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:1
                Button value:0
                Button value:1
                send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:0
                Button value:0
                Button value:1
                send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:1
                Button value:0
                Button value:1
                send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:0
                Button value:0
                Button value:1
                send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:1
                

                Gateway log

                2015-08-04 18:52:07 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:0
                2015-08-04 18:52:07 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:1
                2015-08-04 18:52:07 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:0
                2015-08-04 18:52:07 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:1
                2015-08-04 18:52:08 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:0
                2015-08-04 18:52:08 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:1
                2015-08-04 18:52:08 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:0
                
                1 Reply Last reply
                0
                • H Offline
                  H Offline
                  hek
                  Admin
                  wrote on last edited by
                  #8

                  That's not a gateway log...

                  1 Reply Last reply
                  0
                  • Ivan ZI Offline
                    Ivan ZI Offline
                    Ivan Z
                    Hardware Contributor
                    wrote on last edited by
                    #9

                    Sory. Bad NRF transmitter

                    1 Reply Last reply
                    0

                    Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                    Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                    With your input, this post could be even better 💗

                    Register Login
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    11

                    Online

                    12.0k

                    Users

                    11.2k

                    Topics

                    113.4k

                    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