Pull to refresh

Умный дом, как я до такого докатился. Часть 2-я

Reading time 5 min
Views 289K

В первой части я рассказал о причинах, побудивших меня заняться построением своего “умного дома”, и об используемом “железе”.
Но “железо”, само по себе, умным быть не может, главное это “софт”. Вот об этой стороне своего проекта я и хочу рассказать в этой части. Банальное управление освещением с пульта, конечно, выглядит круто в глазах непосвященной публики, но “ума” тут никакого.
Так что же такого умного можно сделать? И, главное, как?

Как я уже говорил ранее, к системе у меня подключено:
  • Все освещение квартиры
  • Теплый пол
  • Вентиляция
  • Видеонаблюдение
  • Климатические датчики
  • Датчики движения
  • Датчики открывания дверей и окон


Для начала приведу неполный список того, что умеет моя система (и примеры, для чего это используется):
  • Банальное управление всем, что подключено, с веба/смартфона/планшета :)
  • Мониторинг происходящего в квартире и вокруг из любой точки мира, где есть Интернет (так, мои дома, спят дневной сон, не буду пока звонить будить; сработала сигнализация на мотоцикле у подъезда — подключился к камере, убедился что все нормально и т. д.)
  • Включение освещения в коридоре когда кто-то пришел домой и при этом на улице темно, а дома никого не было
  • Отключение света во всей квартире и перевод теплого пола в экономичный режим когда никого нет
  • Управление освещением по расписанию (имитация присутствия)
  • Сценарное управление освещением одним касанием: погасить все (ребенок просыпается, а просыпаться не надо, 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 позволяющий, к примеру, включать/выключать запись по нужным мне правилам. Или наоборот, повесить свою обработку событий при появлении движения в охраняемой зоне. Так же она может отдавать изображение с камеры.

Пользовательский интерфейс
У системы есть три основных интерфейса управления:
  • Классический (выключатели на стенах)
  • Нативное Android приложение
  • Вебинтерфейс

С точки зрения системы классический выключатель — это просто сенсор-ключ, который с помощью триггеров привязывается к любым контролам. При желании можно привязать, например, выключатель на кухне к свету в детской (чем я обычно занимаюсь на 1-е апреля)


Поскольку, во время написания Android приложения, я был увлечен сериалом Star Trek, то и тему оформления сделал под стиль терминалов из этой культовой ленты.
Терминал имеет главное окно, на котором отображается общее состояние системы:

Слева — общее состояние.
Посередине — план квартиры, с отображением состояния основных контролов и сенсоров
Вверху — общая для всего приложения информационная панель.
Справа — основные кнопки (выключить все, монитор уличных датчиков, настройки)

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


Так же в каждой комнате можно посмотреть различную информацию по датчикам, например, график температуры


Я не дизайнер и не верстальщик фронтендер поэтому вебинтерфейс у меня простой, корявый и минималистский.

Верхние блоки — мониторинг
Слева — управление контролами и триггерами
В центре — видеонаблюдение
Справа — справочная информация не связанная непосредственно с «умным домом».

Изначально предполагалось в качестве основного интерфейса в местах обитания детей использовать классические выключатели на стенах, а там где взрослые, вместо выключателей монтировать Android планшеты, но жизнь, похоже, внесет свои коррективы. Так, оказалось, что детям гораздо интереснее по планшету тыкать, а жене больше по душе обычные кнопки.

UP:
Продолжение тут Умный дом, как я до такого докатился. Часть 3-я
Tags:
Hubs:
+110
Comments 104
Comments Comments 104

Articles