2017-05-19
Mise à jour: 2017-11-22
Programmation du Sonoff dans l'EDI Arduino (1)

Cette continuation du billet du 17 mai, Programmation du Sonoff dans l'EDI Arduino (1), montre comment j'ai téléversé le micrologiciel Sonoff-MQTT-OTA-Arduino de Theo Arends sur un commutateur Wifi Sonoff de ITEAD. Ce micrologiciel est complet tout en permettant une prise en charge simple du commutateur avec le programme de domotique Domoticz.

Prérequis

Un serveur MQTT doit être installé sur le réseau local. Le Raspberry Pi qui est l'hôte du logiciel de domotique est aussi l'hôte de Mosquitto mqtt sur mon réseau. Voir ici pour les instructions (an anglais seulement) sur l'installation de ce serveur.

Avant d'installer Sonoff-MQTT-OTA-Arduino il faut installer pubsubclient, une bibliothèque MQTT pour Arduino de Nick O'Leary. On commence en clonant le dépôt avec le logiciel de version Git, puis on copie les fichiers source de la bibliothèque dans un sous répertoire du répertoire ~/Arduino/libraries

michel@hp:~$ cd Arduino michel@hp:~/Arduino$ git clone https://github.com/knolleary/pubsubclient.git Clonage dans 'pubsubclient'... remote: Counting objects: 692, done. remote: Total 692 (delta 0), reused 0 (delta 0), pack-reused 692 Réception d'objets: 100% (692/692), 209.17 KiB | 382.00 KiB/s, fait. Résolution des deltas: 100% (325/325), fait. michel@hp:~/Arduino$ cd libraries michel@hp:~/Arduino/libraries$ mkdir pubsubclient michel@hp:~/Arduino/libraries$ cp ../pubsubclient/src/* pubsubclient

Si l'on n'a pas Git, on peut télécharger une archive Zip de la dernière version de la bibliothèque. On obtient cette archive du site githup de pubsubclient. Cliquer sur le bouton vert Clone or download, puis cliquer sur Download ZIP et sauvegarder l'archive pubsubclient-master.zip dans un dossier. Après, il faut extraire les deux fichiers du répertoire pubsubclient-master/src/ dans le dossier ~/Arduino/libraries/pubsubclient. Attention aux minuscules et majuscules qu'on doit distinguer dans Linux.

Il faut modifier la taille maximum des paquets MQTT dans le fichier PubSubClient.h. La valeur du paramètre doit être augmentée à au moins 4OO octets. J'ai opté pour 512 octets. Cette définition se trouve à la ligne 26 du fichier.

michel@hp:~/Arduino/libraries$ nano pubsubclient/PubSubClient.h
... // MQTT_MAX_PACKET_SIZE : Maximum packet size #ifndef MQTT_MAX_PACKET_SIZE #define MQTT_MAX_PACKET_SIZE 512 #endif
Si l'on omet cette étape, presque tout fonctionne sauf qu'on ne peut éteindre ou allumer le Sonoff de Domoticz. Je n'ose pas dire le temps perdu parce que j'avais escamoté cette étape! Pourtant le Wiki de Theo Arends est très clair à ce sujet et je n'avais pas oublié de faire cet ajustement la première fois que j'ai installé le micrologiciel.

Obtenir le micrologiciel Sonoff-MQTT-OTA-Arduino

Comme à l'étape précédente, on peut cloner le dépôt de Theo Arends pour obtenir Sonoff-MQTT-OTA-Arduino dans le dossier ~/Arduino.

michel@hp:~/Arduino/libraries$ cd .. michel@hp:~/Arduino$ git clone https://github.com/arendst/Sonoff-MQTT-OTA-Arduino.git Clonage dans 'Sonoff-MQTT-OTA-Arduino'... remote: Counting objects: 1632, done. remote: Total 1632 (delta 0), reused 0 (delta 0), pack-reused 1631 Réception d'objets: 100% (1632/1632), 6.05 MiB | 1.01 MiB/s, fait. Résolution des deltas: 100% (927/927), fait.

Comme auparavant, on peut aussi obtenir Sonoff-MQTT-OTA-Arduino sans Git. Le code est disponible du site GitHub de l'auteur. Cliquer sur le bouton vert Clone or download, puis cliquer sur Download ZIP et sauvegarder l'archive Sonoff-MQTT-OTA-Arduino-master.zip dans un dossier.

Il n'est pas nécessaire de tout extraire de l'archive. Il suffit d'extraire le contenu du répertoire Sonoff-MQTT-OTA-Arduino-master/sonoff/ dans le dossier ~/Arduino/sonoff.

Paramétrage de Sonoff-MQTT-OTA-Arduino

Si l'on double-clique le fichier ~/Arduino/Sonoff-MQTT-OTA-Arduino/sonoff/sonoff.ino (installation avec Git) ou ~/Arduino/sonoff/sonoff.ino (installation à partir de l'archive), l'EDI Arduino sera automatiquement lancé et le croquis avec tous ses composants seront chargés dans l'éditeur. On peut aussi lancer l'EDI Arduino puis ouvrir le même fichier avec le choix Ouvrir... du menu Fichier ou en appuyant sur les deux touches CtrlO.

Puisque j'ai un bon nombre de Sonoff à programmer, j'ai modifié le fichier user_config.h en tenant compte des adresses du réseau WiFi et du serveur MQTT locaux.

26| // -- Wifi ----------------------------------- 27| #define STA_SSID1 "xxxxx" //**MD** [Ssid1] Wifi SSID 28| #define STA_PASS1 "xxxxxxxx" //**MD** [Password1] Wifi password 29| #define STA_SSID2 "xxxxxx" //**MD** [Ssid2] Optional alternate AP Wifi SSID 30| #define STA_PASS2 "xxxxxxxxxxxx" //**MD** [Password2] Optional alternate AP Wifi password ... 34| // -- Syslog --------------------------------- 35| #define SYS_LOG_HOST "http://192.168.0.22" //**MD** [LogHost] (Linux) syslog host 41| // -- Ota ------------------------------------ 42| #define OTA_URL "http://192.168.0.22/sonoff/" PROJECT ".ino.bin" //**MD** [OtaUrl] ... 50| #ifdef USE_MQTT_TLS ... 56| #else 57| #define MQTT_HOST "192.168.0.22" //**MD** [MqttHost] 58| #define MQTT_PORT 1883 // [MqttPort] MQTT port (10123 on CloudMQTT) 59| #define MQTT_USER "" //**MD** [MqttUser] Optional user "DVES_USER" 60| #define MQTT_PASS "" //**MD** [MqttPassword] Optional password "DVES_PASS" 61| #endif ... 114| // -- Time - Up to three NTP servers in your region 115| #define NTP_SERVER1 "pool.ntp.org" 116| #define NTP_SERVER2 "ca.pool.ntp.org" //**MD** "nl.pool.ntp.org" 117| #define NTP_SERVER3 "0.ca.pool.ntp.org" //**MD** "0.nl.pool.ntp.org" 118| 119| // -- Time - Start Daylight Saving Time and timezone offset from UTC in minutes | //**MD** #define TIME_DST Last, Sun, Mar, 2, +120 // Last sunday in march at 02:00 +120 minutes 120| #define TIME_DST Second, Sun, Mar, 2, -180 //**MD** Second sunday in march at 02:00, ADT (DST) = UTC -180 minutes = UTC - 3 hours 121| 122| // -- Time - Start Standard Time and timezone offset from UTC in minutes | //**MD** #define TIME_STD Last, Sun, Oct, 3, +60 // Last sunday in october 02:00 +60 minutes 123| #define TIME_STD First, Sun, Nov, 2, -240 //**MD** First sunday in november at 02:00, AST (STD) = UTC -240 minutes = UTC - 4 hours 125| // -- Application ---------------------------- 126| #define APP_TIMEZONE 99 //**MD** [Timezone] +1 hour (Amsterdam) (-12 .. 12 = hours from UTC, 99 = use TIME_DST/TIME_STD)

Inutile de spécifier la constante DOMOTICZ_RELAY_IDX1 ici. L'index Domoticz de chaque Sonoff sera différent. De plus, cet index a plus d'une fois été modifié alors que j'ai expérimenté avec le logiciel de domotique. Plus loin, je montrerai comment définir cette valeur.

Si je comprends correctement, "pool.ntp.org" est un «nbsp;site virtuel » de serveurs de temps fournis bénévolement pour réduire la charge sur les serveurs de temps de premier niveau. Le domaine "ca.pool.ntp.org" correspond aux serveurs situés au Canada et "0.ca.pool.ntp.org" est un serveur aléatoire dans ce domaine.

À la lecture de deux paragraphes du site www.pool.ntp.org, il faudrait probablement examiner cette utilisation de ce service.

Si votre fournisseur d'accès possède un serveur de temps ou si vous connaissez un bon serveur de temps près de chez vous, vous devriez utiliser celui-ci et non pool.ntp.org : vous obtiendrez probablement une heure plus précise et utiliserez moins de ressources réseau. Si vous ne connaissez qu'un serveur de temps près de chez vous, vous pouvez bien sûr utiliser celui-ci et deux serveurs de pool.ntp.org.
Si vous synchronisez un réseau à pool.ntp.org, veuillez configurer un de vos ordinateurs comme serveur de temps et synchroniser les autres ordinateurs à celui-là. (Vous devrez vous renseigner, mais ce n'est pas difficile. Et il y a toujours le forum comp.protocols.time.ntp.)
Éventuellement, le Raspberry Pi qui accueille Domoticz pourrait fournir le temps aux Sonoff.

Au Canada, l'heure avancée commence le deuxième dimanche de mars et se termine le premier dimanche de novembre (ref). Puisque j'ai pris la peine de modifier TIME_DST et TIME_STD, aussi bien utiliser ces définitions d'où la valeur 99 pour APP_TIMEZONE.

Conserver les changements au fichier user_config.h en cliquant sur le bouton Enregistrer ou sur le choix Enregister dans le menu Fichier ou en appuyant sur les touches Ctrl S.

Téléversement du micrologiciel vers le Sonoff

La procédure pour téléverser le micrologiciel est la même que celle utilisée dans le billet précédent pour téléverser le croquis Blink

Contrôle du Sonoff avec Domoticz

L'intégration du commutateur Sonoff programmé avec Sonoff-MQTT-OTA-Arduino avec le logiciel de domotique Domoticz est facile. Si le « matériel MQTT » est déjà installé Domoticz, c'est un processus en deux é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 matériel. Voici un aperçu rapide de la démarche nécessaire.

  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 (Test-Sonoff dans cet exemple, mais choisir un nom plus adapté en réalité) 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éé.

Pour la deuxième étape, le Sonoff devrait être branché et relié à une lampe pour facilement procéder à sa configuration. J'ai trouvé utile de modifier une vieille rallonge pour lampes pour faire cette vérification à répétition. Sur la photographie, l'on peut voir que j'ai coupé la rallonge pour garder que les deux connecteurs avec une petite longueur du câble dont j'ai dénudé les extrémités. J'ai soudé les fils en cuivre torsadés pour faciliter l'insertion dans les connexions du Sonoff. D'ailleurs, j'ai ajouté des tubes thermotrétrécisable sur ces quatre gaines pour une meilleure manutention.

Cette rallonge est tellement vieille que la fiche électrique n'est pas polarisée. Alors du ruban collant vert marque clairement la mise à terre (aussi marqué N comme sur le Sonoff).

La configuration du Sonoff se résume à spécifier le numéro d'index (idx) de l'interrupteur virtuel qui le représente dans Domoticz. Ceci se fait en utilisant le serveur Web du Sonoff dont l'adresse IP a été récupérée dans le moniteur série de l'EDI Arduino lors du téléversement du micrologiciel. Si l'on a pas cette adresse alors on peut obtenir la liste de toutes les adresses IP utilisées sur le réseau local avec les commandements nmap -sn 192.168.0.0/24 ou fping -r 2 -aqg 192.168.0.0/24.
Je trouve plus facile d'utiliser NetX sur une tablette Android, car les dispositifs ESP8266 d'Espressif (tel qu'utilisé dans le commutateur Sonoff) sont identifiés avec cette application.

Ces deux étapes seront répétées pour chaque Sonoff additionnel.

Si le « matériel MQTT » n'est pas déjà installé dans Domoticz, voici comment procéder.

  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.

Notez que ceci n'a besoin d'être fait qu'une seule fois.

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. 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 virtuel change.

Programmation du Sonoff dans l'EDI Arduino (1)