Виправив проблему з датчиком якості повітря, що стягував данні з Eco City. Розкажу як все було.
Мої побоювання справдились — мене забанили за IP. Я зателефонував за номером телефону в контактах Eco City і поспілкувався з представником. У мене поцікавились, чи я стягував дані з їх сайту — звісно ж я стягував. Сказали, щоб я написав в телеграм за номером +380988084092 і мені видадуть посилання для API. Також поцікавились для яких цілей я використовую їх дані — я сказав, що для розумного дому.
Посилання, яке можна використовувати в якості API зовсім просте: https://eco-city.org.ua/output.json
Єдине обмеження: робити не більш ніж один запит за хвилину.
Однак, з цим посиланням є кілька проблем:
1. Не працюють параметри для запиту, які дозволяли зробити запит лише для однієї станції. При зверненні завжди видаються всі показники з усіх станцій.
2. Серед усіх показників, що видаються немає індексу якості повітря AQI — його потрібно вираховувати самостійно на основі даних з інших датчиків.
Перша проблема вирішується легко: простим пошуком потрібної станції за її ідентифікатором.
Друга проблема дещо цікавіша. Я вирішив обчислювати індекс якості повітря самостійно.
Індекс якості повітря (AQI) — це кусково-лінійна функція, що залежить від концентрації забруднення. Способів вимірювання та інтерпретації є дуже багато. Для свого випадку, я вирішив рахувати AQI для кожного окремого показника датчика забрудненості PM2.5 (без врахування показників за проміжки часу).
Формулу обчислення AQI та таблиці з концентраціями та точками зупинки індексу можна знайти на Вікіпедії — показники та формулу для себе я взяв саме звідти.
Я написав ось таку функцію-макрос для AQI на шаблонізаторі для Home Assistant:
{% macro aqi(aqihigh, aqilow, conchigh, conclow, conc) -%}
{{ ((aqihigh - aqilow) / (conchigh - conclow) * (conc - conclow) + aqilow) | int }}
{%- endmacro %}Пошук потрібного сенсора та таблицю точок зупинки для концентрації PM2.5 я реалізував звичайними операторами if
-elif-elst ось так:{%
for sensor in value_json %}Повний код сенсора можна знайти на скріншоті у сусідньому повідомленні.
{% if sensor.id == station %}
{% set conc = sensor.pollutants[0].value | float %}
{% if conc >= 0 and conc <= 50 %}
{{ aqi(50, 0, 12, 0, conc) }}
{% elif conc > 50 and conc <= 100 %}
{{ aqi(100, 51, 35.4, 12.1, conc) }}
{% elif conc > 100 and conc <= 150 %}
{{ aqi(150, 101, 55.4, 35.5, conc) }}
{% elif conc > 150 and conc <= 200 %}
{{ aqi(200, 151, 150.4, 55.5, conc) }}
{% elif conc > 200 and conc <= 300 %}
{{ aqi(300, 201, 250.4, 150.5, conc) }}
{% elif conc > 300 and conc <= 400 %}
{{ aqi(400, 301, 350.4, 250.5, conc) }}
{% elif conc > 400 and conc <= 500 %}
{{ aqi(500, 401, 500.4, 350.5, conc) }}
{% else %}
unknown
{% endif %}
{% endif %}
{% endfor %}
Відповідно тепер я маю точний сенсор AQI, ще й з показниками забрудненості за різними параметрами: PM2.5, PM10, NH₃, NO₂, CO, радіації, а також температуру, вологість та атмосферний тиск.