Замена Aqara: CC2531 и CC2538 для организации Zigbee сети

Решил в бложике подробнее разобрать более дешевую и функциональную замену Zigbee шлюзу Xiaomi Aqara, а именно самодельные шлюзы на CC2531/CC2538 и собрать вместе заметки по доработке этого добра напильником.

Итак, изначально я развернул свою Zigbee сеть на базе шлюза от Xiaomi Aqara и даже делал заметку о том, как им пользоваться не сливая даные о себе во всякие китайские облака.

С тех пор моя Zigbee сеть существенно выросла, а косяки официального шлюза стали очень раздражать, и я решил перейти на что-то более адекватное.

Пределы возможностей Xiaomi Aqara

Когда моя сеть достигла где-то 20-25 устройств, официальный шлюз стал периодически терять вайфай, а задержка включения/выключения выключателей достигала 1-2 секунд. К тому же в паре мест дома шлюз не пробивал стенку и нужно было ставить либо розетки-роутеры либо отказываться от этой затеи.

Отдельные вопросы вызывал и режим работы с ним у homeassistant, так как режим разработчика, обеспечивающий интеграцию с homeassistant не пробрасывал некоторые события (такие как одиночной/долгое нажатие на выключатель), а с некоторые устройства вроде ZigBee ламп, вообще были недоступны.

Наконец последним и очень напряженным моментом стало появление на рынке устройств, которые заблокированы для использования в каком-то одном конкретном регионе. В итоге объединить автоматизацией в Mi Home устройства выпущенные для разных регионов нельзя. Почему? А потому что они так решили, чтобы устанавливать разные цены на устрйоства в разных регионах и увеличивать прибыль.

Исходя из всего вышесказанного волевым решением шлюз был выкинут из сети, выставлен на продажу на барахолке, а вместо него был воткнут USB свисток на базе CC2531, в дополнение к которому был развернут zigbee2mqtt.

СС2531 – Это, наверное самый простой и дешевый способ организовать Zigbee сеть. Стоит он ~5$ с доставкой, и для него есть подробная инструкция по прошивке.

И для него есть две прошивки c Z Stack Home: default и source routing. Вопрос только в том, чем они отличаются?

Если на пальцах, то обычная прошивка умеет устанавливать соединение только с бОльшим количеством устройств напрямую, но менее эффективно использует эфир и быстро затыкается на большом количестве устройств. Source Routing может напрямую подключаться только к 5 устройствам, потому рядом должны быть маршрутизаторы, которые будут собирать траффик.

Недостаток его, впрочем, в том, что теоретический максимум в 40 устройств у меня был быстро достигнут на моих 25 устройствах. Из логов стало понятно, что если произойдет момент, когда несколько устройств плюнут данными одновременно, то свисток захлебнется, а некоторые подрозетники плюются данными в сеть часто и регулярно. При большом количестве устройств также в логе zigbee2mqtt попытке щелкнуть выключателем появится сообщения вида:

failed with status '(0x10: MEM_ERROR)' (expected '(0x00: SUCCESS)'))'

И лекарством будет только полный сброс свистка отключением и включением питания.

Частично эту проблему решает прошивка source routing. Обзор этой технологии можно почитать тут. Но у нее ограничение на 5 устройств, которые подцепляются непосредственно к свистку, потому рядом должны быть zigbee устройства которые могут работать в режиме роутера (розетки, выключатели с клеммой “нуля”, и т.п.)

В моем случае source routing изменил ситуацию к лучшему, а задержка по сравнению с шлюзом Xiaomi снизилась раза в два, но все равно была заметной. Иногда датчик движения мог сработать моментально, а иногда спустя три секунды. Это раздражало, потому при случае я решил все же обновиться до CC2538.

CC2538 это более мощный вариант чипа от Ti, у которого теоретический максимум – 150+ устройств. Его можно взять за 5$ в виде модуля на плату или за 30$ уже распаяным на плате с USB. По причине лени я взял готовую плату, которую и стал дорабатывать напильником.

Добработка CC2538 напильником

Прошивка

Первый шаг, это прошивка. Официальная документация рекомендует нам воспользоваться Segger J-Link, которого у меня не было. Зато был Orange Pi Plus, OpenOCD и переходник на UART. В чипе содержится загрузчик, который позволяет прошить чип по UART, но по умолчанию выключен. Потому его надо включить через JTAG.

Инструкция нагуглилась достаточно легко, но ее, как всегда, пришлось доработать немного напильником.

Итак, шаг первый. Ищем любой поддерживаемый OpenOCD адаптер с напряжением 3.3 вольта и подключаем к железке. На модуле распиновка выглядит так:

  • JTAG TCK = cJTAG TCK – dedicated TCK pin 47.
  • JTAG TMS = cJTAG TMSC – dedicated TMS pin 46.
  • JTAG TDI – PB6 (=pin 49)
  • JTAG TDO – PB7 (=pin 48)

На отладочной плате присутствует JTAG и распиновка соответствует разъему Segger Jlink.

Я подцепил это дело к гребенке Orange PI. Так как питание было через USB, то питание я к JTAG не подцеплял вообще, на RESET тоже можно забить. Теперь оставалось найти правильные GPIO линии для всех ножек и вбить их в конфиг OpenOCD. У меня получилось как-то так:

bindto 0.0.0.0
interface sysfsgpio

sysfsgpio_tdi_num 201
sysfsgpio_tdo_num 199
sysfsgpio_tms_num 198
sysfsgpio_tck_num 200

sysfsgpio_trst_num 202


transport select jtag
reset_config none

source [ find target/cc2538.cfg ]

Сохраняем и запускаем openocd -f script.cfg, после чего мы можем подцепить как через GDB, так и telnet’ом к работающему OpenOCD.

Сначала я хотел зашить .bin при помощи OpenOCD, но как оказалось с командами для работы с флешем чипа что-то было не то, или я не разобрался до конца. Потому я отаравил две заветные команды, которые включили UART-загрузчик:

mww 0x400D300C 0x7F800
mww 0x400D3008 0x0205

Следующим шагом было подключить UART к PA0(RX) и PA1(TX) и воспользоваться прошиватором отсюда:

./cc2538-bsl.py -e -w -v ~/Downloads/JH_2538_2592_ZNP_USB_20201010.bin 

После окончания прошивки можно было втыкать плату в сервер, где у меня крутился zigbee2mqtt и радоваться жизни.

Настройка Zigbee2MQTT

Тут нам придестя заново запаривать все zigbee устройства с шлюзом и предварительно, если мы до этого пользовались zigbee2mqtt с cc2531 стиком, то поменять в секции advaced конфигурации pan_id и network_key, да и вообще удалить из data все, кроме configuraton.yaml.

Также в конфиг рекомендуют добавить вот такое вот заклинание:

queue:
   delay: 5

Существенно уменьшающую время отклика устройств.

Строим карту сети

Преимуществом стиков на CC2531/CC2538 является то, что мы можем строить карту сети прямо в HomeAssistant. Я выбрал для себя вот этот вариант. Выглядит шикарно и позволяет быстро оценить топологию сети. С официальным приложением Xiaomi оставалось только гадать на кофейной гуще что и куда не добивает.

Добавляем внешнюю антенну.

На модуле с CC2538 помимо антенны на самой плате был и IPX разъем куда можно подключить через переходник SMA антенну. Только проблема была в том, что по ходу этот разъем висел в воздухе. Переключить антенный тракт на внешнюю антенну можно при помощи паяльника и пинцета.

Вот этот конденсатор надо немного пересадить
Чтобы получилось что-то подобное

Исправляем проблему с питанием (добавлено!)

Как мне подсказал в почте Juminu уже после того, как я опубликовал этот пост, на этой плате, известной также как Sanmulink Board есть проблема с питанием из-за криворукости человека, ее рисовавшего. Подробнее можно почитать тут. При питании от кабеля USB c напряжением 5 вольт мы получаем 3.3 вольта там, где должно быть 5V, и где-то 2.7 вместо 3.3 вольт. Из-за этого мы не увидим синего светодиода и это скажется на качестве сигнала.

Было

Чтобы исправить проблему надо отпаять одну деталюшку.

Стало

Итогом стало заметное улучшение качества сигнала, который и так был выше всех похвал и затыкал шлюз от Xiaomi. Даже датчики протечки в подвале, через армированный бетон подцепились напрямую к шлюзу.

Корпусирование

Вместо 3д-печати в этот раз я взял дешевую распаячную коробку 80х80 из Леруа, в которую он отлично влез. Осталось только засверлить немного корпус и закрепить внешнюю антенну.

Заключение

Получившийся результат без проблем справился с моей сетью, а время реакции на команды стало явно ниже 100 мс. Особенно это заметно было, когда оптом переключаешь сразу несколько выключателей. Радиус действия тоже оказался выше всех похвал. На данный момент можно смело сказать, что это лучшее решение для зигби сетей умного дома, которое я пробовал. Ну а возможность объединять в одной сети устройства из разных регионов идет как дополнительный и очень приятный плюс.

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.