May 30th, 2017

Dans le premier billet de cette série, j'ai montré comment installer Domoticz un serveur domotique sur un Raspberry Pi. Ci-dessous, j'installerai un serveur MQTT sur un Raspberry Pi 3. Il s'agit d'un protocole de communication qui sera utilisé comme intermédiaire entre le serveur Domoticz et le matériel basé sur la puce ESP8266 que j'utilise pour contrôler des dispositifs.

Pour l'essentiel, j'avais déjà examiné le sujet dans deux billets intitulés Add an MQTT Broker to the Raspeberry Pi et Add MQTT to Domoticz. Néanmoins, j'espère que la présentation qui suit est meilleure. Au moins, elle est disponible en français. Ci-dessous il est question d'une utilisation de MQTT avec un Raspberry Pi 3, mais il est possible de suivre les instructions et d'installer ce service sur n'importe quel modèle Raspberry Pi.

Table des matières

  1. Qu'est-ce que MQTT ?
  2. Installation de Mosquitto MQTT
  3. Test de Mosquitto MQTT
  4. Ajout d'un commutateur virtuel dans Domoticz
  5. Activation de MQTT dans Domoticz
  6. Test de MQTT dans Domoticz

  1. Qu'est-ce que MQTT ?
  2. Message Queue Telemetry Transport, MQTT pour abréger, est un protocole de messagerie utile dans la communication entre les dispositifs de l'Internet des objets. Fait intéressant, le protocole a été développé en 1999, alors que l'IdO, qui connaît une croissance rapide, en était à ses balbutiement.

    Le MQTT utilise un paradigme de publication-abonnement. Nous comprenons tous les connexions point à point entre les pairs. C'est la base des conversations téléphoniques entre deux personnes. La connexion client-serveur est un autre liaison point à point bien connu. Pour afficher une page Web, un navigateur, qui est le client, demande la page à un serveur HTML qui peut envoyer la page ou qui peut refuser de le faire. Dans ces types de liens, chaque partie doit adresser ses messages à son interlocuteur intentionnellement. Avec MQTT, les dispositifs peuvent publier des données ou s'abonner pour recevoir des données après d'un «courtier». Certains appareils publient en même temps qu'ils sont abonnés. Lorsqu'un dispositif publie des données, il n'est pas nécessaire qu'il sache quels seront les dispositifs qui sont abonnés pour les recevoir. Un dispositif abonné, reçoit des données lorsqu'elles sont disponibles sans avoir à les demander d'un dispositif particulier. Au lieu de cela, le courtier agit comme un centre d'information qui reçoit toutes les données publiées organisées par «sujets», et envoie ces données à tous les abonnés de chaque sujet spécifique.

    L'utilisation d'un courtier signifie que la publication de données d'un à plusieurs dispositifs est possible en même temps que la lecture de données de plusieurs vers un seul dispositif. Voici un arrangement typique.

    Source des icônes : EpicCoders de www.flaticon.com, licence CC 3.0 BY

    Le climatiseur est enregistré auprès du serveur MQTT pour recevoir toutes les messages au sujet de la «température» et de l'«humidité». Les capteurs de température et d'humidité ne sont pas enregistrés pour recevoir des messages, ils ne font que publier des messages vers le courtier.

    Toutes les dix minutes, le capteur de température publie la température ambiante. Dans la pratique, cela signifie qu'il envoie un seul numéro, disons 23, sous le sujet «température» au courtier MQTT, pour qu'il fait actuellement 23°C. De même, toutes les quinze minutes, le capteur d'humidité publie des messages au sujet de l'«humidité» vers le courtier MQTT, pour signifier que le facteur d'humidité est de 62%. À son tour, le courtier MQTT transmet ces messages à l'unité de conditionnement d'air. Cette dernière décide si elle doit s'allumer ou s'éteindre sur la base de ces deux mesures. C'est Internet des objets au travail.

    Un programme de domotique qui prend en charge le protocole MQTT peut être ajouté au système pour fournir "intelligence" et contrôle. L'architecture du système pourrait être quelque chose comme ci-dessous.

    Source des icônes : EpicCoders de www.flaticon.com, licence CC 3.0 BY

    Le programme de domotique est abonné auprès du courtier MQTT pour recevoir toutes les messages aux sujets de la «température», de la «pression» et de l'«état du climatiseur». Le climatiseur est abonné auprès du serveur MQTT pour recevoir toutes les messages sur le thème «climatisation».

    Comme auparavant, les capteurs de température et d'humidité publient des données vers le courtier. Mais maintenant, le programme de domotique qui est abonné pour recevoir cette information décide si le climatiseur doit être allumé ou éteint en tenant compte des données du capteur, de l'heure, du délai depuis la dernière fois que l'appareil est allumé ou éteint, la présence de personnes dans la maison, etc. Il ordonne au climatiseur de se mettre en marche ou de cesser de fonctionner en publiant un message sur le thème «climatisation». Le climatiseur publie des modifications sur son état sous le thème "état du climatiseur". Parce que le programme de domotique est abonné à ce thème, il sait quand la climatisation a été activée ou désactivée par un individu.

    Les choses ne sont pas aussi simples, bien sûr. MQTT est un protocole de "transport", il ne dit rien sur le contenu des messages. Ce 23 du capteur de température veut-il dire 23° centigrade ou 23° Fahrenheit ? À moins que les capteurs de température et d'humidité ne soient fabriqués par la même entreprise qui fait le climatiseur, et à moins que l'un de ces périphériques ne gère un courtier MQTT, il y a très peu de chances que cela fonctionne sans un travail de préparation plus ou moins important. Pour le vrai IdO, où l'on peut acheter des capteurs d'un producteur, des appareils d'un autre et un pont avec un logiciel de domotique d'une troisième entreprise, il faut une syntaxe de message IdO universelle que MQTT pourrait transporter.

    Des efforts ont été déployés dans cette direction, voir Homie une convention MQTT pour l'IdO de Marvin Roger, par exemple. Autant que je sache, rien n'a encore émergé qui soit largement utilisé. Néanmoins, il est bon d'utiliser MQTT. Il est pris en charge par Domoticz. L'utilisation d'un protocole standard est toujours une meilleure idée que la création d'une solution ad hoc. Mais comme cela deviendra évident, beaucoup de "colle" doivent être appliqués pour regrouper des éléments disparates.

  3. Installation de Mosquitto MQTT
  4. La seule exigence réelle concernant l'hôte du courtier MQTT est que l'ordinateur soit toujours en marche et connecté au réseau local. Le Raspberry Pi hébergeant le serveur Domoticz est probablement le meilleur choix pour la plupart. Heureusement, l'un des version à source ouverte la plus connue de MQTT, Mosquitto, fonctionne sur le petit ordinateur. Suivant les instructions, j'ai pu installer ce logiciel sans problème.

    Pour utiliser le dépôt Mosquitto Debian à Mosquitto.org, il faut importer la clé de signature et mettre le référentiel à la disposition de apt-get :

    pi@rpi2b:~ $ wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key pi@rpi2b:~ $ sudo apt-key add mosquitto-repo.gpg.key pi@rpi2b:~ $ cd /etc/apt/sources.list.d/ pi@rpi2b:/etc/apt/sources.list.d $ sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list

    Le paquet peut maintenant être installé et après, pour nettoyer, la clé du référentiel Mosquitto peut être effacée.

    pi@rpi2b:/etc/apt/sources.list.d $ cd $home pi@rpi2b:~ $ sudo apt-get udpate pi@rpi2b:~ $ sudo apt-get install mosquitto pi@rpi2b:~ $ rm mosquitto-repo.gpg.key

    Le serveur étant installé, assurons nous qu'il est en place :

    pi@domo:~ $ systemctl status mosquitto ● mosquitto.service - Mosquitto MQTT Broker Loaded: loaded (/lib/systemd/system/mosquitto.service; disabled) Active: active (running) since Tue 2017-05-30 12:06:43 ADT; 9min ago Docs: man:mosquitto(8) https://mosquitto.org/ Main PID: 1547 (mosquitto) CGroup: /system.slice/mosquitto.service └─1547 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

    Redémarrez et assurez-vous que MQTT de Mosquitto est actif en demandant à systemctl le statut de mosquitto comme ci-dessus. Si le service mosquitto n'a pas démarré, vous pouvez essayer de l'activer explicitement :

    pi@domo:~ $ sudo systemctl enable mosquitto.service Synchronizing state for mosquitto.service with sysvinit using update-rc.d... Executing /usr/sbin/update-rc.d mosquitto defaults Executing /usr/sbin/update-rc.d mosquitto enable
    Dorénavant, mosquitto devrait être lancé automatiquement lors du démarrage de Raspbian.

    Il n'est pas nécessaire, mais vous pouvez installés les clients de Mosquitto sur le Raspberry Pi:

    pi@domo:~ $ sudo apt-get install mosquitto-clients
    Des exemples d'utilisation des clients se trouvent dans la prochaine section.

  5. Test de Mosquitto MQTT
  6. Maintenant qu'un serveur MQTT est installé, je vous recommande de lire les excellentes instructions de Elliot Williams à Hackaday comme introduction à l'utilisation du protocole. Ou vous pouvez lire ce qui suit.

    J'ai installé les clients Mosquitto sur mon bureau Ubuntu à l'aide de la logithèque. Cela peut aussi être fait avec Synaptic ou même avec apt-get dans une fenêtre de terminal. La combinaison de clavier qui ouvre un terminal dans Ubuntu est Alt Ctrl T.

    michel@hp:~ $ sudo apt-get install mosquitto-clients
    Autrement, vous pouvez ouvrir des sessions ssh avec le Raspberry Pi et utiliser ses clients Mosquitto s'ils sont installés.

    Les clients sont deux programmes: mosquitto_sub pour s'abonner au serveur MQTT afin de recevoir des messages et mosquitto_pub pour publier des messages auprès du courtier. Nous allons ouvrir deux terminaux, celui qui s'abonne aux messages et l'autre pour publier des messages. Pour éviter toute confusion, j'ai changé les titres des terminaux (regardez dans le menu Terminal).

    Dans le terminal Subscribe, abonnez-vous auprès du courtier MQTT sur le Raspberry Pi à l'adresse IP 192.168.0.22 à tous les sujets qui commencent par «home»:

    michel@hp:~$ mosquitto_sub -h 192.168.0.22 -v -t "home/#"
    Comme on le voit sur l'image, il ne se passe rien. Le programme est en cours d'exécution, mais rien n'apparaîtra tant que le serveur MQTT n'obtienne un message sous le thème «home».

    Dans le terminal Publish, publiez un message vers le courtier MQTT

    michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "home/temperature" -m "21"

    Le serveur enverra ce message vers le processus mosquitto_sub toujours en cours d'exécution dans le terminal Subscribe. Ce dernier affichera le message reçu: sujet en premier, et le message après

    Continuez à expérimenter. Ouvrez un troisième terminal et abonnez-vous sur le même sujet. Ensuite, publiez un nouveau message et vous verrez que les deux clients abonnés afficheront le message. Publiez des messages sur d'autres sous-thèmes tels que «maison/humidité». Essayez de publier un message avec "test/temperature" en tant que sujet.

    Pour quitter les clients abonnés, appuyez sur la combinaison de touches Ctrl C.

    Thèmes MQTT

    À partir de ce qui précède, il est évident que les thèmes ou sujets MQTT sont hiérarchiques et représentés d'une manière très similaire aux chemins de fichiers complets (en utilisant le séparateur Unix '/'). Et, un peu comme les noms de fichiers, il existe des caractères génériques:

    # qui représente tous les sujets de niveau inférieur. Par conséquent, s'abonner à la maison/# signifie que le courtier enverra tous les messages avec des sujets tels que maison, maison/humidité, maison/température, maison/température/centigrade, maison/température/fahrenheit, et ainsi de suite.
    + qui représente un niveau unique dans la hiérarchie des sujets. Par conséquent, l'abonnement à la maison/+/commutateurs signifie que les messages avec des sujets tels que maison/chambre/commutateurs et maison/cuisine/commutateurs seront reçus, mais pas ceux dont le thème est maison/interrupteurs ni maison ni interrupteurs.

    Pour des raisons évidentes, vous ne pouvez pas avoir un des caractères '/', '#' ou '+' dans le sujet. Il n'est pas judicieux d'inclure ces caractères dans un nom d'utilisateur ou un identifiant de client (voir le conseil de sécurité CVE-2017-7650 de mosquitto.org. Vous pouvez utiliser le texte codé UTF-8 dans des sujets tels que /saison/été. Au moins dans Linux. Pour ce qui est de Windows, qui utilise un codage Unicode 16 bitsau lieu de UTF-8, je n'ai pas encore vérifié.

    Lors du débogage de la communication avec un serveur MQTT, il peut s'avérer utile de s'abonner à toutes les rubriques:

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

  7. Ajout d'un commutateur virtuel dans Domoticz
  8. Jusqu'à présent, aucun périphérique n'a été ajouté à la base de données Domoticz sur le Raspberry Pi 3. Il sera difficile de tester M QTT en conjonction avec le programme de domotique sans au moins un commutateur virtuel. La procédure pour en ajouter un, qui sera éventuellement lié à un commutateur physique, est presque exactement la même que celle suivie dans le billet intitulé X10 On/Off Switches with a CM11A Interface in Domoticz.

    La première étape consiste à créer un matériel "fictif", car Domoticz ne sait pas comment gérer les commutateurs WiFi que je vais installer ultérieurement.

    1. Cliquez sur l'onglet Setup.
    2. Selectionnez Hardware dans le menu déroulant.
    3. Entrez un nom pour le matériel; J'ai choisi Virtual.
    4. Comme Type selectionnez Dummy (Does nothing, use for virtual switches only) dans la liste déroulante.

    5. Add virtual hardware
    6. Cliquez sur le bouton Add. Le dispositif virtuel sera ajouté dans le tableau au haut de la page.
    7. Cette étape n'est à faire qu'une seule fois.

    Pour ajouter un commutateur virtuel

    1. Cliquez sur le bouton Create Virtual Sensors dans le nouveau materiel Virtual.
    2. Remplissez le champs Name, sélectionnez Switch dans la liste déroulante de Sensor Type dans la fenêtre Create Virtual Sensor.

    Un message apparaîtra confirmant la création du capteur et indiquant qu'il peut être trouvé dans la liste des dispositifs. Pour voir la liste, cliquez sur l'onglet Setup puis sélectionnez Devices.

    Le commutateur nouvellement créé se trouve également dans l'onglet Switches.

    Cliquer sur l'icône de l'ampoule du commutateur virtuel, trouvé dans l'onglet Switches ou dans la liste des dispositifs, bascule son image vers l'état marche ou arrêt. Essayez-le et vous verrez apparaître un message pendant quelques secondes disant que le dispositif a été activé ou désactivé, le cas échéant. Bien sûr, rien ne se produit réellement car ce commutateur virtuel n'est pas encore connecté à un dispositif matériel. La façon de réaliser cette connexion avec le protocole MQTT est expliqué dans la section suivante.

  9. Activation de MQTT dans Domoticz
  10. La première étape pour ajouter des fonctionnalités MQTT à Domoticz consiste à ajouter le «matériel». La procédure est similaire à l'ajout du matériel fictif dans la section précédente

    1. Cliquez sur l'onglet Setup.
    2. Sélectionnez Hardware dans le menu déroulant.
    3. Entrez un nom pour le matériel. Démontrant de nouveau l'ampleur de mon imagination, j'ai choisi MQTT.
    4. Comme Type sélectionnez MQTT Client Gateway with LAN interface dans la liste déroulante.
    5. Définissez l'adresse ( Remote Address) et le port du serveur MQTT. Dans mon cas, le courtier est sur le même hôte que le serveur Domoticz, donc j'ai utilisé localhost mais j'aurais pu utiliser l'adresse IP complète 192.168.0.22 ou peut-être 127.0.0.1. J'ai configuré le port vers 1883, qui la valeur par défaut de Mosquitto MQTT qui n'a pas été modifiée.
      Add virtual hardware Assurez-vous que le thème de publication (Publish Topic) est out; je pense que c'est la valeur par défaut.
    6. Cliquez sur le bouton Add. Le matériel ajouté sera inclus avec le matériel virtuel dans le tableau en haut de la page.

    À partir de ce moment, le serveur Domoticz publiera les messages MQTT sur le thème domoticz/out chaque fois que l'état d'un dispositif change. Simultanément, le serveur est abonné au sujet domoticz/in et prendra des mesures chaque fois qu'il recevra un message dont la syntaxe est correcte.

  11. Test de MQTT dans Domoticz
  12. Ouvrez un terminal et abonnez-vous à tous les messages, puis activez et désactivez le commutateur de test dans l'onglet Switches pour voir les messages MQTT générés par Domoticz.

    michel@hp:~$ mosquitto_sub -h 192.168.0.22 -v -t "#" domomoticz/out { "Battery" : 255, "RSSI" : 12, "dtype" : "Light/Switch", "id" : "00014051", "idx" : 1, "name" : "Test Switch", "nvalue" : 1, "stype" : "Switch", "svalue1" : "0", "switchType" : "On/Off", "unit" : 1 } domoticz/out { "Battery" : 255, "RSSI" : 12, "dtype" : "Light/Switch", "id" : "00014051", "idx" : 1, "name" : "Test Switch", "nvalue" : 0, "stype" : "Switch", "svalue1" : "0", "switchType" : "On/Off", "unit" : 1 }

    Ce sont des messages typique de Domoticz utilisant le format JSON. Pour plus d'informations sur l'API, voir Domoticz API/JSON URL's. Le commutateur de commutateurs WiFi devra les gérer pour s'allumer ou éteindre. Comme on le verra, cela semble beaucoup plus redoutable que grâce au travail de nombreuses personnes qui ont développé des bibliothèques open source pour l'ESP8266.

    Bien sûr, l'interrupteur WiFi devra publier des messages MQTT vers le serveur pour l'informer que quelqu'un a activé ou désactivé manuellement le commutateur. Le sujet de ces types de messages est domoticz/in parce que Domoticz est abonné à ce sujet. Pour être plus clair, je suppose que le module logiciel implémentant le «matériel MQTT» s'inscrit auprès du serveur MQTT lors de son démarrage.

    Pour continuer le test, le message typique qu'un commutateur pourrait envoyer lorsqu'il est activé manuellement sera publié au courtier MQTT. Je suppose que le commutateur virtuel qui a été installé dans la section précédente a un index (idx) de 1. L'index est affiché dans la liste des périphériques. Pour voir la liste, cliquez sur l'onglet Setup, puis sélectionnez Devices . Si ce n'est pas 1, ajustez la valeur lors de la publication du message MQTT suivant. michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "domoticz/in" -m '{ "idx" : 1, "nvalue" : 1}'

    Le terminal abonné au serveur MQTT montrera que le courtier a reçu le message domoticz/in { "idx" : 1, "nvalue" : 1}

    Le journal montre que Domoticz a reçu le message.

    2017-05-31 13:14:38.446 MQTT: Topic: domoticz/in, Message: { "idx" : 1, "nvalue" : 1}
    Pour voir le journal, cliquez sur l'onglet Setup, puis sélectionnez Log. Ensuite, revenez à l'onglet Switches et vérifiez que l'icône de l'ampoule du commutateur virtuel est réglée sur l'état activé. Cela prend un peu de temps, soyez patient.

    Pour désactiver l'état du commutateur virtuel, un message MQTT similaire doit être envoyé: michel@hp:~$ mosquitto_pub -h 192.168.0.22 -t "domoticz/in" -m '{ "idx" : 0, "nvalue" : 0}' Ajustez à nouveau la valeur idx pour refléter l'index correct du commutateur virtuel.

    Il reste à programmer le commutateur Sonoff WiFi pour fonctionner avec MQTT et Domoticz. Ceci est déjà fait dans les publications précédentes Programmation du Sonoff dans Arduino (1) et Programmation du Sonoff dans Arduino (2).