Construa seu próprio hub de automação residencial com coisas Android e Kotlin (dispositivos RF ZigBee e 433 MHz)

TJ Segue em 9 de jul · 4 min ler O meu hub de automação residencial de coisas Android, o dongle verde é a TI CC2531

Nós somos mimados pela escolha nos dias de hoje, quando se trata de escolher um sistema de automação residencial. Poderíamos controlar voz com o Alexa ou o Assistente do Google ou escolher ecossistemas bem estabelecidos como o do Phillip's Hue. Todos esses sistemas têm uma coisa em comum: hubs proprietários que atuam como o centro de nossas casas inteligentes. Alguns mais extensíveis do que outros, no entanto, seria bom se pudéssemos construir nossos próprios hubs independentes desses sistemas proprietários e administrá-los como desejarmos.

O Android é um sistema operacional extremamente versátil com APIs para uma gama de tecnologias usadas em IOT de Bluetooth a WiFi, juntamente com o modo de host USB para fazer interface com outros periféricos de forma bastante conveniente, tornando-o um ótimo candidato para construir um hub de automação residencial. Se isso não bastasse, o Android Things é ainda menos rigoroso do que o Android em telefones e tablets, pois evita solicitações de permissão para Bluetooth e USB, concedendo-os implicitamente, mediante solicitação, ao dispositivo em que é executado. Então, vamos começar a cozinhar.

Peças e Suprimentos

  1. Raspberry Pi 3, por favor, não pegue o B +, apenas o B é suportado para Android Things (US $ 35) .
  2. Cartão SD com imagem do Android Things , pelo menos 16 GB (US $ 5)
  3. Transmissor e receptor Rf para módulos RF (US $ 7)
  4. Plugues de parede RF da Etekcity (3 unidades US $ 24)
  5. Texas Instruments Dongle ZigBee CC2531 (US $ 14)
  6. CC Debugger a piscar CC2531 (US $ 15) o oficial da Texas Instruments custa US $ 50, mas você pode encontrar os genéricos como aquele ligado acima por menos. Se você não se importa de saltar mais, eu aconselho a obter o depurador oficial.
  7. Gledopto multicolor ZigBee Bulb (US $ 25) . As lâmpadas Hue também devem funcionar, mas a lâmpada Hue é quase o dobro do preço!

Opcional:

  1. Tela de toque para Raspberry Pi ($ 65)
  2. Caso para Raspberry Pi e tela sensível ao toque (US $ 26)

NOTA: Para usar o protocolo ZigBee, você precisará piscar o CC2531 com o firmware apropriado usando o CC Debugger. As etapas para fazer isso estão disponíveis aqui .

Ligações servidor-cliente

Primeiro, é necessário que os dispositivos do cliente (telefones Android de sua propriedade ou convidados) enviem instruções para o hub. Como este é um sistema de automação residencial, vamos manter as coisas locais; O Android suporta o Network Service Discovery ou o NSD , que é uma maneira fantástica de comunicação em tempo real com dispositivos na mesma rede local. É baseado no DNS-SD, que é como a impressão sem fio funciona em uma LAN. Essencialmente, cada cliente abrirá um soquete no hub e escreverá instruções diretamente para ele, além de receber respostas no mesmo soquete, permitindo a comunicação duplex.

ServerThread gerenciando a comunicação simultânea com vários clientes

Observe que o SocketThread está bloqueado aguardando a conexão de um cliente. No entanto, isso não impede que os clientes gravem de volta no servidor, pois os outros métodos são chamados em seus próprios segmentos separados.

Classe de conexão gerenciando IO entre o servidor e seus clientes

Do lado do cliente, a classe responsável pelo gerenciamento do soquete é o ClientThread .

Observe novamente que o cliente usa um ExecutorService separado para enviar mensagens ao servidor, enquanto o próprio thread principal gerencia o soquete aberto entre ele e o servidor e transmite todas as respostas do servidor usando a classe Broadcaster que é apenas um wrapper em torno de um Rx PublishProcessor .

Tanto o ServerThread quanto o ClientThread são hospedados em instâncias de classes do Android Service para mantê-los em execução em segundo plano.

Como a comunicação será sobre fluxos de entrada e saída brutos, deve haver um método de serialização e desserialização de cada Payload comunicação. Podemos usar uma classe de dados Kotlin simples com o mesmo nome para fazer isso:

Classe de payload simples

Em seguida, precisamos de uma maneira abstrata para o nosso hub se comunicar com qualquer periférico que possa se importar, tanto de forma síncrona para responder diretamente às solicitações do cliente, quanto de forma assíncrona, se um periférico transmitir uma atualização. Sincronicamente, nossa classe de classe de dados Payload anterior funciona, uma Payload entra como entrada, é processada e uma Payload saída é eliminada. Para comandos assíncronos, cada instância de uma classe CommsProtocol possui um PrintWriter qual pode gravar diretamente. É importante que o que está escrito seja uma representação serializada de um Payload , senão o cliente não será capaz de interpretá-lo.

A classe Base para responder ao lado do servidor de solicitações do cliente

Ligações Servidor-Periféricos

Agora que os dados podem ser enviados e recebidos do cliente, as implementações do CommsProtocol podem ser gravadas. Soquetes de parede RF simples e lâmpadas ZigBee atendem às minhas necessidades básicas de automação doméstica por enquanto, e assim foi tudo que implementei, no entanto, o sistema foi projetado para ser extensível para suportar qualquer periférico.

SerialRFPRotocol

Infelizmente, o Android Things é bastante lento , tornando impossível a interface direta com os transceptores de RF e essencialmente duplicando os pacotes enviados por switches sem fio baratos. Um Arduino, no entanto, é perfeito para isso, e é tão fácil quanto adicionar uma dependência serial USB para usar serial sobre USB para se comunicar com um Arduino; e é exatamente isso que esse protocolo faz. Ele envia comandos para o Arduino para farejar switches, e quando o pacote cheira, ele o replica, permitindo que você use seu telefone como um controle remoto universal. O vídeo abaixo é a implementação original que usa BLE em vez de uma conexão serial com fio, que ainda funciona, mas é um pouco mais projetada e planejada. Desde então, mudei para uma conexão direta com fio.

Uma demonstração do RFProtocol, muito útil para o ventilador ao pé da minha cama nas noites quentes de verão

ZigBeeProtocol

Este protocolo cria uma rede ZigBee que os periféricos ZigBee podem unir. Ele novamente usa o Serial over USB para se comunicar com o dongle CC2531 da Texas Instruments que executa sua solução Z-STACK ZigBee 3.0. Todo o trabalho pesado é feito por ZigBee Cluster ZSmartSystems biblioteca . Basicamente, ele conecta seu aplicativo CLI a uma GUI do Android junto com as conveniências para ligar e desligar as lâmpadas. A parte divertida foi escrever as implementações do ZigBeePort para Android. Novamente, ele usa a excelente biblioteca USB Serial for Android para gerenciar comunicações seriais. Um vídeo de sua operação é mostrado abaixo.

Então, essa é uma maneira de construir um hub de automação residencial por pouco menos de US $ 100. Fonte completa segue.

tunjid / Android-Home-Hub

Hub de automação residencial Android com suporte para dispositivos RF ZigBee e 433 MHz – tunjid / Android-Home-Hub

github.com