You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

my_MQTT.h 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // MQTT client
  2. #include <PubSubClient.h>
  3. #define mqtt_broker "192.168.0.11"
  4. #define topic_temperature "sensor/temperature" //Topic température
  5. #define topic_batterie "sensor/batterie" //Topic batterie
  6. #define MQTT_user ""
  7. #define MQTT_password ""
  8. // DEFINITION DES TOPICS POUR CE MODULE -------------------------------------------
  9. char topic_lumiere[8 + EEPROM_DEVICEID_SIZE];
  10. char topic_lumiere_color[8 + 6 + EEPROM_DEVICEID_SIZE];
  11. char topic_lumiere_bright[8 + 11 + EEPROM_DEVICEID_SIZE];
  12. char topic_lumiere_anim[8 + 10 + EEPROM_DEVICEID_SIZE];
  13. WiFiClient espClient;
  14. PubSubClient clientMQTT(espClient); // Definition du client MQTT
  15. char g_CHAR_messageBuff[100];
  16. // --------------------------------------------------------------------------------
  17. // Envoie un message sur le canal de debug MQTT.
  18. //
  19. void MQTT_publishDebug(String message){
  20. strcpy( g_CHAR_messageBuff, "/hardware/debug/MQTT-leds-color/"); // Initialisation de <g_CHAR_messageBuff> avec lce topic
  21. strcat( g_CHAR_messageBuff, HostName); // Concatenation de l'ID du hostname
  22. // Publicaiton du message
  23. clientMQTT.publish(g_CHAR_messageBuff,message.c_str() );
  24. }
  25. // --------------------------------------------------------------------------------
  26. // Envoi les mesures ("data") passées en paramètre au brocker MQTT.
  27. // L'envoie se fait sous la forme :
  28. // sensor/temperature/<sensorID>/<value>
  29. // avec "sensor/temperature qui est dans le parametre p_CHAR_topic
  30. //
  31. // @param moduleID : L'identifiant du thermometre défini dans FIBARO
  32. // @param data : la valeur de la mesure.
  33. // @p_CHAR_topic : un char pointant sur la chaine contenant le nom du topic dans lequel on veut publier
  34. //
  35. void MQTT_publishDataToMQTT(String moduleID, String value, char *p_CHAR_topic) {
  36. // Creation du topic (on rajoute un / suivi de l'ID du sensor)
  37. String topic = "/" + moduleID;
  38. char buff[20];
  39. topic.toCharArray(buff, 20); // On met le topic dans la variable char buff
  40. // Construction du char contenant le topic pour ce module
  41. strcpy( g_CHAR_messageBuff, p_CHAR_topic); // Initialisation de <g_CHAR_messageBuff> avec ler topic qui est passé en paramètre
  42. strcat( g_CHAR_messageBuff, buff); // Concatenation de temperature_topic + buff
  43. // Publication de la temperature dans le topic
  44. DEBUG("Publication d'un message sur le topic :");
  45. DEBUG(g_CHAR_messageBuff);
  46. clientMQTT.publish(g_CHAR_messageBuff, String(value).c_str() );
  47. }
  48. // --------------------------------------------------------------------------------
  49. // Reconnexion au serveur MQTT
  50. //
  51. void MQTT_connect() {
  52. //Boucle jusqu'à obtenir une reconnexion
  53. while (!clientMQTT.connected()) {
  54. Serial.print("Connexion au serveur MQTT...");
  55. MQTT_publishDebug(" Connexion au serveur MQTT...");
  56. // ON arrive à se conecter au brocker MQTT
  57. if (clientMQTT.connect(HostName, MQTT_user, MQTT_password)) {
  58. DEBUG("OK");
  59. MQTT_publishDebug(" OK");
  60. // Connection au brocker MQTT ratée
  61. } else {
  62. Serial.print("KO, erreur : ");
  63. Serial.println(clientMQTT.state());
  64. DEBUG(" On attend 5 secondes avant de recommencer");
  65. MQTT_publishDebug( "... Connection impossible. On attend 5 secondes avant de recommencer\nErreur connection = " + String(clientMQTT.state()) );
  66. delay(5000);
  67. }
  68. }
  69. // Souscription aux topics
  70. clientMQTT.subscribe("lumiere/#");
  71. MQTT_publishDebug("Abonnement au topic MQTT lumiere/#");
  72. }
  73. // --------------------------------------------------------------------------------
  74. // Déclenche les actions à la réception d'un message MQTT.
  75. // lumiere/portal [ON|OFF] : Allumage de la barre de LEDS.
  76. // lumiere/portal/color [#RRVVBB] : Changement de couleur des LEDS.
  77. // lumiere/portal/animation [1/2/3/4/5] : Animation des LEDS.
  78. //
  79. void MQTT_callback(char* topic, byte* payload, unsigned int length) {
  80. // create character buffer with ending null terminator (string)
  81. char message[100];
  82. unsigned int i;
  83. for ( i = 0; i < length; i++) {
  84. message[i] = payload[i];
  85. }
  86. message[i] = '\0';
  87. // Traitement des topics
  88. // ................................................................................
  89. if ( strcmp( topic, topic_lumiere ) ==0 ) {
  90. DEBUG("Detection du topics :" + String( topic_lumiere ));
  91. if ( String( message ) == "ON") {
  92. DEBUG("Allumage les leds");
  93. MQTT_publishDebug("MQTT_callback> Allumage les leds ");
  94. LED_colorWipe(strip.Color(0, 0, 255), 20);
  95. } else if ( String( message ) == "OFF") {
  96. DEBUG("Extinction des leds");
  97. MQTT_publishDebug("MQTT_callback> Extinction les leds ");
  98. LED_colorWipe(strip.Color(0, 0, 0), 20);
  99. }
  100. g_BOO_AnimationSeconde = false;
  101. // ................................................................................
  102. } else if ( strcmp( topic, topic_lumiere_color) == 0) {
  103. DEBUG("Detection du topics :" + String( topic_lumiere_color ));
  104. // Test si on a une couleur RGB dans le message
  105. if ( LED_isAColor( message ) ) {
  106. // Définition de la couleur
  107. Couleur c;
  108. c = LED_ExtractRVB( message );
  109. DEBUG("Affichage de la couleur : " + String(c.R) + " " + String(c.V) + " " + String(c.B));
  110. MQTT_publishDebug("MQTT_callback> Affichage de la couleur : " + String(c.R) + " " + String(c.V) + " " + String(c.B));
  111. // Changemnt des LEDS avec la couleur
  112. LED_colorWipe(strip.Color(c.R, c.V, c.B), 20);
  113. }
  114. // ................................................................................
  115. } else if ( strcmp( topic, topic_lumiere_bright) == 0 ) {
  116. DEBUG("Detection du topics :" + String( topic_lumiere_bright ));
  117. // Test si on a bien une valeur numérique
  118. if ( LED_isADigit( message ) ) {
  119. DEBUG("Luminosite : " + String( message ));
  120. MQTT_publishDebug("MQTT_callback> Luminosite : " + String( message ));
  121. strip.setBrightness( String( message ).toInt() % 255 );
  122. strip.show();
  123. }
  124. // ................................................................................
  125. } else if ( strcmp( topic, topic_lumiere_anim) ==0 ) {
  126. DEBUG("Detection du topics :" + String( topic_lumiere_anim ));
  127. DEBUG("Lancement de l'Animation avec le parametre :" + String( message ));
  128. MQTT_publishDebug("MQTT_callback> Lancement de l'Animation avec le parametre :" + String( message ));
  129. LED_Animation(String( message ).toInt());
  130. }
  131. }
  132. // --------------------------------------------------------------------------------
  133. // Initialisation du brocker MQTT.
  134. //
  135. void MQTT_setup(){
  136. // Création du client MQTT
  137. clientMQTT.setServer(mqtt_broker, 1883); // Configuration de la connexion au serveur MQTT
  138. clientMQTT.setCallback(MQTT_callback); // La fonction de callback qui est executée à chaque réception de message
  139. // Connection au Brocker MQTT
  140. MQTT_connect();
  141. // Construction des topcs auxquels s'abonner.
  142. sprintf( topic_lumiere, "lumiere/%s", DeviceID);
  143. sprintf( topic_lumiere_color, "lumiere/color/%s", DeviceID);
  144. sprintf( topic_lumiere_bright, "lumiere/brightness/%s", DeviceID);
  145. sprintf( topic_lumiere_anim, "lumiere/animation/%s", DeviceID);
  146. }