Domotique et objets connectés à faire soi-même

Plugin HomeKit pour Node-RED, plus facile à utiliser que Homebridge

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.

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 :

Mais aussi des inconvénients :

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.

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

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.

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…)

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

 

Avez-vous aimé cet article ?
[Total: 0 Moyenne: 0]
Quitter la version mobile