Dispositivos inalámbricos Xiaomi en el hogar inteligente ioBroker

Saludos a todos los amantes de la domótica. Decidí compartir la experiencia de usar dispositivos inalámbricos Xiaomi con la interfaz ZigBee. Honestamente, estoy en contra del uso de dispositivos inalámbricos en cualquier automatización, desde sistemas de control de procesos serios de objetos grandes hasta pequeñas automatizaciones como alarmas contra incendios u hogares inteligentes, pero ... las soluciones de Xiaomi sobornadas con bajo costo, accesibilidad, excelente diseño y muchas críticas positivas de los usuarios, decidí para intentarlo

Esta publicación debe tomarse como una instrucción paso a paso para integrar dispositivos ZigBee en la infraestructura del hogar inteligente. Aquí se describe de ninguna manera un axioma y puede encontrar muchas otras formas de conectar dispositivos ZigBee. Si aún omite la descripción detallada, puede tener la impresión de la complejidad o facilidad de combinar dispositivos de diferentes fabricantes en una plataforma local utilizando el ejemplo de ZigBee y ioBroker (más sobre eso más adelante). Diré en este artículo cómo conectar dispositivos a una casa inteligente, mostrar información de ellos en una tableta o simplemente en un navegador y enviar mensajes a través de telegramas sobre el cambio del estado del dispositivo. Si estoy interesado en ti, entonces pido un gato.

Según el fabricante de Xiaomi, los usuarios deberían usar una aplicación nativa con una conexión a la nube y una puerta de enlace Wi-Fi para dispositivos ZigBee. Sin embargo, hace mucho que se conoce un método para activar el modo desarrollador en una aplicación para obtener un token de control. Por lo tanto, dentro de la red local, puede comunicarse con la puerta de enlace, que le permite hacer el controlador mihome , que es parte de ioBroker.

ioBroker es una plataforma abierta para IoT, incluida la construcción de sistemas domésticos inteligentes. Qué es ioBroker se puede encontrar en el artículo anterior.

Ahora mi casa inteligente está "girando" en una placa ARM Cubietruck con algún "kit de carrocería" en forma de disco duro de 80 GB, baterías recargables de 5000 mAh, un maestro USB de 1 cable, un convertidor USB-RS485 para dispositivos de sondeo que utilizan el protocolo Modbus. Armbian OS se instala en el disco duro con la transferencia de la partición raíz, solo el gestor de arranque permanece en la tarjeta de memoria microSD.

Comencé a conocer los dispositivos inalámbricos de Xiaomi comprando sensores de temperatura y humedad. En ese momento, la única posibilidad de su integración era el controlador mihome , que se mencionó anteriormente.

Conductor de Mihome


Agregar un controlador al sistema es muy simple, debe hacer clic en el botón "+" en la lista de controladores disponibles y observar el proceso de instalación.



No describiré la instalación y la configuración inicial de la aplicación nativa de Android Mi Home, puede verla en la página de Github del controlador o en Internet. Entonces, se activa el modo desarrollador, se recibe el token, configuramos el adaptador mihome, lo guardamos y ejecutamos si no se ha iniciado.



La puerta de enlace de Xiaomi y los dispositivos conectados en la aplicación Mi Home deben aparecer en el árbol de objetos.



A continuación, puede configurar los objetos recién creados. Por ejemplo, almacenar el historial de sensores de temperatura y humedad. Utilizo un controlador SQL para datos históricos que está configurado en una base de datos SQLite.



El almacenamiento del historial de la variable se configura en la ventana de objetos del sistema: en la jerarquía de objetos, debe acceder a la variable misma y presionar el botón con una llave a la derecha. En la pestaña "Configuración", tengo el almacenamiento de historial activado por sensores, solo cambios en la variable.

Otras configuraciones:

  • intervalo mínimo de 10 segundos: si la variable cambiará con más frecuencia, se ignorará la entrada en la base de datos
  • registrar valores cada 300 segundos (5 minutos): si la variable no cambia durante más de 5 minutos, el valor actual todavía se escribe en la base de datos
  • tipo de valor - número
  • vida útil: 1 año



Agregar nuevos dispositivos ocurre a través de la aplicación nativa. Es decir debe emparejar el nuevo dispositivo con la puerta de enlace de acuerdo con las instrucciones adjuntas y luego aparecerá automáticamente en la lista de objetos ioBroker.

Conductor Zigbee


Fue un inconveniente para mí usar la aplicación Xiaomi nativa, especialmente porque tuve que comprar una puerta de enlace con un enchufe chino, que en mi caso, excepto para comunicarme con dispositivos, no era útil para nada. Sí, se puede usar como luz nocturna o usar un sensor de luz en algunos escenarios. En Internet puede encontrar instrucciones sobre cómo "alimentar" una lista de reproducción a una puerta de enlace para reproducir sus propias estaciones de radio, pero nada de esto me quedó grabado. Además, la idea de que mis datos se filtraban en algún lugar, se procesaban y almacenaban en algún lugar era inquietante.

Uno de los usuarios activos de la plataforma ioBroker encontró en Internet la biblioteca zigbee-shepherd en node.js, en la que se mencionaba la conexión de dispositivos Xiaomi. Se creó un controlador para ioBroker sobre la base, y el autor de este controlador no se limitó solo a los dispositivos Xiaomi, la lista de dispositivos compatibles se actualiza constantemente y está disponible en la página de github del proyecto.

Se supone que utiliza dispositivos de bajo costo basados ​​en los chips CC25xx de TI como coordinador de red. Puede comprar módulos ZigBee listos para usar con conexión USB y una antena incorporada, así como modelos más caros y más serios: con una antena externa, amplificador y conexión a través de UART.

Para trabajar con el controlador, solo necesita cambiar el firmware. Por lo tanto, resulta que este controlador no necesita una puerta de enlace costosa, no se necesitan redes Wi-Fi. El "punto de entrada" es el coordinador, un dispositivo basado en el chip SS25xx con firmware especial. A través del coordinador, hay comunicación directa de los dispositivos zigbee y el sistema Smart Home, así como la vinculación de nuevos dispositivos.

Como coordinador, utilizo una placa base preparada basada en un chip CC2530 con una antena externa, que conecté al servidor a través de UART.

Para el firmware del dispositivo, se compró un depurador SmartRF04EB especial, cuyo puerto microUSB me conecté a la computadora y el módulo ZigBee se conectó mediante cableado para la depuración de acuerdo con el esquema:
SS2530SmartRF04EB Board
P22DC
P21DD
RstRESET
GNDGND
Vcc3.3V




En la página de github del proyecto, descargue el firmware (el archivo se llama CC2530ZNP-Pro-Secure_LinkKeyJoin.hex para este dispositivo) y el programa de firmware (programador flash), después de lo cual se agregan los controladores necesarios al sistema.
Cuando conecta la placa del depurador al puerto USB de la computadora, el programa mostrará inmediatamente el dispositivo conectado. Solo necesita especificar la ruta al archivo de firmware y hacer clic en el botón "Realizar acciones"



Los puertos del módulo ZigBee P03 (Rx) y P02 (Tx) están conectados a las placas cubietruck UART4 (en el sistema operativo como ttyS4), con alimentación 3V3, GND tomó el pin vecino. Para una operación estable, aún necesita tirar de los puertos P20, P4, P5 del coordinador al suelo. Como escribí anteriormente, uso el sistema operativo Armbian, el puerto UART se activa de manera muy simple, usando el comando armbian-config en la sección Sistema - Hardware , debe activar el puerto deseado y reiniciar el sistema.



El controlador zigbee se agrega desde el panel de administración con un solo clic.



En mi caso, el coordinador está conectado al puerto / dev / ttyS4 (como escribí anteriormente), lo especificamos en la configuración.



Se pueden dejar otras configuraciones por defecto. Después del primer lanzamiento del controlador, debe emparejar (agregar) dispositivos. La instrucción completa sobre github , el emparejamiento a través de este controlador es un poco más complicado que a través de la aplicación nativa, pero no tuve problemas.

Entonces, por ejemplo, agregue el botón Xiaomi (serie Mijia), para esto presionamos el botón verde en la configuración del controlador y, siguiendo las instrucciones, primero mantenga presionado el botón de emparejamiento en la parte posterior con un clip de papel hasta que el LED comience a parpadear, luego haga clic en este botón aproximadamente una vez cada 2 segundos, Ver el progreso del emparejamiento.



Mi apartamento no es grande, con todos los dispositivos la conexión es estable, incluso con un sensor de puerta abierta en el rellano (el muro de hormigón armado mide 100 mm y 5 m en línea recta). Los problemas comenzaron cuando decidí agregar un sensor de temperatura y humedad al aire de la calle, que instalé en la pared exterior de la casa desde el lado de la logia aislada. La señal de un sensor débil, que también estaba en la calle, no llegó al gabinete de automatización. El problema puede resolverse simplemente: debe agregar un enrutador a la red ZigBee y colocarlo más cerca del sensor. Algunos dispositivos inalámbricos, por ejemplo, el zócalo Xiaomi, pueden funcionar como un enrutador, pero no tenía tales dispositivos. No quería comprar una salida costosa o una luz controlada solo para "reenviar" datos desde un sensor en la calle. Al final resultó que, para los mismos dispositivos terminales basados ​​en el chip SS25xx hay un firmware especial que les permite ser utilizados como un enrutador en el sistema. Como resultado, agregué un enrutador basado en el chip CC2531 con una conexión USB. No me detendré en el proceso de firmware, el esquema y el archivo de firmware en sí se pueden encontrar en la página de Github del proyecto.

Como, de hecho, no se produce la comunicación con el módulo a través del puerto USB, lo conecté temporalmente a la carga con el puerto USB y lo enchufé a un tomacorriente de la cocina. En un futuro próximo planeo colocarlo estacionario en un edificio normal en la logia y con la energía normal de un UPS doméstico.



El proceso de agregar un enrutador al sistema es simple: presione el botón de emparejamiento en el controlador y en el enrutador encendido presione el botón S2 varias veces hasta que los dispositivos se conecten.



Agreguemos un ejemplo de un sensor de temperatura / humedad, que ubiqué en la galería exterior y que debería funcionar a través de un enrutador.

Simplemente puede realizar el emparejamiento a través del controlador y el sensor debe conectarse a través del enrutador, si está más cerca. Pero puede especificar a la fuerza que el emparejamiento pasa por un enrutador específico; para esto, en la lista de dispositivos en el icono del enrutador, haga clic en el botón verde de emparejamiento.



Asegúrese de que el sensor esté conectado correctamente; consulte el mapa de red.



El mapa muestra las líneas de emparejamiento de dispositivos que indican la calidad de la señal entre segmentos de red. Como escribí anteriormente, tengo un pequeño odnushka de 35 metros cuadrados, por lo que el mapa es bastante modesto. Con el permiso de otros usuarios, publicaré posibles opciones con una tarjeta más grande.







La funcionalidad de algunos dispositivos Xiaomi a través de este adaptador es incluso un poco más que a través de la aplicación nativa y el controlador mihome. En el futuro quiero expandir un poco la red y probar nuevos dispositivos, en particular, una unidad inteligente para cortinas y un cubo sensor.

Conductor material


Tenemos los datos, los actuadores atados, ¿qué hacer ahora con ellos? Primero, vamos a mostrar en una hermosa interfaz. Tengo un gran proyecto en el controlador VIS, que existe en varias versiones para diferentes permisos, pero hay suficiente material para un artículo separado. Quizás ella será la próxima.

Para una visualización simple y rápida de los datos y el control de varios dispositivos, utilizo el controlador de material. Instalación como de costumbre en un par de clics. Los mosaicos de interfaz muestran datos basados ​​en la configuración de categoría, que se agregan en la ventana de administración de interfaz del mismo nombre. La lista de categorías está limitada solo por la imaginación, utilizo el esquema de "función de sala", y la agrupación ocurre de acuerdo con ellas. Se agregaron todas las habitaciones (cocina, pasillo, sala, balcón, etc.) y funciones (iluminación, sensores, sistema, etc.).



Ahora, en la ventana de configuración de los objetos del sistema, es necesario que las variables que se mostrarán en la pantalla indiquen la sala, la función y asignen un rol (para una visualización adecuada). Un ejemplo es el sensor de temperatura y humedad de la pared interior de Xiaomi, conectado a través de Bluetooth.



En función de esta configuración, el mosaico mostrará datos en la pantalla, el ícono se ajustará y para los objetos de cierto tipo de control estará disponible.

Ejemplo 1. La salida de toda la información en una categoría - función. Iluminación en todo el departamento.



Ejemplo 2. La salida de toda la información sobre la habitación - Baño.



Ejemplo 3. El voltaje y el nivel de descarga de la batería de todos los dispositivos inalámbricos Xiaomi.



Este controlador funciona para mí para el control local del sistema desde un teléfono móvil, una tableta estacionaria en la pared. A veces me conecto a través de VPN. Para controlar y ver estados de forma remota, para recibir notificaciones, utilizo el controlador de telegrama.

Conductor de telegrama


No describiré la instalación, solo repase la configuración. Utilizo el modo de operación mediante encuestas periódicas (300 ms por defecto) y conexión a través de un servidor proxy. Para obtener el token, debes "hablar" con el creador de bots, BotFather. El proceso es simple: busque este robot, déle un comando para crear uno nuevo, especifique su nombre único y su clave, indíquelo en la configuración del controlador y, por seguridad, asegúrese de especificar la contraseña de "bienvenida". Su bot le preguntará cuando se comunique con un nuevo usuario.



Ahora necesita configurar casos de comunicación a través del bot. Puede usar el controlador text2command o JavaScript para hacer esto. Sucedió históricamente que uso JavaScript tanto en forma de texto como de bloques Blockly. Instalar el controlador JS no debería causar dificultades, la configuración en este caso no es necesaria. Después de la instalación y el inicio, debe habilitar la visualización del menú para crear y editar scripts.



Ejemplo 1. Alertas.

Primero, intentemos enviar una notificación sobre la apertura, por ejemplo, de la puerta principal. Tengo un interruptor de láminas de sensor inalámbrico Xiaomi en la puerta principal. Superviso cómo mi esposa camina con el mezquino mientras estoy en el trabajo. Cree un nuevo script en el grupo común.



Especifique lo que será "dibujar" en bloque y llámelo "telegram_bot".



En el grupo "Eventos", tomamos la unidad de reacción para cambiar la variable y la arrastramos al campo de trabajo.



Luego, seleccione la ID del objeto al que nos estamos suscribiendo, inserte la verificación del objeto a través de "si" - "de lo contrario si" a verdadero / falso. El resultado debería ser algo como lo siguiente.



Ok, ahora estamos corriendo, abrimos la puerta, la cerramos y vemos mensajes en el telegrama.



Ejemplo 2. Control de iluminación a través del menú.
Un ejemplo es más complicado, hagamos el control de la iluminación usando los botones del menú en telegrama. Aquí tienes que esperar un poco, es decir Al crear un script, debe seleccionar JS. La tarea es aproximadamente la siguiente: crear botones en forma de menú con el estado de los dispositivos que se muestran inmediatamente en el texto de la firma del botón. Intente asegurarse de que cuando presiona el botón, el estado de la iluminación se invierte y el estado se actualiza inmediatamente en el texto del botón con la aparición / desaparición de la bombilla. Además, si el menú ya se está ejecutando y se enciende / apaga manualmente la luz con el botón, es necesario que el menú también se actualice con el estado de los dispositivos.
El código contiene comentarios y es relativamente sencillo:
// 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


El resultado debería ser algo como esto:



Conclusión


El artículo resultó ser largo, pero espero que sea útil, y tal vez haga la vida más fácil para algunos usuarios o aliente a alguien a crear su propia casa inteligente.
Por el momento, mi sistema de hogar inteligente basado en ioBroker ha estado funcionando durante 4 años y estoy bastante satisfecho con él. Además de ZigBee, también se conectan varios controladores caseros a través de MQTT y HTTP para controlar la iluminación, la ventilación y otros sistemas, una red de sensores de temperatura en el bus de 1 cable, un dispositivo de monitoreo de la fuente de alimentación en el bus RS485 y el protocolo Modbus RTU, y mucho más.

En mi alcancía de soluciones para un hogar inteligente, he acumulado muchas ideas, aunque, probablemente, deberían percibirse más como una alcancía de problemas para un hogar inteligente (aquellos que entienden el tema sobre lo que quiero decir). Deje sus deseos en los comentarios para ayudarme a decidir sobre el tema del próximo artículo.

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


All Articles