From 2cf78c3fc80bcadf5fc31f217b78b187448dc5ab Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 22 Jan 2026 22:48:15 +0100 Subject: add toilet light --- esphome/config/toiletlight.yaml | 128 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 esphome/config/toiletlight.yaml diff --git a/esphome/config/toiletlight.yaml b/esphome/config/toiletlight.yaml new file mode 100644 index 0000000..41cf154 --- /dev/null +++ b/esphome/config/toiletlight.yaml @@ -0,0 +1,128 @@ +substitutions: + device_name: toiletlight + friendly_name: "Toilet Light" + +esphome: + name: ${device_name} + friendly_name: ${friendly_name} + area: Toilet + +esp32: + variant: esp32c3 + cpu_frequency: 80MHz + framework: + type: esp-idf + sdkconfig_options: + CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON: y + CONFIG_BOOTLOADER_LOG_LEVEL_NONE: y + CONFIG_LOG_DEFAULT_LEVEL_NONE: y + +preferences: + flash_write_interval: 30s + +# Enable logging +logger: + # disable logging for much faster startup + level: NONE + # make RXD / TXD available + baud_rate: 0 + +# Enable Home Assistant API +api: + encryption: + key: !secret api_encryption_key + +# OTA +ota: + - platform: esphome + password: !secret ota_password + +# WiFi Credentials +wifi: + domain: .lan + ssid: !secret wifi_ssid + password: !secret wifi_password + # enabling power saves causes jitter! + power_save_mode: NONE + + # Enable fallback hotspot (captive portal) in case wifi connection fails + ap: + ssid: "${device_name} Fallback Hotspot" + password: !secret wifi_ap_password + +captive_portal: + +light: + - id: toilet + platform: color_temperature + name: "Toilet" + color_temperature: pwm_warm_cold + # we are using pwm_dim_mapped to transform between min+max-power + # otherwise one can use: + #brightness: pwm_dim + #gamma_correct: 1.0 + brightness: pwm_dim_mapped + cold_white_color_temperature: 6500 K + warm_white_color_temperature: 3000 K + default_transition_length: 300ms + initial_state: + state: true + brightness: 100% + color_temperature: 4500 K + restore_mode: RESTORE_DEFAULT_ON + +output: + - id: pwm_dim + platform: ledc + pin: GPIO1 + frequency: 3900 Hz + channel: 0 + min_power: 0.04 + zero_means_zero: true + + - id: pwm_warm + platform: ledc + pin: GPIO3 + # original mcu uses 3900Hz + frequency: 24000 Hz + channel: 2 + + - id: pwm_cold + platform: ledc + pin: GPIO4 + # original mcu uses 3900Hz + frequency: 24000 Hz + channel: 3 + phase_angle: 180° + + - platform: template + id: pwm_warm_cold + type: float + write_action: + - lambda: |- + auto warm = id(pwm_warm), cold = id(pwm_cold); + ESP_LOGD("cal", "warm: %f, cold: %f, phase: %f", state, 1-state, state*360.0); + warm->set_level(state); + cold->set_level(1 - state); + cold->set_phase_angle(state * 360.0); + + # map output to range (min_power, max_power) + - platform: template + id: pwm_dim_mapped + type: float + write_action: + - lambda: |- + auto output = id(pwm_dim); + float min = output->get_min_power(), max = output->get_max_power(); + float newlvl = (state) ? state * (max - min) + min : 0; + ESP_LOGD("cal", "dim: %f -> %f", state, newlvl); + output->set_level(newlvl); + +# closed loop not implemented +#sensor: +# - id: adc_cs +# platform: adc +# pin: GPIO0 +# accuracy_decimals: 2 +# attenuation: auto +# update_interval: 1s -- cgit v1.2.3