![](https://habrastorage.org/getpro/habr/upload_files/e67/7eb/e78/e677ebe78804c19d51109d3ad52e6bbb.jpg)
Я создал чудовище.
Когда-то давно, на заре своей юности, я решил создать умный дом. Я не жалел средств, сил и времени и шаг за шагом приближался к виднеющемуся в дали светлому будущему, где я смогу оставить мирские заботы по своей квартире системе умного дома. Но я ошибся, и предоставил своему дому больше полномочий, чем следовало, и теперь он контролирует мою жизнь, а я живу в постоянном страхе о том, что может случиться.
Введение
Мы часто слышим словосочетание "умный дом". Обычно под этим подразумевается простое дистанционное управление домашней электроникой (умная лампочка, умная стиралка, умный утюг), но разве в этом много "ума"? Были ли старые телевизоры с пультом ДУ тоже умными?
Кто-то скажет умность заключается в том, что в умном доме вы можете настроить расписание включения вашего теплого пола по утрам или выключение света в 23:59, но планировщик задач в Windows не называют умным планировщиком, равно как умной не называют и саму Windows.
Слыша фразу умный дом, мне всегда приходит в голову дом Железного Человека с его помощником — Джарвисом. Он откликался на любой сложный голосовой запрос, и что самое главное, действовал по ситуации, выполняя задачи и без запроса как такового, основываясь лишь на внешних воздействиях. Такой умный дом включал бы тёплый пол не потому, что вы создали для этого автоматизацию в приложении на телефоне, а потому что ваш дом обладает неким намерением поддерживать комфорт и включит тёплый пол не в какое-то время, а в момент между вашим пробуждением и подъёмом с постели, равно как и выключит свет не в 23:59, а когда вы ляжете спать.
В прошлом предложении прозвучало одно слово, на котором я хотел бы сделать акцент: автоматизация. В лучшем случае, все дома, которые мы гордо зовём умными являются просто автоматизированными домами. Домами, где множество электроники (и не только) управляется дистанционно и самостоятельно, но самостоятельность эта определяется тем, какую автоматизацию вы заложили в них сами. И тут обнаруживается страшное: вы мало что можете сделать при написании ваших автоматизаций. Задать расписание, использовать восход и заход солнца (что в принципе почти то же самое), срабатывание датчика движения или открытия и (куда реже) датчиков дыма и протечки. Датчики — это основа вашего умного дома, его сердце, а автоматизации — его мозг. Джарвис всеведущ насчёт положения дел в доме Железного человека, он знает сколько человек крадётся в тёмной комнате и сколько сахара съел старший в колонии тараканов, и на основе этого генерирует ответные воздействия — приготовление напитка под каждого крадущегося человека в тёмной комнате, и распыление умного дихлофоса на несчастное животное. Мы, в свою очередь, не можем получить ВСЮ информацию о доме, но можем выйти за границы "время", "движение", "протечка". Получив больше данных о доме, мы расширим инструментарий для написания автоматизаций и приблизимся к дому, который будет больше похож на умный (хоть так и останется всего лишь автоматизированным). Всё зависит лишь от вашей фантазии. Данная статья посвящена одной такой фантазии, воплотившейся в жизнь.
Но для начала, давайте разберёмся: откуда вообще можно получить дополнительную информацию? Да практически откуда угодно: из интернетов через api, посредством передачи через uart, инфракрасный порт, gpio. По сути, любая информация, которую способна воспринять вычислительная техника может использоваться в качестве сенсора для умного дома — надо лишь проложить маршрут от источника вашей информации до сервера. Выйдите за границы, которые вам навязывают производители умной техники, вы стеснены в возможностях куда меньше, чем вас пытаются убедить!
Как же так вышло, что производители пытаются преуменьшить возможности в умном доме? Всё дело в том, что вендоры вовсю пытаются заарканить потребителя на свою экосистему. При этом такие экосистемы закрыты и немощны, и возможности пользователя там действительно ограничены уровнем "включить свет в 6:45", а в случае разрыва соединения с сервером, такой умный дом рискует оказаться тыквой. Производитель не может предоставить потребителю настолько гибкий функционал ввиду ограниченности ресурсов, а потребитель не может создать такой функционал ввиду закрытости платформы.
Да, существуют некоторые коллаборации, устройства экосистемы yeelight можно добавлять в экосистему Xiaomi, в хабы yandex/google/apple можно добавлять устройства от кучи производителей, но всё это не то (в связи с выходом Matter возможно в отдалённом светлом будущем это будет "то"). В этих хабах вы не сможете использовать в качестве условия срабатывания автоматизации понижение уровня воды в бочке вашего унитаза, для обнаружения которого вы смастерили датчик на arduino/esp (точнее в теории сможете, просто сделать это "слегка" посложнее).
Думаю, часть читателей уже догадалась, что я неумело пытаюсь подвести свою речь к хабам умных домов с открытым исходным кодом:
Наверняка я указал не все хабы, а лишь те, о которых знаю сам. Отмечу лишь, работал только с Home Assistant и (совсем немного несколько лет назад) с OpenHUB.
Мои дальнейшие примеры будут идти через реализацию на Home Assistant, но идея, которая лежит в примере не ограничена каким-либо конкретным хабом.
Коротко о Home Assistant
Home Assistant — это приложение с открытым исходным кодом для автоматизации дома, которое ставит во главу локальное управление и приватность (перевод с главной страницы сайта). Приложение написано на python, может быть запущено на linux и windows, на raspberry pi и в виртуальной машине, в докере и без. Расширение функциональности приложения происходит через так называемые компоненты и интеграции, которые активно добавляются и развиваются сообществом, что позволяет добавлять в ваши автоматизации самые разные устройства и сетевые службы.
Примеры фронтенда автоматизированного дома, базирующегося на Home Assistant (Через кнопку "Далее" на карточке в верхнем левом углу можно перейти к следующему примеру).
Я уже долго мучаю вас вводными словами, давайте уже перейдём к конкретным примерам: зачем вообще нужны эти ваши умные дома, если я не падаю в обморок при подъёме с кровати, чтобы выключить свет.
Представьте на секунду, сколько раз вы выключали свой будильник, ложились дальше спать и страдали из-за этого? Сколько было пропущено встреч, пар, занятий. Сколько раз вы заставляли ваших друзей и знакомых ждать вас, пока вы валялись в тёплой постели. Моя автоматизация лишила меня такой привилегии и сейчас я расскажу вам о ней.
МЕГАБУДИЛЬНИК (Версия 1.0)
Есть один бородатый анекдот (настолько бородатый, что я называю его анекдотом, а не мемом):
— Как гарантированно встать в 7 утра?
— Завести будильник на 7 утра, а форматирование системного раздела на 6:59.
По моему опыту, чтобы точно встать необходимо создать либо условия, в которых дальнейшее продолжение сна невозможно, либо некую угрозу, для избегания которой вы решите встать самостоятельно. Трудно спать, когда стену, у которой ты лежишь, сосед долбит перфоратором, равно как и трудно пустить всё на самотёк и лечь досыпать, когда через час у тебя экзамен/отлёт/форматирование диска. При этом, в случае недостаточной дисциплинированности такие события как поход к первой паре, или к 9 на работу возможно не будут достаточно критическими, чтобы избежать соблазна понежиться в постельке подольше.
Форматирование диска — стимул конечно сильный, но достаточно деструктивный, учитывая, что может сработать и в случае какой-то ошибки. Лучшим вариантом будет некая комбинация: неотвратимая угроза, достаточная чтобы вы встали сами, но не разрушительная по своей сути, совмещённая с достаточным светопреставлением, во время которого вы не сможете спать.
Кроме того, мало заставить вас подняться с постели (хотя это уже залог успеха). Важно ещё и проконтролировать, что через секунду вы не ляжете обратно.
Ну и помимо прочего, наш умный будильник должен ещё и знать когда нас будить.
Подведём итоги: для создания такого будильника необходимо решить три задачи:
задачу определения времени срабатывания будильника;
задачу детектирования тела в постели;
задачу создания подходящей угрозы.
Определение времени срабатывания будильника
Ну, тут всё просто. Хочется иметь привычную настройку будильника — через приложение Часы на телефоне, и чтобы оттуда заведённый будильник магическим образом оказывался в нашем умном доме. Что ж, ставим home assistant companion app — и вуаля, ваше желание исполнено. Как только приложение подключится к серверу, на том появится новое устройство, которое предоставит мириады сенсоров, берущих данные с вашего телефона, включая время следующего будильника (`sensor.<device_name>_next_alarm`).
Важная ремарка — убедитесь, что время будильника не промахивается на час-другой. Когда я сидел на MIUI, стоковые часы давали сенсору время следующего будильника на час раньше или что-то около того. Как будто они давали время появления уведомления о будущем будильнике. После того как поставил google часы эта проблема пропала.
Список доступных сенсоров, которые вы можете получить с вашего телефона вы можете увидеть здесь:
https://companion.home-assistant.io/docs/core/sensors
Имея данный сенсор, уже можно создавать автоматизацию по срабатыванию будильника, однако для удобства создания таких автоматизаций необходимо создать вспомогательный сенсор-спутник в домене `input_datetime`, который будет повторять значение нашего сенсора.
Подобный сенсор-спутник может обновлять своё значение, например вот так:
- alias: Обновление будильника
id: Обновление будильника
trigger:
platform: state
entity_id: sensor.<device>_next_alarm
action:
- service: input_datetime.set_datetime
entity_id: input_datetime.next_alarm
data:
timestamp: '{{as_timestamp(states("sensor.<device>_next_alarm"),10)}}'
Такой костыль нужен для того, чтобы в качестве триггера на срабатывание автоматизации мы могли бы использовать платформу `time`:
Пример подобной автоматизации
- alias: МЕГАБУДИЛЬНИК (вкл)
id: МЕГАБУДИЛЬНИК (вкл)
trigger:
- platform: time
at: input_datetime.next_alarm
Определение наличия тела на кровати
Осталось понять, как вообще определять есть ли кто в кровати. Можно воспользоваться средствами компьютерного зрения в связке с камерой, круглыми сутками наблюдающей за кроватью, а можно... поместить под кровать датчик веса. В качестве таких сенсоров используют тензодатчики (в частности, в их роли могут выступать тензорезисторы). Принцип их работы заключается в следующем:
При растяжении проводящих элементов тензорезистора увеличивается их длина и уменьшается поперечное сечение, что увеличивает сопротивление тензорезистора, при сжатии — уменьшает.Wiki
![Деформация тензорезистора из фольги. Изменение сопротивления преувеличено для наглядности. Деформация тензорезистора из фольги. Изменение сопротивления преувеличено для наглядности.](https://habrastorage.org/getpro/habr/upload_files/2d1/146/ade/2d1146ade7d89ba3248e779ff6850824.gif)
Иными словами, когда вы давите на тензорезистор, тот под действием деформации меняет свое сопротивление. Для измерения сопротивления используют такую электрическую схему, как мост Уитстона.
Что такое мост Уитстона
Мост Уитстона — электрическое устройство, механическим аналогом которого являются аптекарские рычажные весы.
При реализации этой схемы, я не заморачивался с тем, что такое мост Уитстона, а просто нашёл видео, в котором делается ровно то, что мне нужно (подключение тензодатчиков к микросхеме hx711). Но для полноты статьи, я нашёл очень простое объяснение, которое и приведу ниже:
![Принципиальная схема моста Уитстона Принципиальная схема моста Уитстона](https://habrastorage.org/getpro/habr/upload_files/f70/c20/7be/f70c207be63dec5a2ee87af08c61b7b5.gif)
Схема моста Уитстона имеет два плеча сопротивления, каждое из которых содержит два резистора. Третья ветвь схемы — это соединение между двумя параллельными ветвями. Эта третья ветвь называется мостом. Ток течёт от отрицательной клеммы батарейки к верхней точке мостовой схемы. Затем, ток делится между двумя параллельными ветвями, причём количество тока, протекающее по каждой из ветвей, зависит от величины сопротивления в ветви. Наконец, ток возвращается к положительной клемме батарейки.
При равных величинах сопротивлений равное количество тока течёт в каждой из ветвей. По мосту ток не течёт, на что указывает нулевое положение измерителя. При этом условии о мосте говорят, что он уравновешен.
![Уравновешенная схема моста Уитстона Уравновешенная схема моста Уитстона](https://habrastorage.org/getpro/habr/upload_files/91d/2d5/b84/91d2d5b844ec97ce74c8a9703064c9bd.gif)
При неравных величинах сопротивления в ветвях, ток течёт в схеме от ветви с большим сопротивлением к ветви с меньшим сопротивлением. Это будет верно, пока два верхних резистора фиксированы и равны по величине, как это имеет место в схемах моста Уитстона, используемых в контрольно-измерительных системах. Измеритель на рисунке показывает, что ток в мосте течёт слева направо.
![Неуравновешенная схема моста Уитстона Неуравновешенная схема моста Уитстона](https://habrastorage.org/getpro/habr/upload_files/5ea/3db/7d1/5ea3db7d10c39aab8fe633c341d6efdf.gif)
После того, как мы подключили тензодатчики к микросхеме hx711 и начали получать с неё цифровые данные, осталось подключить её к какому-либо микроконтроллеру/микрокомпьютеру, который будет отправлять данные в умный дом. Самый простой вариант, использовать плату esp32. С помощью проекта ESPHome, можно пробросить данные с микросхемы hx711 в умный дом используя esp32 не написав ни единой строчки кода (добавив только yaml-описание сенсора).
После того, как мы пробросили данные в умный дом, осталось понять какие значения с датчика идут, когда на кровати никого нет, а какие идут, когда на кровати кто-то лежит, и применить к этому сенсору оконную функцию скользящего среднего (на случай возможных выбросов).
Пример создания фильтра скользящего среднего в Home Assistant
- platform: filter
name: hx711_filtered_value
entity_id: sensor.hx711_value
filters:
- filter: time_simple_moving_average
window_size: 00:00:10
В качестве диапазона скользящего окна я использую 10 секунд.
Поздравляю, с этого момента вы знаете, что кто-то лежал в вашей постели (правда всё ещё не знаете, кто).
Создание подходящих для пробуждения воздействий
Ну, этот раздел зависит от каждого отдельного дома, и устройств, которыми тот может управлять, могу привести пример того, что сделано у меня:
Начинается всё, как и у всех: на телефоне срабатывает мелодия будильника. Затем, если через 25 секунд я всё ещё нахожусь в постели, на моём компьютере на полную громкость включается музыка. Почему 25 секунд? Эмпирическим путём я пришёл к выводу, что мне требуется до 15 секунд, чтобы без промедления встать с кровати (иногда телефон валяется где-то зарытым в подушки, и мне нужно его найти). После требуется ещё 10 секунд на то, чтобы в фильтре установилось допустимое для будильника среднее значение. Вообще, такое воздействие относится к обоим типам причин подъёма: даже если вы пропустили обычный звонок будильника на телефоне, подобный "звонок будильника" вы не пропустите, да и спать под него не сможете. Но помимо прочего, здесь есть и нечто устрашающее: не важно, живете ли вы один или с семьёй, ор музыки на компьютере утром услышат и ваши соседи, чего вы вряд ли бы захотели.
Как заставить орать музыку на компьютере? Для начала, чтобы что-либо автоматизировать на компьютере, желательно научиться запускать это из командной строки, а дальше удалённо вызывать эту команду. Как запустить музыку из командной строки? Например, вот такой командой:
"C:\Program Files\Windows Media Player\wmplayer.exe" C:\mediafile.mp3
Как вызвать эту команду из умного дома? Помимо управления по ssh можно воспользоваться специализированными приложениями с управлением по локальной сети (HASS Workstation Service), IOT Link (проект скорее мёртв, чем жив)), HASS.Agent.
Кроме того, музыку можно запустить и с помощью интеграции Home Assistant с проигрывателями на компьютере (например, интеграции Spotify, но тут вы не сможете выкрутить звук на самом компьютере, плюс есть риск, что устройством воспроизведения будут наушники), можно даже написать собственное крошечное клиент-серверное приложение, сервер кинуть на компьютер, клиента дёргать из умного дома.
Лично я раньше пользовался IOT Link, но ввиду отсутствия развития проекта, в итоге перешёл на HASS WorkStation Service.
UPD. теперь, ввиду прошлой же причины, перешел на HASS.Agent.
Итак, на часах 6:45:25, на колонках Тату, под дверьми злые соседи: что дальше, шеф? А дальше вам всё равно очень хочется спать, и что вы делаете после? Правильно, выкручиваете крутилку громкости на самих динамиках в ноль и ложитесь спать дальше. Самолёт улетел без вас, границы закрылись, и как бы вы ни хотели жить на Манхэттене, вы всё равно останетесь в Омске.
Нет, так дело не пойдёт, придётся переходить к тяжёлой артиллерии. В случае, если субъект не реагирует на громкую музыку, либо слишком быстро лёг обратно в постель, помимо громкой музыки происходит следующее: включается всё что может включаться и испускать звуки или свет (верхний свет + светодиодная лента с эффектами стробоскопа, проектор, робот-пылесос). Чем больше всего включить — тем больше всего придётся выключать нерадивому субъекту, тем дольше тот будет бодрствовать до следующей возможности упасть в постель, и тем страшнее перспектива испытать это всё на себе. Вот без лишнего лукавства, после того как я написал все эти автоматизации, я попросту боялся проверять — сработают они или нет. Как только слышал звонок будильника — пулей вылетал из постели с кристально чистой головой. Спустя полминуты спать снова хотелось, но я точно знал, что может произойти, если приближусь к кровати, и потому нервно пил чаёк... поначалу. Спустя пару дней, я понял, что если отключить датчик веса, то умный дом не поймёт, что я лёг спать обратно, а значит достаточно отключить от питания всего лишь одну плату и лечь спать дальше.
Вообще, история создания МЕГАБУДИЛЬНИКа — это прямо-таки поединок брони и снаряда. Здравомыслящий доктор Джекил налаживает систему пробуждения, которую иррациональный мистер Хайд хакает в полусне за секунду. Причём всё усугубляется тем, что я точно знаю, как всё работает, ведь именно я эту систему и писал.
На следующий день, после того как я догадался отключать датчик, я добавил автоматизацию на то, что если состояние с датчика перейдёт в значение unavailable
— это сигнал неприятия воли личности, которая завела будильник, что должно караться мерами, описанными выше. После этого я перестал отключать сенсоры. Зато начал отключать таймеры, по которым определял, что помещать вес на кровать снова безопасно (через час после будильника). Что привело к тому, что я заменил таймеры сенсорами, которые формируются автоматически из значений будильника и не могут быть отключены.
В конечном счёте, главной целью всех этих мероприятий должна быть такая, чтобы у субъекта не было возможности быстро отключить все системы защиты будильника. Но одна такая возможность всё-таки есть — попросту выключить питание сервера умного дома. Однако тут есть пара нюансов. Очевидная — с будильником отвалится весь умный дом. Менее очевидная, в этом случае может полететь база данных умного дома (уже пару раз такое происходило). Кроме того, мой инстанс Home Assistant крутится в виде виртуалки на винде, и в случае экстренного выключения ПК, у меня пару раз ломался образ виртуалки, так что экстренное выключение питания не вариант.
Пока что в случае полного неприятия пробуждения, я выключаю виртуальную машину из фронтенда. Вообще-то, даже на этот случай существует решение. Есть триггер по выключению Home Assistant, вот только он не работает. Точнее, он вроде как работает, но к тому моменту, как он происходит, выключается большая часть сервера, и автоматизация не срабатывает как должна. На самом деле, уязвимость с любым выключением легко исправить: достаточно перенести управляющие команды на резервное устройство: esp или raspberry pi, и в случае потери соединения связи между сервером и таким устройством генерировать сигнал детонатора на устройстве, оставшемся в сети (руки просто пока до этого не дошли, да и проблем с пробуждением у меня осталось немного).
Подведём итоги: мы с вами поговорили о проблеме раннего пробуждения в условиях неработоспособности стандартных будильников и моём МЕГАБУДИЛЬНИКе в качестве решения этой проблемы.
Для реализации такого будильника средствами умного дома, нам потребовалось реализовать проброс данных о следующем будильнике с телефона внутрь умного дома, создать датчик веса, который будет расположен под кроватью, и реализовать набор управляющих воздействий, в случае если после срабатывания будильника вы всё ещё остаётесь в постели.
Проблема решена, бюджет освоен и всё было бы хорошо, если бы не наступило 31-ое декабря — день, когда всё покатилось к чертям...
МЕГАБУДИЛЬНИК (версия 2.0)
*To be continued...*
![](https://habrastorage.org/getpro/habr/upload_files/313/7a5/f47/3137a5f47cbcb3c2015f9a645cfb080a.png)