Issue with Relay + Scene selector sketch
-
Hey all ,
Im having a strange issue, i combined the relay and scene sector sketch and everything works well the buttons trigger and the scene and i can control the relay. The only problem is that when i control the relay ( In home Assistant ) it also activates the scene
I have attached my sketch and home assistant automation
Any help would be greatly appreciatedSketch
// Override Setting for Manual Node ID to 2 #define MY_NODE_ID 15 // Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 // Enable repeater functionality for this node #define MY_REPEATER_FEATURE #include <SPI.h> #include <MySensors.h> #include <Keypad.h> #define RELAY_1 3 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 2 // Total number of attached relays: 4 // Opto Relay Module I was using Active Low - Low (0):ON, High (1): OFF #define RELAY_ON 0 // GPIO value to write to turn on attached relay #define RELAY_OFF 1 // GPIO value to write to turn off attached relay #define SN "Scene Controller" #define SV "2.0" #define KEYPAD_CHILD_ID 95 bool initialValueSent = false; //Init MyMessage for Each Child ID MyMessage msg1(1, V_LIGHT); MyMessage msg2(2, V_LIGHT); MyMessage scene(KEYPAD_CHILD_ID, V_SCENE_ON); //scene ON MyMessage scene2(KEYPAD_CHILD_ID, V_SCENE_OFF); //scene OFF const byte ROWS = 4; //four rows const byte COLS = 1; //one column char keys[ROWS][COLS] = { {'1'}, {'2'}, {'3'}, {'4'} }; byte rowPins[ROWS] = {A3, A4, A1, A2}; //connect to the row pinouts of the keypad byte colPins[COLS] = {A5}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); byte lastState; void before() { for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } } void setup() { } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Relay", "1.0"); for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_LIGHT); present(KEYPAD_CHILD_ID, S_SCENE_CONTROLLER); keypad.addEventListener(keypadEvent); } } void loop() { if (!initialValueSent) { Serial.println("Sending initial value"); send(msg1.set(loadState(1)?RELAY_OFF:RELAY_ON),true); wait(1000); send(msg2.set(loadState(2)?RELAY_OFF:RELAY_ON),true); wait(1000); Serial.println("Sending initial value: Completed"); wait(5000); } { char key = keypad.getKey(); } } void receive(const MyMessage &message) { Serial.println("=============== Receive Start ======================="); if (message.isAck()) { Serial.println(">>>>> ACK <<<<<"); Serial.println("This is an ack from gateway"); Serial.println("<<<<<< ACK >>>>>>"); } // We only expect one type of message from controller. But we better check anyway. if (message.type==V_LIGHT) { Serial.println(">>>>> V_LIGHT <<<<<"); if (!initialValueSent) { Serial.println("Receiving initial value from controller"); initialValueSent = true; } // Update relay state to HA digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF); switch (message.sensor) { case 1: Serial.print("Incoming change for sensor 1"); send(msg1.set(message.getBool()?RELAY_OFF:RELAY_ON)); break; case 2: Serial.print("Incoming change for sensor 2"); send(msg2.set(message.getBool()?RELAY_OFF:RELAY_ON)); break; default: Serial.println("Default Case: Receiving Other Sensor Child ID"); break; } // Store state in Arduino eeprom saveState(message.sensor, message.getBool()); Serial.print("Saved State for sensor: "); Serial.print( message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); Serial.println("<<<<<< V_LIGHT >>>>>>"); } Serial.println("=============== Receive END ======================="); } void keypadEvent(KeypadEvent key) { switch (keypad.getState()) { case PRESSED: lastState = 1; break; case HOLD: lastState = 2; break; case RELEASED: int keyInt = key - '0'; //Quick way to convert Char to Int so it can be sent to controller if (lastState == 2) { //keyInt = keyInt + 4; //If button is held, add 4. If using more than 4 buttons this number will need to be changed send(scene2.set(keyInt)); } else { send(scene.set(keyInt)); } //break; } }``` Home Assistant
automation:
-
alias: "scene selector"
trigger:- platform: state
entity_id: sensor.relay_15_95
to: '1'
action: - service: light.turn_off
data:
entity_id: light.cams_room_tv
- platform: state
-
alias: "scence selector2"
trigger:- platform: state
entity_id: sensor.relay_15_95_2
to: '1'
action: - service: light.turn_on
data:
entity_id: light.cams_room_tv
- platform: state
-