{"id":3155,"date":"2022-08-26T10:01:48","date_gmt":"2022-08-26T08:01:48","guid":{"rendered":"https:\/\/miniprojets.net\/?p=3155"},"modified":"2025-05-09T13:59:04","modified_gmt":"2025-05-09T11:59:04","slug":"conception-dun-dispositif-de-collecte-de-donnees-par-mqtt","status":"publish","type":"post","link":"https:\/\/miniprojets.net\/index.php\/2022\/08\/26\/conception-dun-dispositif-de-collecte-de-donnees-par-mqtt\/","title":{"rendered":"Conception d&#8217;un dispositif de collecte de donn\u00e9es par MQTT"},"content":{"rendered":"\n<p>Bonjour \u00e0 tous,<\/p>\n\n\n\n<p>Aujourd&#8217;hui, pour mon second article, je vais vous pr\u00e9senter les r\u00e9sultats de mes travaux effectu\u00e9s dans le cadre de mon stage de fin d&#8217;\u00e9tudes au G2Elab. Ces travaux portent sur la miniaturisation d&#8217;un dispositif de collecte et d&#8217;envoi de donn\u00e9es \u00e0 l&#8217;aide d&#8217;une carte Wemos D1 mini.<\/p>\n\n\n\n<p>Ce projet open source est support\u00e9 par les entit\u00e9s suivantes CNRS\/UGA\/G-INP \u2013 G2ELAB dans le cadre de l\u2019Observatoire de la Transistion Energ\u00e9tique.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"706\" height=\"150\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/07\/Logo-article.png\" alt=\"\" class=\"wp-image-2984\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/07\/Logo-article.png 706w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/07\/Logo-article-300x64.png 300w\" sizes=\"auto, (max-width: 706px) 100vw, 706px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">1. Liste des composants<\/h2>\n\n\n\n<p>Dans le cadre de la production d&#8217;\u00e9nergie verte de particulier, la r\u00e9insertion dans le r\u00e9seau de cette \u00e9nergie est un enjeu important. Ce processus a pour but de permettre l&#8217;\u00e9change d\u2019\u00e9nergie entre particuliers et ainsi de r\u00e9aliser des \u00e9conomies. Le G2ELab a ainsi con\u00e7u un dispositif permettant de relier la production d&#8217;un particulier vers un r\u00e9seau \u00e9lectrique intelligent : l&#8217;Energy Box.<\/p>\n\n\n\n<p>Une Energy Box a pour but de piloter une charge de mani\u00e8re \u00e0 optimiser sa consommation. Pour cela, le dispositif collecte des donn\u00e9es sur l\u2019\u00e9tat du r\u00e9seau et l\u2019\u00e9tat de la charge et indique ainsi \u00e0 l\u2019utilisateur la marche \u00e0 suivre pour optimiser ses d\u00e9penses \u00e9nerg\u00e9tiques. Ce dispositif regroupe donc plusieurs composants :<\/p>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile\" style=\"grid-template-columns:15% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"148\" height=\"289\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-20.png\" alt=\"\" class=\"wp-image-3156 size-full\"\/><\/figure><div class=\"wp-block-media-text__content\">\n<p>Un compteur d\u2019\u00e9nergie&nbsp;: Schneider A9MEM2050. Il est aliment\u00e9 en 230V via le r\u00e9seau et poss\u00e8de une sortie pour les donn\u00e9es en Modbus RTU&nbsp;avec une vitesse de transmission de 9600 baud\/s. Ce compteur a \u00e9t\u00e9 choisi car il \u00e9tait le plus compact (9x6x1.5cm)<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile\" style=\"grid-template-columns:auto 16%\"><div class=\"wp-block-media-text__content\">\n<p>Une alimentation pour la raspberry Pi&nbsp;: MeanWell HDR-15-5.<br>Elle fournit une tension de 5V et un courant entre 0 A et 2.4 A, avec en entr\u00e9e la tension du r\u00e9seau. Cette alimentation a \u00e9galement \u00e9t\u00e9 choisi pour son aspect compact (m\u00eames dimensions que le compteur Schneider).<\/p>\n<\/div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"341\" height=\"305\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/HDR.png\" alt=\"\" class=\"wp-image-3158 size-full\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/HDR.png 341w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/HDR-300x268.png 300w\" sizes=\"auto, (max-width: 341px) 100vw, 341px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile\" style=\"grid-template-columns:18% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"610\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/RS3B-1024x610.jpg\" alt=\"\" class=\"wp-image-3159 size-full\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/RS3B-1024x610.jpg 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/RS3B-300x179.jpg 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/RS3B-768x458.jpg 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/RS3B.jpg 1500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p>Une carte Raspberry Pi 3b+.<br>Les cartes Raspberry Pi permettent de collecter et traiter des informations de mani\u00e8re efficace tout en \u00e9tant une solution compacte. Ici, elle r\u00e9cup\u00e8re ainsi les donn\u00e9es du compteur et les envoie par MQTT \u00e0 un serveur qui se chargera de les traiter. Ce serveur intervient \u00e9galement dans le pilotage de la charge, puisqu\u2019il peut indiquer \u00e0 la carte lorsque l\u2019utilisateur veut ou non activer celle-ci.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile\" style=\"grid-template-columns:auto 46%\"><div class=\"wp-block-media-text__content\">\n<p>Un relais finder 34.51 coupl\u00e9 \u00e0 un contacteur<br>Les relais \u00e9lectrom\u00e9caniques permettent de commuter l\u2019\u00e9tat d\u2019une charge d\u2019un \u00e9tat haut \u00e0 un \u00e9tat bas. Cette commande se fait gr\u00e2ce \u00e0 un potentiel faible, ici par exemple on le pilote en 5V. De plus, ce composant permet un isolement entre l\u2019Energy Box et la charge, ce qui garantit une s\u00e9curit\u00e9 suppl\u00e9mentaire.<\/p>\n<\/div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"648\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-28-1024x648.png\" alt=\"\" class=\"wp-image-3193 size-full\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-28-1024x648.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-28-300x190.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-28-768x486.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-28.png 1128w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Ce stage ayant pour but la miniaturisation de la partie de collecte et envoi des donn\u00e9es et de pilotage de la charge, j\u2019ai \u00e9galement \u00e9t\u00e9 amen\u00e9 \u00e0 modifier les composants pr\u00e9sents et \u00e0 en utiliser de nouveaux, voici la liste ci-dessous:<\/p>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile\" style=\"grid-template-columns:15% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"885\" height=\"627\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/D1_MINI.png\" alt=\"\" class=\"wp-image-3161 size-full\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/D1_MINI.png 885w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/D1_MINI-300x213.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/D1_MINI-768x544.png 768w\" sizes=\"auto, (max-width: 885px) 100vw, 885px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p>Une carte Arduino programmable Wemos D1 mini.<br>La carte Wemos D1 mini est une carte Arduino qui poss\u00e8de 4MB de m\u00e9moire flash. Elle est aliment\u00e9e en 5V, et permet d\u2019effectuer des calculs simples rapidement.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile\" style=\"grid-template-columns:auto 20%\"><div class=\"wp-block-media-text__content\">\n<p>Un convertisseur MAX485TTL.<br>Ce convertisseur&nbsp;est un module d&#8217;interface MAX485 TTL vers RS-485 qui permet au microcontr\u00f4leur (la Wemos) d&#8217;utiliser la signalisation diff\u00e9rentielle RS-485 pour des communications s\u00e9rie robustes sur de longues distances. Ici, le convertisseur va ainsi permettre de r\u00e9cup\u00e9rer les donn\u00e9es du compteur par une communication Modbus s\u00e9rie.<\/p>\n<\/div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"724\" height=\"661\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/MAX485.png\" alt=\"\" class=\"wp-image-3162 size-full\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/MAX485.png 724w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/MAX485-300x274.png 300w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">2. Branchement du dispositif<\/h2>\n\n\n\n<p>Afin de pouvoir r\u00e9cup\u00e9rer les donn\u00e9es du compteur, nous allons utiliser le convertisseur RS485. Nous allons donc devoir le connecter \u00e0 notre carte Wemos.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"601\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-23.png\" alt=\"\" class=\"wp-image-3164\" style=\"width:603px;height:383px\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-23.png 945w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-23-300x191.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-23-768x488.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/figure>\n<\/div>\n\n\n<p>Pour commencer, il faut alimenter le convertisseur via les pins 5V et GND (fils noirs et rouges). Ensuite, on s\u2019occupe de la transmission de donn\u00e9es, qui se fait par les autres pins du MAX485. Tout d\u2019abord la r\u00e9ception des donn\u00e9es envoy\u00e9es par le compteur sous protocole Modbus est assur\u00e9e par les entr\u00e9es A et B sur le bornier. Ensuite, la transmission de ces donn\u00e9es est assur\u00e9e par les pins DE et DI qui sont connect\u00e9es aux pins D3 et D4 de la Wemos (fils jaunes et bleus). J\u2019ai choisi d\u2019utiliser les pins D3 et D4 car les pins D0 et D1 sont pr\u00e9vues pour assurer une liaison I2C qui sert surtout pour le stockage et le traitement de donn\u00e9es.<\/p>\n\n\n\n<p>Les pins TX et RX de la Wemos sont utilis\u00e9s pour la mise en place de la communication s\u00e9rie entre la carte et l\u2019ordinateur que l\u2019on va utiliser pour impl\u00e9menter le code. Cette communication se fait par c\u00e2ble USB, et permet d\u2019afficher sur un moniteur des messages qui pourront servir pour v\u00e9rifier le bon fonctionnement de notre code.<\/p>\n\n\n\n<p>On connecte ensuite les bornes A et B du convertisseur aux bornes A et B du compteur Schneider.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Initialisation du programme<\/h2>\n\n\n\n<p>Maintenant que les composants sont correctement aliment\u00e9s, je peux passer \u00e0 la r\u00e9daction du programme.<\/p>\n\n\n\n<p>Pour chaque programme que j\u2019ai cod\u00e9, j\u2019ai tout d\u2019abord \u00e9tabli un cahier des charges pour lister les fonctions que doit remplir ce dernier. Ainsi, pour la premi\u00e8re version du code les objectifs \u00e9taient&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Connexion de la Wemos au r\u00e9seau Wifi utilis\u00e9 par l\u2019ordinateur pour assurer l\u2019\u00e9change de donn\u00e9es.<\/li>\n\n\n\n<li>Collecte des donn\u00e9es du compteur Schneider.<\/li>\n\n\n\n<li>Envoi des donn\u00e9es et affichage simple\u00a0: ici, j\u2019ai choisi de les afficher via un URL.<\/li>\n<\/ul>\n\n\n\n<p>Pour r\u00e9aliser ces t\u00e2ches, j\u2019ai choisi d\u2019utiliser la librairie \u00ab&nbsp;ModbusMaster&nbsp;\u00bb, qui va permettre d\u2019\u00e9tablir une connexion Modbus RTU entre la Wemos et notre ordinateur et ainsi \u00e9changer les donn\u00e9es et la librairie \u00ab&nbsp;ESP8266WiFi&nbsp;\u00bb qui va permettre \u00e0 la carte de se connecter au r\u00e9seau Wifi. On int\u00e8gre \u00e9galement la librairie \u00ab&nbsp;SoftwareSerial&nbsp;\u00bb, qui permettra de mettre en place une communication via le moniteur s\u00e9rie et donc, comme expliquer pr\u00e9c\u00e9demment, de corriger d\u2019\u00e9ventuelles erreurs.<\/p>\n\n\n\n<p>Je peux ensuite d\u00e9finir les pins de communication utilis\u00e9s sur la Wemos et les identifiants wifi.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;ModbusMaster.h&gt;\n#include &lt;ESP8266WiFi.h&gt;  \/\/Enables the ESP8266 to connect to the local network via WiFi\n#include &lt;SoftwareSerial.h&gt;\n\n\/\/ Declaration des pins\n#define MAX485_DE      0\n#define MAX485_RE_NEG  2<\/code><\/pre>\n\n\n\n<p>Une fois toutes les variables utiles d\u00e9clar\u00e9es, je peux me concentrer sur le corps du programme&nbsp;: r\u00e9cup\u00e9rer les donn\u00e9es du compteur et les envoyer pour les afficher via un URL.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Affichage de donn\u00e9es via un URL<\/h2>\n\n\n\n<p>Pour commencer, il faut \u00e9crire une fonction qui va collecter les valeurs des variables que l\u2019on souhaite afficher. Pour cela, on doit utiliser des num\u00e9ros de registres pr\u00e9d\u00e9finis par le fabricant. Ces valeurs de registres se trouvent dans la documentation technique du compteur dans la cat\u00e9gorie communication Modbus et chaque registre contient la valeur associ\u00e9e \u00e0 une variable. On y retrouve \u00e9galement le type de ces donn\u00e9es. Comme la communication Modbus transmet les donn\u00e9es en hexad\u00e9cimal, il faudra aussi mettre au point un convertisseur d\u2019hexad\u00e9cimal vers le type de la donn\u00e9e souhait\u00e9e pour pouvoir l\u2019exploiter.<\/p>\n\n\n\n<p>Ainsi, on va relever les valeurs de la tension (registre 3028), de la fr\u00e9quence (registre 3110), de la puissance (registre 3054), du courant (registre 3000) et de l\u2019\u00e9nergie consomm\u00e9e (registre 3212). On remarque \u00e9galement que les variables sont de type float32, sauf l\u2019\u00e9nergie qui est de type int64. Lors du relev\u00e9, je vais faire en sorte de stocker les diff\u00e9rentes valeurs du m\u00eame type dans un tableau, on aura donc un tableau de float32, avec 4 valeurs et un tableau d\u2019int64 avec une valeur. Il faudra \u00e9galement prendre en compte la taille de nos donn\u00e9es : le type float32 est, comme son nom l\u2019indique, cod\u00e9 sur 32 bits. Chaque registre faisant 16 bits, il faudra lire 2 registres pour r\u00e9cup\u00e9rer l\u2019information souhait\u00e9e. Pour lire la valeur d\u2019un int64, soit 64 bits, il faudra donc prendre 4 registres.<\/p>\n\n\n\n<p>Une fois qu&#8217;on a relev\u00e9 nos valeurs, on  peut les afficher via un URL, en utilisant la fonction client.println, on obtient ainsi le code suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;ModbusMaster.h&gt;\n#include &lt;ESP8266WiFi.h&gt;  \/\/Enables the ESP8266 to connect to the local network via WiFi\n#include &lt;SoftwareSerial.h&gt;\n#include \"config_EB.h\"\n\n#define baud 9600\n#define timeout 100\n#define  polling 100\n#define retry_count 10\nModbusMaster node;\n\n#define MAX485_DE      0\n#define MAX485_RE_NEG  2\n\n\/\/ set wifi IDs\nconst char* ssid = \"XXX\";\nconst char* password = \"XXX\";\nWiFiServer server(80);\n\n\/\/ Initialise the WiFi and MQTT Client objects\nWiFiClient wifiClient;\n\nvoid preTransmission()\n{\n  digitalWrite(MAX485_RE_NEG, 1);\n  digitalWrite(MAX485_DE, 1);\n}\n\nvoid postTransmission()\n{\n  digitalWrite(MAX485_RE_NEG, 0);\n  digitalWrite(MAX485_DE, 0);\n}\n\n\/\/------------------------------------------------\n\/\/ Convent 32bit to float\n\/\/------------------------------------------------\nfloat HexTofloat(uint32_t x) \n{\n  return (*(float*)&amp;x);\n}\n\nuint32_t FloatTohex(float x) \n{\n  return (*(uint32_t*)&amp;x);\n}\n\/\/------------------------------------------------\n\nfloat Read_Meter_float(char addr , uint16_t  REG)\n{\n  float i = 0;\n  uint8_t result,j;\n\n  uint16_t data[2];\n  uint32_t value = 0;\n  node.begin(ID_slave,Serial);\n  node.preTransmission(preTransmission);\n  node.postTransmission(postTransmission);\n\n  result = node.readHoldingRegisters(REG,2); \/\/\/&lt; Modbus function 0x03 Read Holding Registers\n  delay(500);\n  if (result == node.ku8MBSuccess) \n  {\n    for (j = 0; j &lt; 2; j++)\n    {\n      data[j] = (node.getResponseBuffer(j));\n    }\n    value = data[0];\n    value = value &lt;&lt; 16;\n    value = value + data[1];\n    i = HexTofloat(value);\n    return i;\n  } else\n  {\n    delay(1000);\n    return 0;\n  }\n}\n\nvoid GET_METER_FLOAT() \n{     \/\/ Update read all data\n  delay(1000);                            \n    for (char i = 0; i &lt; Total_of_Reg_float ; i++)\n    {\n      DATA_METER_FLOAT [i] = Read_Meter_float(ID_slave, Reg_float_addr[i]);\n    } \n}\n\nfloat Read_Meter_int64(char addr , uint16_t  REG) \n{\n  uint64_t i = 0;\n  uint8_t result,j;\n\n  uint16_t data[4];\n  uint32_t value = 0;\n  node.begin(ID_slave,Serial);\n  node.preTransmission(preTransmission);\n  node.postTransmission(postTransmission);\n  \n  result = node.readHoldingRegisters(REG,4); \/\/\/&lt; Modbus function 0x03 Read Holding Registers\n  delay(500);\n  if (result == node.ku8MBSuccess) \n  {\n    for (j = 0; j &lt; 4; j++)\n    {\n      data[j] = (node.getResponseBuffer(j));\n    }\n\n    value = data[0];\n    for (j = 1; j &lt; 4; j++)\n    {\n      value = value &lt;&lt; 16;\n      value = value + data[j];\n    }\n    i = value;\n    return i;\n  } else \n  {\n    delay(1000); \n    return 0;\n  }\n}\n\nvoid GET_METER_INT64() \n{     \/\/ Update read all data\n  delay(1000);                            \n    for (char i = 0; i &lt; Total_of_Reg_int64 ; i++)\n    {\n      DATA_METER_INT64 [i] = Read_Meter_int64(ID_slave, Reg_int64_addr[i]);\n    } \n}\n\n\/\/**************************************************************************************************************\nvoid setup() \n{\n  Serial.begin(baud);\n\n  pinMode(MAX485_RE_NEG, OUTPUT);\n  pinMode(MAX485_DE, OUTPUT);\n  \/\/ Init in receive mode\n  digitalWrite(MAX485_RE_NEG, 0);\n  digitalWrite(MAX485_DE, 0);\n\n  \/\/ Connect to WiFi network\n  WiFi.begin(ssid, password);\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n  }\n  \n  \/\/ Start the server\n  server.begin();\n\n  delay(1);\n}\n\nvoid loop() \n{\n  WiFiClient client = server.available();\n  if (!client) {\n    return;\n  }\n \n  \/\/ Wait until the client sends some data\n  while(!client.available()){\n    delay(1);\n  }\n \n  \/\/ Read the first line of the request\n  String request = client.readStringUntil('\\r');\n\/\/  Serial.println(request);\n  client.flush();\n\n  GET_METER_FLOAT();\n  GET_METER_INT64();\n\n  Serial.print(\"Tension: \");\n  Serial.print(DATA_METER_FLOAT[0],3);\n  Serial.println(\"V\");\n\n  Serial.print(\"Frequence: \");\n  Serial.print(DATA_METER_FLOAT[1],3);\n  Serial.println(\"Hz\");\n\n  Serial.print(\"Puissance active: \");\n  Serial.print(DATA_METER_FLOAT[2],3);\n  Serial.println(\"W\");\n\n  Serial.print(\"Courant: \");\n  Serial.print(DATA_METER_FLOAT[3],3);\n  Serial.println(\"A\");\n\n  Serial.print(\"Energie: \");\n  Serial.print(DATA_METER_INT64[0],3);\n  Serial.println(\"Wh\");\n\n  Serial.println(\"&lt;br&gt;&lt;br&gt;\");\n  Serial.println(\"&lt;a href=\\\"\/Refresh\\\"\\\"&gt;&lt;button&gt;Refresh &lt;\/button&gt;&lt;\/a&gt;\");\n  Serial.println(\"&lt;\/html&gt;\");\n  \n  delay(1);\n}<\/code><\/pre>\n\n\n\n<p>Si l&#8217;on compile et qu&#8217;on lance le code, on obtient bien nos donn\u00e9es en cherchant l&#8217;URL sur notre navigateur :<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"557\" height=\"95\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-24.png\" alt=\"\" class=\"wp-image-3171\" style=\"width:557px;height:95px\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-24.png 557w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-24-300x51.png 300w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><figcaption class=\"wp-element-caption\"><em>Capture d&#8217;\u00e9cran des donn\u00e9es affich\u00e9es via un URL<\/em><\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">5. Envoi de donn\u00e9es sous MQTT non s\u00e9curis\u00e9<\/h2>\n\n\n\n<p>Maintenant que l&#8217;on r\u00e9cup\u00e8re et affiche bien nos donn\u00e9es, on va pouvoir robustifier notre dispositif. Pour ce faire on va utiliser le protocole MQTT pour envoyer nos donn\u00e9es.<\/p>\n\n\n\n<p>Comme pr\u00e9c\u00e9demment, je d\u00e9finis les fonctions que le code doit remplir :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Connexion de la Wemos au r\u00e9seau Wifi auquel est connect\u00e9 le serveur(=broker) MQTT.<\/li>\n\n\n\n<li>Connexion au serveur MQTT.<\/li>\n\n\n\n<li>R\u00e9cup\u00e9ration des donn\u00e9es via le convertisseur RS485 TTL MAX485.<\/li>\n\n\n\n<li>Envoi des donn\u00e9es sous protocole MQTT au serveur MQTT.<\/li>\n<\/ul>\n\n\n\n<p>Pour r\u00e9aliser ces t\u00e2ches, j\u2019utilise la librairie &#8220;PubSubClient&#8221; et la librairie &#8220;EspMQTTClient&#8221;. On peut reprendre la structure de notre code de collecte des donn\u00e9es et y rajouter les fonctions n\u00e9cessaires pour le protocole MQTT.<\/p>\n\n\n\n<p>Il va falloir d\u00e9clarer les noms des topics que l&#8217;on va transmettre au serveur MQTT, de fa\u00e7on \u00e0 identifier nos diff\u00e9rentes donn\u00e9es. Ensuite on pourra \u00e9tablir la connexion avec le serveur MQTT et publier nos donn\u00e9es via la fonction publish().<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;ModbusMaster.h&gt;\n#include &lt;ESP8266WiFi.h&gt;  \/\/Enables the ESP8266 to connect to the local network via WiFi\n#include &lt;SoftwareSerial.h&gt;\n#include &lt;PubSubClient.h&gt; \/\/Connect andpublish to the MQTT broker\n#include \"config_EB.h\"\n\n#define baud 9600\n#define timeout 100\n#define  polling 100\n#define retry_count 10\nModbusMaster node;\n\n#define MAX485_DE      0  \/\/D3 = 0\n#define MAX485_RE_NEG  2  \/\/D4 = 2\n\n\/\/ set wifi IDs\nconst char* ssid = \"XXX\";\nconst char* password = \"XXX\";\nWiFiServer server(80);\n\n\/\/ MQTT\nconst char* mqtt_server = \"XXX.XXX.XXX.XXX\";  \/\/IP of the MQTT Broker : \nconst char* voltage_topic = \"EB3\/voltage\";\nconst char* frequence_topic = \"EB3\/frequence\";\nconst char* active_power_topic = \"EB3\/active_power\";\nconst char* current_topic = \"EB3\/current\";\nconst char* energy_topic = \"EB3\/energy\";\nconst char* mqtt_username = \"admin\";    \/\/MQTT username\nconst char* mqtt_password = \"XXX\";    \/\/MQTT password\nconst char* clientID = \"client_local\";         \/\/MQTT client ID\n\n\n\/\/ Initialise the WiFi and MQTT Client objects\nWiFiClient wifiClient;\n\/\/ 1883 is the listener port for the Broker\nPubSubClient client(mqtt_server, 1883, wifiClient);\n\nvoid connect_Wifi_MQTT() {\n  \/\/ Connect to WiFi network\n  WiFi.begin(ssid, password);\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n  }\n\n  \/\/ Connect to MQTT Broker\n  \/\/ client.connect returns a boolean value to let us know if the connection was successful.\n  \/\/ If the connection is failing, make sure you are using the correct MQTT Username and Password (Setup Earlier in the Instructable)\n  if (client.connect(clientID, mqtt_username, mqtt_password)) {\n    Serial.println(\"Connected to MQTT Broker!\");\n  }\n  else {\n    Serial.println(\"Connection to MQTT Broker failed...\");\n  }\n}\n\nvoid check_wifi() {\n  WiFiClient client = server.available();\n  if (!client) {\n    return;\n  }\n\n  \/\/ Wait until the client sends some data\n  while (!client.available()) {\n    delay(1);\n  }\n\n  \/\/ Read the first line of the request\n  String request = client.readStringUntil('\\r');\n  \/\/  Serial.println(request);\n  client.flush();\n}\n\n\/\/ Rajouter les fonctions de collecte des donn\u00e9es !!\n\nvoid setup()\n{\n  Serial.begin(baud, SERIAL_8E1);\n\n  connect_Wifi_MQTT();\n\n  \/\/ Start the server\n  server.begin();\n\n  pinMode(MAX485_RE_NEG, OUTPUT);\n  pinMode(MAX485_DE, OUTPUT);\n  \/\/ Init in receive mode\n  digitalWrite(MAX485_RE_NEG, 0);\n  digitalWrite(MAX485_DE, 0);\n\n}\n\nvoid loop()\n{\n  check_wifi();\n\n  GET_METER_FLOAT();\n  GET_METER_INT64();\n\n  \/\/MQTT can only transmit strings\n  String voltage = String((float)DATA_METER_FLOAT[0]);\n  String frequence = String((float)DATA_METER_FLOAT[1]);\n  String active_power = String((float)DATA_METER_FLOAT[2]);\n  String current = String((float)DATA_METER_FLOAT[3]);\n  String energy = String((float)DATA_METER_INT64[0]);\n\n  \/\/ Check if we publish to the MQTT Broker\n  if (client.publish(voltage_topic, String(DATA_METER_FLOAT[0]).c_str())) {\n    Serial.println(\"Voltage sent!\");\n    Serial.println(DATA_METER_FLOAT[0]);\n  }\n  if (client.publish(frequence_topic, String(DATA_METER_FLOAT[1]).c_str())) {\n    Serial.println(DATA_METER_FLOAT[1]);\n  }\n  if (client.publish(active_power_topic, String(DATA_METER_FLOAT[2]).c_str())) {\n    Serial.println(DATA_METER_FLOAT[2]);\n  }\n  if (client.publish(current_topic, String(DATA_METER_FLOAT[3]).c_str())) {\n    Serial.println(DATA_METER_FLOAT[3]);\n  }\n  if (client.publish(energy_topic, String(DATA_METER_INT64[0]).c_str())) {\n    Serial.println(DATA_METER_INT64[0]);\n  }\n\n  delay(1);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">6. Affichage via un interface Jeedom<\/h2>\n\n\n\n<p>En ce qui concerne la configuration de Jeedom, vous pouvez aller voir l&#8217;article suivant qui lui est consacr\u00e9:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-miniprojets-net wp-block-embed-miniprojets-net\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"SqBZg039rK\"><a href=\"https:\/\/miniprojets.net\/index.php\/2019\/05\/13\/jeedom-ou-comment-domotiser-sa-maison-en-quelques-clics\/\">Jeedom ou comment domotiser sa maison en quelques clics<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Jeedom ou comment domotiser sa maison en quelques clics&#8221; &#8212; MiniProjets.net\" src=\"https:\/\/miniprojets.net\/index.php\/2019\/05\/13\/jeedom-ou-comment-domotiser-sa-maison-en-quelques-clics\/embed\/#?secret=m39aCfFgdd#?secret=SqBZg039rK\" data-secret=\"SqBZg039rK\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">7. Pilotage de charge<\/h2>\n\n\n\n<p>Le pilotage du relais est actuellement g\u00e9r\u00e9 par la Raspberry Pi et est r\u00e9gul\u00e9 en mode ON\/OFF. Pour reprendre ce concept, j&#8217;ai \u00e9crit un petit programme qui va tout simplement passer \u00e0 l\u2019\u00e9tat haut ou bas un pin donn\u00e9 dans un pas de temps d\u00e9fini.<\/p>\n\n\n\n<p>Pour ce faire, je vais donc tout d\u2019abord d\u00e9finir le pin que je vais utiliser pour piloter le relais. Je choisis arbitrairement le pin D8 (num\u00e9ro 15 dans la d\u00e9claration), car il n\u2019est pas affili\u00e9 \u00e0 une fonction particuli\u00e8re de la Wemos.<\/p>\n\n\n\n<p>Ensuite, je vais d\u00e9clarer ce pin en tant que sortie, pour indiquer que son \u00e9tat va changer et dans la section loop() de mon programme je vais modifier cet \u00e9tat gr\u00e2ce \u00e0 la fonction digitalWrite(), qui permet de passer du mode \u00ab&nbsp;haut&nbsp;\u00bb au mode \u00ab&nbsp;bas&nbsp;\u00bb sur le pin.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#define Relay 15                 \/\/ Digital pin D8\nint switch_HL = 0;\n\nvoid setup() {\n  Serial.begin(9600);\n  pinMode(Relay, OUTPUT);       \/\/ declare Relay as output\n}\n\nvoid loop() {\n  if (switch_HL == 0) {\n    digitalWrite (Relay, HIGH);\n    switch_HL = 1;\n  }\n  else if (switch_HL == 1) {\n    digitalWrite (Relay, LOW);\n    switch_HL = 0;\n  }\n  delay(5000); \n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">8. R\u00e9alisation d&#8217;un circuit imprim\u00e9<\/h2>\n\n\n\n<p>Apr\u00e8s avoir d\u00e9velopp\u00e9 la partie programmation du dispositif, je me suis int\u00e9ress\u00e9 \u00e0 la partie mat\u00e9rielle et plus pr\u00e9cis\u00e9ment \u00e0 la r\u00e9alisation d\u2019un circuit imprim\u00e9. Ce circuit permettra donc de remplacer les fils par des chemins de cuivres, qui seront donc plus performants, mais \u00e9galement de mettre au point une alimentation par le secteur pour le dispositif et ainsi s\u2019assurer qu\u2019il puisse fonctionner en permanence. Pour cela j\u2019ai utilis\u00e9 un convertisseur 220V-5V auquel j\u2019ai ajout\u00e9 un bornier pour recevoir et transmettre le 220V. Pour r\u00e9aliser ce circuit imprim\u00e9 et toujours dans l\u2019id\u00e9e open source de notre projet, j\u2019ai utilis\u00e9 la suite logicielle Kicad. Etant libre de droit, il existe de nombreux tutoriels et exemples accessibles en ligne pour comprendre les logiciels de sch\u00e9matique et de circuit imprim\u00e9 et ainsi prendre en main et apprendre \u00e0 utiliser ces outils.<\/p>\n\n\n\n<p>Pour commencer, il a fallu cr\u00e9er des empreintes pour chacun de nos composants et ensuite nous avons pu passer \u00e0 l&#8217;assemblage.<\/p>\n\n\n\n<p>Le circuit imprim\u00e9 doit r\u00e9pondre \u00e0 plusieurs crit\u00e8res&nbsp;et r\u00e8gles d\u2019usages :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le circuit doit effectuer les connexions entre les diff\u00e9rents pins pour permettre au dispositif de fonctionner correctement.<\/li>\n\n\n\n<li>Sur chaque composant, les soudures doivent se faire sur la m\u00eame face, les circuits doivent donc \u00e9galement \u00eatre reli\u00e9s aux pins sur la m\u00eame face pour chaque composant. On utilise donc des via pour faire passer le fil d\u2019une face \u00e0 l\u2019autre du circuit.<\/li>\n\n\n\n<li>Le but de notre dispositif \u00e9tant la miniaturisation, il est donc important de r\u00e9duire au maximum la taille du circuit, ce qui repr\u00e9sentera aussi une diminution du co\u00fbt du circuit, car moins de cuivre utilis\u00e9.<\/li>\n\n\n\n<li>Les fils de cuivres devront avoir une \u00e9paisseur adapt\u00e9e au voltage qu\u2019ils transportent. En effet, pour les fils conduisant du 220V il faudra une \u00e9paisseur plus importante (2 mm) que pour ceux conduisant du 5V (1 mm). Enfin pour compl\u00e9ter cette s\u00e9curit\u00e9, on utilisera des plans de masses autour des fils du 5 V, et on isolera les fils de 220V sans rien autour.<\/li>\n<\/ul>\n\n\n\n<p>Apr\u00e8s plusieurs tests et prototypes, j&#8217;ai finalement choisi un circuit sur une face et qui est le plus optimal d&#8217;un point de vue dimensions.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"865\" height=\"371\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-25.png\" alt=\"\" class=\"wp-image-3179\" style=\"width:534px;height:229px\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-25.png 865w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-25-300x129.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-25-768x329.png 768w\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" \/><figcaption class=\"wp-element-caption\"><em>Capture d&#8217;\u00e9cran du PCB sur le logiciel Kicad<\/em><\/figcaption><\/figure>\n<\/div>\n\n\n<p>Au final, le dispositif ressemble \u00e0 cela<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"671\" height=\"319\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-29.png\" alt=\"\" class=\"wp-image-3201\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-29.png 671w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-29-300x143.png 300w\" sizes=\"auto, (max-width: 671px) 100vw, 671px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">9. Probl\u00e8mes rencontr\u00e9s et conseils<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Branchement du dispositif<\/li>\n<\/ol>\n\n\n\n<p>L\u2019un des premiers probl\u00e8mes rencontr\u00e9s \u00e9tait lors du chargement de mon code sur la Wemos. En effet, les pins RX et TX sont responsables de la communication s\u00e9rie entre la carte Wemos et les autres dispositifs. Ainsi, lorsque je veux t\u00e9l\u00e9verser mon code sur la carte, il faut d\u00e9brancher ses fils du convertisseur le temps du t\u00e9l\u00e9chargement (clignotement de la LED) du code, pour \u00e9viter un conflit entre les diff\u00e9rents flux de donn\u00e9es (de la communication s\u00e9rie et du port micro USB).<\/p>\n\n\n\n<p>Un autre probl\u00e8me que j\u2019ai rencontr\u00e9 au cours de ce projet \u00e9tait un probl\u00e8me de d\u00e9tection de la Wemos par l\u2019ordinateur que j\u2019utilisais. En effet, la carte n\u2019\u00e9tait plus d\u00e9tect\u00e9e sur l\u2019IDE Arduino, ni dans les p\u00e9riph\u00e9riques USB, alors que cette derni\u00e8re \u00e9tait bien aliment\u00e9e et en fonctionnement.<\/p>\n\n\n\n<p>D\u2019apr\u00e8s les informations que j\u2019ai pu trouver, il pourrait s\u2019agir d\u2019un probl\u00e8me de driver, j\u2019ai donc essay\u00e9 de les mettre \u00e0 jour et de reconnecter la carte, mais le probl\u00e8me persiste. J\u2019ai \u00e9galement essay\u00e9 de d\u00e9sinstaller-r\u00e9installer l\u2019IDE Arduino mais impossible de me connecter \u00e0 la carte.<\/p>\n\n\n\n<p>Malgr\u00e9 le fait que je n\u2019ai pas r\u00e9ussi \u00e0 rep\u00e9rer le probl\u00e8me, j\u2019ai essay\u00e9 de comprendre ce qui avait pu poser ce dysfonctionnement. J\u2019ai ainsi remarqu\u00e9 que les plans de masses sur le PCB ne correspondaient pas&nbsp;: en effet, on a 5V en entr\u00e9e des composants sur une face et de l\u2019autre on a -3V, ce qui a pu \u00eatre \u00e0 l\u2019origine du dysfonctionnement. Pour r\u00e9soudre ce probl\u00e8me, j\u2019ai modifi\u00e9 le PCB pour relier les deux plans de masses.<\/p>\n\n\n\n<p>     2. Affichage des donn\u00e9es via URL<\/p>\n\n\n\n<p>Lors de la premi\u00e8re ex\u00e9cution de mon code, j\u2019ai remarqu\u00e9 un probl\u00e8me dans la communication s\u00e9rie. En effet, malgr\u00e9 le fait que les donn\u00e9es \u00e9taient correctement affich\u00e9es via l\u2019URL, la communication s\u00e9rie n\u2019affichait pas les messages pour aider au d\u00e9bogage.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"259\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-26.png\" alt=\"\" class=\"wp-image-3184\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-26.png 940w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-26-300x83.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/08\/image-26-768x212.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><figcaption class=\"wp-element-caption\"><em>Capture d&#8217;\u00e9cran o\u00f9 l&#8217;on voit la bonne r\u00e9ception de donn\u00e9es via l&#8217;URL, et les messages erron\u00e9s du terminal s\u00e9rie <\/em><\/figcaption><\/figure>\n<\/div>\n\n\n<p>Le probl\u00e8me ici est la vitesse de transmission pour la communication s\u00e9rie. Comme expliqu\u00e9 pr\u00e9c\u00e9demment, la communication s\u00e9rie se fait \u00e0 une vitesse de 9600 baud\/s. On peut la modifier directement sur le moniteur s\u00e9rie et, en effet, elle \u00e9tait r\u00e9gl\u00e9e par d\u00e9faut \u00e0 11500 baud\/s. Une fois la vitesse chang\u00e9e, on a bien nos messages de d\u00e9bogage qui s\u2019affichent.<\/p>\n\n\n\n<p>    3. Envoi de donn\u00e9es sous MQTT<\/p>\n\n\n\n<p>Les principaux probl\u00e8mes que j\u2019ai rencontr\u00e9s \u00e9taient d\u2019utiliser la bonne syntaxe dans l\u2019appel des fonctions existantes des librairies. Ainsi il fallait que je me renseigne bien au pr\u00e9alable sur les arguments que chaque fonction n\u00e9cessite. Avec l\u2019aide de nombreux exemples trouv\u00e9s en ligne j\u2019ai pu me d\u00e9bloquer lorsque c\u2019\u00e9tait n\u00e9cessaire. Aussi, comme les biblioth\u00e8ques Arduino \u00e9voluent dans le temps il est parfois arriv\u00e9 qu\u2019un code qui fonctionne pr\u00e9sente une nouvelle erreur quelques semaines plus tard.<\/p>\n\n\n\n<p>En effet, j\u2019ai donc rencontr\u00e9 un probl\u00e8me lorsque je d\u00e9finissais la communication s\u00e9rie. De base la fonction que j\u2019utilisais \u00ab&nbsp;Serial.begin()&nbsp;\u00bb ne prenait en argument que la vitesse de transmission. Mais d\u00e9sormais, il faut rajouter un mode de fonctionnement qui d\u00e9finira le nombre de bits, la parit\u00e9 et le bit de stop des messages que l\u2019on va transmettre. Dans mon cas, je dois r\u00e9gler \u00e0 8 bits de donn\u00e9es, pas de parit\u00e9 et 1 bit de stop, ce qui correspondra \u00e0 \u00ab&nbsp;SERIAL_8E1&nbsp;\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. Perspectives d&#8217;am\u00e9lioration<\/h2>\n\n\n\n<p>Je vais maintenant vous pr\u00e9senter des perspectives qui selon moi seraient int\u00e9ressantes \u00e0 suivre et \u00e0 mettre en place pour am\u00e9liorer le dispositif.<\/p>\n\n\n\n<p>Tout d\u2019abord, il serait int\u00e9ressant et cela apporterait une vraie plus-value, de r\u00e9ussir \u00e0 mettre en place la communication par MQTT s\u00e9curis\u00e9e, qui permettrait d\u2019assurer que les donn\u00e9es personnelles des utilisateurs soient prot\u00e9g\u00e9es.<\/p>\n\n\n\n<p>Ensuite, le pilotage du relais coupl\u00e9 \u00e0 la collecte et l&#8217;envoi de donn\u00e9es dans un seul programme serait \u00e9galement une fonctionnalit\u00e9 tr\u00e8s utile, car il permettrait \u00e0 l\u2019utilisateur de pouvoir g\u00e9rer tout le dispositif depuis l\u2019interface de Jeedom.<\/p>\n\n\n\n<p>En plus de cela, l\u2019affichage des donn\u00e9es pourrait \u00eatre sous forme graphique, afin d\u2019avoir un aper\u00e7u plus global de sa consommation dans le temps. En effet, si l\u2019on arrivait \u00e0 r\u00e9cup\u00e9rer l\u2019heure de mesure des variables, on pourrait ainsi tracer une courbe d\u2019\u00e9nergie consomm\u00e9e dans la journ\u00e9e ou encore la semaine et en la comparant avec la fr\u00e9quence du r\u00e9seau, identifier des sch\u00e9mas r\u00e9currents de surproduction ou sous-production pour optimiser la consommation du client. Cet affichage pourrait se faire en utilisant Grafana, qui est un logiciel pour la conception de diagramme et de courbes que l&#8217;on peut coupler \u00e0 Jeedom.<\/p>\n\n\n\n<p>Toujours dans cette optique d\u2019optimiser la consommation par rapport \u00e0 la fr\u00e9quence r\u00e9seau, il pourrait \u00eatre utile d\u2019\u00e9crire un algorithme qui analyserai la fr\u00e9quence en temps r\u00e9el et pr\u00e9viendrait automatiquement l\u2019utilisateur en cas de variation importante. Pour cela, il existe des librairies et des fonctions sur Arduino qui peuvent permettre d\u2019envoyer des messages sous formes de SMS, ou de notifications par mail.<\/p>\n\n\n\n<p>Un autre aspect qui pourrait \u00eatre int\u00e9ressant serait de rendre le pilotage de la charge lin\u00e9aire et non pas juste commutatif. Ainsi, plut\u00f4t que d\u2019allumer ou d\u2019\u00e9teindre une charge, on pourrait adapter la consommation de mani\u00e8re plus pr\u00e9cise et cela permettrait de piloter plus de charge, comme des pompes par exemple.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Conclusion<\/h2>\n\n\n\n<p>Pour conclure cet article, j\u2019ai pu apporter au projet Energy Box une version miniature de la collecte et de l\u2019envoi de donn\u00e9es et \u00e9galement de la documentation ainsi que des prototypes pour continuer sur des voies d\u2019am\u00e9lioration du dispositif.<\/p>\n\n\n\n<p>En effet, j\u2019ai d\u2019abord pu adapter les parties de r\u00e9cup\u00e9ration et de transmission des donn\u00e9es par protocole MQTT. Ensuite, j\u2019ai con\u00e7u un circuit imprim\u00e9 pour optimiser la taille de mon dispositif et faire en sorte qu\u2019il soit aliment\u00e9 par le r\u00e9seau. J\u2019ai pu tester par la suite la mise en place de la transmission des donn\u00e9es \u00e0 l\u2019aide d\u2019InfluxdB et la mise en place d\u2019un protocole MQTT s\u00e9curis\u00e9. Il m\u2019a \u00e9galement \u00e9t\u00e9 possible de piloter une charge via un code Arduino.<\/p>\n\n\n\n<p>Florian Thiebaut<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bonjour \u00e0 tous, Aujourd&#8217;hui, pour mon second article, je vais vous pr\u00e9senter les r\u00e9sultats de mes travaux effectu\u00e9s dans le&hellip;<\/p>\n","protected":false},"author":10,"featured_media":3164,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[18],"class_list":["post-3155","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-en-cours","tag-domotique"],"_links":{"self":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/3155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/comments?post=3155"}],"version-history":[{"count":1,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/3155\/revisions"}],"predecessor-version":[{"id":4212,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/3155\/revisions\/4212"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media\/3164"}],"wp:attachment":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media?parent=3155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/categories?post=3155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/tags?post=3155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}