substitutions: device_name: led_wall_clock esphome: name: $device_name platform: esp32 board: esp32cam on_boot: - light.turn_on: id: led_strip brightness: 70% red: 0 green: 0 blue: 0 effect: "${device_name} Time effect" - light.turn_on: id: signal_strip brightness: 70% red: 0 green: 0 blue: 0 wifi: ssid: "Your_SSID" password: "Your_password" # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "${device_name} Fallback Hotspot" password: "Yout_password" logger: level: DEBUG # Enable Home Assistant API api: ota: password: "Your_password" globals: - id: hours_red_value type: int restore_value: yes initial_value: '0' - id: hours_green_value type: int restore_value: yes initial_value: '0' - id: hours_blue_value type: int restore_value: yes initial_value: '0' - id: minutes_red_value type: int restore_value: yes initial_value: '0' - id: minutes_green_value type: int restore_value: yes initial_value: '0' - id: minutes_blue_value type: int restore_value: yes initial_value: '0' - id: dots_red_value type: int restore_value: yes initial_value: '0' - id: dots_green_value type: int restore_value: yes initial_value: '0' - id: dots_blue_value type: int restore_value: yes initial_value: '0' output: #======== Hours ============ - platform: template id: hours_red_output type: float write_action: lambda: |- id(hours_red_value) = 255.0 * state; - platform: template id: hours_green_output type: float write_action: - lambda: |- id(hours_green_value) = 255.0 * state; - platform: template id: hours_blue_output type: float write_action: lambda: |- id(hours_blue_value) = 255.0 * state; #========= Minutes =========== - platform: template id: minutes_red_output type: float write_action: lambda: |- id(minutes_red_value) = 255.0 * state; - platform: template id: minutes_green_output type: float write_action: lambda: |- id(minutes_green_value) = 255.0 * state; - platform: template id: minutes_blue_output type: float write_action: lambda: |- id(minutes_blue_value) = 255.0 * state; #========= dots =========== - platform: template id: dots_red_output type: float write_action: lambda: |- id(dots_red_value) = 255.0 * state; - platform: template id: dots_green_output type: float write_action: lambda: |- id(dots_green_value) = 255.0 * state; - platform: template id: dots_blue_output type: float write_action: lambda: |- id(dots_blue_value) = 255.0 * state; time: - platform: sntp id: sntp_time timezone: "Asia/Seoul" servers: - 0.pool.ntp.org - 1.pool.ntp.org - 2.pool.ntp.org light: - platform: rgb name: "${device_name} hours lights" id: 'hours_lights' red: hours_red_output green: hours_green_output blue: hours_blue_output - platform: rgb name: "${device_name} minutes lights" id: 'minutes_lights' red: minutes_red_output green: minutes_green_output blue: minutes_blue_output - platform: rgb name: "${device_name} dots lights" id: 'dots_lights' red: dots_red_output green: dots_green_output blue: dots_blue_output #--------- LED strip ---------------- - platform: neopixelbus type: GRB variant: WS2812 method: type: esp32_rmt channel: 0 id: led_strip name: "Led strip" pin: GPIO3 num_leds: 30 effects: - addressable_lambda: name: "${device_name} Time effect" update_interval: 200ms lambda: |- const int ledsInDigitCount = 7; const int digitsCount = 4; int digitsLeds[11][ledsInDigitCount] = { {1,1,1,0,1,1,1}, {1,0,0,0,1,0,0}, {0,1,1,1,1,1,0}, {1,1,0,1,1,1,0}, {1,0,0,1,1,0,1}, {1,1,0,1,0,1,1}, {1,1,1,1,0,1,1}, {1,0,0,0,1,1,0}, {1,1,1,1,1,1,1}, {1,1,0,1,1,1,1}, {0,0,0,0,0,0,0} }; int ledOffsets[digitsCount] = {23 , 16, 7, 0}; auto time = id(sntp_time).now(); int colors[4][3] = { {id(hours_red_value), id(hours_green_value), id(hours_blue_value)}, {id(hours_red_value), id(hours_green_value), id(hours_blue_value)}, {id(minutes_red_value), id(minutes_green_value), id(minutes_blue_value)}, {id(minutes_red_value), id(minutes_green_value), id(minutes_blue_value)} }; int values[digitsCount] = {}; if (time.hour == 0){ values[0] = 10; values[1] = 0; } if (time.hour == 1){ values[0] = 10; values[1] = 1; } if (time.hour == 2){ values[0] = 10; values[1] = 2; } if (time.hour == 3){ values[0] = 10; values[1] = 3; } if (time.hour == 4){ values[0] = 10; values[1] = 4; } if (time.hour == 5){ values[0] = 10; values[1] = 5; } if (time.hour == 6){ values[0] = 10; values[1] = 6; } if (time.hour == 7){ values[0] = 10; values[1] = 7; } if (time.hour == 8){ values[0] = 10; values[1] = 8; } if (time.hour == 9){ values[0] = 10; values[1] = 9; } if (time.hour == 10){ values[0] = 1; values[1] = 0; } if (time.hour == 11){ values[0] = 1; values[1] = 1; } if (time.hour == 12){ values[0] = 1; values[1] = 2; } if (time.hour == 13){ values[0] = 10; values[1] = 1; } if (time.hour == 14){ values[0] = 10; values[1] = 2; } if (time.hour == 15){ values[0] = 10; values[1] = 3; } if (time.hour == 16){ values[0] = 10; values[1] = 4; } if (time.hour == 17){ values[0] = 10; values[1] = 5; } if (time.hour == 18){ values[0] = 10; values[1] = 6; } if (time.hour == 19){ values[0] = 10; values[1] = 7; } if (time.hour == 20){ values[0] = 10; values[1] = 8; } if (time.hour == 21){ values[0] = 10; values[1] = 9; } if (time.hour == 22){ values[0] = 1; values[1] = 0; } if (time.hour == 23){ values[0] = 1; values[1] = 1; } values[2] = time.minute / 10; values[3] = time.minute % 10; it.all() = Color(0,0,0); it[14] = Color(id(dots_red_value), id(dots_green_value), id(dots_blue_value)); it[15] = Color(id(dots_red_value), id(dots_green_value), id(dots_blue_value)); for (int valueI = 0; valueI < digitsCount; valueI++) { int ledsOffset = ledOffsets[valueI]; int timeValue = values[valueI]; int *color = colors[valueI]; int *leds = digitsLeds[timeValue]; for (int ledI = 0; ledI < ledsInDigitCount; ledI++) { if(leds[ledI] > 0) { int ledIndex = ledI + ledsOffset; it[ledIndex] = Color(color[0], color[1], color[2]); } } } - platform: neopixelbus type: GRB variant: WS2812 method: type: esp32_rmt channel: 1 id: signal_strip name: "Signal_strip" pin: GPIO16 num_leds: 1