Skip to content

Instantly share code, notes, and snippets.

@rubin110
Created June 21, 2024 20:14
Show Gist options
  • Save rubin110/81ee5e7951c8e092fd8f284f3912e258 to your computer and use it in GitHub Desktop.
Save rubin110/81ee5e7951c8e092fd8f284f3912e258 to your computer and use it in GitHub Desktop.
# 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