Le projet HomeBridge que nous avons pu tester avec Jeedom, Domoticz et ce tutoriel plus général est assez difficile à installer et à maintenir. Le plugin node-red-contrib-homekit développé par Christopher Hiller @boneskull est d’une simplicité déconcertante. Le projet de Christopher, tout comme Homebridge, est basé sur le projet HAP-NodeJS de Khaos Tian @KhaosT. Le plugin ce Christopher permet de créer un accessoire et le(s) service(s) associé(s).
Pour illustrer ce tutoriel, nous allons publier les mesures d’un Xiaomi Mi Plant et d’un capteur d’humidité DIY utilisé pour l’étude comparative publiée récemment.
Sommaire
- 1 C’est quoi HomeKit ?
- 2 Installation du plugin node-red-contrib-homekit sur Node-RED
- 3 Le vocabulaire HomeKit
- 4 Montage utilisé pour la démo
- 5 Flow NodeRED du projet
- 6 Configurer le Node Homekit pour vos appareils
- 7 Créer un Node Accessory HomeKit
- 8 Formater les données au format JSON avant de les transmettre à HomeKit
- 9 Jumelage des accessoires sur un iPhone
- 10 Bilan après 2 semaines d’utilisation
C’est quoi HomeKit ?
HomeKit est une API qui met à disposition des développeurs des méthodes pour communiquer avec l’environnement logiciel Apple. Ca ne fonctionne qu’avec les tablettes et les smartphones de la marque à la pomme. HomeKit permet de publier des états (porte ouverte / fermée), des mesures (CO2, température, vitesse du vent) et de piloter des appareils compatibles (ampoules à LED, prise connectée…).
HomeKit présente de nombreux avantages :
- Il n’y a pas d’infrastructure à installer et à maintenir. Tout est géré par Apple.
- Les risques de piratage sont limités…le jour ou un serveur Apple est piraté, ça fait vite le buzz sur les réseaux sociaux. Ce n’est pas un problème si vous publiez la température du salon, c’est plus gênant si vous voulez piloter l’ouverture de votre portail électrique….
- Apple semble respecter la vie privée de ses utilisateurs. Donc à priori, il ne regarde pas ce qui transite sur les serveurs. D’un autre coté, qui s’intéresse à la température dans ma salle de bain…
Mais aussi des inconvénients :
- Il faut qu’un appareil compatible reste chez vous (certains modèles d’Apple TV, iPad ou iPhone). Il servira de passerelle avec votre smartphone lorsque vous quittez votre domicile
- HomeKit fonctionne comme une boite noire. Les données arrivent toujours mais c’est difficile de savoir quand, surtout lorsqu’on perd la connexion 4G.
- HomeKit est fermé aux autres plateformes (enfin je veux dire Android), mais Apple à ouvert HomeKit aux développeurs et aux makers, cool c’est nous 🙂
Installation du plugin node-red-contrib-homekit sur Node-RED
Si vous débutez sur Node, je vous conseille par lire cet article de présentation générale ainsi que celui-ci (débuter avec l’Arduino et Node-RED) plus récent. Node-RED fonctionne sur toutes les plateformes (PC Windows, MAC, Raspberry Pi…)
Ouvrez le menu dans le coin supérieur droit de l’écran pour ouvrir le gestionnaire de palette.
Faites une recherche sur le mot clé homekit
Installez également le plugin Dashboard utilisé dans le flow pour visualiser les mesures sur un graph.
L’installation ne dure que quelques minutes. Il n’y a rien de plus à faire
Le vocabulaire HomeKit
Avant d’aller plus loin, faisons le point sur le vocabulaire employé par HomeKit. On en aura besoin pour la configuration.
- Accessoire: c’est un périphérique HomeKit pouvant être publié sur votre réseau local.
- Bridge: c’est un pont qui regroupe plusieurs accessoires domotiques en un seul appareil. Le bridge n’est pas supporté par le plugin Node-RED
- Service: c’est un ensemble de valeurs groupées nécessaires pour fournir une fonction logique. La plupart du temps, lorsque vous pensez à un appareil HomeKit compatible comme “Thermostat” ou “Door Lock”, vous pensez à un service. Les accessoires peuvent exposer plusieurs services.
- Caractéristique: représente une variable typée particulière affectée à un service, par exemple le service LockMechanism contient une caractéristique CurrentDoorState décrivant si la porte est actuellement verrouillée.
Montage utilisé pour la démo
Pour la démo, je vous propose donc de repartie de l’article sur l’étude comparatives de plusieurs sondes permettant de mesurer le taux d’humidité du sol avec le Xiaomi Mi Plant. C’est plus sympa de disposer des mesures réelles.
Node-RED récupère les mesures d’une sonde de mesure d’humidité du sol (v1.2 avec revêtement anti-corrosion) via le port série de l’Arduino (ou pourrait également utiliser le GPIO du Raspberry Pi). Le taux d’humidité du Xiaomi Mi Plant est récupéré à l’aide du script python
Si vous n’avez pas de montage à disposition, vous pouvez simuler des valeurs ou des états à intervalle régulier à l’aide du Node inject.
Flow NodeRED du projet
Copiez le code du projet puis importez le sur un flow
Voici le code du projet pour gagner du temps
[{"id":"53bfd90d.562a58","type":"mqtt in","z":"3639e7d1.f1c3e8","name":"Mi Plant","topic":"miflora/miplant2018","qos":"1","broker":"12f512eb.9c8b5d","x":100,"y":100,"wires":[["52c040c7.1694b"]]},{"id":"52c040c7.1694b","type":"json","z":"3639e7d1.f1c3e8","name":"","property":"payload","action":"","pretty":false,"x":250,"y":100,"wires":[["3cc11661.f653ca"]]},{"id":"3cc11661.f653ca","type":"switch","z":"3639e7d1.f1c3e8","name":"","property":"payload.moisture","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":370,"y":100,"wires":[["f2a4306f.30a42","6d40fd38.6d08f4"]]},{"id":"f2a4306f.30a42","type":"debug","z":"3639e7d1.f1c3e8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":550,"y":100,"wires":[]},{"id":"9435a9fc.ab96d8","type":"serial in","z":"3639e7d1.f1c3e8","name":"Arduino Uno","serial":"c237b06b.eb7ca","x":110,"y":340,"wires":[["4c310d82.46f3d4","1f6f19ed.d8ead6"]]},{"id":"1f6f19ed.d8ead6","type":"json","z":"3639e7d1.f1c3e8","name":"","property":"payload","action":"","pretty":false,"x":310,"y":400,"wires":[["df59b710.dc7648","b292e47a.faf158"]]},{"id":"df59b710.dc7648","type":"function","z":"3639e7d1.f1c3e8","name":"Extract v1.2 data","func":"msg.topic = \"v1.2\";\nmsg.payload = msg.payload.v1_2_percent;\nreturn msg;","outputs":1,"noerr":0,"x":510,"y":420,"wires":[["44cbb0fe.6f088","ac20d53e.ede6f8"]]},{"id":"6d40fd38.6d08f4","type":"function","z":"3639e7d1.f1c3e8","name":"Format chart data","func":"msg.topic = \"Xiaomi Mi Plant (%)\";\nmsg.payload = msg.payload.moisture;\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":160,"wires":[["71ec4374.1d3cdc","44cbb0fe.6f088"]]},{"id":"b292e47a.faf158","type":"debug","z":"3639e7d1.f1c3e8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":490,"y":380,"wires":[]},{"id":"226eb0ee.c14c1","type":"debug","z":"3639e7d1.f1c3e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1170,"y":320,"wires":[]},{"id":"71ec4374.1d3cdc","type":"function","z":"3639e7d1.f1c3e8","name":"Format Mi Plant value","func":"msg.payload = {\n \"CurrentRelativeHumidity\":msg.payload\n}\nreturn msg;","outputs":1,"noerr":0,"x":800,"y":160,"wires":[["1dc331e8.83ddde"]]},{"id":"ac20d53e.ede6f8","type":"function","z":"3639e7d1.f1c3e8","name":"Format v.2 value","func":"msg.payload = {\n \"CurrentRelativeHumidity\":msg.payload\n}\nreturn msg;","outputs":1,"noerr":0,"x":760,"y":420,"wires":[["c32e2bfa.89a388"]]},{"id":"4c310d82.46f3d4","type":"debug","z":"3639e7d1.f1c3e8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":310,"y":320,"wires":[]},{"id":"8fd97b0d.b73338","type":"ui_button","z":"3639e7d1.f1c3e8","name":"Init Graph","group":"bb260e6b.77d62","order":0,"width":0,"height":0,"passthru":false,"label":"Init Graph","color":"","bgcolor":"","icon":"","payload":"[]","payloadType":"json","topic":"","x":580,"y":300,"wires":[["44cbb0fe.6f088"]]},{"id":"44cbb0fe.6f088","type":"ui_chart","z":"3639e7d1.f1c3e8","name":"","group":"bb260e6b.77d62","order":0,"width":"12","height":"9","label":"YL69 (x2) + v1.2 (anti-corrosion)","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"25","ymax":"75","removeOlder":"10","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":830,"y":300,"wires":[[],[]]},{"id":"c32e2bfa.89a388","type":"homekit-service","z":"3639e7d1.f1c3e8","accessory":"9be254f9.c28128","name":"v1.2","serviceName":"HumiditySensor","x":990,"y":420,"wires":[["226eb0ee.c14c1"]]},{"id":"1dc331e8.83ddde","type":"homekit-service","z":"3639e7d1.f1c3e8","accessory":"6a6c9c58.784194","name":"Xiaomi Mi Plant","serviceName":"HumiditySensor","x":960,"y":220,"wires":[["226eb0ee.c14c1"]]},{"id":"12f512eb.9c8b5d","type":"mqtt-broker","z":"","name":"MQTT Local","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"c237b06b.eb7ca","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":false},{"id":"bb260e6b.77d62","type":"ui_group","z":"3639e7d1.f1c3e8","name":"DIY soil moisture sensors comparison - projetsdiy.fr - diyprojects.io","tab":"7c4acfe2.8a94","disp":true,"width":"12","collapse":false},{"id":"9be254f9.c28128","type":"homekit-accessory","z":"","accessoryName":"v12","pinCode":"111-11-111","port":"","manufacturer":"projetsdiy","model":"Capacitive soil moisture sensor v1.2","serialNo":"v12","accessoryType":"10"},{"id":"6a6c9c58.784194","type":"homekit-accessory","z":"","accessoryName":"Xiaomi Mi Plant","pinCode":"111-11-111","port":"","manufacturer":"projetsdiy","model":"Xiaomi Mi Plant","serialNo":"from miflora-mqtt-deamon","accessoryType":"10"},{"id":"7c4acfe2.8a94","type":"ui_tab","z":"","name":"Home","icon":"dashboard"}]
Configurer le Node Homekit pour vos appareils
Le Node Homekit se configure très simplement. Comme le plugin ne gère pas les bridge, il faudra envoyer tous les appareils séparément. Il faudra ensuite les regrouper sur l’application Maison sur iOS
Créer un Node Accessory HomeKit
Le Node Homekit se trouve dans la palette Advanced
Déposez le sur le flow et faites un double clic pour ouvrir le panneau de configuration. On doit spécifier un accessoire (accessory) et le service (les données ou les commandes disponibles, par exemple le relai qui commande la pompe de la piscine depuis un Arduino, un Raspberry Pi ou un ESP8266).
Cliquez sur le crayon pour créer un accessoire
Accessoire (accessory)
Le noeud Accessory permet d’ajouter un périphérique qui pourra être vu par iOS. Il faut spécifier les paramètres suivants
- Code Pin : spécifiez le code Pin pour le processus de jumelage
- Port: si vous êtes derrière un pare-feu, vous pouvez spécifier un port. Sinon, laissez vide.
- Fabricant, modèle, numéro de série: indiquez ce que vous voulez.
- Nom: Nom de l’accessoire qui sera affiché par l’application Maison
- Les accessoires pontés ne sont pas pris en charge pour le moment.
Ensuite, il faut spécifier le type de l’accessoire en choisissant dans la liste déroulante (certains accessoires m’échappent encore, si quelqu’uns à plus d’infos, je suis preneur). On devrait trouver d’autres infos ici.
- Bridge, ?. Peut être un pont pour les ampoules Philipps Hue ?
- FAN, ventilateur
- Garage door opener
- Lightbulb, ampoules connectées
- Door lock, serrure connectée
- Outlet, peut être une VMC ?
- Switch, interrupteur
- Thermostat
- Sensor, capteur
- Alarm System, système d’alarme
- Security system, ça semble différent d’une alarme, à moins que ce soit un service
- Door, porte
- Window, fenêtre
- Window covering, rideau, volet
- Programmable switch, interrupteur programmable
- Rande extender,
- Camera
- Camera IP
- Video doorbell, portier vidéo
- Air purifier, purificateur d’air
- Air dehumidifier, déshumidificateur
- Apple TV
- Speaker, enceinte (connectée ou bluetooth ?)
- Airport, c’est bientôt fini
- Sprinkler, extincteur
- Faucet, robinet
- Shower head, douche (la classe !)
Service
Les nœuds de service ajoutent des fonctionnalités aux accessoires. Pour le moment il n’est possible d’attribuer qu’un seul service à un accessoire.
Accessoire: choisir un accessoire que vous venez de créer
Service: indiquez le type de service d’après cette liste
Nom: optionnel, il sera affiché sur le flow
Voici la liste des services supportés. Comme vous pouvez le voir, il y a une certaine confusion entre un accessoire et un service. Dans beaucoup de cas, c’est la même chose (Garage door opener, fan, speaker…)
- Air Quality Sensor, capteur de surveillance de la qualité de l’air
- Battery Service, niveau de batterie
- Camera Control, contrôle des caméras IP (intéressant :-))
- Camera RTP Stream Management, gestion des caméras RTP
- Carbon Dioxide Sensor, capteur CO2
- Carbon Monoxide Sensor, capteur CO
- Contact Sensor, capteur d’ouverture de porte ou fenêtre
- Door, idem
- Doorbell, sonette
- Fan, ventilateur
- Garage Door Opener, ouverture de porte de garage
- Humidity Sensor, sonde d’humidité
- Leak Sensor, détecteur de fuite d’eau
- Light Sensor, capteur de luminosité
- Lightbulb, ampoule connectée
- Lock Management, serrure connectée
- Lock Mechanism, serrure connectée
- Microphone
- Motion Sensor, détecteur de mouvement
- Occupancy Sensor, détecteur de présence
- Outlet, ?
- Relay, relais
- Security System, système d’alarme
- Smoke Sensor, détecteur de fumée
- Speaker, enceinte
- Stateful Programmable Switch, Commutateur programmable avec état
- Stateless Programmable Switch, Commutateur programmable sans état
- Switch, interrupteur
- Temperature Sensor, capteur de température
- Thermostat
- Time Information
- Window, fenêtre
- Window Covering, rideau ou volet (?)
Sélectionnez le service (ici Humidity Sensor) puis enregistrez le Node. Vous pouvez lui donner un nom qui sera affiché sur le flow.
Formater les données au format JSON avant de les transmettre à HomeKit
Pour chaque service, on va devoir préparer les données au format JSON. Pour connaître les clés disponibles, il faut un peu fouiller dans la doc Apple d’HomeKit, dans le code source de HAP-NodeJS ici. Par exemple pour un capteur d’humidité (il n’y a pas encore de capteur d’humidité du sol ou de surveillance des plantes), on a deux services disponibles
// Required Characteristics – requis
this.addCharacteristic(Characteristic.CurrentRelativeHumidity);
// Optional Characteristics – optionnel this.addOptionalCharacteristic(Characteristic.StatusActive); this.addOptionalCharacteristic(Characteristic.StatusFault); this.addOptionalCharacteristic(Characteristic.StatusTampered); this.addOptionalCharacteristic(Characteristic.StatusLowBattery);
this.addOptionalCharacteristic(Characteristic.Name);
Placez un Node Function. Le code est très simple. On remplace le payload actuel du message par un objet JSON de la forme
{ "serviceHK":valeur }
Ce qui donne par exemple
msg.payload = { "CurrentRelativeHumidity":msg.payload } return msg;
Voilà, il ne reste plus qu’à déployer et lancer l’appli Maison sur votre iPhone ou iPad.
Si vous avez un doute sur les caractéristiques disponibles, branchez un node debug. En cas d’erreur, le plugin vous proposera les différences caractéristiques disponibles pour ce service
Jumelage des accessoires sur un iPhone
Pour ajouter un accessoire, il faut que votre appareil iOS se trouve sur le même réseau WiFi que le Raspberry Pi (ou le PC sur lequel est installé Node-RED)
Cliquez sur ajouter un accessoire pour démarrer le jumelage
Contrairement au projet Homebridge, le plugin n’affiche pas le code à scanner, cliquez sur Code absent ou impossible à scanner. La liste des accessoires disponibles apparaissent après quelques secondes de recherche. On retrouve le libellé indiqué dans la boite de configuration. Le plugin ajoute une extension à 4 chiffres, certainement pour éviter les doublons.
Sélectionnez l’accessoire à jumeler. iOS nous indique que ce n’est pas un accessoire certifié et demande de confirmer le jumelage.
L’accessoire est immédiatement ajouté à la liste
Et voilà, le Xiaomi Mi Plant 2018 est maintenant disponible sur tous vos appareils iOS sans avoir à passer par l’application Mi Home 🙂
En quelques minutes vous pouvez maintenant connecter votre serveur domotique ou vos projets objets connectés DIY à votre iPhone ou iPad sans voir à exposer votre box à internet. N’en attendez pas trop de l’appli Maison. Elle est vraiment faite pour visualiser l’état des capteurs (ouvert, fermé, niveau, courrier) et piloter des actionneurs (volet, porte, rideau…). Ne cherchez pas l’historique des mesures ou des commandes, il n’y en a pas ! Il existe également un fork du projet qui ajoute le support des bridges mais il n’est pas compatible avec le Raspberry Pi.
Bilan après 2 semaines d’utilisation
Après un peu plus de 2 semaines d’utilisation et de test sur d’autres tutoriels voici quelques infos complémentaires. Le plugin est assez stable. Je n’ai pas rencontré de plantage particulier. Dans la version actuelle, le plugin présente un défaut majeur. Dès qu’on déploie un flow, le lien avec Homekit est bisé. Il faut donc supprimer tous les accessoires sur l’iPhone ou l’iPad et les jumeler de nouveau. Ce n’est pas un gros travail avec un ou deux accessoires, mais si vous voulez connecter tous vos équipements domotiques et objets connectés avec ce plugin vous risquez d’y passer pas mal de temps. Je vous conseille donc de connecter vos accessoires lorsque tous vos flows sont terminés.
Liens utiles
Autres projets basés sur HAP-NodeJS
- ESP32, broches GPIO et fonctions associées. I/O, PWM, RTC, I2C, SPI, ADC, DAC
- ESP32-CAM. Broches et équipements ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- ESP32-CAM. Quel modèle choisir ? ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- M5Stack Atomic GPS. Tracker ESP32 TinyGPS++, export GPX sur carte SD, visualisation sur Google Maps ou VSCode
- Home Assistant. Installer le snap sur NAS Synology sur une machine virtuelle Ubuntu
- ESP32-CAM. Souder l’antenne externe pour améliorer la portée et la stabilité du flux vidéo
Avez-vous aimé cet article ?
[Total: 0 Moyenne: 0]