Smart Home – Integrando a luz inteligente com o HomeKit

Este post é a parte 2 sobre o sistema de luzes de ambiente inteligente. Você pode encontrar a parte 1 aqui.

HomeKit – uma possibilidade?

Enquanto fazia a pesquisa para instalar minha luz de ambiente inteligente, me deparei com este post no fórum oficial do meu roteador (Securifi Almond+ 2015) falando sobre a existência de um sistema chamado Homebridge, que chamou imediatamente minha atenção. Se trata de um servidor baseado em NodeJS que simula a API do HomeKit, expondo qualquer tipo de dispositivo que possa ser acessado a partir de um servidor. Como eu disse no primeiro post, o Almond+ expõe uma API de websockets que permite controlar os dispositivos conectados à ele. O Homebridge pode implementar os websockets e fazer as chamadas à API do Almond facilmente, efetivamente tornando qualquer dispositivo que o Almond vê integrado ao HomeKit. Eu “apenas” teria que instalar o homebridge em algum lugar e codificar, do zero, um plugin em uma linguagem que eu não conhecia tão bem assim (Javascript/NodeJS).

Alguns detalhes técnicos

Como o Homebridge precisaria estar rodando 100% do tempo para ser efetivo, não poderia ficar rodando no meu computador. Pensei em alguma forma de instalá-lo no próprio Almond, mas o pobre coitado não tem espaço nem poder de fogo para segurar o Homebridge. Com a ascensão do meu NAS, no entanto, tudo ficou mais fácil. Era só criar uma Jail (se o homebridge suportar FreeBSD) ou uma VM Linux (caso não suporte) e tudo estaria resolvido.

Agora, a parte da codificação. Como “nada se cria, tudo se copia”, comecei a ler o código de alguns outros plugins do Homebridge com um propósito parecido com o meu, como o plugin para o Samsung SmartThings e para o Belkin Wemo. Enquanto fazia meu dever de casa, um anjo comentou em um outro post (o famoso “up“) do fórum da Securifi de alguém que já havia feito o trabalho sujo por mim! Dando uma olhada no repositório dele, vi que havia inclusive alguns
forks
mais atualizados do que o do post.

Com o código em mãos, é hora de por a mão na massa.

Instalação do Homebridge e dos plugins

O primeiro passo é criar uma Jail e instalar o Homebridge nela, algo relativamente fácil de se fazer devido ao passo a passo já disponibilizado pela equipe do Homebridge. É apenas criar uma Jail, lembrando de dar a ela um IP estático, marcar o início com o boot do NAS e ligá-la.

O próximo passo é instalar os pacotes necessários. Para isso, iremos acessar o FreeNAS via ssh, e verificaremos o número da Jail. Com esse número em nossa posse, fica bem fácil acessá-la (lembre-se de alterar “freenas” para o IP do seu):

gabriel@Gabriel-PC:~$ ssh freenas
gabriel@freenas's password:
freenas% jls
   JID  IP Address   Hostname              Path
     2               homebridge            /mnt/storage/iocage/jails/homebridge/root

freenas% sudo jexec 2 csh
Password:
root@homebridge:/ #

Dentro da Jail, podemos atualizar o ambiente e instalar as dependências do Homebridge:

pkg update && pkg upgrade
pkg install -y node npm dbus avahi-libdns gcc
sysrc dbus_enable="YES"
sysrc avahi_daemon_enable="YES"
ln -s /usr/local/include/avahi-compat-libdns_sd/dns_sd.h /usr/include/dns_sd.h
service dbus start
service avahi-daemon start

Com o NPM, fica bem fácil instalar o homebridge e o plugin para o Almond:

npm install -g --unsafe-perm homebridge
mkdir ~/.homebridge
cp /usr/local/lib/node_modules/homebridge/config-sample.json ~/.homebridge/config.json
npm install -g homebridge-almond

Com isso, já temos tudo instalado, mas nada configurado. Para tal, vamos ter que abrir o ee ou (a minha preferência) o “temido” vi. Para isso, abra o arquivo de configurações que copiamos no passo anterior:

vi ~/.homebridge/config.json
OU
ee ~/.homebridge/config.json

Nesse arquivo, já haverão alguns acessórios pré-configurados, além da configuração padrão do Homebridge. De início, devemos confirmar na linha 4 se o endereço MAC ali já é o endereço MAC da Jail. No meu caso, já estava correto.

O próximo passo é apagar tudo que está abaixo da linha 11 (“description“). São linhas de exemplo, mas nós já temos a configuração do nosso Almond na página do projeto, então é só ajustar e colar abaixo da linha 10:

   "platforms": [
       {
           "platform": "Almond",
           "name": "Almond Platform",
           "host":"<IP DO ALMOND>",
           "port": "7681",
           "username": "root",
           "password": "<SENHA DO ALMOND>"
       }
   ]

Com isso feito, não devemos ter problema nenhum ao iniciar o Homebridge:

root@homebridge:/ # homebridge

Se tudo der certo, um código QR aparecerá, que deverá ser lido no aplicativo Casa do iPhone, clicando no ícone de + no canto superior esquerdo. Ao adicionar o Homebridge como um acessório, os dispositivos devem aparecer no aplicativo Casa, efetivamente tornando-os compatíveis com o Homekit e a Siri!

Agora que verificamos que tudo está funcionando, vamos configurá-lo para iniciar junto da Jail, e deixá-lo em plano de fundo:

npm install -g pm2
pm2 startup rcd
sysrc pm2_enable="YES"
pm2 start homebridge -- -D
pm2 save

Com isso, podemos fechar nossa sessão ssh sem derrubar o Homebridge, e agora nós temos um servidor que faz a ponte entre o Almond (e diversos outros dispositivos) e o Homekit!

Aproveitei a oportunidade e instalei também um plugin de integração com o Plex que simula um sensor de movimento quando o Plex começa a tocar algo. Com isso, eu posso fazer algumas automações bem legais, como “Quando começar um filme, desligar as luzes”. Muito bom!

Mas nem tudo são flores…

Como o Almond foi um projeto do Kickstarter, eu estava ciente que ele possivelmente não seria o produto com o maior suporte do mundo (a última atualização dele foi em Março, por exemplo). Isso me traz alguns medos, principalmente no quesito segurança, mas outra consequência disso é a comunidade relativamente pequena. Por causa disso, o plugin do Almond só suporta interruptores de luz binários (ligado/desligado), além de não ser muito responsivo. Funciona, mas as vezes o Homekit acusa um estado diferente (ligado quando não está, por exemplo) e ele demora para sincronizar novamente. É de se esperar, quando não temos suporte (n)ativo, mas de qualquer forma, estou bem feliz com o resultado. Posso ligar as luzes com a minha voz e programar rotinas para ligá-las quando chegar em casa, por exemplo.

Eu até pretendia fazer um fork do projeto e tentar melhorar a estabilidade, mas com esse problema das atualizações, muito provavelmente seria um trabalho em vão, já que o Almond atualmente é uma bomba relógio esperando alguma vulnerabilidade aparecer para ser desligado.

Outro passo futuro é arrumar mais uma lâmpada e fazer a integração entre elas. O meu ventilador tem duas entradas para lâmpadas, então gostaria de poder controlá-las separadamente e também ao mesmo tempo, em um único interruptor virtual. Isso me dará mais iluminação quando precisar, mas também me permitirá controlar o nível de iluminação (via o app do Almond) de “duas lâmpadas no máximo” até “uma lâmpada só, com 1% de intensidade”.