Я создал чудовище.   Когда-то давно, на заре своей юности, я решил создать умный дом. Я не жалел средств, сил и времени и шаг за шагом приближался к виднеющемуся в дали светлому будущему, где я смогу оставить мирские заботы по своей квартире системе умного дома. Но я ошибся, и предоставил своему дому больше полномочий, чем следовало, и теперь он контролирует мою жизнь, а я живу в постоянном страхе о том, что может случиться.   Мы часто слышим словосочетание "умный дом". Обычно под этим подразумевается простое дистанционное управление домашней электроникой (умная лампочка, умная стиралка, умный утюг), но разве в этом много "ума"? Были ли старые телевизоры с пультом ДУ тоже умными?   Кто-то скажет умность заключается в том, что в умном доме вы можете настроить расписание включения вашего теплого пола по утрам или выключение света в 23:59, но планировщик задач в Windows не называют умным планировщиком, равно как умной не называют и саму Windows.   Слыша фразу умный дом, мне всегда приходит в голову дом Железного Человека с его помощником — Джарвисом. Он откликался на любой сложный голосовой запрос, и что самое главное, действовал по ситуации, выполняя задачи и без запроса как такового, основываясь лишь на внешних воздействиях. Такой умный дом включал бы тёплый пол не потому, что вы создали для этого автоматизацию в приложении на телефоне, а потому что ваш дом обладает неким намерением поддерживать комфорт и включит тёплый пол не в какое-то время, а в момент между вашим пробуждением и подъёмом с постели, равно как и выключит свет не в 23:59, а когда вы ляжете спать.   В прошлом предложении прозвучало одно слово, на котором я хотел бы сделать акцент: автоматизация. В лучшем случае, все дома, которые мы гордо зовём умными являются просто автоматизированными домами. Домами, где множество электроники (и не только) управляется дистанционно и самостоятельно, но самостоятельность эта определяется тем, какую автоматизацию вы заложили в них сами. И тут обнаруживается страшное: вы мало что можете сделать при написании ваших автоматизаций. Задать расписание, использовать восход и заход солнца (что в принципе почти то же самое), срабатывание датчика движения или открытия и (куда реже) датчиков дыма и протечки. Датчики — это основа вашего умного дома, его сердце, а автоматизации — его мозг. Джарвис всеведущ насчёт положения дел в доме Железного человека, он знает сколько человек крадётся в тёмной комнате и сколько сахара съел старший в колонии тараканов, и на основе этого генерирует ответные воздействия — приготовление напитка под каждого крадущегося человека в тёмной комнате, и распыление умного дихлофоса на несчастное животное. Мы, в свою очередь, не можем получить ВСЮ информацию о доме, но можем выйти за границы "время", "движение", "протечка". Получив больше данных о доме, мы расширим инструментарий для написания автоматизаций и приблизимся к дому, который будет больше похож на умный (хоть так и останется всего лишь автоматизированным). Всё зависит лишь от вашей фантазии. Данная статья посвящена одной такой фантазии, воплотившейся в жизнь.   Но для начала, давайте разберёмся: откуда вообще можно получить дополнительную информацию? Да практически откуда угодно: из интернетов через api, посредством передачи через uart, инфракрасный порт, gpio. По сути, любая информация, которую способна воспринять вычислительная техника может использоваться в качестве сенсора для умного дома — надо лишь проложить маршрут от источника вашей информации до сервера. Выйдите за границы, которые вам навязывают производители умной техники, вы стеснены в возможностях куда меньше, чем вас пытаются убедить!   Как же так вышло, что производители пытаются преуменьшить возможности в умном доме? Всё дело в том, что вендоры вовсю пытаются заарканить потребителя на свою экосистему. При этом такие экосистемы закрыты и немощны, и возможности пользователя там действительно ограничены уровнем "включить свет в 6:45", а в случае разрыва соединения с сервером, такой умный дом рискует оказаться тыквой. Производитель не может предоставить потребителю настолько гибкий функционал ввиду ограниченности ресурсов, а потребитель не может создать такой функционал ввиду закрытости платформы.   Да, существуют некоторые коллаборации, устройства экосистемы yeelight можно добавлять в экосистему Xiaomi, в хабы yandex/google/apple можно добавлять устройства от кучи производителей, но всё это не то (в связи с выходом Matter возможно в отдалённом светлом будущем это будет "то"). В этих хабах вы не сможете использовать в качестве условия срабатывания автоматизации понижение уровня воды в бочке вашего унитаза, для обнаружения которого вы смастерили датчик на arduino/esp (точнее в теории сможете, просто сделать это "слегка" посложнее).   Думаю, часть читателей уже догадалась, что я неумело пытаюсь подвести свою речь к хабам умных домов с открытым исходным кодом: Home Assistant OpenHUB Domoticz MajorDoMo Наверняка я указал не все хабы, а лишь те, о которых знаю сам. Отмечу лишь, работал только с Home Assistant и (совсем немного несколько лет назад) с OpenHUB.   Мои дальнейшие примеры будут идти через реализацию на Home Assistant, но идея, которая лежит в примере не ограничена каким-либо конкретным хабом.   Home Assistant — это приложение с открытым исходным кодом для автоматизации дома, которое ставит во главу локальное управление и приватность (перевод с главной страницы сайта). Приложение написано на python, может быть запущено на linux и windows, на raspberry pi и в виртуальной машине, в докере и без. Расширение функциональности приложения происходит через так называемые компоненты и интеграции, которые активно добавляются и развиваются сообществом, что позволяет добавлять в ваши автоматизации самые разные устройства и сетевые службы. Примеры фронтенда автоматизированного дома, базирующегося на Home Assistant (Через кнопку "Далее" на карточке в верхнем левом углу можно перейти к следующему примеру). Я уже долго мучаю вас вводными словами, давайте уже перейдём к конкретным примерам: зачем вообще нужны эти ваши умные дома, если я не падаю в обморок при подъёме с кровати, чтобы выключить свет. Представьте на секунду, сколько раз вы выключали свой будильник, ложились дальше спать и страдали из-за этого? Сколько было пропущено встреч, пар, занятий. Сколько раз вы заставляли ваших друзей и знакомых ждать вас, пока вы валялись в тёплой постели. Моя автоматизация лишила меня такой привилегии и сейчас я расскажу вам о ней. Есть один бородатый анекдот (настолько бородатый, что я называю его анекдотом, а не мемом): — Как гарантированно встать в 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`, который будет повторять значение нашего сенсора.  Такой костыль нужен для того, чтобы в качестве триггера на срабатывание автоматизации мы могли бы использовать платформу `time`:  Осталось понять, как вообще определять есть ли кто в кровати. Можно воспользоваться средствами компьютерного зрения в связке с камерой, круглыми сутками наблюдающей за кроватью, а можно... поместить под кровать датчик веса. В качестве таких сенсоров используют тензодатчики (в частности, в их роли могут выступать тензорезисторы). Принцип их работы заключается в следующем:   При растяжении проводящих элементов тензорезистора увеличивается их длина и уменьшается поперечное сечение, что увеличивает сопротивление тензорезистора, при сжатии — уменьшает.Wiki Иными словами, когда вы давите на тензорезистор, тот под действием деформации меняет свое сопротивление. Для измерения сопротивления используют такую электрическую схему, как мост Уитстона. Мост Уитстона — электрическое устройство, механическим аналогом которого являются аптекарские рычажные весы. При реализации этой схемы, я не заморачивался с тем, что такое мост Уитстона, а просто нашёл видео, в котором делается ровно то, что мне нужно (подключение тензодатчиков к микросхеме hx711). Но для полноты статьи, я нашёл очень простое объяснение, которое и приведу ниже: Схема моста Уитстона имеет два плеча сопротивления, каждое из которых содержит два резистора. Третья ветвь схемы — это соединение между двумя параллельными ветвями. Эта третья ветвь называется мостом. Ток течёт от отрицательной клеммы батарейки к верхней точке мостовой схемы. Затем, ток делится между двумя параллельными ветвями, причём количество тока, протекающее по каждой из ветвей, зависит от величины сопротивления в ветви. Наконец, ток возвращается к положительной клемме батарейки. При равных величинах сопротивлений равное количество тока течёт в каждой из ветвей. По мосту ток не течёт, на что указывает нулевое положение измерителя. При этом условии о мосте говорят, что он уравновешен. При неравных величинах сопротивления в ветвях, ток течёт в схеме от ветви с большим сопротивлением к ветви с меньшим сопротивлением. Это будет верно, пока два верхних резистора фиксированы и равны по величине, как это имеет место в схемах моста Уитстона, используемых в контрольно-измерительных системах. Измеритель на рисунке показывает, что ток в мосте течёт слева направо.  После того, как мы подключили тензодатчики к микросхеме hx711 и начали получать с неё цифровые данные, осталось подключить её к какому-либо микроконтроллеру/микрокомпьютеру, который будет отправлять данные в умный дом. Самый простой вариант, использовать плату esp32. С помощью проекта ESPHome, можно пробросить данные с микросхемы hx711 в умный дом используя esp32 не написав ни единой строчки кода (добавив только yaml-описание сенсора). После того, как мы пробросили данные в умный дом, осталось понять какие значения с датчика идут, когда на кровати никого нет, а какие идут, когда на кровати кто-то лежит, и применить к этому сенсору оконную функцию скользящего среднего (на случай возможных выбросов).  В качестве диапазона скользящего окна я использую 10 секунд. Поздравляю, с этого момента вы знаете, что кто-то лежал в вашей постели (правда всё ещё не знаете, кто). Ну, этот раздел зависит от каждого отдельного дома, и устройств, которыми тот может управлять, могу привести пример того, что сделано у меня: Начинается всё, как и у всех: на телефоне срабатывает мелодия будильника. Затем, если через 25 секунд я всё ещё нахожусь в постели, на моём компьютере на полную громкость включается музыка. Почему 25 секунд? Эмпирическим путём я пришёл к выводу, что мне требуется до 15 секунд, чтобы без промедления встать с кровати (иногда телефон валяется где-то зарытым в подушки, и мне нужно его найти). После требуется ещё 10 секунд на то, чтобы в фильтре установилось допустимое для будильника среднее значение. Вообще, такое воздействие относится к обоим типам причин подъёма: даже если вы пропустили обычный звонок будильника на телефоне, подобный "звонок будильника" вы не пропустите, да и спать под него не сможете. Но помимо прочего, здесь есть и нечто устрашающее: не важно, живете ли вы один или с семьёй, ор музыки на компьютере утром услышат и ваши соседи, чего вы вряд ли бы захотели.   Как заставить орать музыку на компьютере? Для начала, чтобы что-либо автоматизировать на компьютере, желательно научиться запускать это из командной строки, а дальше удалённо вызывать эту команду. Как запустить музыку из командной строки? Например, вот такой командой: Как вызвать эту команду из умного дома? Помимо управления по 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-ое декабря — день, когда всё покатилось к чертям...   *To be continued...* Habr: Разработчик компонентов умного дома Insteon отключил сервисы, оставив клиентов с нерабочими устройствами Build with Matter Home Assistant OpenHUB Domoticz MajorDoMo Документация приложения Home Assistant Compaion Википедия: Тензорезистор Youtube: How to use HX711 with Four Load Cells Измерительный мост Уитстона ESPHome Docs: HX711 Load Cell Amplifier Home Assistant Docs: Time Simple Moving Average Википедия: Скользящая средняя Github: HASS.Agent Github: HASS Workstation Service Gitlab: IOT Link Home Assistant integrations: Spotify Home Assistant Docs: Startup and Shutdown trigger Home Assistant Community: HA Shutdown Automations Don’t work?