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));
}
}