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. Development
  3. Multiple Relays + Motion sketch, fully customizable, optional timer, manual override

Multiple Relays + Motion sketch, fully customizable, optional timer, manual override

Scheduled Pinned Locked Moved Development
24 Posts 11 Posters 9.5k Views 13 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.
  • gohanG Offline
    gohanG Offline
    gohan
    Mod
    wrote on last edited by
    #15

    Did you try to add a small delay in the presentation?

    1 Reply Last reply
    0
    • B Offline
      B Offline
      Ben Andrewes
      wrote on last edited by
      #16

      @gohan - yep added wait(100) between each sensor. To be honest I made a number of small changes without re-uploading and testing between so I'm not sure what solved it... Oh well, at least it works now :)

      1 Reply Last reply
      0
      • O Offline
        O Offline
        Ostoja
        wrote on last edited by
        #17

        Hello! Sorry for my english. This sketch works fine. But I still need to add a temperature sensor ds18b20. If I add a temperature sensor, the sketch stops working. Please help. I'm new to both Arduino and Mysensors. Many thanks!!!

        rejoe2R 1 Reply Last reply
        0
        • O Ostoja

          Hello! Sorry for my english. This sketch works fine. But I still need to add a temperature sensor ds18b20. If I add a temperature sensor, the sketch stops working. Please help. I'm new to both Arduino and Mysensors. Many thanks!!!

          rejoe2R Offline
          rejoe2R Offline
          rejoe2
          wrote on last edited by
          #18

          @ostoja Please add your code. Most likely you just transfered the DS18x20-Code into the relay sketch including the sleep() at the end of the loop().
          If you did it that way: This had been discussed here several times, you have to change the code into a so-called non-bocking loop().

          Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

          O 1 Reply Last reply
          1
          • rejoe2R rejoe2

            @ostoja Please add your code. Most likely you just transfered the DS18x20-Code into the relay sketch including the sleep() at the end of the loop().
            If you did it that way: This had been discussed here several times, you have to change the code into a so-called non-bocking loop().

            O Offline
            O Offline
            Ostoja
            wrote on last edited by Ostoja
            #19

            @rejoe2, MANY thanks for answer! Relay don't work in Domoticz :white_frowning_face:

            // Enable and uncomment attached radio type
            #define MY_RADIO_NRF24
            //#define MY_TRANSPORT_WAIT_READY_MS 1      // uncomment this to enter the loop() and setup()-function even when the node cannot be registered to gw
            
            //----------------------- Relay and Motion Sensor Configuration -----------------------
            #define MOTION                                                    // un-comment to enable motion sensing
            #define NUMBER_OF_RELAYS  1                                       // Total number of attached relays. Must be equal to total number of elements in array below!
            const int RELAYS[]                  =     {4};                    // digital pins of attached relays
            const int MOTION_ACTIVATED_RELAYS[] =     {1,  0};                // 1 to trigger the relay through motion, 0 to not trigger. Array length must correspond to RELAYS[] array.
            const long ON_TIMES[]               =     {300, 0};               // Specify for each element in MOTION_ACTIVATED_RELAYS, how long the specified relay should be active in seconds.
            #define RELAY_ON          1                                       // GPIO value to write to turn on attached relay
            #define RELAY_OFF         0                                       // GPIO value to write to turn off attached relay
            #define MOTION_PIN        3                                       // The digital input pin of the motion sensor
            #define MOTION_CHILD_ID   10                                      // Set the child id of the motion sensor
            bool ack = 1;                                                     // set this to 1 if you want destination node to send ack back to this node
            
            //----------------------- DO NOT CHANGE -----------------------------
            #include <MySensors.h>
            MyMessage motion_msg(MOTION_CHILD_ID, V_TRIPPED);                 // Initialize motion message
            unsigned long trigger_millis[NUMBER_OF_RELAYS];                   // Used for the timer
            bool lastTripped = 0;                                             // Used to store last motion sensor value
            bool manual_override = 1;                                         // if this gets set to 1 (e.g. by a switch or a command from the gateway), motion triggering of relays is deactivated
            MyMessage relay_msg;                                              // Initialize relay message
            
            
            #include <DallasTemperature.h>
            #include <OneWire.h>
            
            #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
            
            #define ONE_WIRE_BUS 2 // Pin where dallase sensor is connected 
            #define MAX_ATTACHED_DS18B20 16
            unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
            OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
            DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
            float lastTemperature[MAX_ATTACHED_DS18B20];
            int numSensors=0;
            bool receivedConfig = false;
            bool metric = true;
            // Initialize temperature message
            MyMessage msg(0,V_TEMP);
            
            void before()
            
              
            
            {
              // Startup up the OneWire library
              sensors.begin();
              int i;
              for (int sensor = 1, i = 0; sensor <= NUMBER_OF_RELAYS; sensor++, i++) {
                // set relay pins to output mode
                pinMode(RELAYS[i], OUTPUT);
                // Restore relay to last known state (using eeprom storage)
                digitalWrite(RELAYS[i], loadState(sensor) ? RELAY_ON : RELAY_OFF);
              }
              // set motion pin to output mode, if MOTION is defined
            #ifdef MOTION
              pinMode(MOTION_PIN, INPUT);
            #endif
            }
            
            void setup()
            {
              // requestTemperatures() will not block current thread
              sensors.setWaitForConversion(false);
            #ifdef MOTION
              // give the motion sensor some time to settle
              Serial.println("Starting up. Please wait 8 seconds...");
              delay(8000);
            #endif
            }
            
            void presentation()
            {
              // Send the sketch version information to the gateway and Controller
              sendSketchInfo("Relay/Motion", "1.0");
            
              // 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++) {   
                 present(i, S_TEMP);
              }
            
              // Register all sensors to gw (they will be created as child devices)
              for (int sensor = 1; sensor <= NUMBER_OF_RELAYS; sensor++) {
                present(sensor, S_BINARY, "Relay", ack);
              }
            #ifdef MOTION
              present(MOTION_CHILD_ID, S_MOTION, "Motion Sensor", ack);
            #endif
            
            }
            
            void loop()
            {
            
              // Fetch temperatures from Dallas sensors
              sensors.requestTemperatures();
            
              // query conversion time and sleep until conversion completed
              int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
              // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
              sleep(conversionTime);
            
              // 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>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
             
                // Only send data if temperature has changed and no error
                #if COMPARE_TEMP == 1
                if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
                #else
                if (temperature != -127.00 && temperature != 85.00) {
                #endif
             
                  // Send in the new temperature
                  send(msg.setSensor(i).set(temperature,1));
                  // Save new temperatures for next compare
                  lastTemperature[i]=temperature;
                }
              }
              sleep(SLEEP_TIME);
            #ifdef MOTION
              if (!manual_override) {
                // Read digital motion value
                bool tripped = digitalRead(MOTION_PIN) == HIGH;
            
                if (lastTripped != tripped) {
                  Serial.print("New Motion State: ");
                  Serial.println(tripped);
                  // Send tripped value to gw
                  send(motion_msg.set(tripped ? "1" : "0"));
                  lastTripped = tripped;
            
                  // Change relay states, send new state to gw and store state in eeprom
                  if (tripped == 1) {
                    for (int i = 0; i < NUMBER_OF_RELAYS; i++) {
                      if (MOTION_ACTIVATED_RELAYS[i] == 1) {
                        digitalWrite(RELAYS[i], RELAY_ON);
                        relay_msg_constructor(i + 1, V_STATUS);
                        send(relay_msg.set(RELAY_ON));
                        trigger_millis[i] = millis();
                        Serial.print("Relay ");
                        Serial.print(RELAYS[i]);
                        Serial.println(" turned on");
                        saveState(i, 1);
                      }
                    }
                  }
                }
            
                for (int i = 0; i < NUMBER_OF_RELAYS; i++) {
                  if (tripped == 1 and MOTION_ACTIVATED_RELAYS[i] == 1 and trigger_millis[i] != 0) {
                    trigger_millis[i] = millis();
                  }
                  if ((trigger_millis[i] + ON_TIMES[i] * 1000 < millis()) and MOTION_ACTIVATED_RELAYS[i] == 1 and trigger_millis[i] != 0) {
                    digitalWrite(RELAYS[i], RELAY_OFF);
                    relay_msg_constructor(i + 1, V_STATUS);
                    send(relay_msg.set(RELAY_OFF));
                    Serial.print("Relay ");
                    Serial.print(RELAYS[i]);
                    Serial.println(" turned off");
                    saveState(i, 0);
                    trigger_millis[i] = 0;
                  }
                }
              }
              else {
                bool tripped = digitalRead(MOTION_PIN) == HIGH;
                if (lastTripped != tripped) {
                  Serial.print("New Motion State: ");
                  Serial.println(tripped);
                  // Send tripped value to gw
                  send(motion_msg.set(tripped ? "1" : "0"));
                  lastTripped = tripped;
                }
                for (int i = 0; i < NUMBER_OF_RELAYS; i++) {
                  if (MOTION_ACTIVATED_RELAYS[i] == 1 and trigger_millis[i] != 0) {
                    trigger_millis[i] = 0;                            // reset running timers
                  }
                }
              }
            #endif
            }
            
            void receive(const MyMessage &message)
            {
              // Handle incoming relay commands
              if (message.type == V_STATUS) {
                // Change relay state
                if (RELAYS[message.sensor - 1]) {
                  digitalWrite(RELAYS[message.sensor - 1], message.getBool() ? RELAY_ON : RELAY_OFF);
            
                  // Store state in eeprom
                  saveState(message.sensor - 1, message.getBool());
                  // Write some debug info
                  Serial.print("Incoming change for sensor:");
                  Serial.print(message.sensor);
                  Serial.print(", New status: ");
                  Serial.println(message.getBool());
                }
              }
            
              // Handle incoming manual override/bypass of motion sensor
              if (message.type == V_ARMED and message.sensor == 0) {
                manual_override = message.getBool();
                Serial.print("Manual Override: ");
                Serial.println(manual_override);
              }
            }
            
            void relay_msg_constructor(int sensor, uint8_t type)
            {
              relay_msg.setSensor(sensor);
              relay_msg.setType(type);
            }
            
            dirkcD 1 Reply Last reply
            0
            • O Offline
              O Offline
              Ostoja
              wrote on last edited by
              #20

              I commented out the "sleep", but when I press the relay switch in Domoticz, it does not work:white_frowning_face:

              dirkcD 1 Reply Last reply
              0
              • O Ostoja

                @rejoe2, MANY thanks for answer! Relay don't work in Domoticz :white_frowning_face:

                // Enable and uncomment attached radio type
                #define MY_RADIO_NRF24
                //#define MY_TRANSPORT_WAIT_READY_MS 1      // uncomment this to enter the loop() and setup()-function even when the node cannot be registered to gw
                
                //----------------------- Relay and Motion Sensor Configuration -----------------------
                #define MOTION                                                    // un-comment to enable motion sensing
                #define NUMBER_OF_RELAYS  1                                       // Total number of attached relays. Must be equal to total number of elements in array below!
                const int RELAYS[]                  =     {4};                    // digital pins of attached relays
                const int MOTION_ACTIVATED_RELAYS[] =     {1,  0};                // 1 to trigger the relay through motion, 0 to not trigger. Array length must correspond to RELAYS[] array.
                const long ON_TIMES[]               =     {300, 0};               // Specify for each element in MOTION_ACTIVATED_RELAYS, how long the specified relay should be active in seconds.
                #define RELAY_ON          1                                       // GPIO value to write to turn on attached relay
                #define RELAY_OFF         0                                       // GPIO value to write to turn off attached relay
                #define MOTION_PIN        3                                       // The digital input pin of the motion sensor
                #define MOTION_CHILD_ID   10                                      // Set the child id of the motion sensor
                bool ack = 1;                                                     // set this to 1 if you want destination node to send ack back to this node
                
                //----------------------- DO NOT CHANGE -----------------------------
                #include <MySensors.h>
                MyMessage motion_msg(MOTION_CHILD_ID, V_TRIPPED);                 // Initialize motion message
                unsigned long trigger_millis[NUMBER_OF_RELAYS];                   // Used for the timer
                bool lastTripped = 0;                                             // Used to store last motion sensor value
                bool manual_override = 1;                                         // if this gets set to 1 (e.g. by a switch or a command from the gateway), motion triggering of relays is deactivated
                MyMessage relay_msg;                                              // Initialize relay message
                
                
                #include <DallasTemperature.h>
                #include <OneWire.h>
                
                #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
                
                #define ONE_WIRE_BUS 2 // Pin where dallase sensor is connected 
                #define MAX_ATTACHED_DS18B20 16
                unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
                OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
                DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
                float lastTemperature[MAX_ATTACHED_DS18B20];
                int numSensors=0;
                bool receivedConfig = false;
                bool metric = true;
                // Initialize temperature message
                MyMessage msg(0,V_TEMP);
                
                void before()
                
                  
                
                {
                  // Startup up the OneWire library
                  sensors.begin();
                  int i;
                  for (int sensor = 1, i = 0; sensor <= NUMBER_OF_RELAYS; sensor++, i++) {
                    // set relay pins to output mode
                    pinMode(RELAYS[i], OUTPUT);
                    // Restore relay to last known state (using eeprom storage)
                    digitalWrite(RELAYS[i], loadState(sensor) ? RELAY_ON : RELAY_OFF);
                  }
                  // set motion pin to output mode, if MOTION is defined
                #ifdef MOTION
                  pinMode(MOTION_PIN, INPUT);
                #endif
                }
                
                void setup()
                {
                  // requestTemperatures() will not block current thread
                  sensors.setWaitForConversion(false);
                #ifdef MOTION
                  // give the motion sensor some time to settle
                  Serial.println("Starting up. Please wait 8 seconds...");
                  delay(8000);
                #endif
                }
                
                void presentation()
                {
                  // Send the sketch version information to the gateway and Controller
                  sendSketchInfo("Relay/Motion", "1.0");
                
                  // 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++) {   
                     present(i, S_TEMP);
                  }
                
                  // Register all sensors to gw (they will be created as child devices)
                  for (int sensor = 1; sensor <= NUMBER_OF_RELAYS; sensor++) {
                    present(sensor, S_BINARY, "Relay", ack);
                  }
                #ifdef MOTION
                  present(MOTION_CHILD_ID, S_MOTION, "Motion Sensor", ack);
                #endif
                
                }
                
                void loop()
                {
                
                  // Fetch temperatures from Dallas sensors
                  sensors.requestTemperatures();
                
                  // query conversion time and sleep until conversion completed
                  int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
                  // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
                  sleep(conversionTime);
                
                  // 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>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
                 
                    // Only send data if temperature has changed and no error
                    #if COMPARE_TEMP == 1
                    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
                    #else
                    if (temperature != -127.00 && temperature != 85.00) {
                    #endif
                 
                      // Send in the new temperature
                      send(msg.setSensor(i).set(temperature,1));
                      // Save new temperatures for next compare
                      lastTemperature[i]=temperature;
                    }
                  }
                  sleep(SLEEP_TIME);
                #ifdef MOTION
                  if (!manual_override) {
                    // Read digital motion value
                    bool tripped = digitalRead(MOTION_PIN) == HIGH;
                
                    if (lastTripped != tripped) {
                      Serial.print("New Motion State: ");
                      Serial.println(tripped);
                      // Send tripped value to gw
                      send(motion_msg.set(tripped ? "1" : "0"));
                      lastTripped = tripped;
                
                      // Change relay states, send new state to gw and store state in eeprom
                      if (tripped == 1) {
                        for (int i = 0; i < NUMBER_OF_RELAYS; i++) {
                          if (MOTION_ACTIVATED_RELAYS[i] == 1) {
                            digitalWrite(RELAYS[i], RELAY_ON);
                            relay_msg_constructor(i + 1, V_STATUS);
                            send(relay_msg.set(RELAY_ON));
                            trigger_millis[i] = millis();
                            Serial.print("Relay ");
                            Serial.print(RELAYS[i]);
                            Serial.println(" turned on");
                            saveState(i, 1);
                          }
                        }
                      }
                    }
                
                    for (int i = 0; i < NUMBER_OF_RELAYS; i++) {
                      if (tripped == 1 and MOTION_ACTIVATED_RELAYS[i] == 1 and trigger_millis[i] != 0) {
                        trigger_millis[i] = millis();
                      }
                      if ((trigger_millis[i] + ON_TIMES[i] * 1000 < millis()) and MOTION_ACTIVATED_RELAYS[i] == 1 and trigger_millis[i] != 0) {
                        digitalWrite(RELAYS[i], RELAY_OFF);
                        relay_msg_constructor(i + 1, V_STATUS);
                        send(relay_msg.set(RELAY_OFF));
                        Serial.print("Relay ");
                        Serial.print(RELAYS[i]);
                        Serial.println(" turned off");
                        saveState(i, 0);
                        trigger_millis[i] = 0;
                      }
                    }
                  }
                  else {
                    bool tripped = digitalRead(MOTION_PIN) == HIGH;
                    if (lastTripped != tripped) {
                      Serial.print("New Motion State: ");
                      Serial.println(tripped);
                      // Send tripped value to gw
                      send(motion_msg.set(tripped ? "1" : "0"));
                      lastTripped = tripped;
                    }
                    for (int i = 0; i < NUMBER_OF_RELAYS; i++) {
                      if (MOTION_ACTIVATED_RELAYS[i] == 1 and trigger_millis[i] != 0) {
                        trigger_millis[i] = 0;                            // reset running timers
                      }
                    }
                  }
                #endif
                }
                
                void receive(const MyMessage &message)
                {
                  // Handle incoming relay commands
                  if (message.type == V_STATUS) {
                    // Change relay state
                    if (RELAYS[message.sensor - 1]) {
                      digitalWrite(RELAYS[message.sensor - 1], message.getBool() ? RELAY_ON : RELAY_OFF);
                
                      // Store state in eeprom
                      saveState(message.sensor - 1, message.getBool());
                      // Write some debug info
                      Serial.print("Incoming change for sensor:");
                      Serial.print(message.sensor);
                      Serial.print(", New status: ");
                      Serial.println(message.getBool());
                    }
                  }
                
                  // Handle incoming manual override/bypass of motion sensor
                  if (message.type == V_ARMED and message.sensor == 0) {
                    manual_override = message.getBool();
                    Serial.print("Manual Override: ");
                    Serial.println(manual_override);
                  }
                }
                
                void relay_msg_constructor(int sensor, uint8_t type)
                {
                  relay_msg.setSensor(sensor);
                  relay_msg.setType(type);
                }
                
                dirkcD Offline
                dirkcD Offline
                dirkc
                wrote on last edited by dirkc
                #21

                @ostoja said in Multiple Relays + Motion sketch, fully customizable, optional timer, manual override:

                // Present all sensors to controller
                  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                     present(i, S_TEMP);
                  }
                
                  // Register all sensors to gw (they will be created as child devices)
                  for (int sensor = 1; sensor <= NUMBER_OF_RELAYS; sensor++) {
                    present(sensor, S_BINARY, "Relay", ack);
                  }
                

                With this two "for" loops you set present(n) multiple times. in the first for() you start with 0 until MAX_ATTACHED_DS18B20-1, in the second for() you start with 1 until NUMBER_OF_RELAYS-1, so this will assign the sensors with identical IDs as the relays.
                I have not checked the internal code of this method, but I would think that you should better user a different range in the second for() loop starting at least with MAX_ATTACHED_DS18B20+1.

                Controller: Home Assistant & FHEM - Gateway: ESP8266wifi - MySensors: 2.3.2 (nRF24)

                1 Reply Last reply
                0
                • rejoe2R Offline
                  rejoe2R Offline
                  rejoe2
                  wrote on last edited by rejoe2
                  #22

                  @dirkc said in Multiple Relays + Motion sketch, fully customizable, optional timer, manual override:

                  @ostoja said in Multiple Relays + Motion sketch, fully customizable, optional timer, manual override:

                  // Present all sensors to controller
                    for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                       present(i, S_TEMP);
                    }
                  
                    // Register all sensors to gw (they will be created as child devices)
                    for (int sensor = 1; sensor <= NUMBER_OF_RELAYS; sensor++) {
                      present(sensor, S_BINARY, "Relay", ack);
                    }
                  

                  With this two "for" loops you set present(n) multiple times. in the first for() you start with 0 until MAX_ATTACHED_DS18B20-1, in the second for() you start with 1 until NUMBER_OF_RELAYS-1
                  I have not checked the internal code of this method, but I would think that you should better user a different range in the second for() loop starting at least with MAX_ATTACHED_DS18B20+1.

                  Additional remarks:
                  For the relays better start with 1.
                  Shift the Temp values to higer range (use e.g. a variable like FRIST_DS_SENSOR_ID).
                  Check, if the receive()-part and the ID you get really fits together with the relay you want to switch.
                  Don't try to read the temperature values every few parts of a second. Use a millis()-routine.

                  Please search the forum, there have to be at least 2 threads with exactly the same problems in which I posted how to solve this. You are "trying to reinvent the wheel". :grin:

                  Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

                  1 Reply Last reply
                  0
                  • O Ostoja

                    I commented out the "sleep", but when I press the relay switch in Domoticz, it does not work:white_frowning_face:

                    dirkcD Offline
                    dirkcD Offline
                    dirkc
                    wrote on last edited by
                    #23

                    @ostoja look at this video with an explanation of this topic and how to handle the IDs
                    https://forum.mysensors.org/post/26597

                    Controller: Home Assistant & FHEM - Gateway: ESP8266wifi - MySensors: 2.3.2 (nRF24)

                    1 Reply Last reply
                    0
                    • B Offline
                      B Offline
                      bereska
                      wrote on last edited by
                      #24

                      @HenryWhite thank you for the excellent sketch. It works like a charm in my HA configuration!

                      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


                      80

                      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