Это четвертая статья цикла про подключение беспроводных Zigbee-устройств к контроллеру Wiren Board, ссылки на предыдущие:

В этой статье я расскажу, как подключить Zigbee-устройства к контроллеру Wiren Board 7 через Zigbee2mqtt, а также напишу несколько сценариев на встроенном в контроллер движке правил wb-rules.

Установка модуля Zigbee WBE2R-R-ZIGBEE v.2

Я установил модуль WBE2R-R-ZIGBEE v.2 в слот MOD1 контроллера Wiren Board 7, следуя руководству по настройке. Подробно процесс описывать я не буду, чтобы не повторяться.

Модуль Zigbee WBE2R-R-ZIGBEE v.2
Модуль Zigbee WBE2R-R-ZIGBEE v.2

Проблем при установке не возникло.

Следующий этап — добавление в конфигурацию контроллера. Достаточно перейти в пункт «Настройки» — «Конфигурационные файлы» — «Модули расширения и порты», после чего для «Внутреннего слота 1» указать тип модуля WBE2R-R-ZIGBEE. Обмен данными осуществляется через последовательный порт /dev/ttyMOD1.

Добавляю модуль в интерфейсе контроллера Wiren Board 7
Добавляю модуль в интерфейсе контроллера Wiren Board 7

Подключение устройств Zigbee

Следующий этап — подключение устройств Zigbee к контроллеру Wiren Board. Он тоже хорошо описан в руководстве, поэтому пробегусь лишь вкратце.

Сначала следует установить пакет zigbee2mqtt командой

apt update && apt install zigbee2mqtt

Затем внести рекомендуемые в руководстве настройки в файл конфигурации.

Редактируем файл configuration.yaml
Редактируем файл configuration.yaml

Последний этап — конвертер wb-zigbee2mqtt, который установился автоматически. Устройства Zigbee будут добавлены на вкладку Devices в веб-интерфейсе контроллера.

Интерфейс zigbee2mqtt
Интерфейс zigbee2mqtt

После включения кнопки Permit Join можно добавлять устройства путем их сброса, как я делал раньше.

Датчик движения под номером
Датчик движения под номером

Устройства появляются в списке Wiren Board, но под названиями, не слишком дружественными к пользователю. Поэтому через файл configuration.yaml можно изменить названия, что я и сделал. Процесс хорошо описан в документации.

Теперь у датчика движения появилось название
Теперь у датчика движения появилось название

В итоге я успешно подключил все четыре устройства Aqara и задал им понятные имена Lamp, Socket, Motion Sensor, Temperature Sensor.

Файл configuration.yaml с дружественными к пользователю названиями
Файл configuration.yaml с дружественными к пользователю названиями

Через web-интерфейс контроллера Wiren Board 7 управлять устройствами Zigbee нельзя, следует использовать скрипты wb-rules.

Сценарии автоматизации

Настало время написать скрипты wb-rules. Базовая информация о скриптах доступна здесь. Там же приведены примеры термостата и темной комнаты.

Мне потребовался интерфейс Wiren Board, который доступен по IP-адресу. В нем есть полезное меню «Настройки» – «Каналы MQTT», где можно посмотреть все доступные устройства, контролы и темы MQTT. Там же приводятся текущие значения.

Каналы MQTT
Каналы MQTT

Сами скрипты задаются в пункте правила.

Правила
Правила

Сценарий термостата

Для сценария термостата я буду использовать пример скрипта с условием. Я подсмотрел такой скрипт в примерах Max Motion, скрипт термостата мне показался слишком сложным.

Датчик влажности и температуры Aqara Temperature and Humidity Sensor
Датчик влажности и температуры Aqara Temperature and Humidity Sensor
Умная розетка Aqara Smart Plug
Умная розетка Aqara Smart Plug

Я использовал значение температуры 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), то ставим задержку, а после ее истечения выключаем лампу. Если во время задержки будет определено движение, то таймер сбросится.

Датчик движения Aqara Motion Sensor
Датчик движения Aqara Motion Sensor
Умная лампа Aqara LED Light Bulb, E27, 9Вт
Умная лампа Aqara LED Light Bulb, E27, 9Вт

Проблема в том, что датчик высылает 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) штатно подключены индикаторы трех кнопок.

Схема тестового чемодана
Схема тестового чемодана
Кольцевые индикаторы кнопок
Кольцевые индикаторы кнопок
Модули в тестовом чемодане, в том числе релейный WB-MR6C v.2
Модули в тестовом чемодане, в том числе релейный WB-MR6C v.2

Команду на включение  реле я подглядел в статье с примерами. Название топика нашел в 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 — ничего сложного в этом нет. В конечном итоге выбирайте тот вариант, который подходит вам лучше всего.

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

Комментарии (0)