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