123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- // MQTT client
- #include <PubSubClient.h>
- #define mqtt_broker "192.168.0.11"
- #define topic_temperature "sensor/temperature" //Topic température
- #define topic_batterie "sensor/batterie" //Topic batterie
- #define MQTT_user ""
- #define MQTT_password ""
-
-
-
-
- // DEFINITION DES TOPICS POUR CE MODULE -------------------------------------------
- char topic_lumiere[8 + EEPROM_DEVICEID_SIZE];
- char topic_lumiere_color[8 + 6 + EEPROM_DEVICEID_SIZE];
- char topic_lumiere_bright[8 + 11 + EEPROM_DEVICEID_SIZE];
- char topic_lumiere_anim[8 + 10 + EEPROM_DEVICEID_SIZE];
-
-
-
- WiFiClient espClient;
- PubSubClient clientMQTT(espClient); // Definition du client MQTT
-
-
- char g_CHAR_messageBuff[100];
-
-
-
-
- // --------------------------------------------------------------------------------
- // Envoie un message sur le canal de debug MQTT.
- //
- void MQTT_publishDebug(String message){
- strcpy( g_CHAR_messageBuff, "/hardware/debug/MQTT-leds-color/"); // Initialisation de <g_CHAR_messageBuff> avec lce topic
- strcat( g_CHAR_messageBuff, HostName); // Concatenation de l'ID du hostname
-
- // Publicaiton du message
- clientMQTT.publish(g_CHAR_messageBuff,message.c_str() );
- }
-
-
- // --------------------------------------------------------------------------------
- // Envoi les mesures ("data") passées en paramètre au brocker MQTT.
- // L'envoie se fait sous la forme :
- // sensor/temperature/<sensorID>/<value>
- // avec "sensor/temperature qui est dans le parametre p_CHAR_topic
- //
- // @param moduleID : L'identifiant du thermometre défini dans FIBARO
- // @param data : la valeur de la mesure.
- // @p_CHAR_topic : un char pointant sur la chaine contenant le nom du topic dans lequel on veut publier
- //
- void MQTT_publishDataToMQTT(String moduleID, String value, char *p_CHAR_topic) {
- // Creation du topic (on rajoute un / suivi de l'ID du sensor)
- String topic = "/" + moduleID;
- char buff[20];
- topic.toCharArray(buff, 20); // On met le topic dans la variable char buff
-
- // Construction du char contenant le topic pour ce module
- strcpy( g_CHAR_messageBuff, p_CHAR_topic); // Initialisation de <g_CHAR_messageBuff> avec ler topic qui est passé en paramètre
- strcat( g_CHAR_messageBuff, buff); // Concatenation de temperature_topic + buff
-
- // Publication de la temperature dans le topic
- DEBUG("Publication d'un message sur le topic :");
- DEBUG(g_CHAR_messageBuff);
-
- clientMQTT.publish(g_CHAR_messageBuff, String(value).c_str() );
- }
-
-
-
-
- // --------------------------------------------------------------------------------
- // Reconnexion au serveur MQTT
- //
- void MQTT_connect() {
- //Boucle jusqu'à obtenir une reconnexion
- while (!clientMQTT.connected()) {
- Serial.print("Connexion au serveur MQTT...");
- MQTT_publishDebug(" Connexion au serveur MQTT...");
-
- // ON arrive à se conecter au brocker MQTT
- if (clientMQTT.connect(HostName, MQTT_user, MQTT_password)) {
- DEBUG("OK");
- MQTT_publishDebug(" OK");
-
- // Connection au brocker MQTT ratée
- } else {
- Serial.print("KO, erreur : ");
- Serial.println(clientMQTT.state());
- DEBUG(" On attend 5 secondes avant de recommencer");
- MQTT_publishDebug( "... Connection impossible. On attend 5 secondes avant de recommencer\nErreur connection = " + String(clientMQTT.state()) );
- delay(5000);
- }
- }
-
- // Souscription aux topics
- clientMQTT.subscribe("lumiere/#");
- MQTT_publishDebug("Abonnement au topic MQTT lumiere/#");
- }
-
-
-
-
-
- // --------------------------------------------------------------------------------
- // Déclenche les actions à la réception d'un message MQTT.
- // lumiere/portal [ON|OFF] : Allumage de la barre de LEDS.
- // lumiere/portal/color [#RRVVBB] : Changement de couleur des LEDS.
- // lumiere/portal/animation [1/2/3/4/5] : Animation des LEDS.
- //
- void MQTT_callback(char* topic, byte* payload, unsigned int length) {
-
- // create character buffer with ending null terminator (string)
- char message[100];
- unsigned int i;
- for ( i = 0; i < length; i++) {
- message[i] = payload[i];
- }
- message[i] = '\0';
-
-
-
-
- // Traitement des topics
- // ................................................................................
- if ( strcmp( topic, topic_lumiere ) ==0 ) {
- DEBUG("Detection du topics :" + String( topic_lumiere ));
-
- if ( String( message ) == "ON") {
- DEBUG("Allumage les leds");
- MQTT_publishDebug("MQTT_callback> Allumage les leds ");
- LED_colorWipe(strip.Color(0, 0, 255), 20);
-
- } else if ( String( message ) == "OFF") {
- DEBUG("Extinction des leds");
- MQTT_publishDebug("MQTT_callback> Extinction les leds ");
- LED_colorWipe(strip.Color(0, 0, 0), 20);
- }
-
- g_BOO_AnimationSeconde = false;
-
-
- // ................................................................................
- } else if ( strcmp( topic, topic_lumiere_color) == 0) {
- DEBUG("Detection du topics :" + String( topic_lumiere_color ));
-
- // Test si on a une couleur RGB dans le message
- if ( LED_isAColor( message ) ) {
- // Définition de la couleur
- Couleur c;
- c = LED_ExtractRVB( message );
- DEBUG("Affichage de la couleur : " + String(c.R) + " " + String(c.V) + " " + String(c.B));
- MQTT_publishDebug("MQTT_callback> Affichage de la couleur : " + String(c.R) + " " + String(c.V) + " " + String(c.B));
-
-
- // Changemnt des LEDS avec la couleur
- LED_colorWipe(strip.Color(c.R, c.V, c.B), 20);
- }
-
- // ................................................................................
- } else if ( strcmp( topic, topic_lumiere_bright) == 0 ) {
- DEBUG("Detection du topics :" + String( topic_lumiere_bright ));
-
- // Test si on a bien une valeur numérique
- if ( LED_isADigit( message ) ) {
- DEBUG("Luminosite : " + String( message ));
- MQTT_publishDebug("MQTT_callback> Luminosite : " + String( message ));
- strip.setBrightness( String( message ).toInt() % 255 );
- strip.show();
- }
-
-
- // ................................................................................
- } else if ( strcmp( topic, topic_lumiere_anim) ==0 ) {
- DEBUG("Detection du topics :" + String( topic_lumiere_anim ));
- DEBUG("Lancement de l'Animation avec le parametre :" + String( message ));
- MQTT_publishDebug("MQTT_callback> Lancement de l'Animation avec le parametre :" + String( message ));
- LED_Animation(String( message ).toInt());
- }
- }
-
-
-
- // --------------------------------------------------------------------------------
- // Initialisation du brocker MQTT.
- //
- void MQTT_setup(){
- // Création du client MQTT
- clientMQTT.setServer(mqtt_broker, 1883); // Configuration de la connexion au serveur MQTT
- clientMQTT.setCallback(MQTT_callback); // La fonction de callback qui est executée à chaque réception de message
-
-
- // Connection au Brocker MQTT
- MQTT_connect();
-
-
- // Construction des topcs auxquels s'abonner.
- sprintf( topic_lumiere, "lumiere/%s", DeviceID);
- sprintf( topic_lumiere_color, "lumiere/color/%s", DeviceID);
- sprintf( topic_lumiere_bright, "lumiere/brightness/%s", DeviceID);
- sprintf( topic_lumiere_anim, "lumiere/animation/%s", DeviceID);
- }
|