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 8.0k 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.
  • B Offline
    B Offline
    Ben Andrewes
    wrote on last edited by
    #12

    I'm having trouble getting Domoticz to see any more than 1 relay. I've tried the MySensors example basic relay sketch and no luck. Then I tried this one (which is amazing btw as I want to have a PIR independent of the relays) and the same problem.

    I've tried to present the sensors individually without the FOR statement, and added a delay between presentation in case that was an issue, also I've tried different output pins on the Arduino, and I've tried multiple boards... Nothing has worked

    I am very much an enthusiastic amateur, so any advice on what to try next much appreciated

    Thanks in advance

    ? 1 Reply Last reply
    0
    • B Ben Andrewes

      I'm having trouble getting Domoticz to see any more than 1 relay. I've tried the MySensors example basic relay sketch and no luck. Then I tried this one (which is amazing btw as I want to have a PIR independent of the relays) and the same problem.

      I've tried to present the sensors individually without the FOR statement, and added a delay between presentation in case that was an issue, also I've tried different output pins on the Arduino, and I've tried multiple boards... Nothing has worked

      I am very much an enthusiastic amateur, so any advice on what to try next much appreciated

      Thanks in advance

      ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #13

      @Ben-Andrewes My domoticz instance behaves weirdly with relay sketches too. Maybe you can find some help here: https://forum.mysensors.org/topic/7101/domoticz-relay-node-doesn-t-show-up-in-devices/21

      B 1 Reply Last reply
      0
      • ? A Former User

        @Ben-Andrewes My domoticz instance behaves weirdly with relay sketches too. Maybe you can find some help here: https://forum.mysensors.org/topic/7101/domoticz-relay-node-doesn-t-show-up-in-devices/21

        B Offline
        B Offline
        Ben Andrewes
        wrote on last edited by Ben Andrewes
        #14

        @thierryd Thanks for the reply. In case it helps anyone I ended up individually defining and presenting the relays and their parameters within the sketch rather than using the FOR statement and it worked fine.

        1 Reply Last reply
        0
        • 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
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            20

                            Online

                            11.7k

                            Users

                            11.2k

                            Topics

                            113.1k

                            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