Appareils sans fil Xiaomi dans la maison intelligente ioBroker

Salutations à tous les amoureux de la domotique. J'ai décidé de partager l'expérience de l'utilisation d'appareils sans fil Xiaomi avec l'interface ZigBee. Honnêtement, je suis contre l'utilisation de tous les appareils sans fil dans n'importe quelle automatisation, des systèmes de contrôle de processus sérieux de gros objets à de petites automatisations telles que les alarmes incendie ou les maisons intelligentes, mais ... pour essayer.

Ce message doit être considéré comme une instruction étape par étape pour l'intégration des appareils ZigBee dans l'infrastructure de la maison intelligente. Décrit ici n'est en aucun cas un axiome et vous pouvez trouver de nombreuses autres façons de connecter des appareils ZigBee. Si vous ignorez toujours la description détaillée, vous pouvez avoir l'impression de la complexité ou de la facilité de combiner des appareils de différents fabricants dans une seule plateforme locale en utilisant l'exemple de ZigBee et ioBroker (plus à ce sujet plus tard). Je dirai dans cet article comment connecter des appareils à une maison intelligente, afficher leurs informations sur une tablette ou simplement dans un navigateur et envoyer des messages via des télégrammes sur le changement d'état de l'appareil. Si je vous intéresse, alors je demande un chat.

Selon le fabricant de Xiaomi, les utilisateurs devraient utiliser une application native avec une connexion cloud et une passerelle Wi-Fi pour les appareils ZigBee. Cependant, une méthode pour activer le mode développeur dans une application pour obtenir un jeton de contrôle est connue depuis longtemps. Ainsi, à l'intérieur du réseau local, vous pouvez communiquer avec la passerelle, ce qui vous permet de faire le pilote mihome , qui fait partie d'ioBroker.

ioBroker est une plate-forme ouverte pour l'IoT, y compris pour la construction de systèmes de maison intelligente. Qu'est-ce que ioBroker peut être trouvé dans l' article précédent.

Maintenant, ma maison intelligente tourne sur une carte ARM Cubietruck avec un «kit de carrosserie» sous la forme d'un disque dur de 80 Go, de batteries rechargeables de 5000 mAh, d'un maître USB à 1 fil, d'un convertisseur USB-RS485 pour les appareils de sondage utilisant le protocole Modbus. Armbian OS est installé sur le disque dur avec le transfert de la partition racine, seul le bootloader reste sur la carte mémoire microSD.

J'ai commencé ma connaissance des appareils sans fil Xiaomi en achetant des capteurs de température et d'humidité. À cette époque, la seule possibilité de leur intégration était le pilote mihome , mentionné ci-dessus.

Pilote Mihome


L'ajout d'un pilote au système est très simple, vous devez cliquer sur le bouton «+» dans la liste des pilotes disponibles et observer le processus d'installation.



Je ne décrirai pas l'installation et la configuration initiale de l'application Android native Mi Home, vous pouvez la voir sur la page github du pilote ou sur Internet. Ainsi, le mode développeur est activé, le jeton est reçu, nous configurons l'adaptateur mihome, l'enregistrons et l'exécutons s'il n'a pas été démarré.



La passerelle Xiaomi et les appareils connectés dans l'application Mi Home doivent apparaître dans l'arborescence des objets.



Ensuite, vous pouvez configurer les objets nouvellement créés. Par exemple, stocker l'historique des capteurs de température et d'humidité. J'utilise un pilote SQL pour les données historiques qui est configuré sur une base de données SQLite.



Le stockage de l'historique de la variable est configuré dans la fenêtre des objets système: dans la hiérarchie des objets, vous devez accéder à la variable elle-même et appuyer sur le bouton avec une clé à droite. Sur l'onglet "Paramètres", j'ai le stockage de l'historique activé par les capteurs - ne change que la variable.

Autres paramètres:

  • intervalle minimum de 10 secondes - si la variable change plus souvent, l'entrée dans la base de données sera ignorée
  • enregistrement des valeurs toutes les 300 secondes (5 minutes) - si la variable ne change pas pendant plus de 5 minutes, la valeur actuelle est toujours écrite dans la base de données
  • type de valeur - nombre
  • durée de conservation - 1 an



L'ajout de nouveaux appareils s'effectue via l'application native. C'est-à-dire vous devez coupler le nouveau périphérique avec la passerelle selon les instructions jointes et après cela, il apparaîtra automatiquement dans la liste des objets ioBroker.

Pilote Zigbee


Cela ne me convenait pas d'utiliser l'application native Xiaomi, d'autant plus que je devais acheter une passerelle avec une prise chinoise, ce qui, dans mon cas, sauf pour communiquer avec des appareils, ne servait à rien. Oui, il peut être utilisé comme veilleuse ou utiliser un capteur de lumière dans certains scénarios. Sur Internet, vous pouvez trouver des instructions sur la façon de «transmettre» une liste de lecture à une passerelle pour lire ses propres stations de radio, mais rien de tout cela ne me reste. De plus, la pensée que mes données fuyaient quelque part, qu'elles étaient traitées et stockées quelque part était obsédante.

L'un des utilisateurs actifs de la plate-forme ioBroker a trouvé sur Internet la bibliothèque zigbee-shepherd sur node.js, dans laquelle il était fait mention de la connexion d'appareils Xiaomi. Un pilote pour ioBroker a été écrit sur sa base, et l'auteur de ce pilote ne se limitait pas uniquement aux appareils Xiaomi, la liste des appareils pris en charge est constamment mise à jour et est disponible sur la page github du projet.

Il est censé utiliser des dispositifs prêts à l'emploi peu coûteux basés sur les puces CC25xx de TI en tant que coordinateur de réseau. Vous pouvez acheter des modules ZigBee prêts à l'emploi avec connexion USB et une antenne intégrée, ainsi que des modèles plus chers et plus sérieux: avec une antenne externe, un amplificateur et une connexion via UART.

Pour travailler avec le pilote, il vous suffit de changer le firmware. Ainsi, il s'avère que ce pilote n'a pas besoin d'une passerelle coûteuse, les réseaux Wi-Fi ne sont pas nécessaires. Le "point d'entrée" est le coordinateur - un appareil basé sur la puce SS25xx avec un firmware spécial. Grâce au coordinateur, il y a une communication directe des appareils zigbee et du système Smart Home, ainsi que la liaison de nouveaux appareils.

En tant que coordinatrice, j'utilise une carte mère prête à l'emploi basée sur une puce CC2530 avec une antenne externe, que j'ai connectée au serveur via UART.

Pour le micrologiciel de l'appareil, un débogueur spécial SmartRF04EB a été acheté, le port microUSB dont je me suis connecté à l'ordinateur et le module ZigBee connecté à l'aide d'un câblage pour le débogage selon le schéma:
SS2530SmartRF04EB Board
P22DC
P21DD
RstRÉINITIALISER
GNDGND
Vcc3,3 V




Sur la page github du projet, téléchargez le firmware (le fichier s'appelle CC2530ZNP-Pro-Secure_LinkKeyJoin.hex pour cet appareil) et le firmware (flash-programmer), après quoi les pilotes nécessaires sont ajoutés au système.
Lorsque vous connectez la carte de débogage au port USB de l'ordinateur, le programme affiche immédiatement le périphérique connecté. Il vous suffit de spécifier le chemin d'accès au fichier du firmware et de cliquer sur le bouton «Effectuer des actions»



Les ports P03 (Rx) et P02 (Tx) du module ZigBee sont connectés dans des cartes cubietruck UART4 (dans le système d'exploitation comme ttyS4), alimentées en 3V3, GND a pris la broche voisine. Pour un fonctionnement stable, vous devez toujours tirer les ports P20, P4, P5 du coordinateur vers le sol. Comme je l'ai écrit ci-dessus, j'utilise le système d'exploitation Armbian, le port UART est activé très simplement, en utilisant la commande armbian-config dans la section Système - Matériel , vous devez activer le port souhaité et redémarrer le système.



Le pilote zigbee est ajouté à partir du panneau d'administration en un seul clic.



Dans mon cas, le coordinateur est connecté au port / dev / ttyS4 (comme je l'ai écrit plus haut), nous le précisons dans les paramètres.



D'autres paramètres peuvent être laissés par défaut. Après le premier lancement du pilote, vous devez coupler (ajouter) des périphériques. L'instruction complète sur github , l'appairage via ce pilote est un peu plus compliquée que via l'application native, mais je n'ai eu aucun problème.

Ainsi, par exemple, ajoutez le bouton Xiaomi (série Mijia), pour cela, nous appuyons sur le bouton vert dans les paramètres du pilote et, en suivant les instructions, maintenez d'abord le bouton de couplage à l'arrière avec un trombone jusqu'à ce que la LED commence à clignoter, puis cliquez sur ce bouton environ une fois toutes les 2 secondes, voir la progression du jumelage.



Mon appartement n'est pas grand, avec tous les appareils la connexion est stable, même avec un capteur de porte ouverte sur le palier (mur en béton armé de 100 mm et 5 m en ligne droite). Les problèmes ont commencé lorsque j'ai décidé d'ajouter un capteur de température et d'humidité à l'air de la rue, que j'ai installé sur le mur extérieur de la maison du côté de la loggia isolée. Le signal d'un capteur faible, qui se trouvait également dans la rue, n'a pas atteint l'armoire d'automatisation. Le problème peut être résolu simplement - vous devez ajouter un routeur au réseau ZigBee et le rapprocher du capteur. Certains appareils sans fil, par exemple la prise Xiaomi, peuvent fonctionner comme un routeur, mais je n'avais pas de tels appareils. Je ne voulais pas acheter une prise coûteuse ou une lumière contrôlée juste pour «transmettre» les données d'un capteur dans la rue. Il s'est avéré que, pour les mêmes terminaux basés sur la puce SS25xx, il existe un firmware spécial qui permet de les utiliser comme routeur dans le système. En conséquence, j'ai ajouté un routeur basé sur la puce CC2531 avec une connexion USB. Je ne m'attarderai pas sur le processus du firmware, le schéma et le fichier du firmware lui-même se trouvent sur la page github du projet.

Puisque, en fait, la communication avec le module via le port USB ne se produit pas, je l'ai branché temporairement sur la charge avec le port USB et l'ai branché sur une prise de la cuisine. Dans un avenir proche, je prévois de le placer à l'arrêt dans un bâtiment normal sur la loggia et avec une alimentation normale à partir d'un onduleur domestique.



Le processus d'ajout d'un routeur au système est simple: appuyez sur le bouton d'appairage dans le pilote et sur le routeur allumé, appuyez plusieurs fois sur le bouton S2 jusqu'à ce que les appareils se connectent.



Ajoutons un exemple de capteur de température / humidité, que j'ai situé sur la loggia à l'extérieur et qui devrait fonctionner via un routeur.

Vous pouvez simplement effectuer l'appairage via le pilote et le capteur doit se connecter via le routeur, s'il est plus proche. Mais vous pouvez spécifier de force que le couplage passe par un routeur spécifique, pour cela, dans la liste des périphériques sur l'icône du routeur, cliquez sur le bouton de couplage vert.



Assurez-vous que le capteur est correctement connecté - voir la carte du réseau.



La carte montre les lignes d'appariement des appareils indiquant la qualité du signal entre les segments du réseau. Comme je l'ai écrit ci-dessus, j'ai une petite odnushka de 35 m², donc la carte est assez modeste. Avec la permission d'autres utilisateurs, je publierai les options possibles avec une carte plus grande.







La fonctionnalité de certains appareils Xiaomi via cet adaptateur est même un peu plus que via l'application native et le pilote mihome. À l'avenir, je souhaite étendre un peu le réseau et essayer de nouveaux appareils, en particulier un lecteur intelligent pour rideaux et un cube de capteurs.

Pilote de matériau


Nous avons obtenu les données, les actionneurs liés, que faire maintenant avec eux? Tout d'abord, affichons dans une belle interface. J'ai un grand projet dans le pilote VIS, qui existe en plusieurs versions pour différentes autorisations, mais il y a suffisamment de matériel pour un article séparé. Elle sera peut-être la prochaine.

Pour un affichage simple et rapide des données et le contrôle de divers appareils, j'utilise le pilote de matériel. Installation comme d'habitude en quelques clics. Les tuiles d'interface affichent les données en fonction des paramètres de catégorie, qui sont ajoutés dans la fenêtre d'administration d'interface du même nom. La liste des catégories n'est limitée que par l'imagination, j'utilise le schéma «room-function», et le regroupement se fait selon elles. Ajout de toutes les pièces (cuisine, couloir, pièce, balcon, etc.) et des fonctions (éclairage, capteurs, système, etc.).



Maintenant, dans la fenêtre des paramètres des objets système, il est nécessaire que les variables qui seront affichées à l'écran indiquent la pièce, la fonction et assignent un rôle (pour un affichage correct). Un exemple est le capteur de température et d'humidité du mur intérieur de Xiaomi, connecté via Bluetooth.



En fonction de ces paramètres, la vignette affichera des données à l'écran, l'icône se resserrera et, pour les objets d'un certain type, un contrôle sera disponible.

Exemple 1. La sortie de toutes les informations dans une catégorie - fonction. Éclairage dans tout l'appartement.



Exemple 2. La sortie de toutes les informations sur la pièce - Salle de bain.



Exemple 3. La tension et le niveau de décharge de la batterie de tous les appareils sans fil Xiaomi.



Ce pilote travaille pour moi pour le contrôle local du système à partir d'un téléphone mobile, d'une tablette fixe sur le mur. Parfois, je me connecte via VPN. Pour contrôler et afficher les états à distance, pour recevoir des notifications, j'utilise le pilote de télégramme.

Pilote de télégramme


Je ne décrirai pas l'installation, il suffit de parcourir les paramètres. J'utilise le mode de fonctionnement via une interrogation périodique (300 ms par défaut) et une connexion via un serveur proxy. Pour obtenir des jetons, vous devez «parler» avec le créateur de bots, BotFather. Le processus est simple - recherchez une recherche pour ce bot, donnez une commande pour en créer un nouveau, spécifiez son nom unique et votre clé, indiquez-le dans les paramètres du pilote et, pour des raisons de sécurité, assurez-vous de spécifier le mot de passe "de bienvenue". Votre bot lui demandera lors de la communication avec un nouvel utilisateur.



Vous devez maintenant configurer les cas de communication via le bot. Pour ce faire, vous pouvez utiliser le pilote text2command ou JavaScript. Il est arrivé historiquement que j'utilise JavaScript à la fois sous forme de texte et de blocs Blockly. L'installation du pilote JS ne devrait pas causer de difficultés, la configuration dans ce cas n'est pas nécessaire. Après l'installation et le lancement, vous devez activer l'affichage du menu pour créer et modifier des scripts.



Exemple 1. Alertes.

Tout d'abord, essayons d'envoyer une notification sur l'ouverture, par exemple, de la porte d'entrée. J'ai un interrupteur reed sans fil Xiaomi sur la porte avant. Je surveille la marche de ma femme avec le petit pendant que je travaille. Créez un nouveau script dans le groupe commun.



Spécifiez ce qui sera "dessiné" en bloc et appelez-le "telegram_bot".



Dans le groupe "Evénements", nous prenons l'unité de réaction pour changer la variable et la faisons glisser sur le champ de travail.



Ensuite, sélectionnez l'ID de l'objet auquel nous sommes abonnés, insérez la vérification de l'objet via «si» - «sinon si» sur vrai / faux. Le résultat devrait ressembler à ce qui suit.



Ok, maintenant on court, on ouvre la porte - on ferme la porte et on voit des messages dans le télégramme.



Exemple 2. Contrôle d'éclairage via le menu.
Un exemple est plus compliqué, faisons un contrôle d'éclairage en utilisant les boutons de menu dans le télégramme. Ici, vous devez traîner un peu, c'est-à-dire lors de la création d'un script, vous devez sélectionner JS. La tâche est approximativement la suivante: créer des boutons sous la forme d'un menu avec le statut des appareils affichés immédiatement dans le texte de signature du bouton. Essayez toujours de vous assurer que lorsque vous appuyez sur le bouton, le statut d'éclairage est inversé et le statut est immédiatement mis à jour dans le texte du bouton avec l'apparition / la disparition de l'ampoule. De plus, si le menu est déjà en cours et allume / éteint manuellement la lumière avec le bouton, il est nécessaire que le menu soit également mis à jour avec l'état des luminaires.
Le code contient des commentaires et est relativement simple:
// ID
const LIGHT1 = ' ', CH_LIGHT1 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_main1';
const LIGHT2 = ' ', CH_LIGHT2 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_main2';
const LIGHT3 = ' ', CH_LIGHT3 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_sec';
const LIGHT4 = ' ', CH_LIGHT4 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_main';
const LIGHT5 = ' 1', CH_LIGHT5 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_sec_top';
const LIGHT6 = ' 2', CH_LIGHT6 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_sec_bottom';
const LIGHT7 = ' ', CH_LIGHT7 = 'mqtt.0.PLC55_Lighting.lighting.BathRoom_main';
const LIGHT8 = ' ', CH_LIGHT8 = 'mqtt.0.PLC55_Lighting.lighting.Hall_main';
const LIGHT9 = ' ', CH_LIGHT9 = 'mqtt.0.PLC55_Lighting.lighting.Balcon_main';
//
function sendLightMenu(message_text) {
//
var l1 = getState(CH_LIGHT1).val ? '💡' : '';
var l2 = getState(CH_LIGHT2).val ? '💡' : '';
var l3 = getState(CH_LIGHT3).val ? '💡' : '';
var l4 = getState(CH_LIGHT4).val ? '💡' : '';
var l5 = getState(CH_LIGHT5).val ? '💡' : '';
var l6 = getState(CH_LIGHT6).val ? '💡' : '';
var l7 = getState(CH_LIGHT7).val ? '💡' : '';
var l8 = getState(CH_LIGHT8).val ? '💡' : '';
var l9 = getState(CH_LIGHT9).val ? '💡' : '';
//
sendTo('telegram.0', {
text: message_text,
reply_markup: {
keyboard: [
[LIGHT1+l1, LIGHT2+l2, LIGHT3+l3],
[LIGHT4+l4, LIGHT5+l5, LIGHT6+l6],
[LIGHT7+l7, LIGHT8+l8, LIGHT9+l9]
],
resize_keyboard: true,
one_time_keyboard: true
}
});
}
//
function changeLight(room, channel) {
//
var alive = getState("mqtt.0.info.connection").val;
if (alive.includes("PLC55_Lighting")) {
if (getState(channel).val) {
setState(channel, false, false, function () {
sendLightMenu(room+' ');
});
} else {
setState(channel, true, false, function () {
sendLightMenu(room+' ');
});
}
} else {
sendLightMenu(' OFFLINE');
}
}
// request ,
on({id: "telegram.0.communicate.request", ack: false, change: 'any'}, function (obj) {
var msg = obj.state.val;
var command = obj.state.val.substring(obj.state.val.indexOf(']')+1);
var user = obj.state.val.substring(obj.state.val.indexOf('[')+1,obj.state.val.indexOf(']'));
var chat_id = getState("telegram.0.communicate.requestChatId").val;
var message_id = getState("telegram.0.communicate.requestMessageId").val;
var handled = false;
//
if (command == '/start' || command == '/menu' || command == '' || command == '') {
sendLightMenu("");
handled = true;
}
//######################## Lighting menu and commands ################
if (command == LIGHT1 || command == LIGHT1+'💡') {
changeLight(LIGHT1, CH_LIGHT1);
handled = true;
}
if (command == LIGHT2 || command == LIGHT2+'💡') {
changeLight(LIGHT2, CH_LIGHT2);
handled = true;
}
if (command == LIGHT3 || command == LIGHT3+'💡') {
changeLight(LIGHT3, CH_LIGHT3);
handled = true;
}
if (command == LIGHT4 || command == LIGHT4+'💡') {
changeLight(LIGHT4, CH_LIHT4);
handled = true;
}
if (command == LIGHT5 || command == LIGHT5+'💡') {
changeLight(LIGHT5, CH_LIGHT5);
handled = true;
}
if (command == LIGHT6 || command == LIGHT6+'💡') {
changeLight(LIGHT6, CH_LIGHT6);
handled = true;
}
if (command == LIGHT7 || command == LIGHT7+'💡') {
changeLight(LIGHT7, CH_LIGHT7);
handled = true;
}
if (command == LIGHT8 || command == LIGHT8+'💡') {
changeLight(LIGHT8, CH_LIGHT8);
handled = true;
}
if (command == LIGHT9 || command == LIGHT9+'💡') {
changeLight(LIGHT9, CH_LIGHT9);
handled = true;
}
// , text2command
if (!handled) {
sendTo('text2command.0', {
text: command.replace(/\//g, '#').replace(/_/g, ' '),
id: chat_id,
user: user
}, function (response) {
if (response && response.response) {
sendTo('telegram.0', {user: user, text: response.response});
}
});
}
});
// ,
on({id: /^mqtt\.0\.PLC55_Lighting\.lighting\..*$/, ack: true, change: 'ne'}, function (obj) {
sendLightMenu(" ");
});
//
sendLightMenu("");
view raw telegram_bot hosted with ❤ by GitHub


Le résultat devrait être quelque chose comme ceci:



Conclusion


L'article s'est avéré long, mais j'espère qu'il est utile, et peut-être qu'il facilitera la vie de certains utilisateurs ou encouragera quelqu'un à créer sa propre maison intelligente.
En ce moment, mon système de maison intelligente basé sur ioBroker tourne depuis 4 ans et j'en suis très satisfait. En plus de ZigBee, plusieurs contrôleurs maison via MQTT et HTTP y sont également connectés pour contrôler l'éclairage, la ventilation et d'autres systèmes, un réseau de capteurs de température sur le bus 1 fil, un dispositif de surveillance de l'alimentation sur le bus RS485 et le protocole RTU Modbus, et bien plus encore.

Dans ma tirelire de solutions pour une maison intelligente, j'ai accumulé de nombreuses idées, même si, probablement, elles devraient être perçues davantage comme une tirelire de problèmes pour une maison intelligente (ceux qui comprennent le sujet de ce que je veux dire). Laissez vos souhaits dans les commentaires pour m'aider à décider du sujet du prochain article.

Source: https://habr.com/ru/post/fr433340/


All Articles