
Récemment, Yandex a lancé son système de maison intelligente. On nous propose d'acheter des appareils Wi-Fi bon marché: un adaptateur dans une prise de courant, une ampoule et une télécommande IR. Il est intéressant que les développeurs d'appareils «intelligents» aient la possibilité de créer leurs compétences «maison intelligente», cela vous permettra de connecter des appareils au système Yandex et de gérer leur voix via Alice. De plus en plus de nouvelles marques apparaissent sur les listes de compétences. Alice comprend parfaitement le discours russe, ce qui fait d'elle la leader incontestée des assistants vocaux sur le marché russe.
Cependant, tout n'est pas si fluide ...
Premier inconvénient: fondamentalement, tous les systèmes proposés sont «nuageux». Leur fiabilité est parfois mise en doute, car leurs performances dépendent directement de la qualité de la connexion avec les serveurs du constructeur. Et lorsque vous désactivez Internet, les appareils se transforment complètement en «citrouille».
Deuxième inconvénient: système de script. Les scripts sont une partie importante d'une maison intelligente. Et ici, ils sont très primitifs: si «la phrase est telle ou telle», alors activez «l'appareil est tel ou tel». Pour ma maison intelligente, c'était trop peu.
Les inconvénients ne s'arrêtent pas là, mais le reste est plus probablement lié à l'immaturité du système. L'équipe de développement Yandex continue d'ajouter activement diverses fonctionnalités et bogues à modifier, dont beaucoup grâce à eux!
Après avoir étudié la documentation, j'ai décidé de créer la compétence Yandex UD et d'y connecter le contrôleur de maison intelligente. Cela vous permettra de ne pas dépendre des serveurs cloud, de mettre en œuvre des scripts localement sur le contrôleur et en même temps de contrôler le système par la voix via Alice. Pour cela, j'ai écrit le plugin "yandex2mqtt" sur Node.js.
Un peu de théorie
- Alice, allume la lumière.
Après cette phrase, la magie opère et la lumière s'allume. Mais qu'est-ce qui se cache dans les coulisses? Voyons comment tout cela fonctionne.
La station Yandex, après avoir entendu une commande familière, envoie des données au serveur Yandex, auquel nous avons spécifié à l'avance l'adresse de notre contrôleur. Le serveur traite les informations et les redirige vers le contrôleur sous la forme d'une post-demande. Sur le contrôleur, l'API intermédiaire (dans notre cas, c'est le plugin yandex2mqtt) traite la demande et la redirige vers la rubrique MQTT. Ensuite, le script est traité dans le programme Node-Red.
Node-Red décide quoi faire ensuite. S'il est prévu par le script, il envoie une commande pour allumer la lumière dans le sujet MQTT correspondant. Le pilote wb-mqtt-serial répond en envoyant une commande Modbus au module relais, qui commute le relais. Et enfin, la lumière s'allume! Oui, le chemin n'est pas proche, mais quelques fractions de seconde pour l'utilisateur.
Examinons de plus près le plugin yandex2mqtt. La première chose dont Yandex a besoin pour que la compétence fonctionne est le service oAuth pour regrouper les comptes dans l'application Yandex. Une fois que Yandex a reçu le jeton d'autorisation du service oAuth, il demande une liste de périphériques. Le plugin yandex2mqtt répond avec une liste de périphériques avec toutes les propriétés au format json. Ils apparaissent ensuite dans la liste des appareils disponibles pour le contrôle (dans le soi-disant quasar). Maintenant, si vous dites à Alice d'allumer un appareil de la liste, Yandex enverra une demande de publication avec les données de l'appareil qu'il veut allumer au contrôleur. En réponse, le plugin confirme l'inclusion et écrit le nouvel état dans la rubrique mqtt spécifiée dans les paramètres du même plugin. Si le périphérique a changé son statut sans la participation de Yandex, le plug-in, en voyant les nouvelles données dans la rubrique mqtt, les enverra à Yandex lors de la demande du statut, ce qui ne se produit désormais que si vous accédez au périphérique lui-même dans quasar. Dans d'autres cas, Yandex n'interroge pas les statuts.
Je vais maintenant parler de certaines des propriétés des appareils Yandex UD.
Type d'appareil
Pour un affichage correct dans le «quasar» et une définition plus précise des commandes par Alice, Yandex suggère d'affecter différents types d'appareils aux appareils. Total types 10:
- devices.types.light - Toute lampe, lustre, ampoule, etc.
- devices.types.socket - Prise
- devices.types.switch - Commutateur
- devices.types.thermostat - Thermostat
- devices.types.thermostat.ac - Climatisation
- devices.types.media_device - Périphérique multimédia
- devices.types.media_device.tv - TV
- devices.types.cooking - Appareils de cuisine
- devices.types.cooking.kettle - Créateur
- devices.types.other - Tout ce qui ne correspondait pas aux paragraphes précédents.
Capacité
De plus, chaque appareil doit avoir au moins une
capacité .
Au total, Yandex UD dispose de 5 types de compétences. Chaque compétence a une fonction
(instance) différente , et certaines compétences ont plusieurs de ces fonctions, ce qui ajoute de la flexibilité lors de la configuration des appareils.
Capacités:1.
devices.capabilities.on_off - Activez et désactivez.
exemple:
2.
devices.capabilities.color_setting - Gestion des couleurs.
exemple:
3.
devices.capabilities.mode - Changer de mode.exemple:
4.
devices.capabilities.range - Contrôle de plage.exemple:
- luminosité
- température
- volume
- canal
5.
devices.capabilities.toggle - Muet.exemple:
Avec la bonne combinaison de toutes les propriétés de l'appareil, Alice comprend sans aucun problème toutes les commandes de gestion du Smart Home qui lui sont données. Ici, bien sûr, il y a quelques difficultés à combiner les compétences. La documentation n'indique clairement pas quelles compétences peuvent être combinées et lesquelles ne le peuvent pas. Mais la «méthode scientifique du poke» nous y aidera.
Ainsi, par exemple, j'ai découvert que la climatisation contient quatre compétences:
Type d'appareil:
devices.types.thermostat.acType de compétence:
devices.capabilities.on_offexemple:
devices.capabilities.rangeexemple:
devices.capabilities.modeexemple:
devices.capabilities.modeexemple:
Je ne décrirai pas les propriétés restantes, tout y est assez simple.
Pour le faire fonctionner, vous avez besoin de:
- Contrôleur
- Tout domaine
- Certificat SSL
- Node.js
- Plugin Yandex2mqtt
- Courtier MQTT
- Rouge-noeud
Contrôleur
Mon appartement «intelligent» est contrôlé par le Wiren Board 6. Mais vous pouvez utiliser n'importe quel autre contrôleur Linux qui tirera Node.js et Node-Red. Par exemple, Raspberry pi ou PC.
Domaine
Bien sûr, il est souhaitable d'avoir une adresse IP blanche et d'acheter un domaine, mais ce n'est pas nécessaire. Vous pouvez utiliser DDNS - par exemple,
www.noip.com .
Ici, tout est simple: inscrivez-vous, créez un nom d'hôte gratuit, entrez votre adresse IP. Certains routeurs ont un paramètre DDNS spécial où vous pouvez entrer des données noip.com. Le routeur enverra automatiquement une adresse IP lorsqu'elle sera modifiée. S'il n'y a pas un tel paramètre dans le routeur, vous pouvez installer le programme noip sur le contrôleur et l'ajouter à l'exécution automatique. Le programme fera exactement la même chose qu'un routeur avec des paramètres DDNS spéciaux - mettez à jour votre adresse IP dans la base de données noip.com
Ainsi, nous avons une adresse statique qui redirige toutes les demandes vers notre contrôleur.
Ports 443 et 80
Maintenant, presque tout le monde à la maison a un routeur. En plus de ses fonctions évidentes, il constitue également une barrière au réseau local pour les invités indésirables de l'extérieur. Mais dans certains cas, nous avons besoin d'accéder au réseau interne de l'extérieur. Les fabricants de routeurs l'ont envisagé et ont ajouté la fonction NAT (traduction d'adresse réseau).
Je ne décrirai pas le moment de la configuration du routeur, car il est différent pour chaque fabricant. Pour ce faire, lisez les instructions de votre routeur. Mots-clés Google: Port Forwarding, Port Mapping, NAT.
Il est nécessaire de rediriger le port pour accéder à yandex2mqtt (il peut être n'importe lequel, j'ai choisi 443) et au port 80 (il est seulement nécessaire de recevoir un certificat SSL. Après avoir reçu le certificat, le port 80 peut être fermé).
Certificat SSL
Mettez immédiatement tous les points sur le «et»: les certificats auto-signés ne fonctionneront pas.
La plupart des bureaux d'enregistrement de domaine (par exemple, reg.ru) offrent à leurs clients des certificats SSL gratuits pour le domaine principal (www.votredomaine.ru). Si vous avez acheté un domaine spécifiquement pour Alice, vous pouvez utiliser le certificat SSL fourni.
Si vous n'avez pas votre propre domaine, ou si vous avez un autre sous-domaine alloué pour Alice (par exemple, alice.votredomaine.ru), vous devez obtenir un certificat pour ce sous-domaine ou pour l'adresse fournie par le service DDNS.
Pour ce faire, je propose d'utiliser le service gratuit pour obtenir un certificat SSL auprès de letsencrypt.org.
Pour obtenir un certificat, vous devez installer le programme certbot, exécuter et spécifier toutes les données qu'il demande. Dans le même temps, le port 80 doit être libre et accessible de l'extérieur, je vous conseille d'étudier attentivement les instructions de letsencrypt.
Installer et configurer certbotapt-get update apt-get install certbot
Arrêtez les services de surveillance et nginx.
service watchdog stop service nginx stop
Nous transmettons le 80e port du routeur.
Exécutez le programme certbot:
certbot certonly --standalone
Après le démarrage, le programme posera quelques questions simples.
1. Votre e-mail. Entrez simplement l'adresse et appuyez sur Entrée

2. Vous êtes invité à lire les accords d'utilisation. Si vous êtes d'accord avec tout, entrez simplement «A», ce qui signifie Accepter, c'est-à-dire que je suis d'accord.

3. Le programme demande la permission d'envoyer votre adresse e-mail aux développeurs. Entrez N.

4. Entrez votre domaine pour lequel vous souhaitez recevoir un certificat (vous pouvez entrer celui que nous avons reçu dans noip plus tôt). Ici, je donne un exemple de saisie erronée. Le préfixe http: // n'est pas requis.

Si vous avez tout fait correctement, vous verrez ce qui suit:

Cela signifie que le certificat a été reçu avec succès. N'oubliez pas le chemin d'accès au certificat et à la clé, il sera requis lors de la configuration du plugin yandex2mqtt. Pour des raisons de sécurité, fermez le port 80 dans les paramètres du routeur, il ne sera plus utile.
Nous activons les services de surveillance et nginx.
service nginx start service watchdog start
Le certificat de letsencrypt est délivré pour
3 mois.
N'oubliez pas de mettre à jour. Node.js et le plugin yandex2mqtt
L'installationConfiguration du référentiel node.js
curl -sL https://deb.nodesource.com/setup_10.x | bash -
Ensuite, installez ou mettez à jour tous les composants nécessaires
apt-get install -y nodejs git make g++ gcc build-essential
Une fois l'installation réussie, copiez le référentiel yandex2mqtt sur le contrôleur.
git clone https://github.com/munrexio/yandex2mqtt.git /mnt/data/root/yandex2mqtt
Nous fixons les droits.
chown -R root:root /mnt/data/root/yandex2mqtt
Nous allons dans le dossier.
cd /mnt/data/root/yandex2mqtt
Nous commençons l'installation.
npm install
Installation terminée.
Démarrage automatiqueCréez une unité systemd:Accédez au dossier
/ etc / systemd / system / sur le contrôleur et créez un fichier appelé
yandex2mqtt.service . Copiez-y les éléments suivants:
[Unit] Description=yandex2mqtt After=network.target [Service] ExecStart=/usr/bin/npm start WorkingDirectory=/mnt/data/root/yandex2mqtt StandardOutput=inherit StandardError=inherit Restart=always User=root [Install] WantedBy=multi-user.target
Après cela, enregistrez les modifications et fermez le fichier.
Pour activer l'unité, entrez la commande dans la console:
systemctl enable yandex2mqtt.service
Vous pouvez maintenant démarrer et arrêter le plugin avec des commandes
service yandex2mqtt start service yandex2mqtt stop service yandex2mqtt restart
Configuration:Tous les paramètres de plug-in nécessaires se trouvent dans le fichier
/mnt/data/root/yandex2mqtt/config.jsModifiez ce fichier en fonction de vos paramètres.
Le certificat SSL doit être
fullchain .
Après la configuration, exécutez yandex2mqtt avec la commande:
service yandex2mqtt start
Après avoir mis en place et démarré le pont, je vous conseille de vérifier le certificat sur
ce site .
Entrez simplement votre domaine que vous allez utiliser pour accéder à Alice. Pour un bon fonctionnement, le certificat doit réussir tous les contrôles. Sinon, rien ne fonctionnera.
Skill Yandex UD
Création de compétences1. Accédez à la page
dialogs.yandex.ru/developer2. Connectez-vous avec votre compte.
3. Cliquez sur «créer un dialogue»
4. Sélectionnez «Smart Home»
5. Saisissez les paramètres requis:
- Nom - N'importe quel nom.
- URL du point de terminaison - une adresse du type votredomaine / fournisseur , où au lieu de «votredomaine » est l'adresse de noip ou de votre domaine pour laquelle un certificat ssl est reçu.

- Confidentialité - sélectionnez "Ne pas afficher dans le catalogue" (Obligatoire! Sinon, la compétence ne passera pas la modération instantanée)
- Nom et email du développeur - indiquez vos coordonnées.
- Description - n'importe quel texte
- Icône - n'importe quelle icône.

6. Ensemble de comptes:

Cliquez sur "ajouter un nouveau"
- Les deux premiers points - spécifiez les données de config.js / clients :
1.
L'identifiant d'application est clientId
2.
Secret d'application - clientSecret

7. Enregistrez la compétence

8. Cliquez sur "Modération"

9. Cliquez sur «Publier»

Ajout d'appareils à Yandex UD.1. Accédez à l'application Yandex sur le téléphone

2. Dans le menu, sélectionnez Appareils / Smart Home

3. Cliquez sur "Ajouter un appareil"

4. Choisissez votre compétence

5. Cliquez sur "Fusionner les comptes"

6. La page d'autorisation s'ouvre
Entrez l'identifiant et le mot de passe (définis dans le fichier config.js dans le bloc utilisateurs)
7. Cliquez sur "Autoriser".

8. Cliquez sur «Mettre à jour la liste des appareils»

Désormais, Alice peut recevoir des commandes pour gérer les appareils ajoutés. Les équipes correspondantes viendront sur les sujets indiqués par mqtt.
Il reste à lier certaines actions à ces sujets.
Rouge-noeud
Node-Red a été choisi pour le système d'automatisation. Il s'agit d'un excellent outil de programmation visuelle. La procédure d'installation et de configuration peut être consultée
ici .
Le processus de configuration et d'automatisation d'une maison intelligente nécessitera un article entier, voire deux. Et il existe déjà de nombreux articles de ce type. Au lieu de cela - un petit exemple d'utilisation du plugin, comment activer la voix de l'ampoule.
Pour plus de commodité, nous créons un périphérique virtuel sur le contrôleur Wiren Board 6 dans l'interface Web.
Dans le moteur de
règles wb-rules , vous devez entrer
defineVirtualDevice("yandex", { title: "yandex controls", cells: { light1: { type: "switch", value: false }, } });
Nous écrirons les rubriques MQTT de cet appareil virtuel dans
config.js pour le type de compétence "on" de l'appareil "Light":
devices: [ //_______________ ______________// { name: '', room: '', type: 'devices.types.light', mqtt: [ { type: 'on', set: '/devices/yandex/controls/light1/on', // stat: '/devices/yandex/controls/light1' // }, ], capabilities: [ { type: 'devices.capabilities.on_off', retrievable: true, state: { instance: 'on', value: true } }, ] }, //_______________ _______________// ]
Maintenant, avec la phrase «Alice, allume / éteins la lumière», l'appareil virtuel bascule.
Passons à Node-Red, qui a été installé conformément aux instructions.
Pour un travail pratique avec Wiren Board 6, vous pouvez également utiliser le «node» supplémentaire
node-red-contrib-wirenboard .
Le module d'extension
WBE2R-R-ZIGBEE est installé dans le contrôleur, ce qui a permis de se connecter à la lampe intelligente IKeevskaya de la série TRODFRY en utilisant le protocole ZigBee.
Maintenant, c'est aux petits. Jetez quelques blocs dans l'espace de travail Node-Red, connectez-les avec des «chaînes» et cliquez sur Déployer.

L'ampoule ikeevsky est connectée via le plugin zigbee2mqtt, donc dans mqtt le sujet de l'ampoule doit être envoyé json pour contrôle. Pour ce faire, nous allons insérer une fonction simple entre le périphérique virtuel WB et la rubrique bulbe mqtt.

Cliquez sur Déployer. Nous vérifions.
Alice, allume la lumière!
Aujourd'hui, nous avons donc appris à connecter Alice à un système d'automatisation. Dans certains cas, c'est peut-être trop compliqué, il est plus facile d'acheter une ampoule wi-fi ordinaire, et c'est suffisant. Mais si vous envisagez de construire une maison vraiment intelligente pour vous-même, des moyens simples ne peuvent pas être utilisés ici. Mais cela en vaut-il la peine ou non, chacun décidera pour lui-même. Merci de votre attention!