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

PM2.5 и PM10

В городском воздухе всегда имеется некоторое количество так называемых мелкодисперсных частиц (particulate matter, PM). Наиболее крупные из них - это хорошо знакомая нам всем пыль. Более мелкие частицы практически не осаждаются на поверхностях, но при этом представляют весьма реальную угрозу здоровью. Среди этих частиц есть два класса наиболее опасных - PM10 (размером до 10 микрометров) и PM2.5 (размером до 2.5 микрометров). Последние представляют наибольшую опасность, так как их малые размеры позволяют им практически беспрепятственно попадать через легкие внутрь организма и разноситься кровотоком по внутренним органам. Исследования Всемирной организации здравоохранения показали, что именно частицы PM2.5 повинны в огромном количестве смертей на планете, в частности от рака лёгких и от других заболеваний1.

Измерение концентрации микрочастиц

Источников частиц PM2.5 довольно много, как первичных (горение мусора), так и вторичных (реакции химических загрязнений с образованием твердых продуктов). Измерение их концентрации в воздухе представляло достаточно сложную задачу, доступную только для специализированных организаций с дорогостоящим оборудованием, до тех пор, пока не появились недорогие лазерные PM-датчики, например, SDS0112:

SDS011

Данный датчик при стоимости около $15 позволяет измерять концентрации микрочастиц PM2.5 и PM10 и подключается к компьютеру посредством USB-TTL адаптера (обычно входящего в комплект датчика). Для измерения качества уличного воздуха датчик необходимо разместить в герметичном боксе, например, вот таком:

SDS011 - Outdoor

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

AQI

Для того, чтобы представить показания датчика в удобном для пользователя виде, необходимо преобразовать концентрации микрочастиц в некоторую оценку качества воздуха. Так как датчик измеряет одновременно и PM2.5, и PM10, обладающие разным вкладом в загрязнение воздуха с точки зрения влияния на здоровье человека, то получение интегральной оценки может быть нетривиальной задачей. К счастью, в мире есть организации, которые исследовали данный вопрос и выработали критерии для формирования такой оценки, и назвали ее AQI - Air Quality Index. Методики вычисления AQI по концентрациям микрочастиц несколько варьируются в зависимости от страны, но наиболее распространенной является оценка по методике Environmental Protection Agency (EPA) США, также известная как US AQI3.

Индекс US AQI имеет два представления - в числовом и цветовом видах, и делится на шесть категорий, характеризующих угрозу здоровью:

Air Quality Index (AQI) Values Levels of Health Concern Colors
0 to 50 Good Green
51 to 100 Moderate Yellow
101 to 150 Unhealthy for Sensitive Groups Orange
151 to 200 Unhealthy Red
201 to 300 Very Unhealthy Purple
301 to 500 Hazardous Maroon

AQI-бот для Telegram

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

На данный момент бот раз в несколько минут опрашивает PM-датчик, сохраняет данные измеренных концентраций микрочастиц в базу на диске и позволяет получать текущее значение AQI (по команде /aqi), концентрации микрочастиц (команда /pm), а также отображать графики изменения этих параметров за час и сутки (команды /aqi_hourly, /aqi_daily, /pm_hourly, /pm_daily):

PM Daily

Технические подробности компиляции и запуска бота тут я рассматривать не буду, так как они описаны в README.

TODO

Часть задумок пока еще не реализована, а именно:

  • Подписка на уведомления о превышении заданного уровня AQI;
  • Возможность периодического постинга текущих значений AQI в выбранный канал;
  • Кэширование почасовых/посуточных графиков изменения AQI/PM.

На этом пока всё. Традиционно, готов ответить на вопросы в комментариях. )