Это четвертая статья цикла про подключение беспроводных Zigbee-устройств к контроллеру Wiren Board, ссылки на предыдущие:
«Облачный умный дом: что нужно знать, чтобы избежать проблем» — о преимуществах и недостатках облачных решений, а также о проблемах, с которыми за последние месяцы пришлось столкнуться пользователям разных облаков.
«Слезаем с облачной иглы Aqara и подключаем устройства к контроллеру Wiren Board» — про облако Aqara и альтернативу в виде контроллера Wiren Biard с оболочкой Sprut.hub.
«Работаем с Zigbee-устройствами через Zigbee2mqtt и Node-RED» — про открытые бесплатные решения Zigbee2mqtt и Node-RED.
В этой статье я расскажу, как подключить Zigbee-устройства к контроллеру Wiren Board 7 через Zigbee2mqtt, а также напишу несколько сценариев на встроенном в контроллер движке правил wb-rules.
Установка модуля Zigbee WBE2R-R-ZIGBEE v.2
Я установил модуль WBE2R-R-ZIGBEE v.2 в слот MOD1 контроллера Wiren Board 7, следуя руководству по настройке. Подробно процесс описывать я не буду, чтобы не повторяться.
Проблем при установке не возникло.
Следующий этап — добавление в конфигурацию контроллера. Достаточно перейти в пункт «Настройки» — «Конфигурационные файлы» — «Модули расширения и порты», после чего для «Внутреннего слота 1» указать тип модуля WBE2R-R-ZIGBEE. Обмен данными осуществляется через последовательный порт /dev/ttyMOD1.
Подключение устройств Zigbee
Следующий этап — подключение устройств Zigbee к контроллеру Wiren Board. Он тоже хорошо описан в руководстве, поэтому пробегусь лишь вкратце.
Сначала следует установить пакет zigbee2mqtt командой
apt update && apt install zigbee2mqtt
Затем внести рекомендуемые в руководстве настройки в файл конфигурации.
Последний этап — конвертер wb-zigbee2mqtt, который установился автоматически. Устройства Zigbee будут добавлены на вкладку Devices в веб-интерфейсе контроллера.
После включения кнопки Permit Join можно добавлять устройства путем их сброса, как я делал раньше.
Устройства появляются в списке Wiren Board, но под названиями, не слишком дружественными к пользователю. Поэтому через файл configuration.yaml можно изменить названия, что я и сделал. Процесс хорошо описан в документации.
В итоге я успешно подключил все четыре устройства Aqara и задал им понятные имена Lamp, Socket, Motion Sensor, Temperature Sensor.
Через web-интерфейс контроллера Wiren Board 7 управлять устройствами Zigbee нельзя, следует использовать скрипты wb-rules.
Сценарии автоматизации
Настало время написать скрипты wb-rules. Базовая информация о скриптах доступна здесь. Там же приведены примеры термостата и темной комнаты.
Мне потребовался интерфейс Wiren Board, который доступен по IP-адресу. В нем есть полезное меню «Настройки» – «Каналы MQTT», где можно посмотреть все доступные устройства, контролы и темы MQTT. Там же приводятся текущие значения.
Сами скрипты задаются в пункте правила.
Сценарий термостата
Для сценария термостата я буду использовать пример скрипта с условием. Я подсмотрел такой скрипт в примерах Max Motion, скрипт термостата мне показался слишком сложным.
Я использовал значение температуры Temperature Sensor/temperature, по которому сделал условное ветвление. Если температура меньше 19 градусов, то включаю розетку. Иначе проверяю, что температура больше 23 градусов, тогда выключаю розетку. Если температура находится в диапазоне между 19 и 23 градусами, то ничего не делаю.
Я успешно написал скрипт на wb-rules. Конвертер wb-zigbee2mqtt позволяет снимать информацию с датчиков привычным способом, но вот управление устройствами Zigbee через него пока не реализовано. Поэтому вместо команды
dev["Socket/set"] = 'ON';
необходимо публиковать MQTT сообщения при помощи команды publish
publish("zigbee2mqtt/Socket/set", JSON.stringify({ state: "ON" }), 2, false);
Ниже представлен полный скрипт.
defineRule('Termostat', {
whenChanged: "Temperature Sensor/temperature",
then: function(newValue, devName, cellName) {
if (newValue < 19) {
publish("zigbee2mqtt/Socket/set", JSON.stringify({ state: "ON" }), 2, false);
} else {
if (newValue > 23) {
publish("zigbee2mqtt/Socket/set", JSON.stringify({ state: "OFF" }), 2, false);
}
}
}
});
Сценарий темной комнаты
Второй сценарий — включение света при наличии движения и освещенности меньше порогового уровня. Чтобы было проще, сначала я сделал скрипт без учета освещенности, таймер я выставил на две минуты. Алгоритм следующий:
Если движение есть (датчик выслал true), то включаем лампу, сбрасываем таймер.
Если движения нет (датчик выслал false), то ставим задержку, а после ее истечения выключаем лампу. Если во время задержки будет определено движение, то таймер сбросится.
Проблема в том, что датчик высылает true или false как текст, что несколько усложнило написание скрипта, но методом проб и ошибок я нашел правильную строку. В качестве основы я использовал скрипт «Детектор движения c таймаутом» на странице примеров.
var motion_timer_1_timeout_ms = 120 * 1000;
var motion_timer_1_id = null;
defineRule("motion_detector_1", {
whenChanged: "Motion Sensor/occupancy",
then: function (newValue, devName, cellName) {
if (newValue == "true") {
publish("zigbee2mqtt/Lamp/set", JSON.stringify({ state: "ON" }), 2, false);
if (motion_timer_1_id) {
clearTimeout(motion_timer_1_id);
}
}
else {
motion_timer_1_id = setTimeout(function () {
publish("zigbee2mqtt/Lamp/set", JSON.stringify({ state: "OFF" }), 2, false);
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
},
});
Для темной комнаты приведенного выше скрипта достаточно. Но допустим, нам нужно включать лампу при наличии движения на веранде или в коридоре с окнами, причем только в темноте или сумерках. Сначала нужно выбрать пороговый уровень включения датчика. Он должен быть ниже освещенности от солнечного света, чтобы днем датчик не срабатывал. Но уровень должен быть выше освещенности от ламп, чтобы датчик продолжал срабатывать после их включения (допустим, в коридоре продолжается движение на протяжении десяти минут, свет должен гореть). Я взял за порог 100 люкс и добавил в скрипт еще одно условие. Датчик движения будет работать только при яркости меньше 100 люкс. Если яркость больше 100 люкс, то через таймер лампа выключится. Вы можете добавить любое другое условие, исходя из конфигурации вашего умного дома.
var motion_timer_1_timeout_ms = 120 * 1000;
var motion_timer_1_id = null;
defineRule("motion_detector_1", {
whenChanged: "Motion Sensor/occupancy",
then: function (newValue, devName, cellName) {
if (dev["Motion Sensor/illuminance"] < 100) {
if (newValue == "true") {
publish("zigbee2mqtt/Lamp/set", JSON.stringify({ state: "ON" }), 2, false);
if (motion_timer_1_id) {
clearTimeout(motion_timer_1_id);
}
}
else {
motion_timer_1_id = setTimeout(function () {
publish("zigbee2mqtt/Lamp/set", JSON.stringify({ state: "OFF" }), 2, false);
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
}
else {
motion_timer_1_id = setTimeout(function () {
publish("zigbee2mqtt/Lamp/set", JSON.stringify({ state: "OFF" }), 2, false);
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
},
});
Сценарий реле
Два сценария выше описывают работу беспроводных устройств Zigbee с контроллером Wiren Board, но почему бы не добавить проводные модули? В моем тестовом чемодане установлен модуль реле WB-MR6C v.2, к трем каналам которого (K1, K2, K3) штатно подключены индикаторы трех кнопок.
Команду на включение реле я подглядел в статье с примерами. Название топика нашел в web-интерфейсе контроллера «Настройки» - «Каналы MQTT».
var motion_timer_1_timeout_ms = 120 * 1000;
var motion_timer_1_id = null;
defineRule("motion_detector_1", {
whenChanged: "Motion Sensor/occupancy",
then: function (newValue, devName, cellName) {
if (dev["Motion Sensor/illuminance"] < 100) {
if (newValue == "true") {
publish("zigbee2mqtt/Lamp/set", JSON.stringify({ state: "ON" }), 2, false);
dev["wb-mr6c_46/K1"] = true;
dev["wb-mr6c_46/K2"] = true;
dev["wb-mr6c_46/K3"] = true;
if (motion_timer_1_id) {
clearTimeout(motion_timer_1_id);
}
}
else {
motion_timer_1_id = setTimeout(function () {
publish("zigbee2mqtt/Lamp/set", JSON.stringify({ state: "OFF" }), 2, false);
dev["wb-mr6c_46/K1"] = false;
dev["wb-mr6c_46/K2"] = false;
dev["wb-mr6c_46/K3"] = false;
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
}
else {
motion_timer_1_id = setTimeout(function () {
publish("zigbee2mqtt/Lamp/set", JSON.stringify({ state: "OFF" }), 2, false);
dev["wb-mr6c_46/K1"] = false;
dev["wb-mr6c_46/K2"] = false;
dev["wb-mr6c_46/K3"] = false;
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
},
});
В итоге код работал успешно, вместе с лампой срабатывали три канала реле. В моем случае к ним подключены простые индикаторы, но это могут быть любые другие устройства.
Заключение
Оказалось, что писать скрипты на движке правил wb-rules отнюдь не сложно. Есть страница с примерами, я взял несколько скриптов и отредактировал их под нужные мне параметры и устройства. Конечно, пришлось повозиться несколько часов, но метод проб и ошибок в конечном итоге дал правильный результат.
Ранее я попробовал визуальные среды Sprut.hub и Node-RED, которые многим пользователям будет проще освоить. Они не менее эффективно решают поставленные мной задачи. Но можно попробовать написать скрипты wb-rules — ничего сложного в этом нет. В конечном итоге выбирайте тот вариант, который подходит вам лучше всего.
Пишите в комментариях, что вам было бы интересно узнать про взаимодействие с другими проводными и беспроводными устройствами.