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. OpenHAB
  4. MQTT - OpenHAB - Mysensor Library -> How to subscribe?

MQTT - OpenHAB - Mysensor Library -> How to subscribe?

Scheduled Pinned Locked Moved OpenHAB
2 Posts 1 Posters 2.3k Views 1 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.
  • siodS Offline
    siodS Offline
    siod
    wrote on last edited by
    #1

    Hi guys,

    I am trying to control my RGB LED Strip behind my TV using Open HAB! The Hardware part using an arduino is done and working, now I am trying to control the arduino using OpenHAB and MQTT but I am very new to MQTT...
    So, I know I could subscribe to a topic if I would use a mosquitto Server (what I don´t have because I am using the MySensors MQTT Gateway) and it would look sth. like this in Openhab:

    {mqtt=">[localbroker:/openHAB/Nachtlicht/RED:state:*:default]"}
    

    so here I would subscribe to a special topic, but how could I achieve this with the MySensors library?

    And one more thing: If I have an arduino then it would get an NodeID, but the attached sensors (Light Sensor, Humidity sensor...) would need a childID (one ID for each sensor)!?

    Thanks for your help!!

    still learning...

    1 Reply Last reply
    0
    • siodS Offline
      siodS Offline
      siod
      wrote on last edited by siod
      #2

      I would like to post my code here, but it´s actually not my code but the code from this website:
      link
      I am trying to make it MySensors MQTT Gateway compatible and I am not making any progress right now and need you help. First of all I would like to post the original arduino code from the above mentioned website:

      #include <SPI.h>
      #include <Ethernet.h>
      #include <PubSubClient.h> // http://knolleary.net/arduino-client-for-mqtt/
       
      // MAC Adresse des Ethernet Shields
      byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
      // IP des MQTT Servers
      byte server[] = { 192, 168, 2, 9 };
      // Ethernet Client zur Kommunikation des MQTT Clients
      EthernetClient ethClient;
      // MQTT Client zur Kommunikation mit dem Server
      // Server - Variable des Types byte mit Serveradresse
      // 1883 - Ist der Standard TCP Port
      // callback - Function wird aufgerufen wen MQTT Nachrichten eintreffen. Am ende des Sketches
      // ethClient - Angabe des Ethernet Clients
      PubSubClient mqttClient(server, 1883, callback, ethClient);
       
      // Timervariable für eine Verzögerung. Als alternative zu delay was die verarbeitung anhält.
      int timer = 0;
      int EndTimer = 200; 
       
      // Pins des RGB LED Strip
      int LEDred=5;
      int LEDgreen=6;
      int LEDblue=3;
       
      // Übermittelte Farbwerte
      int LEDredValue = 0;
      int LEDgreenValue = 0;
      int LEDblueValue = 0;
       
      // Gerade gesetzte Farbe
      int CURredValue = 0;
      int CURgreenValue = 0;
      int CURblueValue = 0;
       
      void setup()
      {
       // Setzen der PINS als Ausgang
       pinMode(LEDblue, OUTPUT);
       pinMode(LEDred, OUTPUT);
       pinMode(LEDgreen, OUTPUT);
       
       // Bei start Farbe Blau setzen
       analogWrite(LEDred, 0);
       analogWrite(LEDgreen, 0);
       analogWrite(LEDblue, 100);
       
       // Initialisierung des Ethernets
       if (Ethernet.begin(mac) == 0) {
       // Wenn DHCP fehlschlägt dann rot setzen und aufhören
       analogWrite(LEDred, 100);
       analogWrite(LEDgreen, 0);
       analogWrite(LEDblue, 0);
       while (true);
       }
       else {
       // Wenn DHCP OK ist dann grün setzen
       LEDgreenValue = 100;
       }
       
      }
       
      void loop()
      {
       // Aufbau der Verbindung mit MQTT falls diese nicht offen ist.
       if (!mqttClient.connected()) {
       mqttClient.connect("arduinoClient");
       // Abonieren von Nachrichten mit dem angegebenen Topics
       mqttClient.subscribe("/openHAB/Nachtlicht/RED/#");
       mqttClient.subscribe("/openHAB/Nachtlicht/GREEN/#");
       mqttClient.subscribe("/openHAB/Nachtlicht/BLUE/#");
       
       // Alternative Abonierung aller Topics unter /openHAB/Nachtlicht
       // mqttClient.subscribe("/openHAB/Nachtlicht/#");
       }
       
       if (timer <= EndTimer) timer++;
       else {
       timer = 0;
       
       if (LEDredValue < CURredValue) CURredValue--;
       else if (LEDredValue > CURredValue) CURredValue++;
       
       if (LEDgreenValue < CURgreenValue) CURgreenValue--;
       else if (LEDgreenValue > CURgreenValue) CURgreenValue++;
       
       if (LEDblueValue < CURblueValue) CURblueValue--;
       else if (LEDblueValue > CURblueValue) CURblueValue++;
       }
       
       analogWrite(LEDred, CURredValue);
       analogWrite(LEDgreen, CURgreenValue);
       analogWrite(LEDblue, CURblueValue);
       
       mqttClient.loop(); // Schleife für MQTT
       
      }
       
      // ===========================================================
      // Callback Funktion von MQTT. Die Funktion wird aufgerufen
      // wenn ein Wert empfangen wurde.
      // ===========================================================
      void callback(char* topic, byte* payload, unsigned int length) {
       // Zähler
       int i = 0;
       // Hilfsvariablen für die Convertierung der Nachricht in ein String
       char message_buff[100];
       
       // Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0
       for(i=0; i<length; i++) {
       message_buff[i] = payload[i];
       }
       message_buff[i] = '\0';
       
       // Konvertierung der nachricht in ein String
       String msgString = String(message_buff);
       
       // Überprüfung des Topis und setzen der Farbe je nach übermittelten Topic
       if (String(topic) == "/openHAB/Nachtlicht/RED") LEDredValue = round(msgString.toInt() * 2.55);
       if (String(topic) == "/openHAB/Nachtlicht/GREEN") LEDgreenValue = round(msgString.toInt() * 2.55);
       if (String(topic) == "/openHAB/Nachtlicht/BLUE") LEDblueValue = round(msgString.toInt() * 2.55);
      }
      

      and here follows my "modified" part. I hope you guys can support me here!

      #include <MySensor.h> 
      #include <SPI.h>
       
      // Timervariable für eine Verzögerung. Als alternative zu delay was die verarbeitung anhält.
      int timer = 0;
      int EndTimer = 200; 
       
      // Pins des RGB LED Strip
      int LEDred=3;
      int LEDgreen=4;
      int LEDblue=2;
       
      // Übermittelte Farbwerte
      int LEDredValue = 0;
      int LEDgreenValue = 0;
      int LEDblueValue = 0;
       
      // Gerade gesetzte Farbe
      int CURredValue = 0;
      int CURgreenValue = 0;
      int CURblueValue = 0;
      
      MySensor gw;
      MyMessage dimmerMsg(21, V_DIMMER); //21=Sensor ID 21, Dimmer; An/Aus
      MyMessage lightMsgR(22, V_LIGHT);  //21=Sensor ID 21, Rot
      MyMessage lightMsgG(23, V_LIGHT);  //21=Sensor ID 21, Grün
      MyMessage lightMsgB(24, V_LIGHT);  //21=Sensor ID 21, Blau
      
      void setup()
      {
       //MySensors Library initialisieren 
        gw.begin();
       //Sensor ID und Typ übermitteln 
        gw.present(21, S_DIMMER);
        gw.present(22, V_LIGHT);
        gw.present(23, V_LIGHT);
        gw.present(24, V_LIGHT);
       // Setzen der PINS als Ausgang
       pinMode(LEDblue, OUTPUT);
       pinMode(LEDred, OUTPUT);
       pinMode(LEDgreen, OUTPUT);
       
       // Bei start Farbe Blau setzen
       analogWrite(LEDred, 0);
       analogWrite(LEDgreen, 0);
       analogWrite(LEDblue, 100);
       
        
      }
       
      void loop()
      {
       // Abonieren von Nachrichten mit dem angegebenen Topics
       mqttClient.subscribe("/openHAB/Nachtlicht/RED/#");
       mqttClient.subscribe("/openHAB/Nachtlicht/GREEN/#");
       mqttClient.subscribe("/openHAB/Nachtlicht/BLUE/#");
       }
       
       if (timer <= EndTimer) timer++;
       else {
       timer = 0;
       
       if (LEDredValue < CURredValue) CURredValue--;
       else if (LEDredValue > CURredValue) CURredValue++;
       
       if (LEDgreenValue < CURgreenValue) CURgreenValue--;
       else if (LEDgreenValue > CURgreenValue) CURgreenValue++;
       
       if (LEDblueValue < CURblueValue) CURblueValue--;
       else if (LEDblueValue > CURblueValue) CURblueValue++;
       }
       
       analogWrite(LEDred, CURredValue);
       analogWrite(LEDgreen, CURgreenValue);
       analogWrite(LEDblue, CURblueValue);
       
       mqttClient.loop(); // Schleife für MQTT
       
      }
       
      // ===========================================================
      // Callback Funktion von MQTT. Die Funktion wird aufgerufen
      // wenn ein Wert empfangen wurde.
      // ===========================================================
      void callback(char* topic, byte* payload, unsigned int length) {
       // Zähler
       int i = 0;
       // Hilfsvariablen für die Convertierung der Nachricht in ein String
       char message_buff[100];
       
       // Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0
       for(i=0; i<length; i++) {
       message_buff[i] = payload[i];
       }
       message_buff[i] = '\0';
       
       // Konvertierung der nachricht in ein String
       String msgString = String(message_buff);
       
       // Überprüfung des Topis und setzen der Farbe je nach übermittelten Topic
       if (String(topic) == "/openHAB/Nachtlicht/RED") LEDredValue = round(msgString.toInt() * 2.55);
       if (String(topic) == "/openHAB/Nachtlicht/GREEN") LEDgreenValue = round(msgString.toInt() * 2.55);
       if (String(topic) == "/openHAB/Nachtlicht/BLUE") LEDblueValue = round(msgString.toInt() * 2.55);
      }
      

      I added LED Red, Green and Blue and set child ID´s to 22,23 and 24, 21 is for Dimmer. I have no idea if this done the right way

      MyMessage dimmerMsg(21, V_DIMMER); //21=Sensor ID 21, Dimmer; An/Aus
      MyMessage lightMsgR(22, V_LIGHT);  //21=Sensor ID 21, Rot
      MyMessage lightMsgG(23, V_LIGHT);  //21=Sensor ID 21, Grün
      MyMessage lightMsgB(24, V_LIGHT);  //21=Sensor ID 21, Blau
      

      especially the following part is a big problem to me because I don´t know how to "subscribe" with the MySensors MQTT library:

      void loop()
      {
       // Abonieren von Nachrichten mit dem angegebenen Topics
       mqttClient.subscribe("/openHAB/Nachtlicht/RED/#");
       mqttClient.subscribe("/openHAB/Nachtlicht/GREEN/#");
       mqttClient.subscribe("/openHAB/Nachtlicht/BLUE/#");
       }
      

      how must I modify this??

      still learning...

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


      28

      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