Automação de apartamentos com HomePod, Raspberry Pi e Node.js



Traduzido para você, um artigo de Chris Hawkins , no qual ele fala sobre transformar seu apartamento em uma casa inteligente. O HomePod da Apple é usado como base, mas, é claro, outros sistemas podem ser usados.

Eu tenho um Apple HomePod executando em casa, o que ajuda a controlar certos sistemas em casa (por exemplo, lâmpadas inteligentes) com um simples pedido à Siri. O sistema funciona em casa e fora (um assistente inteligente está ao telefone).

A Skillbox recomenda: um curso prático de dois anos, "Sou um desenvolvedor Web PRO" .

Lembramos que: para todos os leitores de "Habr" - um desconto de 10.000 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

Inicialmente, fiquei cético em relação ao gerenciamento da casa com a ajuda de comandos de voz, porque nem todos são reconhecidos pelos assistentes (não apenas pela Siri) corretamente. Mas então isso se tornou um hábito. Como as lâmpadas Hue não possuem um interruptor físico e, no aplicativo, você precisa executar várias ações para controlar a iluminação, chamei a Siri para o trabalho.

Então, eu queria começar a usar meu assistente de voz para controlar outros sistemas em casa, por exemplo, uma TV ou um console. No caso da TV, por exemplo, descobri o Simple IP Control - um método de controlar o meu Sony Bravia enviando comandos pelo TCP.

Personalizar o Siri


No segundo semestre de 2018, a Apple lançou o aplicativo Atalhos para todos os usuários do iOS. Permite automatizar o trabalho com o telefone (ou casa inteligente) sem a necessidade de escrever código.

O aplicativo possui muitos comandos internos. O que lhe falta é a capacidade de usar comandos TCP, embora exista um mecanismo para trabalhar com URLs.

Além disso, você pode escrever seus próprios módulos em Objective-C ou Swift. Decidi não fazer isso, porque no futuro eu posso mudar meu HomePod para outro assistente. Em vez disso, eu queria escrever um aplicativo da web que pudesse responder aos comandos da Siri.

Controle de TV Sony Bravia


Armado com um manual com comandos para minha TV, escrevi um aplicativo no Node.js. Express (Github) , que me ensinou a responder a alguns dos comandos comuns. Comecei ligando e volume.

O comando setPowerStatus faz tudo o que precisamos.



O cabeçalho consiste nos caracteres * es, que são estáticos e são usados ​​para todos os comandos. Em seguida, o terceiro byte (s) é usado para Command. Existem quatro significados que podem manter essa posição. C para Comando (enviando um comando na TV), E para Consulta (verificação do valor atual de um determinado parâmetro, por exemplo, volume), A - Resposta (enviada em resposta a comandos e consultas) e N para Notificar (notificação de evento, como desligar o volume )

Para atingir meu objetivo, tive que estudar a documentação JSON-RPC da Sony . Como se viu, a natureza do JSON-RPC sobre HTTP nos permitiu simplificar a tarefa e reduzir a quantidade de código.

Trabalhar com a API JSON-RPC foi simples. Pegue, por exemplo, o serviço (sistema), o comando (getPowerStatus) mais os parâmetros (verdadeiro ou falso) e forme uma solicitação HTTP, que enviaremos à TV.

let body = JSON.stringify({ method: command, id: ++this.id, params: params, version: "1.0", }); return new Promise((resolve, reject) => { fetch('http://' + this.ip + ':' + this.port + '/sony/' + service, { method: 'post', headers: { 'X-Auth-PSK': this.psk }, body: body, }).then(response => { return response.json(); }).then(response => { if (response.error && (!response.result || response.result.length === 0)) { reject({ code: response.error[0] }); } else { resolve(response.result[0]); } }).catch(error => { reject(error); }); }); 

Por padrão, a autenticação é realizada usando a pré-chave enviada no cabeçalho da solicitação HTTP. Mas há uma maneira mais segura e conveniente de fazer isso com o accessControl. Nesse caso, podemos enviar um comando para a TV e trocar o código com segurança com autenticação HTTP básica. Depois que a autenticação é realizada uma vez, a autenticação adicional é realizada usando um cookie.

Como minha TV está protegida por um firewall configurado no roteador, usei a chave pré-compartilhada.

Ativar o Xbox One


O Xbox, é claro, exigia uma configuração diferente. A Microsoft parece ter decidido não usar a API REST; portanto, o trabalho foi feito usando pacotes UDP.

Felizmente, o Node.js possui um módulo dgram que, pronto para uso, funciona com todos os recursos do USP. Foi o que eu consegui no final.

 turnOn() { let socket = dgram.createSocket('udp4'); let powerPayload = new Buffer('\x00' + String.fromCharCode(this.liveId.length) + this.liveId.toUpperCase() + '\x00'); let powerHeader = Buffer.concat([new Buffer('dd0200', 'hex'), new Buffer(String.fromCharCode(powerPayload.length)), new Buffer('\x00\x00')]); let powerPacket = Buffer.concat([powerHeader, powerPayload]); return this._sendPacket(socket, powerPacket); } _sendPacket(socket, buffer) { return new Promise((resolve, reject) => { socket.send(buffer, 0, buffer.length, Constants.xboxPort, this.ip, function(err) { socket.close(); if (err) { return reject(err); } resolve(); }); }); } 

Para a configuração, usei a lista de dispositivos de identificação, que pode ser encontrada aqui . Se você quiser apenas pegar o código do meu repositório, precisará substituir o ID no arquivo config.json.

Configurar atalhos para o Siri


Para que a Siri possa executar os comandos que acabei de criar, ela precisa de um assistente. Eu o criei a partir do Raspberry Pi, já que a "framboesa" é adequada em todos os aspectos. Para isso, comprei um Pi 3 Modelo B + que suporta Wi-Fi.

Raspbian tem uma interface gráfica para configurar. Conectei o Wi-Fi, desliguei a tela e continuei trabalhando no SSH. Para garantir que o aplicativo Web esteja constantemente ativo, configurei o soquete de ativação de serviço no systemd, para que, se o processo do Node.js. falhar, o sistema possa reiniciá-lo automaticamente.

Na verdade, os atalhos para a Siri foram a etapa mais fácil do trabalho. Esta é uma aplicação intuitiva com suporte a comando de voz nativo. Por padrão, ele já sabia trabalhar com o HomePod, não era necessário configurar nada adicionalmente.



Juntando tudo


Como minha TV é executada no Android, ela suporta aplicativos como Netflix e YouTube. Com isso em mente, criei comandos para iniciar esses serviços. Além disso, adicionei comandos para controlar o volume, o modo de TV, pausar e reproduzir o conteúdo.

Aqui estão exemplos de tudo que eu criei. Também tentei tornar o projeto modular, portanto, adicionar outros modelos de SmartTV não é um problema.

Aqui está um exemplo de módulo que inclui um Xbox, TV e ativa a primeira porta HDMI.

 router.post('/turnOnXboxAndTV', function(req, res, next) { Promise.all([ xbox.turnOn(), tv.turnOn() .then(() => new Promise(resolve => setTimeout(resolve, 2000))) .then(() => tv.setInput(config.scripts.xboxInput)), ]).then(() => { res.sendStatus(200); }).catch((error) => { res.status(500).send(error); }); }); 

E aqui está como tudo funciona na prática.


Infelizmente, a funcionalidade do Siri não é muito boa. O mesmo Alexa da Amazon possui uma gama muito mais extensa de recursos e uma API muito poderosa. Eu acho que, com base no Alexa, você pode criar projetos muito mais sérios.

A Skillbox recomenda:

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


All Articles