Инструменты пользователя

Инструменты сайта


iot:firmware:tasmota:proscenic:808c

Прошивка Proscenic 808c под Tasmota

Увлажнитель воздуха Proscenic 808c1) имеет свое, криво переведенное2), но полнофункциональное приложение «ProscenicHome». Однако, нативной интеграции с HomeKit, конечно же, не имеет. Так же не поддерживает протокол MQTT.

Естественно, когда всё остальное умное оборудование так или иначе завернуто в HomeKit, становится немного обидно и руки начинают чесаться. ^_^

А никаких готовых рецептов, увы, нет! Дело еще усложняется тем, что, ни Tasmota, ни Homebridge толком увлажнители пока не поддерживают3). Поэтому приходится выкручиваться и колхозить из того, что есть.

Умная часть устройства построена на базе Wi-Fi-модуля Tuya TYWE3S, что прекрасно, т.к. Tasmota поддерживает модуль TuyaMCU, для коммуникации между платой Tuya и MCU.

В итоге всё получилось – все кнопочки, ползунки и датчики были успешно проброшены в HomeKit и работают.

:!: В этой статье описывается только процесс прошивки и настройки самого устройства, а настройка конфигурации моста Homebridge тут. Также есть небольшая цепочка узлов Node-RED для сохранения телеметрии в базу данных.

Обзор

Разборка

Зная китайцев, можно было бы предположить, но нет… все разбирается и отстегивается легко и ничего ненужного не припаяно!

Платы

Фотографии в большом разрешении и без лайтбокса.

Подключение и прошивка

Для прошивки этой платы, просто напаяться к контактам не получится, необходимо отключить MCU на весь процесс4). Сделать это можно двумя адекватными и одним неадекватным способом:

  1. выпаять модуль Tuya;
  2. перевести MCU в режим сброса;
  • прервать дорожку RX.

Полностью выпаивать плату, это совершенно не торт. Перевести MCU в режим сброса затруднительно без знания нужной ноги, а выяснить это не представляется возможным, т.к. китайцы заботливо срезали маркировку чипа… Резать дорожки, это вообще не по фэншую! В итоге-то, конечно, я выбрал третий вариант, но… Точнее микс из первого и третьего. LOL

Я убрал припой между основной платой и Туей – сперва оловоотсосом и плетенкой убрал максимальное количество, а остатки выдавил очень кстати пришедшим инструментом для разборки экранов, который идеально вошел в щель между платами. Потом припаял шлейф и конечно же убрал тулзу. :-D

Тут расписание выводов для распайки шлейфа и подключения к программатору.

Прочая подготовка, подключение и прошивка Туи полностью аналогична процедуре, описанной в этой статье, за одним нюансом – в этом модуле 2MB флеш-памяти, что, соответственно, и нужно выбрать в Tasmotizer'е!

Базовые настройки

Базовые настройки, такие, как «Подключение к Wi-Fi» и «Настройка модуля» так же аналогичны, описанному тут, за исключением следующих:

  • Добавление шаблона5):

    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
  • Прочие мелкие настройки – заменить значение TelePeriod на 306):

    TelePeriod 30
  • Изменение ссылки OTA7):

    otaurl http://ota.tasmota.com/tasmota/release/tasmota-minimal.bin.gz
  • Дополнительно выполнить команду:

    SetOption66 1
  • Для отладки ввести8):

    Backlog weblog 4; TuyaSend9

Настройка Tuya

Мало того, что этот процесс совершенно неочевиден, так еще и усложняется необходимостью совместить несовместимое.

Таблица функций

Это корректная таблица функций, оригинал тут.

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):

  1. перейти по ссылке;
  2. авторизоваться или зарегистрироваться;
  3. в дереве открыть /tasmota/user_config_override.h;
  4. удалить из него все и добавить следующий код

    #ifndef SUPPORT_MQTT_EVENT
    #define SUPPORT_MQTT_EVENT
    #endif
  5. переименовать platformio_override_sample.ini в platformio_override.ini;
  6. в консоли ввести и выполнить platformio run -e tasmota-RU;
  7. в дереве перейти в build_output/firmware и скачать tasmota-RU.bin.gz;
  8. скачать файл tasmota-minimal.bin.gz;
  9. через WebUI прошить сперва tasmota-minimal.bin.gz, а потом tasmota-RU.bin.gz;
  10. профит! Настройки, кстати, все останутся.
Правило

Это ключевое место всей затеи. При подключении 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

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

Вишенка на торте

Таймер для автоматического отключения экрана вечером, чтобы ночью не светило в глаз. 8-)

Backlog Timer1 {"Enable":1,"Mode":0,"Time":"23:00","Window":10,"Days":"1111111","Repeat":1,"Output":4,"Action":1}; Timers 1

Как это выглядит и работает в живую


Дисклеймер

  • Использование материалов данной базы знаний разрешено на условиях лицензии, указанной внизу каждой страницы! При использовании материалов активная гиперссылка на соответствующую страницу данной базы знаний обязательна!
  • Автор не несет и не может нести какую либо ответственность за последствия использования материалов, размещенных в данной базе знаний. Все материалы предоставляются по принципу «как есть». Используйте их исключительно на свой страх и риск.
  • Все высказывания, мысли или идеи автора, размещенные в материалах данной базе знаний, являются исключительно его личным субъективным мнением и могут не совпадать с мнением читателей!
  • При размещении ссылок в данной базе знаний на интернет-страницы третьих лиц автор не несет ответственности за их техническую функциональность (особенно отсутствие вирусов) и содержание! При обнаружении таких ссылок, можно и желательно сообщить о них в комментариях к соответствующей статье.
1)
Вероятно, он же 807c, т.к, как я не искал разницу, так и не нашел! Даже на моей плате стоит индекс «807c»!
2)
Особенно мне нравится этот момент
3)
В спецификации к HomeKit вроде есть описание увлажнителя/осушителя воздуха, но…
4)
Подробнее тут, если интересно.
5)
Это корректный шаблон. Оригинальный шаблон тут.
6)
Только, если вы собираетесь пробрасывать телеметрию куда-то, к примеру в HomeKit.
7)
Т.к. в процессе будет использоваться собственная сборка, URL имеет смысл поменять на более логичный и нужный.
8)
Ну, а потом, для возвращения на круги своя, выполнить Backlog weblog 2; TuyaSend9.
9)
Тут все сложно, смотри соответствующий раздел ниже!
10)
Для удаления ввести Backlog TuyaMCU 16,0; Webbutton6 "
11)
Все возможные компоненты описаны тут.
12)
Т.е. вот так Backlog TuyaMCU 62,103; tuyaenumlist 2,10.
13)
К примеру, вот так, чтобы включить Backlog TuyaSend4 103,10; TuyaSend4 2,2;, а так Backlog TuyaSend4 103,9; TuyaSend4 2,2;, чтобы выключить.
14)
Моя инструкция может быть не совсем точна и логична, т.к. делаю это в первый и единственный раз, но для меня она сработала и я получил нужную прошивку.

Обсуждение

Ваш комментарий:
M L X P D V W᠎ X F S V B J L R T
 
Последнее изменение: 2023/11/02 21:59 — Николай Солошин