Альтернативная прошивка для Aqara Window Door Sensor (MCCGQ11LM)

_config.yml

Прошивка протестирована на устройстве с обозначением MCCGQ11LM. Допускаю что она подойдет для MCCGQ01LM.

Для того что бы сохранить возможность подключать датчики с новой прошивкой к родному координатору (для пользователей MiHome), все необходимые для этого идентификаторы в zigbee сети соответствуют MCCGQ11LM. Так же частично реализован функционал мануфактурного кластера 0xFF01.

Отличия

  1. В обновленной прошивке реализован механизм быстрого переподключения при потере родителя (rejoining). В оригинальной прошивке для этого нужно ждать несколько часов (по мои тестам около 7), причем генерация событий по срабатыванию геркона или нажатие на кнопку не ускоряют этот процесс.

  2. Добавлен клиентский кластер OnOff. Возможность передавать команды устройствам имеющие серверный кластер OnOff (реле, лампочки) без участия координатора (binding). Помимо передачи команды, датчик так же отправляет ReportAttribute координатору.

  3. Обновление прошивки через OTA. Обновление начинается только после уведомления со стороны OTA-сервера (Image Notify).

Режим работы

Подключение к zigbee сети производится удерживанием кнопки не менее 4 сек. Процесс поиска сопровождается миганием синего светодиода. Каналы сканируются последовательно с 11 по 26 один раз. На каждом канале отправляется по три Beacon request.

Подключившись к сети, датчик репортит мануфактурный кластер 0xff01 и после этого в течение 10 секунд находится в активном состоянии опрашивая родителя запросами Data request. Далее он переходит в спящий режим. Потребление в спящем режиме составляет около 1мкА.

Датчик просыпается раз в 20 минут. Это время не настраивается. После просыпания, он репортит кластер 0xff01, пингует родителя отправляя data request и снова засыпает.

Замыкание/размыкание геркона сопровождается однократным миганием светодиода. Если был настроен binding, то отправляется соответствующая команда. Так же репортится координатору текущее состояние кластера OnOff вне зависимости от настроект биндинга.

Короткое нажатие на кнопку сопровождается однократным миганием светодиода. Коодинатору репортится атрибут с моделью устройства Model Identifier (0x0005), это нужно для работы с MiHome, а так же репортится мануфактурный кластер 0xff01. Поведение устройства повторяет поведение оригинального устройства MCCGQ11LM.

Все команды и репорты отправляются с флагом ожидания подтверждения (Acknowledgement Request: True). В случае отсутствия подтверждения в установленное время, запрос повторяется еще 4 раза и если не стало лучше, то устройство переходит в режим переподключения (rejoining). Сканируется сеть и если будет найден координатор, либо роутер, с тем же PANID, способный принять еще одно прямое подключение, то производится подключение к нему без выхода из сети. Это сработает даже в случаи выключенного координатора, если датчик реджойнится к роутеру. Событие, которое вызвало пробуждение датчика, будет отправлено уже новому родителю.
Процесс переподключения занимает 1-4 секунды.

Если был зафиксирован момент потери родителя, но переподключится к новому не получилось (например выключили в доме электричество), то датчик засыпает и повторит попытку переподключения при следующем пробуждении.

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

Кластеры, атрибуты

Simple Descriptor
  Endpoint: 1
  Profile: Home Automation (0x0104)
  Application Device: 0x0002
  Application Version: 0x0001
  Input Cluster Count: 2
  Input Cluster List
    Input Cluster: Basic (0x0000)
      Attribute: ZCL Version (0x0000)
        Data Type: 8-Bit Unsigned Integer (0x20)
        Uint8: 1 (0x01)
      Attribute: Application Version (0x0001)
        Data Type: 8-Bit Unsigned Integer (0x20)
        Uint8: 100 (0x64)
      Attribute: Stack Version (0x0002)
        Data Type: 8-Bit Unsigned Integer (0x20)
        Uint8: 2 (0x02)
      Attribute: HW Version (0x0003)
        Data Type: 8-Bit Unsigned Integer (0x20)
        Uint8: 2 (0x02)
      Attribute: Manufacturer Name (0x0004)
        Data Type: Character String (0x42)
        String: LUMI
      Attribute: Model Identifier (0x0005)
        Data Type: Character String (0x42)
        String: lumi.sensor_magnet.aq2
      Attribute: Date Code (0x0006)
        Data Type: Character String (0x42)
        String: 20210420
      Attribute: Power Source (0x0007)
        Data Type: 8-Bit Enumeration (0x30)
        Power Source: Battery (0x03)
      Attribute: Software Build Id (0x4000)
        Data Type: Character String (0x42)
        String: 3000-0001
    Input Cluster: On/Off (0x0006)
  Output Cluster Count: 2
  Output Cluster List
    Output Cluster: OTA Upgrade (0x0019)
    Output Cluster: On/Off (0x0006)

Мне пока не удалось определить назначение некоторых значений мануфктурного кластера 0xff01 (ID 4 и ID 0xA), но основая его часть все таки реализована. Данные записаны в формате ID:DATA_TYPE:VALUE

Attribute: 0xff01
Data Type: Character String (0x42)
String: 

1d                    размер блока данных  
01 21 16 0d           uint16 напряжение батарейки 0xd16 - 3350 - 3.35 V
03 28 19              int8 температура с сенсора в JN5169 0x19 - 25 C
04 21 00 00           uint16 назначение не определено
05 21 01 00           uint16 счетчик включений датчика. Сбрасывается после выхода из сети. Хранится в PDM. 0x0001 
06 24 18 00 00 00 00  uint40 счетчик переключений геркона. Сбрасывается после выхода из сети. Хранится в PDM. 0x0000000018 - 24
0a 21 00 00           uint16 назначение не определено 
64 10 01              boolean Состояние контактов геркона. 1 - open (on), 0 - close (off)

Обновление прошивки

Переход на альтернативную прошивку необратим! Нет возможности вернуться к оригинальному состоянию.

Смена прошивки с оригинальной на альтернативную производится через bootloader. Последующие обновления прошивки можно производить через OTA.

В соответствии с распиновкой подключить UART преобразователь. Уровень сигнала TX +3.3V. Для питания можно использовать штатную батарейку. Для перевода процессора в режим перепрошивки, необходимо что бы на момент подачи питания, либо выхода из RST, сигнал /BOOT имел низкий уровень (подключен к земле).

JN5169 USB-UART
GND GND
+3.3V +3.3V
RX TX
TX RX
/BOOT GND
RST nc

_config.yml _config.yml Существует несколько программ для работы с bootloader JN5169:

Загрузка прошивки через JN51xx Production Flash Programmer выглядит так:

JN51xxProgrammer.exe -V 1 -s COM5 -P 115200 -f fw_mccgq11lm_100.bin

COM5 - номе порта;
115200 - если преобразователь позволяет, можно указать 1000000 (1М);
fw_mccgq11lm_100.bin - прошиваемый файл;

Прошивки лежат здесь

Если прошиваемый процессор не имеет Lock-бита (заменен на новый), то можно добавить ключи для верификации прошивки и стирания PDM -v --eraseeeprom=full

Документация к JN51xx Production Flash Programmer

Успешное завершение процесса _config.yml

Для запуска прошитого датчика необходимо его перезагрузить, но при этом сигнал /BOOT должен быть высоким (отключен от земли).

После первого включения необходимо очистить PDM. Для этого нажмите и удерживайте кнопку не менее 4 сек. Это приведет к выходу из сети, если в PDM что-то осталось от предыдущей прошивки, и запустит процесс поиска новой сети.

15.04.2021