Nous contrôlons le convecteur et le thermostat Electrolux de Home Assistant. Partie 1

Avant-propos

Depuis environ 2 ans, j'utilise Home Assistant et je me suis progressivement installé avec les appareils que je souhaite y intégrer. L'un de ces appareils était mon acquisition relativement récente: un convecteur d'Electrolux.





Au départ, j'ai envisagé un convecteur conventionnel, que je prévoyais de contrôler via une prise intelligente. Dans le processus d'étude des modèles de convecteurs, mon intérêt s'est déplacé vers les modèles modernes qui peuvent être contrôlés via Internet en sortie de boîte. Bien qu'elles soient plus chères qu'une solution avec une "prise", la curiosité a prévalu et le choix s'est porté sur un convecteur modulaire d'Electrolux, qui, sur fond de concurrents, a séduit le design.





Le convecteur s'acquittait parfaitement de sa tâche en tant qu'appareil en hiver. J'en suis vraiment satisfaite.





Douleur et première tentative de contrôle en dehors de l'application

Mais le contrôle via l'application mobile n'a fait qu'apporter du chagrin.





Longue connexion au serveur, parfois à partir de la Nième fois. Indisponibilité fréquente de l'appareil et problèmes de sécurité. Une autre mouche dans la pommade était le manque de solutions d'intégration dans les maisons intelligentes.





Après un certain temps, un intérêt s'est manifesté pour étudier la possibilité de gérer via des solutions tierces. Il n'était pas possible de rechercher quelque chose de sensé sur Google pour contrôler le convecteur. Par conséquent, j'ai décidé d'étudier le trafic de l'application mobile, car l'appareil est loin et l'application est toujours à portée de main.





Après avoir étudié les documents sur l'analyse du trafic des applications et en raison du manque d'expérience, tout ce que j'ai pu savoir, c'est quelles données et où sont transférées pour autorisation, et que la communication ultérieure a lieu via TCP sous forme cryptée. Et j'ai aussi découvert à quoi ressemble une application Android après le démontage)





Sur ce, mes mains tombèrent, espérant réessayer plus tard.





Deuxième expérience

, - . .





, .





2 ,





PHP ( ) Python.





Au cours du processus, j'ai découvert que chaque langue avait ses propres nuances dans les fonctions de cryptage. J'ai dû écrire des solutions en Java, Python et PHP pour s'assurer que le cryptage / décryptage fonctionne comme prévu. Par exemple, une application utilise PKCS7Padding, tandis que d'autres langages ont besoin de PKCS5Padding ou écrivent votre propre implémentation.





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



Ainsi, au bout de quelques soirées, il y avait déjà un client en PHP , qui vous permettait de vous connecter et de communiquer via TCP avec le serveur.





À mon avis, le MVP résultant pourrait être considéré comme un succès. Partie 2





Lien vers le référentiel et le télégramme








All Articles