Как стать автором
Обновить

Я каждый день рискую запустить восстание машин, но всё ещё жив

Умный дом Интернет вещей DIY или Сделай сам Будущее здесь
Из песочницы

Я создал чудовище.  

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


Введение

Мы часто слышим словосочетание "умный дом". Обычно под этим подразумевается простое дистанционное управление домашней электроникой (умная лампочка, умная стиралка, умный утюг), но разве в этом много "ума"? Были ли старые телевизоры с пультом ДУ тоже умными?  

Кто-то скажет умность заключается в том, что в умном доме вы можете настроить расписание включения вашего теплого пола по утрам или выключение света в 23:59, но планировщик задач в Windows не называют умным планировщиком, равно как умной не называют и саму Windows.  

Слыша фразу умный дом, мне всегда приходит в голову дом Железного Человека с его помощником — Джарвисом. Он откликался на любой сложный голосовой запрос, и что самое главное, действовал по ситуации, выполняя задачи и без запроса как такового, основываясь лишь на внешних воздействиях. Такой умный дом включал бы тёплый пол не потому, что вы создали для этого автоматизацию в приложении на телефоне, а потому что ваш дом обладает неким намерением поддерживать комфорт и включит тёплый пол не в какое-то время, а в момент между вашим пробуждением и подъёмом с постели, равно как и выключит свет не в 23:59, а когда вы ляжете спать.  

В прошлом предложении прозвучало одно слово, на котором я хотел бы сделать акцент: автоматизация. В лучшем случае, все дома, которые мы гордо зовём умными являются просто автоматизированными домами. Домами, где множество электроники (и не только) управляется дистанционно и самостоятельно, но самостоятельность эта определяется тем, какую автоматизацию вы заложили в них сами. И тут обнаруживается страшное: вы мало что можете сделать при написании ваших автоматизаций. Задать расписание, использовать восход и заход солнца (что в принципе почти то же самое), срабатывание датчика движения или открытия и (куда реже) датчиков дыма и протечки. Датчики — это основа вашего умного дома, его сердце, а автоматизации — его мозг. Джарвис всеведущ насчёт положения дел в доме Железного человека, он знает сколько человек крадётся в тёмной комнате и сколько сахара съел старший в колонии тараканов, и на основе этого генерирует ответные воздействия — приготовление напитка под каждого крадущегося человека в тёмной комнате, и распыление умного дихлофоса на несчастное животное. Мы, в свою очередь, не можем получить ВСЮ информацию о доме, но можем выйти за границы "время", "движение", "протечка". Получив больше данных о доме, мы расширим инструментарий для написания автоматизаций и приблизимся к дому, который будет больше похож на умный (хоть так и останется всего лишь автоматизированным). Всё зависит лишь от вашей фантазии. Данная статья посвящена одной такой фантазии, воплотившейся в жизнь.  

Но для начала, давайте разберёмся: откуда вообще можно получить дополнительную информацию? Да практически откуда угодно: из интернетов через api, посредством передачи через uart, инфракрасный порт, gpio. По сути, любая информация, которую способна воспринять вычислительная техника может использоваться в качестве сенсора для умного дома — надо лишь проложить маршрут от источника вашей информации до сервера. Выйдите за границы, которые вам навязывают производители умной техники, вы стеснены в возможностях куда меньше, чем вас пытаются убедить!  

Как же так вышло, что производители пытаются преуменьшить возможности в умном доме? Всё дело в том, что вендоры вовсю пытаются заарканить потребителя на свою экосистему. При этом такие экосистемы закрыты и немощны, и возможности пользователя там действительно ограничены уровнем "включить свет в 6:45", а в случае разрыва соединения с сервером, такой умный дом рискует оказаться тыквой. Производитель не может предоставить потребителю настолько гибкий функционал ввиду ограниченности ресурсов, а потребитель не может создать такой функционал ввиду закрытости платформы.  

Да, существуют некоторые коллаборации, устройства экосистемы yeelight можно добавлять в экосистему Xiaomi, в хабы yandex/google/apple можно добавлять устройства от кучи производителей, но всё это не то (в связи с выходом Matter возможно в отдалённом светлом будущем это будет "то"). В этих хабах вы не сможете использовать в качестве условия срабатывания автоматизации понижение уровня воды в бочке вашего унитаза, для обнаружения которого вы смастерили датчик на arduino/esp (точнее в теории сможете, просто сделать это "слегка" посложнее).  

Думаю, часть читателей уже догадалась, что я неумело пытаюсь подвести свою речь к хабам умных домов с открытым исходным кодом:

  1. Home Assistant

  2. OpenHUB

  3. Domoticz

  4. MajorDoMo

Наверняка я указал не все хабы, а лишь те, о которых знаю сам. Отмечу лишь, работал только с Home Assistant и (совсем немного несколько лет назад) с OpenHUB.  

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

Коротко о Home Assistant

Home Assistant — это приложение с открытым исходным кодом для автоматизации дома, которое ставит во главу локальное управление и приватность (перевод с главной страницы сайта). Приложение написано на python, может быть запущено на linux и windows, на raspberry pi и в виртуальной машине, в докере и без. Расширение функциональности приложения происходит через так называемые компоненты и интеграции, которые активно добавляются и развиваются сообществом, что позволяет добавлять в ваши автоматизации самые разные устройства и сетевые службы.

Примеры фронтенда автоматизированного дома, базирующегося на Home Assistant (Через кнопку "Далее" на карточке в верхнем левом углу можно перейти к следующему примеру).

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

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

МЕГАБУДИЛЬНИК (Версия 1.0)

Есть один бородатый анекдот (настолько бородатый, что я называю его анекдотом, а не мемом):

— Как гарантированно встать в 7 утра?
— Завести будильник на 7 утра, а форматирование системного раздела на 6:59.

По моему опыту, чтобы точно встать необходимо создать либо условия, в которых дальнейшее продолжение сна невозможно, либо некую угрозу, для избегания которой вы решите встать самостоятельно. Трудно спать, когда стену, у которой ты лежишь, сосед долбит перфоратором, равно как и трудно пустить всё на самотёк и лечь досыпать, когда через час у тебя экзамен/отлёт/форматирование диска. При этом, в случае недостаточной дисциплинированности такие события как поход к первой паре, или к 9 на работу возможно не будут достаточно критическими, чтобы избежать соблазна понежиться в постельке подольше.  

Форматирование диска — стимул конечно сильный, но достаточно деструктивный, учитывая, что может сработать и в случае какой-то ошибки. Лучшим вариантом будет некая комбинация: неотвратимая угроза, достаточная чтобы вы встали сами, но не разрушительная по своей сути, совмещённая с достаточным светопреставлением, во время которого вы не сможете спать.  

Кроме того, мало заставить вас подняться с постели (хотя это уже залог успеха). Важно ещё и проконтролировать, что через секунду вы не ляжете обратно.  

Ну и помимо прочего, наш умный будильник должен ещё и знать когда нас будить.  

Подведём итоги: для создания такого будильника необходимо решить три задачи:

  1. задачу определения времени срабатывания будильника;

  2. задачу детектирования тела в постели;

  3. задачу создания подходящей угрозы.

Определение времени срабатывания будильника

Ну, тут всё просто. Хочется иметь привычную настройку будильника — через приложение Часы на телефоне, и чтобы оттуда заведённый будильник магическим образом оказывался в нашем умном доме. Что ж, ставим 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

Деформация тензорезистора из фольги. Изменение сопротивления преувеличено для наглядности.
Деформация тензорезистора из фольги. Изменение сопротивления преувеличено для наглядности.

Иными словами, когда вы давите на тензорезистор, тот под действием деформации меняет свое сопротивление. Для измерения сопротивления используют такую электрическую схему, как мост Уитстона.

Что такое мост Уитстона

Мост Уитстона — электрическое устройство, механическим аналогом которого являются аптекарские рычажные весы.

При реализации этой схемы, я не заморачивался с тем, что такое мост Уитстона, а просто нашёл видео, в котором делается ровно то, что мне нужно (подключение тензодатчиков к микросхеме hx711). Но для полноты статьи, я нашёл очень простое объяснение, которое и приведу ниже:

Принципиальная схема моста Уитстона
Принципиальная схема моста Уитстона

Схема моста Уитстона имеет два плеча сопротивления, каждое из которых содержит два резистора. Третья ветвь схемы — это соединение между двумя параллельными ветвями. Эта третья ветвь называется мостом. Ток течёт от отрицательной клеммы батарейки к верхней точке мостовой схемы. Затем, ток делится между двумя параллельными ветвями, причём количество тока, протекающее по каждой из ветвей, зависит от величины сопротивления в ветви. Наконец, ток возвращается к положительной клемме батарейки.

При равных величинах сопротивлений равное количество тока течёт в каждой из ветвей. По мосту ток не течёт, на что указывает нулевое положение измерителя. При этом условии о мосте говорят, что он уравновешен.

Уравновешенная схема моста Уитстона
Уравновешенная схема моста Уитстона

При неравных величинах сопротивления в ветвях, ток течёт в схеме от ветви с большим сопротивлением к ветви с меньшим сопротивлением. Это будет верно, пока два верхних резистора фиксированы и равны по величине, как это имеет место в схемах моста Уитстона, используемых в контрольно-измерительных системах. Измеритель на рисунке показывает, что ток в мосте течёт слева направо.

Неуравновешенная схема моста Уитстона
Неуравновешенная схема моста Уитстона

После того, как мы подключили тензодатчики к микросхеме 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...*

Ссылки на использованные ресурсы

  1. Habr: Разработчик компонентов умного дома Insteon отключил сервисы, оставив клиентов с нерабочими устройствами

  2. Build with Matter

  3. Home Assistant

  4. OpenHUB

  5. Domoticz

  6. MajorDoMo

  7. Документация приложения Home Assistant Compaion

  8. Википедия: Тензорезистор

  9. Youtube: How to use HX711 with Four Load Cells

  10. Измерительный мост Уитстона

  11. ESPHome Docs: HX711 Load Cell Amplifier

  12. Home Assistant Docs: Time Simple Moving Average

  13. Википедия: Скользящая средняя

  14. Github: HASS.Agent

  15. Github: HASS Workstation Service

  16. Gitlab: IOT Link

  17. Home Assistant integrations: Spotify

  18. Home Assistant Docs: Startup and Shutdown trigger

  19. Home Assistant Community: HA Shutdown Automations Don’t work?

Теги:
Хабы:
Всего голосов 26: ↑22 и ↓4 +18
Просмотры 15K
Комментарии Комментарии 55