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

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

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

Если выйти на прогулку без маски при «красном» уровне загрязнения, одышка появляется даже при подъеме на третий этаж. За годы жизни здесь я выработала для себя систему правил, которая помогает мне беречь здоровье.
Моя «таблица выживания» (AQI US)
Я структурировала рекомендации для себя и своей семьи в зависимости от уровня AQI (Air Quality Index):
Уровень (AQI) | На улице | В помещении |
🟢 Хороший | Можно бегать и гулять. | Действий не требуется. |
🟡 Умеренный | Можно гулять. | Проветривание разрешено. |
🟠 Вредный (гр. риска) | Нельзя бегать. Нужна маска. | Прикрыть окна. Включить очиститель. |
🔴 Вредный | Обязательно носить маску. | Закрыть все окна. |
🟣 Очень вредный | Лучше не выходить. | Очиститель на полную мощность. |
🟤 Опасный | Категорически не выходить. | Не жечь свечи/газ (беречь кислород). |
Подробнее об уровнях можно почитать здесь.
Проблема: как не пропустить момент?
Чтобы эта таблица работала, нужно постоянно проверять сайты с данными. Это утомительно. Мне хотелось получать уведомления о смене уровня загрязнения в реальном времени, чтобы сразу закрыть окна или включить фильтр.
Я изучила доступные API:
iqair.com — лидер рынка. Для Ташкента доступно более 10 станций, данные очень подробные.
waqi.info — альтернатива, но для нашего города всего одна станция.
Выбор пал на IQAir. У них отличная документация, и я решила написать свою (готовой не было) интеграционную библиотеку.
Библиотека на C# .NET
Это мой первый опыт создания Open Source библиотеки. Она уже доступна на GitHub и NuGet. При проектировании я старалась сделать её максимально надежной:
Гибкость: Все URL-адреса конфигурируемы.
Расширяемость: Методы внутри HttpClient сделаны виртуальными — вы можете переопределить формирование параметров или валидацию под свои задачи.
Отказоустойчивость: Я интегрировала библиотеку Microsoft.Extensions.Http.Resilience. Теперь запросы не «падают» при кратковременных сбоях сети, а автоматически повторяются.
Сначала я написала простое консольное приложение, которое раз в час опрашивало API.

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

Что я извлекла из этого двухмесячного приключения:
Бесплатные API — это мощь. Существующих лимитов вполне достаточно для личных нужд и небольших сообществ.
GitHub Actions — любовь. Настроить автоматическую заливку пакета в NuGet оказалось проще, чем я думала.
Автоматизация бережет здоровье. Даже простейший скрипт экономит массу нервов, а в моем случае — помогает легче дышать.
Это мой первый опыт написания Open Source и первая статья на Хабре (я собиралась с духом лет десять!). Буду очень рада вашему фидбеку и советам по коду.
