Yandex: una casa inteligente para adultos



Recientemente, Yandex lanzó su sistema de hogar inteligente. Se nos ofrece comprar dispositivos Wi-Fi económicos: un adaptador en una toma de corriente, una bombilla y un control remoto IR. Es interesante que los desarrolladores de dispositivos "inteligentes" tengan la oportunidad de crear sus habilidades de "hogar inteligente", esto le permitirá conectar dispositivos al sistema Yandex y administrar su voz a través de Alice. Cada vez aparecen más marcas nuevas en las listas de habilidades. Alice entiende perfectamente el habla rusa, lo que la convierte en la líder indiscutible entre los asistentes de voz en el mercado ruso.
Sin embargo, no todo es tan sencillo ...

Primer inconveniente: básicamente, todos los sistemas propuestos están "nublados". A veces se pone en duda su fiabilidad, ya que su rendimiento depende directamente de la calidad de la conexión con los servidores del fabricante. Y cuando apaga Internet, los dispositivos se convierten completamente en una "calabaza".

Segundo menos: sistema de secuencias de comandos. Una parte importante de una casa inteligente son los guiones. Y aquí son muy primitivos: si "la frase es tal y tal", entonces habilite "el dispositivo es tal y tal". Para mi casa inteligente, esto era muy poco.

Los contras no terminan ahí, pero el resto probablemente esté relacionado con la inmadurez del sistema. El equipo de desarrollo de Yandex continúa agregando activamente varias funciones y errores para editar, ¡muchas gracias a ellos!

Después de estudiar la documentación, decidí crear la habilidad Yandex UD y conectarle el controlador de casa inteligente. Esto le permitirá no depender de servidores en la nube, implementar scripts localmente en el controlador y al mismo tiempo controlar el sistema por voz a través de Alice. Para esto, escribí el complemento "yandex2mqtt" en Node.js.

Poco de teoría


- Alice, enciende la luz.
Después de esta frase, ocurre la magia y la luz se enciende. Pero, ¿qué hay detrás de escena? Veamos cómo funciona todo.

La estación Yandex, después de escuchar un comando familiar, envía datos al servidor Yandex, al que especificamos la dirección de nuestro controlador de antemano. El servidor procesa la información y la redirige al controlador en forma de una solicitud posterior. En el controlador, la API intermedia (en nuestro caso, este es el complemento yandex2mqtt) procesa la solicitud y la redirige al tema MQTT. A continuación, el script se procesa en el programa Node-Red.

Node-Red decide qué hacer a continuación. Si el script lo proporciona, envía un comando para encender la luz en el tema MQTT correspondiente. El controlador wb-mqtt-serial responde enviando un comando Modbus al módulo de relé, que conmuta el relé. Y finalmente, la luz se enciende! Sí, el camino no está cerca, pero algunas fracciones de un segundo pase para el usuario.

Echemos un vistazo más de cerca al complemento yandex2mqtt. Lo primero que Yandex requiere para que la habilidad funcione es el servicio oAuth para agrupar cuentas en la aplicación Yandex. Después de que Yandex recibe el token de autorización del servicio oAuth, solicita una lista de dispositivos. El complemento yandex2mqtt responde con una lista de dispositivos con todas las propiedades en formato json. Luego aparecen en la lista de dispositivos disponibles para el control (en el llamado cuásar). Ahora, si le dice a Alice que encienda algún dispositivo de la lista, Yandex enviará una solicitud de publicación con los datos del dispositivo que desea encender al controlador. En respuesta, el complemento confirma la inclusión y escribe el nuevo estado en el tema mqtt especificado en la configuración del mismo complemento. Si el dispositivo cambió su estado sin la participación de Yandex, entonces el complemento, al ver los nuevos datos en el tema mqtt, lo enviará a Yandex cuando solicite el estado, lo que ahora está sucediendo solo si ingresa al dispositivo en el quasar. En otros casos, Yandex no sondea los estados.
Ahora hablaré sobre algunas de las propiedades de los dispositivos UD Yandex.

Tipo de dispositivo


Para una visualización correcta en el "cuásar" y una definición más precisa de los comandos de Alice, Yandex sugiere asignar diferentes tipos de dispositivos a los dispositivos. Tipos totales 10:

  • devices.types.light : cualquier lámpara, lámpara de araña, bombilla, etc.
  • devices.types.socket - Outlet
  • devices.types.switch - Interruptor
  • devices.types.thermostat - Termostato
  • devices.types.thermostat.ac - Aire acondicionado
  • devices.types.media_device - Dispositivo de medios
  • devices.types.media_device.tv - TV
  • devices.types.cooking - Electrodomésticos de cocina
  • devices.types.cooking.kettle - Creador
  • devices.types.other : todo lo demás que no se ajustaba a los párrafos anteriores.

Capacidad

Además, cada dispositivo debe tener al menos una capacidad .

En total, Yandex UD tiene 5 tipos de habilidades. Cada habilidad tiene una función diferente (instancia) , y algunas habilidades tienen varias funciones, lo que agrega flexibilidad al configurar dispositivos.

Capacidades:

1. devices.capabilities.on_off - Enciende y apaga.

instancia:

  • en

2. devices.capabilities.color_setting : gestión del color.

instancia:

  • rgb
  • hsv
  • temperatura_k

3. devices.capabilities.mode: modos de cambio.

instancia:

  • termostato
  • fan_speed

4. devices.capabilities.range - Control de rango.

instancia:

  • brillo
  • temperatura
  • volumen
  • canal

5. devices.capabilities.toggle - Silencio.

instancia:

  • mudo


Con la combinación correcta de todas las propiedades del dispositivo, Alice comprende sin ningún problema todos los comandos para administrar el Smart Home que se le han dado. Aquí, por supuesto, hay algunas dificultades para combinar habilidades. La documentación claramente no indica qué habilidades se pueden combinar y cuáles no. Pero el "método de empuje científico" nos ayudará con esto.

Entonces, por ejemplo, descubrí que el aire acondicionado contiene cuatro habilidades:

Tipo de dispositivo:

devices.types.thermostat.ac

Tipo de habilidad:

devices.capabilities.on_off

instancia:

  • en

dispositivos.capacidades.rango
instancia:

  • temperatura

dispositivos.capacidades.modo
instancia:

  • termostato

dispositivos.capacidades.modo
instancia:

  • fan_speed

No describiré las propiedades restantes, todo es bastante simple allí.

Para que funcione, necesitas:

  • Controlador
  • Cualquier dominio
  • Certificado SSL
  • Node.js
  • Yandex2mqtt plugin
  • Corredor MQTT
  • Rojo-nodo

Controlador


Mi apartamento "inteligente" está controlado por Wiren Board 6. Pero puede usar cualquier otro controlador Linux que extraiga Node.js y Node-Red. Por ejemplo, Raspberry pi o PC.

Dominio


Por supuesto, es deseable tener una dirección IP blanca y comprar un dominio, pero esto no es necesario. Puede usar DDNS, por ejemplo, www.noip.com .

Aquí todo es simple: regístrese, cree un nombre de host gratuito, ingrese su dirección IP. Algunos enrutadores tienen una configuración DDNS especial donde puede ingresar datos de noip.com. El enrutador enviará automáticamente una dirección IP cuando se cambie. Si no existe tal configuración en el enrutador, puede instalar el programa noip en el controlador y agregarlo a la ejecución automática. El programa hará exactamente lo mismo que un enrutador con configuraciones DDNS especiales: actualice su dirección IP en la base de datos de noip.com

Por lo tanto, tenemos una dirección estática que redirige todas las solicitudes a nuestro controlador.

Puertos 443 y 80


Ahora casi todos en casa tienen un enrutador. Además de sus funciones obvias, también es una barrera para la red local de los invitados no deseados del exterior. Pero en ciertos casos, necesitamos acceso a la red interna desde el exterior. Los fabricantes de enrutadores imaginaron esto y agregaron la función NAT (traducción de direcciones de red).

No describiré el momento de configurar el enrutador, ya que es diferente para cada fabricante. Cómo hacer esto, lea las instrucciones para su enrutador. Palabras clave de Google: reenvío de puertos, mapeo de puertos, NAT.

Es necesario reenviar el puerto para acceder a yandex2mqtt (puede ser cualquiera, elegí 443) y el puerto 80 (solo es necesario para obtener un certificado SSL. Después de recibir el certificado, el puerto 80 puede cerrarse).

Certificado SSL


Inmediatamente ponga todos los puntos en "y": los certificados autofirmados no funcionarán.
La mayoría de los registradores de dominios (por ejemplo, reg.ru) otorgan a sus clientes certificados SSL gratuitos para el dominio principal (www.yourdomain.ru). Si compró un dominio específicamente para Alice, puede usar el certificado SSL proporcionado.

Si no tiene su propio dominio, o tiene otro subdominio asignado para Alice (por ejemplo, alice.yourdomain.ru), entonces necesita obtener un certificado para este subdominio o para la dirección proporcionada por el servicio DDNS.

Para hacer esto, propongo usar el servicio gratuito para obtener un certificado SSL de letsencrypt.org.

Para obtener un certificado, debe instalar el programa certbot, ejecutar y especificar todos los datos que solicita. Al mismo tiempo, el puerto 80 debe ser gratuito y accesible desde el exterior. Le aconsejo que estudie detenidamente las instrucciones de letsencrypt.

Instalar y configurar certbot
apt-get update apt-get install certbot 


Detenga los servicios de vigilancia y nginx.

 service watchdog stop service nginx stop 

Reenviamos el puerto 80 en el enrutador.

Ejecute el programa certbot:

 certbot certonly --standalone 

Después de comenzar, el programa hará algunas preguntas simples.

1. Su correo electrónico Simplemente ingrese la dirección y presione enter



2. Se le solicita que lea los acuerdos de usuario. Si está de acuerdo con todo, simplemente ingrese "A", que significa Acepto, es decir, estoy de acuerdo.



3. El programa solicita permiso para enviar su dirección de correo electrónico a los desarrolladores. Ingrese N.



4. Ingrese su dominio para el cual desea recibir un certificado (puede ingresar el que recibimos en noip anteriormente). Aquí doy un ejemplo de entrada errónea. El prefijo http: // no es obligatorio.



Si hiciste todo correctamente, verás lo siguiente:



Esto significa que el certificado se recibió con éxito. Recuerde la ruta al certificado y la clave, será necesario al configurar el complemento yandex2mqtt. Por seguridad, cierre el puerto 80 en la configuración del enrutador, ya no será útil.

Activamos los servicios de vigilancia y nginx.

 service nginx start service watchdog start 

El certificado de letsencrypt se emite por 3 meses. No te olvides de actualizar.


Node.js y el complemento yandex2mqtt


Instalación
Configurar el repositorio de node.js

 curl -sL https://deb.nodesource.com/setup_10.x | bash - 

A continuación, instale o actualice todos los componentes necesarios.

 apt-get install -y nodejs git make g++ gcc build-essential 

Después de una instalación exitosa, copie el repositorio yandex2mqtt al controlador.

 git clone https://github.com/munrexio/yandex2mqtt.git /mnt/data/root/yandex2mqtt 

Nosotros establecemos los derechos.

 chown -R root:root /mnt/data/root/yandex2mqtt 

Vamos a la carpeta

 cd /mnt/data/root/yandex2mqtt 

Comenzamos la instalación.

 npm install 

Instalación completada.

Inicio automático
Crear una unidad systemd:

Vaya a la carpeta / etc / systemd / system / en el controlador y cree un archivo llamado yandex2mqtt.service . Copie lo siguiente en él:

 [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 

Después de eso, guarde los cambios y cierre el archivo.

Para habilitar la unidad, ingrese el comando en la consola:

 systemctl enable yandex2mqtt.service 


Ahora puede iniciar y detener el complemento con comandos

 service yandex2mqtt start service yandex2mqtt stop service yandex2mqtt restart 


Configuración:

Todas las configuraciones de complementos necesarias se encuentran en el archivo /mnt/data/root/yandex2mqtt/config.js
Edite este archivo de acuerdo con sus parámetros.
El certificado SSL debe ser fullchain .

Después de la configuración, ejecute yandex2mqtt con el comando:

 service yandex2mqtt start 

Después de configurar e iniciar el puente, le aconsejo que verifique el certificado en este sitio .

Simplemente ingrese su dominio que va a utilizar para acceder a Alice. Para un funcionamiento correcto, el certificado debe pasar todos los controles. De lo contrario, nada funcionará.

Habilidad Yandex UD


Creación de habilidades
1. Vaya a la página dialogs.yandex.ru/developer
2. Inicie sesión con su cuenta.
3. Haga clic en "crear diálogo"
4. Seleccione "Hogar inteligente"
5. Ingrese los parámetros requeridos:

  • Nombre : cualquier nombre.
  • URL de punto final : una dirección del tipo yourdomain / provider , donde en lugar de "yourdomain " es la dirección de noip o su dominio para el que se recibe un certificado SSL.



  • Privacidad : seleccione "No mostrar en el catálogo" (¡obligatorio! De lo contrario, la habilidad no pasará la moderación instantánea)
  • Nombre y correo electrónico del desarrollador : indique sus detalles.
  • Descripción : cualquier texto
  • Icono : cualquier icono.



6. Paquete de cuenta:



Haga clic en "agregar nuevo"
  • Los primeros dos puntos: especifique los datos de config.js / clients :

1. El identificador de la aplicación es clientId

2. Secreto de la aplicación - clientSecret




7. Guardar la habilidad



8. Haga clic en "Moderación"



9. Haga clic en "Publicar"



Agregar dispositivos a Yandex UD.
1. Vaya a la aplicación Yandex en el teléfono.



2. En el menú, seleccione Dispositivos / Smart Home



3. Haga clic en "Agregar dispositivo"



4. Elige tu habilidad



5. Haga clic en "Combinar cuentas"



6. Se abrirá la página de autorización.

Ingrese nombre de usuario y contraseña (establecido en el archivo config.js en el bloque de usuarios)



7. Haga clic en "Permitir".



8. Haga clic en "Actualizar lista de dispositivos"



Ahora a Alice se le pueden dar comandos para administrar los dispositivos agregados. Los equipos correspondientes llegarán a los temas indicados por mqtt.

Queda por vincular algunas acciones a estos temas.

Rojo-nodo


Node-Red fue elegido para el sistema de automatización. Esta es una gran herramienta de programación visual. El procedimiento de instalación y configuración se puede ver aquí .

El proceso de configuración y automatización de un hogar inteligente generará un artículo completo, o incluso dos. Y ya hay muchos de esos artículos. En cambio, un pequeño ejemplo del uso del complemento, cómo activar la voz de la bombilla.

Para mayor comodidad, creamos un dispositivo virtual en el controlador Wiren Board 6 en la interfaz web.
En el motor de reglas wb-rules necesitas ingresar

 defineVirtualDevice("yandex", { title: "yandex controls", cells: { light1: { type: "switch", value: false }, } }); 




Escribiremos los temas de MQTT de este dispositivo virtual en config.js para el tipo de habilidad "encendido" del dispositivo "Ligero":

  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 } }, ] }, //_______________   _______________// ] 

Ahora, con la frase "Alice, enciende / apaga la luz", el dispositivo virtual cambia.

Vayamos a Node-Red, que se instaló de acuerdo con las instrucciones.

Para un trabajo conveniente con Wiren Board 6, también puede usar el "nodo" adicional node-red-contrib-wirenboard .

El módulo de expansión WBE2R-R-ZIGBEE está instalado en el controlador, lo que hizo posible conectarse a la lámpara inteligente IKeevskaya de la serie TRODFRY utilizando el protocolo ZigBee.

Ahora depende de los pequeños. Lance algunos bloques en el espacio de trabajo Node-Red, conéctelos con "cadenas" y haga clic en Implementar.



La bombilla ikeevsky se conecta a través del complemento zigbee2mqtt, por lo tanto, en mqtt, el tema de la bombilla se debe enviar json para el control. Para hacer esto, insertaremos una función simple entre el dispositivo virtual WB y el tema de la bombilla mqtt.



Haz clic en Implementar. Lo comprobamos

¡Alice, enciende la luz!

Entonces, hoy aprendimos cómo conectar a Alice a un sistema de automatización. Quizás en algunos casos es demasiado complicado, es más fácil comprar una bombilla wi-fi normal, y eso es suficiente. Pero si planea construir una casa verdaderamente inteligente para usted, entonces las formas simples no pueden hacerlo aquí. Pero valga la pena o no, todos decidirán por sí mismos. Gracias por su atencion!

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


All Articles