2x Relay, 1x Reed Switch on 1 node for Home Assistant



  • Hey!
    N00b ahead warning!

    I had a lot of trouble trying to get 2 relays and a reed switch working on one node in Home Assistant, but after hours of trying i finally got some code that works

    It's very messy and is a big mash of sample code and other projects code but it works.

    Would be nice if it would remember the state after a power off but that is way beyond me

    If anyone ends up using this and cleans it up feel free to post it back here 😛

    Thanks!

    /*
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * http://www.mysensors.org/build/relay
     */
    
    #define MY_DEBUG
    #define MY_RADIO_NRF24
    #define MY_REPEATER_FEATURE
    #define MY_NODE_ID 43
    #include <SPI.h>
    #include <MySensors.h>
    #include <Bounce2.h>
    
    #define RELAY_PIN1  3
    #define RELAY_PIN2  4
    #define BUTTON_PIN1  6 
    #define CHILD_ID1 1
    #define CHILD_ID2 2
    #define CHILD_ID3 3
    #define RELAY_ON 1
    #define RELAY_OFF 0
     
    
    Bounce debouncer = Bounce();
    bool state = false;
    bool state2 = false;
    bool initialValueSent = false;
    int oldValue=-1;
    
    MyMessage msg(CHILD_ID1, V_STATUS);
    MyMessage msg2(CHILD_ID2, V_STATUS);
    MyMessage msg3(CHILD_ID3,V_TRIPPED);
    
    void setup()
    {
    
      // Make sure relays are off when starting up
      digitalWrite(RELAY_PIN1, RELAY_OFF);
      digitalWrite(RELAY_PIN2, RELAY_OFF);
      pinMode(RELAY_PIN1, OUTPUT);
      pinMode(RELAY_PIN2, OUTPUT);
      pinMode(BUTTON_PIN1,INPUT);
      
      // Activate internal pull-up
      digitalWrite(BUTTON_PIN1,HIGH);
    
      // After setting up the button, setup debouncer
      debouncer.attach(BUTTON_PIN1);
      debouncer.interval(5);
    }
    
    void presentation()  {
      sendSketchInfo("Relay+Reed", "1.0");
      wait(100);
      present(CHILD_ID1, S_BINARY);
      wait(100);
      present(CHILD_ID2, S_BINARY);
      wait(100);
      present(CHILD_ID3, S_DOOR); 
    }
    
    void loop()
    {
      if (!initialValueSent) {
        Serial.println("Sending initial value");
        send(msg.set(state?RELAY_ON:RELAY_OFF));
        send(msg2.set(state2?RELAY_ON:RELAY_OFF));
        Serial.println("Requesting initial value from controller");
        request(CHILD_ID1, V_STATUS);
        wait(2000, C_SET, V_STATUS);
        request(CHILD_ID2, V_STATUS);
        wait(2000, C_SET, V_STATUS);
      }
      if (debouncer.update()) {
        if (debouncer.read()==LOW) {
          state = !state;
      //    // Send new state and request ack back
       //   send(msg.set(state?RELAY_ON:RELAY_OFF), true);
        }
        {
      debouncer.update();
      // Get the update value
      int value = debouncer.read();
    
      if (value != oldValue) {
         // Send in the new value
         send(msg3.set(value==HIGH ? 1 : 0));
         oldValue = value;
      }
      }
    }
    
    }
    
    void receive(const MyMessage &message) {
      if (message.isAck()) {
         Serial.println("This is an ack from gateway");
      }
    
      if (message.type == V_STATUS && message.sensor ==1) {
        if (!initialValueSent) {
          Serial.println("Receiving initial value from controller");
          initialValueSent = true;
        }
        // Change relay state
        state = (bool)message.getInt();
        digitalWrite(RELAY_PIN1, state?RELAY_OFF:RELAY_ON);
        send(msg.set(state?RELAY_ON:RELAY_OFF));
      }
       
      if (message.type == V_STATUS && message.sensor ==2) {
        if (!initialValueSent) {
          Serial.println("Receiving initial value from controller");
          initialValueSent = true;
        }
        // Change relay state
        state2 = (bool)message.getInt();
        digitalWrite(RELAY_PIN2, state2?RELAY_OFF:RELAY_ON);
        send(msg2.set(state2?RELAY_ON:RELAY_OFF));
      }
    }
    

  • Hardware Contributor

    @Cameron-Payne
    Hello and welcome!
    Great to hear your success 🙂
    About saving the state you shoud look at this 😉 https://www.mysensors.org/download/sensor_api_20#saving-state And there are more infos about the API.
    Shortly save your state when it change, and load it in your setup.


 

365
Online

8.0k
Users

8.8k
Topics

94.4k
Posts