×

Как понять, чем сейчас дышит Киев: тернистый хардварный путь ЛУН

Привет! Мы команды «ЛУН Місто» и факультета радиофизики, электроники и компьютерных систем КНУ им. Шевченко (ФРЕКС). Полтора года назад мы решили ответить на вопрос «Чем в данный момент дышат Киев и пригород?». Для этого пришлось разработать свои станции качества воздуха — «ЛУН Місто Air». Всего в создание нашей системы мониторинга воздуха было вовлечено около 10 человек. Костяк команды — шесть человек.

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

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

Какая задача была изначально

Разработать портативную outdoor-станцию оценки качества воздуха, покрыть Киев сетью таких приборов и открыть доступ к данным о состоянии воздуха для всех желающих.

Определившись с задачей, мы столкнулись с рядом вопросов, которые предстояло решить. Вот некоторые из них:

  • Что будем измерять?
  • Как именно будут производиться замеры?
  • Как будет выглядеть станция?
  • Должна ли станция питаться от сети или работать автономно?
  • Подключаться к Wi-Fi или использовать мобильную связь?

Измерять решили мелкодисперсную пыль (PM1, PM2.5, PM10) — очень мелкие частички, которые не видны невооруженным глазом. Из-за своего малого размера они могут проникать через природные барьеры организма в кровь. Высокая концентрация этих частичек плохо влияет на работу сердечно-сосудистой системы, легких, мозга. Именно концентрацию PM2.5 измеряют многие indoor-станции Китая, где проблема качества воздуха актуальна давно.

Начав сравнивать разные сенсоры измерения мелкодисперсной пыли, мы остановили выбор на конфигурациях сенсора Plantower PMS — 3003/5003/7003/A003. Он работает на основе рассеивания лазерного излучения, как в профессиональных калиброванных сенсорах. Плюс PMS используется в устройствах, прошедших тестирование американской программы оценки эффективности работы датчиков качества воздуха AQ-SPEC.

Вначале мы рассматривали также сенсор SDS, но он не давал «сырые данные» по частицам, чтобы можно было самостоятельно вычислить концентрации. И в некоторых случаях этот сенсор занижал показатели.

Как разрабатывали прототип

Спустя месяц работы, который мы начали с рисерча научных статей по теме, у нас был первый прототип станции. Мы назвали его просто «Станция в коробке»:

Сенсор, помещенный в квадратный пластиковый корпус с отверстиями для вентиляции, передавал данные по GSM. Коробка была неплоха, но не соответствовала нормам ЕС оценки качества воздуха. Прежде всего пункту о том, что сенсор должен крепиться на расстоянии 50 см от стены здания, чтобы обеспечить чистоту замеров. Наш эксперимент тоже показал, что размещение на стене нежелательно — пыль с нее дает пики.

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

Так мы перешли ко второму прототипу. Назвали его «Танк да Винчи»:

Танком он стал из-за колпака на конце метровой пластиковой трубы. Форма колпака напоминала чертежи да Винчи. На самом же деле и трубу, и колпак для прототипа мы купили в обычном строительном супермаркете. С покупкой труб проблем не возникло, а за колпаками пришлось поохотиться — объехать пару супермаркетов и скупить там все.




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

Чтобы отпугнуть не знающих физики хулиганов, наклеили на станции таблички «Осторожно! Под гравитацией!». Первой же ночью одну станцию сломали — украли сенсоры (видимо вор интересовался наукой). Вторую станцию увели полностью. Мы шутим, что провели тогда не столько технический, сколько социальный эксперимент.

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

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

Третий вариант станции получил кодовое название «Селфи-палка».

Помогла случайность. В лаборатории под руку попалась алюминиевая трубка. Легкая, прочная, приятная на вид — идеальное решение для конструкции.

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

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

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

В ходе экспериментов третий прототип станции менялся несколько раз. Он становился все компактнее. Быстро менять корпусы позволяло то, что все пластиковые детали мы печатали на 3D-принтере. Несколько часов — и готово.

Исследования подсказали и то, что сенсоры от микрокомпьютера нужно отделять. Этот подход реализован в «Селфи-палке».

В итоге сенсоры находятся за окном на конце алюминиевой трубки, под тарелкой, прикрывающей их от дождя. А микрокомпьютер располагается в квартире: так его излучение не влияет на датчики, а на него не влияет погода.

Это принципиально отличает станции «ЛУН Міcто Air» от других, где сенсор и микрокомпьютер находятся рядом. Такая конструкция станции — наше ноу-хау, оно позволяет получать более точные показатели и сделать станцию более долговечной.

Но сенсоры на улице тоже хотелось защитить. Как это сделать? Покрыть лаком. Забежали в первый попавшийся супермаркет — купили прозрачный лак для ногтей с витамином Е. Он очень вонял. И еще сильнее воняла жидкость для снятия лака. Рады были перейти на профессиональный лак для микросхем :)

Также в процессе экспериментов мы отказались от передачи данных по GSM — используем Wi-Fi. GSM давала наводки — влияла на показания сенсоров.

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

А теперь о программной части

При создании станции были следующие требования:

  • Сохранение данных при отсутствии интернет-соединения.
  • Сжатие данных.
  • Модульность для сравнительно легкого добавления новых датчиков без вмешательства.
  • Возможность независимой работы датчиков для предотвращения потери данных.
  • Автораспознавание сенсоров и подключение в режиме Plug and Play.

Все это реализовано на Python. Дополнительно рассматривали Lua, но в нашем случае была более актуальна читаемость кода и простота отладки всеми участниками команды, нежели скорость. Из-за этого не использовали и C/C++/Golang, пока попросту не встретились с блоками, которые требуют относительно высокой производительности.

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

Во время тестирования часто сталкивались с нестабильным Wi-Fi — так появилось сохранение данных с архивацией и возможностью выгрузки после восстановления. Одна с тестовых станций таким образом сохранила данные за последние три дня, которые удалось успешно выгрузить.

На серверной части API реализован на Go, хотя первая версия была на JavaScript. По мере возрастания нагрузки и усложнения логики обработки перешли на Go. Рассматривали также Rust, но для наших задач возможностей Go целиком хватает.

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

Выводы

Если подсуммировать весь опыт в нескольких тезисах, получим:

  • создать прибор с нуля сложно, но интересно;
  • для точности показаний нужны эксперименты и научный подход;
  • ЗD-принтер удобен для прототипирования: можно легко и быстро усовершенствовать конструкцию;
  • готовые сенсоры мало просто купить — нужно изучить их работу и откалибровать;
  • список того, что может влиять на показатели, длинный — нужно постараться выявить каждый фактор и учесть его.

В планах — установить в Киеве и пригороде 200 станций, работать над стабильностью и точностью, прокачать корпус. Также думаем над легкостью и скоростью масштабирования станций — сейчас надо очень много паять :)

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось1
До обраногоВ обраному13
LinkedIn

Схожі статті




72 коментарі

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

Ви помічали, що ваші станції дають стабільно вишчий рівень забруднення, ніж з luftdaten.info?
Київ з вашої мапи
Київ з https://www.saveecobot.com/
Навіть видно, що деякі станції дублюються (надсилають данні в 2 бази?)

Дані з наших станцій виводяться і на карту SaveEco.

Щодо показників. Наші станції і станції Luftdaten використовують різні сенсори PM.
У нас Plantower PMS 3003/5003/7003/A003, такі використовуються у пристроях, які пройшли тестування американської програми оцінки ефективності роботи датчиків якості повітря AQ-SPEC. Всі наші станції калібровані між собою та з пристроєм Vaisala AQT420, внесеним у «Реєстр затверджених типів засобів вимірювальної техніки».
Крім того, наші станції мають особливий корпус. Ми конструювали його так, щоб він не обмежував повітрязабір.

Круто.
Але нажаль, це означає, що київ ще брудніший, ніж здавалося.

а чи планується mobile апка на appstore? було б дуже зручно мати віджет з показниками на телефоні, такий самий як на головній misto.lun.ua (рядом з віджетом про погоду ;))

Віджет є у планах, так

Вопрос: а почему вы усредняете данные за интервал времени, а не используете, скажем, бегущую медиану за тот же самый интервал? Медиана будет устойчива к выбросам и ее можно быстро вычислять онлайн. В ЛУН есть дата саентисты, спросите у них.

Баг? Датчик возле Урловской

Максимум за 48 годин:
08 жовтня 2020, 12:00
AQI: 73
PM2.5: 53.1мкг/м3
PM10: 68.8мкг/м3
PM1: 30.8мкг/м3

Максимум за 30 днів:
02 жовтня 2020
AQI: 64
PM2.5: 44.3мкг/м3
PM10: 56.1мкг/м3
PM1: 26.7мкг/м3

В первом случае считается среднее за час, во втором — среднее за день
Поэтому не совпадает

Ну тогда поменяйте текст. Максимум за 30 дней не может быть меньше максимума за 48 часов. Сразу глянув текст и циферки доверие к этому сайту упало ниже плинтуса.

В смысле не может быть меньше? Там же даты разные, 02 октября это за предыдущие 30 дней, а 8го за предыдущие два.

Максимум за предыдущие 30 дней включает в себя максимум за предыдущие 48 часов. Это же элементарная логика.

Максимум за 48 годин — від 8-го жовтня (тобто за 7-8 жовтня).

08 жовтня 2020, 12:00

Максимум за 30 днів — від 2-го жовтня (тобто за період з 2-го вересня по 2-е жовтня).

02 жовтня 2020

Ці періоди не перетинаються. Зовсім. Тож не зовсім зрозуміла ваша претензія до розбіжності показників.

І куди дівся період 2-го жовтня до 7 жовтня? :)

А це вже не до мене питання.

инфлюкс с графаной очень любят по дефолту mean, вероятно разработчики решили сильно не вникать. получилось не максимум а максимальное среднее в неизвестном интервале квантования )

Такий варіант не виключений

Так вот кто скупил все пластиковые колпаки в Эпицентре!

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

что за запах? это от озера Вырлица, которое бессточное. На его берегу есть мусоросжигательный завод и станция аэрации «Бортничи» — соответственно, попробуйте представить, чем это озеро может пахнуть

Так і є. Вам же написали про станцію аерації.

я вас прошу, было бы там плохо — новые бы жилые массивы там не строились и самое главное — не раскупались бы) ну смердит немного, но терпимо, значит, всё норм)

судя по комменту у вас такой же уровень понимания проблематики, как и у тех, кто там строит, и тех, кто там покупает жилье.

По итогу просто напечатали на 3Д принтере корпус для готового датчика PMS за $10? Хотели знать чем дышит Киев — зайдите на waqi.info и посмотрите. там данные со всего мира на волонтерских началах. Там же найдете инфу что одного датчика PMS мало — для станции нужно 3+. И воздух в датчик должен попадать подогретым потому что в туман будет он показывать 2000. Про мозги для станции ни слова. На фотке SoC аналог малинки, могли бы туда полноценный x86 запихнуть Ryzen 3950x не меньше, че уж там. Все для того чтобы надежно считывать данные по Serial port на скорости 9600 бод :)
Подсказка — для того чтобы сделать сервис мониторинга воздуха не нужно делать свои станции, можно просто использовать API aqicn.org — апишка шаровая :) И да, на сайте данные со станций которые замеряют не только пыль (PM) но и другие газы.
Вывод — очередная попытка покрасить траву в зеленый :)
P.S. из рубрики «а лучше бы вы...» — лучше бы вы контрибьютили во всемирный сервис мониторинга воздуха, а не пилили свой аналог с лейбой лун. и не рекламировали в ФБ за $$$ ссылку на эту статью))
Всем мир и чистый воздух !

Интегрироваться с waqi/aqicn и т.д. безусловно нужно и я надеюсь команда ЛУН это сделает в будущем, но я не скажу что там какие-то супер станции стоят (смотрел Киев). Большинство также меряют 3 показателя, точно так же неправильно реагируют на туман и дождь, и т.д. В конечном итоге, чем больше будет станций тем лучше, имхо.

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

Ну как зачем свой велосипед?
заходишь сейчас на aqicn.org — в центре киева все желтое от 60 до 100 в разных местах.
А заходишь на лун — все зелененьнкое 20-30 — и сразу намного легче дышится ^_^

Дані на нашій карті показують середнє за 2 хвилини і оновлюються у реальному часі. Тобто «жовте» так, було, але показник вже змінився на «зелене». Архівні дані за 48 годин можна переглянути, клікнувши на коло станції.

Ну вот я еще раз это повторил, все желтенькие с aqicn.org тоже пишется время обновления 2-6 минут назад. А картинка очень по-разному воспринимается
imgur.com/a/kMktgJi

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

Мы выводим среднее за 2 минуты
А aqicn.org выводит среднее за 60 минут. То есть каждые 2-6 минуты среднее за час.

А вы не проверяли насколько ваши данные совпадают с aqicn.org в том случае, если вы начинаете усреднять за тот же период, что и aqicn.org ?

На Лівобережному масиві знайшов спільні географічно точки, присутні одночасно на aqicn.org/station/ukraine/kyiv та misto.lun.ua/air, можливо використовують спільні датчики або просто збіг

aqicn.org — агрегатор даних, тобто він бере їх з різних джерел. Зокрема з нашої карти. Але зараз він тягне наші дані з агрегатору СейвДніпро — тому дані підписані цим ресурсом, а не нашим. Ми вже займаємося цим питанням

Замечательный проект!
На какие работы вы опирались создавая этот проект?
Были ли идеи добавить датчики газов, например, диоксид азота, двуокись углерода и прочие, что были бы помогали с анализом воздуха в промышленных городах?

Я заметил, что показания оптических датчиков зависит от ветренности местности. Если сильный ветер — подымаются мелкие частицы, что дает соответствующие показания. Как только ветер утихает — всё стает в норму.

Щодо газів, так, ми розглядаємо такий варіант. Конструкція «тарілки» сконструйована так, що передбачає додавання сенсорів.

Так если у вас lan есть, почему бы не добавить PoE? Сразу и питание и данные.

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

Так а все-таки интересно, как отличались показатели в зависимости от высоты размещения датчика?

Продовжуємо аналізувати це питання

Поделитесь результатами анализа? :)

Так, про всі новини проєкту пишемо тут t.me/lunmisto

Дякую за досвід, цікаво.

не использовали и C/C++/Golang, пока попросту не встретились с блоками, которые требуют относительно высокой производительности.

Скажіть, ви розглядали використання PyPy?

Не знаю, как сейчас, но раньше PyPy можно было подключать только с ограниченным набором библиотек. Гораздо удобнее использовать Cython — микс Python и С с максимальной производительностью, полным контролем над выделением памяти и доступом ко всем питоновским библиотекам.

Після вашого коментаря, захотів перевірити актуальний список бібліотек, що підтримуються, випадково натрапив на інфо щодо Numba(як альтернативу PyPy, Cython), про яку раніше не чув. Дякую.

Кстати, по факту я пытался PyPy — дает ЗАМЕДЛЕНИЕ работы на реальных задачах(на 4х из 5ти где я его пробывал).
В момент его выхода он питон делал в разы, сейчас питон сам по себе пооптимизировали.

Просто в питоне 3.8+ из pypy натаскали кусочков и свое сделали почти такое же.

Чи є у вас інтеграція з якимись іншими системами, що показують якість повітря по всьому світу? Чи з телеграм-ботом @aqualitybot ?

Працюємо над цим

«База данных — InfluxDB. Остановились на ней из-за сравнительно высокого сжатия данных, поскольку данные у нас на станциях снимаются каждую секунду.»

а что вот это значит?

ПС для доу хочется технических подробностей от технических специалистов, а то вопросов возникает много а поговорить не с кем )

Передаю вам відповідь техспеца)
Це означає, що для нас важливе стиснення даних, оскільки їх (даних) багато генерується (і буде ще більше генеруватися) станціями, а для аналізу потрібно зберігати деталізовані дані за великі проміжки часу (6-12 місяців) без попередньої обробки та агрегації (downsampling data).

ну понятнее не стало, сжатитие то тут причем и о каком сжатии идет речь.
я с трудом представляю как вы планируете этими станциями генерировать объем данных который стал бы проблемой именно в части накопления, а если представить что это случится — вы же в курсе что кластерный инфлюкс стоит очень странных денег?
Ниразу не против инфлюкса, сам использую на паре проектов но довод про сжатие выглядит очень не понятным

Mariadb + RocksDB Engine дает как минимум не худшее сжатие и более привычные фичи.
У меня как раз есть системы генерящие гигабайты в день, сжатие в среднем около 10-12.

Я думаю просто проект писали як дипломну роботу, тому й вибрали базу з якою хотіли погратись

Mariadb + RocksDB Engine дает как минимум не худшее сжатие и более привычные фичи.

InfluxDb це ж якраз DB special for timeseries. Дуже просто встановлювати, + підтримується Grafana для візуалізації метрик.

и это очень вразумительные доводы, а не вот это все что выше ) Единственный нюанс стартовый с инфлюксом — в бесплатной версии он не скалируется, что может крепко завалить в будущем

А мария сейчас сложно ставится чтоли?Аж одной командой, она в основных репозиториях давно. Графана тоже поддерживается.

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

Попробуйте сохранить в mariadb на одном компе 10 триллионов (именно триллионов, а не миллиардов) строк со скоростью вставки 1 миллион строк в секунду и потоком запросов на чтение в 100-200 запросов в секунду. Не получается? А у специализированной СУБД для временных рядов — спокойно получается — см. github.com/...​s/wiki/CaseStudies#wixcom

Простите, там же
>>The average time series churn rate is ~3M per day.
Потому как то странно про миллион в секунду входа.

А вообще у меня aerospike под нагрузкой работает. Да быстрее mariadb, да, практически гарантированная скорость запроса(меньше 5мс), но куча всяких приколов и нет транзакций.

Time series churn rate — это сколько старых рядов заменяется на новые в течение суток. В каждом временном ряду содержится много значений (строк) для разных timestamp’ов. Временной ряд идентифицируется его именем плюс набором его лейблов (aka тэги). Смена хотя бы одного лейбла приводит к созданию нового ряда.

А в чем смысл хранить детальные посекундные данные за полгода назад? Даже если апроксимированать данные за каждый час, то будет природное «сжатие» в тысячу раз.

давайте сначала разберемся в чем проблема хранить посекундные данные за полгода

Це означає, що для нас важливе стиснення даних, оскільки їх (даних) багато генерується (і буде ще більше генеруватися) станціями, а для аналізу потрібно зберігати деталізовані дані за великі проміжки часу (6-12 місяців) без попередньої обробки та агрегації (downsampling data).

думаете если повторить будет понятнее?) 6-12 месяцев это не 120 лет, если предположить что ребята боятся за каждый байт то в случае с конкретно инфлюксом означает что у них нет тегов на метриках, на таких данных 6-12месяцев это огромное количество отсчетов*измерения без проблем. А если теги таки используются то инфлюкс катастрофически не эффективно юзает диск на тегах (не путать с филдами) и тогда довод про сжатие вызывает недоумение еще больше

Почему не используете VictoriaMetrics? Она поддерживает прием данных по Influx протоколу, потребляет меньше ресурсов, сжимает лучше данные и предоставляет язык запросов MetricsQL, который основан на PromQL из Prometheus, и который намного лучше подходит для типичных запросов по time series данным. Кроме этого, у VictoriaMetrics есть бесплатная кластерная версия с открытыми исходниками. См. github.com/...​iaMetrics/VictoriaMetrics

Ваші сервіси від команди ЛУНа з кожним разом все кращі, а misto.lun.ua останнім часом взагалі обожнювана річ. Було б чудово мати можливість виводити інформацію з misto про якість повітря, рейтинг шкіл зно, черги в садочках etc на ваші ж карти по продажу квартир, щоб враховувати якомога більше факторів при купівлі нерухомості — впевнений, це буде затребувано та корисно користувачам.

Дякую за подробиці розробки і наснаги вам в подальшій роботі!

Заходьте до нас!

Ми вже давно показуємо оцінки злочинності, забруднення та транспортного забезпечення на мапах продажу та оренди квартир.

Можна навіть фільтрувати оголошення за ціною/якістю розташування, встановлювати власні важливі точки(офіс, ВНЗ, «центр» і т.д.), щоб фільтрувати оголошення за транс. доступністю.

ЛУНу ми пропонуємо наші рішення з 2015 р., але він обираєм шляху ґуль на власних велосипедах.

Підписатись на коментарі