--- # Airgradient Pro presoldered edition # Based on https://github.com/ajfriesen/ESPHome-AirGradient/blob/main/air-gradient-pro-presoldered.yaml substitutions: name: "airgradient" friendly_name: "Airgradient" static_ip: 10.18.44.203 packages: board: !include boards/d1_mini.yaml base: !include common/base.yaml ##### switch: - platform: safe_mode name: "Flash Mode (Safe Mode)" i2c: sda: D2 scl: D1 frequency: 100kHz font: - file: "fonts/UbuntuMono-Regular.ttf" id: opensans_large size: 22 - file: "fonts/UbuntuMono-Regular.ttf" id: opensans size: 17 glyphs: '!"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyzµ' - file: "fonts/UbuntuMono-Regular.ttf" id: opensans_small size: 13 glyphs: '!"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyzµ' - file: "fonts/materialdesignicons-webfont.ttf" id: face_icon_font size: 48 glyphs: [ "\U000F01F5", # mdi-emoticon-happy-outline "\U000F01F6", # mdi-emoticon-neutral-outline "\U000F01F8" # mdi-emoticon-sad-outline ] display: - platform: ssd1306_i2c model: "SH1106 128x64" id: oled address: 0x3c rotation: 0° brightness: 100% contrast: 100% update_interval: 10s pages: - id: page1 lambda: |- it.printf(4, 4, id(opensans), "CO2:"); it.printf(100, 4, id(opensans), TextAlign::TOP_RIGHT, "%4.0f", id(co2).state); it.printf(102, 4, id(opensans), "ppm"); it.printf(4, 23, id(opensans), "Temp:"); it.printf(100, 23, id(opensans), TextAlign::TOP_RIGHT, "%4.0f", id(temp).state); it.printf(102, 23, id(opensans), "°C"); it.printf(4, 42, id(opensans), "Hmdty:"); it.printf(100, 42, id(opensans), TextAlign::TOP_RIGHT, "%4.0f", id(humidity).state); it.printf(102, 42, id(opensans), "%%"); - id: page2 lambda: |- //it.rectangle(0, 0, 128, 64); it.printf(4, 4, id(opensans), "PM 1: "); it.printf(105, 4, id(opensans), TextAlign::TOP_RIGHT, "%4.0f", id(pm1).state); it.printf(124, 4, id(opensans), TextAlign::TOP_RIGHT, "µg"); it.printf(4, 23, id(opensans), "PM 2.5: "); it.printf(105, 23, id(opensans), TextAlign::TOP_RIGHT, "%4.0f", id(pm25).state); it.printf(124, 23, id(opensans), TextAlign::TOP_RIGHT, "µg"); it.printf(4, 42, id(opensans), "PM 10: "); it.printf(105, 42, id(opensans), TextAlign::TOP_RIGHT, "%4.0f", id(pm10).state); it.printf(124, 42, id(opensans), TextAlign::TOP_RIGHT, "µg"); - id: page3 lambda: |- //it.rectangle(0, 0, 128, 64); if (id(co2).state <= 1000.0 && id(pm25).state < 35 ) { it.printf(8, 8, id(face_icon_font), "%s", "\U000F01F5"); //mdi-emoticon-happy-outline it.printf(76, 14, id(opensans), "ALL"); it.printf(68, 34, id(opensans), "GOOD"); } else if ((id(co2).state > 1000.0 && id(co2).state < 2000.0) || (id(pm25).state >= 35 && id(pm25).state <= 50)) { it.printf(8, 8, id(face_icon_font), "%s", "\U000F01F6"); //mdi-emoticon-neutral-outline it.printf(74, 14, id(opensans), "NOT"); it.printf(68, 34, id(opensans), "GOOD"); } else { it.printf(8, 8, id(face_icon_font), "%s", "\U000F01F8"); //mdi-emoticon-sad-outline it.printf(72, 14, id(opensans), "NOT"); it.printf(68, 34, id(opensans), "SAFE"); } # lambda: |- # Syntax is always: it.print(, , , [color=COLOR_ON], [align=TextAlign::TOP_LEFT], ); # it.printf(0, 0, id(opensans_large), "CO2: %.0fppm", id(co2).state); # it.printf(0, 15, id(opensans), "PM25: %.0f", id(pm25).state); # it.printf(0, 25, id(opensans), "Humidity: %.0f", id(humidity).state); # it.printf(0, 35, id(opensans), "Temperature: %.0fC", id(temp).state); # # // # uptime # int t, h, m; # t = id(uptimes).state; # h = t / 60 / 60; # m = (t / 60) % 60; # if (h > 0) { # it.printf(128, 64, id(opensans), TextAlign::BOTTOM_RIGHT, "%ih%.2im", h, m); # } else { # it.printf(128, 64, id(opensans), TextAlign::BOTTOM_RIGHT, "%im", m); # } interval: - interval: 5s then: - display.page.show_next: oled - component.update: oled uart: - id: uart_1 rx_pin: D5 tx_pin: D6 baud_rate: 9600 - id: uart_2 rx_pin: D4 tx_pin: D3 baud_rate: 9600 sensor: # Temp/hum - platform: sht3xd address: 0x44 update_interval: 60s temperature: id: temp name: Temperature humidity: id: humidity name: Humidity # Particulate Matter - platform: pmsx003 update_interval: 60s type: PMSX003 uart_id: uart_1 pm_1_0: id: pm1 name: "Particulate Matter <1.0µm Concentration" device_class: pm1 state_class: measurement pm_2_5: id: pm25 name: "Particulate Matter <2.5µm Concentration" device_class: pm25 state_class: measurement pm_10_0: id: pm10 name: "Particulate Matter <10.0µm Concentration" device_class: pm10 state_class: measurement # CO2 - platform: senseair update_interval: 60s uart_id: uart_2 co2: id: co2 name: "Carbon Dioxide (CO₂)" # # debug # - platform: debug # free: # name: "Heap Free" # fragmentation: # name: "Heap Fragmentation" # block: # name: "Heap Max Block" # loop_time: # name: "Loop Time" # debug debug: update_interval: 10s text_sensor: - platform: debug device: name: "Device Info" reset_reason: name: "Reset Reason"