esphome: name: buttonplus-test friendly_name: ButtonPlus_test on_boot: priority: -100 then: - script.execute: setup_bar_displays - script.execute: update_bar1_left - script.execute: update_bar1_right - script.execute: update_bar2_left - script.execute: update_bar2_right - script.execute: update_bar3_left - script.execute: update_bar3_right esp32: board: esp32-s3-devkitc-1 flash_size: 16MB framework: type: arduino debug: update_interval: 5s text_sensor: - platform: debug device: name: "Device Info" reset_reason: name: "Reset Reason" # Logger must be at least debug (default) logger: level: debug # Enable Home Assistant API api: encryption: key: "" ota: - platform: esphome password: "" wifi: ssid: !secret wifi_ssid password: !secret wifi_password output_power: 15.5dB i2c: - id: temperature_sensor sda: GPIO1 scl: GPIO2 - id: buttons sda: GPIO47 scl: GPIO48 frequency: 400khz spi: clk_pin: GPIO36 mosi_pin: GPIO35 mcp23008: - id: base_J0 i2c_id: buttons address: 0x20 - id: base_J1 i2c_id: buttons address: 0x21 - id: base_J2 i2c_id: buttons address: 0x22 - id: base_J3 i2c_id: buttons address: 0x23 output: - platform: ledc pin: GPIO3 id: display_main_backlight_pwm inverted: True max_power: 1.0 frequency: 500Hz - platform: ledc pin: GPIO46 id: displays_mini_backlight_pwm inverted: True max_power: 0.6 frequency: 500Hz - id: cs_pin_bar1_left platform: gpio pin: mcp23xxx: base_J1 number: 5 mode: output: true inverted: true - id: cs_pin_bar1_right platform: gpio pin: mcp23xxx: base_J1 number: 1 mode: output: true inverted: true - id: cs_pin_bar2_left platform: gpio pin: mcp23xxx: base_J2 number: 5 mode: output: true inverted: true - id: cs_pin_bar2_right platform: gpio pin: mcp23xxx: base_J2 number: 1 mode: output: true inverted: true - id: cs_pin_bar3_left platform: gpio pin: mcp23xxx: base_J3 number: 5 mode: output: true inverted: true - id: cs_pin_bar3_right platform: gpio pin: mcp23xxx: base_J3 number: 1 mode: output: true inverted: true sensor: - platform: sts3x id: inside_temperature i2c_id: temperature_sensor name: "Temperature" address: 0x4A update_interval: 10s - platform: homeassistant entity_id: sensor.gw1100a_outdoor_temperature id: outside_temperature - platform: debug free: name: "Heap Free" block: name: "Heap Max Block" loop_time: name: "Loop Time" psram: name: "Free PSRAM" time: - platform: homeassistant id: datetime font: - file: "https://github.com/web-fonts/ttf/raw/refs/heads/master/bpg-ingiri-arial-webfont.ttf" id: font_arial20 size: 20 bpp: 4 - file: "https://github.com/web-fonts/ttf/raw/refs/heads/master/bpg-ingiri-arial-webfont.ttf" id: font_arial15 size: 15 bpp: 4 - file: "https://github.com/web-fonts/ttf/raw/refs/heads/master/bpg-ingiri-arial-webfont.ttf" id: font_arial40 size: 40 bpp: 4 - file: "https://torinak.com/font/7segment.ttf" id: font_clock size: 80 bpp: 4 - file: "https://torinak.com/font/7segment.ttf" id: font_date size: 30 bpp: 4 image: - file: mdi:lightbulb id: lightbulb resize: 80x80 - file: mdi:alert id: alert resize: 80x80 - file: mdi:chevron-right id: icon_next_page resize: 30x30 - file: mdi:chevron-left id: icon_prev_page resize: 30x30 - file: mdi:sun-thermometer-outline id: icon_temp_outside resize: 40x40 - file: mdi:home-thermometer-outline id: icon_temp_inside resize: 40x40 color: - id: red hex: FF0000 - id: blue hex: 0000FF - id: yellow hex: FFFF00 - id: green hex: 00FF00 - id: orange hex: FF7F00 - id: white hex: FFFFFF binary_sensor: - platform: gpio id: 'main_display_btn_left' name: "Main Display button Left" pin: mcp23xxx: base_J2 number: 6 mode: INPUT_PULLUP inverted: true on_click: - script.execute: prev_page_all - platform: gpio id: 'main_display_btn_right' name: "Main Display button Right" pin: mcp23xxx: base_J2 number: 2 mode: INPUT_PULLUP inverted: true on_click: - script.execute: next_page_all - platform: gpio id: 'bar1_btn_left' name: "BAR 1 button Left" pin: mcp23xxx: base_J3 number: 6 mode: INPUT_PULLUP inverted: true - platform: gpio id: 'bar1_btn_right' name: "BAR 1 button Right" pin: mcp23xxx: base_J3 number: 2 mode: INPUT_PULLUP inverted: true light: - platform: neopixelbus id: neopixels type: RGB variant: WS2812 pin: GPIO4 num_leds: 5 - platform: monochromatic output: display_main_backlight_pwm gamma_correct : 2.2 name: "Main Display Backlight" id: display_main_backlight restore_mode: ALWAYS_ON - platform: monochromatic output: displays_mini_backlight_pwm gamma_correct : 2.2 name: "Mini Display Backlight" id: displays_mini_backlight restore_mode: ALWAYS_ON - platform: partition name: "BAR 1 Left RGB Front" id: bar1_left_rgb_front segments: - id: neopixels from: 0 to: 0 - platform: partition name: "BAR 1 Left RGB Back" id: bar1_left_rgb_back segments: - id: neopixels from: 1 to: 1 - platform: partition name: "BAR 1 Right RGB Front" id: bar1_right_rgb_front segments: - id: neopixels from: 2 to: 2 - platform: partition name: "BAR 1 Right RGB Back" id: bar1_right_rgb_back segments: - id: neopixels from: 3 to: 3 display: - id: main_display platform: ili9xxx model: ili9341 color_order: rgb update_interval: 30s invert_colors: false dc_pin: number: GPIO37 allow_other_uses: true cs_pin: mcp23xxx: base_J0 number: 5 mode: output: true inverted: false show_test_card: false dimensions: height: 240 width: 320 rotation: 180 pages: - id: page1 lambda: |- id(all_pages).execute(); it.print(100, 160, id(font_arial20), "This is page 1!"); - id: bar_display platform: ili9xxx model: ST7735 color_order: bgr update_interval: never dc_pin: number: GPIO37 allow_other_uses: true invert_colors: false show_test_card: false auto_clear_enabled: false dimensions: height: 160 width: 80 offset_width: 24 script: - id: update_bar1_left then: - lambda: |- id(cs_pin_bar1_left).turn_on(); // << id(cs_pin_bar1_right).turn_off(); id(cs_pin_bar2_left).turn_off(); id(cs_pin_bar2_right).turn_off(); id(cs_pin_bar3_left).turn_off(); id(cs_pin_bar3_right).turn_off(); id(bar_display).clear(); id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_270_DEGREES); id(bar1_left_page1).execute(); id(bar_display).update(); delay(1); id(cs_pin_bar1_left).turn_off(); - id: update_bar1_right then: - lambda: |- id(cs_pin_bar1_left).turn_off(); id(cs_pin_bar1_right).turn_on(); // << id(cs_pin_bar2_left).turn_off(); id(cs_pin_bar2_right).turn_off(); id(cs_pin_bar3_left).turn_off(); id(cs_pin_bar3_right).turn_off(); id(bar_display).clear(); id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_90_DEGREES); id(bar1_right_page1).execute(); id(bar_display).update(); delay(1); id(cs_pin_bar1_right).turn_off(); - id: update_bar2_left then: - lambda: |- id(cs_pin_bar1_left).turn_off(); id(cs_pin_bar1_right).turn_off(); id(cs_pin_bar2_left).turn_on(); // << id(cs_pin_bar2_right).turn_off(); id(cs_pin_bar3_left).turn_off(); id(cs_pin_bar3_right).turn_off(); // id(bar_display).fill(id(orange)); id(bar_display).update(); delay(1); id(cs_pin_bar2_left).turn_off(); - id: update_bar2_right then: - lambda: |- id(cs_pin_bar1_left).turn_off(); id(cs_pin_bar1_right).turn_off(); id(cs_pin_bar2_left).turn_off(); id(cs_pin_bar2_right).turn_on(); // << id(cs_pin_bar3_left).turn_off(); id(cs_pin_bar3_right).turn_off(); // id(bar_display).fill(id(orange)); id(bar_display).update(); delay(1); id(cs_pin_bar2_right).turn_off(); - id: update_bar3_left then: - lambda: |- id(cs_pin_bar1_left).turn_off(); id(cs_pin_bar1_right).turn_off(); id(cs_pin_bar2_left).turn_off(); id(cs_pin_bar2_right).turn_off(); id(cs_pin_bar3_left).turn_on(); // << id(cs_pin_bar3_right).turn_off(); // id(bar_display).fill(id(orange)); id(bar_display).update(); delay(1); id(cs_pin_bar3_left).turn_off(); - id: update_bar3_right then: - lambda: |- id(cs_pin_bar1_left).turn_off(); id(cs_pin_bar1_right).turn_off(); id(cs_pin_bar2_left).turn_off(); id(cs_pin_bar2_right).turn_off(); id(cs_pin_bar3_left).turn_off(); id(cs_pin_bar3_right).turn_on(); // id(bar_display).fill(id(orange)); id(bar_display).update(); delay(1); id(cs_pin_bar3_right).turn_off(); - id: bar1_left_page1 then: - lambda: |- id(bar_display).image(80, 0, id(lightbulb), ImageAlign::TOP_CENTER, id(orange)); - id: bar1_right_page1 then: - lambda: |- id(bar_display).image(80, 0, id(alert), ImageAlign::TOP_CENTER, id(red)); - id: setup_bar_displays then: - lambda: |- id(cs_pin_bar1_left).turn_on(); id(bar_display).setup(); id(cs_pin_bar1_left).turn_off(); delay(5); id(cs_pin_bar1_right).turn_on(); id(bar_display).setup(); id(cs_pin_bar1_right).turn_off(); delay(5); id(cs_pin_bar2_left).turn_on(); id(bar_display).setup(); id(cs_pin_bar2_left).turn_off(); delay(5); id(cs_pin_bar2_right).turn_on(); id(bar_display).setup(); id(cs_pin_bar2_right).turn_off(); delay(5); id(cs_pin_bar3_left).turn_on(); id(bar_display).setup(); id(cs_pin_bar3_left).turn_off(); delay(5); id(cs_pin_bar3_right).turn_on(); id(bar_display).setup(); id(cs_pin_bar3_right).turn_off(); - id: update_main then: - component.update: main_display - id: update_all then: - component.update: main_display - script.execute: update_bar1_left - script.execute: update_bar1_right - script.execute: update_bar2_left - script.execute: update_bar2_right - script.execute: update_bar3_left - script.execute: update_bar3_right - id: next_page_main then: - display.page.show_next: main_display - script.execute: update_main - id: next_page_all then: - display.page.show_next: main_display - script.execute: update_all - id: prev_page_main then: - display.page.show_previous: main_display - script.execute: update_main - id: prev_page_all then: - display.page.show_previous: main_display - script.execute: update_all - id: all_pages then: - lambda: |- //>>> make a border arround the display id(main_display).filled_rectangle( 0, 0, 320, 3, id(red)); id(main_display).filled_rectangle( 0, 0, 3, 240, id(red)); id(main_display).filled_rectangle( 0, 237, 320, 3, id(red)); //id(main_display).filled_rectangle( 0, 206, 320, 3, id(red)); id(main_display).filled_rectangle(317, 0, 3, 240, id(red)); // //>>> prev/next icons next to butotns id(main_display).image(0, 208, id(icon_prev_page), ImageAlign::TOP_LEFT, id(orange)); id(main_display).image(320, 208, id(icon_next_page), ImageAlign::TOP_RIGHT, id(orange)); // //>>> temperature inside: id(main_display).image(36, 15, id(icon_temp_inside), ImageAlign::TOP_CENTER, id(orange)); id(main_display).printf(36, 85, id(font_arial20), id(white), TextAlign::BASELINE_CENTER , "%.1f°", id(inside_temperature).state); // //>>> vertical line: id(main_display).filled_rectangle(70, 0, 3, 115, id(red)); // //>>> print time and date id(main_display).strftime(160, 5, id(font_clock), TextAlign::TOP_CENTER, "%H:%M", id(datetime).now()); id(main_display).strftime(160, 80, id(font_date), TextAlign::TOP_CENTER, "%d-%m-%Y", id(datetime).now()); // //>>> vertical line: id(main_display).filled_rectangle(250, 0, 3, 115, id(red)); // //>>> outside temperature id(main_display).image(285, 15, id(icon_temp_outside), ImageAlign::TOP_CENTER, id(orange)); id(main_display).printf(285, 85, id(font_arial20), id(white), TextAlign::BASELINE_CENTER , "%.1f°", id(outside_temperature).state); // //>>> horizontal line: id(main_display).filled_rectangle(0, 115, 320, 3, id(red));