Антон Рябов bio photo

Антон Рябов

Не люблю бриться и у меня умный взгляд.

Email Twitter Github RSS

Обзор

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

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

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

Дисплей, PHP и прочие непотребства

Так выглядит принципиальная схема работы первого девайса. Arduino совместимая плата Wemos D1, как я понимаю дешевый аналог Arduino UNO. К ней подключается стандартное питание кабелем microUSB. К плате подключен дисплей, сенсоры DHT22 (температура и влажность) и MH-Z19 (CO2). Раз в пять секунд, плата опрашивает датчики, выводит значения на дисплей и отправляет через Wi-Fi сеть (для этого используется впаянный ESP8266 чип) на удаленный сервер. Таким образом, на дисплее можно видеть текущие показания, а на сервере сохраняется история.

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

Дело в руки берет DevOps

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

В его конфигурации метрики отправляются в сервис, написанный на golang, который их просто держит у себя, а по ендпоинту /metrics отдает в формате Prometheus. В свою очередь, рядом работает Prometheus, который периодически приходит и забирает метрики, а затем это все отображается в Grafana.

Этот датчик работает у нас в офисе и показания с него выводятся на один из телевизоров с дашбордами. Несколько раз приходилось вносить незначительные правки, но в целом девайс работает.

Я все сделаю по своему

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

Cсылки на продавцов:

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

Prometheus, это удобный инструмент, который давно нужен был в Operations мире, но на мой взгляд, для решения данной задачи, он не совсем подходит. У Prometheus проблемы с хранением и выдачей данных за большие периоды, поэтому оставим его для оперативных данных.

У меня нет большого опыта работы с timeseries базами данных, а из документоориентированных моя любимая это Elasticsearch. Запустить Elasticsearch на маломощном сервере для хобби проекта - так себе идея, как в прочем и какую-нибудь OpenTSDB. После некоторого исследования я выбрал InfluxDB.

Почему-то InfluxDB отказались от записи в базу через JSON по REST API и оставили только простой текстовый формат, поэтому я выпилил из скетча (проект с кодом в терминологии Arduino) генерацию JSON и стал собирать строку. После первых тестов, я подумал, что оставлять открытую базу данных доступной кому угодно - плохая идея и прикрыл её авторизацией и HTTPS.

Повозившись с кодом для HTTPS и более менее протестив его, я привел схему к такому виду: девайс пишет по https метрики напрямую в InfluxDB, а Grafana их отображает. Таким образом я убрал лишний элемент из системы, что в теории увеличивает надежность, а также уменьшает путаницу при отладке.

Вот так, на данный момент, выглядит дашборд с показаниями девайса. Я решил назвать это Home station. Помимо собственно CO2, температуры и влажности также пишутся метрики свободной памяти и силы Wi-Fi сигнала. Ну а график в правом нижнем углу показывает что показания приходят стабильно (период 5 сек, следовательно, 12 показаний в минуту).

Бесконечность не предел

Я только начал знакомиться с миром микроэлектроники и он мне определенно нравится. Уже сейчас у меня есть куча идей что делать дальше, но продвигается все медленно, как и любое хобби. Из желаний конкретно по Home station уже можно составить целый список:

  1. говорят у Wemos D1 есть возможность в случае, когда не удалось подключиться к Wi-Fi сети (SSID и пароль задаются конфигом при компилировании), переходить в режим точки доступа, чтобы к ней можно было подключиться и переконфигурировать, хочу это проверить
  2. сейчас показания по сути в режиме read only, если уровень CO2 дойдет до критических значений, я об этом не узнаю, пока сам не посмотрю графики - нужно прикрутить алерты
  3. не всегда бывает удобно открывать сайт с графаной, хоть она и более менее адекватно работает на смартфонах, но хотелось бы иметь простой и быстрый способ узнать обстановку, например Telegram бот
  4. MH-Z19 помимо PPM возвращает также еще какие-то метрики, одна из них вроде бы показания датчика температуры, расположенного внутри и используемоего для калибровки - хочу в этом разобраться
  5. добавить сенсоры: природного газа (у нас в квартире газ), pm2.5 - важный параметр чистоты воздуха и возможно барометр

Статья разве не про качество воздуха?

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

Имея метрики CO2 под рукой, можно определить или наоброт исключить нехватку кислорода как причину и возможно легкое проветривание решит все проблемы. За то время что датчик стоит дома, я уже убедился в этом (газовая плита очень быстро выжигает кислород!). Если вы чувствуете дискомфорт в окружающей среде, с таким датчиком, можно получить конкретные цифры и исправить обстановку под себя.

#Arduino #HomeStation