substitutions:
  name: "livingroom"
  friendly_name: "Luftqualität Wohnzimmer"

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  name_add_mac_suffix: false
  project:
    name: sensor.${name}
    version: "1.1"
  min_version: 2021.9.0

  on_boot:
    then:
      - light.turn_on:
          id: co2_light
          red: 0%
          green: 100%
          blue: 9%
      - delay: 1.5s
      - light.turn_on:
          id: co2_light
          red: 100%
          green: 75%
          blue: 0%
      - delay: 1.5s
      - light.turn_on:
          id: co2_light
          red: 100%
          green: 0%
          blue: 0%
      - delay: 1.5s
      - light.turn_on:
          id: co2_light
          red: 100%
          green: 75%
          blue: 0%
      - delay: 1.5s
      - light.turn_on:
          id: co2_light
          red: 0%
          green: 100%
          blue: 9%
      - text_sensor.template.publish:
          id: co2_warn
          state: "grün"
      - text_sensor.template.publish:
          id: pm25_warn
          state: "grün"

esp32:
  board: nodemcu-32s
  framework:
    type: arduino

wifi:
  ssid: "Voltage-legacy"
  password: !secret voltage_legacy_psk
  use_address: ${name}.home  
  power_save_mode: high
  fast_connect: on

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Wohnzimmer Fallback Hotspot"
    password: !secret fallback_psk

captive_portal:

# Enable logging
logger:
  level: DEBUG

# Enable Home Assistant API
api:
  encryption: 
    key: !secret apikey

# Enable over-the-air updates
ota:
  platform: esphome
  password: !secret ota

# Initialize I²C
i2c:
 - id: bus_a
   sda: 32
   scl: 25
   scan: true

# Initialize LEDC GPIOs
output:
  - platform: ledc
    pin: GPIO16
    id: led_red
  - platform: ledc
    pin: GPIO15
    id: led_green
    max_power: 50%
  - platform: ledc
    pin: GPIO19
    id: led_blue

# Define RGB mode for LED
light:
  - platform: rgb
    id: co2_light
    name: "CO2 Status LED"
    red: led_red
    green: led_green
    blue: led_blue
    internal: true

# Initialize UART for Vindriktning sensor
uart:
  rx_pin: GPIO22
  baud_rate: 9600

# Create text sensor to represent CO2 LED warn state (somewhat redundant)
text_sensor:
  - platform: template
    name: "Wohnzimmer CO2 Warnstufe"
    id: co2_warn
  - platform: template
    name: "Wohnzimmer Feinstaub Warnstufe"
    id: pm25_warn

sensor:
  # WiFi signal strength
  - platform: wifi_signal
    name: "WiFi Signalstärke"
    update_interval: 60s
  # SCD30 CO2 +  temperature + humidity sensor
  # * air quality category 0: LED is purple, sensor needs calibration (<380ppm)
  # • air quality category 1: LED is green (380-800ppm) 
  # • air quality category 2: LED is yellow (900-1200ppm) 
  # • air quality category 3: LED is orange/amber (1200 to 1600ppm) 
  # • air quality category 4: LED is red (1600-2000ppm) 
  - platform: scd30
    i2c_id: bus_a
    co2:
      name: "Wohnzimmer CO2"
      id: co2_value
      accuracy_decimals: 1
      on_value_range:
        - below: 380
          then:
            - text_sensor.template.publish:
                id: co2_warn
                state: "Kalibrierung nötig"
            - light.turn_on:
                id: co2_light
                red: 75%
                green: 0%
                blue: 100%
        - above: 380
          below: 800
          then:
            - text_sensor.template.publish:
                id: co2_warn
                state: "grün"
            - light.turn_on:
                id: co2_light
                red: 0%
                green: 100%
                blue: 0%
        - above: 800
          below: 1200
          then:
            - text_sensor.template.publish:
                id: co2_warn
                state: "gelb"
            - light.turn_on:
                id: co2_light
                red: 100%
                green: 100%
                blue: 0%
        - above: 1200
          below: 1600
          then:
            - text_sensor.template.publish:
                id: co2_warn
                state: "orange"
            - light.turn_on:
                id: co2_light
                red: 100%
                green: 75%
                blue: 0%
        - above: 1600
          then:
            - text_sensor.template.publish:
                id: co2_warn
                state: "rot"
            - light.turn_on:
                id: co2_light
                red: 100%
                green: 0%
                blue: 0%
    temperature:
      name: "Wohnzimmer Temperatur"
      accuracy_decimals: 2
      filters:
        - offset: -2.5
    humidity:
      name: "Wohnzimmer Luftfeuchtigkeit"
      accuracy_decimals: 1
    # SCD30 temp sensor is a bit off
    ambient_pressure_compensation: 1
    automatic_self_calibration: True
    address: 0x61
    update_interval: 60s
  # Vindriktning particulate matter sensor
  - platform: pm1006
    pm_2_5:
      name: "Wohnzimmer Feinstaub PM 2.5µm"
      on_value_range:
      - above: 0
        below: 35
        then:
          - text_sensor.template.publish:
              id: pm25_warn
              state: "grün"
      - above: 35
        below: 85
        then:
          - text_sensor.template.publish:
              id: pm25_warn
              state: "orange"
      - above: 85
        then:
          - text_sensor.template.publish:
              id: pm25_warn
              state: "rot"
  # Analog photo diode voltage
  - platform: adc
    pin: 34
    name: "Spannung Photodiode"
    attenuation: 11db
    update_interval: 1s
    internal: true
    on_value_range:
      - below: 0.25
        then:
          light.turn_on:
            id: co2_light
            brightness: 30%
      - above: 0.5
        then:
          light.turn_on:
            id: co2_light
            brightness: 60%
