Yandex: uma casa inteligente para adultos



Recentemente, a Yandex lançou seu sistema doméstico inteligente. É-nos oferecido a compra de dispositivos Wi-Fi baratos: um adaptador em uma tomada, uma lâmpada e um controle remoto por infravermelho. É interessante que os desenvolvedores de dispositivos "inteligentes" tenham a oportunidade de criar suas habilidades de "casa inteligente", isso permitirá que você conecte dispositivos ao sistema Yandex e gerencie sua voz através de Alice. Mais e mais novas marcas estão aparecendo nas listas de habilidades. Alice entende perfeitamente a fala russa, o que a torna a líder indiscutível entre os assistentes de voz no mercado russo.
No entanto, nem tudo é tão suave ...

Primeiro menos: basicamente, todos os sistemas propostos estão "nublados". Às vezes, sua confiabilidade é duvidosa, pois seu desempenho depende diretamente da qualidade da conexão com os servidores do fabricante. E quando você desliga a Internet, os dispositivos se transformam completamente em uma "abóbora".

Segundo menos: sistema de script. Uma parte importante de uma casa inteligente são os scripts. E aqui eles são muito primitivos: se "a frase é tal e tal", habilite "o dispositivo é tal e tal". Para minha casa inteligente, isso era muito pouco.

Os contras não terminam aí, mas o resto provavelmente está relacionado à imaturidade do sistema. A equipe de desenvolvimento do Yandex continua a adicionar ativamente vários recursos e bugs para editar, pelos quais muitos agradecem a eles!

Depois de estudar a documentação, decidi criar a habilidade Yandex UD e conectar o controlador doméstico inteligente a ela. Isso permitirá que você não dependa de servidores em nuvem, implemente scripts localmente no controlador e, ao mesmo tempo, controle o sistema por voz através de Alice. Para isso, escrevi o plugin "yandex2mqtt" no Node.js.

Pouco de teoria


Alice, acenda a luz.
Após essa frase, a mágica acontece e a luz acende. Mas o que há nos bastidores? Vamos descobrir como tudo funciona.

A estação Yandex, depois de ouvir um comando familiar, envia dados ao servidor Yandex, para o qual especificamos o endereço do nosso controlador com antecedência. O servidor processa as informações e as redireciona para o controlador na forma de uma Pós-solicitação. No controlador, a API intermediária (no nosso caso, este é o plug-in yandex2mqtt) processa a solicitação e a redireciona para o tópico MQTT. Em seguida, o script é processado no programa Node-Red.

Nó-vermelho decide o que fazer a seguir. Se for fornecido pelo script, ele envia um comando para acender a luz no tópico correspondente do MQTT. O driver wb-mqtt-serial responde enviando um comando Modbus ao módulo de relé, que alterna o relé. E, finalmente, a luz acende! Sim, o caminho não está próximo, mas para o usuário apenas uma fração de segundo passa.

Vamos dar uma olhada no plug-in yandex2mqtt. A primeira coisa que o Yandex exige para a habilidade funcionar é o serviço oAuth para agrupar contas no aplicativo Yandex. Depois que o Yandex recebe o token de autorização do serviço oAuth, ele solicita uma lista de dispositivos. O plug-in yandex2mqtt responde com uma lista de dispositivos com todas as propriedades no formato json. Em seguida, eles aparecem na lista de dispositivos disponíveis para controle (no chamado quasar). Agora, se você disser a Alice para ativar algum dispositivo da lista, Yandex enviará uma solicitação de postagem com os dados do dispositivo que ele deseja ligar ao controlador. Em resposta, o plug-in confirma a inclusão e grava o novo estado no tópico mqtt especificado nas configurações do mesmo plug-in. Se o dispositivo alterou seu status sem a participação do Yandex, o plug-in, vendo os novos dados no tópico mqtt, o enviará ao Yandex ao solicitar o status, o que agora está acontecendo apenas se você entrar no próprio dispositivo no quasar. Em outros casos, o Yandex não pesquisa status.
Agora vou falar sobre algumas das propriedades dos dispositivos Yandex UD.

Tipo de dispositivo


Para uma exibição correta no “quasar” e uma definição mais precisa dos comandos de Alice, Yandex sugere atribuir diferentes tipos de dispositivos aos dispositivos. Total de tipos 10:

  • devices.types.light - Qualquer lâmpada, lustre, lâmpada etc.
  • devices.types.socket - Tomada
  • devices.types.switch - Switch
  • devices.types.thermostat - Termostato
  • devices.types.thermostat.ac - Ar condicionado
  • devices.types.media_device - Dispositivo de mídia
  • devices.types.media_device.tv - TV
  • devices.types.cooking - Utensílios de cozinha
  • devices.types.cooking.kettle - Criador
  • devices.types.other - Todo o resto que não se encaixava nos parágrafos anteriores.

Capacidade

Além disso, cada dispositivo deve ter pelo menos um recurso .

No total, o Yandex UD possui 5 tipos de habilidades. Cada habilidade tem uma função diferente (instância) , e algumas habilidades têm várias funções, o que adiciona flexibilidade ao configurar dispositivos.

Recursos:

1. devices.capabilities.on_off - Ligue e desligue.

exemplo:

  • em

2. devices.capabilities.color_setting - Gerenciamento de cores.

exemplo:

  • rgb
  • hsv
  • temperature_k

3. devices.capabilities.mode - Alternar modos.

exemplo:

  • termostato
  • fan_speed

4. devices.capabilities.range - Controle de alcance.

exemplo:

  • brilho
  • temperatura
  • volume
  • canal

5. devices.capabilities.toggle - Sem áudio.

exemplo:

  • mudo


Com a combinação certa de todas as propriedades do dispositivo, Alice entende sem problemas todos os comandos para gerenciar o Smart Home dados a ela. Aqui, é claro, existem algumas dificuldades em combinar habilidades. A documentação claramente não indica quais habilidades podem ser combinadas e quais não. Mas o "método científico do puxão" nos ajudará com isso.

Então, por exemplo, descobri que o ar condicionado contém quatro habilidades:

Tipo de dispositivo:

devices.types.thermostat.ac

Tipo de Habilidade:

devices.capabilities.on_off

exemplo:

  • em

devices.capabilities.range
exemplo:

  • temperatura

devices.capabilities.mode
exemplo:

  • termostato

devices.capabilities.mode
exemplo:

  • fan_speed

Não vou descrever as propriedades restantes, tudo é bem simples lá.

Para fazê-lo funcionar, você precisa:

  • Controlador
  • Qualquer domínio
  • Certificado SSL
  • Node.js
  • Yandex2mqtt plugin
  • Intermediário MQTT
  • Nó vermelho

Controlador


Meu apartamento “inteligente” é controlado pela Wiren Board 6. Mas você pode usar qualquer outro controlador Linux que puxe o Node.js e o Node-Red. Por exemplo, Raspberry pi ou PC.

Domínio


Obviamente, é desejável ter um endereço IP branco e comprar um domínio, mas isso não é necessário. Você pode usar o DDNS - por exemplo, www.noip.com .

Tudo é simples aqui: registre-se, crie um nome de host gratuito, digite seu endereço IP. Alguns roteadores possuem uma configuração DDNS especial na qual é possível inserir dados noip.com. O roteador enviará automaticamente um endereço IP quando for alterado. Se não houver essa configuração no roteador, você poderá instalar o programa noip no controlador e adicioná-lo à execução automática. O programa fará exatamente a mesma coisa que um roteador com configurações DDNS especiais - atualize seu endereço IP no banco de dados noip.com

Portanto, temos um endereço estático que redireciona todas as solicitações para o nosso controlador.

Portas 443 e 80


Agora quase todo mundo em casa tem um roteador. Além de suas funções óbvias, também é uma barreira para a rede local contra visitantes indesejados de fora. Mas, em certos casos, precisamos acessar a rede interna de fora. Os fabricantes de roteadores imaginaram isso e adicionaram o recurso NAT (Network Address Translation).

Não descreverei o momento da instalação do roteador, pois é diferente para cada fabricante. Como fazer isso, leia as instruções para o seu roteador. Palavras-chave do Google: Port Forwarding, Port Mapping, NAT.

É necessário encaminhar a porta para acessar o yandex2mqtt (pode ser qualquer um, escolhi 443) e a porta 80 (só é necessário receber um certificado SSL. Após receber o certificado, a porta 80 pode ser fechada).

Certificado SSL


Coloque imediatamente todos os pontos no “e”: os certificados autoassinados não funcionarão.
A maioria dos registradores de domínio (por exemplo, reg.ru) fornece a seus clientes certificados SSL gratuitos para o domínio principal (www.seudominio.ru). Se você comprou um domínio especificamente para Alice, poderá usar o certificado SSL fornecido.

Se você não possui seu próprio domínio ou outro subdomínio alocado para Alice (por exemplo, alice.seudominio.ru), é necessário obter um certificado para esse subdomínio ou o endereço fornecido pelo serviço DDNS.

Para fazer isso, proponho usar o serviço gratuito para obter um certificado SSL em letsencrypt.org.

Para obter um certificado, você precisa instalar o programa certbot, executar e especificar todos os dados solicitados. Ao mesmo tempo, a porta 80 deve ser gratuita e acessível a partir do exterior.Recomendo que você estude cuidadosamente as instruções do letsencrypt.

Instale e configure o certbot
apt-get update apt-get install certbot 


Interrompa os serviços watchdog e nginx.

 service watchdog stop service nginx stop 

Encaminhamos a 80ª porta do roteador.

Execute o programa certbot:

 certbot certonly --standalone 

Após o início, o programa fará algumas perguntas simples.

1. Seu e-mail. Basta digitar o endereço e pressionar enter



2. Você é solicitado a ler os contratos do usuário. Se você concorda com tudo, basta digitar "A", o que significa Concordo, ou seja, eu concordo.



3. O programa solicita permissão para enviar seu endereço de email aos desenvolvedores. Digite N.



4. Digite o seu domínio para o qual você deseja receber um certificado (você pode inserir o que recebemos no noip anteriormente). Aqui eu dou um exemplo de entrada incorreta. O prefixo http: // não é necessário.



Se você fez tudo corretamente, verá o seguinte:



Isso significa que o certificado foi recebido com sucesso. Lembre-se do caminho para o certificado e a chave, será necessário ao configurar o plug-in yandex2mqtt. Por segurança, feche a porta 80 nas configurações do roteador, não será mais útil.

Ativamos os serviços watchdog e nginx.

 service nginx start service watchdog start 

O certificado do letsencrypt é emitido por 3 meses. Não se esqueça de atualizar.


Node.js e o plug-in yandex2mqtt


Instalação
Configurando o Repositório node.js.

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

Em seguida, instale ou atualize todos os componentes necessários

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

Após a instalação bem-sucedida, copie o repositório yandex2mqtt para o controlador.

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

Nós estabelecemos os direitos.

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

Nós vamos para a pasta.

 cd /mnt/data/root/yandex2mqtt 

Iniciamos a instalação.

 npm install 

Instalação concluída.

Inicialização automática
Crie uma unidade systemd:

Vá para a pasta / etc / systemd / system / no controlador e crie um arquivo chamado yandex2mqtt.service . Copie o seguinte para ele:

 [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 

Depois disso, salve as alterações e feche o arquivo.

Para ativar a unidade, digite o comando no console:

 systemctl enable yandex2mqtt.service 


Agora você pode iniciar e parar o plug-in com comandos

 service yandex2mqtt start service yandex2mqtt stop service yandex2mqtt restart 


Configuração:

Todas as configurações de plug-in necessárias estão no arquivo /mnt/data/root/yandex2mqtt/config.js
Edite este arquivo de acordo com seus parâmetros.
O certificado SSL deve ser de cadeia completa .

Após a configuração, execute yandex2mqtt com o comando:

 service yandex2mqtt start 

Depois de configurar e iniciar a ponte, aconselho que você verifique o certificado neste site .

Basta digitar o seu domínio que você usará para acessar Alice. Para uma operação adequada, o certificado deve passar em todas as verificações. Caso contrário, nada funcionará.

Habilidade Yandex UD


Criação de habilidades
1. Vá para a página dialogs.yandex.ru/developer
2. Faça login com sua conta.
3. Clique em "criar diálogo"
4. Selecione "Casa Inteligente"
5. Digite os parâmetros necessários:

  • Nome - Qualquer nome.
  • URL do terminal - um endereço do tipo seudominio / provedor , em vez de "seudominio " é o endereço do noip ou seu domínio para o qual um certificado SSL é recebido.



  • Privacidade - selecione "Não aparecer no catálogo" (obrigatório! Caso contrário, a habilidade não passará por moderação instantânea)
  • Nome e email do desenvolvedor - indique seus detalhes.
  • Descrição - qualquer texto
  • Ícone - qualquer ícone.



6. Pacote de contas:



Clique em "adicionar novo"
  • Os dois primeiros pontos - especifique os dados de config.js / clients :

1. O identificador do aplicativo é clientId

2. Segredo do aplicativo - clientSecret




7. Salve a habilidade



8. Clique em "Moderação"



9. Clique em "Publicar"



Adicionando dispositivos ao Yandex UD.
1. Acesse o aplicativo Yandex no telefone



2. No menu, selecione Dispositivos / Smart Home



3. Clique em "Adicionar dispositivo"



4. Escolha sua habilidade



5. Clique em "Mesclar contas"



6. A página de autorização será aberta

Digite o login e a senha (definido no arquivo config.js no bloco de usuários)



7. Clique em "Permitir".



8. Clique em "Atualizar lista de dispositivos"



Agora, Alice pode receber comandos para gerenciar os dispositivos adicionados. As equipes correspondentes chegarão aos tópicos indicados por mqtt.

Resta vincular algumas ações a esses tópicos.

Nó vermelho


O Node-Red foi escolhido para o sistema de automação. Esta é uma ótima ferramenta de programação visual. O procedimento de instalação e configuração pode ser visto aqui .

O processo de criação e automação de uma casa inteligente atrairá um artigo inteiro, ou até dois. E já existem muitos desses artigos. Em vez disso - um pequeno exemplo de uso do plug-in, como ativar a voz da lâmpada.

Por conveniência, criamos um dispositivo virtual no controlador Wiren Board 6 na interface da web.
No mecanismo de regras wb-rules , você precisa inserir

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




Escreveremos os tópicos MQTT deste dispositivo virtual em config.js para o tipo de habilidade "on" do dispositivo "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 } }, ] }, //_______________   _______________// ] 

Agora, com a frase "Alice, ligue / desligue a luz", o dispositivo virtual muda.

Vamos para o Node-Red, que foi instalado de acordo com as instruções.

Para um trabalho conveniente com o Wiren Board 6, você também pode usar o “nó” node-red-contrib-wirenboard adicional .

O módulo de expansão WBE2R-R-ZIGBEE está instalado no controlador, o que possibilitou a conexão à lâmpada inteligente IKeevskaya da série TRODFRY usando o protocolo ZigBee.

Agora cabe aos pequenos. Jogue alguns blocos no espaço de trabalho Node-Red, conecte-os com "strings" e clique em Deploy.



A lâmpada ikeevsky é conectada através do plug-in zigbee2mqtt, portanto, no mqtt, o tópico da lâmpada deve ser enviado json para controle. Para fazer isso, inseriremos uma função simples entre o dispositivo virtual WB e o tópico bulbo mqtt.



Clique em Implantar. Nós verificamos.

Alice, acenda a luz!

Então, hoje aprendemos como conectar Alice a um sistema de automação. Talvez em alguns casos seja muito complicado, seja mais fácil comprar uma lâmpada wi-fi comum, e isso é o suficiente. Mas se você planeja construir uma casa verdadeiramente inteligente para si mesmo, maneiras simples não podem ser feitas aqui. Mas vale a pena ou não, todo mundo vai decidir por si mesmo. Obrigado pela atenção!

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


All Articles