diff --git a/nodes/d1-mini-scd40-27afc1/.gitignore b/nodes/d1-mini-scd40-27afc1/.gitignore new file mode 100644 index 0000000..d8b4157 --- /dev/null +++ b/nodes/d1-mini-scd40-27afc1/.gitignore @@ -0,0 +1,5 @@ +# Gitignore settings for ESPHome +# This is an example and may include too much for your use-case. +# You can modify this file to suit your needs. +/.esphome/ +/secrets.yaml diff --git a/nodes/d1-mini-scd40-27afc1/firmware.yaml b/nodes/d1-mini-scd40-27afc1/firmware.yaml new file mode 100644 index 0000000..35a6471 --- /dev/null +++ b/nodes/d1-mini-scd40-27afc1/firmware.yaml @@ -0,0 +1,247 @@ +--- + +substitutions: + macsuffix: "27afc1" + +wifi: + power_save_mode: LIGHT + +improv_serial: + +globals: + # Configure CO2 indicator thresholds + - id: threshold1 + type: float + initial_value: '750' + - id: threshold2 + type: float + initial_value: '1200' + - id: threshold3 + type: float + initial_value: '1500' + - id: threshold4 + type: float + initial_value: '1750' + - id: threshold5 + type: float + initial_value: '2000' + + # Configure the brightness values for the LED indicator + - id: dim + type: float + initial_value: '0.5' + - id: bright + type: float + initial_value: '1.0' + +esphome: + name: "d1-mini-scd40-${macsuffix}" + project: + name: "cccda.d1-mini-scd40" + version: "2023052001" + comment: "https://git.darmstadt.ccc.de/cda/co2-sensor-workshop/" + on_boot: + then: + - light.turn_on: + id: indicator + red: 0 + green: 0.2 + blue: 1.0 + effect: "None" + brightness: 30% + +esp8266: + board: d1_mini + +captive_portal: + +logger: + level: DEBUG + logs: + light: INFO + sensor: INFO + +web_server: + port: 80 + +api: + reboot_timeout: 0s + +# Enable either SNTP or Home Assistant as a time source +time: + # https://esphome.io/components/time/sntp.html + - platform: sntp + id: time_source + timezone: "Europe/Berlin" + # Disable LED indicator during nighttime + # https://esphome.io/components/time/index.html#on-time-trigger + on_time: + - hours: 8 + minutes: 0 + seconds: 0 + then: + - light.turn_on: + # cold white + id: indicator + red: 0.9 + green: 0.9 + blue: 0.9 + effect: "None" + brightness: !lambda |- + return id(dim); + - logger.log: "Leaving night mode via on_time, enabling LED indicator." + - hours: 22 + minutes: 0 + seconds: 0 + then: + - light.turn_off: indicator + - logger.log: "Entering night mode via on_time, disabling LED indicator." + on_time_sync: + then: + - if: + condition: + lambda: | + return + (id(time_source).now().hour < 8 || + id(time_source).now().hour >= 22); + then: + - light.turn_off: indicator + - logger.log: "Entering night mode via on_time_sync, disabling LED indicator." + +i2c: + scl: GPIO5 + sda: GPIO4 + scan: false + +sensor: + - platform: scd4x + id: scd40 + # low power mode + measurement_mode: low_power_periodic + update_interval: 30s + # Apply a temperature correction offset, that gets substracted + # from the measured temperature, defaults to 4.0 + #temperature_offset: 1.5 + co2: + name: "${macsuffix} CO2" + on_value: + then: + - if: + condition: + and: + - lambda: return (x < id(threshold1)); + - light.is_on: indicator + then: + - light.turn_on: + # cold white + id: indicator + red: 0.9 + green: 0.9 + blue: 0.9 + effect: "None" + brightness: !lambda |- + return id(dim); + - if: + condition: + and: + - lambda: return (x > id(threshold1) and x < id(threshold2)); + - light.is_on: indicator + then: + - light.turn_on: + # neutral white + id: indicator + red: 1.0 + green: 0.84 + blue: 0.54 + effect: "None" + brightness: !lambda |- + return id(bright); + - if: + condition: + and: + - lambda: return (x > id(threshold2) and x < id(threshold3)); + - light.is_on: indicator + then: + - light.turn_on: + # warmwhite + id: indicator + red: 1.0 + green: 0.75 + blue: 0.0 + effect: "None" + brightness: !lambda |- + return id(bright); + - if: + condition: + and: + - lambda: return (x > id(threshold3) and x < id(threshold4)); + - light.is_on: indicator + then: + - light.turn_on: + # orange + id: indicator + red: 1.0 + green: 0.5 + blue: 0.0 + effect: "None" + brightness: !lambda |- + return id(bright); + - if: + condition: + and: + - lambda: return (x > id(threshold4) and x < id(threshold5)); + - light.is_on: indicator + then: + - light.turn_on: + # red + id: indicator + red: 1.0 + green: 0.0 + blue: 0.0 + effect: "None" + brightness: !lambda |- + return id(bright); + - if: + condition: + - lambda: return (x > id(threshold5)); + - light.is_on: indicator + then: + - light.turn_on: + # red pulse + id: indicator + red: 1.0 + green: 0.0 + blue: 0.0 + effect: "Fast Pulse" + brightness: !lambda |- + return id(bright); + humidity: + name: "${macsuffix} Humidity" + temperature: + name: "${macsuffix} Temperature" + +button: + - platform: template + name: "${macsuffix} Force CO2 Sensor Calibration" + icon: "mdi:restart" + on_press: + then: + - scd4x.perform_forced_calibration: + # Average outdoor value for March 2023 + # https://www.co2.earth/daily-co2 + value: 421 + id: scd40 + +light: + - platform: neopixelbus + id: indicator + name: "${macsuffix} CO2 Level Indicator" + type: GRB + variant: WS2812 + pin: GPIO0 + num_leds: 3 + effects: + - pulse: + name: "Fast Pulse" + transition_length: 0.5s + update_interval: 0.5s