Умный дом на Wiren Board и Node-RED: ещё три полезных сценария без программирования

Привет, хабровчане! С вами снова Дмитрий, и не будучи программистом я пробую настроить автоматизацию дома через визуальную среду Node-RED. В первой статье я настроил сценарии мастер-выключателя, включения вытяжки при превышении концентрации CO₂, и собрал приборную панель (dashboard) на основе Wiren Board 7 и Node-RED.

a7b8af585d62674065fae2adbef4f128.jpeg

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

Сценарий 5: термостат (теплый пол и батареи)

В первой части статьи я показал, как можно снять информацию с датчика температуры, который будет отсылать ее при изменении. В тестовом чемодане есть три датчика температуры: в модуле WB-MSW v. 3 и два DS18B20, подключённых к преобразователю WB-M1W2. Отмечу, что датчики DS18B20 1-Wire отлично подходят для теплых полов.

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

На фото показаны два датчика DS18B20 и преобразователь WB-M1W2. Датчики DS18B20 нужно монтировать в трубке в стяжку.

Для учета информации трех датчиков их достаточно выбрать в ноде wb-input, после чего отобразится, что она учитывает три канала.

f09d0876ecc78d0f33eae4fcdbadc60f.png

Обратите внимание в правую часть окна на вкладку «жучка». Хорошо видно, что мы получаем информацию с трех датчиков. Для получения среднего значения я добавлю ноду change, которая меняет значения msg.payload и добавлю изменение на msg.math.avg, что соответствует среднему значению.

ddb0cf771c7b737dc3c6a7d648fce12a.png

Теперь мы получаем среднее значение температуры с трех датчиков. Осталось запрограммировать включение теплого пола, для управления которым мы будем использовать канал K1 модуля реле  WB-MR6C v. 2. К этому каналу в демо-чемодане подключена лампа одной из кнопок.

Например, мы будем включать теплый пол при охлаждении помещения до 18 °C, а выключать — при нагреве до 23 °C. Не забудьте выбрать тип msg.payload — численное значение, а не строку символов (меняется слева от поля значения).

edb53f978af3dfb87422a25ffcd68f27.png

Добавим ноду ветвления Switch. Верхнее ветвление — включение нагрева, нижнее — выключение. Для включения теплого пола мы добавляем ноду change и меняем значение msg.payload (численное!) на 1. Для выключения добавляем такую же ноду change к нижнему ветвлению со значением 0.

f3bf3da3053e7e2229577aeab879d078.png9d8fc2f32b3c3ec1e626fa8d289ad21f.png

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

Допустим, в комнате есть терморегулятор батареи, который может получать значение от 0 (закрыт) до 100 (открыт) и пропорционально нагревать комнату. Нет ничего проще! Мы вновь берем ноду wb-input, в свойствах указываем нужный датчик температуры (в данном случае WB-MSW). Затем добавляем ноду ветвления switch и указываем три условия.

Например, при температуре ниже 20 °С — заслонка открыта на 100%, при температуре от 20 до 23 °С — на 70%, а выше 23 °С — на 50%.

3106880f75aa9e6566402af7e8d211fd.png

В каждом случае мы воспользуемся нодой change, которая отправит на терморегулятор значение 100, 70 или 50. Не забывайте выставлять поле с числом, а не строкой! В нашем случае мы подключили не терморегулятор, а лампу накаливания, которую можно диммировать. Лампа подключена к первому каналу модуля  WB-MDM3.

a82f978421927b8353797c99d94ce3fa.png

Данный этап можно повторить для всех терморегуляторов в доме.

Ура! Мы настроили работу теплого пола и батареи! И без единой строчки кода, как я и обещал.

Сценарий 6: свет день/ночь

Здесь я рассмотрю два базовых сценария. Первый: дежурное освещение во дворе, которое буду включать ночью и выключать днем по датчику освещения или по астрономическому времени восхода и заката. Второй: освещение в помещении. Здесь я буду включать белый свет с 7 утра до 23 вечера, а в остальное время будет гореть красное дежурное освещение.

d848de703a02adb2f75457f0b7ac1093.jpeg

Начнем с освещения во дворе. Сначала самый простой вариант — по астрономическому времени восхода и заката. Здесь я установил дополнительную ноду Big Timer (node-red-contrib-bigtimer) через главное меню — управление палитрой — установить.

604e2f1bcee184748aca87382e7931b3.png

В настройках ноды важно указать широту (Latitude) и долготу (Longitude) вашего места. В верхней строчке On Time выставляется время включения ноды, в нашем случае от заката (Sunset) до восхода (Sunrise). Затем достаточно подключиться к среднему выходу ноды Big Timer, во включенном состоянии (ночью) нода будет каждую минуту отсылать 1, в выключенном (от восхода до заката) — 0.

782770fcf206c4a6bc7bdca617e6811e.png

Больше ничего в Big Timer настраивать не надо. Затем просто добавляем ноду wb-out с выключателем освещения, в нашем случае — лампочка K1 на модуле WB-MDM3.

74792a3c72bbea029ad49b91ef3d06cb.png

Второй вариант — по датчику освещения. Здесь я воспользуюсь датчиком WB-MSW v. 3.

6675e7f827de267bdbd73dab6321c0bd.png

У датчика нам нужен параметр освещенности Illuminance, его я буду получать через ноду wb-input. Затем я добавлю ноду ветвления Switch, при освещенности меньше 10 я буду включать свет (нода change на 1), при освещенности больше 30 — выключать свет (нода change на 0). Не забываем указывать численный тип!

d74c1961572f1144eacca1f1605bb190.png

Последним шагом добавляю ноды wb-out с включением света и изменение значения 0 или 1 через ноду change. В нашем случае — лампочка K1 на модуле WB-MDM3. На этом все!

2eb5d3fd428701a1e96a94f24f835662.png

Осталось настроить освещение в помещении. Здесь я вновь воспользуюсь универсальной нодой Big Timer, для которой выставлю время включения с 7:00 утра до 23:00 вечера. При выставлении времени следует учитывать часовой пояс.

4d5a9efaa090442d6bcf229050ba92c3.pnge675b1719d19d8372bb883ff8fafcb7a.png

Следующий шаг — нода ветвления, верхний путь будет выбран при 1 (днем), нижний — при 0 (ночью). Днем мне нужно включить ленту RGB и выставить белый свет. Ночью я включаю ленту RGB и устанавливают красный свет. Включение ленты выполняется через ноду wb-out и устройство WB-LED (WB-MRGBW-D), значение 1 соответствует включению, 0 — выключению.

8eac2fa119c2ac60333b189af937eee0.png691c1aeb30b8ab7bf66c27dd83febcf7.png

Также через ноду wb-out я задаю оттенок RGB Palette. Здесь строка 255;255;255 — это белый цвет, а 255;0;0 — красный. Данные значения будут выставлять ноды change, после чего передавать его на устройство RGB Palette в ноде wb-out.

ca29341b1ab8ef77ef05577c33a44da5.png

На этом все готово, мы настроили свет в помещении по расписанию.

Сценарий 7: темная комната

Темная комната — помещение без естественных источников освещения. Основная задача сценария «темная комната» заключается в автоматическом включении/выключении света в помещении на основе двух устройств: датчика движения и датчика открытия двери.

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

ef6b9629eeb8955a7ddd7543c15d4a06.jpeg

Логика следующая.

  1. Дверь открыта, движение есть (зашли в ванную помыть руки) — таймер на 2 минуты. Каждый раз, когда датчик фиксирует движение, таймер обновляется

  2. Дверь закрыта, движение есть (зашли в ванную помыться) — таймер на 15 минут

  3. Дверь открыта, движения нет (уходите из ванной не закрыв дверь) — таймер на 2 минуты

  4. Дверь закрыта, движения нет (ушли и закрыли дверь) — таймер на 5 минут

Начнем с ноды Inject, которая будет каждую секунду опрашивать наши датчики. В качестве датчика двери я использовал тумблер QF3 тестового чемодана. Открытое состояние тумблера будет означать открытую дверь, закрытое — закрытую. В вашем случае наверняка будет использовать геркон с теми же двумя состояниями.

Я добавил ноду wb.get для опроса нашего «геркона», роль которого выполняет тумблер QF3. Затем выполняется ветвление. Верхняя ветка означает открытую дверь, нижняя — закрытую.

d26abb5c0e706bc9b6cd1e095615a2d8.png

Затем нам нужна информация о движении. Для этого я опрошу датчик движения модуля WB-MSW v. 3 через ноду wb.get. Если он выдает больше 20, то движение есть (верхняя ветка), если меньше 20 — движения нет (верхняя ветка). Чтобы предусмотреть все четыре возможных варианта, мне понадобятся две ноды wb.get по двум веткам, следующим от датчика двери.

9129fc765b0a2b664ff0351d82fea2a1.png

Самая верхняя ветка: дверь открыта, движение есть (зашли в ванную помыть руки). Здесь я добавлю ноду Trigger, которая будет отправлять 1 на лампу и ждать 2 минуты, после чего отправлять на лампу 0. При этом я поставил галочку «продлить при поступлении нового сообщения». Она позволит сбросить триггер при поступлении информации о движении, то есть увеличить время ожидания еще на две минуты.

e4493cd6100ad0252475c52dc801b9a2.png

Остается подключить к триггеру лампу, и верхняя ветка готова.

Следующая ветка: дверь открыта, движения нет (уходите из ванной не закрыв дверь). Здесь я добавляю задержку 2 минуты с помощью ноды Delay. После этого я еще раз опрошу датчик движения, и если движения не будет, то выключу лампу. Повторный опрос нужен, чтобы избежать ситуации с выключением света по верхней ветке, поскольку информация по нижней ветке будет идти с 2-минутной задержкой. То есть две минуты назад движения не было, сработает нижняя ветка, даже если прямо сейчас движение появилось.

aa4624c14368f3f6faa3d9cf77dfc6df.png

Следующий сценарий: дверь закрыта, движение есть (зашли в ванную помыться) — таймер на 15 минут. Здесь я использовал ноду Trigger, но без продления при получении информации о движении. Все же 15 минут будет достаточно для всего. Через 15 минут свет выключается.

437f1eeacc8cd82df296f55a243676c8.png

Если же человек выйдет раньше, то здесь поможет четвертый сценарий, выключающий свет через 5 минут после последнего определения движения. Меньше ставить не очень разумно, поскольку человек на троне или за шторкой может не генерировать движение каждую минуту, но за пять минут какое-либо шевеление будет, и здесь логика пойдет по верхней ветке с задержкой 15 минут.

72d73bcb3751247c510a64209c9d6d45.png

Однако при тестировании была выявлена «фича»: если триггер сработал, но свет выключился по второму пути (человек вышел, потом снова зашел), то триггер может находиться в состоянии ожидания. Поэтому я просто добавил включение света по определению движения в верхние ветвления, чтобы избежать подобных ситуаций.

c0545ef3ceb3d0cb4d23bf994fdbbf4b.png

В результате мы получили следующую схему.

3fabfc66f143e5557a219c7aeefd1e94.png

Со своей работой схема справляется, но наверняка ее можно оптимизировать или сделать иначе. Впрочем, цель данной статьи заключалась не в поиске идеала, а в том, чтобы показать возможности и побудить читателей на собственные эксперименты. И у вас наверняка получится лучше.

Заключение

Я надеюсь, что описанные сценарии термостата, дневного/ночного освещения и темной комнаты кому-нибудь пригодятся. А возможно, вдохновят самостоятельно настроить автоматизацию на Node-RED и Wiren Board или какой-то другой платформе. Если вы сами настраивали что-нибудь на Node-RED, напишите, пожалуйста, про свой опыт в комментариях — он может кому-то пригодиться.

Сам я планирую ещё поразбираться с Node-RED, а потом попробовать другие платформы автоматизации. Пишите в комментариях, какие сценарии на Node-RED вы хотели бы увидеть, и про какой ещё софт для автоматизации прочитать.

© Habrahabr.ru