Как сделать умный дом своими руками, ч. 1: выбор технологий, управление светом

Работа с выключателями Xiaomi из zigbee-shepherd

Первым делом следует добавить устройство ZigBee в сеть. Для этого сначала нужно сбросить его настройки на заводские и тем самым удалить информацию о предыдущей сети, если оно было добавлено прежде. Комбинация сброса и добавления устройства для выключателей Xiaomi Aqara следующая: зажать кнопку на пять секунд, пока светодиоды не начнут мигать, после чего отпустить и ждать, когда закончится процесс добавления. Если включен дебаг, то при добавлении устройства выводится подробный лог. Добавление устройства может занять до одной минуты.

Выключатели Xiaomi Aqara на батарейках, работающие по протоколу ZigBee

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

В вики есть полное описание всех функций. Но чтобы быстрее разобраться с ними, нужно понимать программную структуру устройства.

IEEE address. каждое устройство ZigBee имеет уникальный 48 битный MAC-адрес, он зашит в девайс, и сбросить его невозможно. По MAC-адресу можно обращаться к устройству и получать информацию о нем.

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

Clusters — группа команд, которые можно отправлять устройству, например, команда genOnOff включает или выключает устройство, а если это лампа с диммером, то присутствует еще команда genLevelCtrl, которая позволяет задать уровень яркости.

Attributes. У устройства можно запросить его текущее состояние, обратившись в интересующий Cluster. Например, командой genOnOff можно узнать состояние атрибута onOff — оно может быть 0 или 1.

Выключатель Xiaomi Aqara с одной кнопкой имеет следующую структуру:

Чтобы обрабатывать нажатие кнопки, нужно отловить сообщение от выключателя. Делается это с помощью события ind. Изменим код следующим образом:

При нажатии кнопки придет сообщение:

Здесь:

  • msg.endpoints[0].device.ieeeAddr — MAC-адрес устройства;
  • msg.endpoints[0].epId — канал (endPoint) устройства;
  • msg.data — id кластера и атрибут, в данном случае выключатель прислал команду genOnOff:0.

Если проверять эти данные, то нажатием на кнопку выключателя можно будет управлять другими устройствами ZigBee по определенному алгоритму. Например, при каждом нажатии включать-выключать или только выключать группу устройств.

Zigbee-shepherd полностью поддерживает работу с диммируемыми лампами Ikea Trådfri и Philips Hue, поэтому для примера можно настроить простой алгоритм включения лампы с помощью выключателя Xiaomi Aqara.

Добавляем в код обработчик нажатия кнопки и включение лампы Ikea Trådfri на максимальную яркость:

Работаем с выключателями Xiaomi из zigbee-shepherd

img-2736.jpg

Первым делом следует добавить устройство ZigBee в сеть. Для этого сначала нужно сбросить его настройки на заводские и тем самым удалить информацию о предыдущей сети, если оно было добавлено прежде. Комбинация сброса и добавления устройства для выключателей Xiaomi Aqara следующая: зажать кнопку на пять секунд, пока светодиоды не начнут мигать, после чего отпустить и ждать, когда закончится процесс добавления. Если включен дебаг, то при добавлении устройства выводится подробный лог. Добавление устройства может занять до одной минуты.

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

В вики есть полное описание всех функций. Но чтобы быстрее разобраться с ними, нужно понимать программную структуру устройства.

IEEE address. Каждое устройство ZigBee имеет уникальный 48-битный MAC-адрес, он зашит в девайс, и сбросить его невозможно. По MAC-адресу можно обращаться к устройству и получать информацию о нем.

Endpoint. В устройстве может быть несколько функций, например датчик температуры и влажности или выключатель с двумя кнопками. Для каждой функции устройства создается отдельный Endpoint.

Clusters. Группа команд, которые можно отправлять устройству. Например, команда genOnOff включает или выключает устройство, а если это лампа с диммером, то команда genLevelCtrl позволит задать уровень яркости.

Attributes. У устройства можно запросить его текущее состояние, обратившись в интересующий Cluster. Например, командой genOnOff можно узнать состояние атрибута onOff — оно может быть 0 или 1.

Выключатель Xiaomi Aqara с одной кнопкой имеет следующую структуру:

{   "profId": 260,   "epId": 1,   "devId": 24321,   "inClusterList": [0, 3, 18, 25, 65535],   "outClusterList": [0, 3, 4, 5, 18, 25, 65535],   "clusters": {     "genBasic": {       "dir": {         "value": 3       },       "attrs": {}     },     "genIdentify": {       "dir": {         "value": 3       },       "attrs": {}     },     "genGroups": {       "dir": {         "value": 2       },       "attrs": {}     },     "genScenes": {       "dir": {         "value": 2       },       "attrs": {}     },     "genMultistateInput": {       "dir": {         "value": 3       },       "attrs": {}     },     "genOta": {       "dir": {         "value": 3       },       "attrs": {}     },     "manuSpecificCluster": {       "dir": {         "value": 3       },       "attrs": {}     }   } } 

Чтобы обрабатывать нажатие кнопки, нужно отловить сообщение от выключателя. Делается это с помощью события ind. Изменим код следующим образом:

var ZShepherd = require('zigbee-shepherd'); var zserver = new ZShepherd('/dev/ttyACM0');  zserver.on('ind', function (msg) {     console.log("msg"); });  zserver.start(function (err) {     if (err) console.log(err); }); 

При нажатии кнопки придет сообщение:

{   endpoints: [     {       isLocal: [Function],       device: [Object],       profId: 260,       epId: 1,       devId: 24321,       inClusterList: [Array],       outClusterList: [Array],       clusters: [Object],       onAfDataConfirm: null,       onAfReflectError: null,       onAfIncomingMsg: null,       onAfIncomingMsgExt: null,       onZclFoundation: null,       onZclFunctional: null,       foundation: [Function],       functional: [Function],       bind: [Function],       unbind: [Function],       read: [Function],       write: [Function],       report: [Function]     }   ],   data: {     cid: 'genOnOff',     data: {       onOff: 0     }   } } 

Здесь

  • msg.endpoints[0].device.ieeeAddr — MAC-адрес устройства;
  • msg.endpoints[0].epId — канал (endpoint) устройства;
  • msg.data — ID кластера и атрибут, в данном случае выключатель прислал команду genOnOff:0.

Если проверять эти данные, то, нажимая на кнопку выключателя, можно будет управлять другими устройствами ZigBee по определенному алгоритму. Например, при каждом нажатии включать-выключать или только выключать группу устройств.

Zigbee-shepherd полностью поддерживает работу с диммируемыми лампами Ikea Trådfri и Philips Hue, поэтому для примера можно настроить простой алгоритм включения лампы с помощью выключателя Xiaomi Aqara. Добавляем в код обработчик нажатия кнопки и включение лампы Ikea Trådfri на максимальную яркость:

var ZShepherd = require('zigbee-shepherd'); var zserver = new ZShepherd('/dev/ttyACM0');  zserver.on('ind', function (msg) {     console.log(msg);     switch (msg.type) {       case 'attReport':             var epId = msg.endpoints[0].epId;             var ieeeAddr = msg.endpoints[0].device.ieeeAddr;             var data = msg.data;             if (ieeeAddr === "0x00158d00015efcef" && epId === 1 && data.cid === "genOnOff") {               // Get lamp endpoint               var lamp = zserver.find(0x000b57fffe3298aa,1);               // Turn on lamp               lamp.functional("genLevelCtrl", "moveToLevelWithOnOff", {level: 255, transtime: 0}, function (err, rsp) {});             }             break;         default:             console.log(msg);             break;     } });  zserver.start(function (err) {     if (err) console.log(err); }); 

Новый «пастух»

1600x_image.png?1569850649После нескольких месяцев работы, Koen Kanters, автор проекта zigbee2mqtt полностью переписал nodejs-библиотеку zigbee-shepherd… и назвал ее zigbee-herdsman. Эта библиотека лежит в основе всех решений zigbee на nodejs: zigbee2mqtt, iobroker.zigbee, node-red-contrib-zigbee…

Переписано всё. Увеличена стабильность, скорость. Убрана необходимость при сопряжении жать каждые две секунды кнопку на датчиках Xiaomi.Но главное, на мой взгляд, это возможность реализации других координаторов — не на TI ZNP. Т.е. пока теоретически возможно реализовать поддержку других чипов, а не только CC253* (например на nRF52840 или deConz).

Сейчас идет тестирование нового “пастуха” и активно переписывается использование zigbee-shepherd на zigbee-herdsman в сторонних проектах.

ZigBee – описание

Первые попытки сделать «умный дом» начались много десятилетий назад. Сначала все оборудование было громоздким и неэффективным, к тому же потребляло очень много электроэнергии. По мере развития микроэлектроники компоненты умного дома становились все меньше и эффективней, а также снижалось потребление ими электричества. Затем от проводных сетей произошел переход к беспроводным, которые обладали существенным достоинством – их можно было прокладывать, не портя отделку и дизайн помещений.

Однако беспроводные устройства не могли долго работать без внешнего источника питания, что существенно снижало возможности по их использованию. Высокое энергопотребление было следствием огромной производительности, которая зачастую была избыточной. Поэтому появилась нужда в новом протоколе и стандарте, которые бы идеально подходили для сетей нижнего уровня. От таких сетей не требуют высокой скорости передачи данных, ведь их задача передавать сигналы на включение и выключение конкретных устройств с максимальной надежностью и минимальным энергопотреблением. Так и появился ZigBee.

Как-работает-ZigBee-сеть.jpg
Как работает ZigBee сеть

Ставим сервер zigbee-shepherd на Raspberry Pi Zero W

Установка zigbee-shepherd и сопутствующих пакетов будет проводиться на последней версии ОС Raspbian для Raspberry Pi Zero W — Stretch.

Zigbee-shepherd написан на JavaScript и работает на Node.js. Для начала ставим Node.js:

$ wget -O - https://raw.githubusercontent.com/sdesalas/node-pi-zero/master/install-node-v.lts.sh | bash` 

Для установки расширений из npm нужно установить утилиты для сборки:

$ sudo apt-get install -y build-essential 

И сама установка zigbee-shepherd:

$ npm install zigbee-shepherd - -save 

Проверить, правильно ли работает zigbee-shepherd, можно, запустив скрипт zigbee-server.js. Во время работы скрипт выводит информацию о каждом этапе добавления устройства и время выполнения операции.

var ZShepherd = require('zigbee-shepherd'); // Create a ZigBee server var zserver = new ZShepherd('/dev/ttyACM0'); zserver.on('ready', function () {     console.log('Server is ready. Allow devices to join the network within 60 seconds');     zserver.permitJoin(60); }); zserver.on('permitJoining', function (joinTimeLeft) {     console.log(joinTimeLeft); }); // Start the server zserver.start(function (err) {     if (err) console.log(err); }); 

Запускаем zigbee-shepherd в режиме отладки:

$ sudo DEBUG=* node zigbee-server.js 

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий