53. Замена и/к пультам управления.


В современном доме находится много устройств разных типов и назначения. В том числе и устройства контролируемые с помощью пультов управления. Большинство таких пультов работают в инфра-красном (и/к) диапазоне. В этой статье рассмотрим подробнее работу таких пультов и то, чем и как их можно заменить в системе управления умным домом.

Для начала разберём как работает такой пульт.

Теория.

При нажатии на любую кнопку на пульте, через "глазок" передатчика отправляется световой сигнал. На отправку сигнала отведён определённый временной промежуток. За этот промежуток времени глазок отправляет уникальную серию данных, которые являются командой, или кодом сообщения. Примерно по аналогии с сигнальным прожектором используемом на флоте, с помощью которого передают сигналы в виде азбуки Морзе.


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

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

С другой стороны, отсутстствие стандартизации в плане "языка" общения между устройствами, даёт полную свободу действий производителям устройств, и они могут делать что и как хотят, в рамках дозволенного конечно. Как правило, есть ограничение на частоту с которой передаётся сигнал (38 КилоГерц).

Итак, общение между пультом и приёмником происходит одним из самых быстрых способов - со скоростью света. Однако, у этого способа есть и минус - свет не может огибать препятствия, и поэтому необходима прямая видимость между приёмником и передатчиком.

Ещё один важный момент, который стоит знать о пультах и кодах команд отправляемых ими. Лучше объяснить его на примере:

  1. Пульт от кондиционера посылает команду на включение. Назовём её А.
  2. Кондиционер включился на последний установленный на нём и на пульте режим - пусть это будет охлаждение, 25 градусов, слабый обдув.
  3. Нажимаем на кнопку убавления на 1 градус. Пульт остаётся в этом режиме, с новыми данными - охлаждение, 24 градуса, слабый обдув.
  4. Выключаем кондиционер.
  5. При повторном включении, на него будет отправлена новая команда. Назовём её Б. Она будет содержать в себе данные соответствующие новым (текущим) значениям на пульте.

Т.е. существует 2 типа отправки команд.
1. когда в каждой команде указаны все режимы работы + изменения, которые необходимо сделать (как например в пункте 3 выше). Комплексный режим.
2. когда в команде указаны только те изменения, которые необходимо сделать: сменить режим, увеличить или уменьшить обдув, поднять или опустить температуру, и т.д. Раздельный режим.

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

На этом теоретическую часть можно закончить и перейти к практической.

Пульты для умного дома.

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

По типу связи с основной системой:
  • Zigbee.
  • Wi-Fi.
  • Bluetooth.
  • Провод. 
По типу питания:
  • На батарейках.
  • От постоянного источника.
По дополнительным опциям:
  • Совмещён с радио приёмопередатчиком.
  • Совмещён с датчиками температуры и/или влажности. 
Все эти 8 параметров могут смешиваться и пересекаться, поэтому каждый может позволить себе выбрать устройство по вкусу и потребностям. Стоит только помнить что Wi-Fi это достаточно энергоёмкий протокол связи, и брать устройство работающее от батареек для него не будет самым грамотным решением. Если только не использовать эмулятор батареек.
Так же нет смысла брать устройство с радиопередатчиком, если в доме нет и не планируется использование устройств с этим каналом управления.
Устройства работающие на протоколе Zigbee, могут работать и от батареек, в силу энергоэффективности этого протокола. Плюс, передача команды от такого устройства на телевизор или кондиционер тратит заряд совсем мизерно. 
Кстати, в описании многих пультов продавцы любят указывать что устройство "знает" 4000 брендов производетелей или 50000 кодов. На самом деле, коды "знает" облако службы к которому подключается приложение на смартфоне. 

Дальнейшие действия будут основаны на работе с пультом Broadlink RM4 MINI HTS2.
Чуть позже станет ясно почему выбран именно этот пульт.
Указанные в названии буквы HTS означают Humidity Temperature Sensor. Для питания этой модели используется провод с подключением USB. Однако на самом кабеле так же находится датчик температуры и влажности. Само устройство управляется через Wi-Fi.

Так же есть и зигби пульт работающий от провода, но без встроенных датчиков температуры и влажности. Говорят что он так же выполняет роль репитера. Устройство не было проверено автором. Tuya Zigbee Smart ZS06 Universal IR Remote Control.

Настройка в Home Assistant.

В ХА существует такой тип устройств как климат. Поэтому, для полноценной эмуляции кондиционера необходимо иметь датчик температуры (и желательно влажности) в том же помещении, в котором находится физическое устройство. Если нет желания заморачиваться с полноценной эмуляцией пульта для управлением кондиционером, то в принципе можно и без датчиков (хотя как тогда знать что температура помещения меняется в нужную сторону?).

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

Итак, вместо облака с блэкджеком и шл...  огромным количеством ненужных кодов и производителей, научим свой Home Assistant "понимать" команды тольлко от своих домашних пультов.

Для начала настроим устройство по инструкции в родном приложении на смартфоне. Это позволит пульту зарегистрироваться в домашней Wi-Fi сети. Так же, при желании, можно будет сменить его IP адрес на статический.
 
Теперь установим официальное дополнение Broadlink 

Оно запросит адрес пульта в домашней сети

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

Таким образом, пульт продолжит работать и со своим облаком через приложением на смартфоне, и так же будет принимать команды от ХА (напрямую, не через облако).

Обучение командам.

В принципе всё готово к тому, чтобы начать записывать команды. Для этого существует два варианта.
1. скрипт обучения:

alias: IR learn
sequence:
  - service: remote.learn_command
    data:
      command_type: ir
      device: mazgan_2
      command: "off"
      alternative: true
    target:
      entity_id: remote.pult_2
mode: single
icon: mdi:school

Название можно указать своё.
Обязательно использовать встроенный сервис обучения командам.
Тип отправки команды с пульта - и/к.
Так же необходимо указать произвольное имя устройства, для которого предназначена эта команда(телевизор, твбокс, кондиционер и т.д.). Но в дальнейшем сохранять уникальность имён для каждого устройства.
Указываем действие, которое будет выполнять команда. В данном примере это команда на выключение.
И через какое устройство это всё отправлять - наш ранее добавленный пульт.

В графическом интерфейсе этот же скрипт выглядит так:


Теперь можно добавить (временно) в интерфейс кнопку для запуска скрипта. При её нажатии система будет готова записать новую команду. При обучении разным кнопкам, не забываем в строке "команда" каждый раз указывать то действие, которая выполняет кнопка на оригинальном пульте, которую хотим скопировать в систему.
Как вариант, можно указать сразу последовательность команд, которым хотим обучить. И тогда важно нажимать кнопки на оригинальном пульте в той же последовательности.
В момент когда пульт готов к приёму и записи команды, в ХА выскочит системное уведомление.


И индикатор на самом пульте загорится постоянным свечением (в зависимости от модели, так же может поменяться цвет индикатора). При нажатии на кнопку на физическом оригинальном пульте, индикатор погаснет. Значит данные успешно записаны.

Если записывается серия команд, то системные уведомления будут выскакивать одно за другим, сразу после удачной записи команды. И индикатор будет загораться снова - сигнализируя о готовности записать команду.

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

Хранение команд.

После создания первой записи, в системе появляется файл с названием broadlink_remote_что-то-там_codes. Вместо "что-то-там" будет указан МАК адрес пульта. Так что если дома несколько пультов, то соответственно для каждого пульта будет свой файл с командами к устройствам, которыми он управляет.
Эти файлы создаёт интеграция Broadlink. И хранятся они по адресу /config/.storage/ , попасть в который можно с помощью стандартного файлового редактора.
Информация в файле упорядочена следующим образом:
  "Данные":

    "имя устройства1":
      "Имя команды1":
        "Очень_длинная_строка_содержащая_в_себе_код_команды_например_вкл/выкл_кондиционера"
      "Имя команды2": "Очень_длинная_строка_содержащая_в_себе_код_команды_например_переключение_на_тепло_для_кондиционера"

    "имя устройства2": 
      "Имя команды1":
        "Очень_длинная_строка_содержащая_в_себе_код_команды_например_вкл/выкл_телевизора"
      "Имя команды2": "Очень_длинная_строка_содержащая_в_себе_код_команды_например_переключение_канала_телевизора"
Где "имя устройства" и "имя команды" это как раз те данные, что были указаны в обучающем скрипте.

Удаление команд.

При необходимости удалить команды, необходимо создать новый скрипт, в котором будет использоваться сервис remote.delete_command. С его помощью можно удалить команду, указав, как и при обучении, имя устройства и саму команду. Удаление команды вручную из файла не даст ничего. Только через сервис удаления.

Отправка команд.

По аналогии с предыдущими двумя пунктами, для отправки команд используется сервис remote.send_command. Однако тут существет один нюанс.
Команду можно отправлять как в виде короткого и понятного обозначения, записанного заранее, так и в виде "сырых" данных в оригинальном виде.
alias: Отправка команды
sequence:
  - service: remote.send_command
    data:
      command:
        - >-
          b64:JgBoACQRFhAWLRYtFhEWLBYRFi0WERUtFi0WAAFhJBEWERYtFS0WERYtFhEVLRYRFi0WLRYAAWEjEhURFi0WLRYQFi0WERYtFREWLRYtFgABYSQRFhAWLRYtFhEWLBYRFi0WERUtFi0WAA0F==
      device: TV
    target:
      entity_id:
        - remote.pult_1
mode: single

Следует обратить внимание, что при отправки команды в "сыром" виде, необходимо указывать "b64:" перед кодом.
Символы "- >-" ХА подставит сам. Если вдруг нет, то можно проверить отсылается ли команда с пульта, и если нет, то подставить эти символы самостоятельно.
Как наверняка уже стало ясно, что для проверки отправки команд так же не обязательно использовать скрипт, а достаточно обойтись лишь работой соответствующего сервиса из инструментов разработчика. Однако для постоянного использования конечно же нужны скрипты - по одному для каждой кнопки каждого устройства. Или же использовать готовые решения в виде интеграций.

Интеграция SmartIR.

Наверное является самой популярным, хотя и не идеальным (из-за невозможности охватить необъятное) решением для максимально удобной работы с и/к устройствами в Home Assistant.
Всё что она умеет делать и как её устанавливать и настраивать очень подробно расписано в документации на гитхабе
 

Настройка интерфейса.

Самая трудоёмкая часть во всём этом деле. Ршений очень много, одного универсального совета нет. Всё зависит от знаний и терпения того, кто это делает. В качестве примера, можно сделать вот такие виртуальные пульты в интерфейсе:



Работа с пультом подключаемом по Zigbee.

Т.к. зигби устройства в ХА работают через интеграцию Zigbee2MQTT и оттуда данные отправляются на MQTT брокер, полезно будет использовать программу MQTT Explorer на компьютере, находящемся в той же сети.
С её помощью можно подключиться к броркеру чтобы видеть точные имена устройств записанных в нём, а так же данные в сыром виде, которыми устройства обмениваются.


Итак, после стандартной процедуры подключения устройства, на выбор есть всё те же 2 способа получить код команды с настоящего физического пульта:
1. запустить скрипт.
2. обращаться к сервису напрямую.

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

Обучение командам.


Служба к которой на этот раз будем обращаться отвечает за отправку команды на MQTT брокер. Так же важно точно указать имя устройства на которое отправляем команду, т.е. зигби пульт. Поэтому в топике указываем имя брокера и имя устройства так, как они прописаны на MQTT сервере. Именно здесь пригодится MQTT Explorer упомянутый выше.
Так что в строке zigbee2mqtt/Friendly_NAME/set - Friendly_NAME меняем на имя своего устройства.
В строке Payload указываем команду переводящую устройство в режим обучения: {"learn_ir_code":"ON"}
При запуске службы, устройство переходит в режим обучения и ждёт получения команды с обычного пульта.

Полученный код можно увидеть на странице устройства в Zigbee2MQTT.


Очень важно не забыть отключить режим обучения после каждой команды.
Поэтому, в случае использования скрипта, после действия с переключением в режим обучения, можно добавить ожидание в несколько секунд, и следующим действием добавить такую же команду только с параметром {"learn_ir_code":"OFF"} в строке Payload. 
Текст скрипта для примера:
alias: Пульт 1 IR learn
sequence:
  - service: mqtt.publish
    data:
      topic: zigbee2mqtt/Пульт 1/set
      payload: "{\"learn_ir_code\":\"ON\"}"
  - delay:
      hours: 0
      minutes: 0
      seconds: 10
      milliseconds: 0
  - service: mqtt.publish
    data:
      topic: zigbee2mqtt/Пульт 1/set
      payload: "{\"learn_ir_code\":\"OFF\"}"
mode: single
icon: mdi:school

Отправка кодов.

Этот процесс можно осуществить только через обращение к топику MQTT.

По аналогии с предыдущим пунктом указываем полное имя топика с именем устройства.
В строке Payload пишем: {"ir_code_to_send": "ABCD1234XYZ=="}
Где ABCD1234XYZ== - это и есть код команды полученный ранее, который необходимо запустить.

Ну а дальше по аналогии - для каждой команды свой скрипт. Для каждого скрипта своя кнопка в интерфейсе.

При желании, можно воспользоваться зигби пультом, наподобие этого
Тут уже надо будет добавлять автоматизации.Но зато есть простор для творчества 😉

Комментарии

Отправить комментарий