From 587a968451083ad8581316a885020511f3d1e073 Mon Sep 17 00:00:00 2001 From: Philip Stark Date: Sat, 10 Jun 2023 14:33:07 +0200 Subject: [PATCH] feat(esp32): move to esp32 platform and add configuration inputs. --- susannes_wordclock_esp32.yaml | 298 ++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 susannes_wordclock_esp32.yaml diff --git a/susannes_wordclock_esp32.yaml b/susannes_wordclock_esp32.yaml new file mode 100644 index 0000000..11f029f --- /dev/null +++ b/susannes_wordclock_esp32.yaml @@ -0,0 +1,298 @@ +esphome: + name: "wordclock" + +esp32: + # board: ttgo-t7-v13-mini32 + board: wemos_d1_mini32 + framework: + type: arduino + +external_components: + - source: + type: local + path: components + components: [ wordclock ] + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + ap: + ssid: "WordClock Configuration" + password: !secret ap_password + manual_ip: + static_ip: !secret manualip_static_ip + gateway: !secret manualip_gateway + subnet: !secret manualip_subnet + dns1: 1.1.1.1 + dns2: 1.0.0.1 + +captive_portal: + +# api: + +ota: + password: "wordclock" + +logger: + +switch: + - platform: template + name: "5 Rainbow ON/OFF" + # lambda: |- + # return id(wordclock_1)->get_effect_active(); + restore_state: true + optimistic: true + restore_mode: RESTORE_DEFAULT_ON + turn_on_action: + - lambda: |- + id(wordclock_1)->set_effect_active(true); + turn_off_action: + - lambda: |- + id(wordclock_1)->set_effect_active(false); + +# on_...: +# - globals.set: +# id: my_global_var +# value: '10' + + +# output: +# - platform: template +# id: dummy_out +# type: float +# write_action: +# - lambda: |- +# return id(wordclock_1)->set_effect_active(true); + # Example configuration entry +globals: + - id: my_global_int + type: int + restore_value: no + initial_value: '0' + # Example for global string variable + - id: my_global_string + type: std::string + restore_value: no # Strings cannot be saved/restored + initial_value: '"Global value is"' + +number: + - platform: template + name: "1 Red" + optimistic: true + restore_value: true + initial_value: 255 + # lambda: |- + # return id(wordclock_1)->on_color.red; + on_value: + - lambda: |- + id(wordclock_1)->on_color.red = x; + set_action: + - lambda: |- + id(wordclock_1)->on_color.red = x; + min_value: 0 + max_value: 255 + step: 1 + - platform: template + name: "2 Green" + optimistic: true + restore_value: true + initial_value: 255 + # lambda: |- + # return id(wordclock_1)->on_color.green; + on_value: + - lambda: |- + id(wordclock_1)->on_color.green = x; + set_action: + - lambda: |- + id(wordclock_1)->on_color.green = x; + min_value: 0 + max_value: 255 + step: 1 + - platform: template + name: "3 Blue" + optimistic: true + restore_value: true + initial_value: 255 + # lambda: |- + # return id(wordclock_1)->on_color.blue; + on_value: + - lambda: |- + id(wordclock_1)->on_color.blue = x; + set_action: + - lambda: |- + id(wordclock_1)->on_color.blue = x; + min_value: 0 + max_value: 255 + step: 1 + - platform: template + name: "4 Brightness" + optimistic: true + restore_value: true + initial_value: 255 + # lambda: |- + # return id(wordclock_1)->brightness; + on_value: + - lambda: |- + id(wordclock_1)->brightness = x; + set_action: + - lambda: |- + id(wordclock_1)->brightness = x; + min_value: 0 + max_value: 255 + step: 1 +# select: +# - platform: template +# name: "Rainbow ON/OFF" +# restore_value: true +# set_action: +# - lambda: |- +# return id(wordclock_1)->set_color_value(x); +# optimistic: true +# options: +# - effect +# - color +# initial_option: effect +# - platform: template +# name: "Template select" +# restore_value: true +# set_action: +# - lambda: |- +# return id(wordclock_1)->set_color_value(x); +# optimistic: true +# options: +# - effect +# - color +# initial_option: effect + + +web_server: + port: 80 + version: 2 + local: true + +time: + - platform: sntp + id: current_time + timezone: !secret timezone + + +light: + - name: NeoPixel Strip 1 + id: neopixel_strip_1 + platform: neopixelbus + type: GRB + variant: WS2812 + pin: GPIO22 + num_leds: 198 + restore_mode: ALWAYS_OFF + internal: true + method: + type: esp32_i2s + effects: + - addressable_random_twinkle: + name: "random_twinkle" + +display: + - platform: addressable_light + id: led_matrix_display + addressable_light_id: neopixel_strip_1 + width: 18 + height: 11 + rotation: 270° + update_interval: 16ms + auto_clear_enabled: false + pixel_mapper: |- + int mapping_even[] = {0, 2, 4, 6,8,10,11,13,15,17, 16,16,16,16, 16,16,16,16}; + int mapping_odd[] = {17,15,13,11,9, 7, 6, 4, 2, 0, 16,16,16,16, 16,16,16,16}; + if (x > 9) return -1; + if (y % 2 == 0) { + return (y * 18 + mapping_even[x]); + } else { + return (y * 18 + mapping_odd[x]); + } + +color: + - id: col_on + red: 90% + green: 50% + blue: 0% + - id: col_off + red: 0% + green: 0% + blue: 0% + +wordclock: + id: wordclock_1 + time_id: current_time + display_id: led_matrix_display + addressable_light_id: neopixel_strip_1 + brightness: 100% + color_on: col_on + color_off: col_off + update_interval: 16ms + static_segments: ["IT", "IS"] + segments: + - {name: "IT", line: {x1: 0, x2: 1, y1: 0}} + - {name: "IS", line: {x1: 3, x2: 4, y1: 0}} + - {name: "AM", line: {x1: 7, x2: 8, y1: 0}} + - {name: "PM", line: {x1: 9, x2: 10, y1: 0}} + - {name: "QUARTER", line: {x1: 2, x2: 8, y1: 1}} + - {name: "TWENTY", line: {x1: 0, x2: 5, y1: 2}} + - {name: "FIVE_MINUTES", line: {x1: 6, x2: 9, y1: 2}} + - {name: "HALF", line: {x1: 0, x2: 3, y1: 3}} + - {name: "TEN_MINUTES", line: {x1: 5, x2: 7, y1: 3}} + - {name: "TO", line: {x1: 9, x2: 10, y1: 3}} + - {name: "PAST", line: {x1: 0, x2: 3, y1: 4}} + - {name: "NINE", line: {x1: 7, x2: 10, y1: 4}} + - {name: "ONE", line: {x1: 0, x2: 2, y1: 5}} + - {name: "SIX", line: {x1: 3, x2: 5, y1: 5}} + - {name: "THREE", line: {x1: 6, x2: 10, y1: 5}} + - {name: "FOUR", line: {x1: 0, x2: 3, y1: 6}} + - {name: "FIVE", line: {x1: 4, x2: 7, y1: 6}} + - {name: "TWO", line: {x1: 8, x2: 10, y1: 6}} + - {name: "EIGHT", line: {x1: 0, x2: 4, y1: 7}} + - {name: "ELEVEN", line: {x1: 5, x2: 10, y1: 7}} + - {name: "SEVEN", line: {x1: 0, x2: 4, y1: 8}} + - {name: "TWELVE", line: {x1: 5, x2: 10, y1: 8}} + - {name: "TEN", line: {x1: 0, x2: 2, y1: 9}} + - {name: "OCLOCK", line: {x1: 5, x2: 10, y1: 9}} + minutes: + - {minute: 0, hour_offset: 0, segments: ["OCLOCK"]} + - {minute: 5, hour_offset: 0, segments: ["FIVE_MINUTES", "PAST"]} + - {minute: 10, hour_offset: 0, segments: ["TEN_MINUTES", "PAST"]} + - {minute: 15, hour_offset: 0, segments: ["QUARTER", "PAST"]} + - {minute: 20, hour_offset: 0, segments: ["TWENTY", "PAST"]} + - {minute: 25, hour_offset: 0, segments: ["TWENTY", "FIVE_MINUTES", "PAST"]} + - {minute: 30, hour_offset: 0, segments: ["HALF", "PAST"]} + - {minute: 35, hour_offset: 1, segments: ["TWENTY", "FIVE_MINUTES", "TO"]} + - {minute: 40, hour_offset: 1, segments: ["TWENTY", "TO"]} + - {minute: 45, hour_offset: 1, segments: ["QUARTER", "TO"]} + - {minute: 50, hour_offset: 1, segments: ["TEN_MINUTES", "TO"]} + - {minute: 55, hour_offset: 1, segments: ["FIVE_MINUTES", "TO"]} + hours: + - {hour: 0, segments: "TWELVE"} + - {hour: 1, segments: "ONE"} + - {hour: 2, segments: "TWO"} + - {hour: 3, segments: "THREE"} + - {hour: 4, segments: "FOUR"} + - {hour: 5, segments: "FIVE"} + - {hour: 6, segments: "SIX"} + - {hour: 7, segments: "SEVEN"} + - {hour: 8, segments: "EIGHT"} + - {hour: 9, segments: "NINE"} + - {hour: 10, segments: "TEN"} + - {hour: 11, segments: "ELEVEN"} + - {hour: 12, segments: "TWELVE"} + - {hour: 13, segments: "ONE"} + - {hour: 14, segments: "TWO"} + - {hour: 15, segments: "THREE"} + - {hour: 16, segments: "FOUR"} + - {hour: 17, segments: "FIVE"} + - {hour: 18, segments: "SIX"} + - {hour: 19, segments: "SEVEN"} + - {hour: 20, segments: "EIGHT"} + - {hour: 21, segments: "NINE"} + - {hour: 22, segments: "TEN"} + - {hour: 23, segments: "ELEVEN"} + + \ No newline at end of file