Доброго времени суток, уважаемые хабровчане! Я живу в Ташкенте.

Утро Ташкента, спутниковые тарелки выросли хаотично, как грибочки.
Утро Ташкента, спутниковые тарелки выросли хаотично, как грибочки.

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

Почему так происходит?

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

Во-вторых, человеческий фактор. Город окружен плотным кольцом теплиц. С наступлением холодов их нужно отапливать, и в ход идет самое дешевое топливо. К сожалению, это не только уголь, но и, по сообщениям экоактивистов, такой трэш, как старые автомобильные покрышки и промышленные отходы. Весь этот ядовитый дым ветер несет прямиком в городскую «кастрюлю».

Точками на карте обозначены теплицы вокруг Ташкента
Точками на карте обозначены теплицы вокруг Ташкента

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

Изменение загрязнения воздуха в течение суток
Изменение загрязнения воздуха в течение суток

Если выйти на прогулку без маски при «красном» уровне загрязнения, одышка появляется даже при подъеме на третий этаж. За годы жизни здесь я выработала для себя систему правил, которая помогает мне беречь здоровье.

Моя «таблица выживания» (AQI US)

Я структурировала рекомендации для себя и своей семьи в зависимости от уровня AQI (Air Quality Index):

Уровень (AQI)

На улице

В помещении

🟢 Хороший

Можно бегать и гулять.

Действий не требуется.

🟡 Умеренный

Можно гулять.

Проветривание разрешено.

🟠 Вредный (гр. риска)

Нельзя бегать. Нужна маска.

Прикрыть окна. Включить очиститель.

🔴 Вредный

Обязательно носить маску.

Закрыть все окна.

🟣 Очень вредный

Лучше не выходить.

Очиститель на полную мощность.

🟤 Опасный

Категорически не выходить.

Не жечь свечи/газ (беречь кислород).

Подробнее об уровнях можно почитать здесь.

Проблема: как не пропустить момент?

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

Я изучила доступные API:

  1. iqair.com — лидер рынка. Для Ташкента доступно более 10 станций, данные очень подробные.

  2. waqi.info — альтернатива, но для нашего города всего одна станция.

Выбор пал на IQAir. У них отличная документация, и я решила написать свою (готовой не было) интеграционную библиотеку.

Библиотека на C# .NET

Это мой первый опыт создания Open Source библиотеки. Она уже доступна на GitHub и NuGet. При проектировании я старалась сделать её максимально надежной:

  • Гибкость: Все URL-адреса конфигурируемы.

  • Расширяемость: Методы внутри HttpClient сделаны виртуальными — вы можете переопределить формирование параметров или валидацию под свои задачи.

  • Отказоустойчивость: Я интегрировала библиотеку Microsoft.Extensions.Http.Resilience. Теперь запросы не «падают» при кратковременных сбоях сети, а автоматически повторяются.

Сначала я написала простое консольное приложение, которое раз в час опрашивало API.

От консоли к Telegram-боту

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

Нужен был Telegram-бот. На его написание и последующий рефакторинг у меня ушло около трех недель. Теперь всё просто: бот сам присылает пуш-уведомление, как только статус воздуха меняется.

Что я извлекла из этого двухмесячного приключения:

  • Бесплатные API — это мощь. Существующих лимитов вполне достаточно для личных нужд и небольших сообществ.

  • GitHub Actions — любовь. Настроить автоматическую заливку пакета в NuGet оказалось проще, чем я думала.

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

Это мой первый опыт написания Open Source и первая статья на Хабре (я собиралась с духом лет десять!). Буду очень рада вашему фидбеку и советам по коду.