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. Troubleshooting
  3. Combining relay and temperature sketch

Combining relay and temperature sketch

Scheduled Pinned Locked Moved Troubleshooting
76 Posts 9 Posters 14.2k Views 12 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 bluezr1

    @rejoe2 I hope that this answers your question. I use Vera as my home controller and tried multiple times turning (sometimes randomly) on and off both relays without any misses as soon as Vera allowed me. Meaning, Vera won’t let you instantly turn a device on and then off or vise versa.

    Do you think I’ll be ok the way it is or should I keep working on this project?

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

    @bluezr1 As it seems to work to your satisfaction, you may leave it as is.
    FHEM as a controller allows direct interaction with switching devices, and it is really astonishing to hear Vera may have some restrictions wrt. that.

    But I didn't test your code in my setup, this is why I asked about your observations.

    I may be wrong, but imo, the code isn't yet perfect, so you might keep that in mind for the future in case you run into trouble. In case you need some sort of timer for other projects, you would miss the opportunity to learn how to use this...

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

    B 1 Reply Last reply
    1
    • rejoe2R rejoe2

      @bluezr1 As it seems to work to your satisfaction, you may leave it as is.
      FHEM as a controller allows direct interaction with switching devices, and it is really astonishing to hear Vera may have some restrictions wrt. that.

      But I didn't test your code in my setup, this is why I asked about your observations.

      I may be wrong, but imo, the code isn't yet perfect, so you might keep that in mind for the future in case you run into trouble. In case you need some sort of timer for other projects, you would miss the opportunity to learn how to use this...

      B Offline
      B Offline
      bluezr1
      wrote on last edited by bluezr1
      #59

      @rejoe2 It's working

      Although I'm not sure if this part makes sense?

      static const uint64_t UPDATE_INTERVAL = 60000;
      unsigned long interval = 60000;
      unsigned long previousMillis = 0;```
      
      /**
       * The MySensors Arduino library handles the wireless radio link and protocol
       * between your home built sensors/actuators and HA controller of choice.
       * The sensors forms a self healing radio network with optional repeaters. Each
       * repeater and gateway builds a routing tables in EEPROM which keeps track of the
       * network topology allowing messages to be routed to nodes.
       *
       * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
       * Copyright (C) 2013-2015 Sensnology AB
       * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
       *
       * Documentation: http://www.mysensors.org
       * Support Forum: http://forum.mysensors.org
       *
       * This program is free software; you can redistribute it and/or
       * modify it under the terms of the GNU General Public License
       * version 2 as published by the Free Software Foundation.
       *
       *******************************
       *
       * REVISION HISTORY
       * Version 1.0: Henrik EKblad
       * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
       * 
       * DESCRIPTION
       * This sketch provides an example of how to implement a humidity/temperature
       * sensor using a DHT11/DHT-22.
       *  
       * For more information, please visit:
       * http://www.mysensors.org/build/humidity
       * 
       */
      
      // Enable debug prints
      #define MY_DEBUG
      
      // Enable and select radio type attached 
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      //#define MY_RS485
      
      #define MY_NODE_ID 20
      #include <SPI.h>
      #include <MySensors.h>  
      #include <DHT.h>
      
      // Set this to the pin you connected the DHT's data pin to
      #define DHT_DATA_PIN 3
      
      // Set this offset if the sensor has a permanent small offset to the real temperatures
      #define SENSOR_TEMP_OFFSET 0
      
      // Sleep time between sensor updates (in milliseconds)
      // Must be >1000ms for DHT22 and >2000ms for DHT11
      static const uint64_t UPDATE_INTERVAL = 60000;
      unsigned long interval = 60000;
      unsigned long previousMillis = 0;
      
      // Force sending an update of the temperature after n sensor reads, so a controller showing the
      // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
      // the value didn't change since;
      // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
      static const uint8_t FORCE_UPDATE_N_READS = 10;
      
      #define CHILD_ID_HUM 10
      #define CHILD_ID_TEMP 11
      
      float lastTemp;
      float lastHum;
      uint8_t nNoUpdatesTemp;
      uint8_t nNoUpdatesHum;
      bool metric = true;
      
      MyMessage msgHum(CHILD_ID_HUM, V_HUM);
      MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
      DHT dht;
      
      #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
      #define NUMBER_OF_RELAYS 2 // Total number of attached relays
      #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
      
      
      void before()
      {
          for (int sensor=1, pin=RELAY_PIN; 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_OFF:RELAY_ON);
          }
      }
      
      void presentation()  
      { 
        // Send the sketch version information to the gateway
        sendSketchInfo("TempRELAY", "1.1");
      
        // Register all sensors to gw (they will be created as child devices)
        present(CHILD_ID_HUM, S_HUM);
        present(CHILD_ID_TEMP, S_TEMP);
      
        metric = getControllerConfig().isMetric;
      
        for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
              // Register all sensors to gw (they will be created as child devices)
              present(sensor, S_BINARY);
          }
      }
      
      
      void setup()
      {
        dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
        if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
          Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
        }
        // Sleep for the time of the minimum sampling period to give the sensor time to power up
        // (otherwise, timeout errors might occure for the first reading)
        // wait(dht.getMinimumSamplingPeriod());
      }
      
      
      void loop()      
      { 
       unsigned long currentMillis = millis();
       if ((unsigned long)(currentMillis - previousMillis) >= interval) { 
        // Force reading sensor, so it works also after sleep()
        dht.readSensor(true);
      
        // Get temperature from DHT library
        float temperature = dht.getTemperature();
        if (isnan(temperature)) {
          Serial.println("Failed reading temperature from DHT!");
        } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
          // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
          lastTemp = temperature;
          if (!metric) {
            temperature = dht.toFahrenheit(temperature);
          }
          // Reset no updates counter
          nNoUpdatesTemp = 0;
          temperature += SENSOR_TEMP_OFFSET;
          send(msgTemp.set(temperature, 1));
      
          #ifdef MY_DEBUG
          Serial.print("T: ");
          Serial.println(temperature);
          #endif
        } else {
          // Increase no update counter if the temperature stayed the same
          nNoUpdatesTemp++;
        }
      
        // Get humidity from DHT library
        float humidity = dht.getHumidity();
        if (isnan(humidity)) {
          Serial.println("Failed reading humidity from DHT");
        } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
          // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
          lastHum = humidity;
          // Reset no updates counter
          nNoUpdatesHum = 0;
          send(msgHum.set(humidity, 1));
      
          #ifdef MY_DEBUG
          Serial.print("H: ");
          Serial.println(humidity);
          #endif
        } else {
          // Increase no update counter if the humidity stayed the same
          nNoUpdatesTemp++;
        }
        previousMillis = millis();
       }
      }
      
      void receive(const MyMessage &message)
      {
          // We only expect one type of message from controller. But we better check anyway.
          if (message.type==V_STATUS) {
              // Change relay state
              digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_OFF:RELAY_ON);
              // Store state in eeprom
              saveState(message.sensor, message.getBool());
              // Write some debug info
              Serial.print("Incoming change for sensor:");
              Serial.print(message.sensor);
              Serial.print(", New status: ");
              Serial.println(message.getBool());
          }
      }
      
      rejoe2R 1 Reply Last reply
      1
      • B bluezr1

        @rejoe2 It's working

        Although I'm not sure if this part makes sense?

        static const uint64_t UPDATE_INTERVAL = 60000;
        unsigned long interval = 60000;
        unsigned long previousMillis = 0;```
        
        /**
         * The MySensors Arduino library handles the wireless radio link and protocol
         * between your home built sensors/actuators and HA controller of choice.
         * The sensors forms a self healing radio network with optional repeaters. Each
         * repeater and gateway builds a routing tables in EEPROM which keeps track of the
         * network topology allowing messages to be routed to nodes.
         *
         * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
         * Copyright (C) 2013-2015 Sensnology AB
         * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
         *
         * Documentation: http://www.mysensors.org
         * Support Forum: http://forum.mysensors.org
         *
         * This program is free software; you can redistribute it and/or
         * modify it under the terms of the GNU General Public License
         * version 2 as published by the Free Software Foundation.
         *
         *******************************
         *
         * REVISION HISTORY
         * Version 1.0: Henrik EKblad
         * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
         * 
         * DESCRIPTION
         * This sketch provides an example of how to implement a humidity/temperature
         * sensor using a DHT11/DHT-22.
         *  
         * For more information, please visit:
         * http://www.mysensors.org/build/humidity
         * 
         */
        
        // Enable debug prints
        #define MY_DEBUG
        
        // Enable and select radio type attached 
        #define MY_RADIO_NRF24
        //#define MY_RADIO_RFM69
        //#define MY_RS485
        
        #define MY_NODE_ID 20
        #include <SPI.h>
        #include <MySensors.h>  
        #include <DHT.h>
        
        // Set this to the pin you connected the DHT's data pin to
        #define DHT_DATA_PIN 3
        
        // Set this offset if the sensor has a permanent small offset to the real temperatures
        #define SENSOR_TEMP_OFFSET 0
        
        // Sleep time between sensor updates (in milliseconds)
        // Must be >1000ms for DHT22 and >2000ms for DHT11
        static const uint64_t UPDATE_INTERVAL = 60000;
        unsigned long interval = 60000;
        unsigned long previousMillis = 0;
        
        // Force sending an update of the temperature after n sensor reads, so a controller showing the
        // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
        // the value didn't change since;
        // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
        static const uint8_t FORCE_UPDATE_N_READS = 10;
        
        #define CHILD_ID_HUM 10
        #define CHILD_ID_TEMP 11
        
        float lastTemp;
        float lastHum;
        uint8_t nNoUpdatesTemp;
        uint8_t nNoUpdatesHum;
        bool metric = true;
        
        MyMessage msgHum(CHILD_ID_HUM, V_HUM);
        MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
        DHT dht;
        
        #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
        #define NUMBER_OF_RELAYS 2 // Total number of attached relays
        #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
        
        
        void before()
        {
            for (int sensor=1, pin=RELAY_PIN; 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_OFF:RELAY_ON);
            }
        }
        
        void presentation()  
        { 
          // Send the sketch version information to the gateway
          sendSketchInfo("TempRELAY", "1.1");
        
          // Register all sensors to gw (they will be created as child devices)
          present(CHILD_ID_HUM, S_HUM);
          present(CHILD_ID_TEMP, S_TEMP);
        
          metric = getControllerConfig().isMetric;
        
          for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                // Register all sensors to gw (they will be created as child devices)
                present(sensor, S_BINARY);
            }
        }
        
        
        void setup()
        {
          dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
          if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
            Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
          }
          // Sleep for the time of the minimum sampling period to give the sensor time to power up
          // (otherwise, timeout errors might occure for the first reading)
          // wait(dht.getMinimumSamplingPeriod());
        }
        
        
        void loop()      
        { 
         unsigned long currentMillis = millis();
         if ((unsigned long)(currentMillis - previousMillis) >= interval) { 
          // Force reading sensor, so it works also after sleep()
          dht.readSensor(true);
        
          // Get temperature from DHT library
          float temperature = dht.getTemperature();
          if (isnan(temperature)) {
            Serial.println("Failed reading temperature from DHT!");
          } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
            // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
            lastTemp = temperature;
            if (!metric) {
              temperature = dht.toFahrenheit(temperature);
            }
            // Reset no updates counter
            nNoUpdatesTemp = 0;
            temperature += SENSOR_TEMP_OFFSET;
            send(msgTemp.set(temperature, 1));
        
            #ifdef MY_DEBUG
            Serial.print("T: ");
            Serial.println(temperature);
            #endif
          } else {
            // Increase no update counter if the temperature stayed the same
            nNoUpdatesTemp++;
          }
        
          // Get humidity from DHT library
          float humidity = dht.getHumidity();
          if (isnan(humidity)) {
            Serial.println("Failed reading humidity from DHT");
          } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
            // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
            lastHum = humidity;
            // Reset no updates counter
            nNoUpdatesHum = 0;
            send(msgHum.set(humidity, 1));
        
            #ifdef MY_DEBUG
            Serial.print("H: ");
            Serial.println(humidity);
            #endif
          } else {
            // Increase no update counter if the humidity stayed the same
            nNoUpdatesTemp++;
          }
          previousMillis = millis();
         }
        }
        
        void receive(const MyMessage &message)
        {
            // We only expect one type of message from controller. But we better check anyway.
            if (message.type==V_STATUS) {
                // Change relay state
                digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_OFF:RELAY_ON);
                // Store state in eeprom
                saveState(message.sensor, message.getBool());
                // Write some debug info
                Serial.print("Incoming change for sensor:");
                Serial.print(message.sensor);
                Serial.print(", New status: ");
                Serial.println(message.getBool());
            }
        }
        
        rejoe2R Offline
        rejoe2R Offline
        rejoe2
        wrote on last edited by
        #60

        @bluezr1 Looks like you did a working non-blocking loop :grin:
        Didn't do a too close look to all things, but the only header definition that seems to be no longer necessary is the UPDATE_INTERVAL, as this variable isn't used any longer.

        But beside that small remark: :clap:

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

        1 Reply Last reply
        1
        • B Offline
          B Offline
          bluezr1
          wrote on last edited by bluezr1
          #61

          <<edit>>It was me, my bad, it's working.

          For some reason if I pull a wire for the relay it'll still show a change within Vera. I can turn them on and off and they'll show up as if they were turned on and off. Before if I pulled a wire to the relays vera wouldn't show any changes.

          Thank you so much rejoe2 for not just giving me the answers but by pushing me to do it myself. You pointed me to where I needed to be and I thank you for that.

          Now you got me wanting to learn even more. :)

          rejoe2R 1 Reply Last reply
          0
          • B Offline
            B Offline
            bluezr1
            wrote on last edited by
            #62

            Wanted to post it incase someone else wants to use it.

            /**
             * The MySensors Arduino library handles the wireless radio link and protocol
             * between your home built sensors/actuators and HA controller of choice.
             * The sensors forms a self healing radio network with optional repeaters. Each
             * repeater and gateway builds a routing tables in EEPROM which keeps track of the
             * network topology allowing messages to be routed to nodes.
             *
             * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
             * Copyright (C) 2013-2015 Sensnology AB
             * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
             *
             * Documentation: http://www.mysensors.org
             * Support Forum: http://forum.mysensors.org
             *
             * This program is free software; you can redistribute it and/or
             * modify it under the terms of the GNU General Public License
             * version 2 as published by the Free Software Foundation.
             *
             *******************************
             *
             * REVISION HISTORY
             * Version 1.0: Henrik EKblad
             * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
             * 
             * DESCRIPTION
             * This sketch provides an example of how to implement a humidity/temperature
             * sensor using a DHT11/DHT-22.
             *  
             * For more information, please visit:
             * http://www.mysensors.org/build/humidity
             * 
             */
            
            // Enable debug prints
            #define MY_DEBUG
            
            // Enable and select radio type attached 
            #define MY_RADIO_NRF24
            //#define MY_RADIO_RFM69
            //#define MY_RS485
            
            #define MY_NODE_ID 20
            #include <SPI.h>
            #include <MySensors.h>  
            #include <DHT.h>
            
            // Set this to the pin you connected the DHT's data pin to
            #define DHT_DATA_PIN 3
            
            // Set this offset if the sensor has a permanent small offset to the real temperatures
            #define SENSOR_TEMP_OFFSET 0
            
            // Sleep time between sensor updates (in milliseconds)
            // Must be >1000ms for DHT22 and >2000ms for DHT11
            //static const uint64_t UPDATE_INTERVAL = 60000;
            unsigned long interval = 60000;
            unsigned long previousMillis = 0;
            
            // Force sending an update of the temperature after n sensor reads, so a controller showing the
            // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
            // the value didn't change since;
            // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
            static const uint8_t FORCE_UPDATE_N_READS = 10;
            
            #define CHILD_ID_HUM 10
            #define CHILD_ID_TEMP 11
            
            float lastTemp;
            float lastHum;
            uint8_t nNoUpdatesTemp;
            uint8_t nNoUpdatesHum;
            bool metric = true;
            
            MyMessage msgHum(CHILD_ID_HUM, V_HUM);
            MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
            DHT dht;
            
            #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
            #define NUMBER_OF_RELAYS 2 // Total number of attached relays
            #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
            
            
            void before()
            {
                for (int sensor=1, pin=RELAY_PIN; 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 presentation()  
            { 
              // Send the sketch version information to the gateway
              sendSketchInfo("TempRELAY", "1.1");
            
              // Register all sensors to gw (they will be created as child devices)
              present(CHILD_ID_HUM, S_HUM);
              present(CHILD_ID_TEMP, S_TEMP);
            
              metric = getControllerConfig().isMetric;
            
              for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                    // Register all sensors to gw (they will be created as child devices)
                    present(sensor, S_BINARY);
                }
            }
            
            
            void setup()
            {
              dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
              //if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
               // Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
              //}
              // Sleep for the time of the minimum sampling period to give the sensor time to power up
              // (otherwise, timeout errors might occure for the first reading)
              // wait(dht.getMinimumSamplingPeriod());
            }
            
            
            void loop()      
            { 
             unsigned long currentMillis = millis();
             if ((unsigned long)(currentMillis - previousMillis) >= interval) { 
              // Force reading sensor, so it works also after sleep()
              dht.readSensor(true);
            
              // Get temperature from DHT library
              float temperature = dht.getTemperature();
              if (isnan(temperature)) {
                Serial.println("Failed reading temperature from DHT!");
              } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                lastTemp = temperature;
                if (!metric) {
                  temperature = dht.toFahrenheit(temperature);
                }
                // Reset no updates counter
                nNoUpdatesTemp = 0;
                temperature += SENSOR_TEMP_OFFSET;
                send(msgTemp.set(temperature, 1));
            
                #ifdef MY_DEBUG
                Serial.print("T: ");
                Serial.println(temperature);
                #endif
              } else {
                // Increase no update counter if the temperature stayed the same
                nNoUpdatesTemp++;
              }
            
              // Get humidity from DHT library
              float humidity = dht.getHumidity();
              if (isnan(humidity)) {
                Serial.println("Failed reading humidity from DHT");
              } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                lastHum = humidity;
                // Reset no updates counter
                nNoUpdatesHum = 0;
                send(msgHum.set(humidity, 1));
            
                #ifdef MY_DEBUG
                Serial.print("H: ");
                Serial.println(humidity);
                #endif
              } else {
                // Increase no update counter if the humidity stayed the same
                nNoUpdatesTemp++;
              }
              previousMillis = millis();
             }
            }
            
            void receive(const MyMessage &message)
            {
                // We only expect one type of message from controller. But we better check anyway.
                if (message.type==V_STATUS) {
                    // Change relay state
                    digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
                    // Store state in eeprom
                    saveState(message.sensor, message.getBool());
                    // Write some debug info
                    Serial.print("Incoming change for sensor:");
                    Serial.print(message.sensor);
                    Serial.print(", New status: ");
                    Serial.println(message.getBool());
                }
            }```
            1 Reply Last reply
            1
            • B bluezr1

              <<edit>>It was me, my bad, it's working.

              For some reason if I pull a wire for the relay it'll still show a change within Vera. I can turn them on and off and they'll show up as if they were turned on and off. Before if I pulled a wire to the relays vera wouldn't show any changes.

              Thank you so much rejoe2 for not just giving me the answers but by pushing me to do it myself. You pointed me to where I needed to be and I thank you for that.

              Now you got me wanting to learn even more. :)

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

              @bluezr1 said in Combining relay and temperature sketch:

              Thank you so much rejoe2 for not just giving me the answers but by pushing me to do it myself. You pointed me to where I needed to be and I thank you for that.

              Now you got me wanting to learn even more. :)
              Thanks also a lot for your positive feedback - seems there are more and more people interested in quick fixes, but imo, it's by far better to "learn how to fish".

              For the next steps, I'd recommend to do some more "combinded sketching", based on the existing build examples - but you'll find that easy once you did the next two of them :grin:

              One more interesting thing may be working with interrups in non-blocking sketches - please mind the needed type of variable definition to avoid irritating effects ;-)

              Then you might run into trouble as combining things needs more PINs - then you are forced to have a look on the next level of abstraction: array functions ;-) . For a start, you may analyse the multi-button-relay-sketch somwhere around here in the forum.

              Then you are at least on my level of knowledge within one week :grin:

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

              1 Reply Last reply
              1
              • pepsonP Offline
                pepsonP Offline
                pepson
                wrote on last edited by
                #64

                Hi
                I need help... I want use sketch for 2 relay and sensor temp Dallas SD18b20.
                I have working sketch for 2xrelay and put to it sketch from mysensors
                https://www.mysensors.org/build/temp

                for Dallas but it not working. Not showing temp from Dallas. In DOmotcz on Gateway show only Binary from relay. Not Show Temp.

                /**
                   DESCRIPTION
                   Sketch for 2x relay with buttons monostable. After back power all relays set OFF and send correct status OFF to controller.  
                */
                
                // Enable debug prints to serial monitor
                #define MY_DEBUG
                
                // Enable and select radio type attached
                #define MY_RADIO_RFM69
                #define MY_RFM69_FREQUENCY RF69_868MHZ
                #define MY_IS_RFM69HW
                
                // Enabled repeater feature for this node
                #define MY_REPEATER_FEATURE
                
                // Node id defaults to AUTO (tries to fetch id from controller)
                #define MY_NODE_ID AUTO
                
                #include <SPI.h>
                #include <MySensors.h>
                #include <Bounce2.h>
                #include <DallasTemperature.h>
                #include <OneWire.h>
                
                // Define Relays
                #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 Sensor ID's
                #define SSR_A_ID 1   // Id of the sensor child
                #define SSR_B_ID 2   // Id of the sensor child
                
                // Define buttons and relays
                const int buttonPinA = 3;
                const int buttonPinB = 4;
                const int relayPinA = 5;
                const int relayPinB = 6;
                
                // Define Variables
                int oldValueA = 0;
                int oldValueB = 0;
                bool stateA = false;
                bool stateB = false;
                int trigger = 0;
                
                // Define Sensors Temperature
                #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
                
                #define ONE_WIRE_BUS 3 // 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;
                
                Bounce debouncerA = Bounce();
                Bounce debouncerB = Bounce();
                
                MyMessage msgA(SSR_A_ID, V_STATUS);
                MyMessage msgB(SSR_B_ID, V_STATUS);
                // Initialize temperature message
                MyMessage msg(0,V_TEMP);
                
                void before()
                {
                  // Startup up the OneWire library
                  sensors.begin();
                }
                
                void setup()
                {
                
                  pinMode(buttonPinA, INPUT_PULLUP); // Setup the button Activate internal pull-up
                  pinMode(buttonPinB, INPUT_PULLUP); // Setup the button Activate internal pull-up
                
                
                  // After setting up the buttons, setup debouncer
                  debouncerA.attach(buttonPinA);
                  debouncerA.interval(5);
                  debouncerB.attach(buttonPinB);
                  debouncerB.interval(5);
                
                  // Make sure relays are off when starting up
                  digitalWrite(relayPinA, RELAY_OFF);
                  digitalWrite(relayPinB, RELAY_OFF);
                  // Then set relay pins in output mode
                  pinMode(relayPinA, OUTPUT);
                  pinMode(relayPinB, OUTPUT);
                
                  // requestTemperatures() will not block current thread
                  sensors.setWaitForConversion(false);
                
                }
                
                void presentation()  {
                  // Send the sketch version information to the gateway and Controller
                  sendSketchInfo("2xRelay monostable + temp. DS18b20", "2.1.1");
                
                  // Register all sensors to gw (they will be created as child devices)
                  present(SSR_A_ID, S_LIGHT);
                  present(SSR_B_ID, S_LIGHT);
                
                  // 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);
                  }
                
                }
                
                
                void loop()
                {
                if (trigger == 0){
                  send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
                  send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
                  trigger = 1;
                }
                  
                  debouncerA.update();
                  // Get the update value
                  int valueA = debouncerA.read();
                  if (valueA != oldValueA && valueA == 0) {
                    send(msgA.set(stateA ? false : true), true); // Send new state and request ack back
                
                  }
                  oldValueA = valueA;
                 
                
                  debouncerB.update();
                  // Get the update value
                  int valueB = debouncerB.read();
                  if (valueB != oldValueB && valueB == 0) {
                    send(msgB.set(stateB ? false : true), true); // Send new state and request ack back
                
                  }
                  oldValueB = valueB;
                
                   // 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);
                }
                
                void receive(const MyMessage &message) {
                  // We only expect one type of message from controller. But we better check anyway.
                  if (message.type == V_STATUS) {
                      
                    switch (message.sensor) {
                      case 1:
                        stateA = message.getBool();
                        digitalWrite(message.sensor + 4, stateA ? RELAY_ON : RELAY_OFF);
                        
                        break;
                      case 2:
                        stateB = message.getBool();
                        digitalWrite(message.sensor + 4, stateB ? RELAY_ON : RELAY_OFF);
                        
                        break;
                      
                    }
                   
                      // Write some debug info
                    Serial.print("Incoming change for sensor:");
                    Serial.println(message.sensor);
                    Serial.print("from node:");
                    Serial.println(message.sender);
                    Serial.print(", New status: ");
                    Serial.println(message.getBool());
                  }
                }```
                
                
                Please help me
                rejoe2R 1 Reply Last reply
                0
                • pepsonP pepson

                  Hi
                  I need help... I want use sketch for 2 relay and sensor temp Dallas SD18b20.
                  I have working sketch for 2xrelay and put to it sketch from mysensors
                  https://www.mysensors.org/build/temp

                  for Dallas but it not working. Not showing temp from Dallas. In DOmotcz on Gateway show only Binary from relay. Not Show Temp.

                  /**
                     DESCRIPTION
                     Sketch for 2x relay with buttons monostable. After back power all relays set OFF and send correct status OFF to controller.  
                  */
                  
                  // Enable debug prints to serial monitor
                  #define MY_DEBUG
                  
                  // Enable and select radio type attached
                  #define MY_RADIO_RFM69
                  #define MY_RFM69_FREQUENCY RF69_868MHZ
                  #define MY_IS_RFM69HW
                  
                  // Enabled repeater feature for this node
                  #define MY_REPEATER_FEATURE
                  
                  // Node id defaults to AUTO (tries to fetch id from controller)
                  #define MY_NODE_ID AUTO
                  
                  #include <SPI.h>
                  #include <MySensors.h>
                  #include <Bounce2.h>
                  #include <DallasTemperature.h>
                  #include <OneWire.h>
                  
                  // Define Relays
                  #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 Sensor ID's
                  #define SSR_A_ID 1   // Id of the sensor child
                  #define SSR_B_ID 2   // Id of the sensor child
                  
                  // Define buttons and relays
                  const int buttonPinA = 3;
                  const int buttonPinB = 4;
                  const int relayPinA = 5;
                  const int relayPinB = 6;
                  
                  // Define Variables
                  int oldValueA = 0;
                  int oldValueB = 0;
                  bool stateA = false;
                  bool stateB = false;
                  int trigger = 0;
                  
                  // Define Sensors Temperature
                  #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
                  
                  #define ONE_WIRE_BUS 3 // 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;
                  
                  Bounce debouncerA = Bounce();
                  Bounce debouncerB = Bounce();
                  
                  MyMessage msgA(SSR_A_ID, V_STATUS);
                  MyMessage msgB(SSR_B_ID, V_STATUS);
                  // Initialize temperature message
                  MyMessage msg(0,V_TEMP);
                  
                  void before()
                  {
                    // Startup up the OneWire library
                    sensors.begin();
                  }
                  
                  void setup()
                  {
                  
                    pinMode(buttonPinA, INPUT_PULLUP); // Setup the button Activate internal pull-up
                    pinMode(buttonPinB, INPUT_PULLUP); // Setup the button Activate internal pull-up
                  
                  
                    // After setting up the buttons, setup debouncer
                    debouncerA.attach(buttonPinA);
                    debouncerA.interval(5);
                    debouncerB.attach(buttonPinB);
                    debouncerB.interval(5);
                  
                    // Make sure relays are off when starting up
                    digitalWrite(relayPinA, RELAY_OFF);
                    digitalWrite(relayPinB, RELAY_OFF);
                    // Then set relay pins in output mode
                    pinMode(relayPinA, OUTPUT);
                    pinMode(relayPinB, OUTPUT);
                  
                    // requestTemperatures() will not block current thread
                    sensors.setWaitForConversion(false);
                  
                  }
                  
                  void presentation()  {
                    // Send the sketch version information to the gateway and Controller
                    sendSketchInfo("2xRelay monostable + temp. DS18b20", "2.1.1");
                  
                    // Register all sensors to gw (they will be created as child devices)
                    present(SSR_A_ID, S_LIGHT);
                    present(SSR_B_ID, S_LIGHT);
                  
                    // 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);
                    }
                  
                  }
                  
                  
                  void loop()
                  {
                  if (trigger == 0){
                    send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
                    send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
                    trigger = 1;
                  }
                    
                    debouncerA.update();
                    // Get the update value
                    int valueA = debouncerA.read();
                    if (valueA != oldValueA && valueA == 0) {
                      send(msgA.set(stateA ? false : true), true); // Send new state and request ack back
                  
                    }
                    oldValueA = valueA;
                   
                  
                    debouncerB.update();
                    // Get the update value
                    int valueB = debouncerB.read();
                    if (valueB != oldValueB && valueB == 0) {
                      send(msgB.set(stateB ? false : true), true); // Send new state and request ack back
                  
                    }
                    oldValueB = valueB;
                  
                     // 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);
                  }
                  
                  void receive(const MyMessage &message) {
                    // We only expect one type of message from controller. But we better check anyway.
                    if (message.type == V_STATUS) {
                        
                      switch (message.sensor) {
                        case 1:
                          stateA = message.getBool();
                          digitalWrite(message.sensor + 4, stateA ? RELAY_ON : RELAY_OFF);
                          
                          break;
                        case 2:
                          stateB = message.getBool();
                          digitalWrite(message.sensor + 4, stateB ? RELAY_ON : RELAY_OFF);
                          
                          break;
                        
                      }
                     
                        // Write some debug info
                      Serial.print("Incoming change for sensor:");
                      Serial.println(message.sensor);
                      Serial.print("from node:");
                      Serial.println(message.sender);
                      Serial.print(", New status: ");
                      Serial.println(message.getBool());
                    }
                  }```
                  
                  
                  Please help me
                  rejoe2R Offline
                  rejoe2R Offline
                  rejoe2
                  wrote on last edited by
                  #65

                  @pepson
                  Imo there are several things to look at:

                  1. Pin 3 seems to be used for button a + 1-wire? -> use a different one

                  2. How many DS18B20 do you have attached?
                    a) In case it's up to three, you try to report Relay and Temp info partly under the same Child_ID (1+2). Imo, it's better to chose a different starting Child ID, something like "present(i+10, S_TEMP)" or use a variable like "FIRST_TEMP_CHILD" (also use the same scheme for sending).
                    b) You may also suffer from a wiring problem, if you are able to compile and flash this sketch. Just for testing you could add a debugg-message to serial with the numSensors

                  3. Combining relays, debounced buttons and sleep() most likely will cause problems. Better use a non-blocking loop as described in post #45 and following.

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

                  rejoe2R 1 Reply Last reply
                  0
                  • pepsonP Offline
                    pepsonP Offline
                    pepson
                    wrote on last edited by pepson
                    #66

                    I use one temp sensor. Ok i try correct but i dont know how correct it for send...please help me for sending...

                    And please help me with this:
                    Combining relays, debounced buttons and sleep() most likely will cause problems. Better use a non-blocking loop as described in post #45 and following.

                    /**
                       DESCRIPTION
                       Sketch for 2x relay with buttons monostable. After back power all relays set OFF and send correct status OFF to controller.  
                    */
                    
                    // Enable debug prints to serial monitor
                    #define MY_DEBUG
                    
                    // Enable and select radio type attached
                    #define MY_RADIO_RFM69
                    #define MY_RFM69_FREQUENCY RF69_868MHZ
                    #define MY_IS_RFM69HW
                    
                    // Enabled repeater feature for this node
                    #define MY_REPEATER_FEATURE
                    
                    // Node id defaults to AUTO (tries to fetch id from controller)
                    #define MY_NODE_ID AUTO
                    
                    #include <SPI.h>
                    #include <MySensors.h>
                    #include <Bounce2.h>
                    #include <DallasTemperature.h>
                    #include <OneWire.h>
                    
                    // Define Relays
                    #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 Sensor ID's
                    #define SSR_A_ID 1   // Id of the sensor child
                    #define SSR_B_ID 2   // Id of the sensor child
                    
                    // Define buttons and relays
                    const int buttonPinA = 3;
                    const int buttonPinB = 4;
                    const int relayPinA = 5;
                    const int relayPinB = 6;
                    
                    // Define Variables
                    int oldValueA = 0;
                    int oldValueB = 0;
                    bool stateA = false;
                    bool stateB = false;
                    int trigger = 0;
                    
                    // Define Sensors Temperature
                    #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
                    
                    #define ONE_WIRE_BUS 7 // 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;
                    
                    Bounce debouncerA = Bounce();
                    Bounce debouncerB = Bounce();
                    
                    MyMessage msgA(SSR_A_ID, V_STATUS);
                    MyMessage msgB(SSR_B_ID, V_STATUS);
                    // Initialize temperature message
                    MyMessage msg(0,V_TEMP);
                    
                    void before()
                    {
                      // Startup up the OneWire library
                      sensors.begin();
                    }
                    
                    void setup()
                    {
                    
                      pinMode(buttonPinA, INPUT_PULLUP); // Setup the button Activate internal pull-up
                      pinMode(buttonPinB, INPUT_PULLUP); // Setup the button Activate internal pull-up
                    
                    
                      // After setting up the buttons, setup debouncer
                      debouncerA.attach(buttonPinA);
                      debouncerA.interval(5);
                      debouncerB.attach(buttonPinB);
                      debouncerB.interval(5);
                    
                      // Make sure relays are off when starting up
                      digitalWrite(relayPinA, RELAY_OFF);
                      digitalWrite(relayPinB, RELAY_OFF);
                      // Then set relay pins in output mode
                      pinMode(relayPinA, OUTPUT);
                      pinMode(relayPinB, OUTPUT);
                    
                      // requestTemperatures() will not block current thread
                      sensors.setWaitForConversion(false);
                    
                    }
                    
                    void presentation()  {
                      // Send the sketch version information to the gateway and Controller
                      sendSketchInfo("2xRelay monostable + temp. DS18b20", "2.1.1");
                    
                      // Register all sensors to gw (they will be created as child devices)
                      present(SSR_A_ID, S_LIGHT);
                      present(SSR_B_ID, S_LIGHT);
                    
                      // 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+10, S_TEMP);
                      }
                    
                    }
                    
                    
                    void loop()
                    {
                    if (trigger == 0){
                      send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
                      send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
                      trigger = 1;
                    }
                      
                      debouncerA.update();
                      // Get the update value
                      int valueA = debouncerA.read();
                      if (valueA != oldValueA && valueA == 0) {
                        send(msgA.set(stateA ? false : true), true); // Send new state and request ack back
                    
                      }
                      oldValueA = valueA;
                     
                    
                      debouncerB.update();
                      // Get the update value
                      int valueB = debouncerB.read();
                      if (valueB != oldValueB && valueB == 0) {
                        send(msgB.set(stateB ? false : true), true); // Send new state and request ack back
                    
                      }
                      oldValueB = valueB;
                    
                       // 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);
                    }
                    
                    void receive(const MyMessage &message) {
                      // We only expect one type of message from controller. But we better check anyway.
                      if (message.type == V_STATUS) {
                          
                        switch (message.sensor) {
                          case 1:
                            stateA = message.getBool();
                            digitalWrite(message.sensor + 4, stateA ? RELAY_ON : RELAY_OFF);
                            
                            break;
                          case 2:
                            stateB = message.getBool();
                            digitalWrite(message.sensor + 4, stateB ? RELAY_ON : RELAY_OFF);
                            
                            break;
                          
                        }
                       
                          // Write some debug info
                        Serial.print("Incoming change for sensor:");
                        Serial.println(message.sensor);
                        Serial.print("from node:");
                        Serial.println(message.sender);
                        Serial.print(", New status: ");
                        Serial.println(message.getBool());
                      }
                    }```
                    1 Reply Last reply
                    0
                    • rejoe2R Offline
                      rejoe2R Offline
                      rejoe2
                      wrote on last edited by
                      #67
                      1. Wrt sending: your controller should show one temperature sensor with Child ID 10. As a consequence, the temp value should also be reported using this ID. So you should adopt this line appropriately, just use the same logic as in presentation() :grin: .
                      send(msg.setSensor(i).set(temperature,1));
                      
                      1. For the non-blocking loop: As already mentionned, within this thread you just should follow @bluezr1 steps and some of my remarks :grinning: .
                        The sketch in #63 should be a working solution, but when using dallas temp instead of the DHT, you have also to change the sleep(conversionTime) to wait().

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

                      1 Reply Last reply
                      0
                      • pepsonP Offline
                        pepsonP Offline
                        pepson
                        wrote on last edited by
                        #68

                        I am begginer. Can you give me ready sketch for dallas with one relay ? Please

                        rejoe2R 1 Reply Last reply
                        0
                        • pepsonP pepson

                          I am begginer. Can you give me ready sketch for dallas with one relay ? Please

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

                          @pepson Especially as a beginner you really should try to follow the necessary steps to develop combined sketches - it's easier than you may think by now.
                          Otherwise you may run into the next unexpected trouble without any idea, how things fit together and - even more important - how to debug (or even where to attach what). So asking for ready sketches is not the best idea.

                          If you are still convinced about the need of a ready sketch: There's - amongst others - a sketch with #101 using DS18B20 and 4 relays in my repo (link is already available in this thread). , BUT: this is work in progress, may use a modified version of the dallas lib and reports temperatures and relays under the same ChildID - my controller (FHEM) seems not to care about that...
                          As I changed communication to RS485 last weekend, I most likely will not do any update, if there are issues or further enhancements on the code (I plan to do some).

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

                          1 Reply Last reply
                          0
                          • pepsonP Offline
                            pepsonP Offline
                            pepson
                            wrote on last edited by
                            #70

                            @rejoe2 said in Combining relay and temperature sketch:

                            #10

                            I try also ready sketch for only dallas fom mysensors.rg but it also not working:

                            // Enable debug prints to serial monitor
                            #define MY_DEBUG 
                            
                            // Enable and select radio type attached
                            #define MY_RADIO_RFM69
                            #define MY_RFM69_FREQUENCY RF69_868MHZ
                            #define MY_IS_RFM69HW
                            
                            // Enabled repeater feature for this node
                            #define MY_REPEATER_FEATURE
                            
                            // Node id defaults to AUTO (tries to fetch id from controller)
                            #define MY_NODE_ID AUTO
                            
                            #include <SPI.h>
                            #include <MySensors.h>  
                            #include <DallasTemperature.h>
                            #include <OneWire.h>
                            
                            #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
                            
                            #define ONE_WIRE_BUS 3 // 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();
                            }
                            
                            void setup()  
                            { 
                              // requestTemperatures() will not block current thread
                              sensors.setWaitForConversion(false);
                            }
                            
                            void presentation() {
                              // Send the sketch version information to the gateway and Controller
                              sendSketchInfo("Temperature Sensor", "1.1");
                            
                              // 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);
                              }
                            }
                            
                            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);
                            }```
                            1 Reply Last reply
                            0
                            • rejoe2R rejoe2

                              @pepson
                              Imo there are several things to look at:

                              1. Pin 3 seems to be used for button a + 1-wire? -> use a different one

                              2. How many DS18B20 do you have attached?
                                a) In case it's up to three, you try to report Relay and Temp info partly under the same Child_ID (1+2). Imo, it's better to chose a different starting Child ID, something like "present(i+10, S_TEMP)" or use a variable like "FIRST_TEMP_CHILD" (also use the same scheme for sending).
                                b) You may also suffer from a wiring problem, if you are able to compile and flash this sketch. Just for testing you could add a debugg-message to serial with the numSensors

                              3. Combining relays, debounced buttons and sleep() most likely will cause problems. Better use a non-blocking loop as described in post #45 and following.

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

                              @rejoe2 said in Combining relay and temperature sketch:

                              b) You may also suffer from a wiring problem, if you are able to compile and flash this sketch. Just for testing you could add a debugg-message to serial with the numSensors

                              Did you follow the instructions as described in the "build" section, attached the data line to PIN3 and used an appropriate resistor (measure it's value) ? Then it's most likely a damaged sensor...

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

                              pepsonP 1 Reply Last reply
                              0
                              • rejoe2R rejoe2

                                @rejoe2 said in Combining relay and temperature sketch:

                                b) You may also suffer from a wiring problem, if you are able to compile and flash this sketch. Just for testing you could add a debugg-message to serial with the numSensors

                                Did you follow the instructions as described in the "build" section, attached the data line to PIN3 and used an appropriate resistor (measure it's value) ? Then it's most likely a damaged sensor...

                                pepsonP Offline
                                pepsonP Offline
                                pepson
                                wrote on last edited by
                                #72

                                @rejoe2
                                Yes i connected my sensors to PIN 3 and use resistor 4.7
                                But in Domoticz on gateway not show any CHILDS for this NODE.

                                rejoe2R 1 Reply Last reply
                                0
                                • pepsonP pepson

                                  @rejoe2
                                  Yes i connected my sensors to PIN 3 and use resistor 4.7
                                  But in Domoticz on gateway not show any CHILDS for this NODE.

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

                                  @pepson Seems like the sensor is not detected, so the presentation() will have zero sensors to present...
                                  If you do not want to follow the proposal to print the numSensors to serial (most likely: 0) you should try to test the DS18B20-Hardware by using an example sketch (e.g. Simple.pde) from the dallas temperature lib (without the MySensors-framework) and have a look on the serial console of the IDE. Be aware: "as is", it uses PIN2 and a different baudrate.
                                  If there are no temperature values printed, it's either still a wiring problem or the sensor's just broken.

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

                                  1 Reply Last reply
                                  0
                                  • MGHaffM Offline
                                    MGHaffM Offline
                                    MGHaff
                                    wrote on last edited by
                                    #74

                                    Has anyone had any progress on sensor node with mysensors + multiple dallas temp sensors and multiple relays, combining the two codes? Any help would be greatly appreciated. I have been playing with this for a little more than a week, have tried everything suggested but still not working. A push in the right direction would be great!

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

                                      @mghaff said in Combining relay and temperature sketch:

                                      Has anyone had any progress on sensor node with mysensors + multiple dallas temp sensors and multiple relays, combining the two codes?

                                      Some older code; some rework might be necessary: https://github.com/rejoe2/MySensors_Small/blob/master/MyS101/MyS101.ino
                                      There are some more DS18B20 examples in the repo, just have a look around...

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

                                      MGHaffM 1 Reply Last reply
                                      0
                                      • rejoe2R rejoe2

                                        @mghaff said in Combining relay and temperature sketch:

                                        Has anyone had any progress on sensor node with mysensors + multiple dallas temp sensors and multiple relays, combining the two codes?

                                        Some older code; some rework might be necessary: https://github.com/rejoe2/MySensors_Small/blob/master/MyS101/MyS101.ino
                                        There are some more DS18B20 examples in the repo, just have a look around...

                                        MGHaffM Offline
                                        MGHaffM Offline
                                        MGHaff
                                        wrote on last edited by
                                        #76

                                        @rejoe2 Thanks! I will do that. the code i used was from the examples. My relays work fine but my temp sensors never register. Even in serial. but if i run the Dallas temp my-sensors code separate i always get reading. Its just been mind boggling. :)

                                        1 Reply Last reply
                                        0
                                        Reply
                                        • Reply as topic
                                        Log in to reply
                                        • Oldest to Newest
                                        • Newest to Oldest
                                        • Most Votes


                                        14

                                        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