Прошивка и активация Zigbee координатора в роутере Smart Box Turbo+. Интеграция в homeassistant
Описание модернизация маршрутизатора Beeline smart box turbo+, которая позволит активировать распаянный на плате отдельный SoC с функционалом Zigbee координатора, прошить его и использовать его в системе умного дома.
Вводная
Блок питания: 12 VDC, 1.5 A
CPU: MediaTek MT7621AT (880 MHz, 2 cores, 4 threads)
FLASH: Nand 128 Mb
RAM: 128 MB DDR3 (NANYA nt5cc64m16gp-di)
USB: 3.0 (разведен) + 2.0 (не разведен на разъем)
UART: да, J4
Wifi1: MediaTek MT7603EN bgn MIMO 2×2:2 (до 300 Мбит/сек)
Wifi2: MediaTek MT7615N n+ac MIMO 4×4:4 160 МHz (до 1733 Мбит/сек)
Zigbee 3.0 chip: EFR32 MG1B232GG
Switch: MediaTek MT7621AT 10/100/1000 (5 портов всего)
LAN ports: x4 10/100/1000
WAN ports: x1 10/100/1000
Zigbee антенна и пара 5ГГц антенн с фронтальной направленностью выполнены на верхнем крае основной платы.
Комбинированные 2,4+5ГГц антенны 2дБ в торцах корпуса формируют боковые лепестки. Можно установить вместо них 5дБ антенны с ufl пигтейлами (обзор здесь делал) и развернуть к передней или задней стенке).
Оригинальная прошивка не поддерживает USB модемы.
При работе CPU греется, желательно наклеить радиатор.
SoC содержит процессор с ядром Cortex M4, 32K SRAM, 256K Flash, порты ввода-вывода и выходной усилитель мощности с КУ до +19дБ.
Производительность сравнима с широко известным CC2538 в комбинации с усилителем СС2592.
В Itead Sonoff Zigbee bridge используется аналогичная микросхема EFR32MG2 следующего поколения — Gen2.
Прошивки для Gen1 и Gen2 между собой не совместимы.
Расшифровка основной части маркировки MG1B232GG
M — family code
G — Gecko
1 — series 1
B — Performance Grade Basic
2 — Feature Code reserved
3 — Feature Code TXRX
2 — Feature Code Band 2.4GHz
G — Flash 256K
G — Temperature Grade -40 to +85C
Дополнительное поле маркировки, например 1820C00OXE
18 – The last 2 digits of the assembly year.
20 – The 2-digit workweek when the device was assembled.
C00OXE – A trace or manufacturing code. The first letter is the device revision.
SoC EFR32MG1 распаян под небольшим экраном в углу платы, чуть выше расположена контактная группа JP1 для установки разъема SMT типа с шагом 1,27мм (используется для прошивки и отладки чипа).
Тип корпуса QFN32, соответствие выводов чипа и JP1 будут показаны в разделе «1. Перепрошивка EFR32», там же подписан функционал выводов.
Интерфейс связи с CPU — UART с Software flow control, выводы PA0=TXD, PA1=RXD.
На стороне CPU (MT7621) используется UART3, который не активирован ни в одной прошивке (профилях устройств).
По прихоти разработчиков устройства кнопка WPS роутера заведена на выход GPIO#11 CPU, который предназначен для выхода TXD2 UART2.
Чтобы сохранить функционал кнопки и не заморачиваться с мультиплексированием GPIO проще оставить UART2 деактивированным.
Соответственно в системе UART3 CPU отображается в /dev/ttyS1 (нумерация начинается с 0 и сдвигается на 1).
В исходном состоянии «с завода» в EFR32 прошит загрузчик и прошивка EmberZNet v6, реализующая функционал координатора.
Подготовительная часть
Для корректной работы Zigbee модуля необходима прошивка с поддержкой UART3, например вот эта.
В этой сборке дополнительно установлен и активирован модуль ser2net, который пробрасывает /dev/ttyS1 на клиентское устройство.
При желании можно портировать Zigbee2Tasmota c Sonoff zigbee gateway и собрать модуль для Openwrt (с этим еще разбираюсь, не специалист).
Шлюза Zigbee2mqtt для этого чипа пока нет, и скорее всего реализовать его в виде модуля на роутере не получится (обычно он работает в node.js, требовательного к производительности и объему памяти).
Для собирающих прошивки самостоятельно предлагаю ознакомиться с выложенными на github патчем, dts и конфигом сборки.
На текущий момент актуальная версия EmberZNet v8 и версия SDK v6.9.0 (но шить будем прошивку собранную с SDK v6.7.8).
Для прошивки понадобится любой SWD программатор
4 гибких провода (обычно идет с STLink в комплекте).
Для прошивки из Windows понадобятся драйвера ST-Link и прошивальщик EBLink (он в принципе кроссплатформенный).
1. Перепрошивка EFR32
1.1 Откройте крышку роутера, найдите контактную группу JP1.
1.2 Подпаяйте 4 провода: к GND, RST, SWCLK=PF0, SWDIO=PF1 и соедините их с соответствующими выводами программатора.
1.3 Установите драйвера для STLink программатора и убедитесь что он определился в системе.
1.4 Подайте питание на роутер (дожидаться загрузки необязательно, требуется только питание 3.3в).
1.5 Распакуйте файлы из архива в папку с исполняемым файлом eblink.exe и прошейте:
сначала bootloader
eblink.exe -I stlink,dr -S silabs-auto -P ../scripts/ -F erase,verify,run,file=BTL_STD_S1_256-COM_PA0-PA1-PD15.srec
потом прошивку
eblink.exe -I stlink,dr -S silabs-auto -P ../scripts/ -F verify,run,file=NCP_USW_115K2_S1_F256_678_PA0-PA1.srec
Отпаяйте провода.
В этой прошивке вывод PD15 (#6 контакт JP1) задействован для принудительного входа в режим bootloader (активный уровень низкий).
Для активации необходимо подключиться к UART (с настройками 115200-8-N-1, XON/XOFF) порту EFR32 локально или через проброшенный порт, замкнуть #6 контакт JP1 на GND и удерживая сбросить чип (замкнуть RST #3 контакт JP1 на GND).
В консоли отобразится меню из 3х пунктов.
Для прошивки новой версии нужно выбрать соответствующий пункт и отправить файл прошивки в режиме xmodem.
2. Настройка роутера для проброса портов
2.1 Подключитесь к роутеру по SSH
2.2 Откройте для редактирования файл /etc/ser2net.conf. По умолчанию он содержит такой конфиг:
1880:raw:0:/dev/ttyS1:115200 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS remctl
где первая цифра «1880» — номер TCP порта, который можно сменить на более удобный.
raw — режим работы порта с максимальной прозрачностью (это требуется для правильного проброса ASH — см. ниже)
0 — таймаут
/dev/ttS1:115200 — пробрасываемый порт, его скорость и доп. настройки.
2.3 После внесения изменений перезапустите службу
/etc/init.d/ser2net restart
2.4 На удаленном контроллере запустите ответный процесс для подключения к роутеру.
<code>sudo socat pty,raw,link=/dev/ttyVS1 tcp:192.168.2.1:1880, user=root,group=dialout,mode=660,forever,reuseaddr,keepalive
2.5 Проверка соединения из консоли роутера:
conntrack -E | grep sport=1880
При успехе в ответе будет нечто подобное:
[UPDATE] tcp 6 7440 ESTABLISHED src=192.168.2.3 dst=192.168.2.1 sport=53250 dport=1880 src=192.168.2.1 dst=192.168.2.3 sport=1880 dport=53250 [ASSURED]
3. Интеграция в homeassistant
Полученный в разделе 2 предыдущей статьи порт ttyVS1 с точки зрения операционной системы не является блочным устройством и не будет проброшен внутрь docker-контейнера (это особенность docker). Соответственно автоматизация «Zigbee Home Automation» этот порт автоматически не распознает и не «увидит».
Для тех кто хочет лично убедиться еще раз замечу, что для этого типа порта бесполезно создавать правила udev, скрипты автоматического подключения в rc.local и прочие обходные пути – все это не срабатывает.
Даже если бы контейнер homeassistant запускался явно (а его запуском управляет отдельный контейнер hassio-supervisor), то подстановки -v /dev/ttyVS1:/dev/ttyVS1 и/или —device-cgroup-rule ‘a *:* rwm’ в скрипт запуска docker run… все равно не сработают.
Варианты работающих костылей которые работают:
а) Использовать сервис который однократно выполнит скрипт при перезапуске сервера:
#!/bin/bash
function run_script() {
local STR
STR=$(sudo docker stats --no-stream | grep homeassistant);
if [ -n "$STR" ]; then
sleep 3;
sudo docker exec -it homeassistant bash -c "socat pty,raw,link=/dev/ttyVS1 tcp:192.168.2.1:1880,forever,reuseaddr,keepalive";
fi
}
run_script
b) Вручную в консоли после перезапуска homeassistant:
sudo docker exec -it homeassistant bash -c "socat pty,raw,link=/dev/ttyVS1 tcp:192.168.2.1:1880,forever,reuseaddr,keepalive"
К счастью оказалось что EZSP и Itead Sonoff bridge используют похожие методы подключения в интеграцию Zegbee Home Automation и допускают подключение сразу внутри docker контейнера через сокеты.
3.1 Откройте веб-интерфейс Homeassistant, перейдите в «Настройки», выберите пункт «Интеграции» и добавьте «Zigbee Home Automation». В настройке последовательного порта интеграции выберите пункт «Enter manually».
3.2 Выберите тип радиоустройства — «EZSP»
3.3 Установите настройки порта: socket://<ip адрес роутера>:<номер проброшенного TCP порта>. Скорость = 115200. и нажмите «Подтвердить».
3.4 Через несколько секунд UART порт с вашего роутера будет проброшен в контейнер, интеграция ZHA автоматически распознает тип протокола (на самом деле там ASH over UART).
3.5 После завершения настройки интеграции можно ее переименовать.
3.6 А после сопряжения всех устройств отключить опцию автоматического обнаружения.
3.7 И исправить неправильно распознанные классы устройства, так как производители оборудования кладут болтне точно соответствуют стандартам, поэтому интеграция ZHA может неправильно классифицировать подключенные устройства.
Чтобы это исправить требуется посмотреть адрес и endpoint сопряженного устройства
И вписать в файл configuration.yaml:
zha:
device_config:
11:22:33:44:55:66:77:88-1: # format: {ieee}-{endpoint_id}
type: 'switch' # corrected device type
И перезагрузить сервер.
Выражаю большую благодарность
АВАТАРА и azt59 за предоставленные трассировки и моральную помощь,
Австралийскому разработчику Gary (aka Gobasoz) за помощь с адаптацией прошивки под схему включения EFR32.
- Ремонт машинки для стрижки MOSER CHROM STYLE
- Самодельный велосипедный тензометр.
- Надёжная люстра из некачественных светодиодов.
- ESP32 декодирует команды от ИК пульта и управляет KODI JSON запросами
- Ракета-24. Вахтенные часы.
- Часы Ракета-24, вахтенные, калибр 2623Н. Отзвуки "перестройки".
- Ретро-мод. Строим слипер из PowerMac G4 MDD
- Ещё один "Хороший" производитель, который стал Плохим. Или доработка беспроводной клавиатуры Logitech K270.
- Самовосстанавливающиеся предохранители 0,65А. Время срабатывания.
- Многополосный усилитель с цифровым DSP и i2S усилительными модулями.