
Все действия в статье будут проводиться со следующим набором оборудования:
- Raspberry Pi 3 B+ (OS Raspbian)
- CC2531 Dongle (Прошитый)
- Устройства Xiaomi (wireless switch, temperature & humidity sensor...)
- MacBook Pro (OSX 10.14)
Инструкции по прошивке CC2531 на русском языке есть тут (через Pi) и тут (через CCDebuger).
Схематично всю цепочку работы можно изобразить так:

Теперь по порядку.
После прошивки модема необходимо установить MQTT брокер (если еще не установлен).
Я использую Mosquitto, устанавливается так:
sudo apt install -y mosquitto mosquitto-clients #устанавка
sudo services mosquitto start # запуск
sudo systemctl enable mosquitto.service #автозапускБолее подробную инструкцию по настройке можно посмотреть тут.
Теперь необходимо установить сервис zigbee2mqtt, который взаимодействует с модемом CC2531 и передает данные в Mosquitto:
sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
sudo chown -R pi:pi /opt/zigbee2mqtt
cd /opt/zigbee2mqtt
npm installДля того чтобы запускать zigbee2mqtt как сервис, необходимо создать файл:
/etc/systemd/system/zigbee2mqtt.service[Unit]
Description=zigbee2mqtt
After=network.target
[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.targetЕсли у вас уже был установлен MQTT брокер то прописать правильные параметры подключения к нему нужно в файле:
/opt/zigbee2mqtt/data/configuration.yamlЗапускаем сервис и добавляем его в автозапуск:
sudo systemctl start zigbee2mqtt
sudo systemctl enable zigbee2mqtt.serviceСмотрим лог:
sudo journalctl -u zigbee2mqtt.service -f`permit_join` set to  `true` in configuration.yaml.
Allowing new devices to join.
Set `permit_join` to `false` once you joined all devices.
Zigbee: allowing new devices to join.
Connecting to MQTT server at mqtt://localhost
zigbee-shepherd ready
Connected to MQTT serverМожно приступать к интеграции с homebridge. На ресурсе zigbee2mqtt.io есть список поддерживаемых устройств и инструкции по созданию пары. Для примера рассмотрим добавление Xiaomi Wireless Switch.

Для просмотра событий в Mosquitto воспользуемся программой MQTT Explorer. Запускаем, вводим адрес MQTT сервера, в моем случае он расположен по адресу
192.168.1.104. Если все установлено правильно, то в дереве увидим ветку zigbee2mqtt. Переходим в нее. Теперь на Xiaomi Wireless Switch зажимаем кнопку Reset до появления мигания диода (около 5 секунд). Примерно через 10 секунд в ветке zigbee2mqtt мы увидим наше устройство и данные которое оно передает.Если этого не происходит, то после появления мигания диода, попробуйте однократно нажимать Reset с периодичностью в секунду. Должно получиться так:

Разберем данные:
{
  "linkquality":110,
  "battery":100,
  "voltage":3052,
  "click":"single"
}Поле Click содержит тип нажатия, их может быть пять:
Click, double click, triple click, long, long_releaseДанные получать научились, теперь добавим Xiaomi Wireless Switch в homebrdige. Для взаимодействия с MQTT воспользуемся модулем homebridge-mqttthing. Устанавливается так же, как и другие:
(sudo) npm install -g homebridge-mqttthingМодуль поддерживает большое количество классов устройств начиная с выключателей и заканчивая термостатами. Для Xiaomi Wireless Switch больше всего подходит класс
StatelessProgramableSwitch. Для добавления нужно знать Topic (0x00158d00022c85ea) и названия команд. Получается вот такой конфиг:{
       "accessory": "mqttthing",
       "type": "statelessProgrammableSwitch",
        "name": "Xiaomi Single Button",
        "topics": {
            "getSwitch": {
               "topic": "zigbee2mqtt/0x00158d00022c85ea",
                "apply": "return JSON.parse(message).click;"
            }
        },
        "switchValues": [
            "single",
            "double",
             "long_release"
        ]
}По аналогии я добавил:
"accessories": 
[
    {
        "accessory": "mqttthing",
        "type": "occupancySensor",
        "name": "Xiaomi Occupancy Sencor",
        "topics": {
            "getOccupancyDetected": {
                "topic": "zigbee2mqtt/0x00158d000236b492",
                "apply": "return JSON.parse(message).occupancy;"
            }
        },
        "integerValue": true
    },
    {
        "accessory": "mqttthing",
        "type": "contactSensor",
        "name": "Xiaomi Contatc Sencor",
        "topics": {
            "getContactSensorState": {
                "topic": "zigbee2mqtt/0x00158d000278db8c",
                "apply": "return !JSON.parse(message).contact;"
            }
        },
        "integerValue": true
    },
    {
        "accessory": "mqttthing",
        "type": "statelessProgrammableSwitch",
        "name": "Xiaomi Single Button",
        "topics": {
            "getSwitch": {
                "topic": "zigbee2mqtt/0x00158d00022c85ea",
                "apply": "return JSON.parse(message).click;"
            }
        },
        "switchValues": [
            "single",
            "double",
           "long_release"
        ]
    },
    {
        "accessory": "mqttthing",
        "type": "temperatureSensor",
        "name": "Xiaomi Temperature Sencor",
        "topics": {
            "getCurrentTemperature": {
                "topic": "zigbee2mqtt/0x00158d000201842c",
                "apply": "return parseFloat(JSON.parse(message).temperature);"
            }
        },
        "history": true
    },
    {
        "accessory": "mqttthing",
        "type": "humiditySensor",
        "name": "Xiaomi Humidity Sencor",
        "topics": {
            "getCurrentRelativeHumidity": {
                "topic": "zigbee2mqtt/0x00158d000201842c",
                "apply": "return parseFloat(JSON.parse(message).humidity);"
            }
        },
        "history": true
    }
]Проверяем:

Раньше я использовал модуль homebridge-mi-aqara, который добавляет ZigBee устройства, взаимодействуя с Xiaomi Gateway. При отказе от Gateway уменьшилось время отклика устройств, вдобавок я избавился от устройства которое сидит на моем WiFi и постоянно лезет в интернет.
Комментарии (12)
 - dalamber_sign06.08.2019 13:43- Со шлюзом Xiaomi по крайней мере у меня еще такая проблема — когда он надолго теряет соединение, например из-за перезагрузки роутера, то виснет. Соответственно, все кнопки, лампы зарегистрированные на шлюзе становятся неуправляемыми до его перезагрузки  - guinmoon Автор06.08.2019 14:20- Я тут недавно все свои умные девайсы перевел на RaspAP и лишил ее интернета. Все работало, но оказалось что если Xiaomi Gateway не может несколько часов выйти в интернет то он СВОЮ подсветку выключает. Вот это меня очень удивило, он типа обиделся или что?  - kvvv06.08.2019 19:17- Так воот почему она выключалась) Значит не я один такой. Я думал это только мой шлюз так чудит. И спасибо за ссылку о прошивке cc2531 на мой блог, приятно)  - guinmoon Автор06.08.2019 20:30- Обращайтесь) Это очень хорошо, что статьи появляются на русском языке. Хоть английский и является неотъемлемой частью мира IT, в некоторых моментах, когда сталкиваешься с тем чего ни разу не делал (например прошивка модема), быстрее дойдет если прочитать на родном языке. 
 
 
 
 - PhoenixMSTU06.08.2019 14:04- Отличное решение, спасибо! У меня тоже датчики xiaomi, заведены в mqtt через xiaomi gataway с помощью github.com/illxi/mihome с небольшими изменениями. Оказалось очень надёжным решением, ни разу за два года датчики не вылетали. 
 - dalamber_sign06.08.2019 17:29- Получается шлюз все равно нужен для добавления новых датчиков / кнопок?  - guinmoon Автор06.08.2019 20:28- Нет. Они все добавятся в брокер, а посмотреть их можно в MQTT Explorer. Нужно датчики перевести в режим «паринга», у каждого по разному, где то Reset на 5 сек зажать, где то саму кнопку включения. P.S. Гифку которая вас смутила я поправил. 
 
 - kirovilya06.08.2019 23:07+1- Есть альтернатива описанному подходу — плагин для homebridge github.com/itsmepetrov/homebridge-zigbee но он поддерживает меньше устройств, чем z2m. 
 
 Напомню про русскоязычное сообщество по Zigbee в телеграме t.me/zigbeer которое подобными же вещами занимается. - guinmoon Автор06.08.2019 23:21- Спасибо за информацию про сообщество. Про плагин слышал, но решил копнуть чуть глубже. 
 
 - Ungla07.08.2019 16:59- Если кому-нибудь будет интересно, то HomeAssistant поддерживает HomeKit из коробки, как и множество zigbee устройств. 
 
           
 
dalamber_sign
Или наоборот скорость увеличилась, а время отклика уменьшилось?
guinmoon Автор
Мой косяк. Опечатался. Уже исправил.