Controlamos el convector y termostato Electrolux desde Home Assistant. Parte 1

Prefacio

Durante aproximadamente 2 años he sido usuario de Home Assistant y gradualmente me he ido adaptando a los dispositivos que quiero integrar allí. Uno de estos dispositivos fue mi adquisición relativamente reciente: un convector de Electrolux.





Inicialmente, consideré un convector convencional, que planeaba controlar a través de un enchufe inteligente. En el proceso de estudiar los modelos de convectores, mi interés se trasladó a los modelos modernos que se pueden controlar a través de Internet de forma inmediata. Aunque son más caras que una solución con un "enchufe", prevaleció la curiosidad y la elección se centró en un convector modular de Electrolux, que, en el contexto de la competencia, atrajo el diseño.





El convector hizo frente a su tarea como dispositivo perfectamente en invierno. Estoy muy satisfecho con eso.





Dolor y primer intento de control fuera de la aplicación.

Pero el control a través de la aplicación móvil solo trajo disgusto.





Conexión larga al servidor, a veces desde la enésima vez. Falta de disponibilidad frecuente del dispositivo y preocupaciones sobre la seguridad. Otro problema fue la falta de soluciones para la integración en hogares inteligentes.





Después de un tiempo, surgió el interés por estudiar la posibilidad de gestionar a través de soluciones de terceros. No fue posible buscar en Google algo sensato para controlar el convector. Por eso, decidí estudiar el tráfico de la aplicación móvil, ya que el dispositivo está lejos y la aplicación siempre está a mano.





Después de estudiar los materiales sobre el análisis del tráfico de aplicaciones y por falta de experiencia, lo único que pude averiguar es qué datos y dónde se transfieren para su autorización, y que la comunicación adicional se realiza a través de TCP en forma encriptada. Y también descubrí cómo se ve una aplicación de Android después de desmontarla)





Ante esto, mis manos cayeron, esperando volver a intentarlo más tarde.





Segunda experiencia

, - . .





, .





2 ,





PHP ( ) Python.





En el proceso, descubrí que cada idioma tiene sus propios matices en las funciones de cifrado. Tuve que escribir soluciones en Java, Python y PHP para asegurarse de que el cifrado / descifrado funciona como se esperaba. Por ejemplo, una aplicación usa PKCS7Padding, mientras que otros lenguajes necesitan PKCS5Padding o escriben su propia implementación.





<?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()
      
      



Así, después de algunas tardes, ya existía un cliente en PHP , que le permitía iniciar sesión y comunicarse vía TCP con el servidor.





En mi opinión, el MVP resultante podría considerarse un éxito. Parte 2





Enlace al repositorio y telegrama








All Articles