202 lines
7.0 KiB
C
202 lines
7.0 KiB
C
// 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);
|
|
}
|