2018/09/30

Home Assistant e gateway da Xiaomi - uma novela de tecnologia

O nosso Luis Costa tem tentado adicionar um pouco mais de inteligência à sua casa, mas o processo tem-se revelado uma autêntica aventura... que nos faz repensar o nosso amor pela tecnologia. :)


A automação sempre foi um dos meus assuntos predilectos, mas a falta de conhecimentos na área da electricidade e electrónica, acabaram por me ir mantendo afastado do tema. De vez em quando, ainda faço umas brincadeiras, aproveitando as soluções que nos permitem implementar uma ideia, sem que para isso tenhamos de ser experts na matéria. A última acabou com a placa do portão da garagem queimada...

Depois de um Sonoff num candeeiro de pé (uma tomada Sonoff, foi só ligar a ficha do candeeiro à mesma), resolvi substituir um interruptor de parede e no seu lugar instalei um interruptor Sonoff. Neste caso, já tive de andar a ligar fios e claro que a coisa tinha de ser mais complicada que o habitual, pois a lâmpada do tecto é controlada por dois interruptores. A primeira aventura foi descobrir que me tinha enganado na fase (o Sonoff de parede tem mesmo de ter fase mais neutro, ao contrário de alguns que podem funcionar apenas só com a fase). Fase era o azul, pensava eu. Lá perdi uns bons minutos a ligar e desligar tudo, até ter a brilhante ideia de utilizar o busca-pólos e descobrir que estava errado (poderia ter começado logo por testar isso!)

Depois destas aventuras, lá ficou o interruptor de parede Sonoff a funcionar (o outro interruptor de parede tem de estar ligado para este funcionar, desta forma tenho maior controlo e posso voltar sempre à solução inicial). Com a tomada Sonoff e o Google Home, passei a poder controlar as duas lâmpadas a partir do sofá, com o conforto e comodidade que o comando de voz permite (e agora já possível dar o comando de ligar uma lâmpada e desligar a outra num só comando).

Andei algum tempo a seguir as notícias que o Carlos ia publicando acerca do Home Assistant e dos sensores da Xiaomi. Quando tive tempo e paciência, lá encomendei os sensores e a gateway. Entretanto, peguei num Raspberry Pi que tinha encostado e instalei o Hassbian. Foi um processo bastante simples de executar, ideal para quem não domina estes assuntos.


Como tinha aqui dois mini PC Cenovo, optei por utilizar um dele para instalar o Home Assistant numa máquina com maior poder de processamento. Leituras feitas, fica-se a saber que o Windows não permite uma compatibilidade total com o HA. O Windows Subsystem for Linux seria aparentemente uma solução, mas como estes mini PC só têm o Windows Home, não temos acesso a esta funcionalidade.


Recorrer ao Linux parecia ser a única opção, pelo que resolvi testar o procedimento no segundo PC, que está semi-avariado (desliga-se sozinho ao fim de algum tempo - o problema está reportado e aparentemente é falha de algumas unidades, não tendo solução). Embora estes PCs tenham um CPU 64bits só permitem utilizar um bootloader de 32-bit, pelo que tem de se recorrer a um ISO modificado. Já tinha lido sobre isto em tempos e verifiquei que actualmente já existe uma solução "automatizada" para alterar o bootloader que vem no ISO, pelo que tinha a vida facilitada. Errado! Se pode ser complicado, para quê facilitar!

O developer Linuxium disponibilizou um script que permite alterar o bootloader, mas este só funciona em Linux e necessita de 10GB de espaço livre, o que se revelou em grande problema. Utilizando o script via linha de comandos, é possível indicar outra drive para servir de armazenamento temporário, por isso optei por correr o script no Subsystem for Linux do meu portátil. Correr corria, mas não conseguir descobrir o parâmetro que permite alterar o bootloader no novo ISO. Desisti e fui ligar o PC, arrancando no Ubuntu. Faço o download do ISO e do script, vou para executar e... pimba: não tinha 10GB livres, não podia utilizar interface, pelo que não resolvi o problema.

Toca a sacar umas ISO do Ubuntu para correr no VMWare Player. Claro que nem isto podia correr bem à primeira. O ISO que saquei do OsBoxes não corre no VMware, conclusão obtida depois de experimentar 3 ou 4 versões diferentes que estão disponíveis no site...

Lá consegui descobrir no Momo Trade uma uma imagem do Lubuntu que funciona no VMware Player. Não faço ideia se é segura, mas como só queria utilizar o scritpt, corri o risco. A imagem não vem com 10GB de espaço livre, pelo que tive de manualmente aumentar o espaço em disco. Depois de satisfeitos todos os requisitos foi tempo de correr o script e... novo erro! Felizmente o sistema informa qual o pacote que temos de instalar para poder ter a interface gráfica. Instalado o mesmo, foi "só" correr o script e - finalmente! - fiquei com a ISO pronta.

Tratei de utilizar o LinuxLive USB Creator a que tantas vezes já recorri. Entre uma pen USB que decidiu morrer (nem com diskpart lá fui) e o facto de o LiLi não produzir uma pen capaz de arrancar esta ISO, lá foram mais uns bons minutos ao ar. A solução passou por utilizar o RuFus e finalmente fiquei com uma pen com o bootloader 32-bits.

Depois de desligar o secure boot na BIOS do mini PC Cenovo, procedi à instalação. Como seria de esperar, o azar voltou a bater à porta, com o PC a desligar-se definitivamente a meio da instalação; o que me levantou um problema adicional. A outra box tinha Android 4.4 e Windows 10 a correr, mas já sabia que se apagasse esta instalação iria perder a licença do Windows. Os "espertos" da Cenovo fornecem a máquina com um Windows pirateado. Algo que descobri ao fazer uma limpeza à outra unidade "avariada"e instalei a imagem de fábrica da Cenovo que vem com Windows 8. Ao tentar fazer o update para o Windows 10 fiquei a saber que era uma versão pirata, facto confirmado pelo suporte telefónico da Microsoft. Fica o aviso.

Bem, tudo o que poderia correr mal corre mal, não é verdade? Siga a banda, boot da pen na outra box Cenovo e instalação do Lubuntu. Desta vez, tudo correu bem e muito rapidamente. Surpreendente, diga-se, mas muito apreciado considerando tudo pelo que já tinha passado.

O passo seguinte era instalar o Home Assistant. Resolvi fazer a instalação remotamente, mas o Lubuntu não tinha o acesso SSH a funcionar. Mas porque raio é que alguém se lembrou de desactivar o SSH no Lubuntu? Mas nada que um salto ao gestor de pacotes não resolvesse. Seguindo as instruções correu tudo bem... ou quase. A instalação foi sem espinhas, mas configurar o arranque automático (iniciar e parar manualmente funcionava - aliás, têm mesmo de o fazer manualmente a primeira vez, para que a configuração inicial seja criada) foi uma dor de cabeça, pois o código em baixo dava erro:

 PYTHON VIRTUAL ENVIRONMENT  
 If you’ve setup Home Assistant in virtualenv following our Python installation guide or manual installation guide for Raspberry Pi, the following template should work for you. If Home Assistant install is not located at /srv/homeassistant, please modify the ExecStart= line appropriately.  
 [Unit]  
 Description=Home Assistant  
 After=network-online.target  
 [Service]  
 Type=simple  
 User=%i  
 ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"  
 [Install]  
 WantedBy=multi-user.target  

Depois de muito "Goole Fu", lá descobri que a parte a bold era a origem do problema. Eliminado este segmento, o HA passou a correr automaticamente no arranque.

Chegava finalmente a hora de configurar os diferentes elementos no HA. O Google Home e o Home Mini foram apresentados automaticamente, mas o Gateway da Xiaomi aparecia com uma mensagem de erro. Novamente muito Google Fu, para chegar à conclusão que tinha de activar o "modo developer" na gateway e saber qual a sua chave.


 xiaomi_aqara:  
  discovery_retry: 5  
  gateways:  
   - host: 192.168.XXX.XXX 
    mac: XX:ce:XX:XX:XX:XX  
    key: uxuXXXXXXXXXhdfvx  

Posto isto, bastava adicionar parte deste código à configuração. Na pior das hipóteses, com o IP e o MAC address, ficaria a funcionar. Lá está - ficaria - pois no meu caso, esta configuração deu sempre erro. Mais uma dose de Google Fu, assistida pelo grupo do AadM, e fico a saber que havia mais pessoas com o mesmo problema. Aparentemente, seria o Multicast no router a solução para a coisa a funcionar.

Tentei no TP LINK Archer AC3150 que estou a testar mas não adiantou de nada, as alterações não surtiram resultado. Optei por tentar num TP LINK com ddwrt, na mesma rede, em rede diferente, e sei lá mais o quê. Até com um powerline WiFi Devolo eu tentei. De nada serviu, o HA continuava a não aceitar a configuração do gateway. Horas perdidas nisto e resultado zero!

Por fim lá me lembrei que tinha o RPi com o Hassbian. Liguei o mesmo e tratei de fazer reset ao gateway, que entretanto já estava configurado numa das redes alternativas que testei. Mais uma vez, tinha de correr mal. Tentei vezes sem fim até que desisti, a app da Xiaomi pura e simplesmente recusava-se a configurar o gateway, dava sempre timeout. Aqui imperou a experiência, ficou paradinha a repousar e quando me fui deitar, voltei a tentar adicionar a gateway à app da Xiaomi. A táctica resultou, ou quase, pois embora a gateway já estivesse disponível na app da Xiaomi, dava sempre timeout ao aceder à sua configuração. "Amanhã de manhã já dá" - pensei eu - e lá fui dormir.

Na manhã seguinte corri novamente a app da Xiaomi e - magia! - já deixava aceder às configurações do gateway e nem foi preciso configurar nada, o "developer mode" estava a activado e a chave de segurança não tinha sido alterada.

Posto isto, foi tempo de aceder ao RPi via SSH, e descobrir como alterar a configuração no Hassbian (não é directo como no Home Assistant).

 sudo su -s /bin/bash homeassistant  
 cd /home/homeassistant/.homeassistant  
 vi configuration.yaml  

Adicionei exactamente a mesma configuração que testei o código no Home Assistant e, surpresa, não deu erro!!! Depois de testar as várias opções para carregar a nova configuração, lá percebi que tinha mesmo de reiniciar o HA.


 sudo systemctl restart home-assistant@homeassistant.service

Na verdade, não é bem assim. Como tenho um serviço para iniciar o HA no arranque, também é possível utilizar o comando restart. Temos é de ter alguma paciência no caso do RPi, pois este é lentinho (e o que estou a utilizar é o de 1ª geração!) Alguns bons segundos depois e algum stress (o RPi é bastante mais lento que o mini PC com CPU Atom) eis que o gateway ficou disponível e a funcionar!

Resumindo: o Hassbian com HA 0.54 não tem problemas com a gateway. O HA 0.62 e 0.62.1 não estão, pelo menos no meu caso, a permitir adicionar a gateway da Xiaomi.

Como não estava ainda satisfeito, fiz downgrade do HA no mini PC Cenovo, instalando a mesma versão 0.54 que estava a funcionar no RPi. Ao contrário do que esperava, não resolveu o problema. Fiz update para a 0.62.1 e ficou ainda pior, já nem o HA arrancava. Resolvi apagar a instalação e instalar o HA de raiz.

Terminada a instalação, utilizei a mesma configuração da gateway que anteriormente não funcionava e fiz restart ao serviço. Surpresa das surpresas, a gateway da Xiaomi já era correctamente reconhecida no HA! E isto SEM MUDAR NADA NAS CONFIGURAÇÕES! É verdadeiramente de meter os meus (poucos) cabelos em pé!

Finalmente tinha tudo a funcionar para iniciar as configurações, pensava eu. Claro que não poderia ser assim. Deixei o PC a funcionar... no dia seguinte continuava tudo OK, mas quando voltei a ligar-me por SSH, nada. Mau, pensei eu, será que...? Pois é, este segundo mini PC Cenovo ficou com o mesmo problema do primeiro, desligando-se sem se saber porquê. Já vi todas as configurações no Lubuntu, na BIOS e não descobri o motivo. De um dia para o outro, fica a funcionar bem, depois, aleatoriamente, desliga-se. Resumindo, depois de tantas horas perdidas, voltei à casa de partida... salva-se o RPi que continua a funcionar.


Lições aprendidas, depois de inúmeras horas a bater com a cabeça nas paredes:
  • Se uma solução não funciona, não vale a pena continuar a insistir vezes sem conta;
  • Parar para pensar e explorar outras opções;
  • Ir dormir e deixar para o dia seguinte é sempre uma boa opção.

A dificuldade está em ter a capacidade e discernimento para saber quando parar. Não é fácil, mas com a idade e muitas horas perdidas, vamos aprendendo a melhorar este aspecto.

4 comentários:

  1. E sinceramente vamos la ver se não vai ter problemas com RPi! A base de dados pode atingir o limite do cartão e RPi tem o problema do numero de escritas.

    O que vejo foi falta leitura e/ou pesquisa no forum/net, pra mim quando li "instalar o Home Assistant numa máquina com maior poder de processamento" e ainda por cima windows foi o suficiente. O processo de instalação e configuração esta lá todo explicado não vale a pena inventar o roda :)

    A minha experiencia levou me a abandonar o ARM por X64 e o Python virtualenv pelo Docker.

    Espero que o Luis continue com o projecto dele e não desista

    ResponderEliminar
  2. Luís,
    Na próxima, pega num PC a sério, haà coisas que tal justificam ;-)
    instala o Ubuntu (latest LTS) e 2h depois está a funcionar,
    sem saber muito de Linux, comigo foi assim...

    ... mas bela história :-) !

    ResponderEliminar
  3. Tiveste azar, por acaso passei de RPi3 para um NUC e correu às mil maravilhas, Ubuntu 18, testei ambas as versões, Hass.io e Hassbian em Python Virtual Env, fiquei pela última pela flexibilidade (como já tinha no RPi). Do Hass.io tirei apenas ideias, módulos que dão jeito, InfluxDB, Grafana, Node-RED e pouco mais. Maioria dos equipamentos são Sonoff com firmware ESPurna à excepção do Bridge RF que tem o Tasmota para ligar alguns equipamentos que ainda estão por RF 433.
    Agora é perder um bocado de tempo a migrar as automações para Node-RED, já se começa a tornar complicado colocar todo o tipo de regras em YAML.

    ResponderEliminar
  4. De referir que entretanto já instalei o Hass.io via Docker e ficou a bombar. Naturalmente que não podia correr tudo bem. O mosquitto não vai lá de forma nenhuma.

    Resultado, Hass.io a funcionar numa box Win/Droid (reconvertida para Elementary OS) com Intel Atom X5-Z8350 e o mosquitto está na instalação do RPi. Isto até ter tempo de voltar a testar (já passaram uns 2 ou 3 meses lol)

    ResponderEliminar