Сказ о том, как я автоматизировал квартиру с помощью Node-RED. Часть II
Долгожданное продолжение поста про автоматизацию квартиры. В этой части я расскажу об освещении, мультимедиа-системе и датчиках безопасности.
Освещение
Для управления освещением используется несколько компонентов:
- моторизированные шторы;
- диммируемое освещение.
Свет
Свет в комнатах разделен на две зоны. Я использую икеевские светодиодные диммируемые лампы. Для управления применяю три модуля:
Встраиваемый диммер FIBARO Dimmer 2
Встраиваемое двойное реле FIBARO Double Switch 2×1.5kW
Встраиваемое реле FIBARO Single Switch 2,5kW
Диммер умеет автоматически выбирать способ диммирования (по переднему и заднему фронту фазы) и калиброваться на минимальную и максимальную яркость. Так как во все подрозетники я заранее провел трехпроводную систему, мне не пришлось использовать байпас. Светодиодные лампы не мерцают и не горят при отсутствии напряжения. Для диммируемых модулей я использую звонковые выключатели, чтобы можно было настроить яркость.
Схема подключения диммера с трехпроводной системой
Вот как это работает:
- Если дома кто-то есть и опущены шторы, освещение переходит полностью на ручное управление (кроме ванной комнаты и дежурной подсветки).
- Если дома никого не было и кто-то зашел во входную дверь, но при этом на улице темно или опущены шторы — включается свет в прихожей. В ночное время автоматически включается и отключается дежурный свет. Но если включен свет на кухне, то он переходит на ручное управление.
- В ванной свет включается по датчику движения, и не отключается, пока дверь закрыта. После открытия двери и если нет движения — свет автоматом отключается.
- В комнатах свет включается, если было движение и на улице темнее определенного порога. Если движения долго нет, свет переходит на 1% яркость.
- После автоматического опускания штор свет включается там, где за последние 15 минут было движение.
- Если из дома все ушли, свет полностью отключается.
Сценарий управления светом
Сценарий управления светом
Сценарий управления светом
Сценарий управления светом
Шторы
Как я уже писал ранее, все окна моей квартиры выходят на оживленный проспект с яркими фонарями. Для решения проблемы яркого света от фонарей ночью или летом от яркого солнца я использую моторизированные рулонные шторы.
Сначала хотел купить готовые комплекты, но цены на них сильно завышены, а цветовая гамма мне не нравилась. Эту идею пришлось отбросить и собирать несколько комплектов самостоятельно.
Из двигателей на 220 В выбор был невелик: это либо французские Somfy либо китайские Dooya. Somfy более тихие, но и более дорогие, поэтому выбор пал на двигатели Dooya DM35S. Я заказал их вместе с креплениями на «Алиэкспрессе». У двигателя два концевика, которые регулируют максимальное и минимальное положение.
Двигатель с креплениями
Следующей проблемой стали трубы для намотки штор. По правилам почтового сообщения, можно отправить посылку не длиннее 180 см, а одно из окон у меня больше 2 метров. На ближайшем строительном рынке я нашел алюминиевую трубу нужного диаметра — 50 мм. После монтажа двигателей в трубы осталось найти блэкаут-шторы. Ткань я заказал по моим размерам с «Алиэкспресса» после договоренности с продавцом, что он отправит мне только ткань, без механизмов.
Закрепленная собранная штора
Шторы управляются с помощью Z-Wave-модуля управления жалюзи FIBARO Roller Shutter 2
Модуль управления жалюзи
Модуль встраивается в подрозетник. Для таких модулей желательно заложить сразу глубокие подрозетники, чтобы впихнуть модуль, провода и выключатель. Модуль имеет достаточно настроек, в том числе реагирование на аварийные сигналы, расчет потребляемой мощности, калибровка по концевикам.
Собранный выключатель
Шторы установлены в каждой комнате и на кухне. Управлять шторами можно как выключателями, расположенными рядом с ними, так и с помощью интерфейса или сценария.
Шторы опускаются автоматически, когда наступают сумерки и на улице включается свет. Поднимаются по запрограммированному времени для каждой комнаты по будням и выходным. Если на улице темно, начинает плавно включаться свет в той комнате, где опускается штора.
Рабочие и выходные дни рассчитываются по скачанному производственному календарю. Можно перенастроить время на следующий день для каждой комнаты с помощью telegram-команды. Перед сворачиванием шторы по «будильнику» приходит telegram-сообщение с возможностью подтвердить, отменить и перенести на 30 минут. Если действие не последовало, шторы автоматически сворачиваются. В яркие дни шторы автоматически выставляют свое положение в зависимости от освещения в комнате и времени суток, а также проверяют, включен свет или нет. При получении команды «Отпуск» все шторы во всех комнатах опускаются.
Сценарий управления шторами
Сценарий управления шторами
Пример работы
Мультимедиа-система
У меня имеется множество устройств мультимедиа с различными пультами в гостиной, и мне хотелось управлять ими с одной кнопки.
На просторах интернета я нашел отдельные IR-коды для включения и отключения усилителя, телевизора и HDMI-сплиттера. С помощью Python-скрипта pronto_broadlink они были транскодированы в base64, а затем преобразованы в массив байтов и записаны в базу IR-кодов. Поэтому теперь необязательно знать, в каком состоянии сейчас устройство: можно просто послать сигнал еще раз.
Так как усилитель у меня довольно старый и не умеет по HDMI обрабатывать картинку 4K, я купил HDMI-сплиттер. Он позволяет разделить видео и аудиосигнал на два отдельных HDMI: один из них подключен к усилителю, второй — к телевизору.
Усилитель и прочие устройства
На данный момент у меня два источника звукового и видеосигнала: стационарный компьютер и сервер. Из интерфейса можно одной кнопкой включить все устройства для воспроизведения, только в одном случае прием сигнала будет настроен на сплиттере с сервера, а во втором — с компьютера. В будущем планируется к сплиттеру подключить игровые консоли.
Если из дома все ушли, все мультимедиа-устройства отключаются.
Сцена управления мультимедиа
Система присутствия работает на 6 датчиках движения и датчике открытия входной двери. Если после открытия и закрытия двери не сработал ни один датчик присутствия, через определенный промежуток отправляется сообщение в Telegram с подтверждением. Если действий не последовало в течении двух минут или нажата кнопка «Ok», система переходит в режим «Вне дома». Если в это время появилось движение, команда отменяется и сообщение удаляется.
Я пробовал использовать BLE, но в моем случае оно работало не слишком стабильно и сильно зависело от передатчика телефона.
Автоматическое определение присутствия
Датчики безопасности
На водопроводных трубах стоят запорные устройства «Gidrolock». При замыкании провода управления на фазу привод закрывает кран, при отсоединении — открывает. Оба привода подключены к встраиваемому реле Philio с сухими контактами.
Привод Gidrolock
Реле управляется Z-Wave-датчиками NEO Coolcam, расположенными в местах вероятных протечек. Все датчики напрямую находятся в ассоциации с реле, чтобы вода перекрывалась без участия контроллера. Чтобы кран не закис, каждые две недели ночью он автоматически открывается и закрывается.
Схема автоматизации приводов
При срабатывании датчика дыма Philio выключается приточная вентиляция, чтобы не раздувать огонь. При этом отправляется сообщение в telegram-чат, и датчик противно пищит.
Прочие датчики и устройства
Authorize-сервер
Этот модуль представляет собой простую реализацию авторизационного сервиса.
Есть два http-метода: один проверят, пришел ли запрос из внутренней сети и если да, то авторизует пользователя, выдавая ему JWT-токен. JWT-токен шифруется с помощью RSA 256, приватный ключ надо прописать в лежащий рядом файл. Если запрос не из внутренней сети, то пользователя перекинет на страницу логина, где он должен ввести логин и пароль и авторизоваться. Поскольку разделение на пользователей не предполагается, в настроечном файле рядом лежат логин и пароль в зашифрованном виде (SHA 512).
MQTT-сервер
MQTT-сервер реализуется с помощью компоненты aedes.
Сервер поднимается на двух портах: внутреннем для связи с сервером, без авторизации, и внешнем, который реализует WebSocket. Все фронтэнд-клиенты подключаются через сокет и проходят проверку подлинности при авторизации, подписке на топик и публикации любого сообщения. На вход приходит JWT-токен, который был получен от сервера авторизации, и происходит его валидация с помощью публичного ключа. Для запросов от сервера валидации не происходит.
Кастомные ноды Node-RED
При написании автоматизаций потребовалось реализовать одну дополнительную ноду и две доработать.
Пришлось доработать node-red-contrib-openzwave, так как мой pull request приняли только через 7 месяцев, но теперь можно использовать библиотеку из npm. Доработка заключалась в прокидывании события удаления ноды.
MQTT-нода тоже была доработана. По сути, основная доработка в ней — это вытягивание id подключенного клиента и запись его обратно при отправке в очередь. Тут можно обойтись функционалом subflow. Еще предполагалось передавать какие-либо данные на вход в MQTT-ноду, но это так и не пригодилось.
Для управления шторами и водопроводными кранами потребовалась нода с расписанием. Имеющиеся на тот момент в библиотеке были слишком навороченными и не поддерживали простую реализацию с использованием CRON. Моя реализация довольно проста: расписание может приниматься либо на вход ноды, либо задано внутри. Есть возможность отменить расписание. Под капотом используется node-schedule.
Фронт
Каждый активный компонент квартиры, который заведен в автоматизацию, представляет собой модуль на фронте. Каждый модуль самодостаточный и содержит в себе все необходимые компоненты для отрисовки. Модули разделены на две агрегации: статичные и Z-Wave. Модули должны реализовывать один интерфейс.
export interface INode {
id: string;
type: NodeTypes;
name: string;
addWidget: ComponentClass | StatelessComponent;
model: INodeModelConstructor;
service?: INodeServiceConstructor;
smallComponent: ComponentClass> | StatelessComponent>;
bigComponent: ComponentClass> | StatelessComponent>;
dialogEditComponent: ComponentClass> | StatelessComponent>;
dialogViewComponent: ComponentClass> | StatelessComponent>;
}
class Widget extends BaseWidget implements INode {
model: INodeModelConstructor = Model;
manufacturerid: string = '0x0086';
producttype: string = '0x1a02';
productid: string = '0x0064';
addWidget: StatelessComponent = AddWidget;
service: INodeServiceConstructor = Service;
smallComponent: StatelessComponent> = SmallComponent;
bigComponent: StatelessComponent> = BigComponent;
dialogEditComponent: ComponentClass> = DialogEditComponent;
dialogViewComponent: ComponentClass> = DialogViewComponent;
}
export default Widget;
Для статичных модулей — например, кондиционеров — нужно реализовывать хранилище данных на фронте. Такая реализация неудобна, по-хорошему ее надо изменить на одно хранилище
Для Z-Wave-модулей я организовал общее хранилище и отслеживание всех изменений по нему.
Модуль реализует отображение в двух видах:
- для «больших» экранов (планшет, компьютер);
- для телефонов.
В зависимости от типа устройства будет выбрано управление touch или с помощью мыши.
Сборка приложения происходит с помощью webpack + babel: по текущим настройкам собирается для двух последних версий Firefox, Chrome, Chrome Android.
Особенности исходников
Все Flow отключены, чтобы не сыпать ошибками в лог. Конфигурационная нода для Z-Wave удалена: она глючит, если не находит Z-Wave-контроллер, и роняет весь Node-RED. Выглядеть должно примерно так:
Для работы загрузчика производственного календаря нужно зарегистрироваться на data.gov.ru, получить там токен и вписать его после access_token:
Прогноз погоды скачивается с darksky.net раз в 15 минут. Для него тоже нужен токен, надо зарегистрироваться и вписать токен после forecast, до координат:
Для рассылки telegram-уведомлений нужно завести своего бота, вписать его в конфигурационную ноду Telegram и прописать id чата, где это необходимо. В случае моего Flow это subflow:
Исходники разделены на front и back. В части back лежит:
- Authorize-сервер.
- MQTT-сервер.
- Кастомные модули Node-RED.
- Экспортированные Flow одним файлом, который можно как загрузить к себе, так и поднять отдельный инстанс для тестов.
- Проект для Node-RED, в котором надо проинсталлировать модули и после только подгрузить экспортированные Flow (модули уже лежат в проекте).
- Бэкап Mongo-базы.
Более подробную информацию по установке вы сможете найти в файле readme в репозитории Гитхаба.
Планы
В планах — использовать микрофон смартфона или настенного планшета для голосового управления. Планирую развернуть свою open-source-систему на сервере на базе CMU Sphinx.
Также планирую собрать модуль для снятия и передачи показаний водопроводных и электросчетчиков.
Стоит также подумать об использовании накопленной статистики по разным параметрам, чтобы оптимизировать автоматизации.
Вывод
На текущий момент я достиг почти полной автоматизации дома под мои нужды — для поддержания комфортного климата и освещения в доме. За счет некоторых автоматизаций удалось снизить потребление электричества (примерно на 1500 ₽ в зимний период по сравнению с той же техникой без автоматизации), как со стороны нагревательных элементов, так и со стороны освещения.
Конечно, остались еще баги в алгоритмах, но я их когда-нибудь отловлю, по крайней мере двигаюсь в этом направлении. Система работает стабильно, тормозов не наблюдаю, несмотря на очень низкую скорость в протоколе Z-Wave.
Конечно, система не окупит себя за счет экономии, тут больше вопрос комфорта. Такая автоматизация сильно расхолаживает в плане мелочей типа закрытия и открытия штор, управления светом. Находясь в обычной квартире, иногда забываешь включить свет или выключить, а шторы вообще не открываешь.
Климатическую систему руками я регулирую тоже редко, но иногда требуется включить или выключить кондиционер или подкорректировать температуру на батарее. В целом получившейся системой я доволен: она позволяет меньше времени тратить на всякие регулировки. В случае выхода из строя контроллера вся функциональность останется на месте (отвалится только автоматизация). Функциональность перекрытия воды тоже сохранится. Если решу продать квартиру, то всю автоматизацию легко уберу. Или оставлю на месте, но продам дороже.