Умный Дом Без Пультов, Но С Кубом



Проблема

Умный дом без пультов, но с кубом

Делая ремонт в новой квартире, я вернулся в квартиру, в которой не жил 10 лет, и решил попрактиковаться в дисциплине «Умный дом», чтобы грамотно обустроить новую квартиру.

Техника в этой квартире тоже не самая умная и не самая новая, ведь произведена ~10 лет назад. Больше всего меня беспокоило в квартире обилие инфракрасных пультов дистанционного управления; они заблудились и загрузили мой мозг поисками того, что мне нужно.

До недавнего времени на пультах дистанционного управления было принято иметь огромное количество малоиспользуемых кнопок.

А пульты не эстетичны и не гигиеничны, одни угловатые, другие с закругленными краями, кнопки желтеют, в них накапливаются остатки жизнедеятельности обитателей, на которых формируется «подкнопочный биоценоз».

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



Цель

Для замены кучи пультов хотелось взять современное устройство с приятным дизайном, чтобы разница по сравнению с пультами была очевидна.

Ответной частью контроллера должно быть устройство, способное воспринимать инфракрасные сигналы существующих пультов дистанционного управления.

Быстрый поиск и маркетинг сяоми сделали свое черное дело и мой взгляд упал на универсальный ИК-пульт дистанционного управления Xiaomi и Xiaomi Mi Smart Home Magic Cube, а чтобы эти ребята могли общаться, мне пришлось купить шлюз умного дома Xiaomi 2.

Умный дом без пультов, но с кубом



Приключения

В теории всё казалось просто, вот куб, вот излучатель ИК-сигналов, вот их лидер — гейт ZigBee. Но жизнь, как обычно, богаче.

Уже при подключении все это стало весело, без интернета все это не настроить, все устройства требуют связи с серверами сяоми, к тому же продаваемые устройства производятся для китайского рынка и для их работы в родном Mi Home приложении необходимо установить регион «Китай».

Все бы ничего, но если ваш регион Китай, то использовать китайские сервера, выбора нет. Я не параноик, я не возражаю против того, чтобы КГБ товарища Си Цзиньпина знал, когда и какие инфракрасные сигналы я посылаю на свои колонки и телевизоры.

На практике оказалось, что почти все возможности умных устройств прикованы к серверам и почти ничего не делают без их ведома; сами сервера находятся далеко (в Китае), в итоге отправили 10 сигналов из приложения Mi Home для увеличения громкости динамиков, мне пришлось ждать 5 секунд, прежде чем звук начал увеличиваться, и еще 30 секунд до обработки всех 10 сигналы завершались, а сами сигналы издавались не быстро, а рывками, звук увеличивался на 1, потом ждал еще две секунды, снова ожидание и т.д. Удобство так себе, на своем не пожелаешь враг.

Беда не только из Китая, если не считать тормозов потертыми, так это невозможность прикрепить смарт-куб к управлению звуком.

Куб управляется жестами:

  • Встряхнуть
  • Двигайтесь в самолете
  • Поворот на 90/180 градусов вокруг горизонтальной оси
  • Поворот вокруг вертикальной оси
  • И так далее.



Умный дом без пультов, но с кубом

Все действия являются триггерами — то есть вы совершили действие, пришел сигнал, что оно произошло, но для вращения вокруг вертикальной оси куб также может измерять степень вращения, поэтому жест вращения удобно использовать для управления звуком, повернул на 90 градусов по часовой стрелке - звук увеличился на 10 пунктов, повернул на 45 против часовой стрелки - звук уменьшился на 5 и т.д. В родном приложении нет возможности реализовать такое поведение в связке с инфракрасным излучателем, лучшее, что мог сделать мой комплект, это управлять яркостью светодиодов на гейте ZigBee, это настолько же круто, насколько и бесполезно, да еще и с задержкой в 3 секунды от имени китайских серверов.

Чтобы преодолеть эту возможность, я начал смотреть, как устройства дружат с открытыми проектами типа Home Assistant, оказалось, что да, такая возможность есть, но Xiaomi явно решила ее задушить, спрятав токены для общения с эмиттера и закрытия портов, через которые происходит связь с гейтом ZigBee. Токены безопасности для связи с ИК-излучателем были по совету из Интернета извлечены из журналов на Android-устройстве; для этого мне пришлось установить приложение Mi Home годовой давности, в котором был такой баг.

С сяоми шлюзом было немного сложнее; Пришлось припаять к его UART RX/TX, чтобы открыть порты, через которые Home Assistant общается с ним из консоли.

Сам Home Assistant нужно где-то запустить; Synology DS718+, который я использовал в качестве медиацентра DLNA и торрент-загрузчика, подошел для этой задачи.

Это устройство может запускать контейнеры Docker и легко запускать контейнер с помощью Home Assistant. Home Assistant — классная штука, но в отличие от Mi Home, всю хитрость дома в нем нужно писать вручную в yaml. Освоив DSL, разобравшись в Home Assistant и плюнув на еще один инструмент программирования, не требующий знания языка, нам удалось состряпать костыль необходимой формы.

Код автоматизации:

 - id: volume_up
   alias: Volume up
   trigger:
   - event_data:
       action_type: rotate
       entity_id: binary_sensor.cube_0000000103ec74
     event_type: xiaomi_aqara.cube_action
     platform: event
   condition:
     condition: template
     value_template: "{{ trigger.event.data.action_value > 0 }}"
   action:
   - service_template: "script.bbk_vol_up_{{ (trigger.event.data.action_value / 3) | int }}"
Эта автоматика ловит событие вращения по часовой стрелке и вызывает скрипт, в имя которого подставляется количество сигналов увеличения звука, которые должен послать инфракрасный излучатель.

Как вы наверное догадались, для каждого угла поворота нужен свой скрипт, для их создания была призвана копипаста, и она выдала мне 20 таких скриптов:

 bbk_vol_up_10:
   sequence:
   - data:
       command:
       - bbk_vol_up
       delay_secs: 0.04
       num_repeats: 10
     entity_id: remote.xiaomi_miio_192_168_2_62
     service: remote.send_command
Конфигурация излучателя с перехваченными сигналами с пульта колонки выглядит так:
 remote:
   - platform: xiaomi_miio
     host: 192.168.2.62
     token: 392cbed325e862ffff983c4575b7a6f2
     commands:
       bbk_power:
         command: raw:nE5m0wlk0msxmEsmszmEsm0wAHKaABkAoQAcAL1MZtOQEFmM3ARMCHwCymM2m4ENgXEAioHlgy+AwoL3gvYAh4L0gGGEBYLCAL0BR4CHhU4B+wQ8TCAA
       bbk_vol_up:
         command: raw:nMwmUwlk0mk1mEsms3ADKbABlM5hLJtMAD2ALKazkAdgAymM3AYMBApjNgKTmgGLABuBD4IaAEKA1YJrgyuBDwJvgZeEx4C/geHMZsA4YCDgxoAgwR3hU+A1ICJTCAA=
       bbk_vol_down:
         command: raw:nE5m0wlk0msxmEsmszmEsm0wAHKaABkAoQAcAL1MZtOQEFmM3ARMCHwIfAdQBFZuAQYFfAfuBCoHngveEx4C/gL+Cj4R2ANfLJqAYQUChU3MIAA=
Ура! Звук управляет вращением куба вокруг вертикальной оси, а телевизор и колонки включаются поворотом куба вокруг горизонтальной оси на 90 градусов.

Все управляется с помощью Home Assistant, но я хочу управлять этим и голосом.

Google Assistant подключается к Home Assistant, но не без происшествий.

GA не показывает скрипты в интерфейсе, но показывает переключатели.

К моему телевизору концепция выключателя не применима, так как не было программного способа понять, включен он или выключен.

Однако я нашел на телевизоре разъем для Ethernet-кабеля, но не нашел описания протокола связи по нему, поэтому решил использовать в качестве датчика признак присутствия IP-адреса телевизора в сети; если айпи телевизора есть в сети, то он включается, если нет, то выключается.

Чтобы реализовать такой датчик, мне пришлось написать простой custom_компонент для Home Assistant:

 import logging
 from homeassistant.helpers.entity import Entity
 from pythonping import ping
 
 logger = logging.getLogger(__name__)
 
 def setup_platform(hass, config, add_entities, discovery_info=None):
     entities = []
     for name, ip in config['hosts'].

items(): entities.append(IPSensor(name, ip)) add_entities(entities) class IPSensor(Entity): def __init__(self, name, ip): self._name = name self._ip = ip self._state = None self._is_on = None @property def name(self): return self._name @property def state(self): return self._state @property def state_attributes(self): return {'ip_address': self._ip} @property def device_class(self): return 'connectivity' @property def is_on(self): return self._is_on def update(self): result = ping(self._ip, count=1, timeout=0.1) self._is_on = result.success() self._state = 'on' if result.success() else ‘off'

Затем подключите инфракрасный излучатель к датчику в переключатель следующим образом:
 switch:
   - platform: template
     switches:
       toshiba_tv:
         value_template: "{{ is_state('binary_sensor.toshiba_tv', 'on') }}"
         turn_on:
           service: script.toshiba_power
         turn_off:
           service: script.toshiba_power
И такой переключатель стал отображаться в Google Home и управляться голосом.

P.S. Занятие с умным домом прошло успешно, пошел покупать новые устройства! П.

П.

С.

И почему-то хаб ZigBee теперь освещает коридор.



Был



Умный дом без пультов, но с кубом



Стало



Умный дом без пультов, но с кубом

Теги: #Сделай сам или сделай сам #Умный дом #Управление мультимедиа #iot умный дом Xiaomi Home Assistant
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.