Прошивка умной лампочки от Сбера на модуле WBLC9 (чип BK7231T) и драйвере BP1658
PS.
Если ничего не понятно: @esnet1
1.Разбирать не обязательно, можно шить по воздуху
2.Шить можно или аналог тасмоты или аналог esphome - кому что больше нравится.
Лампочка предназначена для работы из приложения сбера или через приложение от TUYA https://play.google.com/store/apps/details?id=com.tuya.smartlife&hl=ru&gl=US
После прошивки ( основанной на тасмота ) может работать c MQTT брокером и управлятся локально из Home Assitaint, без всяких облаков и других глюков.
Описание процесса разборки и прошивки(OpenBeken, для libretiny почти аналогично, но есть другая программа для прошивки, конфиг под esphome в конце заметки):
Программа для прошивки под питон https://github.com/OpenBekenIOT/hid_download_py ( ставим питон с офсайта )
Или просто windows приложение https://github.com/openshwprojects/OpenBK7231T/blob/master/bk_writer1.60.zip ( обязательно правильно выбрать чип - ни в коем случае не BK7231N или что-то еще. И работает не всегда под питоном все веселее )
Прошивки и подробные инструкции от автора тут: https://github.com/openshwprojects/OpenBK7231T_App
Открываем релизы , скачиваем UA файл под чип BK7231T
Для бэкапа нужна прога для работы с SPI флешем.
Рекомендую NeoProgrammer ( https://4pda.to/forum/index.php?showtopic=884713&view=findpost&p=96411343 ),
или Asprogrammer ( https://github.com/nofeletru/UsbAsp-flash )
или еще куча разных других, но не все будут корректно определять флэш.
NeoProgrammer_2.2.0.10.zip
USBASP_USBISP_Driver_and_Firmware.zip
Риски: сломать при разборке ( нужны прямые руки и немного инструмента ), при прошивке аккуратнее - не сотрите загрузчик, , не сотрите калибровки ( всегда можно восстановить из полного бэкапа, даже чужого, если дадут, но только через spi программатор )
Упаковка и маркировка
Описание модуля https://developer.tuya.com/en/docs/iot/wblc9-module-datasheet?id=K9hgglry2jp5h
Разборка:
Плафон снимается руками! берем одной рукой за корпус, другой за плафон и потихоньку пытаемся прокрутить относительно цоколя и слегка покачивая отделяем его от цоколя. крепится на силиконе. ( разламывать не нужно, ковырять ножиками тоже! нужно две правильных руки. )
Снимаем центральный контакт цоколя:
Снимаем резьбовой контакт цоколя, аккуратно тупым ножом сдвигая с корпуса по кругу, потихоньку, ничего не сгибая и не прорезая
срезаем заводской клей с верхней части светодиодной матрицы, не царапая подложку матрицы, без фанатизма, главное - освобоить самый край матрицы у корпуса лампы ( ну и красоту навести)
Аккуратно вставляем внутрь лампы отвертку, достаточно тонкую и крепкую. Главное - не оторвать ничего внутри, берем конструкцию в руки, упираем (достаточно тупую, тонкую, плоскую!) отвертку в край матрицы и выталкиваем весь пакет из корпуса преодолевая сопротивление остатков клея и фиксатора матрицы в радиаторе корпуса лампы. Не нужно стучать сильно и острой отверткой до дырок в аллюминиевой подложке. Берегите руки, не проткните их отверткой, они еще пригодятся. не сломайте ничего внутри лампы и светодиодную матрицу, они нужны.
Отсоединяем матрицу от платы управлениея ( необязательно, но дальше работать будет удобнее ) Большую белую куча клея отрезаем аккуратно только от матрицы, вокрук платы не трогаем. есть риск отрыва cmd элементов. Легче всего отрывается керамическая антенна и ее обвязка, не орудуйте ножиком близко к плате! не смертельно, но ловить wifi будет значительно хуже.
Облуживаем точки подключения
Припаиваем внешнее питание ( пока не подключаем, нужно будет уже при работе с прошивкой )
Далее определитесь: если нужно сохранить возможность вернуть обратно возможность работы с облаком - нужен бэкап внутренней флешки чипа и программатор SPI. Например совсем не дорогой CH341A. Другой вариант - сразу безвозратно прошить для работы через MQTT брокер и забыть навсегда про tuya. Тогда нужен просто любой UART и можно пропустить все что связано с чтением, а перейти сразу к прошивке.
Бэкап внутренней памяти:
Берем SPI программатор
Подключаем к модулю 4 провода шины SPI, CEN, сразу первый UART и питание ( внешнее 3,3 вольта или с CH243a )
схема TP и контактов
Паятся тонкими проводами ( МГТФ или обмоточный с катушек ) никогда не дергать во избежании отрыва TP от платы. потом будет значительно сложнее подключится.
Для перевода чипа в режим доступа к памяти для программы нужен скрипт, набросал вот такой:
{$ INIT_AND_READ_FLASH_ID}
begin
ID:= CreateByteArray(4);
RESP:= CreateByteArray(250);
if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
LogPrint ('Read JEDEC ID');
// init SPI
for i:=0 to 250 do
begin
SPIWrite (0, 1, $D2);
ProgressBar(1);
end;
// read response
SPIRead(1, 3, ID);
// logprint('RESP: ' + inttohex((GetArrayItem(RESP, 0)),2)+ inttohex((GetArrayItem(RESP, 1)),2));
// read ID to test installation
SPIWrite (0, 4, $9F, $00, $00, $00);
SPIRead(1, 4, ID);
logprint('CHIP ID: ' + inttohex((GetArrayItem(ID, 2)),2) + inttohex((GetArrayItem(ID, 1)),2)+ inttohex((GetArrayItem(ID, 0)),2));
LogPrint ('End read JEDEC ID');
SPIExitProgMode ();
end
Тайный смысл - послать в чип 250 сиволов D2 и прочитать идентификатор флэша. Это нужно сделать сразу после сброса ( или подачи питания на чип ) Далее чип остается в режиме доступа к памяти пока не перезагрузим. нужно положить файл с таким содержимым в папку со скриптами ПО программатора
Подключаем программатор, ( перемычка режима работы установлена ), загружаем скрипт, выбираем секцию Нажимаем на кнопку ( CEN на землю ), запускаем скрипт на исполнение и в тот же момент отпускаем кнопку ( убираем землю с CEN ) Ждем цифр 15701 в логе программатора. если есть - отлично. если там в id чипа нули - повторяем пока не получится.
Жмем кнопку "Detect" в ПО программатора и выбираем чип EN25Q16
Жмем Read IC и читаем флешку, в логе должно быть так:
Currently selected: EN25QH16 [3.3V] 16 Mbits, 2 Mbytes
---------------------------------------------------------------------------
Current programmer: CH341 Black
21:19:22
Reading memory... Main Memory
Success
Execution time: 00:00:17.072
CRC32 = 0x********
Жмем в меню File и Save, сохраняем наш дамп в надежном месте. Бэкап готов.
Прошивка нового ПО:
Переводим CH341 в режим UART ( снимаем перемычку и перетыкаем в usb порту)
Или подключаем rx tx через любой UART
для загрузки из питоновского коплекта uartprogram правим компорт и имя файла прошивки ( адрес загруки по умолчанию 0x11000 )
python uartprogram c:\temp\OpenBK7231T_UA_1.12.103.bin -d COM3 -w
или в BKwriter 1.60 exe указываем порт,имя файла для прошивки и чип BK7231 ( не N !!!) адрес загрузки не должен быть равен нулю!!!
Если у вас хитрый уарт который не может работать на скорости 921600 укажите скорость порта.
python uartprogram c:\temp\OpenBK7231T_UA_1.12.103.bin -d COM3 --baudrate 115200 -w
теперь давим кнопку коротя CEN на землю, запускаем запись прошивки, отпускаем кнопку. Если через 3 секунды процесс прошики не запустился - жмем на кнопку еще секунду. Если закончилось время ожидания прошивальщика - повторяем до достижения нужного результата.
После прошивки запустится точка доступа с открытой сетью. подключаемся. по адресу 192.168.4.1 будет web-морда конфигуратора.
Настраиваем:
Configure module:
P24 выбираем BP1658CJ_DAT
P26 выбираем BP1658CJ_CLK
Configure General:
Ставим галочку на Flag4 ( Если нужно включать в предыдущем состоянии при подаче питания то и галочку на flag12 )
Change Startup command text:
BP1658CJ_Map 2 1 0 4 3 ( порядок цветов. у меня так, если нужно можно изменить: 01234 это будет rgbcw )
Прописываем ip MQTT брокера, топик, логин, пароль. Само в Home assistaint не приползет. Нужно прописать в configuration.yaml как-то так, например, исправивь имя топика
mqtt:
light:
- unique_id: "Name_Id"
name: "Name"
rgb_command_template: "{{ '%02x%02x%02x' | format(red, green, blue)}}"
rgb_state_topic: "obkMAC/led_basecolor_rgb/get"
rgb_command_topic: "cmnd/obkMAC/led_basecolor_rgb"
rgb_value_template: "{{ value[0:2]|int(base=16) }},{{ value[2:4]|int(base=16) }},{{ value[4:6]|int(base=16) }}"
command_topic: "cmnd/obkMAC/led_enableAll"
state_topic: "obkMAC/led_enableAll/get"
availability_topic: "obkMAC/connected"
payload_on: "1"
payload_off: "0"
brightness_command_topic: "cmnd/obkMAC/led_dimmer"
brightness_scale: 100
brightness_state_topic: "obkMAC/led_dimmer/get"
brightness_value_template: "{{value}}"
color_temp_command_topic: "cmnd/obkMAC/led_temperature"
color_temp_state_topic: "obkMAC/led_temperature/get"
retain: true
Отпаиваем все провода от TP и питания, отмаваем остатки флюса. Собираем лампу в первоначальный вид в обратной последовательности: Одеваем матрицу на разъем платы до упора. Далее рекомендую промазать теплопроводной пастой край радиатора для лучшего отвода тепла. вставляем плату с матрицей в корпус и фиксируем с усилием в пазах радиатора. без фанатизма, плату, светодиоды и корпус ломать не нужно. Плафон пожно и не приклеивать, защелок вполне хватает. при надевании резьбового цоколя проследите чтобы провод с резистором вошел в отверстие центрального контакта. В итоге получается так:
Выражаю огромную благодарность пользователям btsimonh и Refuhr !
P.S. Прошивка в аналог esphome - libretuya
substitutions:
board_name: sb-e14-0
esphome:
name: $board_name
project:
name: "SBDV-0020/Sber.LibreTuya"
version: "WBLC9(BK7231T)"
comment: "Sber E14 люстра группа 4"
bk72xx:
board: generic-bk7231t-qfn32-tuya
framework:
version: dev
preferences:
flash_write_interval: 1min
api:
encryption:
key: !secret keyapi
ota:
password: !secret passwordota
logger:
baud_rate: 0
captive_portal:
wifi:
ssid: !secret wifi1
password: !secret password1
ap:
ssid: "$board_name Hotspot"
password: !secret password1
# web_server:
# port: 80
button:
- platform: restart
name: Reset.$board_name
bp1658cj:
data_pin: P24
clock_pin: P26
max_power_color_channels: 3
max_power_white_channels: 3
output:
- platform: bp1658cj
id: output_red
min_power: 0.00095
zero_means_zero: true
channel: 2
- platform: bp1658cj
id: output_green
min_power: 0.00095
zero_means_zero: true
channel: 1
- platform: bp1658cj
id: output_blue
min_power: 0.00095
zero_means_zero: true
channel: 0
- platform: bp1658cj
id: output_cold_white
min_power: 0.00095
max_power: 0.9
zero_means_zero: true
channel: 3
- platform: bp1658cj
id: output_warm_white
min_power: 0.00095
max_power: 0.9
zero_means_zero: true
channel: 4
light:
- platform: rgbww
name: sber_e14_0
id: light1
red: output_red
green: output_green
blue: output_blue
cold_white: output_cold_white
warm_white: output_warm_white
cold_white_color_temperature: 6500.0 K
warm_white_color_temperature: 2700.0 K
color_interlock: true
constant_brightness: true
restore_mode: RESTORE_AND_ON
sensor:
- platform: wifi_signal
name: WiFi_Signal.$board_name
- platform: uptime
name: uptime_sensor.$board_name
text_sensor:
- platform: version
name: Version.$board_name