Увлажнитель воздуха Proscenic 808c1) имеет свое, криво переведенное2), но полнофункциональное приложение «ProscenicHome». Однако, нативной интеграции с HomeKit, конечно же, не имеет. Так же не поддерживает протокол MQTT.
Естественно, когда всё остальное умное оборудование так или иначе завернуто в HomeKit, становится немного обидно и руки начинают чесаться.
А никаких готовых рецептов, увы, нет! Дело еще усложняется тем, что, ни Tasmota, ни Homebridge толком увлажнители пока не поддерживают3). Поэтому приходится выкручиваться и колхозить из того, что есть.
Умная часть устройства построена на базе Wi-Fi-модуля Tuya TYWE3S, что прекрасно, т.к. Tasmota поддерживает модуль TuyaMCU, для коммуникации между платой Tuya и MCU.
В итоге всё получилось – все кнопочки, ползунки и датчики были успешно проброшены в HomeKit и работают.
В этой статье описывается только процесс прошивки и настройки самого устройства, а настройка конфигурации моста Homebridge тут. Также есть небольшая цепочка узлов Node-RED для сохранения телеметрии в базу данных.
Зная китайцев, можно было бы предположить, но нет… все разбирается и отстегивается легко и ничего ненужного не припаяно!
Фотографии в большом разрешении и без лайтбокса.
Для прошивки этой платы, просто напаяться к контактам не получится, необходимо отключить MCU на весь процесс4). Сделать это можно двумя адекватными и одним неадекватным способом:
Полностью выпаивать плату, это совершенно не торт. Перевести MCU в режим сброса затруднительно без знания нужной ноги, а выяснить это не представляется возможным, т.к. китайцы заботливо срезали маркировку чипа… Резать дорожки, это вообще не по фэншую! В итоге-то, конечно, я выбрал третий вариант, но… Точнее микс из первого и третьего.
Я убрал припой между основной платой и Туей – сперва оловоотсосом и плетенкой убрал максимальное количество, а остатки выдавил очень кстати пришедшим инструментом для разборки экранов, который идеально вошел в щель между платами. Потом припаял шлейф и конечно же убрал тулзу.
Тут расписание выводов для распайки шлейфа и подключения к программатору.
Прочая подготовка, подключение и прошивка Туи полностью аналогична процедуре, описанной в этой статье, за одним нюансом – в этом модуле 2MB флеш-памяти, что, соответственно, и нужно выбрать в Tasmotizer'е!
Базовые настройки, такие, как «Подключение к Wi-Fi» и «Настройка модуля» так же аналогичны, описанному тут, за исключением следующих:
Backlog Template {"NAME":"Proscenic 808c","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}; Module 0
SetOption66 1
Мало того, что этот процесс совершенно неочевиден, так еще и усложняется необходимостью совместить несовместимое.
Это корректная таблица функций, оригинал тут.
dpId | Тип данных | Функция |
---|---|---|
1 | boolean | питание (off/on) |
2 | enum | режим авто/детский/влажность (0→2) |
3 | value | влажность в помещении |
6 | enum | сила тумана (0→6) |
7 | boolean | анион (off/on) |
13 | enum | установка таймера (0→12) |
14 | value | обратный отсчет таймера |
101 | boolean | нагрев (off/on) |
102 | boolean | ночной свет (off/on) |
103 | enum | режим постоянной влажности (0→10)9) |
104 | value | температура в помещении |
105 | boolean | выбор шкалы (C/F) |
106 | boolean | ночной режим (off/on) |
Добавление кнопок в интерфейс с назначением dpId на fnId:
Backlog TuyaMCU 12,101; TuyaMCU 13,7; TuyaMCU 14,106; TuyaMCU 15,102
Назначение меток в WebUI:
Backlog Webbutton1 Power; Webbutton2 Heating; Webbutton3 Anion; Webbutton4 Night; Webbutton5 Light
Добавление в телеметрию температуры, влажности и таймера:
Backlog TuyaMCU 71,104; TuyaMCU 73,3; TuyaMCU 81,14
Можно еще добавить кнопку переключения шкалы измерения температуры10):
Backlog TuyaMCU 16,105; Webbutton6 C/F
Только зачем? Если надо, можно разово изменить шкалу, введя команду TuyaSend1 105,x
, где x=[0,1].
Эти настройки не видны в WebUI и нужны исключительно для связи с Homebridge.
Вариант с использованием компонента11) «Lights» (TuyaMCU 21,6
), как это описано тут, не работает из-за разных типов данных – нужен «enum», а используется «value». Поэтому пришлось использовать компонент «Fan control» и сделать так:
Backlog TuyaMCU 64,6; tuyaenumlist 4,6
В итоге регулировка тумана производится публикацией топика humidifier_00896D/cmnd/tuyaenum4
с сообщением [0-6]
.
В увлажнителе есть 3 режима работы – автоматический, детский и режим поддержания заданной влажности. В этом случае сделано так же:
Backlog TuyaMCU 63,2; tuyaenumlist 3,3
Вообще, значений может быть только 3 (0→2), но для работы бриджа нужно еще одно фэйковое.
Выбор режима осуществляется публикацией топика humidifier_00896D/cmnd/tuyaenum3
с сообщением [0-2]
.
Вообще, увлажнитель поддерживает значения таймера от «0» до «12», но для удобства интеграции в HomeKit, лучше взять «10», чтобы без остатка делить на него 100.
Backlog TuyaMCU 61,13; tuyaenumlist 1,10
Настраивается публикацией топика humidifier_00896D/cmnd/tuyaenum1
с сообщением [0-10]
.
Для корректной индикации состояния в HomeKit, нужно добавить правило:
Backlog rule1 ON TuyaEnum1#Data>0 DO Publish %topic%/stat/humTimer 15 ENDON ON TuyaEnum1#Data=0 DO Publish %topic%/stat/humTimer 0 ENDON; Rule1 5; Rule1 1
Если быть точнее, это это датчик наличия воды и бака. Т.е. у него есть 3 состояния – бака нет (поднят), нет воды (опущен) и нормальное (придавлен баком). Однако, по сути, первые два, это одно состояние разомкнутого геркона и MCU между ними не видит разницы.
Что касается прошивки. В ней нет соответствующего компонента, поэтому необходимо справляться правилами:
Backlog Rule2 on TuyaReceived#Data=55AA030700050C0500010121 do Backlog RuleTimer1 30; RuleTimer2 0 endon on TuyaReceived#Data=55AA030700050C0500010020 do Backlog RuleTimer1 0; RuleTimer2 30 endon on Rules#Timer=1 do Backlog Publish %topic%/stat/waterLevel low; delay 300; power1 off endon on Rules#Timer=2 do Backlog Publish %topic%/stat/waterLevel normal; delay 150; power1 on; delay 150; power4 on; endon; Rule2 1
Что есть что в этой каше:
Из-за конструктивных недостатков, когда вода кончается, начинаются «качели» – то есть вода, то нет, и чтобы на телефон не приходили лишние уведомления, в обоих случаях добавлены задержки:
on TuyaReceived#Data=55AA030700050C0500010121 do // Условие - MCU передал, что нет воды Backlog RuleTimer1 30; // Включаем свой таймер RuleTimer2 0 // Отключаем таймер другого правила endon on TuyaReceived#Data=55AA030700050C0500010020 do // Условие - MCU передал, что вода появилась Backlog RuleTimer1 0; // Отключаем таймер другого правила RuleTimer2 30 // Включаем свой таймер endon
Когда качели успокоились, можно действовать:
on Rules#Timer=1 do // Сработал таймер отсутствия воды Backlog Publish %topic%/stat/waterLevel low; // Публикуем топик с сообщением, что нет воды или бака delay 300; // Включаем задержку на 30 секунд power1 off // Выключаем увлажнитель endon on Rules#Timer=2 do // Сработал таймер наличия воды Backlog Publish %topic%/stat/waterLevel normal; // Публикуем топик с сообщением, что вода есть или бак на месте delay 150; // Включаем задержку на 15 секунд power1 on; // Включаем увлажнитель delay 150; // Включаем задержку на 15 секунд power4 on; // Включаем ночной режим endon
Задержки нужны исключительно, чтобы увлажнитель не тилинькал без остановки. Никакой другой пользы они не несут!
А вот тут китайцы сами себя перехитрили, а меня заставили глубоко задуматься… т.к. конфигурация, сделанная по аналогии с предыдущими12), не работает вообще! Совсем!
Несколько дней ломал голову и экспериментировал, пока не понял, что, во-первых, перечисление идет не по порядку, а, во-вторых, нужно каждый раз отправлять подряд две команды13)!
MCU | Влажность | Enum |
---|---|---|
9 | Выкл | 0 |
10 | 30% | 1 |
0 | 35% | 2 |
1 | 40% | 3 |
2 | 45% | 4 |
3 | 50% | 5 |
4 | 55% | 6 |
5 | 60% | 7 |
6 | 65% | 8 |
7 | 70% | 9 |
8 | 75% | 10 |
Для того, чтобы смочь управлять этой кашей, нужно собрать прошивку с поддержкой команды «Subscribe».
Вот выдержки и уточнения из официальной инструкции14):
/tasmota/user_config_override.h
;#ifndef SUPPORT_MQTT_EVENT #define SUPPORT_MQTT_EVENT #endif
platformio_override_sample.ini
в platformio_override.ini
;platformio run -e tasmota-RU
;build_output/firmware
и скачать tasmota-RU.bin.gz
;tasmota-minimal.bin.gz
;tasmota-minimal.bin.gz
, а потом tasmota-RU.bin.gz
;
Это ключевое место всей затеи. При подключении MQTT, правило подписывается на топик humidifier_00896D/cmnd/HumidityLVL
, перестраивает индекс в правильном порядке при получении соответствующего сообщения и обратно выдает в humidifier_00896D/stat/HumidityLVL
правильный же ответ.
Backlog Rule3 ON mqtt#connected DO Subscribe HumidityLVL, humidifier_00896D/cmnd/HumidityLVL ENDON ON Event#HumidityLVL=0 DO backlog var1 9; Event HumidityLVLSet ENDON ON Event#HumidityLVL=1 DO backlog var1 10; Event HumidityLVLSet ENDON ON Event#HumidityLVL>=2 DO backlog var1 %value%; sub1 2; Event HumidityLVLSet ENDON ON Event#HumidityLVLSet DO backlog TuyaSend4 103,%var1%; TuyaSend4 2,2 ENDON on TuyaReceived#DpType4Id103=10 do Backlog var2 1; Event TuyaHumLVL endon on TuyaReceived#DpType4Id103=9 do Backlog var2 0; Event TuyaHumLVL endon on TuyaReceived#DpType4Id103<=8 do Backlog var2 %value%; add2 2; Event TuyaHumLVL endon on Event#TuyaHumLVL do Publish %topic%/stat/HumidityLVL %var2% endon; Rule3 1
Что есть что в этой каше:
Подписываемся на топик.
ON mqtt#connected DO // Условие - MQTT подключен Subscribe HumidityLVL, humidifier_00896D/cmnd/HumidityLVL // Подписываемся на топик и добавляем событие ENDON
При публикации топика, конвертируем правильную последовательность из сообщения в неправильную, но понятную MCU.
ON Event#HumidityLVL=0 DO // Условие - событие содержит сообщение "0" Backlog Var1 9; // Записываем в переменную "9" Event HumidityLVLSet // Создаем событие ENDON ON Event#HumidityLVL=1 DO // Условие - событие содержит сообщение "1" Backlog Var1 10; // Записываем в переменную "10" Event HumidityLVLSet ENDON ON Event#HumidityLVL>=2 DO // Условие - в сообщении число равное или больше "2" Backlog Var1 %value%; // Записываем это число в переменную Sub1 2; // Вычитаем "2" из числа в переменной Event HumidityLVLSet ENDON
Отправляем в MCU понятные ему данные и подтверждаем их.
ON Event#HumidityLVLSet DO // Условие - опубликовано событие Backlog TuyaSend4 103,%var1%; // Отправляем в функцию 103 MCU число из переменной TuyaSend4 2,2 // Переключаем режим работы в "2" ENDON
Смотрим ответ функции и переводим его из неправильной последовательности в правильную.
ON TuyaReceived#DpType4Id103=10 do // Условие - 103 функция вернула "10" Backlog Var2 1; // Записываем в переменную "1" Event TuyaHumLVL // Создаем событие ENDON ON TuyaReceived#DpType4Id103=9 do // Условие - 103 функция вернула "9" Backlog Var2 0; // Записываем в переменную "0" Event TuyaHumLVL ENDON ON TuyaReceived#DpType4Id103<=8 do // Условие - вернула цифру меньше или равную "8" Backlog Var2 %value%; // Записываем это число в переменную Add2 2; // Добавляем "2" к числу из переменной Event TuyaHumLVL ENDON
Публикуем топик с правильной последовательностью.
ON Event#TuyaHumLVL do // Условие - опубликовано событие Publish %topic%/stat/HumidityLVL %var2% // Публикуем топик с сообщением из переменной ENDON
К сожалению, этот механизм работает несколько инертно, но все же стабильно. Других путей, увы, я не вижу.
Таймер для автоматического отключения экрана вечером, чтобы ночью не светило в глаз.
Backlog Timer1 {"Enable":1,"Mode":0,"Time":"23:00","Window":10,"Days":"1111111","Repeat":1,"Output":4,"Action":1}; Timers 1
Backlog weblog 2; TuyaSend9
.Backlog TuyaMCU 16,0; Webbutton6 "
Backlog TuyaMCU 62,103; tuyaenumlist 2,10
.Backlog TuyaSend4 103,10; TuyaSend4 2,2;
, а так Backlog TuyaSend4 103,9; TuyaSend4 2,2;
, чтобы выключить.
Обсуждение