esphome:
  name: sleepingroom
  platform: ESP32
  board: nodemcu-32s
  
  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"

wifi:
  ssid: "Voltage-legacy"
  password: !secret voltage_legacy_psk
  use_address: sleepingroom.home  
  power_save_mode: high
  fast_connect: on

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

captive_portal:

# Enable logging
logger:
  level: DEBUG

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

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

# Initialize I²C
i2c:
 - id: bus_a
   sda: 13
   scl: 16
   scan: true

# Initialize LEDC GPIOs
output:
  - platform: ledc
    pin: GPIO17
    id: led_red
  - platform: ledc
    pin: GPIO18
    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: GPIO26
  baud_rate: 9600

# Create text sensor to represent CO2 LED warn state (somewhat redundant)
text_sensor:
  - platform: template
    name: "Schlafzimmer CO2 Warnstufe"
    id: co2_warn
  - platform: template
    name: "Schlafzimmer 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 bis 1600ppm) 
  # • air quality category 4: LED is red (1600-2000ppm) 
  - platform: scd30
    i2c_id: bus_a
    co2:
      name: "Schlafzimmer 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: "Schlafzimmer Temperatur"
      accuracy_decimals: 2
    humidity:
      name: "Schlafzimmer Luftfeuchtigkeit"
      accuracy_decimals: 1
    # SCD30 temp sensor is a bit off
    temperature_offset: 0 °C
    ambient_pressure_compensation: 1
    automatic_self_calibration: True
    address: 0x61
    update_interval: 60s
  # Vindriktning particulate matter sensor
  - platform: pm1006
    pm_2_5:
      name: "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: 32
    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%

# IR Receiver, dumps all received values into serial
remote_receiver:
  pin: 
    number: 23
    inverted: True
  dump: all

# IR Transmitter
remote_transmitter:
  pin: GPIO22
  # Infrared remotes use a 50% carrier signal
  carrier_duty_percent: 50%

# Temporary test switches
switch:
  - platform: template
    name: Yamaha Power Button
    turn_on_action:
      - remote_transmitter.transmit_nec:
          address: 0x7E81
          command: 0x54AB
  - platform: template
    name: Samsung Power Button
    turn_on_action:
      - remote_transmitter.transmit_samsung:
          data: 0xE0E040BF
          nbits: 32
