{"id":255,"date":"2020-11-10T11:22:06","date_gmt":"2020-11-10T10:22:06","guid":{"rendered":"https:\/\/www.courat.fr\/makerzblog\/?p=255"},"modified":"2021-01-02T18:56:07","modified_gmt":"2021-01-02T17:56:07","slug":"deep-sleep-et-ota-update-reflexions","status":"publish","type":"post","link":"https:\/\/www.courat.fr\/makerzblog\/2020\/11\/10\/deep-sleep-et-ota-update-reflexions\/","title":{"rendered":"Deep Sleep et OTA Update : r\u00e9flexions&#8230;"},"content":{"rendered":"\n<p>Aujourd&rsquo;hui, j&rsquo;ai 3 sondes domotiques DIY qui tournent comme des charmes dans la maison&#8230; <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Bas\u00e9es sur du Wemos D1 Mini, une sonde DHT22, un shield batterie TP4056 et une Li-Ion 18650, le tout sur un firmware 100% fait maison, j&rsquo;vous raconte pas comment qu&rsquo;j&rsquo;en suis fier de celles-l\u00e0&#8230; \ud83d\ude00 <\/p>\n\n\n\n<p>Ceci dit, aujourd&rsquo;hui, j&rsquo;ai un soucis : y a bien longtemps, j&rsquo;ai mis en place l&rsquo;<strong>OTA<\/strong> dans le code ; comme je suis fain\u00e9ant je vais pas me lancer dans un tuto sur le sujet, mais vous pouvez trouver pleins d&rsquo;infos sur le sujet, par exemple <a rel=\"noreferrer noopener\" href=\"https:\/\/projetsdiy.fr\/arduinoota-ota-mise-jour-sans-fil-ide-arduino-programmes-esp8266\/\" target=\"_blank\"><strong>ici<\/strong><\/a>&#8230; En gros, \u00e7a veut dire qu&rsquo;en th\u00e9orie, je pourrais envoyer un nouveau firmware par le wifi, au lieu de connecter mon Wemos en USB sur l&rsquo;ordi. Super pratique, pour pas aller cavaler partout dans la maison quand il s&rsquo;agit de mettre \u00e0 jour les capteurs ! <\/p>\n\n\n\n<p>Sauf que maintenant, mon Wemos fonctionne selon une boucle qui fait : <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Wake Up feignasse !!<\/li><li>Y a un update OTA ? non ? je continue&#8230;<\/li><li>Mesure des donn\u00e9es du sensor<\/li><li>Connexion Wifi<\/li><li>Connexion au serveur MQTT<\/li><li>Publication MQTT des donn\u00e9es<\/li><li>D\u00e9connexion du MQTT (on fait les choses proprement&#8230;)<\/li><li>Deep Sleep !<\/li><\/ol>\n\n\n\n<p>Cette boucle, de 1 \u00e0 8, se passe en quelques secondes&#8230; toutes les minutes pour l&rsquo;instant, et \u00e0 terme toutes les 10 minutes. <\/p>\n\n\n\n<p>Ca veut dire que pendant 9 minutes et des brouettes, sur 10 minutes, mon module, ben y roupille&#8230; pas de wifi, pas d&rsquo;attente OTA&#8230; donc th\u00e9oriquement, j&rsquo;ai une fen\u00eatre de quelques secondes (voire moins !!) pour lancer mon update dans les airs (OTA = Over The Air, hein&#8230; bon je sors). Impossible. <\/p>\n\n\n\n<p>J&rsquo;ai donc pens\u00e9 \u00e0 la solution suivante : <\/p>\n\n\n\n<p>Mon module \u00e9tant un <em>publisher<\/em> MQTT, pourquoi ne pas en faire un <em>subscriber<\/em>, qui \u00e9couterait un topic sp\u00e9cifique qui, quand il le choppe, se dit \u00ab\u00a0ah ok, j&rsquo;arr\u00eate ma boucle classique de deepsleep, et je me mets dans un mode \u00ab\u00a0attente d&rsquo;update\u00a0\u00bb ? <\/p>\n\n\n\n<p>Ni une ni, je prototype le truc. <\/p>\n\n\n\n<p>R\u00e9sultat : Ah oui. L&rsquo;\u00e9tape 7 : d\u00e9connexion du MQTT&#8230; accessoirement, \u00e7a arr\u00eate tout simplement la souscription au fameux topic&#8230; et un topic envoy\u00e9 lorsque je n&rsquo;y suis pas abonn\u00e9, je ne le verrai jamais. Rat\u00e9. <\/p>\n\n\n\n<p>Du coup, je cherche une id\u00e9e&#8230; <\/p>\n\n\n\n<p>Et comme je la trouve pas, je poste cet article qui ressemble \u00e0 un \u00e9chec, mais qui me permet de verbaliser le truc et, peut-\u00eatre, faire de ce blog un canard en plastique, pour une fois&#8230; <\/p>\n\n\n\n<p>&#8230;<\/p>\n\n\n\n<p>?<\/p>\n\n\n\n<p>&#8230; non.  \u00e7a vient pas. <\/p>\n\n\n\n<p>Bon, ben je continue la r\u00e9flexion, et si je trouve qqchose, je mettrai ce post \u00e0 jour !<\/p>\n\n\n\n<p><em>Stay safe&#8230;<\/em><\/p>\n\n\n\n<p><em><strong>Edit 02.01.2021<\/strong><\/em><\/p>\n\n\n\n<p><em>En fait, j&rsquo;ai trouv\u00e9 quelques temps apr\u00e8s la publication de cet article&#8230; <\/em><\/p>\n\n\n\n<p>Passons quelques secondes sur MQTT et le flag \u00ab\u00a0<strong>retain<\/strong>\u00a0\u00bb : lorsqu&rsquo;un message est publi\u00e9 sans flag \u00ab\u00a0<strong>retain<\/strong>\u00ab\u00a0, le serveur MQTT v\u00e9rifie, d\u00e8s qu&rsquo;il arrive, s&rsquo;il y a des <em>subscribers<\/em> \u00e0 celui-ci : s&rsquo;il n&rsquo;en trouve aucun, le message est <em>benn\u00e9<\/em> direct. C&rsquo;est la situation toute logique que j&rsquo;ai rencontr\u00e9e en faisant mes premiers tests, tels que pr\u00e9sent\u00e9s plus haut. Par contre, si \u00ab\u00a0<em>retain<\/em>\u00a0\u00bb est pass\u00e9 \u00e0 <em>True<\/em> lors de la publication du message, alors le message est conserv\u00e9 sur le serveur, qu&rsquo;il y ait un abonn\u00e9 ou non.  Pratique : si un abonn\u00e9 se connecte apr\u00e8s la publication, c&rsquo;est parfait, il le trouve, et l&rsquo;utilise&#8230; <\/p>\n\n\n\n<p><em>&#8230; Sauf que oui mais non !<\/em><\/p>\n\n\n\n<p>Et oui : ok, c&rsquo;est top, mon abonn\u00e9 trouve le message. Mais la contrepartie du mode <em>retain<\/em>, c&rsquo;est que, contrairement au mode <em>pas-retain<\/em>, le message n&rsquo;est pas supprim\u00e9 par le serveur MQTT lorsque le dernier abonn\u00e9 l&rsquo;a re\u00e7u. Du coup, si l&rsquo;abonn\u00e9, ou un autre, se d\u00e9connecte, puis revient, il va le retrouver, et potentiellement le traiter inutilement ; dans notre cas, \u00e7a va vouloir dire : \u00ab\u00a0remets toi en mode OTA\u00a0\u00bb ind\u00e9finiment&#8230; Il va donc falloir trouver un moyen de le supprimer, ce message !<\/p>\n\n\n\n<p>Ah oui, mais &#8230; j&rsquo;avais jamais r\u00e9fl\u00e9chi \u00e0 \u00e7a : \u00e7a s&rsquo;efface, un message MQTT ? <\/p>\n\n\n\n<p>Et bien oui ! Et, alors que je m&rsquo;en faisais toute une montagne, je vais pulv\u00e9riser vite-fait le mythe : effacer un message MQTT, c&rsquo;est aussi simple que de <strong>publier un topic avec une payload vide<\/strong> ! Point. Rien de plus&#8230; <\/p>\n\n\n\n<p>Du coup, on a trouv\u00e9 la solution&#8230; et je vous confirme, tout \u00e7a fonctionne comme un charme \ud83d\ude09<\/p>\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Aujourd&rsquo;hui, j&rsquo;ai 3 sondes domotiques DIY qui tournent comme des charmes dans la maison&#8230;<\/p>\n","protected":false},"author":1,"featured_media":259,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,7,5],"tags":[],"class_list":["post-255","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-diy","category-electronique","category-projets"],"_links":{"self":[{"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/posts\/255","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/comments?post=255"}],"version-history":[{"count":10,"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/posts\/255\/revisions"}],"predecessor-version":[{"id":287,"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/posts\/255\/revisions\/287"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/media\/259"}],"wp:attachment":[{"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/media?parent=255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/categories?post=255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.courat.fr\/makerzblog\/wp-json\/wp\/v2\/tags?post=255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}