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. My Project
  3. A very beginner needs help - MySensors and OpenHab !

A very beginner needs help - MySensors and OpenHab !

Scheduled Pinned Locked Moved My Project
43 Posts 7 Posters 28.0k Views 6 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.
  • T Offline
    T Offline
    TimO
    Hero Member
    wrote on last edited by
    #34

    Well, there are many approaches and I would go the easiest (but not the most elegant) way.

    Double everything for every additional button / relay. If that works for two/three buttons/relays use arrays (like in the relay example sketch).

    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    
    #define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
    #define RELAY_PIN2 5 ######## ADD THAT ######
    #define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
    #define BUTTON_PIN2 6 ######## ADD THAT ######
    #define CHILD_ID 1   // Id of the sensor child
    #define CHILD_ID2 2 ######## ADD THAT ######
    #define RELAY_ON 1
    #define RELAY_OFF 0
    
    Bounce debouncer = Bounce(); 
    Bounce debouncer2 = Bounce(); ######## ADD THAT ######
    int oldValue=0;
    int oldValue2=0; ######## ADD THAT ######
    bool state;
    bool state2; ######## ADD THAT ######
    MySensor gw;
    MyMessage msg(CHILD_ID,V_LIGHT);
    MyMessage msg2(CHILD_ID2,V_LIGHT); ######## ADD THAT ######
    
    void setup()  
    {  
      gw.begin(incomingMessage, AUTO, true);
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Relay & Button", "1.0");
    
     // Setup the button
      pinMode(BUTTON_PIN,INPUT);
      pinMode(BUTTON_PIN2,INPUT); ######## ADD THAT ######
      // Activate internal pull-up
      digitalWrite(BUTTON_PIN,HIGH);
      digitalWrite(BUTTON_PIN2,HIGH); ######## ADD THAT ######
      
      // After setting up the button, setup debouncer
      debouncer.attach(BUTTON_PIN);
      debouncer2.attach(BUTTON_PIN2); ######## ADD THAT ######
      debouncer.interval(5);
      debounder2.interval(5);######## ADD THAT ######
    
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_LIGHT);
      gw.present(CHILD_ID2,S_LIGHT);######## ADD THAT ######
    
      // Make sure relays are off when starting up
      digitalWrite(RELAY_PIN, RELAY_OFF);
      digitalWrite(RELAY_PIN2,RELAY_OFF); ######## ADD THAT ######
      // Then set relay pins in output mode
      pinMode(RELAY_PIN, OUTPUT);
      pinMode(RELAY_PIN2, OUTPUT); ######## ADD THAT ######   
          
      // Set relay to last known state (using eeprom storage) 
      state = gw.loadState(CHILD_ID);
      state2 = gw.loadState(CHILD_ID2); ######## ADD THAT ######
      digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
      digitalWrite(RELAY_PIN2, state2?RELAY_ON:RELAY_OFF); ######## ADD THAT ######
    }
    
    
    /*
    *  Example on how to asynchronously check for new messages from gw
    */
    void loop() 
    {
      gw.process();
      debouncer.update();
      debounder2.update(); ######## ADD THAT ######
    
      // Get the update value
      int value = debouncer.read();
      if (value != oldValue && value==0) {
          gw.send(msg.set(state?false:true), true); // Send new state and request ack back
      }
      oldValue = value;
    } 
    
    value = debouncer2.read(); ######## ADD THAT ######
      if (value != oldValue2 && value==0) { ######## ADD THAT ######
          gw.send(msg2.set(state?false:true), true); // Send new state and request ack back ######## ADD THAT ######
      } ######## ADD THAT ######
      oldValue2 = value; ######## ADD THAT ######
    } ######## ADD THAT ######
     
    void incomingMessage(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.isAck()) {
         Serial.println("This is an ack from gateway");
      }
    
      if (message.type == V_LIGHT) {
         // Change relay state
         state = message.getBool();
         if(message.sensor == 1) { ######## ADD THAT ######
           digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
           // Store state in eeprom
           gw.saveState(CHILD_ID, state);
         } else if(message.sensor == 2) { ######## ADD THAT ######
           digitalWrite(RELAY_PIN2, state?RELAY_ON:RELAY_OFF); ######## ADD THAT ######
           // Store state in eeprom ######## ADD THAT ######
           gw.saveState(CHILD_ID2, state); ######## ADD THAT ######
        }
        
         // Write some debug info
         Serial.print("Incoming change for sensor:");
         Serial.print(message.sensor);
         Serial.print(", New status: ");
         Serial.println(message.getBool());
       } 
    }
    

    The code is not tested nor compiled, but I hope you'll get the idea of how to add a button and a relay.

    Of course this could be done much more elegant with arrays, that could be your next step.

    1 Reply Last reply
    0
    • E Offline
      E Offline
      ewgor
      wrote on last edited by ewgor
      #35

      Wow! thanks for your time to fill this sketch! appreciate that.

      I tried your sketch and after cleaning some small mistakes i got these errors and i don't know how to lose them.
      this is how the sketch looks:

      #include <MySensor.h>
      #include <SPI.h>
      #include <Bounce2.h>
      
      #define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
      #define RELAY_PIN2 5 //######## ADD THAT ######
      #define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
      #define BUTTON_PIN2 6 //######## ADD THAT ######
      #define CHILD_ID 1   // Id of the sensor child
      #define CHILD_ID2 2 //######## ADD THAT ######
      #define RELAY_ON 1
      #define RELAY_OFF 0
      
      Bounce debouncer = Bounce(); 
      Bounce debouncer2 = Bounce(); //######## ADD THAT ######
      int oldValue=0;
      int oldValue2=0; //######## ADD THAT ######
      bool state;
      bool state2; //######## ADD THAT ######
      MySensor gw;
      MyMessage msg(CHILD_ID,V_LIGHT);
      MyMessage msg2(CHILD_ID2,V_LIGHT); //######## ADD THAT ######
      
      void setup()  
      {  
        gw.begin(incomingMessage, AUTO, true);
      
        // Send the sketch version information to the gateway and Controller
        gw.sendSketchInfo("Relay & Button", "1.0");
      
       // Setup the button
        pinMode(BUTTON_PIN,INPUT);
        pinMode(BUTTON_PIN2,INPUT); //######## ADD THAT ######
        // Activate internal pull-up
        digitalWrite(BUTTON_PIN,HIGH);
        digitalWrite(BUTTON_PIN2,HIGH); //######## ADD THAT ######
        
        // After setting up the button, setup debouncer
        debouncer.attach(BUTTON_PIN);
        debouncer2.attach(BUTTON_PIN2); //######## ADD THAT ######
        debouncer.interval(5);
        debouncer2.interval(5);//######## ADD THAT ######
      
        // Register all sensors to gw (they will be created as child devices)
        gw.present(CHILD_ID, S_LIGHT);
        gw.present(CHILD_ID2, S_LIGHT);//######## ADD THAT ######
      
        // Make sure relays are off when starting up
        digitalWrite(RELAY_PIN, RELAY_OFF);
        digitalWrite(RELAY_PIN2, RELAY_OFF); //######## ADD THAT ######
        // Then set relay pins in output mode
        pinMode(RELAY_PIN, OUTPUT);
        pinMode(RELAY_PIN2, OUTPUT); //######## ADD THAT ######   
            
        // Set relay to last known state (using eeprom storage) 
        state = gw.loadState(CHILD_ID);
        state2 = gw.loadState(CHILD_ID2); //######## ADD THAT ######
        digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
        digitalWrite(RELAY_PIN2, state2?RELAY_ON:RELAY_OFF); //######## ADD THAT ######
      }
      
      
      /*
      *  Example on how to asynchronously check for new messages from gw
      */
      void loop() 
      {
        gw.process();
        debouncer.update();
        debouncer2.update(); //######## ADD THAT ######
      
        // Get the update value
        int value = debouncer.read();
        if (value != oldValue && value==0) {
            gw.send(msg.set(state?false:true), true); // Send new state and request ack back
        }
        oldValue = value;
      } 
      
        int value2 = debouncer2.read(); 
        if (value2 != oldValue && value==0) { 
            gw.send(msg2.set(state?false:true), true); 
        }
        oldValue2 = value;
      }
       
      void incomingMessage(const MyMessage &message) {
        // We only expect one type of message from controller. But we better check anyway.
        if (message.isAck()) {
           Serial.println("This is an ack from gateway");
        }
      
        if (message.type == V_LIGHT) {
           // Change relay state
           state = message.getBool();
           if(message.sensor == 1) { //######## ADD THAT ######
             digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
             // Store state in eeprom
             gw.saveState(CHILD_ID, state);
           } else if(message.sensor == 2) { //######## ADD THAT ######
             digitalWrite(RELAY_PIN2, state?RELAY_ON:RELAY_OFF); //######## ADD THAT ######
             // Store state in eeprom ######## ADD THAT ######
             gw.saveState(CHILD_ID2, state); //######## ADD THAT ######
          }
          
           // Write some debug info
           Serial.print("Incoming change for sensor:");
           Serial.print(message.sensor);
           Serial.print(", New status: ");
           Serial.println(message.getBool());
         } 
      }
      

      and those are the errors:

      
      sketch_sep09a.ino:81:3: error: expected unqualified-id before 'if'
      sketch_sep09a.ino:84:3: error: 'oldValue2' does not name a type
      sketch_sep09a.ino:85:1: error: expected declaration before '}' token
      Error compiling.
      
      

      About the OH rules i made them like this:

      rule "Light"
              when
                      Item lightBar02 received command
              then
                     if(receivedCommand == ON) {
                  sendCommand(Arduino, "101;1;1;0;2;1\n")
              }
              if(receivedCommand == OFF) {
                 sendCommand(Arduino, "101;1;1;0;2;0\n")
              }
      end
      

      what do you think? do i still need to modify something?

      Thank you a lot!:pray:

      1 Reply Last reply
      0
      • T Offline
        T Offline
        TimO
        Hero Member
        wrote on last edited by
        #36

        There is a copy & paste error. Remove the bracket after "oldValue = value;" :)

        The OH rule looks good.

        E 1 Reply Last reply
        0
        • T TimO

          There is a copy & paste error. Remove the bracket after "oldValue = value;" :)

          The OH rule looks good.

          E Offline
          E Offline
          ewgor
          wrote on last edited by
          #37

          @TimO still doesnt want to compile :(
          this is the last error:

          sketch_sep10b.ino:81:3: error: expected unqualified-id before 'if'
          Error compiling.
          
          

          Thanks!

          1 Reply Last reply
          0
          • TheoLT Offline
            TheoLT Offline
            TheoL
            Contest Winner
            wrote on last edited by TheoL
            #38

            You have a closing bracelet ({) too much that's ending your loop() method. I corrected it and added a comment so you can see what's been causing the problem.

            #include <MySensor.h>
            #include <SPI.h>
            #include <Bounce2.h>
            
            #define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
            #define RELAY_PIN2 5 //######## ADD THAT ######
            #define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
            #define BUTTON_PIN2 6 //######## ADD THAT ######
            #define CHILD_ID 1   // Id of the sensor child
            #define CHILD_ID2 2 //######## ADD THAT ######
            #define RELAY_ON 1
            #define RELAY_OFF 0
            
            Bounce debouncer = Bounce(); 
            Bounce debouncer2 = Bounce(); //######## ADD THAT ######
            int oldValue=0;
            int oldValue2=0; //######## ADD THAT ######
            bool state;
            bool state2; //######## ADD THAT ######
            MySensor gw;
            MyMessage msg(CHILD_ID,V_LIGHT);
            MyMessage msg2(CHILD_ID2,V_LIGHT); //######## ADD THAT ######
            
            void setup()  
            {  
              gw.begin(incomingMessage, AUTO, true);
            
              // Send the sketch version information to the gateway and Controller
              gw.sendSketchInfo("Relay & Button", "1.0");
            
             // Setup the button
              pinMode(BUTTON_PIN,INPUT);
              pinMode(BUTTON_PIN2,INPUT); //######## ADD THAT ######
              // Activate internal pull-up
              digitalWrite(BUTTON_PIN,HIGH);
              digitalWrite(BUTTON_PIN2,HIGH); //######## ADD THAT ######
              
              // After setting up the button, setup debouncer
              debouncer.attach(BUTTON_PIN);
              debouncer2.attach(BUTTON_PIN2); //######## ADD THAT ######
              debouncer.interval(5);
              debouncer2.interval(5);//######## ADD THAT ######
            
              // Register all sensors to gw (they will be created as child devices)
              gw.present(CHILD_ID, S_LIGHT);
              gw.present(CHILD_ID2, S_LIGHT);//######## ADD THAT ######
            
              // Make sure relays are off when starting up
              digitalWrite(RELAY_PIN, RELAY_OFF);
              digitalWrite(RELAY_PIN2, RELAY_OFF); //######## ADD THAT ######
              // Then set relay pins in output mode
              pinMode(RELAY_PIN, OUTPUT);
              pinMode(RELAY_PIN2, OUTPUT); //######## ADD THAT ######   
                  
              // Set relay to last known state (using eeprom storage) 
              state = gw.loadState(CHILD_ID);
              state2 = gw.loadState(CHILD_ID2); //######## ADD THAT ######
              digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
              digitalWrite(RELAY_PIN2, state2?RELAY_ON:RELAY_OFF); //######## ADD THAT ######
            }
            
            
            /*
            *  Example on how to asynchronously check for new messages from gw
            */
            void loop() 
            {
              gw.process();
              debouncer.update();
              debouncer2.update(); //######## ADD THAT ######
            
              // Get the update value
              int value = debouncer.read();
              if (value != oldValue && value==0) {
                  gw.send(msg.set(state?false:true), true); // Send new state and request ack back
              }
              oldValue = value;
            // }  <---- remove this bracelet it's closing the loop() method. Then your compiler sees an if statement that's not in a method, which is not allowed
            
              int value2 = debouncer2.read(); 
              if (value2 != oldValue && value==0) { 
                  gw.send(msg2.set(state?false:true), true); 
              }
              oldValue2 = value;
            }
             
            void incomingMessage(const MyMessage &message) {
              // We only expect one type of message from controller. But we better check anyway.
              if (message.isAck()) {
                 Serial.println("This is an ack from gateway");
              }
            
              if (message.type == V_LIGHT) {
                 // Change relay state
                 state = message.getBool();
                 if(message.sensor == 1) { //######## ADD THAT ######
                   digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
                   // Store state in eeprom
                   gw.saveState(CHILD_ID, state);
                 } else if(message.sensor == 2) { //######## ADD THAT ######
                   digitalWrite(RELAY_PIN2, state?RELAY_ON:RELAY_OFF); //######## ADD THAT ######
                   // Store state in eeprom ######## ADD THAT ######
                   gw.saveState(CHILD_ID2, state); //######## ADD THAT ######
                }
                
                 // Write some debug info
                 Serial.print("Incoming change for sensor:");
                 Serial.print(message.sensor);
                 Serial.print(", New status: ");
                 Serial.println(message.getBool());
               } 
            }
            

            Good luck with it.

            b.t.w. I have no knowledge of openHab.

            E 1 Reply Last reply
            0
            • TheoLT TheoL

              You have a closing bracelet ({) too much that's ending your loop() method. I corrected it and added a comment so you can see what's been causing the problem.

              #include <MySensor.h>
              #include <SPI.h>
              #include <Bounce2.h>
              
              #define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
              #define RELAY_PIN2 5 //######## ADD THAT ######
              #define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
              #define BUTTON_PIN2 6 //######## ADD THAT ######
              #define CHILD_ID 1   // Id of the sensor child
              #define CHILD_ID2 2 //######## ADD THAT ######
              #define RELAY_ON 1
              #define RELAY_OFF 0
              
              Bounce debouncer = Bounce(); 
              Bounce debouncer2 = Bounce(); //######## ADD THAT ######
              int oldValue=0;
              int oldValue2=0; //######## ADD THAT ######
              bool state;
              bool state2; //######## ADD THAT ######
              MySensor gw;
              MyMessage msg(CHILD_ID,V_LIGHT);
              MyMessage msg2(CHILD_ID2,V_LIGHT); //######## ADD THAT ######
              
              void setup()  
              {  
                gw.begin(incomingMessage, AUTO, true);
              
                // Send the sketch version information to the gateway and Controller
                gw.sendSketchInfo("Relay & Button", "1.0");
              
               // Setup the button
                pinMode(BUTTON_PIN,INPUT);
                pinMode(BUTTON_PIN2,INPUT); //######## ADD THAT ######
                // Activate internal pull-up
                digitalWrite(BUTTON_PIN,HIGH);
                digitalWrite(BUTTON_PIN2,HIGH); //######## ADD THAT ######
                
                // After setting up the button, setup debouncer
                debouncer.attach(BUTTON_PIN);
                debouncer2.attach(BUTTON_PIN2); //######## ADD THAT ######
                debouncer.interval(5);
                debouncer2.interval(5);//######## ADD THAT ######
              
                // Register all sensors to gw (they will be created as child devices)
                gw.present(CHILD_ID, S_LIGHT);
                gw.present(CHILD_ID2, S_LIGHT);//######## ADD THAT ######
              
                // Make sure relays are off when starting up
                digitalWrite(RELAY_PIN, RELAY_OFF);
                digitalWrite(RELAY_PIN2, RELAY_OFF); //######## ADD THAT ######
                // Then set relay pins in output mode
                pinMode(RELAY_PIN, OUTPUT);
                pinMode(RELAY_PIN2, OUTPUT); //######## ADD THAT ######   
                    
                // Set relay to last known state (using eeprom storage) 
                state = gw.loadState(CHILD_ID);
                state2 = gw.loadState(CHILD_ID2); //######## ADD THAT ######
                digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
                digitalWrite(RELAY_PIN2, state2?RELAY_ON:RELAY_OFF); //######## ADD THAT ######
              }
              
              
              /*
              *  Example on how to asynchronously check for new messages from gw
              */
              void loop() 
              {
                gw.process();
                debouncer.update();
                debouncer2.update(); //######## ADD THAT ######
              
                // Get the update value
                int value = debouncer.read();
                if (value != oldValue && value==0) {
                    gw.send(msg.set(state?false:true), true); // Send new state and request ack back
                }
                oldValue = value;
              // }  <---- remove this bracelet it's closing the loop() method. Then your compiler sees an if statement that's not in a method, which is not allowed
              
                int value2 = debouncer2.read(); 
                if (value2 != oldValue && value==0) { 
                    gw.send(msg2.set(state?false:true), true); 
                }
                oldValue2 = value;
              }
               
              void incomingMessage(const MyMessage &message) {
                // We only expect one type of message from controller. But we better check anyway.
                if (message.isAck()) {
                   Serial.println("This is an ack from gateway");
                }
              
                if (message.type == V_LIGHT) {
                   // Change relay state
                   state = message.getBool();
                   if(message.sensor == 1) { //######## ADD THAT ######
                     digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
                     // Store state in eeprom
                     gw.saveState(CHILD_ID, state);
                   } else if(message.sensor == 2) { //######## ADD THAT ######
                     digitalWrite(RELAY_PIN2, state?RELAY_ON:RELAY_OFF); //######## ADD THAT ######
                     // Store state in eeprom ######## ADD THAT ######
                     gw.saveState(CHILD_ID2, state); //######## ADD THAT ######
                  }
                  
                   // Write some debug info
                   Serial.print("Incoming change for sensor:");
                   Serial.print(message.sensor);
                   Serial.print(", New status: ");
                   Serial.println(message.getBool());
                 } 
              }
              

              Good luck with it.

              b.t.w. I have no knowledge of openHab.

              E Offline
              E Offline
              ewgor
              wrote on last edited by
              #39

              @TheoL thanks man, I'll try it right now, thanks again.

              1 Reply Last reply
              0
              • E Offline
                E Offline
                ewgor
                wrote on last edited by ewgor
                #40

                Guys, i tried this sketch above and now it can be uploaded but its not working well.
                The system reacts like this: the first button ( old one) turns the led on / off on the breadboard but its not refreshing the OH button on the webpage and i get some i get some WARN on the server like this:

                2015-09-11 19:02:29.052 [WARN ] [.model.script.actions.BusEvent] - Item 'null' d
                oes not exist.
                Light Item: null Light: ON
                2015-09-11 19:02:29.073 [WARN ] [.model.script.actions.BusEvent] - Item 'null' d
                oes not exist.
                Light Item: null Light: ON
                2015-09-11 19:02:29.085 [WARN ] [.model.script.actions.BusEvent] - Item 'null' d
                oes not exist.
                Light Item: null Light: ON
                2015-09-11 19:02:30.701 [INFO ] [runtime.busevents             ] - Arduino state
                 updated to 0;0;3;0;9;read: 22-22-0 s=1,c=1,t=2,pt=2,l=2:0
                0;0;3;0;9;send: 0-0-22-22 s=1,c=1,t=2,pt=2,l=2,st=fail:0
                22;1;1;0;2;0
                0;0;3;0;9;read: 22-22-0 s=2,c=1,t=2,pt=2,l=2:0
                0;0;3;0;9;send: 0-0-22-22 s=2,c=1,t=2,pt=2,l=2,st=fail:0
                22;2;1;0;2;0
                0;0;3;0;9;read: 22-22-0 s=2,c=1,t=2,pt=2,l=2:0
                0;0;3;0;9;send: 0-0-22-22 s=2,c=1,t=2,pt=2,l=2,st=fail:0
                22;2;1;0;2;0
                0;0;3;0;9;read: 22-22-0 s=2,c=1,t=2,pt=2,l=2:0
                0;0;3;0;9;send: 0-0-22-22 s=2,c=1,t=2,pt=2,l=2,st=ok:0
                22;2;1;0;2;0
                
                2015-09-11 19:02:30.719 [WARN ] [.model.script.actions.BusEvent] - Item 'null' d
                oes not exist.
                Light Item: null Light: OFF
                2015-09-11 19:02:30.742 [WARN ] [.model.script.actions.BusEvent] - Item 'null' d
                oes not exist.
                Light Item: null Light: OFF
                2015-09-11 19:02:30.755 [WARN ] [.model.script.actions.BusEvent] - Item 'null' d
                oes not exist.
                Light Item: null Light: OFF
                2015-09-11 19:02:30.761 [WARN ] [.model.script.actions.BusEvent] - Item 'null' d
                oes not exist.
                Light Item: null Light: OFF
                

                I don't understand why i get so many things on the server pressing once on and once off!
                The second button is completely dead, it doesn't do anything on the breadboard or on the web.
                I think the Arduino sketch has some bugs somewhere even it can be compiled. Maybe something inside is wrong or maybe this is not the right way to multiply relays and buttons.
                Please see bellow my OH settings.
                Items:

                String Arduino "Arduino" { serial="COM4@115200" }
                Switch           lightBar01                          "Lumina dormitor"
                Switch           lightBar02                          "Lumina hol" 
                

                Sitemap:

                sitemap demo label="Acasa"
                {
                   Frame label="Lumini" {
                            Switch item=lightBar01 label="Lumina dormitor"
                			Switch item=lightBar02 label="Lumina hol"
                    }
                

                Rules:

                import org.openhab.core.library.types.*
                import org.openhab.core.persistence.*
                import org.openhab.model.script.actions.*
                import org.joda.time.*
                import java.util.*
                import org.eclipse.xtext.xbase.lib.*
                import org.openhab.core.items.*
                
                
                var String ArduinoUpdate = ""
                var String sketchName = ""
                
                var int V_TEMP = 0
                var int V_HUM = 1
                var int V_LIGHT = 2
                var int V_DIMMER = 3
                var int V_PRESSURE = 4
                var int V_FORECAST = 5
                var int V_RAIN = 6
                var int V_RAINRATE = 7
                var int V_WIND = 8
                var int V_GUST = 9
                var int V_DIRECTION = 10
                var int V_UV = 11
                var int V_WEIGHT = 12
                var int V_DISTANCE = 13
                var int V_IMPEDANCE = 14
                var int V_ARMED = 15
                var int V_TRIPPED = 16
                var int V_WATT = 17
                var int V_KWH = 18
                var int V_SCENE_ON = 19
                var int V_SCENE_OFF = 20
                var int V_HEATER = 21
                var int V_HEATER_SW = 22
                var int V_LIGHT_LEVEL = 23
                var int V_VAR1 = 24
                var int V_VAR2 = 25
                var int V_VAR3 = 26
                var int V_VAR4 = 27
                var int V_VAR5 = 28
                var int V_UP = 29
                var int V_DOWN = 30
                var int V_STOP = 31
                var int V_IR_SEND = 32
                var int V_IR_RECEIVE = 33
                var int V_FLOW = 34
                var int V_VOLUME = 35
                var int V_LOCK_STATUS = 36
                var int V_DUST_LEVEL = 37
                var int V_VOLTAGE = 38
                var int V_CURRENT = 39
                var int msgPresentation = 0
                var int msgSet = 1
                var int msgReq = 2
                var int msgInternal = 3
                var int msgStream = 4
                var int alarmArmor = 1
                
                // Internal Commands
                
                var int I_BATTERY_LEVEL = 0
                var int I_TIME = 1
                var int I_VERSION = 2
                var int I_ID_REQUEST = 3
                var int I_ID_RESPONSE = 4
                var int I_INCLUSION_MODE = 5
                var int I_CONFIG = 6
                var int I_FIND_PARENT = 7
                var int I_FIND_PARENT_RESPONSE = 8
                var int I_LOG_MESSAGE = 9
                var int I_CHILDREN = 10
                var int I_SKETCH_NAME = 11
                var int I_SKETCH_VERSION = 12
                var int I_REBOOT = 13
                var int I_GATEWAY_READY = 14
                
                // Mappings
                var HashMap<String, String> sensorToItemsMap = newLinkedHashMap(
                    "101;1;"            -> "lightBar01",    // looks good
                    "lightBar01"       -> "101;1;",
                	"101;2;"            -> "lightBar01",    // looks good
                    "lightBar02"       -> "101;2;"
                )
                    
                
                //receiving msg from mysensors gateway
                rule "Arduino sends to Openhab"
                    when
                        Item Arduino received update
                    then
                        var String lineBuffer =  Arduino.state.toString.split("\n")
                        for (String line : lineBuffer) {
                            var String[] message = line.split(";")
                            var Integer nodeId = new Integer(message.get(0))
                            var Integer childId = new Integer(message.get(1))
                            var Integer msgType = new Integer(message.get(2))
                            var Integer ack = new Integer(message.get(3))
                            var Integer subType = new Integer(message.get(4))
                            var String msg = message.get(5)
                            if(msgType == 1 ){
                                if (subType == V_LIGHT){
                                    var String state
                                    var Integer statusInt = new Integer(message.get(5))
                                    if(statusInt == 1) { 
                                        state = "ON"
                                        } 
                                    else { 
                                        state = "OFF" 
                                        }
                                    postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), state)
                                    println ("Light Item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " Light: " + state )
                                    }
                				if (subType == V_TEMP){
                                    postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), msg)
                                    println ("Temp item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " temp: " + msg )
                                    }
                				if (subType == V_HUM){
                                    postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), msg)
                                    println ("Hum item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " hum: " + msg )
                                    }
                                }    
                            // Internal Command
                            if(msgType == 3){
                                if(subType == I_SKETCH_NAME){
                                        println("Sketch name: " + msg )
                                        sketchName=msg
                                    }
                                if(subType == I_SKETCH_VERSION){
                                        println("Sketch version: " + msg )
                                        postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), sketchName+" " +msg )
                                        sketchName=""
                                    }
                                }
                            }   
                        }
                end
                rule "Light"
                        when
                                Item lightBar01 received command
                        then
                               if(receivedCommand == ON) {
                            sendCommand(Arduino, "101;1;1;0;2;1\n")
                        }
                        if(receivedCommand == OFF) {
                           sendCommand(Arduino, "101;1;1;0;2;0\n")
                        }
                end
                rule "Light"
                        when
                                Item lightBar02 received command
                        then
                               if(receivedCommand == ON) {
                            sendCommand(Arduino, "101;1;1;0;2;1\n")
                        }
                        if(receivedCommand == OFF) {
                           sendCommand(Arduino, "101;1;1;0;2;0\n")
                        }
                end
                
                

                Any suggestion will be kindly appreciated.
                Thanks!

                PS: I forgot to say that i added in the Arduino sketch the address of the node point:

                #define NODE_ID 101
                
                1 Reply Last reply
                0
                • E Offline
                  E Offline
                  ewgor
                  wrote on last edited by ewgor
                  #41

                  Hey guys, i found the solution here array-relay-button-actuator but now the OH part comes 'couse this is different solution. How can i add CHILD_ ID's in this case to create more buttons in OH? i mean how to make difference between the two relays in OH?

                  Can somebody please help me? This is what i was looking for.

                  Thanks :scream:

                  1 Reply Last reply
                  0
                  • E Offline
                    E Offline
                    ewgor
                    wrote on last edited by
                    #42

                    I see, i need to search for help on another forum ...
                    Many thanks to TimO who helped me a lot.

                    1 Reply Last reply
                    0
                    • dexterbotD Offline
                      dexterbotD Offline
                      dexterbot
                      wrote on last edited by
                      #43

                      Hello @ewgor, I follow you on another forum about this subject and are interested myself of this system. I found in the code you posted a small error - might this to be the problem.
                      Please let me your email address - I would like to talk about this topic

                      @ewgor said: Rules:

                      var HashMap<String, String> sensorToItemsMap = newLinkedHashMap(
                      "101;1;" -> "lightBar01", // looks good
                      "lightBar01" -> "101;1;",
                      "101;2;" -> "lightBar01", // <<<<<--------------------------HERE----------------:)
                      "lightBar02" -> "101;2;"
                      )

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


                      17

                      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