HomeAssistantからElectrolux対流式放熱器とサーモスタットを制御します。パート1

序文

私は約2年間、Home Assistantのユーザーであり、そこに統合したいデバイスに徐々に慣れてきました。これらのデバイスの1つは、私の比較的最近の買収でした。Electroluxからの対流式放熱器です。





最初は、スマートソケットを介して制御することを計画していた従来の対流式放熱器を検討しました。対流式放熱器モデルを研究する過程で、私の興味は、箱から出してインターネットを介して制御できる最新のモデルに移りました。それらは「ソケット」を備えたソリューションよりも高価ですが、好奇心が優勢になり、競合他社の背景に反して設計を引き付けたエレクトロラックスのモジュラー対流式放熱器が選択されました。





対流式放熱器は、冬のデバイスとしてのタスクに完全に対処しました。とても満足しています。





アプリケーション外での痛みと最初の制御の試み

しかし、モバイルアプリケーションを介した制御は、悔しさをもたらしただけでした。





サーバーへの長い接続、場合によってはN回目から。デバイスが頻繁に使用できないことと安全性に関する懸念。軟膏のもう1つの問題は、スマートホームに統合するためのソリューションが不足していることでした。





しばらくして、サードパーティのソリューションを介して管理する可能性を研究することに関心が高まりました。対流式放熱器を制御するために賢明な何かをグーグルで検索することはできませんでした。そのため、デバイスが遠くにあり、アプリケーションが常に手元にあるため、モバイルアプリケーションのトラフィックを調査することにしました。





アプリケーションのトラフィックの分析に関する資料を調べた後、経験が不足しているため、承認のためにどのデータと場所が転送され、暗号化された形式でTCPを介してさらに通信が行われるかを知ることができました。また、分解した後のAndroidアプリケーションの外観もわかりました)





これで私の手は落ち、後でもう一度やり直したいと思っていました。





2回目の体験

, - . .





, .





2 ,





PHP ( ) Python.





その過程で、暗号化機能には言語ごとに微妙な違いがあることがわかりました。暗号化/復号化が期待どおりに機能することを確認するために、Java、Python、およびPHPでソリューションを作成する必要がありました。たとえば、アプリケーションはPKCS7Paddingを使用しますが、他の言語ではPKCS5Paddingが必要であるか、独自の実装を作成します。





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



したがって、数晩後、PHPにはすでにクライアントがあり、ログインしてTCP経由でサーバーと通信できるようになりました。





私の意見では、結果として得られたMVPは成功と見なすことができます。パート2





リポジトリ電報へのリンク








All Articles