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. Controllers
  3. Home Assistant
  4. MySensors ethernet 2.2.0 problem with control node switches

MySensors ethernet 2.2.0 problem with control node switches

Scheduled Pinned Locked Moved Home Assistant
12 Posts 3 Posters 2.5k Views 3 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.
  • pepsonP Offline
    pepsonP Offline
    pepson
    wrote on last edited by
    #3

    ok corrected

    1 Reply Last reply
    0
    • martinhjelmareM Offline
      martinhjelmareM Offline
      martinhjelmare
      Plugin Developer
      wrote on last edited by
      #4

      You need to feedback and send the changed state to home assistant, after writing the new state to the pin, in the receive function. Otherwise home assistant thinks that the message to change state did not reach the node, and returns to the old state.

      pepsonP 1 Reply Last reply
      1
      • martinhjelmareM martinhjelmare

        You need to feedback and send the changed state to home assistant, after writing the new state to the pin, in the receive function. Otherwise home assistant thinks that the message to change state did not reach the node, and returns to the old state.

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

        @martinhjelmare

        Can you explaine me more. Sorry i am begginer user and i dont know how ? Please

        Or please correct it in my sketch...please

        1 Reply Last reply
        0
        • martinhjelmareM Offline
          martinhjelmareM Offline
          martinhjelmare
          Plugin Developer
          wrote on last edited by
          #6

          Add the following line in the receive function eg after the call to digitalWrite.

          send(msg.set(state));
          
          1 Reply Last reply
          0
          • pepsonP Offline
            pepsonP Offline
            pepson
            wrote on last edited by pepson
            #7

            Hi
            Ok i add this and now sketch look like:

            /*
               Relay with button sketch
               modified to work with no uplink
               to gateway and try to maintain sync to controller
            */
            
            
            #define MY_DEBUG                               // Enable debug prints to serial monitor
            
            #define MY_RADIO_RFM69
            #define MY_IS_RFM69HW
            #define RFM69_868MH
            #define MY_RFM69_NEW_DRIVER
            
            //#define MY_NODE_ID 203                       // Node id defaults to AUTO (tries to fetch id from controller) 
            
            #define MY_TRANSPORT_WAIT_READY_MS 5000        //set how long to wait for transport ready in milliseconds
            
            #define MY_REPEATER_FEATURE                    // Enabled repeater feature for this node
            
            #include <MySensors.h>
            #include <Bounce2.h>
            
            #define RELAY_PIN  5      // Arduino Digital I/O pin number for relay 
            #define BUTTON_PIN  3     // Arduino Digital I/O pin number for button 
            #define CHILD_ID 1        // Id of the sensor child
            #define RELAY_ON 1
            #define RELAY_OFF 0
            
            Bounce debouncer = Bounce();
            int oldValue = 0;
            bool uplinkAvailable = true;
            bool state = false;
            bool requestState;
            bool firstStart = true;
            unsigned long uplinkCheckTime ;                // holder for uplink checks
            unsigned long uplinkCheckPeriod = 30*1000;     // time between checks for uplink in milliseconds
            unsigned long returnWait = 1000;               // how long to wait for return from controller in milliseconds.. adjust as needed
            unsigned long oldTime = 0;
            unsigned long newTime = 0;
            MyMessage msg(CHILD_ID, V_STATUS);
            
            void setup(){
              pinMode(BUTTON_PIN, INPUT_PULLUP);           // Setup the button pin, Activate internal pull-up
              
              debouncer.attach(BUTTON_PIN);                // After setting up the button, setup debouncer
              debouncer.interval(5);
            
              pinMode(RELAY_PIN, OUTPUT);                 // set relay pin in output mode
              digitalWrite(RELAY_PIN, RELAY_OFF);         // Make sure relay is off when starting up
            }
            
            void presentation()  {
              // Send the sketch version information to the gateway and Controller
              sendSketchInfo("1xRelay & Button", "2.2.0");
            
              // Register all sensors to gw (they will be created as child devices)
              present(CHILD_ID, S_BINARY);
            }
            
            
            void loop(){
              if (firstStart) {                            // this code is only run once at startup
                Serial.println("First run started");
                requestTime();                             // get time from controller
                wait (returnWait);                         // delay to allow time to return
                if (oldTime == 0){                         // check to see if there was a return from the time request
                  Serial.println("uplink not available");
                  uplinkAvailable = false;                 // no uplink established
                  uplinkCheckTime = millis();
                }
                 else{
                  Serial.println("uplink available");
                  request( CHILD_ID, V_STATUS);            // get status of switch on controller
                  wait (returnWait);                       //wait needed to allow request to return from controller
                  Serial.print("controller state --- ");
                  Serial.println(requestState);
                  if (requestState != state) {             // check that controller is corectly showing the current relay state
                    send(msg.set(state), false);           // notify controller of current state
                  } 
                 }   
              firstStart = false;                                          // set firstStart flag false to prevent code from running again
             }
            
              debouncer.update();
              int value = debouncer.read();                               // Get the update value
              if (value != oldValue && value == 0) {                      // check for new button push
                state =  !state;                                          // Toggle the state
                digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF);    // switch the relay to the new state
                requestTime();
                wait (returnWait);                                               // delay to allow time to return
                if (oldTime != newTime){                                  // if times are different then uplink is available
                  send(msg.set(state), false);
                  oldTime = newTime;
                }
                else{                                                    // if times are the same no uplink is available
                 Serial.println("uplink not available");
                  uplinkAvailable = false;                                // no uplink available, set flag false
                  uplinkCheckTime = millis();                             // start the timer from now
                }
            
              }
              oldValue = value;
             
              if (!uplinkAvailable && (millis() - uplinkCheckTime > uplinkCheckPeriod) ) {       // test to see if function should be called
                uplinkCheck();                                                                  // call uplink checking function
              }
            
            }
            
            /*-------------------start of functions--------------------------*/
            
            void receive(const MyMessage &message) {
              if (message.type == V_STATUS) {                                   // check to see if incoming message is for a switch
                switch (message.getCommand()) {                                 // message.getCommand will give us the command type of the incomming message
                  case C_SET:                                                   //message is a set command  from controller to update relay state
                    state = message.getBool();                                  // get the new state
                    digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF);      // switch relay to new state
                    send(msg.set(state));
                    uplinkAvailable = true;                                     //  uplink established
                    /*---- Write some debug info----*/
                    Serial.print("Incoming change for sensor:");
                    Serial.print(message.sensor);
                    Serial.print(", New status: ");
                    Serial.println(message.getBool());
                    break;
                  case C_REQ:                                               // message is a returning request from controller
                    requestState = message.getBool();                       // update requestState with returning state
                    break;
                }
              }
            }
            
            void uplinkCheck() {
                requestTime();
                wait (returnWait);                       // wait for time return.. this may need to be varied for your system
               if (oldTime != newTime){
                 Serial.println("uplink re-established");
                 request( CHILD_ID, V_STATUS);
                 wait (returnWait);                        //wait needed to allow request to return from controller
                if (requestState != state) {              // check that controller is corectly showing the current relay state
                  send(msg.set(state), false);            // notify controller of current state no ack
                  uplinkAvailable = true;                 //  uplink established
                  oldTime = newTime;
                }
              }
              uplinkCheckTime = millis();                // reset the checktime
              Serial.println("uplinkchecktime reset");
            }
            
            
            void receiveTime(unsigned long time)
            {
              if (firstStart){
                oldTime = time;
                newTime = time;
              }
              else{
              newTime = time;
            }
              Serial.print("time received---- " );
              Serial.println(time);
            }
            

            Now works ok but another problem. Ex When i enable relay and then reboot my RPI with Home Assistant and under reboot i manual change state relay by put pin to GND, then after run RPI with Home Assistant , it come back to previus state relay. Again set my relay as ENABLE.
            Is any chance to change it to after start HA he check state relay and setup in home assistant actual phisicaly state relay... not remembered before reboot ?

            And next problem... When node has relay ENABLE and power lost, then power come back relay again to ENABLE. But i want to RELAY always after power lost and power come back to relay go to DISABLE.

            1 Reply Last reply
            0
            • gohanG Offline
              gohanG Offline
              gohan
              Mod
              wrote on last edited by
              #8

              Set the relay state in setup function?

              pepsonP 1 Reply Last reply
              0
              • gohanG gohan

                Set the relay state in setup function?

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

                @gohan
                Can you explaine me more because I am beginner and I don't know how?

                It is in "void setup" ?
                And what is command for setup state?

                1 Reply Last reply
                0
                • gohanG Offline
                  gohanG Offline
                  gohan
                  Mod
                  wrote on last edited by
                  #10

                  add

                  send(msg.set(RELAY_OFF), false);           // notify controller to show off state
                  

                  at end of setup function and see if you get the result you want

                  pepsonP 1 Reply Last reply
                  0
                  • gohanG gohan

                    add

                    send(msg.set(RELAY_OFF), false);           // notify controller to show off state
                    

                    at end of setup function and see if you get the result you want

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

                    @gohan
                    But it is for only show state off or also physical change state relay to off?

                    void setup(){
                    pinMode(BUTTON_PIN, INPUT_PULLUP); // Setup the button pin, Activate internal pull-up
                    
                    debouncer.attach(BUTTON_PIN); // After setting up the button, setup debouncer
                    debouncer.interval(5);
                    
                    pinMode(RELAY_PIN, OUTPUT); // set relay pin in output mode
                    digitalWrite(RELAY_PIN, RELAY_OFF); // Make sure relay is off when starting up
                    send(msg.set(RELAY_OFF), false);           // notify controller to show off state
                    }
                    

                    This is OK code?

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

                      @gohan said in MySensors ethernet 2.2.0 problem with control node switches:

                      send(msg.set(RELAY_OFF), false); // notify controller to show off state

                      ok looks that is ok but please give me a time i test it more.

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


                      23

                      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