259 lines
9.5 KiB
YAML
259 lines
9.5 KiB
YAML
##########################################################################################
|
||
##########################################################################################
|
||
# XCRhom.tech E27 9W RGBWW Smart Bulb
|
||
#
|
||
# # V1.0 2025-09-09 Initial Version
|
||
#
|
||
# Device https://www.aliexpress.com/item/1005007226730234.html
|
||
# Tasmota name AiYaTo-RGBCW
|
||
#
|
||
# GPIO Config
|
||
# -----
|
||
# - Pin map mirrors original Tasmota config:
|
||
# PWM1=GPIO12 (R), PWM2=GPIO14 (G), PWM3=GPIO5 (B),
|
||
# PWM4=GPIO4 (CW), PWM5=GPIO13 (WW, inverted).
|
||
#
|
||
# NOTES
|
||
#
|
||
##########################################################################################
|
||
##########################################################################################
|
||
|
||
|
||
##########################################################################################
|
||
# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS
|
||
# If NOT using a secrets file, just replace these with the passwords etc (in quotes)
|
||
##########################################################################################
|
||
substitutions:
|
||
# Device Naming
|
||
device_name: esp-rgblampbulb1
|
||
friendly_name: "RGBWW 9W E27 Smart Bulb"
|
||
description_comment: "RGBWW light bulb in bedroom 3 lamp"
|
||
device_area: "Bedroom 3" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant.
|
||
|
||
# Passwords If NOT using a secrets file, just replace these with the passwords etc (in quotes)
|
||
api_key: !secret esp-api_key # unfortunately you can't use substitutions inside secrets names
|
||
ota_pass: !secret esp-ota_pass # unfortunately you can't use substitutions inside secrets names
|
||
static_ip_address: !secret esp-rgblampbulb1_ip
|
||
|
||
# Adjust the color temperature here (200 mired is approx 5000k)
|
||
white_temp: "3000K"
|
||
|
||
# Device Settings
|
||
log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE
|
||
update_interval: "60s" # update time for for general sensors etc
|
||
|
||
# Adjust the ON/OFF times for flashing.
|
||
# 600ms on, 400ms off => 60% ON, 40% OFF duty cycle
|
||
on_time_ms: "500ms"
|
||
off_time_ms: "500ms"
|
||
|
||
##########################################################################################
|
||
# PACKAGES: Included Common Packages
|
||
# https://esphome.io/components/packages.html
|
||
##########################################################################################
|
||
# Comment some of these out where not needed, eg MQTT, Web portal, SNTP, General Sensors
|
||
##########################################################################################
|
||
packages:
|
||
common_wifi: !include
|
||
file: common/network_common.yaml
|
||
vars:
|
||
local_device_name: "${device_name}"
|
||
local_static_ip_address: "${static_ip_address}"
|
||
local_ota_pass: "${ota_pass}"
|
||
common_api: !include
|
||
file: common/api_common.yaml
|
||
vars:
|
||
local_api_key: "${api_key}"
|
||
#common_webportal: !include
|
||
# file: common/webportal_common.yaml
|
||
common_mqtt: !include
|
||
file: common/mqtt_common.yaml
|
||
vars:
|
||
local_device_name: "${device_name}"
|
||
common_sntp: !include
|
||
file: common/sntp_common.yaml
|
||
common_general_sensors: !include
|
||
file: common/sensors_common.yaml
|
||
vars:
|
||
local_friendly_name: "${friendly_name}"
|
||
local_update_interval: "${update_interval}"
|
||
|
||
#########################################################################################
|
||
# ESPHome
|
||
# https://esphome.io/components/esphome.html
|
||
#########################################################################################
|
||
esphome:
|
||
name: ${device_name}
|
||
friendly_name: ${friendly_name}
|
||
comment: ${description_comment} # appears on the esphome page in HA
|
||
on_boot:
|
||
priority: 800
|
||
then:
|
||
- light.turn_on:
|
||
id: my_light
|
||
brightness: 80%
|
||
color_temperature: ${white_temp} # e.g. "3000K" or "370 mireds"
|
||
transition_length: 3s
|
||
|
||
#########################################################################################
|
||
# ESP Platform and Framework
|
||
# https://esphome.io/components/esp32.html
|
||
#########################################################################################
|
||
esp8266:
|
||
board: esp01_1m
|
||
#early_pin_init: False # Initialise pins early to known values. Recommended false where switches are involved. Defaults to True.
|
||
board_flash_mode: dout # Default is dout
|
||
#restore_from_flash: true # restore some values on reboot
|
||
|
||
mdns:
|
||
disabled: false # Disabling will make the build file smaller (and it is still available via static IP)
|
||
|
||
preferences:
|
||
flash_write_interval: 20s
|
||
|
||
#########################################################################################
|
||
# ESPHome Logging Enable
|
||
# https://esphome.io/components/logger.html
|
||
#########################################################################################
|
||
logger:
|
||
level: INFO # INFO Level suggested, or DEBUG for testing
|
||
#baud_rate: 0 # set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM)
|
||
#esp8266_store_log_strings_in_flash: false
|
||
#tx_buffer_size: 64
|
||
|
||
##########################################################################################
|
||
# OUTPUT COMPONENT
|
||
# https://esphome.io/components/output/esp8266_pwm.html
|
||
##########################################################################################
|
||
output:
|
||
- platform: esp8266_pwm
|
||
id: output_red # PWM1 → GPIO12
|
||
pin: GPIO12
|
||
frequency: 1500 Hz
|
||
|
||
- platform: esp8266_pwm
|
||
id: output_green # PWM2 → GPIO14
|
||
pin: GPIO14
|
||
frequency: 1500 Hz
|
||
|
||
- platform: esp8266_pwm
|
||
id: output_blue # PWM3 → GPIO05
|
||
pin: GPIO05
|
||
frequency: 1500 Hz
|
||
|
||
# Typically one channel is cold white...
|
||
- platform: esp8266_pwm
|
||
id: output_cold_white # PWM4 → GPIO04
|
||
pin: GPIO04
|
||
frequency: 1500 Hz
|
||
|
||
# ...and one channel is warm white (inverted on GPIO13).
|
||
- platform: esp8266_pwm
|
||
id: output_warm_white # PWM5 → GPIO13
|
||
pin: GPIO13
|
||
frequency: 1500 Hz
|
||
inverted: true
|
||
|
||
##########################################################################################
|
||
# LIGHT COMPONENT
|
||
# https://esphome.io/components/light/
|
||
##########################################################################################
|
||
light:
|
||
- platform: rgbww
|
||
name: ${friendly_name}
|
||
id: my_light
|
||
red: output_red
|
||
green: output_green
|
||
blue: output_blue
|
||
cold_white: output_cold_white
|
||
warm_white: output_warm_white
|
||
|
||
# Keep total output reasonable on 9W bulbs and avoid mixing RGB with WW simultaneously.
|
||
constant_brightness: true
|
||
color_interlock: true
|
||
|
||
# Typical white temperature mapping for RGBWW
|
||
cold_white_color_temperature: 6500 K
|
||
warm_white_color_temperature: 2700 K
|
||
|
||
# Ensure it always powers on (and with our desired effect).
|
||
restore_mode: ALWAYS_ON
|
||
|
||
# Optional: small gamma tweak for nicer dimming curves
|
||
gamma_correct: 2.4
|
||
|
||
# You can omit this or set it to zero for no fade on effect changes.
|
||
default_transition_length: 0s
|
||
|
||
######################################################################################
|
||
# CALM EFFECTS
|
||
# - Night Light: steady warm, ~3% brightness
|
||
# - Breathe (Soft): slow, gentle brightness wave on current color
|
||
# - Amber Glow: very gentle warm amber wave
|
||
# - Blue Calm: subtle cool blue drift
|
||
# - Warm Dim: static warm preset around 15%
|
||
######################################################################################
|
||
effects:
|
||
# Night Light (steady warm ~3%)
|
||
- lambda:
|
||
name: "Night Light"
|
||
update_interval: 2s
|
||
lambda: |-
|
||
auto call = id(my_light).turn_on();
|
||
call.set_brightness(0.03f);
|
||
// 2700K ≈ 370 mireds
|
||
call.set_color_temperature(370.0f);
|
||
call.set_transition_length(1000);
|
||
call.perform();
|
||
|
||
# Breathe (Soft) — gentle pulse on the *current* color
|
||
- pulse:
|
||
name: "Breathe (Soft)"
|
||
transition_length: 3s
|
||
update_interval: 3s
|
||
min_brightness: 5%
|
||
max_brightness: 35%
|
||
|
||
# Amber Glow — very gentle warm wave (8–20%)
|
||
- lambda:
|
||
name: "Amber Glow"
|
||
update_interval: 500ms
|
||
lambda: |-
|
||
static float t = 0.0f;
|
||
t += 0.5f; // seconds step (approx)
|
||
float phase = (sinf(t * 2.0f * (3.14159f/16.0f)) + 1.0f) / 2.0f; // 16s cycle
|
||
float b = 0.08f + phase * 0.12f; // 8%..20%
|
||
auto call = id(my_light).turn_on();
|
||
call.set_brightness(b);
|
||
// Warm amber tone via WW channel (keep RGB off)
|
||
call.set_color_temperature(400.0f); // ≈ 2500K-2800K feel
|
||
call.set_transition_length(800);
|
||
call.perform();
|
||
|
||
# Blue Calm — soft cool tint, tiny drift (6–14%)
|
||
- lambda:
|
||
name: "Blue Calm"
|
||
update_interval: 1000ms
|
||
lambda: |-
|
||
static float t = 0.0f;
|
||
t += 1.0f;
|
||
float phase = (sinf(t * 2.0f * (3.14159f/20.0f)) + 1.0f) / 2.0f; // 20s cycle
|
||
float b = 0.06f + phase * 0.08f; // 6%..14%
|
||
auto call = id(my_light).turn_on();
|
||
call.set_brightness(b);
|
||
// Gentle cool tint using RGB to keep it soft
|
||
call.set_rgb(0.45f, 0.55f, 1.00f);
|
||
call.set_transition_length(1200);
|
||
call.perform();
|
||
|
||
# Warm Dim — static warm preset (~15%)
|
||
- lambda:
|
||
name: "Warm Dim"
|
||
update_interval: 5s
|
||
lambda: |-
|
||
auto call = id(my_light).turn_on();
|
||
call.set_brightness(0.15f);
|
||
call.set_color_temperature(360.0f); // ~2777K
|
||
call.set_transition_length(800);
|
||
call.perform();
|