Pull to refresh

Как от одного датчика дойти до полу-умной квартиры

Level of difficultyMedium
Reading time12 min
Views13K

Эта история началась где-то в конце 2019 года после знакомства с экосистемой Arduino. Пересмотрел и перечитал много различных роликов и статей по тому как готовить прошивки и подключать железки. Так наткнулся на проект по измерению концентрации CO2 в помещении (у одного известного блогера-ардуинщика). Стал погружаться в контекст и искать с чего бы начать. И это начало было положено с датчика измерения диоксида углерода - MH-Z19B.

Показания CO2 PPM и их влияние на человека. ГОСТ и то, что обычно находится на просторах сети
Показания CO2 PPM и их влияние на человека. ГОСТ и то, что обычно находится на просторах сети

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

  • WEMOS mini d1 (контроллер esp8266, основа)

  • MH-Z19B (датчик CO2)

  • AHT21 (датчик температуры и влажности)

  • Oled SSD 1306 (экран)

  • пачка медных проводов с припоем

  • клеевые стержни

Железка получилась простой как валенок. Что такое макетная плата и как её изготовить - тогда еще не знал. Да и это не нужно на этапе "ого, прикольно, оно еще и работает!". Так появилась версия 0.1

Прототип железки с показаниями. Температура, влажность, уровень CO2 и текущее время
Прототип железки с показаниями. Температура, влажность, уровень CO2 и текущее время

Такой прибор пролежал на рабочем столе примерно года два. Питание - зарядник по USB напрямую к WEMOS. Краем глаза поглядывал на значение диоксида и если выходило за пределы - ручками и ножками открывал окно на проветривание.

Версия 1.0 и расширение набора датчиков

Решившись взять ипотеку в новостройке с черновой отделкой, пришел к мысли, что нужна минимальная база для автоматизации быта. Которая заключалась в том, чтобы проложить витую пару по плинтусам в каждую комнату + санузлы и лоджия. И утвердить место для слаботочной щитовой. Гнал прочь мысли о том, чтобы заводить кабель в каждый электрический потребитель. Но спустя время осознал, что проложить силовую и слаботочную линию в вентиляционные отверстия было бы хорошей идеей. Чтобы автоматизировать приток воздуха с улицы.

После взял сервер на базе Atom N3350 (6Gb, 64Gb EMMC, WIFI, BT) с пассивным охлаждением. Установил Ubuntu и в докере поднял Home Assistant(далее HA), MQTT Mosquitto, Node-Red. Четкого плана, что и как должно друг с другом дружить - не было. Было примерное представление, что "нууу, нааверное с этого можно начать".

В прошивке своей железки добавил поддержку MQTT и настроил HA для отображения данных.
В прошивке своей железки добавил поддержку MQTT и настроил HA для отображения данных.

Со временем Oled экран на железке стал выцветать. Как оказалось, это известная проблема. Возникла идея добавить датчик движения и датчик освещения, чтобы включать экран тогда, когда рядом кто-то есть. И если света мало, то включать экран только на 50% яркости.

На этом шаге миниатюрность закончилась и захотелось видеть более целостное устройство, а не просто пачку проводов перемазанных клеем. Так потихоньку стал изучать как рисовать электрические схемы и как организовать расположение элементов на печатной плате. Само собой первые версии были не идеалом и с ошибками.

Версия 1.0 пополнилась следующими компонентами:

  • BH1750 (датчик света)

  • Led strip WS2812D-F8 (полоска из 8-10 адресных светодиодов)

  • DS18B20 (герметичный датчик температуры)

  • Water-sens, MH-sensor-series (датчик воды)

  • PIRO AM312 (датчик движения)

  • MQ7 (датчик угарного газа)

  • servo (сервопривод)

MQ7 датчик и сервоприводы добавил с заделом на будущее, что возможно они понадобятся и у меня будет уже готовая распайка. Так и не пригодились

Питание организовал через mini DC-DC преобразователь (12->5V, 3А в пике). Так, чтобы было с запасом и на микросхему и на периферию.

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

Первая версия платы. Первый блин комом
Первая версия платы. Первый блин комом

Месяц ожидания и на руках свежий, напечатанный набор из 5 плат. Пайка, сборка, тестирование и ничего не работает! Мультиметром стал проверять где и что приходит и где отваливается. Оказалось что перепутал полярность при развязке питания после DC-DC преобразователя. Ну с кем не бывает? Провода, пайка, правки в схеме.

Попытки систематизировать схему работы и организация всей системы.
Попытки систематизировать схему работы и организация всей системы.

Первая плата на рабочее место. Датчик движения работает, экран выключается, показания считываются. Ох, какой же это кайф видеть результаты своей работы! Вторая плата уже пошла в ванную. Там датчик протечки и на будущее Led лента на подсветку в виде ночника. Все встало без особых проблем.

Примерная схема питания и работы всей схемы.
Примерная схема питания и работы всей схемы.

В самом начале решил, что контроллеры не будут питаться от батареек. Нет желания менять в самый ответственный момент. Или без возможности сменить, если никого нет дома. Питание организовал через 4 жилы витой пары. В щитовой стоит ИБП, после блок питания 220->12V, 5А - дальше витая пара приходит на железки и через DC-DC питает Wemos и прочую периферию.

Прошивку писал сам и обновлял через USB кабель. Т.е. что-то поправил, беру ноут, иду на место к железке (в ванную комнату), через кабель заливаю новую прошивку и проверяю, что работает. Что такое OTA(обновление по воздуху) уже знал, но не разбирался как настроить. Не так часто приходилось ковыряться с кабелем. На тот момент было больше интереса самому возиться с кодом и коммуникациями. Так получил хороший (как мне кажется) опыт того, что в железках самое сложное это не написать код, а отлаживать в реальных условиях. Дебаг, проверки, логи, веселье, повторить.

Сервер научил работать с телеграм ботом и отправлять уведомления, если произошла протечка в ванной. Да и в целом из всего набора, что там установлен, использовалось только HA и Mosquitto. Остальное пробовал затащить, но по тем или иным причинам не получило дальнейшего развития.

Версия 1.1

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

Попытка учесть опыт прошлых ошибок в минимальном размере
Попытка учесть опыт прошлых ошибок в минимальном размере

На схему был добавлен тумблер (питание на периферию), возможность замены на второй экран на базе SSD1309(чуть больше по размерам) и переделано расположение компонентов. А также уменьшил размер "коробки". Расчет был на то, что новая версия будет стоять на виду и не портить внешний вид. Всего получалось 6 таких "коробок" на квартиру. 3 датчика протечки, 3 датчика диоксида углерода. Две платы первой версии были собраны и работали последние полгода без особых проблем. Осталось собрать остальные. Сейчас больше думаю, что было бы любопытно найти какой экран на IPS с I2C интерфейсом, похожий на ST7789. Или вовсе отказаться от экрана за ненадобностью.

В ожидании и после сборки.
В ожидании и после сборки.

Погодная станция

Наверное каждый, кто так или иначе связывался с Arduino, приходил к подобному умозаключению: "И таааак. Я умею писать прошивки и моргать светодиодом. Настало время отслеживания показаний погоды! Пора собирать станцию!". Так в моем наборе появился экран на электронных чернилах LILYGO T5-4.7 на базе ESP32.

В большинстве прошивок, что находил для этой железки, внешние сервисы погоды прописаны в коде явно. И это всегда один сервис. Нет возможности ни переключиться, ни добавить какую-то дополнительную информацию без изменения самой прошивки и само собой - заливки изменений. Значит нужно сделать свою, которая будет заниматься только отображением данных. А сами данные будет подготавливать мой сервер.

Схема работы простая. Железка находится в deep sleep и просыпается согласно заданного таймаута. Подключается к wifi, и делает один запрос на мой сервер. Который асинхронно собирает данные из внешних сервисов, устанавливает через какое время проснуться снова, конвертирует все в JSON формат и отдает обратно в железку. Она парсит данные, рисует что умеет и засыпает. Т.е. основная работа и формирование данных происходит на сервере. Можно парсить несколько разных источников и агрегировать в одну схему все данные. Железка выступает только в роли представления этих данных.

// Weather station data format
export type DeviceResultRequest = {  
  sleepSeconds: number  
  blocks: {  
    total: number  
    items: DeviceItem[]  
  }  
  isDev?: boolean  
  devSleep?: number  
}
Схема работы погодной станции
Схема работы погодной станции

Питание организовано с помощью одной банки 18650 на 3400 мАч. Заряда хватает до 7 месяцев. При достижении порога напряжения, на экране пишется, что требуется зарядка и железка выключается. Иногда думаю накатить оптимизаций и увеличить время работы до года или больше. Но пока не сильно напрягает вечером разок зарядить одну банку.

Висит на полке у входной двери на уровне глаз.
Висит на полке у входной двери на уровне глаз.

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

Все исходники тут: https://github.com/dudiq/weather-station-serv

Esphome

Почти год пролежали отчасти собранные платы версии 1.1. До щита по слаботочке никак не доходили руки, да и организовать его правильно не хватало умений. Но оставлять на скрутках и потом пытаться понять что куда к чему цепляется - не хотелось. Со словами нет ничего более постоянного, чем временное попробовал собрать как есть на wag коннекторах и заодно подписал что есть что. Добавил тумблеры и подключил схему к блоку питания. Так появилась возможность выключать платы по отдельности, а не глушить сеть целиком.

Часть витой пары идет из стены, часть с потолка. Ибп питает и сервер и слаботочный щиток.
Часть витой пары идет из стены, часть с потолка. Ибп питает и сервер и слаботочный щиток.

Когда писал первые версии прошивки, то конечно находил различные варианты уже готовых систем или подходов организации контроллеров. Также встречал Esphome/Tasmota. Но тогда мне было интересно самому разобраться как организовать работу девайса так, чтобы он был стабилен и не требовал к себе дополнительного внимания. Когда количество железок увеличилось до трех и набор датчиков увеличился в два раза, то стало понятно, что тут уже не обойтись прошивкой по воздуху. Гораздо удобнее сидеть на рабочем месте, нежели чем бегать по квартире с проводами и обновлять каждую железку. Так потихоньку моя прошивка ушла в архив и появилась реализация конфига на Esphome.

Смысл заключается в том, что за счет yaml файлов, можно собрать прошивку, которая уже будет готова работать с HA и MQTT. Учитывая что железная часть прошла обкатку и не выкинула проблем, то переход на Esphome прошел безболезненно. Все датчики подключились, сразу же появились в HA и оставалось только перенастроить автоматизации.

Все выглядит как-то очень красиво и достаточно просто настраивается. Но ложку дегтя подложил внезапно wifi. Дом многоквартирный и количество сетей достаточно большое на квадратный метр. Учитывая что канал связи 2.4Ghz забит, то реконнекты и отваливания железок - предсказуемое поведение. Все что можно сделать, это уехать за город затюнить максимально роутер и конфиг для железок. И учитывать время на переподключения при настройке автоматизации по мониторингу. Пока играюсь power_save_mode в конфигах и выставил ширину канала в 20Mhz у роутера. Если железка не доступна более чем 5 минут - сервер отправляет уведомление в телеграм.

Пример конфига https://gist.github.com/dudiq/07853d504a1bf6eae5e32ff938ace816

Сервер и автоматизации

Очередной этап модернизации пришелся на сервер и его окружение. В первую очередь в роутере настроил отдельную wifi сеть под IoT устройства. Выход в глобал есть только у сервера, всем остальным - доступ запрещен. После взял SSD на 500Гб стал уже настраивать сам сервер. Сервисы сразу поднимал через docker. Не хватало только нормального роутинга на тот или иной сервис. Все было в формате home.local:PORT_NUMBER. А хотелось что-то типа ha.home.local. В процессе поиска нашел разные варианты развертывания окружения. Кто-то ставит proxmox, кто-то через тот же docker и traefic/nginx-proxy-manager разруливает роутинг. Выбор пал на связку docker+traefic. А за ним подоспели и остальные: portainer, watchtower, jellyfin, glances. При переносе сервера на новое железо, развернуть снова будет легко Ubuntu + docker compose up. Супер просто и удобно.

docker-compose и тупой dashboard https://github.com/dudiq/ha-serv

Чтобы быть уверенным в том, что домашний сервер работает и с ним все хорошо, нужно организовать так называемый heartbeat. Суть достаточно простая. Мой сервер раз в 5 минут делает POST запрос на внешний сервис и если в течение 15 минут никаких запросов не было - прилетает письмо, мол что-то пошло не так. Таким образом если вдруг выключат электричество или отрубится интернет в квартире, я буду об этом знать. И нужно предпринимать какие-то действия. Если конечно не пропущу это письмо.

alias: heartbeat server
description: ""
trigger:
  - platform: time_pattern
    minutes: /5
condition: []
action:
  - service: rest_command.heartbeat_server_ping
    data: {}
mode: single
rest_command:
  heartbeat_server_ping:
    url: "https://cronitor.link/p/<ID>"

Дальше подошла очередь на доступ к состоянию системы извне своей локальной сети. Выставлять наружу веб интерфейс нет никакого желания. Поэтому пригляделся вариант настройки через телеграм бота. По умолчанию HA имеет под капотом возможность интеграции с телегой. Те же датчики протечки или уровень СО2 уже работали и сервер отправлял сообщения при достижении пороговых значений. Но не хватало двунаправленного канала связи. Особенно поймут те, кто уходит из дома и возвращается обратно спустя пару минут. Думая, что забыл закрыть. Так добавил автоматизации на получение статуса девайсов и значения по некоторым критичным датчикам (протечки, температура отопления). Плюс появился еще один датчик закрытия входной двери через концевик. Моя кукуха на этом абзаце передает привет.

Ответ от бота в телеге
Ответ от бота в телеге

Уведомления стоит отправлять только на те события, которые явно требуют действия. Остальное это шум, который не должен отвлекать. Согласно этой концепции, получается что система автоматики должна быть не видна, делать рутину и занимать минимальное время на обслуживание. В таком подходе даже нет необходимости настраивать HA dashboard и выводить датчики и показания. Все настраивается сценариями работы. А система только просит внимания при важных событиях.

alias: Alert Leak automation
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.bathroom_waterleak
      - sensor.waterleak
      - sensor.kitchen_waterleak
    below: 1
    for:
      hours: 0
      minutes: 0
      seconds: 5
condition: []
action:
  - service: notify.important_telegram_alerts
    data:
      message: 🚨 Протечка в {{trigger.to_state.attributes.friendly_name}}! 🚨
  - wait_for_trigger:
      - platform: numeric_state
        entity_id:
          - sensor.bathroom_waterleak
          - sensor.waterleak
          - sensor.kitchen_waterleak
        above: 0.9
    continue_on_timeout: true
  - service: notify.important_telegram_alerts
    data:
      message: 🆗 Протечка {{trigger.to_state.attributes.friendly_name}} локализована
mode: single

Пример HA автоматизации по протечкам и отправка сообщений в телеграм группу

Уведомления, что есть в системе:

  • Протечка где-либо

  • Высокий уровень СО2

  • Падение температуры в батареях по зиме (Отопление поквартирное)

  • Отправка письма на email при недоступности сервера

Еще один важный момент. Есть два канала связи в телеге. Первый это группа для жильцов квартиры. Туда прилетают только самые важные уведомления. А второй канал - это служебная информация и управление - директ с ботом. Туда валится например история, если какой либо девайс отвалился и обратно вернулся в строй. То, что нужно для дебага или управления автоматикой. Например запросить состояние системы и узнать показания датчиков.

Отдельно напишу про Node-RED. Система гибкая и позволяет выстроить всевозможные схемы автоматизации. Много плагинов, а так же можно самому писать скрипты. Но не зашло. Не хватает типизации. Непривычно писать в функциональном стиле автоматику и думать про разные потоки данных. Решил что моих тупых сценариев с головой хватает описать в стандартном блоке HA и куда проще отлаживать или переделать. И поддержка скриптов. Если кода получится очень много, то возвращаться спустя полгода - скорее будет сложновато.

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

Все схемы подключения различной периферии.
Все схемы подключения различной периферии.

Заключение

Осталось придумать корпус, чтобы все хозяйство было упаковано и красиво смотрелось в углу комнаты или под шкафом каким. Также хочется перевести с Wifi на Matter, чтобы хоть немного разгрузить радиоканал. Относительно недавно появилась возможность нового протокола на базе ESP32C3. Но пока не исследовал поддержку в Esphome и опять же нужно придумать переходник на текущие устройства.

В планах перевести большинство сенсоров на I2C шину. Как пример отказаться от MH-Z19B и перейти на SCD41. Проще использовать только 4 общих контакта от контроллера и через них управлять устройствами, а не занимать все ноги.

Хотелось бы конечно настроить еще принудительную вентиляцию через приточку и разобраться с проветриванием помещения, отопления и поддержанием уровня влажности. Но это далеко идущие цели. И тут уже нужны профильные люди, для расчетов. Так что пока довольствуюсь тем что уже сделал.

Во сколько обошлась вся затея?

Поскольку проект растянулся на несколько лет, то сказать сколько стоила система целиком - сложновато. Но попробовал составить таблицу исходя из цен на январь 2024.

Базовый набор на 6 устройств, сервер и обвязка:

р.

ед.

р.

USD

WEMOS D1 MINI (esp8266)

140

6

р.840

$10,04

MH-Z19B

1500

3

р.4 500

$53,81

AHT21

90

6

р.560

$6,70

Screen OLED SSD1306

130

3

р.390

$4,66

Screen OLED SSD1309

500

3

р.1 500

$17,94

Led strip Ws2812D

250

2m

р.500

$5,98

BH1750

54

6

р.324

$3,87

DS18B20

120

6

р.720

$8,61

MH-sensor-series (Raindrops Detection)

60

3

р.180

$2,15

PIRO AM312

50

6

р.300

$3,59

SMD1206 resistors

300

1pac

р.300

$3,59

SS8550 transistors

100

1pac

р.100

$1,20

DC-DC 3A 5V stepdown

6

60

р.360

$4,30

PCB Prototype v1

10

1

р.836

$10,00

PCB Prototype v2

36,8

1

р.3 078

$36,80

Metal box

2000

1

р.2 000

$23,91

Connectors

500

1

р.500

$5,98

AC-DC Driver 12V 5A IP67

2000

1

р.2 000

$23,91

Server (Atom N3350)

7168

1

р.7 168

$85,71

р.26 156

$312,74

Тут еще не хватает e-ink esp32, бухты кабеля, ИБП и прочей мелочевки.

Было любопытно отследить то, с чего начиналась эта маленькая затея и то, к чему пришла. Понял, что когда делаю какой либо проект, нужно отмечать прогресс или регресс по нему. Дабы спустя время сделать оценку результата и двигаться дальше. Нужно больше заметок на полях, пометки с фотофиксацией и датами. Куда проще потом собирать этапы проекта. Trello с карточками появился на моменте первой печатной платы, когда задачек стало много. Но похоже надо было после завершения карточки делать еще и фото, перед тем как отправить в столбец done.

Таким вот незамысловатым способом из одной железки мониторинга уровня СО2 получилось дорасти до полу-умной квартиры, управляемой с помощью HA и MQTT. В процессе сталкиваясь с различными проблемами, удалось создать функциональную и настраиваемую систему. И благодаря наличию open-source - создавать подобные штуки по типу "сделай сам" стало кудааа проще, чем когда-либо.

Tags:
Hubs:
Total votes 33: ↑33 and ↓0+37
Comments39

Articles