Created
June 21, 2024 20:14
-
-
Save rubin110/81ee5e7951c8e092fd8f284f3912e258 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://style.oversubstance.net/2021/08/diy-use-an-ikea-vindriktning-air-quality-sensor-in-home-assistant-with-esphome/ | |
# https://github.com/Hypfer/esp8266-vindriktning-particle-sensor | |
logger: | |
baud_rate: 0 | |
i2c: | |
sda: 4 | |
scl: 5 | |
scan: True | |
sensor: | |
- platform: bme280_i2c | |
temperature: | |
name: "${friendly_name} Temperature" | |
oversampling: 16x | |
accuracy_decimals: 2 | |
pressure: | |
name: "${friendly_name} Pressure" | |
humidity: | |
name: "${friendly_name} Humidity" | |
address: 0x76 | |
update_interval: 15s | |
- platform: pm1006 | |
uart_id: uart_pm1006 | |
pm_2_5: | |
name: "${friendly_name} PM25 raw" | |
id: pm_2_5 | |
filters: | |
# - sliding_window_moving_average: | |
# window_size: 140 | |
# send_every: 14 | |
- multiply: "${pm25_adjust_multplyer}" | |
- platform: copy | |
source_id: pm_2_5 | |
id: pm_2_5_average | |
name: "${friendly_name} PM25 average" | |
accuracy_decimals: 0 | |
filters: | |
- sliding_window_moving_average: | |
window_size: 50 | |
send_every: 10 | |
# send_first_at: 20 | |
on_value: | |
lambda: |- | |
static int i = 0; | |
i++; | |
if(i>=1){ | |
// https://en.wikipedia.org/wiki/Air_quality_index#Computing_the_AQI | |
if (id(pm_2_5_average).state < 12.0) { | |
// good | |
id(aqi_level).publish_state("Good"); | |
id(pm_2_5_average_aqi).publish_state((50.0 - 0.0) / (12.0 - 0.0) * (id(pm_2_5_average).state - 0.0) + 0.0); | |
} else if (id(pm_2_5_average).state < 35.4) { | |
// moderate | |
id(aqi_level).publish_state("Moderate"); | |
id(pm_2_5_average_aqi).publish_state((100.0 - 51.0) / (35.4 - 12.1) * (id(pm_2_5_average).state - 12.1) + 51.0); | |
} else if (id(pm_2_5_average).state < 55.4) { | |
// Unhealthy for Sensitive Groups | |
id(aqi_level).publish_state("Unhealthy for Sensitive Groups"); | |
id(pm_2_5_average_aqi).publish_state((150.0 - 101.0) / (55.4 - 35.5) * (id(pm_2_5_average).state - 35.5) + 101.0); | |
} else if (id(pm_2_5_average).state < 150.4) { | |
// unhealthy | |
id(aqi_level).publish_state("Unhealthy"); | |
id(pm_2_5_average_aqi).publish_state((200.0 - 151.0) / (150.4 - 55.5) * (id(pm_2_5_average).state - 55.5) + 151.0); | |
} else if (id(pm_2_5_average).state < 250.4) { | |
// very unhealthy | |
id(aqi_level).publish_state("Very Unhealthy"); | |
id(pm_2_5_average_aqi).publish_state((300.0 - 201.0) / (250.4 - 150.5) * (id(pm_2_5_average).state - 150.5) + 201.0); | |
} else if (id(pm_2_5_average).state < 350.4) { | |
// hazardous | |
id(aqi_level).publish_state("Hazardous"); | |
id(pm_2_5_average_aqi).publish_state((400.0 - 301.0) / (350.4 - 250.5) * (id(pm_2_5_average).state - 250.5) + 301.0); | |
} else if (id(pm_2_5_average).state < 500.4) { | |
// hazardous 2 | |
id(aqi_level).publish_state("Very Hazardous"); | |
id(pm_2_5_average_aqi).publish_state((500.0 - 401.0) / (500.4 - 350.5) * (id(pm_2_5_average).state - 350.5) + 401.0); | |
} | |
} | |
- platform: template | |
name: "${friendly_name} AQI Value" | |
device_class: aqi | |
unit_of_measurement: "AQI" | |
icon: "mdi:air-filter" | |
accuracy_decimals: 0 | |
id: pm_2_5_average_aqi | |
text_sensor: | |
- platform: template | |
name: "${friendly_name} AQI Level" | |
icon: "mdi:air-filter" | |
id: aqi_level | |
- platform: template | |
name: "${friendly_name} AQI" | |
icon: "mdi:air-filter" | |
id: aqi | |
lambda: return str_sprintf("%.0f - %s", id(pm_2_5_average_aqi).state, id(aqi_level).state.c_str()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment