mesh_et_mqtt
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
mesh_et_mqtt [2020/04/06 12:48] – [La passerelle MQTT <--> MESH] BILLARD | mesh_et_mqtt [2020/10/29 13:58] (Version actuelle) – ↷ Liens modifiés en raison d'un déplacement. serge | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ===== Réseau MESH avec des ESP et MQtt ===== | + | ====== Réseau MESH avec des ESP et MQtt ====== |
L' | L' | ||
Ligne 5: | Ligne 5: | ||
La structure est la suivante : | La structure est la suivante : | ||
- | {{: | + | {{media_08: |
Choix du matériel. | Choix du matériel. | ||
Ligne 11: | Ligne 11: | ||
Pour ce faire j'ai opté pour l' | Pour ce faire j'ai opté pour l' | ||
//ESP8266 ESP-01 Module de relais WiFi 2 canaux Module de relais 2 canaux pour contrôleur d' | //ESP8266 ESP-01 Module de relais WiFi 2 canaux Module de relais 2 canaux pour contrôleur d' | ||
- | {{:: | + | {{media_03: |
Le programmateur utilisé est celui-ci : | Le programmateur utilisé est celui-ci : | ||
Ligne 39: | Ligne 39: | ||
Ce qui au niveau du code engendre ceci dans le setup() | Ce qui au niveau du code engendre ceci dans le setup() | ||
+ | < | ||
void setup() { | void setup() { | ||
delay(5000); | delay(5000); | ||
//INIT de la liaison série pour le controle des relais | //INIT de la liaison série pour le controle des relais | ||
Serial.begin(115200, | Serial.begin(115200, | ||
+ | </ | ||
| | ||
et pour la commande des relais là ou vous souhaitez dans le code, ici la fermeture du relais 1 : | et pour la commande des relais là ou vous souhaitez dans le code, ici la fermeture du relais 1 : | ||
+ | < | ||
Serial.write(0xA0); | Serial.write(0xA0); | ||
Serial.write(0x01); | Serial.write(0x01); | ||
Serial.write(0x01); | Serial.write(0x01); | ||
Serial.write(0xA2); | Serial.write(0xA2); | ||
+ | </ | ||
===== Le MESH ===== | ===== Le MESH ===== | ||
Ligne 65: | Ligne 69: | ||
Le gestionnaire de taches [[https:// | Le gestionnaire de taches [[https:// | ||
- | === Premiers usages === | + | |
===== Le MQtt ===== | ===== Le MQtt ===== | ||
Ligne 87: | Ligne 91: | ||
Ajout du dashboard dans Node-Red. | Ajout du dashboard dans Node-Red. | ||
+ | |||
+ | Exemple de flow pour Node-Red | ||
+ | |||
+ | {{ pliboo-02: | ||
+ | |||
+ | {{media_07: | ||
+ | |||
+ | Le fichier json pour Node-Red. | ||
+ | |||
+ | Un exemple de bouton poussoir Node-red avec changement de couleur et init à la mise sous-tension. | ||
+ | |||
+ | Illustration de boutons dynamique. | ||
+ | |||
+ | {{media_04: | ||
+ | |||
+ | **Reste à gérer les interaction entre les boutons, dans le cas d'une carte disposant de trois boutons R1/R2/R1 et 2 et la création d'un subflow paramétrable. Aide bienvenue -- MERCI** | ||
+ | |||
+ | < | ||
+ | [{" | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
La partie iptable n'est pas mise en oeuvre du fait d'un changement dans Buster [[https:// | La partie iptable n'est pas mise en oeuvre du fait d'un changement dans Buster [[https:// | ||
Ligne 103: | Ligne 133: | ||
Réalisée avec un ESP8266. | Réalisée avec un ESP8266. | ||
Doit se connecter au MESH et au Broker pour assurer la passerelle. | Doit se connecter au MESH et au Broker pour assurer la passerelle. | ||
- | Le code viendra ensuite. | + | <code> |
+ | // | ||
+ | // FICHIER DE FONCTIONNEMENT POUR ESP8266 COMME PONT | ||
+ | // | ||
+ | // MQTT BROKER <---> MESH | ||
+ | // | ||
+ | // François-Marie BILLARD | ||
+ | // | ||
+ | // Test à faire | ||
+ | // envoyer un message depuis BROKER (via NODE- RED) vers le MESH OK le 2 avril 2020 | ||
+ | // | ||
+ | // envoyer un message depuis MESH vers BROKER : OK le 2 avril 2020 | ||
+ | // | ||
+ | // | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # | ||
+ | # | ||
+ | |||
+ | #define HOSTNAME " | ||
+ | |||
+ | // Prototypes | ||
+ | void receivedCallback( const uint32_t &from, const String &msg ); | ||
+ | void mqttCallback(char* topic, byte* payload, unsigned int length); | ||
+ | |||
+ | IPAddress getlocalIP(); | ||
+ | |||
+ | IPAddress myIP(0, | ||
+ | IPAddress mqttBroker(192, | ||
+ | boolean ErreurBroker = true; | ||
+ | |||
+ | |||
+ | painlessMesh | ||
+ | WiFiClient wifiClient; | ||
+ | PubSubClient mqttClient(mqttBroker, | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(115200); | ||
+ | |||
+ | mesh.setDebugMsgTypes( ERROR | STARTUP | CONNECTION ); // set before init() so that you can see startup messages | ||
+ | |||
+ | // Channel set to 6. Make sure to use the same channel for your mesh and for you other | ||
+ | // network (STATION_SSID) | ||
+ | mesh.init( MESH_PREFIX, | ||
+ | mesh.onReceive(& | ||
+ | |||
+ | mesh.stationManual(STATION_SSID, | ||
+ | mesh.setHostname(HOSTNAME); | ||
+ | |||
+ | // Bridge node, should (in most cases) be a root node. See [the wiki](https:// | ||
+ | mesh.setRoot(true); | ||
+ | // This node and all other nodes should ideally know the mesh contains a root, so call this on all nodes | ||
+ | mesh.setContainsRoot(true); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | mesh.update(); | ||
+ | mqttClient.loop(); | ||
+ | |||
+ | | ||
+ | | ||
+ | if (myIP != getlocalIP()) { //pas d' | ||
+ | myIP = getlocalIP(); | ||
+ | if (!mqttClient.connected() ) { //pas de connexion au Broker | ||
+ | if (mqttClient.connect(" | ||
+ | // si connexion établie | ||
+ | mqttClient.publish(" | ||
+ | mqttClient.subscribe(" | ||
+ | ErreurBroker= false; | ||
+ | } | ||
+ | else { | ||
+ | ErreurBroker= true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //ajout d'une gestion de la deconnexion. | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | //Reception depuis le MESH renvoi vers le MQTT | ||
+ | void receivedCallback( const uint32_t &from, const String &msg ) { | ||
+ | Serial.printf(" | ||
+ | String topic = " | ||
+ | mqttClient.publish(topic.c_str(), | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | |||
+ | // Cette fonction va renvoyer sur le MESH les messages en provenance du BRIDGE | ||
+ | |||
+ | // | ||
+ | |||
+ | void mqttCallback(char* topic, uint8_t* payload, unsigned int length) { | ||
+ | char* cleanPayload = (char*)malloc(length+1); | ||
+ | payload[length] = ' | ||
+ | memcpy(cleanPayload, | ||
+ | String msg = String(cleanPayload); | ||
+ | free(cleanPayload); | ||
+ | |||
+ | String targetStr = String(topic).substring(16); | ||
+ | |||
+ | if(targetStr == " | ||
+ | { | ||
+ | if(msg == " | ||
+ | { // renvoi les informations sur les noeuds connectés si | ||
+ | // message est envoyé au TOPIC / | ||
+ | auto nodes = mesh.getNodeList(true); | ||
+ | String str; | ||
+ | for (auto && | ||
+ | str += String(id) + String(" | ||
+ | mqttClient.publish(" | ||
+ | } | ||
+ | } | ||
+ | else if(targetStr == " | ||
+ | { | ||
+ | mesh.sendBroadcast(msg); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | uint32_t target = strtoul(targetStr.c_str(), | ||
+ | if(mesh.isConnected(target)) | ||
+ | { | ||
+ | mesh.sendSingle(target, | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | mqttClient.publish(" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | IPAddress getlocalIP() { | ||
+ | return IPAddress(mesh.getStationIP()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Noeud du MESH ===== | ||
+ | |||
+ | Réalisée avec un ESP8266 avec deux relais dans mon cas. | ||
+ | Doit se connecter au MESH de manière automatique. | ||
+ | |||
+ | L' | ||
+ | |||
+ | La fonction **receivedCallback** est appelé en cas de reception d'un message en provenance du MESH. | ||
+ | |||
+ | L' | ||
+ | |||
+ | |||
+ | |||
+ | |||
< | < | ||
// | // | ||
Ligne 312: | Ligne 502: | ||
} | } | ||
</ | </ | ||
- | ===== Noeud du MESH ===== | ||
- | |||
- | Réalisée avec un ESP8266 avec deux relais dans mon cas. | ||
- | Doit se connecter au MESH de manière automatique. | ||
- | |||
- | L' | ||
- | |||
- | La fonction **receivedCallback** est appelé en cas de reception d'un message en provenance du MESH. | ||
- | |||
- | L' | ||
- | |||
- | |||
- | |||
- | |||
- | Le code viendra ensuite. | ||
{{tag> | {{tag> |
mesh_et_mqtt.1586177334.txt.gz · Dernière modification : 2020/04/06 12:48 de BILLARD