Pull to refresh

Управляем конвектором и термостатом Electrolux из Home Assistant. Часть 1

Reading time3 min
Views8.6K

Предисловие

Около 2-х лет я являюсь пользователем Home Assistant и постепенно обживаюсь устройствами, которые хочется туда интегрировать. Одним из таких устройств стало мое относительно недавнее приобретение: конвектор от Electrolux.

Изначально я рассматривал обычный конвектор, которым планировал управлять через умную розетку. В процессе изучения моделей конвекторов, мой интерес сместился на современные модели, которыми можно управлять через интернет из "коробки". Хотя они и стоят дороже решения с "розеткой", любопытство взяло верх и выбор остановился на модульном конвекторе от Electrolux, который на фоне конкурентов приглянулся по дизайну.

Со своей задачей, как устройство, конвектор справился зимой на отлично. Им я очень доволен.

Боль и первая попытка управления вне приложения

А вот управление через мобильное приложение приносило только огорчение.

Долгое подключение к серверу, иногда с N-го раза. Частая недоступность устройства и переживания за безопасность. Еще ложкой дегтя стало отсутствие решений для интеграции в "умные дома".

Через какое-то время проснулся интерес к изучению возможности управления через сторонние решения. Нагуглить что-то толковое для управления конвектором не удалось. Поэтому решил изучить трафик мобильного приложения, так как устройство далеко, а приложение всегда под рукой.

После изучения материалов по анализу траффика приложений и в по причине отсутствия опыта, все, что мне удалось выяснить, это какие данные и куда передаются для авторизации, и что дальнейшее общение происходит по TCP в зашифрованном виде. И еще узнал, как выглядит приложение для андройда после дизассемблинга )

На этом мои руки опустились в надежде позже попытаться еще раз.

Второй опыт

Все изменилось в марте, когда я увидел статью Реверс-инжиниринг протоколов управления конвектором. После ее прочтения появился стимул еще раз попытать счастья и проверить информацию автора.

Так как под рукой у меня только мобильное приложение, то свой интерес я сосредоточил именно на нем.

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

Ссылка на репозиторий и telegram

Tags:
Hubs:
Total votes 10: ↑10 and ↓0+10
Comments6

Articles