{"id":2697,"date":"2022-06-08T10:10:34","date_gmt":"2022-06-08T08:10:34","guid":{"rendered":"https:\/\/miniprojets.net\/?p=2697"},"modified":"2022-07-21T18:42:49","modified_gmt":"2022-07-21T16:42:49","slug":"recuperation-de-donnees-dun-compteur-schneider-a9mem2050-via-esp-et-mqtt","status":"publish","type":"post","link":"https:\/\/miniprojets.net\/index.php\/2022\/06\/08\/recuperation-de-donnees-dun-compteur-schneider-a9mem2050-via-esp-et-mqtt\/","title":{"rendered":"R\u00e9cup\u00e9ration de donn\u00e9es d&#8217;un compteur Schneider A9MEM2050 via ESP et MQTT"},"content":{"rendered":"\n<p>Bonjour \u00e0 tous,<\/p>\n\n\n\n<p>Je m&#8217;appelle Florian Thiebaut et je suis actuellement en stage de fin d&#8217;\u00e9tudes au G2Elab de Grenoble. Dans le cadre de ce stage, j&#8217;ai pu \u00e9tablir une communication pour transmettre des donn\u00e9es \u00e0 l&#8217;aide du protocole MQTT entre un  compteur Schneider A9MEM2050 et un serveur MQTT via une Wemos D1 mini.<\/p>\n\n\n\n<p>Aujourd&#8217;hui, je vous propose donc un tutoriel sur la mise en place de cette connexion.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">I. Logiciels et composants utilis\u00e9s pour ce dispositif<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">a. Outils et logiciels<\/h2>\n\n\n\n<p>Dans ce projet les logiciels suivants sont utilis\u00e9s :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Arduino : IDE<\/li><li>Interface d&#8217;affichage pour les donn\u00e9es : dans notre cas nous utilisons le logiciel OpenSource Jeedom.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">b. Composants<\/h2>\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 15%\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"387\" height=\"758\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Compteur_Schneider.png\" alt=\"\" class=\"wp-image-2741 size-full\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Compteur_Schneider.png 387w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Compteur_Schneider-153x300.png 153w\" sizes=\"auto, (max-width: 387px) 100vw, 387px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"has-medium-font-size\">Compteur Schneider A9MEM2050<\/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 24%\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"213\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/D1_MINI-300x213.png\" alt=\"\" class=\"wp-image-2698 size-medium\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/D1_MINI-300x213.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/D1_MINI-768x544.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/D1_MINI.png 885w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"has-medium-font-size\">Wemos d1 mini<\/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 17%\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"724\" height=\"661\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/MAX485-1.png\" alt=\"\" class=\"wp-image-2700 size-full\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/MAX485-1.png 724w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/MAX485-1-300x274.png 300w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"has-medium-font-size\">Convertisseur RS485 TTL MAX485<\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">II. 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-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Circuit_d1_max485-1024x415.png\" alt=\"\" class=\"wp-image-2702\" width=\"666\" height=\"269\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Circuit_d1_max485-1024x415.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Circuit_d1_max485-300x122.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Circuit_d1_max485.png 1427w\" sizes=\"auto, (max-width: 666px) 100vw, 666px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"527\" height=\"419\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Beard_board.png\" alt=\"\" class=\"wp-image-2745\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Beard_board.png 527w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Beard_board-300x239.png 300w\" sizes=\"auto, (max-width: 527px) 100vw, 527px\" \/><\/figure>\n<\/div>\n\n\n<p>On connecte ensuite les bornes A et B du convertisseur (fils noir et rouge qui partent du bornier sur l&#8217;image) aux bornes A et B du compteur Schneider (fils noir et rouge).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"270\" height=\"481\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/A-B_compteur.png\" alt=\"\" class=\"wp-image-2744\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/A-B_compteur.png 270w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/A-B_compteur-168x300.png 168w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">III. Configuration 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=\"yQ52sxv7ZI\"><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=8nNM5c8T26#?secret=yQ52sxv7ZI\" data-secret=\"yQ52sxv7ZI\" 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\">IV. Code Arduino<\/h2>\n\n\n\n<p>Notre code doit remplir plusieurs fonctions :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Connexion de la Wemos au r\u00e9seau Wifi auquel est connect\u00e9 le serveur(=broker) MQTT.<\/li><li>Connexion au serveur MQTT.<\/li><li>R\u00e9cup\u00e9ration des donn\u00e9es via le convertisseur RS485 TTL MAX485.<\/li><li>Envoi des donn\u00e9es sous protocole MQTT au serveur MQTT.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">a. D\u00e9finitions<\/h2>\n\n\n\n<p>Pour r\u00e9aliser ces t\u00e2ches, nous allons utiliser la librairie &#8220;PubSubClient&#8221; et la librairie &#8220;EspMQTTClient&#8221;.<\/p>\n\n\n\n<p>Tout d&#8217;abord, on d\u00e9finit les constantes que l&#8217;on va utiliser, \u00e0 savoir l&#8217;IP du broker MQTT, les identifiants MQTT et les topics qui correspondent aux donn\u00e9es que l&#8217;on recueille.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">\/\/ 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 = \"XXXX\";    \/\/MQTT username\nconst char* mqtt_password = \"xxxxxxxxxx\";    \/\/MQTT password\nconst char* clientID = \"client_local\";         \/\/MQTT client ID<\/code><\/pre>\n\n\n\n<p>Chaque topic est d\u00e9fini comme une sous partie de &#8220;EB3&#8221;, afin d&#8217;avoir un affichage plus clair sur la plateforme Jeedom.<\/p>\n\n\n\n<p>On doit \u00e9galement d\u00e9finir les pins de communication associ\u00e9s entre la Wemos et le convertisseur. pour cela on utilise la num\u00e9rotation fournie dans la documentation technique.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#define MAX485_DE      0    \/\/D3=0\n#define MAX485_RE_NEG  2    \/\/D4=2<\/code><\/pre>\n\n\n\n<p>On peut ensuite d\u00e9clarer le client MQTT.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">\/\/ Initialise the WiFi and MQTT Client objects\nWiFiClient wifiClient;\n\/\/ 1883 is the listener port for the Broker\nPubSubClient client(mqtt_server, 1883, wifiClient);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">b. Fonctions<\/h2>\n\n\n\n<p>Tout d&#8217;abord on rel\u00e8ve les donn\u00e9es du compteur et on stocke ces valeurs dans un tableau. Ici, on a l&#8217;indice 0 pour la tension, l&#8217;indice 1 pour la fr\u00e9quence, l&#8217;indice 2 pour la puissance active et l&#8217;indice 3 pour le courant.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">float 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}<\/code><\/pre>\n\n\n\n<p>Cette fonction va aller chercher les valeurs des registres d\u00e9j\u00e0 d\u00e9finis pour la tension, la fr\u00e9quence, la puissance active et le courant. Ces valeurs de registres se trouvent dans la documentation technique du compteur dans la cat\u00e9gorie : communication Modbus. On y voit \u00e9galement que ces donn\u00e9es sont de type float, d&#8217;o\u00f9 l&#8217;utilisation d&#8217;un convertisseur h\u00e9xad\u00e9cimal-float.<\/p>\n\n\n\n<p>Cependant l&#8217;\u00e9nergie est pr\u00e9-d\u00e9finie comme \u00e9tant un entier, c&#8217;est pourquoi il faudra adapter ces fonctions pour pouvoir correctement lire cette valeur.<\/p>\n\n\n\n<p>Ci-dessous la documentation technique pour les registres:<\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-1652c4a8-b30e-4813-a29f-74284ca9335a\" href=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/PM5560_PM5563_PM5563RD_ModbusRegisterList_v2.3.0.xlsx\">PM5560_PM5563_PM5563RD_ModbusRegisterList_v2.3.0<\/a><a href=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/PM5560_PM5563_PM5563RD_ModbusRegisterList_v2.3.0.xlsx\" class=\"wp-block-file__button\" download aria-describedby=\"wp-block-file--media-1652c4a8-b30e-4813-a29f-74284ca9335a\">Download<\/a><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"199\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Registres.png\" alt=\"\" class=\"wp-image-2748\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Registres.png 605w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Registres-300x99.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n<\/div>\n\n\n<p>Maintenant que l&#8217;on a acc\u00e8s aux variables qui nous int\u00e9resse, on peut les envoyer au serveur MQTT. <\/p>\n\n\n\n<p>Pour cela il faut d&#8217;abord convertir ces variables en string, seul type de variables que peut transmettre le MQTT. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">void 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\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<p class=\"has-vivid-red-color has-text-color has-medium-font-size\">!<strong> Attention !<\/strong><\/p>\n\n\n\n<p>Les pins RX et TX sont responsables de la communication s\u00e9rie entre la carte Wemos et d&#8217;autres dispositifs. Lorsque l&#8217;on voudra uploader notre code sur notre ESP, il faudra donc 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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">V. Affichage des donn\u00e9es<\/h2>\n\n\n\n<p>Comme expliqu\u00e9 pr\u00e9c\u00e9demment, nous avons utilis\u00e9 le logiciel Jeedom pour l&#8217;affichage de nos donn\u00e9es. <\/p>\n\n\n\n<p>Lorsque l&#8217;on t\u00e9l\u00e9charge notre code pour la premi\u00e8re fois sur notre Wemos, il faut indiquer \u00e0 Jeedom que l&#8217;on souhaite inclure un nouveau topic auquel il va souscrire. Pour se faire, on active l&#8217;inclusion via l&#8217;interface Jeedom.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Active_inclusion.png\" alt=\"\" class=\"wp-image-2749\" width=\"230\" height=\"170\" \/><\/figure>\n<\/div>\n\n\n<p>Une fois l&#8217;inclusion activ\u00e9e, notre dossier EB3 apparaitra et on pourra ainsi retrouver les valeurs que l&#8217;on souhaite relever directement sur l&#8217;interface de l&#8217;application.  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"448\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Releve_jeedom-1-1024x448.png\" alt=\"\" class=\"wp-image-2723\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Releve_jeedom-1-1024x448.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Releve_jeedom-1-300x131.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Releve_jeedom-1-768x336.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2022\/05\/Releve_jeedom-1.png 1207w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Vous pouvez maintenant utiliser la m\u00e9thode habituelle pour historiser vos donn\u00e9es. <\/p>\n\n\n\n<p>Je vous souhaite une bonne journ\u00e9e, <\/p>\n\n\n\n<p>Florian<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bonjour \u00e0 tous, Je m&#8217;appelle Florian Thiebaut et je suis actuellement en stage de fin d&#8217;\u00e9tudes au G2Elab de Grenoble.&hellip;<\/p>\n","protected":false},"author":10,"featured_media":2745,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[54],"tags":[],"class_list":["post-2697","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-capteurs"],"_links":{"self":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/2697","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=2697"}],"version-history":[{"count":0,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/2697\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media\/2745"}],"wp:attachment":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media?parent=2697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/categories?post=2697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/tags?post=2697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}