md
Programmation d'un commutateur Sonoff avec un Raspberry Pi
2017-01-23
Mise à jour: 2017-11-17
Mise à jour: 2017-11-22

Le cable USB-TTL (3,3v) commandé de Chine en décembre n'est toujours pas arrivé. L'impatience est telle que j'ai décidé d'utiliser un Raspberry Pi pour programmer quelques commutateurs Sonoff. Le Raspberry Pi fonctionne à 3,3V et possède une sortie en série matérielle (un UART) qu'on peut donc brancher directement au UART du Sonoff. Pour l'essentiel, je vais faire avec un Raspberry Pi ce que d'autres on fait avec un ordinateur bureau et un câble USB-TTL.

Avertissement

Selon la formule consacrée, si vous ruinez un Raspberry Pi ou un Sonoff en suivant les instructions qui suivent, c'est navrant, je sympathise, mais je ne suis pas responsable des conséquences et dommages. Je ne connais aucune façon de réinstaller le micrologiciel installé par ITEAD sur le Sonoff. Donc si vous endommagez ou remplacez ce micrologiciel, il sera impossible d'utiliser le logiciel eWeLink pour contrôler le commutateur. De plus, toute garantie qui pourrait exister (y en a-t-il une?) sur le Sonoff sera perdue en brisant le timbre lorsque le boîtier est ouvert. Surtout ne JAMAIS programmer un Sonoff branché sur le secteur.

Micrologiciels pour Sonoff

Le ESP8266, qui est le microcontrôleur au coeur du Sonoff de ITEAD, peut fonctionner avec plusieurs micrologiciels. Voulant expérimenté un peu, j'ai décidé d'essayer trois d'entre eux qui possèdent la capacité de communiquer avec un agent MQTT :

1. Sonoff-MQTT-OTA-Arduino
Créé par Theo Arends, ce micrologiciel récolte les éloges de plusieurs avec raison. Il me semble le plus complet et en même temps le plus simple pour contrôler un Sonoff (ou autre dispositif semblable de ITEAD) avec le programme de domotique Domoticz. Comme le nom l'indique, le logiciel est conçu pour utilisation avec l'environnement de développement intégré (EDI) d'Arduino qui permet de modifier le code, le compiler et puis le téléverser vers le Sonoff.
2. Sonoff-MQTT-OTA
Ce micrologiciel, aussi de Theo Arends, pourrait intéresser des personnes qui utilisent un logiciel de domotique prenant en charge le protocole MQTT.
3. NodeMCU
Puisque j'utilise NodeMCU avec le Wemos D1 mini, j'ai programmé un Sonoff avec ce micrologiciel.

Il n'est pas nécessaire de connaître un langage de programmation ou d'installer l'EDI d'Arduino pour se servir des micrologiciels de Theo Arends. Dans ce qui suit, j'explique comment faire sans l'EDI. Cependant, il y a des avantages à modifier la configuration de base au sujet du réseau local sans file, surtout si l'on prévoit programmer plusieurs Sonoff. Par contre, NodeMCU est en fait qu'un interpréteur Lua et il faut ajouter un script dans cette langue pour contrôler le Sonoff. Heureusement il y en a un qui peut servir de base.

Obtenir les micrologiciels

Voici comment obtenir les micrologiciels par le Web. Dans les trois cas, j'ai copié les fichiers vers des répertoires sur mon ordinateur de bureau, qui fonctionne sous Ubuntu. Je suppose que on peut faire la même chose avec un ordinateur Windows or un Mac.

1. Sonoff-MQTT-OTA-Arduino
Cliquer sur le bouton vert Clone or download sur le site GitHub, puis cliquer sur Download ZIP et sauvegarder l'archive Sonoff-MQTT-OTA-Arduino-master.zip dans un dossier. Extraire le contenu de l'archive contenant le seul fichier binaire qui sera utilisé.
2.Sonoff-MQTT-OTA
Cliquer sur le bouton vert Clone or download sur le site GitHub, puis cliquer sur Download ZIP et sauvegarder l'archive Sonoff-MQTT-OTA-master.zip dans un dossier. Extraire le contenu de l'archive contenant un des fichiers binaires qui seront utilisé. Nous avons aussi besoin de trois fichiers du ESP8266 SDK d'Espressif, le fabricant du ESP8266. Télécharger la version courante du SDK ne contenant pas de système d'exploitation. Présentement c'est SP8266 NONOS SDK V2.0.0 20160810. Extraire le contenu de l'archive.
Theo Arends ne développe plus ces deux micrologiciels. Ils ont été remplacés par le micrologiciel Sonoff-Tasmota. C'est cette dernière version que j'utilise depuis quelques semaines. Je n'ai pas trouvé de fichier binaire dans ce nouveau répertoire git. Donc il faudra installer Arduino pour compiler le code source. M. Arends fournit des fichiers binaires précompilés de chaque version de Tasmota. Il devrait être possible d'installer un de ces fichiers binaires quelconque avec la méthode décrite ci-dessous s'il n'y a pas de convertisseur USB-TTL disponible, mais je ne l'ai pas vérifié parce que j'ai mis à jour les commutateurs déjà en service par liaison radio (OTA). Notez qu'il n'est pas possible de mettre à jour Sonoff-MQTT-OTA de cette façon.

Mise à jour du 17 novembre 2017
22 novembre 2017.
3. NodeMCU
Il faut choisir les modules NodeMCU qui constitueront le micrologiciel. Le plus simple est de le faire compiler sur le site NodeMCU custom builds de Marcel Stör. J'ai choisi les modules suivants CJSON, DHT, file, GPIO, HTTP, MQTT, node, timer, UART, WiFi. En quelques minutes on obtient un courriel avec un lien vers deux fichiers binaires. J'ai téléchargé la version en nombres entiers nodemcu-master-10-<date>-integer.bin que j'ai copiée sur un répertoire de mon ordinateur de bureau.

Préparation du Raspberry Pi

Un vieux Raspberry Pi, modèle B (rev. 2.0, 512Mo de mémoire) qui date de la fin de 2011 est suffisant. Toutefois, j'ai décidé d'installer la plus récente version de Raspbian, Jessie Lite du 11 janvier 2017.

J'ai répété les mêmes étapes que lors de la préparation, il y a un peu plus d'un mois, du Raspberry Pi qui héberge le serveur Domoticz. Attention de donner une adresse IP statique différente de celle accordée à tout autre ordinateur sur le réseau local.

Les Sonoff seront programmés à partir d'une connexion en série avec le Raspberry Pi. Or, Raspbian relie une console à l'UART au cours du processus de démarrage ce qui empêche toute connexion subséquente au dispositif /dev/ttyAMA0 attaché à l'UART. En arrêtant et désactivant le service serial-getty on libère de façon permanente le port. Il faut aussi modifier le fichier /boot/cmdline.txt. J'ai préféré faire une copie de sauvegarde avant de modifier ce texte.

pi@raspberrypi:~ $ sudo systemctl stop serial-getty@ttyAMA0.service pi@raspberrypi:~ $ sudo systemctl disable serial-getty@ttyAMA0.service pi@raspberrypi:~ $ sudo cp /boot/cmdline.txt /boot/cmdline.bak pi@raspberrypi:~ $ sudo nano /boot/cmdline.txt
Dans cette dernière étape, il faut éliminer l'option console=serial0,115200 du fichier.

Nota bene : le Raspberry Pi modèle 3 est différent des modèles précédents. Entre autres changements, le port ttyAMA0 est alloué à Bluetooth au démarrage. Le port série trouvé sur l'en-tête Pi 3 est ttyS0. En conséquence, si vous utilisez un Raspeberry Pi 3, remplacez /dev/ttyAMA0 par /dev/ttyS0 dans tous les cas. Voir le billet de Jon Watkin pour plus de détails.
Mise à jour: 3 février 2018

Comme j'ai déjà expliqué pour le Wemos D1 mini, on utilise le script esptool.py pour programmer le ESP8266 du Sonoff. Sauf que maintenant c'est le Raspberry Pi qui téléversera les fichiers binaires. Il faut donc installer ce script sur le petit ordinateur. Alors que Python version 2.7 est compris dans Jessie Lite, le script nécessaire ne l'est pas. Il est plus facile d'utiliser pip pour installer esptool.py qui dépend d'autres scripts absents. Donc il faut procéder à l'installation de deux paquets. Si l'on veut utiliser NodeMCU alors il faut installer un troisième paquet.

pi@raspberrypi:~ $ sudo apt-get install python-pip pi@raspberrypi:~ $ sudo pip install esptool et, si l'on utilise NodeMCU pi@raspberrypi:~ $ sudo pip install nodemcu-uploader

Il faut maintenant copier les images des micrologiciels déjà dans l'ordinateur de bureau. J'ai créé trois répertoires sur la carte SD du Raspberry Pi pour chacun des micrologiciels. Puis j'ai copié dans chacun le ou les fichiers binaires nécessaires. Tout cela a été fait avec Filezilla.

1. Sonoff-MQTT-OTA-Arduino
Source : .../Sonoff-MQTT-OTA-Arduino-master/api/arduino/sonoff-ino.bin
Cible : /home/pi/sonoff-ino/sonoff-ta-ino.bin
2. Sonoff-MQTT-OTA
Source : .../Sonoff-MQTT-OTA-master/api/sonoff/user1.bin
Cible : /home/pi/sonoff/user1.bin

Source : .../esp8266sdk/sdk/bin/boot_v1.6bin
Cible : /home/pi/sonoff/boot_v1.6bin

Source : .../esp8266sdk/sdk/bin/esp_init_data_default.bin
Cible : /home/pi/sonoff/esp_init_data_default.bin

Source : .../esp8266sdk/sdk/bin/blank.bin
Cible : /home/pi/sonoff/blank.bin
3. NodeMCU
Source : .../nodemcu/nodemcu-master-10-modules-2017-01-18-01-27-00-integer.bin
Cible : /home/pi/nodemcu/nodemcu-master-10-modules-2017-01-18-01-27-00-integer.bin
Le sentier exact des fichiers sources dépend évidemment de l'emplacement choisi lorsqu'ils ont été extraits des archives téléchargées précédemment.

L'étape suivante consiste à téléverser ces fichiers au commutateur à partir du Raspberry Pi.

Connexion entre Sonoff et Raspberry Pi

Ce n'est pas trop difficile de préparer le Sonoff. On ouvre le boîtier, l'ongle est le seul outil nécessaire, pour souder un connecteur. On trouve facilement sur le Web, (chercher « flashing Sonoff ») ou sur You Tube des illustrations de cette démarche. Il y a quatre connexions à faire entre ce connecteur et celui du Raspberry Pi.

SonoffRaspberry Pi
GND4GND25
TxD3RxD10
RxD2TxD8
Vcc13.3V1

Les broches du connecteur Sonoff sont numérotées de 1 à 5 à partir de l'interrupteur tactile comme on peut voir sur le diagramme suivant.
Si l'on utilise un Raspberry Pi plus récent, le connecteur possède 40 broches. La prise à terre se fait avec la dernière broche à gauche qui est la 39e.

La cinquième broche du Sonoff n'est pas utilisée pour le programmer, mais elle est intéressante: elle est connectée au GPIO14 du ESP8266 (voir Contrôle local des Sonoff).

Le commutateur sur l'alimentation du Sonoff tel que montré dans le graphique est virtuel, je branche ou débranche la connexion Vcc au besoin. Cependant, j'ai vu sur le Web qu'une personne avait installé un véritable commutateur sur le fil Vcc reliant le Sonoff à son câble USB-TTL. C'est une bonne astuce s'il faut programmer plusieurs Sonoff.

Je pense que les 4 connexions mentionnées ci-dessus sont valables pour tous les modèles du Raspberry Pi, cependant, avant de brancher le Sonoff au UART du Raspberry Pi, vous devriez vous assurer qu'il n'y a pas d'erreur dans ce branchement, car l'affectation des broches du connecteur GPIO du Raspberry Pi est différente selon le modèle. Pour savoir quel modèle l'on a:

pi@raspberrypi:~ $ cat /proc/cpuinfo processor : 0 model name : ARMv6-compatible processor rev 7 (v6l) BogoMIPS : 697.95 Features : half thumb fastmult vfp edsp java tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xb76 CPU revision : 7 Hardware : BCM2708 Revision : 000e Serial : 00000000f6a60ee6
On peut repérer le modèle à partir du numéro de révision sur ce site. C'est ainsi que j'ai confirmé que Revision 000e voulait dire qu'il s'agit d'un Raspberry Pi Model B (Rev 2.0, 512Mb).

Il faut s'assurer que l'alimentation est suffisante pour les besoins du Raspberry Pi, des périphériques branchés (dans mon cas un adaptateur USB-WiFi) et du Sonoff. J'ai rencontré de nombreuses pertes de connexions SSH avec le Raspberry Pi lorsque je mettais le Sonoff en mode de programmation. La solution fut d'affecter une alimentation de 3,3V indépendante au Sonoff. Attention, les mises à terre du Raspberry Pi (et du coup son alimentation), du Sonoff et de son alimentation doivent être reliées. En revanche, la sortie 3,3V du Raspberry Pi ne doit pas être connectée au Sonoff. L'image illustre cet arrangement.

J'ai utilisé une alimentation de platine d'expérimentation très peu coûteuse pour le Sonoff, un YwRobot 5V/3.3V qu'on retrouve facilement sur le Web. Il ne faut surtout pas oublier de placer le cavalier à 3,3 volts; utiliser 5 volts peut ruiner l'ESP8266 du Sonoff.

Il n'y a pas de deuxième alimentation dans les photographies qui suivent. Un heureux hasard a fait que je n'ai pas rencontré ces problèmes d'alimentation avec le premier Sonoff programmé de cette manière.

Initialement, on branche les trois connexions GND, TxD-RxD, RxD-TxD mais pas Vcc. Si Vcc est déjà connecté, c'est sans conséquence, il faut le débrancher.

Téléversement du micrologiciel

Voici l'arrangement des appareils avant de lancer la programmation. Le fil avec une gaine blanche est la connexion Raspberry Pi TxD <--> ESP8266 RxD qui est représenté par un fil bleu sur le schéma ci-dessus où il n'est pas très pratique d'utiliser cette couleur.

Le Rasperry Pi est sous tension, une session SSH est en cours et le Sonoff est hors tension, car la connexion 3,3V n'est pas faite. Si le 3,3V est connecté, il faut le déconnecter.

Le Sonoff est placé en mode programmation en appuyant sur l'interrupteur tactile et en le maintenant enfoncé alors qu'on allume le Sonoff ce qui signifie établir la connexion du fil rouge (Vcc = 3,3V).

Puis on relâche le bouton tactile du Sonoff. C'est un peu déconcertant les premières fois, car rien ne se passe. En outre, la DEL du Sonoff ne change pas d'état et demeure éteinte. D'ailleurs c'est l'indication que le ESP8266 est en mode programmation.

Il y a deux démarches facultatives qui sont recommandées.

1. Sauvegardez le micrologiciel actuellement en mémoire flash
pi@raspberrypi:~$ esptool.py --port /dev/ttyAMA0 read_flash 0x00000 0x100000 Sonoff_backup_01.bin
Peut-être qu'il serait possible de restaurer le microprogramme installé en usine à partir de cette sauvegarde. Je n'ai pas testé cela, alors ne comptez pas sur cette possibilité. Une fois cette opération terminée, le Sonoff peut aboutir en mode normal. Vous devrez le remettre en mode programmation en coupant l'alimentation puis en la rétablissant à nouveau tout en gardant le bouton tactile enfoncé.
2. Effacez le contenu de la mémoire flash
pi@raspberrypi:~$ esptool.py --port /dev/ttyAMA0 erase_flash
En fait, je devrais dire que cette étape est obligatoire. Comme je l'ai découvert à mes dépens, on peut obtenir d'étranges erreurs si le microprogramme Sonoff commence à interpréter les bits restants dans la zone de configuration comme des données valides. Une fois cette opération terminée, le Sonoff peut aboutir en mode normal. Vous devrez le remettre en mode programmation en coupant l'alimentation puis en la rétablissant à nouveau tout en gardant le bouton tactile enfoncé.

On utilise le script Python esptool pour téléverser l'image ou les images binaires sur le ESP8266. Selon le cas voici comment faire.

1. Sonoff-MQTT-OTA-Arduino
pi@raspberrypi:~$ cd sonoff-ino pi@raspberrypi:~/sonoff-ino $ esptool.py --port /dev/ttyAMA0 write_flash -fs 8m \ > 0x00000 sonoff-ta.ino.bin
2. Sonoff-MQTT-OTA
pi@raspberrypi:~$ cd sonoff pi@raspberrypi:~/sonoff $ esptool.py --port /dev/ttyAMA0 write_flash -fs 8m \ > 0x00000 boot_v1.6.bin \ > 0x01000 user1.bin \ > 0xFC000 esp_init_data_default.bin \ > 0xFE000 blank.bin
3. NodeMCU
pi@raspberrypi:~$ cd nodemcu pi@raspberrypi:~/nodemcu $ esptool.py --port /dev/ttyAMA0 write_flash -fs 8m \ > 0x00000 nodemcu-master-10-modules-2017-01-18-01-27-00-integer.bin

NOTES
1. Si le dispositif ne fonctionne pas après le téléversement, essayez le mode d'accès DOUT :
pi@raspberrypi:~/nodemcu $ esptool.py --port /dev/ttyAMA0 write_flash -fm dout -fs 8m \ > ... comme ci-dessus

Il semble que les nouvelles versions des dispositifs utilisant le ESP8285 ou le ESP8286, comme le commutateur Sonoff, contiennent une puce de mémoire flash avec le mode d'accès DOUT. J'ai suivi l'astuce du 14 juillet de Theo Arends sur l'utilisation de ce mode lorsque j'ai téléversé son nouveau micrologiciel sur quelques commutateurs nouvellement acquis. Merci à Sébastien Giroux de m'avoir rappelé de mettre à jour ces anciennes instructions.

2. S'il y avait un avertissement concernant une taille de flash incorrectement définie, utilisez l'option « -fs 1MB » au lieu de « -fs 8m » comme requis par les nouvelles versions de esptool.py.
Mise à jour: 2017-11-22

Quand la programmation du micrologiciel est terminée, débrancher et rebrancher l'alimentation du Sonoff. Qu'importe ce qui est affiché à l'écran, esptool ne peut pas faire un « hard reset ». Selon la documentation de esptool l'opération est faite avec le signal de contrôle DTR de la connexion RS323. Or, il n’y a pas de connexion DTR entre le Raspberry Pi et le Sonoff ce qui veut dire que ce dernier reste en mode programmation après le téléversement. Voilà pourquoi il est nécessaire de débrancher puis rebrancher l'alimentation 3,3V du Sonoff pour remettre ce dernier en mode d'opération normal.

Les trois micrologiciels offrent un lien en série. En principe, on peut donc entièrement configurer le Sonoff avec un programme comme miniterm.py, mais en pratique on fait le strict minimum avec les logiciels de Theo Arendt pour pouvoir terminer la configuration avec soit le serveur Web du Sonoff (Sonoff-MQTT-OTA-Arduino seulement), soit en publiant des messages MQTT (les deux logiciels).

1. Sonoff-MQTT-OTA-Arduino
pi@raspberrypi:~/sonoff $ miniterm.py /dev/ttyAMA0 115200 -e
2. Sonoff-MQTT-OTA
pi@raspberrypi:~/sonoff $ miniterm.py /dev/ttyAMA0 115200
3. NodeMCU
pi@raspberrypi:~/sonoff $ miniterm.py /dev/ttyAMA0 115200
Il faut probablement appuyer sur la touche Entrée à quelques reprises pour enfin voir quelque chose: un menu, dans le cas des micrologiciels de Theo Arends, l'invite de l'intepréteur Lua, ">", dans le cas de NodeMCU.

Configuration du Sonoff

Le Sonoff, ou plus exactement le ESP8266 qu'il renferme doit connaître au minimum le nom du réseau local sans fil, son mot de passe et l'adresse IP ou le nom de l'agent MQTT. Puis il faut sans doute plus d'information pour interagir avec un éventuel logiciel de domotique. Comment cette information est fournie au Sonoff dépend du micrologiciel.

1. Sonoff-MQTT-OTA-Arduino

Beaucoup d'information est transmise par le Sonoff vers la liaison en série. Au point où c'est difficile de s'y retrouver initialement. J'ai été surpris de voir qu'il serait possible de connecter le Sonoff au réseau local par WPS... si j'avais les bras assez longs pour rejoindre le routeur au sous-sol alors que mon bureau est à l'étage.

Le plus simple c'est de spécifier le minimum de paramètres pour connecter le Sonoff au réseau local et d'utiliser la page Web du Sonoff pour modifier les autres paramètres. Page Web du Sonoff ? Effectivement, il y a un serveur Web dans le micrologiciel de Theo Arends.

Deux paramètres doivent être spécifiés : le nom du réseau WiFi local et son mot de passe. On écrit le nom du paramètre et sa valeur séparés d'un espace. Il ne faut pas ajouter des guillemets ou autres signes de ponctuation autour du de la valeur du paramètre. Il serait donc préférable de ne pas avoir d'espace dans aucune des valeurs des paramètres.

ssid nom-du-réseau-sans-fil password mot-de-passe-du-réseau-sans-fil Si l'information est correcte, on devrait éventuellement voir quelque chose comme 00:00:00 APP: Project sonoff Sonoff (Topic sonoff, Fallback DVES_20B212, GroupTopic sonoffs) Version 3.2.10 00:00:00 Wifi: Connecting to AP1 LOCAL_NETWORK in mode 11N as sonoff-4638... 00:00:04 Wifi: Connected 00:00:04 mDNS: Initialized 00:00:04 HTTP: Webserver active on sonoff-4638.local with IP address 192.168.0.129 00:00:05 MQTT: Attempting connection... 00:00:07 mDNS: Query done with 0 mqtt services found
Ces deux dernières lignes sont répétées continuellement alors que le Sonoff cherche à se connecter à l'agent MQTT avec la mauvaise adresse. Il faut repérer la ligne en gras qui dit à quelle adresse IP se trouve le serveur web du Sonoff.

Le panneau à gauche montre la page d'accueil du serveur web du Sonoff. On peut voir l'état du relais en très grosses lettres, on peut commuter cet état en cliquant sur Toggle. On complète la configuration du Sonoff en cliquant sur le bouton Configuration. Quand on clique sur ce bouton, on arrive à un second menu qu'on peut voir dans le panneau du centre de la figure.

La configuration WiFi est en partie complété sinon on ne serait pas rendu ici. En revanche il faut configurer le service MQTT. On peut voir la seule chose que j'ai du faire sur la panneau à droite : entrer l'adresse IP de l'agent MQTT.

Contrôle du Sonoff avec Domoticz

Sonoff-MQTT-OTA-Arduino prend en charge l'intégration du Sonoff au programme de domotique Domoticz. L'intégration du commutateur Sonoff programmé avec Sonoff-MQTT-OTA-Arduino ne peut pas être plus simple. C'est un processus en trois étapes. En premier, dans Domoticz, il faut créer un commutateur virtuel sur le matériel virtuel nommé Dummy (Does nothing, use with virtual switches only) qui sera utilisé pour activer ou désactiver le commutateur distant. Voici un aperçu rapide des étapes.

  1. Cliquer sur l'onglet Réglages.
  2. Cliquer sur le choix Matériel dans le menu.
  3. Si le matériel virtuel Dummy (Does nothing, ...) existe déjà, passez à l'étape suivante.
    • Compléter les champs
      Nom: = Virtuel, and
      Type: = Dummy (Does nothing... qu'on sélectionne dans la liste déroulante.
    • Cliquer sur le bouton Ajouter au bas de la page. Le matériel virtuel sera rajouté au tableau au haut de la page.
  4. Cliquer sur Créer capteurs virtuels dans le matériel virtuel.
  5. Nommer le capteur TestSonoff et fixer le Type de capteur: à Interrupteur.
  6. Cliquer sur l'onglet Réglages.
  7. Cliquer sur le choix Dispositifs dans le menu.
  8. Repérer le numéro d'index (colonne idx) de l'interrupteur nouvellement créé.

La deuxième étape consiste à retourner à la configuration du Sonoff dans sa page Web. Cliquer sur le bouton Configuration puis sur le bouton Configure Domoticz, changer le numéro Idx au numéro d'index de l'interrupteur virtuel nouvellement créé.

Ces deux premières étapes seront répétées pour chaque Sonoff additionnel. La troisième étape n'a besoin d'être faite qu'une fois.

  1. Cliquer sur l'onglet Réglages.
  2. Cliquer sur le choix Matériel dans le menu.
  3. Si le matériel MQTT Client Gateway with LAN interface existe déjà dans le tableau passer à l'étape suivante.
    • Compléter les champs
      Nom: = MQTT, et
      Type: = MQTT Client Gateway with LAN interface qu'on sélectionne dans la liste déroulante.
    • Cliquer sur le bouton Ajouter au bas de la page. Le matériel MQTT sera rajouté au tableau au haut de la page.
  4. Cliquer sur la ligne MQTT Client Gateway with LAN interface.
  5. Sélectionner out pour Publish Topic: dans la liste déroulante.
  6. Cliquer le bouton Modifier à gauche sous le tableau du matériel.

Il ne reste qu'à vérifier que tout fonctionne. Cliquez sur l'icône de l'interrupteur virtuel nouvellement créé qu'on retrouve sur l'onglet Interrupteurs. La DEL du Sonnof devrait suivre indiquant l'état du dispositif. Cliquez sur l'interrupteur tactile du Sonoff et l'état de l'icône de l'interrupteur virtuel devrait refléter l'état du Sonoff. La rétroaction dans ce sens est plus lente, il faut compter une seconde ou deux avant que l'état de l'interrupteur virtual change.

2. Sonoff-MQTT-OTA

Quand on met sous tension le Sonoff programmé avec Sonoff-MQTT-OTA, la DEL du commutateur devrait clignoter trois fois immédiatement, puis à intervalle régulier tant qu'il n'est pas connecté à un réseau sans fil.

Maintenant il faut modifier les paramètres WiFi du Sonoff pour que, justement, il soit accessible sur le réseau local. Si ce n'est déjà fait, ouvrir un terminal avec le Sonoff. Il faut probablement appuyer sur la touche Entrée à quelques reprises pour enfin voir le menu.

pi@raspberrypi:~/sonoff $ miniterm.py /dev/ttyAMA0 115200 pi@raspberrypi:~ $ miniterm.py /dev/ttyAMA0 115200 --- Miniterm on /dev/ttyAMA0 115200,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- ^␀@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ SYNTAX = Status, Upgrade, Otaurl, Restart, Reset, Smartconfig, SSId, Password, Host, GroupTopic, Topic, Timezone, Light, Power

Un minimum de trois paramètres doit être spécifié: le nom du réseau WiFi (SSID), son mot de passe du réseau et le nom ou l'adresse IP de l'agent MQTT (Host). On écrit le nom du paramètre et sa valeur séparés d'un espace. Il ne faut pas ajouter des guillemets ou autres signes de ponctuation autour du de la valeur du paramètre. Il serait donc préférable de ne pas avoir d'espace dans aucun de ces paramètres.

ssid name-of-network password wifi-password host mqtt-server-ip Si l'information est correcte on devrait éventuellement voir quelque chose comme connected with RESEAU_LOCAL, channel 1 dhcp client start... chg_B2:0 ip:192.168.0.147,mask:255.255.255.0,gw:192.168.0.1 NAME = Sonoff switch VERSION = 0.5.6 FALLBACKTOPIC = DVES_B0C19F Mon Jan 23 00:42:17 2017
Il se peut très bien que ce qu'on verra à l'écran ne sera pas aussi clair. Le micrologiciel tente d'établir une connexion WiFi régulièrement et affiche toute sorte d'information qu'il faut l'ignorer en continuant à écrire la commande comme si de rien n'était.

Contrôle du Sonoff avec MQTT

Il est temps de vérifier que tout fonctionne. Selon le programme de Theo Arends, le Sonoff publie ses messages MQTT sous le sujet stat/sonoff et souscrit aux messages dont le sujet est cmnd/sonoff. Donc ouvrons un terminal pour souscrire aux messages provenant du Sonoff

michel@hp:~$ mosquitto_sub -h 192.168.0.22 -v -t "stat/sonoff/#"

Dans un autre terminal on peut publier des commandements:

michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "cmnd/sonoff/power" -m "on" michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "cmnd/sonoff/power" -m "off" michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "cmnd/sonoff/power" -m "toggle" michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "cmnd/sonoff/power" -m "toggle" michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "cmnd/sonoff/status" -m "1"
La DEL du Sonoff clignotera deux fois à chaque commande.

Le terminal qui souscrit au sujet stat/sonof affichera

stat/sonoff/POWER On stat/sonoff/POWER Off stat/sonoff/POWER On stat/sonoff/POWER Off stat/sonoff/STATUS 0.5.6, sonoff, POWER, 1, 1, sonoffs, DVES_B01C19, http://sidnas2:80/api/sonoff/user1.bin, mySSid, SSidPassword, 192.168.9.22, 1

En appuyant sur l'interrupteur tactile du Sonoff, l'état du relais change. En même temps, un message donnant l'état du relais est envoyé à l'agent MQTT.

Il y a un problème évident, tous les Sonoff programmés ainsi répondent au même message /cmnd/sonoff/ et il est impossible de distinguer quel dispositif envoye un message /stat/sonoff/. Mais Theo Arends a prévu le coup et a défini un message MQTT pour changer le sujet. J'utilise les 3 derniers chiffres hexadécimaux de l'adresse MAC du ESP8266 pour définir un sujet MQTT unique pour chaque Sonoff. Ces chiffres sont affichés dans le rapport de statut comme vu ci-dessus.

Pour voir ce qui se passe, j'ai terminé la souscription à l'agent MQTT en appuyant sur CtrlC dans son terminal. Puis, j'ai souscrit à tous les messages /stat

michel@hp:~$ mosquitto_sub -h 192.168.0.22 -v -t "stat/#"

Maintenant, j'ai publié un message changeant le sujet:

michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "cmnd/sonoff/topic" -m "sonoffB01C19"
et voici ce qui s'affiche sur le terminal qui souscrit à l'agent MQTT:
stat/sonoff/TOPIC sonoffB01C19 stat/sonoffB01C19/NAME Sonoff switch stat/sonoffB01C19/VERSION 0.5.6 stat/sonoffB01C19/FALLBACKTOPIC DVES_B01C19
Dorénavant, le Sonoff utilise les messages /stat/sonoffB01C19 et /cmnd/sonoffB01C19 pour communiquer ses réponses et pour obtenir ses commandements respectivement.

Pour que ceci fonctionne correctement, il ne doit y avoir qu'un seul Sonoff utilisant encore les sujets génériques cmnd/sonoff/ et stat/sonoff/. Autrement, tous les commutateurs utiliseront le nouveau sujet et nous serons de retour à la case départ.

En passant, voilà comment facilement récupérer le sujet des messages d'un Sonoff modifié de cette façon: souscrire auprès de l'agent MQTT aux messages "/stat/#" puis cliquer sur le bouton du Sonoff.

3. NodeMCU

Puisqu'il n'y a pas de script intitulé init.lua, le Sonoff ne fait rien. On peut toutefois s'assurer que l'interpréteur Lua est bien en fonction. Supposant que le miniterm.py est connecté on devrait voir l'invite '>' quitte a appuyez à quelque reprises sur Entrée.

pi@raspberrypi:~/nodemcu $ miniterm.py /dev/ttyAMA0 115200 --- Miniterm on /dev/ttyAMA0 115200,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- > > print(4/3) 1 >
Ainsi 4/3 est égal à 1 ? Bien oui... en arithmétique en nombre entier.

On a besoin d'un script Lua pour prendre en charge le Sonoff. Heureusement, il y en a un, de Michael Andresen à captain-slow.dk. Je l'ai copié et modifié très légèrement pour faciliter l'adaptation au réseau local. On peut le télécharger: sonoff_01.lua.

Ajuster les paramètres au début du fichier:

-- These five parameters must be set to proper values SSID = "yourWiFiSSid" PSK = "yourWiFiPassword" mqttBroker = "192.168.1.30" mqttUser = "" mqttPass = "" -- If more than one Sonoff is connected, use these parameters to distinguish them deviceID = "bugzapper" roomID = "1"

On utilise nodemcu-uploader pour téléverser le script au Sonoff.

pi@raspberrypi:~ $ cd nodemcu pi@raspberrypi:~/nodemcu $ nodemcu-uploader --port /dev/ttyAMA0 upload sonoff_01.lua opening port /dev/ttyAMA0 with 115200 baud Preparing esp for transfer. Transferring sonoff_01.lua as sonoff_01.lua All done!

Avant de lancer le script, il est préférable de s'abonner à tous les messages MQTT dans un autre terminal.

michel@hp:~$ mosquitto_sub -h 192.168.0.22 -v -t "#"

On peut lancer le script avec nodemcu-uploader mais on obtient plus d'information en ouvrant une session avec le Sonoff.

pi@raspberrypi:~/nodemcu $ miniterm.py /dev/ttyAMA0 115200 --- Miniterm on /dev/ttyAMA0 115200,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- Frapper Entrée à quelques reprises > > dofile('sonoff_01.lua') > MQTT connected to:192.168.0.22 MQTT subscribed to /home/1/testNodeMCU
La connexion à l'agent MQTT prend un certain temps.

En appuyant sur l'interrupteur tactile du Sonoff on observe trois choses, la DEL clignote, le terminal abonné à l'agent affiche

/home/1/testNodeMCU/state ON
et le Sonoff indique le changement d'état sur le terminal.
Was off, turning on

En envoyant le message "OFF" sur le sujet "/home/1/testNodeMCU"

michel@hp:~$ mosquitto_pub -h 192.168.0.45 -t "/home/1/testNodeMCU" -m "OFF"
on renverse l'état du commutateur.

Références

Deux articles au sujet de la programmation d'un ESP8266 avec un Raspberry Pi ont servi de point de départ. Voici les références : Connect ESP8266 to Raspberry Pi et Use ESP8266 module as a wireless switcher de Razvan Dubau.

La page Identifying Your Model of Raspberry Pi indique comment identifier le modèle du Raspberry Pi. Voir la section intitulée Identifying Your Board Once Booted.

Pour ce qui est port UART du Raspberry Pi, j'ai consulté Configuring The GPIO Serial Port On Raspbian Jessie Including Pi 3 de Jon Watkin.