Nós controlamos o convector Electrolux e o termostato do Home Assistant. Parte 1

Prefácio

Há cerca de 2 anos sou usuário do Home Assistant e gradualmente me adaptei aos dispositivos que desejo integrar lá. Um desses dispositivos foi minha aquisição relativamente recente: um convetor da Electrolux.





Inicialmente, considerei um convector convencional, que planejava controlar por meio de um soquete inteligente. No processo de estudar modelos de convetores, meu interesse mudou para modelos modernos que podem ser controlados via Internet fora da caixa. Embora sejam mais caros do que uma solução com “soquete”, a curiosidade prevaleceu e a escolha recaiu sobre um convetor modular da Electrolux, que, no contexto dos concorrentes, atraiu o design.





O convector cumpriu perfeitamente sua tarefa de dispositivo no inverno. Eu estou muito satisfeito com isso.





Dor e primeira tentativa de controle fora do aplicativo

Mas o controle pelo aplicativo móvel só trouxe desgosto.





Longa conexão com o servidor, às vezes desde a enésima vez. Frequente indisponibilidade do dispositivo e preocupações com a segurança. Outra mosca na sopa foi a falta de soluções para integração em casas inteligentes.





Depois de algum tempo, surgiu o interesse em estudar a possibilidade de gerenciar por meio de soluções de terceiros. Não foi possível pesquisar no google algo sensato para controlar o convetor. Por isso, resolvi estudar o tráfego do aplicativo mobile, já que o aparelho está longe, e o aplicativo está sempre à mão.





Depois de estudar os materiais sobre a análise de tráfego de aplicativos e por falta de experiência, tudo que consegui descobrir é quais dados e para onde são transferidos para autorização, e que a comunicação posterior ocorre via TCP de forma criptografada. E também descobri como é a aparência de um aplicativo Android após a desmontagem)





Com isso, minhas mãos caíram, esperando tentar novamente mais tarde.





Segunda experiencia

, - . .





, .





2 ,





PHP ( ) Python.





No processo, descobri que cada idioma tem suas próprias nuances nas funções de criptografia. Tive que escrever soluções em Java, Python e PHP para garantir que a criptografia / descriptografia funcionasse conforme o esperado. Por exemplo, um aplicativo usa PKCS7Padding, enquanto outras linguagens precisam de PKCS5Padding ou escrevem sua própria implementação.





<?php
// ...
public function decrypt(string $message): string
{
  $hash = hash('sha384', $this->key, true);

  $iv = substr($hash, 32, 16);
  $key = substr($hash, 0, 32);

  $message = substr($message, 0, -32);

  $result = (string) openssl_decrypt(
    (string) base64_decode($message, true),
    'AES-256-CBC',
    $key,
    OPENSSL_CIPHER_AES_256_CBC,
    $iv
  );

  return CleanHelper::clean($result);
}
      
      



def decode(message, key):
    digest = hashlib.sha384(key.encode()).digest()
    iv = digest[-16:]
    key = digest[:32]

    message = message[:-32]
    message = b64decode(message)
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
    decryptor = cipher.decryptor()
    decrypted = decryptor.update(message) + decryptor.finalize()

    unpadder = padding.PKCS7(128).unpadder()
    decrypted = unpadder.update(decrypted) + unpadder.finalize()

    return decrypted.decode()
      
      



Assim, depois de algumas noites, já existia um cliente em PHP , que permitia fazer o login e se comunicar via TCP com o servidor.





Na minha opinião, o MVP resultante pode ser considerado um sucesso. Parte 2





Link para o repositório e telegrama








All Articles