Smart Home – Luz de Ambiente Inteligente

Este projeto é bem grande, que envolve várias etapas. Pretendo dividí-lo em vários posts diferentes. Este primeiro falará da motivação, pesquisa inicial e primeiros passos. Conforme for postando as outras etapas, irei criando links para todos os posts.

Parte 2: Integrando a luz inteligente com o HomeKit

Smart bedroom

Com a mudança de volta pro Rio de Janeiro e reforma do meu novo quarto, eu pensei em tornar meu cantinho um pouco mais “Smart“. Eu nunca tinha feito algo do tipo, apesar de sempre ler sobre. Só que, mesmo com pouco know-how, o mais importante estava faltando — ideias.

Procurando uma ideia de bancada para armazenar minha tralha (queria ter um “live blog” dos meus video-games, expondo todos na bancada), encontrei uma estante que utilizava fitas LED para criar uma luz interior. Gostei muito da ideia, e pensei:
“E se a cor das luzes mudassem de acordo com o console que eu estou usando?”
E comecei a pesquisar.

Planejamento

Eu tinha um combo de roteador e Smart Hub chamado Securifi Almond+ que comprei em uma viagem aos EUA, mas que até então só havia utilizado a parte de roteador dele (que é até que OK, conseguindo entregar 802.11ac no meu apartamento inteiro quando estava em SP, mas não no do Rio). Agora era a hora perfeita de começar a colocar alguns appliances nele. Para conseguir terminar o meu projeto, eu precisava:

  1. Interligar as fitas LED com o Almond+;
  2. Criar cenas no Almond+ para cada console, com cores distintas;
  3. Enviar pro Almond+ a informação de que certo console foi ligado;
  4. Ativar a cena correta de acordo com o console.

Minha primeira ideia foi ter uma fita LED Smart (como a Hue Lightstrips) que se comunica diretamente com o Almond+. Porém essas fitas LED são super caras, e achá-las no Brasil é um parto. Além disso, comprar lá de fora algo experimental e que precisa de tamanho/conectores bem definidos não me pareceu uma boa ideia. Se eu precisasse de mais fita (ou até mesmo fritasse a fita — eu disse que não tinha muita experiência nessa área), eu gastaria um dinheiro absurdo e ficaria alguns meses esperando eles chegarem. Então abortei esse plano momentaneamente e parti para uma lâmpada RGBW, que é mais barata que um rolo pequeno de fita LED Smart e é “plug and play” com o Almond+ (Sylvania Lightify by Osram).

Com a listinha de compras feita, comecei a pensar na parte mais prática — como eu ia programar isso tudo.

Lá vem o Pi

Li bastante sobre o tema, e acabei tendo uma luz (no pun intended) que reviveu o plano inicial de usar fitas LED. Eu tinha um Raspberry Pi A+ encostado em casa que eu planejava utilizar como uma Plex Box (usando o RasPlex). Pois bem, o Raspberry Pi ia ficar ligado e conectado na TV o dia inteiro (consumo baixíssimo de energia <3), então por quê não deixar ele com a função de controlar as fitas LED? Eu já tinha visto um projeto absurdo que utiliza o Raspberry Pi para simular o Ambilight da Phillips, então sabia que era perfeitamente possível.

Então o meu Pi ficaria preso na TV 24/7, rodando o RasPlex e trocando a cor das fitas LED da mesma forma que o Almond+ trocaria a cor da lâmpada. Show, resta agora saber como (a) o Pi ia saber o console que se conectou; (b) O Almond+ saber qual console se conectou; e (c) coordenar tudo isso. 🙂

TV antiga, problemas de primeiro mundo

Enquanto eu pensava em toda essa parte Smart do quarto, esqueci da parte “dumb” — a TV tem 4 portas HDMI, devidamente ocupadas pela TV a cabo e pelos consoles. Ou seja, se eu ligasse o Pi e a TV a cabo, não conseguiria plugar todos os consoles. Foi aí que baixou um megalomaníaco em mim e comecei a procurar switches HDMI (daqueles que se pluga 500 aparelhos, e só vai um cabo pra TV). Achei esse switch de 5 portas com controle remoto da foto abaixo  e pensei: “E se o Pi captasse o input do controle remoto do HDMI pra saber a entrada que vai ser jogada pra TV, e com uma tabela de-para simples, descobrir o console?” Rá! Eu sou um gênio! #sqn

Comprei esse diodo receptor de infravermelhos e reservei (Até porque nunca precisei dele).

Problemas

O primeiro problema que pensei é que alguns consoles (de cara me veio em mente o PS3), quando ligados, trocam a entrada da TV para a entrada que ele tiver conectado, o que tornaria desnecessário a troca da entrada pelo controle remoto, e o Pi nunca ia saber que a mudança ocorreu. Também tem o problema de fazer o Pi se comunicar com o Almond+. Eu poderia tirar o Pi da jogada e usar uma Fita LED Smart, mas dinheiro não dá em árvore e dessa forma não teria graça nenhuma. Olha o quanto eu já escrevi antes mesmo de por a mão na massa!

Também tem a questão dos consoles antigos. Os consoles que usam outras portas da TV (como a RCA) não tem controle remoto que o Pi possa ler. A solução rápida para esse problema é captar o controle remoto da TV da mesma forma, mas eu não saberia dizer qual console está sendo ligado (precisarei utilizar um Switch RCA igual ao switch HDMI, devido à quantidade de consoles). Esse daí vai ficar pra um projeto futuro.

Pois bem, vamos por partes. Primeiramente, a comunicação entre o Pi e o Almond+.

Se isso então (talvez) aquilo

Tentando colocar a comunicação entre o Pi e o Almond+ em uma forma event-driven, eu teria basicamente dois eventos:

  1. Quando o Pi ler o sinal IR, colocar a cor certa nas fitas LED e avisar ao Almond+ que esse evento ocorreu, para que ele pudesse ativar a cena apropriada;
  2. Quando o Almond+ ativar uma cena, avisar ao Pi para trocar a cor das fitas LED.

Logo de cara, eu pensei no IFTTT (If This Then That), uma plataforma que conecta serviços e permite que um sirva de gatilho para o outro. Através do IFTTT Maker, eu conseguiria tornar o meu Pi mais “conectado”, ativando rotinas conforme uma URL fosse chamada.

Parece bom, mas o IFTTT não permite usar “cena ativada” do Almond+ como condição de ativação de alguma receita. O lado bom é que eu descobri que existe a condição de ativação “dispositivo conectado”, então uma parte dos meus problemas estaria resolvida (os meus consoles que acessam a rede podem ativar esse gatilho, ligando a cena e avisando ao Pi). Eu também vi que o inverso também era possível — Se eu recebesse uma requisição Web enviada pelo Pi, poderia ativar uma cena no Almond+. Ótimo! Mas eu também queria que as fitas LED trocassem de cor se eu ativasse manualmente uma cena.

Pesquisando um pouco mais, me deparei com a API de Web Sockets do Almond+, que me pareceu perfeita! Ela possuía um evento de “cena ativada”, outro de “dispositivo conectado” e me permitia passar comandos como “ativar cena”. Além disso, dessa forma eu trabalharia totalmente na minha rede local, o que é mais rápido e não me torna dependente de ter Internet para ligar a lâmpada da minha casa. O futuro chegou, mas calma lá né.

Agora eu consigo saber que um console ligou, ativar as luzes e… aí eu pego o controle remoto pra colocar na HDMI certa. Ou não?

O poder do HDMI

A magia que o PS3 usa para ligar a TV na HDMI certa se chama HDMI-CEC. Batendo bastante cabeça, descobri que o RasPlex implementa o HDMI-CEC. Se o RasPlex implementa, por quê eu não posso implementar também?
Depois de estudar, descobri que é possível sim controlar a TV através de uma biblioteca chamada libCEC. Com ela, eu posso trocar a porta HDMI da TV (e do Switch, se ele for compatível com o protocolo — o vendedor disse que é!). Só que a biblioteca é bem pouco intuitiva, e essa solução provavelmente vai sair baseado na tentativa e erro. Por isso, deixei para outro momento (e post).

Mãos na massa!

Por um acaso do destino, tanto a lâmpada quanto o Almond+ chegaram ao mesmo tempo. O processo de parear com o Almond+ foi um tanto chato — a lâmpada achava que tinha pareado, mas dava um erro no Almond+ na hora de buscar informações sobre o dispositivo — principalmente pela forma de resetar a lâmpada (desligar por 3 segundos, depois ligar por mais 3, e repetir isso CINCO vezes). Mas depois de algumas tentativas, o Almond+ pareou e me mostrou uma telinha muito bonitinha que me permitia escolher a cor e a intensidade da luz. Bingo!

Um detalhe que me deixou um tanto apreensivo é que a interface (tanto a tela LED do aparelho quanto o aplicativo para iOS) não acertavam muito na hora de trocar a cor da lâmpada. Eu ainda não consegui descobrir a causa, mas parece que é porque a lâmpada calcula sua cor através de fatores RGBW, enquanto os aplicativos enviam para ela valores HSB. Isso seria um problema maior ainda na hora de criar automatizações com a API de websockets do Almond, onde seria necessário fazer a conversão correta na hora de enviar os dados.

No entanto, deixei isso para depois. O meu primeiro dispositivo Smart estava configurado e funcionando! A luz liga e desliga no toque de um botão e, com uma pequena configuração, também liga sempre que o meu celular estiver no Wi-Fi de casa após o pôr do sol. Vitória!

E agora?

Vou terminar esse post por aqui. Focar cada post em um dispositivo será mais produtivo e fácil de digerir do que sair cuspindo informação.

O próximo passo vai ser aumentar a facilidade de uso, integrando com a assistente virtual do iOS e permitindo que eu fale “E aí Siri, liga a luz” e a luz ligue. Isso faz com que eu não dependa mais do aplicativo do Almond e possa usar as automatizações da Apple.