AQI Wolby

mail@pastecode.io avatar
unknown
yaml
3 years ago
33 kB
272
Indexable
Never
esphome:
  name: aqi_esp32
  platform: ESP32
  board: nodemcu-32s

wifi:
  ssid: 
  password: 

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: 
    password: 

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

# Setting up the pressure mats
esp32_touch:
# Delete this after you are done with the setup process
   setup_mode: true


# For the SDS011
uart:
  rx_pin: GPIO16
  tx_pin: GPIO17
  baud_rate: 9600

# For the CCS811
i2c:
  sda: GPIO21
  scl: GPIO22
  #id: bus_a

#For th AIQ
globals:
  - id: iaq_index
    type: int
    restore_value: no
    initial_value: '0'
  - id: component_index
    type: int
    restore_value: no
    initial_value: '0'


sensor:

  - platform: dht
    pin: GPIO18
    model: dht11
    temperature:
      name: "aux AQI Temperature"
      id: temp
      internal: true
    humidity:
      name: "aux AQI Humidity"
      id: humi
      internal: true
    update_interval: 10s
    
  - platform: sds011
    pm_2_5:
      name: "Particulate Matter <2.5µm Concentration"
      id: pm_2_5_sensor
      filters:  
      - lambda: if (0 <= x && x <= 600) return x; else return {};
    pm_10_0:
      name: "Particulate Matter <10.0µm Concentration"
      id: pm_10_sensor
      filters:
      - lambda: if (0 <= x && x <= 600) return x; else return {};
    update_interval: 10min
  
  - platform: ccs811
    eco2:
      name: "CCS811 eCO2 Value"
      accuracy_decimals : 3
      id: eco2_sensor
      filters:
      - lambda: if (0 <= x && x <= 8000) return x; else return {};
    tvoc:
      name: "CCS811 Total Volatile Organic Compound"
      accuracy_decimals : 3
      id: tvoc2_sensor
      filters:
      - lambda: if (0 <= x && x <= 8000) return x; else return {};
    address: 0x5A
    update_interval: 10s
    baseline: 0x447B
    temperature: temp
    humidity: humi
    
  - platform: homeassistant
    name: "terrace_temperature"
    entity_id: sensor.terrace_temperature
    id: outdoor_temperature

  - platform: template #CO2 Number
    name: "AQI_eco2"
    id: eco2_number
    icon: "mdi:molecule-co2"
    internal: true
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
       * Transform eCO2 values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(eco2_sensor).state <= 600) {
        return 1.0;
      }
      else if (id(eco2_sensor).state <= 800) {
        return 2.0;
      }
      else if (id(eco2_sensor).state <= 1500) {
        return 3.0;
      }
      else if (id(eco2_sensor).state <= 1800) {
        return 4.0;
      }
      else if (id(eco2_sensor).state > 1800) {
        return 5.0;
      }
      return {};
    update_interval: 10s
    
  - platform: template #TVOC Number
    name: "AQI_tvoc"
    id: tvoc_number
    icon: "mdi:molecule"
    internal: true
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
       * Transform TVOC values to IAQ points according to German environmental guidelines: 
       * https://www.repcomsrl.com/wp-content/uploads/2017/06/Environmental_Sensing_VOC_Product_Brochure_EN.pdf
       */
      if (id(tvoc2_sensor).state <= 65) {
        return 1.0;
      }
      else if (id(tvoc2_sensor).state <= 220) {
        return 2.0;
      }
      else if (id(tvoc2_sensor).state <= 660) {
        return 3.0;
      }
      else if (id(tvoc2_sensor).state <= 2200) {
        return 4.0;
      }
      else if (id(tvoc2_sensor).state > 2200) {
        return 5.0;
      }
      
      return {};
    update_interval: 10s

  - platform: template #PM2.5 Number
    name: "AQI_pm2_5"
    id: AQI_pm25_number
    icon: "mdi:factory"
    internal: true
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
      * Transform PM 2.5 values to IAQ points according to UK environmental guidelines: 
      * https://blissair.com/what-is-pm-2-5.htm
      */
      if (id(pm_2_5_sensor).state <= 35.4) {
        return 1.0;
      }
      else if (id(pm_2_5_sensor).state <= 55.4) {
        return 2.0;
      }
      else if (id(pm_2_5_sensor).state <= 150.4) {
        return 3.0;
      }
      else if (id(pm_2_5_sensor).state <= 250.4) {
        return 4.0;
      }
      else if (id(pm_2_5_sensor).state > 500.4) {
        return 5.0;
      }

    update_interval: 10s

  - platform: template #PM10 Number
    name: "AQI_pm10"
    id: AQI_pm10_number
    icon: "mdi:broom"
    internal: true
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
      * Transform PM 10.0 values to IAQ points according to UK environmental guidelines: 
      * https://blissair.com/what-is-pm-2-5.htm
      */
      if (id(pm_10_sensor).state <= 54) {
        return 1.0;
      }
      else if (id(pm_10_sensor).state <= 155) {
        return 2.0;
      }
      else if (id(pm_10_sensor).state <= 25) {
        return 3.0;
      }
      else if (id(pm_10_sensor).state <= 355) {
        return 4.0;
      }
      else if (id(pm_10_sensor).state > 425) {
        return 5.0;
      }
      return {};
    update_interval: 10s
    
  - platform: template #AQI Index
    name: "AQI_number"
    id: AQI_number
    internal: true
    icon: "mdi:air-filter"
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
       * Transform indoor temperature values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(temp).state < 14 or id(temp).state > 28) {
        id(iaq_index) = 1;
        id(component_index) = 1;
        ESP_LOGD("main", "temp %d", id(component_index));
      }
      else if (id(temp).state < 15 or id(temp).state > 27) {
        id(iaq_index) = 2;
        id(component_index) = 2;
        ESP_LOGD("main", "temp %d", id(component_index));
      }
      else if (id(temp).state < 16 or id(temp).state > 26) {
        id(iaq_index) = 3;
        id(component_index) = 3;
        ESP_LOGD("main", "temp %d", id(component_index));
      }
      else if (id(temp).state < 18 or id(temp).state > 23) {
        id(iaq_index) = 4;
        id(component_index) = 4;
        ESP_LOGD("main", "temp %d", id(component_index));
      }
      else if (id(temp).state >= 18 and id(temp).state <= 23) {
        id(iaq_index) = 5;
        id(component_index) = 5;
        ESP_LOGD("main", "temp %d", id(component_index));
      }

      /*
       * Transform indoor humidity values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(humi).state < 10 or id(humi).state > 90) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      else if (id(humi).state < 20 or id(humi).state > 80) {
        id(iaq_index) += 2;
        id(component_index) = 2;    
      }
      else if (id(humi).state < 30 or id(humi).state > 70) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(humi).state < 40 or id(humi).state > 60) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(humi).state >= 40 and id(humi).state <= 60) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      
      /*
       * Transform eCO2 values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(eco2_sensor).state <= 600) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(eco2_sensor).state <= 800) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(eco2_sensor).state <= 1500) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(eco2_sensor).state <= 1800) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(eco2_sensor).state > 1800) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      
      /*
       * Transform TVOC values to IAQ points according to German environmental guidelines: 
       * https://www.repcomsrl.com/wp-content/uploads/2017/06/Environmental_Sensing_VOC_Product_Brochure_EN.pdf
       */
      if (id(tvoc2_sensor).state <= 65) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(tvoc2_sensor).state <= 220) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(tvoc2_sensor).state <= 660) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(tvoc2_sensor).state <= 2200) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(tvoc2_sensor).state > 2200) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }

      /*
      * Transform PM 2.5 values to IAQ points according to UK environmental guidelines: 
      * https://blissair.com/what-is-pm-2-5.htm
      */
      if (id(pm_2_5_sensor).state <= 35.4) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(pm_2_5_sensor).state <= 55.4) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(pm_2_5_sensor).state <= 150.4) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(pm_2_5_sensor).state <= 250.4) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(pm_2_5_sensor).state > 500.4) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      
      ESP_LOGD("main", "Current IAQ index %d", id(iaq_index));

      
      if (id(pm_10_sensor).state <= 54) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(pm_10_sensor).state <= 155) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(pm_10_sensor).state <= 255) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(pm_10_sensor).state <= 355) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(pm_10_sensor).state > 425) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      
      
      if (id(iaq_index) <= 9) {
        return 1;
      }
      else if (id(iaq_index) <= 15) {
        return 2;
      }
      else if (id(iaq_index) <= 24) {
        return 3;
      }
      else if (id(iaq_index) <= 27) {
        return 4;
      }
      else if (id(iaq_index) >= 28) {
        return 5;
      }
      
    update_interval: 10s


text_sensor:  
  - platform: homeassistant
    name: "weather_condition"
    entity_id: sensor.openweathermap_condition
    id: 'weather_condition'
  - platform: template #AQI Sgtring
    name: "AQI"
    icon: "mdi:air-filter"
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;


      /*
       * Transform indoor temperature values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(temp).state < 14 or id(temp).state > 28) {
        id(iaq_index) = 1;
        id(component_index) = 1;
      }
      else if (id(temp).state < 15 or id(temp).state > 27) {
        id(iaq_index) = 2;
        id(component_index) = 2;
      }
      else if (id(temp).state < 16 or id(temp).state > 26) {
        id(iaq_index) = 3;
        id(component_index) = 3;
      }
      else if (id(temp).state < 18 or id(temp).state > 23) {
        id(iaq_index) = 4;
        id(component_index) = 4;
      }
      else if (id(temp).state >= 18 and id(temp).state <= 23) {
        id(iaq_index) = 5;
        id(component_index) = 5;
      }

      /*
       * Transform indoor humidity values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(humi).state < 10 or id(humi).state > 90) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      else if (id(humi).state < 20 or id(humi).state > 80) {
        id(iaq_index) += 2;
        id(component_index) = 2;    
      }
      else if (id(humi).state < 30 or id(humi).state > 70) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(humi).state < 40 or id(humi).state > 60) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(humi).state >= 40 and id(humi).state <= 60) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      

      /*
       * Transform eCO2 values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(eco2_sensor).state <= 600) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(eco2_sensor).state <= 800) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(eco2_sensor).state <= 1500) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(eco2_sensor).state <= 1800) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(eco2_sensor).state > 1800) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      
      /*
       * Transform TVOC values to IAQ points according to German environmental guidelines: 
       * https://www.repcomsrl.com/wp-content/uploads/2017/06/Environmental_Sensing_VOC_Product_Brochure_EN.pdf
       */
      if (id(tvoc2_sensor).state <= 65) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(tvoc2_sensor).state <= 220) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(tvoc2_sensor).state <= 660) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(tvoc2_sensor).state <= 2200) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(tvoc2_sensor).state > 2200) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }


      /*
      * Transform PM 2.5 values to IAQ points according to UK environmental guidelines: 
      * https://blissair.com/what-is-pm-2-5.htm
      */
      if (id(pm_2_5_sensor).state <= 35.4) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(pm_2_5_sensor).state <= 55.4) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(pm_2_5_sensor).state <= 150.4) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(pm_2_5_sensor).state <= 250.4) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(pm_2_5_sensor).state > 500.4) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      

      /*
      * Transform PM 10.0 values to IAQ points according to UK environmental guidelines: 
      * https://blissair.com/what-is-pm-2-5.htm
      */
      if (id(pm_10_sensor).state <= 54) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(pm_10_sensor).state <= 155) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(pm_10_sensor).state <= 255) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(pm_10_sensor).state <= 355) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(pm_10_sensor).state > 425) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      
      /*
       * Transform IAQ index to human readable text according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      ESP_LOGD("main", "Current IAQ index %d", id(iaq_index));
      
      if (id(iaq_index) <= 9) {
        return {"Unhealty"};
      }
      else if (id(iaq_index) <= 15) {
        return {"Poor"};
      }
      else if (id(iaq_index) <= 24) {
        return {"Moderate"};
      }
      else if (id(iaq_index) <= 27) {
        return {"Good"};
      }
      else if (id(iaq_index) >= 28) {
        return {"Excellent"};
      }
      
      return {};
    update_interval: 10s

  - platform: template #Temperature String
    name: "AQI_tmp"
    icon: "mdi:thermometer"
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
       * Transform indoor temperature values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(temp).state < 14 or id(temp).state > 28) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      else if (id(temp).state < 15 or id(temp).state > 27) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(temp).state < 16 or id(temp).state > 26) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(temp).state < 18 or id(temp).state > 23) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(temp).state >= 18 and id(temp).state <= 23) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
            
      if (id(iaq_index) <= 1) {
        return {"Unhealty"};
      }
      else if (id(iaq_index) <= 2) {
        return {"Poor"};
      }
      else if (id(iaq_index) <= 3) {
        return {"Moderate"};
      }
      else if (id(iaq_index) <= 4) {
        return {"Good"};
      }
      else if (id(iaq_index) >= 5) {
        return {"Excellent"};
      }
      
      return {};
    update_interval: 10s #Temperature String

  - platform: template #Humidity String
    name: "AQI_humi"
    icon: "mdi:water-percent"
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
       * Transform indoor humidity values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(humi).state < 10 or id(humi).state > 90) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      else if (id(humi).state < 20 or id(humi).state > 80) {
        id(iaq_index) += 2;
        id(component_index) = 2;    
      }
      else if (id(humi).state < 30 or id(humi).state > 70) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(humi).state < 40 or id(humi).state > 60) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(humi).state >= 40 and id(humi).state <= 60) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }

      if (id(iaq_index) <= 1) {
        return {"Unhealty"};
      }
      else if (id(iaq_index) <= 2) {
        return {"Poor"};
      }
      else if (id(iaq_index) <= 3) {
        return {"Moderate"};
      }
      else if (id(iaq_index) <= 4) {
        return {"Good"};
      }
      else if (id(iaq_index) >= 5) {
        return {"Excellent"};
      }
      
      return {};
    update_interval: 10s

  - platform: template #CO2 String
    name: "AQI_eco2"
    icon: "mdi:molecule-co2"
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
       * Transform eCO2 values to IAQ points according to Indoor Air Quality UK: 
       * http://www.iaquk.org.uk/
       */
      if (id(eco2_sensor).state <= 600) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(eco2_sensor).state <= 800) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(eco2_sensor).state <= 1500) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(eco2_sensor).state <= 1800) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(eco2_sensor).state > 1800) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }

      if (id(iaq_index) <= 1) {
        return {"Unhealty"};
      }
      else if (id(iaq_index) <= 2) {
        return {"Poor"};
      }
      else if (id(iaq_index) <= 3) {
        return {"Moderate"};
      }
      else if (id(iaq_index) <= 4) {
        return {"Good"};
      }
      else if (id(iaq_index) >= 5) {
        return {"Excellent"};
      }
      
      return {};
    update_interval: 10s

  - platform: template #TVOC String
    name: "AQI_tvoc"
    icon: "mdi:molecule"
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
       * Transform TVOC values to IAQ points according to German environmental guidelines: 
       * https://www.repcomsrl.com/wp-content/uploads/2017/06/Environmental_Sensing_VOC_Product_Brochure_EN.pdf
       */
      if (id(tvoc2_sensor).state <= 65) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(tvoc2_sensor).state <= 220) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(tvoc2_sensor).state <= 660) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(tvoc2_sensor).state <= 2200) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(tvoc2_sensor).state > 2200) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }

      if (id(iaq_index) <= 1) {
        return {"Unhealty"};
      }
      else if (id(iaq_index) <= 2) {
        return {"Poor"};
      }
      else if (id(iaq_index) <= 3) {
        return {"Moderate"};
      }
      else if (id(iaq_index) <= 4) {
        return {"Good"};
      }
      else if (id(iaq_index) >= 5) {
        return {"Excellent"};
      }
      
      return {};
    update_interval: 10s

  - platform: template #PM2.5 String
    name: "AQI_pm2_5"
    icon: "mdi:factory"
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
      * Transform PM 2.5 values to IAQ points according to UK environmental guidelines: 
      * https://blissair.com/what-is-pm-2-5.htm
      */
      if (id(pm_2_5_sensor).state <= 35.4) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(pm_2_5_sensor).state <= 55.4) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(pm_2_5_sensor).state <= 150.4) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(pm_2_5_sensor).state <= 250.4) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(pm_2_5_sensor).state > 500.4) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }
      

      if (id(iaq_index) <= 1) {
        return {"Unhealty"};
      }
      else if (id(iaq_index) <= 2) {
        return {"Poor"};
      }
      else if (id(iaq_index) <= 3) {
        return {"Moderate"};
      }
      else if (id(iaq_index) <= 4) {
        return {"Good"};
      }
      else if (id(iaq_index) >= 5) {
        return {"Excellent"};
      }
      
      return {};
    update_interval: 10s

  - platform: template #PM10 String
    name: "AQI_pm10"
    icon: "mdi:broom"
    lambda: |-
      id(iaq_index) = 0;
      id(component_index) = 0;

      /*
      * Transform PM 10.0 values to IAQ points according to UK environmental guidelines: 
      * https://blissair.com/what-is-pm-2-5.htm
      */
      if (id(pm_10_sensor).state <= 54) {
        id(iaq_index) += 5;
        id(component_index) = 5;
      }
      else if (id(pm_10_sensor).state <= 155) {
        id(iaq_index) += 4;
        id(component_index) = 4;
      }
      else if (id(pm_10_sensor).state <= 25) {
        id(iaq_index) += 3;
        id(component_index) = 3;
      }
      else if (id(pm_10_sensor).state <= 355) {
        id(iaq_index) += 2;
        id(component_index) = 2;
      }
      else if (id(pm_10_sensor).state > 425) {
        id(iaq_index) += 1;
        id(component_index) = 1;
      }

      if (id(iaq_index) <= 1) {
        return {"Unhealty"};
      }
      else if (id(iaq_index) <= 2) {
        return {"Poor"};
      }
      else if (id(iaq_index) <= 3) {
        return {"Moderate"};
      }
      else if (id(iaq_index) <= 4) {
        return {"Good"};
      }
      else if (id(iaq_index) >= 5) {
        return {"Excellent"};
      }
      
      return {};
    update_interval: 10s


#SCREEN CONFIG
spi: #Screen config
  clk_pin: GPIO33
  mosi_pin: GPIO32 #DIN  

time:
  - platform: sntp
    timezone: Europe/Paris
    id: sntp_time
    
font:
  - file: "fonts/Bookerly-Regular.ttf"
    id: text_font_small
    size: 17
  - file: "fonts/Bookerly-Regular.ttf"
    id: text_font_small_time_temp
    size: 15
    glyphs:  ['!', ',', '.', '"', '%', '-', '_', ':', 'º', '/','C',
       '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ']

  - file: "fonts/Bookerly-Regular.ttf"
    id: text_font_tiny
    size: 10
  - file: "fonts/Bookerly-Regular.ttf"
    id: text_font_big
    size: 40
  - file: "fonts/materialdesignicons-webfont.ttf"
    id: icon_font_30
    size: 30
    glyphs: [
      󰟤, #mdi-molecule-co2
      󰮬, #mdi-molecule
      󰈏, #mdi-factory
      󰃢, #mdi-broom
      󰵃, #mdi-air-filter
      󰖙, #mdi-weather-sunny
      󰖗, #mdi-weather-rainy
      󰖕,#mdi-weather-partly-cloudy
      󰖘, #mdi-weather-snowy-heavy 
      󰼇, #error
      󰖐, #mdi-weather-cloudy
      󰦖 #mdi-progress-clock
      
    ]
  - file: "fonts/materialdesignicons-webfont.ttf"
    id: icon_font_40
    size: 35
    glyphs: [
      󰟤, #mdi-molecule-co2
      󰮬, #mdi-molecule
      󰈏, #mdi-factory
      󰃢, #mdi-broom
      󰵃, #mdi-air-filter
      󰖙, #mdi-weather-sunny
      󰖗, #mdi-weather-rainy
      󰖕,#mdi-weather-partly-cloudy
      󰖘, #mdi-weather-snowy-heavy
      󰖐, #mdi-weather-cloudy
      󰼇, #mdi-error
      󰦖 #mdi-progress-clock
    ]

display:
  - platform: waveshare_epaper
    id: my_display
    cs_pin: GPIO25
    dc_pin: GPIO26
    busy_pin: GPIO14
    reset_pin: GPIO27
    model: 4.20in
    update_interval: 60s
    lambda: |-

      // Variable definitions
      int screen_x = 400;
      int screen_y = 300;
       
      int left_margin = 20;
      int right_margin = screen_x - left_margin;
      int top_margin = 10;
      int bottom_margin = screen_y - top_margin;
       
      int a_third = (right_margin - left_margin)/3;
      int x_1rd = a_third + left_margin;
      int x_2rd = x_1rd + a_third;
       
      int circle_radius = 12;
      int circle_y_dist = 32;
       
      int CO2_center = left_margin + circle_radius;
      int pm10_center = x_2rd - circle_radius;
      int between_column_space = rint((pm10_center - CO2_center)/3);
      int tvoc_center =  CO2_center + between_column_space; //104; 
      int pm25_center = tvoc_center + between_column_space; //176; 

      int circle_botton_alineation = 190;
      int name_botton_alineation = 260;
      int icon_botton_alineation = 225;
      int value_botton_alineation = 280;
       
      int exterior_big_circle_radius = (right_margin-(x_2rd+circle_radius))/2;
      int interior_big_circle_radius = exterior_big_circle_radius - 3;
      int big_y_circle_center = rint(screen_y/2);
      int big_x_circle_center = (pm10_center + circle_radius) + between_column_space;

      int weather_icon_x = 5;
      int weather_icon_y = 25;
      int temperature_x = 40; 
      int time_location_x = screen_x - weather_icon_x - 40;

      //Weather and terrace temperature
      
      if (id(weather_condition).has_state()) {
        if (strcmp(id(weather_condition).state.c_str(),"sunny")==0) { 
          it.printf(weather_icon_x, weather_icon_y, id(icon_font_30),TextAlign::BASELINE, "󰖙");  
        } else if(strcmp(id(weather_condition).state.c_str(),"partlycloudy")==0) {
          it.printf(weather_icon_x, weather_icon_y, id(icon_font_30),TextAlign::BASELINE, "󰖕"); 
        } else if(strcmp(id(weather_condition).state.c_str(),"cloudy")==0) {
          it.printf(weather_icon_x, weather_icon_y, id(icon_font_30),TextAlign::BASELINE, "󰖐"); 
        } else {
          it.printf(weather_icon_x, weather_icon_y, id(icon_font_30),TextAlign::BASELINE, "󰷆"); //state not defined
        }
      } else {
          it.printf(weather_icon_x, weather_icon_y, id(icon_font_30),TextAlign::BASELINE, "󰦖");  //Progress
      }
      
      it.printf(temperature_x, weather_icon_y, id(text_font_small_time_temp),TextAlign::BOTTOM,"%.1fºC",id(outdoor_temperature).state);
      
      //Print the time
      int time = id(sntp_time).now().hour * 100 + id(sntp_time).now().minute;
      it.strftime(time_location_x, weather_icon_y, id(text_font_small_time_temp),TextAlign::BOTTOM, "%H:%M", id(sntp_time).now());

       
      //CO2 printing//
      //Icon & Name
      
      int measurement = 0;
      if (id(eco2_sensor).has_state()) {
        measurement = id(eco2_sensor).state;
      } 
      
      it.printf(CO2_center,icon_botton_alineation, id(icon_font_40),TextAlign::CENTER,"󰟤");
      it.printf(CO2_center,name_botton_alineation, id(text_font_small),TextAlign::CENTER,"CO2");
      it.printf(CO2_center,value_botton_alineation, id(text_font_tiny),TextAlign::CENTER,"%d ppm",measurement);
      
      int limit_c02 = 0;
      if (id(eco2_number).has_state()) {
        limit_c02 = id(eco2_number).state;
      } 
      

      //Quality bar
      for (int i = 0; i < 5; i++) {
        if (i<limit_c02){
          it.filled_circle(CO2_center, circle_botton_alineation+(-i*circle_y_dist), circle_radius);
        } else {
          it.circle(CO2_center, circle_botton_alineation+(-i*circle_y_dist), circle_radius);
        }
      }

      //TVOC printing//
      //Icon & Name
      measurement = 0;
      if (id(tvoc2_sensor).has_state()) {
        measurement = id(tvoc2_sensor).state;
      }
      
      it.printf(tvoc_center,icon_botton_alineation, id(icon_font_40),TextAlign::CENTER,"󰮬");
      it.printf(tvoc_center,name_botton_alineation, id(text_font_small),TextAlign::CENTER,"TVoc");
      it.printf(tvoc_center,value_botton_alineation, id(text_font_tiny),TextAlign::CENTER,"%d ppm",measurement);

      int limit_tvoc = 0;
      if (id(tvoc_number).has_state()) {
        limit_tvoc = id(tvoc_number).state;
      } 
      


      //Quality bar
      for (int i = 0; i < 5; i++) {
        if (i<limit_tvoc){
          it.filled_circle(tvoc_center, circle_botton_alineation+(-i*circle_y_dist), circle_radius);
        } else {
          it.circle(tvoc_center, circle_botton_alineation+(-i*circle_y_dist), circle_radius);
        }
      }

      //PM2.5 printing//
      //Icon & Name
      
      measurement = 0;
      if (id(pm_2_5_sensor).has_state()) {
        measurement = id(pm_2_5_sensor).state;
      } 
      
      it.printf(pm25_center,icon_botton_alineation, id(icon_font_40),TextAlign::CENTER,"󰈏");
      it.printf(pm25_center,name_botton_alineation, id(text_font_small),TextAlign::CENTER,"PM2.5");
      it.printf(pm25_center,value_botton_alineation, id(text_font_tiny),TextAlign::CENTER,"%d um",measurement);

      int limit_pm25 = 0;
      if (id(AQI_pm25_number).has_state()) {
        limit_pm25 = id(AQI_pm25_number).state;
      } 
      


      //Quality bar
      for (int i = 0; i < 5; i++) {
        if (i<limit_pm25){
          it.filled_circle(pm25_center, circle_botton_alineation+(-i*circle_y_dist), circle_radius);
        } else {
          it.circle(pm25_center, circle_botton_alineation+(-i*circle_y_dist), circle_radius);
        }
      }

      //PM10 printing//
      measurement = 0;
      if (id(pm_10_sensor).has_state()) {
        measurement = id(pm_10_sensor).state;
      } 
      //Icon & Name
      it.printf(pm10_center,icon_botton_alineation, id(icon_font_40),TextAlign::CENTER,"󰃢");
      it.printf(pm10_center,name_botton_alineation, id(text_font_small),TextAlign::CENTER,"PM10");
      it.printf(pm10_center,value_botton_alineation, id(text_font_tiny),TextAlign::CENTER,"%d um", measurement);
       
      int limit_pm10 = 0;
      if (id(AQI_pm10_number).has_state()) {
        limit_pm10 = id(AQI_pm10_number).state;
      } 
      


       
      //Quality bar
      for (int i = 0; i < 5; i++) {
        if (i<limit_pm10){
          it.filled_circle(pm10_center, circle_botton_alineation+(-i*circle_y_dist), circle_radius);
        } else {
          it.circle(pm10_center, circle_botton_alineation+(-i*circle_y_dist), circle_radius);
        }
      }
       
      //Big circle painting
      it.filled_circle(big_x_circle_center, big_y_circle_center, exterior_big_circle_radius);
      it.filled_circle(big_x_circle_center, big_y_circle_center, interior_big_circle_radius, COLOR_OFF);
      
      //Big circle number
      int aqi = 0;
      if (id(AQI_number).has_state()) {
        aqi = id(AQI_number).state;
      } 
      it.printf(big_x_circle_center,big_y_circle_center-5, id(text_font_big),TextAlign::CENTER,"%d",aqi);
      it.printf(big_x_circle_center,big_y_circle_center+25, id(text_font_small),TextAlign::CENTER,"AQI");