В первой части я рассказал о причинах, побудивших меня заняться построением своего “умного дома”, и об используемом “железе”.
Но “железо”, само по себе, умным быть не может, главное это “софт”. Вот об этой стороне своего проекта я и хочу рассказать в этой части. Банальное управление освещением с пульта, конечно, выглядит круто в глазах непосвященной публики, но “ума” тут никакого.
Так что же такого умного можно сделать? И главное как?
Как я уже говорил ранее, к системе у меня подключено:
- Все освещение квартиры
- Теплый пол
- Вентиляция
- Видеонаблюдение
- Климатические датчики
- Датчики движения
- Датчики открывания дверей и окон
Для начала приведу неполный список того, что умеет моя система (и примеры, для чего это используется):
- Банальное управление всем, что подключено, с веба/смартфона/планшета :)
- Мониторинг происходящего в квартире и вокруг из любой точки мира, где есть Интернет (так, мои дома, спят дневной сон, не буду пока звонить будить; сработала сигнализация на мотоцикле у подъезда — подключился к камере, убедился что все нормально и т. д.)
- Включение освещения в коридоре когда кто-то пришел домой и при этом на улице темно, а дома никого не было
- Отключение света во всей квартире и перевод теплого пола в экономичный режим когда никого нет
- Управление освещением по расписанию (имитация присутствия)
- Сценарное управление освещением одним касанием: погасить все (ребенок просыпается, а просыпаться не надо, 3 часа ночи, родители еще бродят ;)), погасить все кроме света в коридоре (выношу ребенка из ванной со словами, смотри все уже спят и тебе пора) и т. д.
- Управление теплым полом по расписанию и температуре
- Управление вентиляцией по расписанию и температуре
- Отключение вентиляции при открытых окнах (для сохранения ресурса фильтров)
- Управление видеозаписью по различным событиям (не закрытая на замок входная дверь, движение и т. д.)
- Управляемые оповещения по событиям (кто-то пришел, все ушли, входная дверь не заперта 15 минут и т. д.)
- ...
Самой сложной задачей, на первый взгляд, казалось решение задачи: “Есть ли кто дома?”
Ведь если есть, но спят, то никакой датчик движения ничего не определит, а включать свет тогда при входе нежелательно, так же как отключать отопление. Долго я ломал над этим голову, начиная с вариантов подсчета входящих/выходящих и заканчивая определением всех перемещений по квартире (конечная точка — дверь, значит никого, кровать, значит спят).
Но как говориться, все гениальное — просто, обратил внимание на закономерность, вошедшую в привычку:
- Если кто-то приходит домой, то всегда закрывает щеколду
- Если кто-то уходит не последний, то закрывает один замок (что бы остальным было удобнее открывать
- И только если все ушли, то закрываем все замки и при этом никак нельзя закрыть щеколду
Поставил датчики на все замки и вуаля, за полтора года ни одного ложного срабатывания, 100% определение присутствия дома кого-либо.
Архитектура системы
В системе есть следующие сущности:
- Сенсор — то с чего можно считывать данные
- Триггер — условие зависящее от сенсора или времени, управляющее контролами
- Контрол — то чем можно управлять
- Мессенджер — по сути тоже, что и контрол, только он посылает сообщение
Контрол (мессенджер) связан с несколькими триггерами, которые, в свою очередь, срабатывают по событиям от сенсоров.
Сенсоры делятся на пять групп:
- Сенсор-значение: возвращает абсолютное значение, например температуру
- Сенсор-ключ: возвращает время с последнего срабатывания и состояние, например датчик движения
- Сенсор-команда: возвращает значение произвольной команды шелла linux, например температуру диска
- Макросенсор: сочетание нескольких сенсоров, например, сенсор NOBODY_HOME определен как:
min(abs(FRONTDOOR_KEY),
-FRONTDOOR_LATCH_KEY,
FRONTDOOR_LOCK_LOWER_KEY,
FRONTDOOR_LOCK_UPPER_KEY)
Что в переводе на русский язык значит: никого нет дома с того момента когда была закрыта дверь (FRONTDOOR_KEY), отрыта щеколда (FRONTDOOR_LATCH_KEY) и закрыты замки (FRONTDOOR_LOCK_LOWER_KEY, FRONTDOOR_LOCK_UPPER_KEY) - Сенсор-контрол: возвращает время с момента последнего изменения контрола и его состояние
Триггеры умеют делать следующее:
- on — Включать контрол при наступлении условия
- off — Выключать контрол при наступлении условия
- switch on — включать при соблюдении условия и выключать при несоблюдении
- switch off — выключать при соблюдении условия и включать при несоблюдении
Контролы делятся на три группы:
- 1-wire контрол — вкл/выкл устройство по шине 1-wire
- cmd контрол — выполнить команду шелла linux
- Кастомный контрол — все что душе угодно, но надо лезть в код
Разберем эту схему на примере упрощенного варианта управления теплым полом.
К примеру, у нас есть следующие задачи:
- Поддерживать температуру 34 градуса
- Отключаться на ночь
- Выключаться когда никого нет
- Включаться когда кто-нибудь есть дома
Изобразим схему взаимодействия на диаграмме:
- Trigger 1, означает, что когда температура падает ниже 34 пол нужно включить, иначе выключить
- Trigger 2, означает, что с часу ночи, в течении 8 часов пол должен быть выключен
- Trigger 3, означает, что с когда никого нет дома больше 1 секунды нужно пол выключить
- Trigger 4, означает, что с когда кто-то есть дома больше 1 секунды нужно пол включить
Вот такая вот нехитрая архитектура позволяет задавать большинство необходимых мне действий. Есть, конечно, и более сложные ситуации. В таких случаях я просто пишу кастомный контрол. Например, для включения/выключения вентиляции нужна более сложная логика чем просто включить/выключить канальный вентилятор, нужно еще по определенным правилам заслонку перекрывать.
Стороние проекты
Вся моя система написана на Python и крутится на сервере под управлением Ubuntu. В качестве БД используется MySQL. Для подключение к 1-wire используется библиотека owpython.
Но разумеется, писать все самому смысла нет, чаще легче взять готовые решения.
Для видеонаблюдения я не стал изобретать велосипедов и воспользовался OpenSource системой ZoneMinder, тем более, что она имеет весьма неплохой API позволяющий, к примеру, включать/выключать запись по нужным мне правилам. Или наоборот, повесить свою обработку событий при появлении движения в охраняемой зоне. Так же она может отдавать изображение с камеры.
Пользовательский интерфейс
У системы есть три основных интерфейса управления:
- Классический (выключатели на стенах)
- Нативное Androind приложение
- Вебинтерфейс
С точки зрения системы классический выключатель — это просто сенсор-ключ, который с помощью триггеров привязывается к любым контролам. При желании можно привязать, например, выключатель на кухне к свету в детской (чем я обычно занимаюсь на 1-е апреля)
Поскольку, во время написания Androind приложения, я был увлечен сериалом Star Trek, то и тему оформления сделал под стиль терминалов из этой культовой ленты.
Терминал имеет главное окно, на котором отображается общее состояние системы:
Слева — общее состояние.
Посередине — план квартиры, с отображением состояния основных контролов и сенсоров
Вверху — общая для всего приложения информационная панель.
Справа — основные кнопки (выключить все, монитор уличных датчиков, настройки)
Окна для каждой из комнат. Собственно, в каждой комнате, где висит планшет, открыто окно именно этой комнаты и включение/выключение освещения осуществляется одним касанием по довольно большой кнопке, что совершенно не доставляет неудобств
Так же в каждой комнате можно посмотреть различную информацию по датчикам, например, график температуры
Я не дизайнер и не верстальщик фронтендер поэтому вебинтерфейс у меня простой, корявый и минималистский.
Верхние блоки — мониторинг
Слева — управление контролами и триггерами
В центре — видеонаблюдение
Справа — справочная информация не связанная непосредственно с «умным домом».
Изначально предполагалось в качестве основного интерфейса в местах обитания детей использовать классические выключатели на стенах, а там где взрослые, вместо выключателей монтировать Android планшеты, но жизнь, похоже, внесет свои коррективы. Так, оказалось, что детям гораздо интереснее по планшету тыкать, а жене больше по душе обычные кнопки.
Автор: sashacmc