Найти в Дзене
mamaich

Китайский диммер с Tasmota и Sprut.hub

Перепрошил под тасмоту китайский диммер с надписью на плате "King dimmer switch tuya". Внешне выглядит так:

фото взято с сайта тасмоты
фото взято с сайта тасмоты

Внешний вид платы:

-2
-3

RX и TX тут также перепутаны, как в инструкции.
Ссылка на инструкцию по прошивке:
https://tasmota.github.io/docs/devices/KingArts-touch-Dimmer/

Но при настройке тасмоты вышел облом. Хоть на плате стоят те же, что в инструкции, контроллеры ESP8285 и Nuvoton n76e003at20 - диммер после настройки не заработал.

Если в двух словах, то в данном диммере вся логика устройства реализована в контроллере Nuvoton n76e003at20, а ESP8285 общается с ним по последовательному порту, получая информацию о текущем статусе выключателя и передавая ему команды, полученные по WiFi.

В примере с сайта тасмоты в n76e003 записана прошивка, с которой работает module type PS-16-DZ (58). В моем случае заработал Tuya MCU (54). Отличия в том, что первый для связи использует набор текстовых АТ команд по аналогии с обычным модемом, а второй - бинарный интерфейс, описанный на сайте Tuya. Никакие контакты ESP, кроме RX и TX при этом не используются:

-4

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

SetOption104 0
TuyaMCU 11,1
TuyaMCU 21,2
DimmerRange 10,1000
ButtonRetain 1
PowerRetain 1
SwitchRetain 1
StatusRetain 1
StateRetain 1
SensorRetain 1
InfoRetain 1

Команды описаны тут: https://tasmota.github.io/docs/Commands/
Сперва я на всякий случай явно включаю поддержку Retained сообщений MQTT (требование Sprut.hub), потом устанавливаю соответствие fnId и dpId тасмоты и Tuya. Первая команда - кнопка, вторая - диммер. Диапазон диммера от 10 до 1000. Остальные команды включают сохранение всех возможных параметров (знаю, что в диммере используются не все они - просто не стал разбираться какие именно нужны).

Далее требуется подключить диммер к Sprut.hub.
Но тут возник очередной нюанс - в Sprut.hub уже есть штатный шаблон, описывающий устройства с тасмотой на борту - но описывает он обычные выключатели (Switch), а не диммируемые (Lightbulb). Так что нужно не только написать свой шаблон, а еще предусмотреть, чтобы устройство не добавлялось дважды (один раз как выключатель, а второй раз как диммер). Для этого нужно добавить в Full Topic тасмоты свой префикс:

-5

Тут я добавил строку "dimmer/" в качестве префикса.
За подсказку про Full Topic - спасибо людям из чата поддержки Sprut.hub.

Текст JSON шаблона для Sprut.hub получился такой:

{
"manufacturer": "Tasmota",
"model": "TyuaMCU",
"status": "Done",
"services": [
{
"type": "Lightbulb",
"characteristics": [
{
"type": "On",
"link": {
"type": "String",
"topicSearch": "dimmer/stat/(.*)/POWER",
"topicGet": "dimmer/stat/(1)/POWER",
"topicSet": "dimmer/cmnd/(1)/POWER",
"map": {
"false": "OFF",
"true": "ON"
}
}
},
{
"type": "Brightness",
"link": {
"type": "String",
"topicSearch": "dimmer/stat/(.*)/RESULT",
"topicGet": "dimmer/stat/(1)/RESULT",
"topicSet": "dimmer/cmnd/(1)/Dimmer",
"inFunc":"JSON.parse(value).Dimmer",
"value": 100,
"minValue": 0,
"maxValue": 100
}
}
]
}
]
}


Еще меня в данном диммере раздражал факт, что на нем постоянно горит лампочка WiFi - ночью она прямо спать мешает. В случае с выключателями на OpenBK этот вопрос решился поигравшись настройками
WifiLED_n и WifiLED без _n, но в TuyaMCU этой лампой управляет контроллер Nuvoton, а тасмота отправляет ему соответствующие команды:

-6

В логе это "Set WIFI Led".

В текущей версии тасмоты нет возможности управления состоянием WiFi лампочки из интерфейса - поэтому придется лезть в исходники. Конечно, можно просто сломать кусачками светодиод на плате - но это не наш метод.

Править требуется функцию TuyaGetTuyaWifiState в файле xdrv_16_tuyamcu_v1.ino:

-7

Здесь я поменял выделенную строку с "wifi_state = 0x03" на "wifi_state = 0x02". Цифра 3 означает "лампочка горит всегда", а 2 - "лампочка не горит" (0 и 1 - это частое и медленное моргание, выяснил перебором). Таким образом, лампа потухнет после того, как тасмота приконнектится к MQTT брокеру.

Для OTA прошивки требуется собрать два файла - tasmota-minimal.bin и tasmota.bin. Так как в ESP8285 всего 1 мб Flash, то при OTA сперва прошивается минимальная прошивка, а потом уже из нее шьется полная.

Прошиваю, проверяю - лампочка WiFi потухает после соединения с MQTT, как и задумано. Отдаю со Sprut.hub команду поменять яркость - опа, лампочка WiFi снова горит. При этом в логе про "Set WIFI Led" нет ни слова.

Похоже, код, прошитый в контроллере Nuvoton чересчур "умный". Если он видит, что ему поступила команда с ESP, значит эта команда пришла "из облака", соответственно WiFi работает и надо это показать зажженной лампочкой.

Данный вопрос я решил очень просто. Раз в несколько секунд тасмота отправляет контроллеру Nuvoton heartbeat - вот я в соответствующий код добавляю команду "потуши лампочку WiFi". Код находится в том же xdrv_16_tuyamcu_v1.ino, в функции TuyaNormalPowerModePacketProcess:

-8

Мной добавлена выделенная строка.

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