Files
buttonplus-esphome-generator/esphome/latest_generated_full_base.yaml
T

1646 lines
45 KiB
YAML

# Generated by ESPHome for Buttonplus
# File: buttonplus_base.yaml
# Options:
# - device: buttonplus
# - version: 1
# - bars: 3
# - pages: Start, Music, Lights, Security
esphome:
on_boot:
priority: -100
then:
- script.execute: setup_bar_displays
- script.execute: test_all_leds
- script.execute: bar1_left_script_update
- script.execute: bar1_right_script_update
- script.execute: bar2_left_script_update
- script.execute: bar2_right_script_update
- script.execute: bar3_left_script_update
- script.execute: bar3_right_script_update
esp32:
variant: ESP32S3
board: esp32-s3-devkitc1-n16r8
flash_size: 16MB
framework:
type: esp-idf
psram:
mode: octal
speed: 80MHz
api:
actions:
- action: notification
variables:
flash_leds: bool
message: string
then:
- globals.set:
id: internal_notify
value: !lambda "return message;"
- script.execute: display_script_update
- while:
condition:
lambda: return (flash_leds && id(internal_notify).size() > 0);
then:
- light.turn_on:
id: internal_notification_rgb
brightness: 100%
red: 100%
green: 100%
blue: 100%
flash_length: 1s
- delay: 2s
- wait_until:
condition:
lambda: return id(internal_notify).size() == 0;
- light.control:
id: bar1_left_back_rgb_led
- light.control:
id: bar1_right_back_rgb_led
- action: notification_clear
then:
- globals.set:
id: internal_notify
value: !lambda "return std::string();"
- script.execute: display_script_update
- action: toast
variables:
timeout: int
message: string
then:
- globals.set:
id: internal_toast
value: !lambda "return message;"
- script.execute: display_script_update
- delay: !lambda "return timeout * 1000;"
- globals.set:
id: internal_toast
value: !lambda "return std::string();"
- script.execute: display_script_update
- action: clear_image
then:
- globals.set:
id: show_web_image
value: !lambda "return false;"
- online_image.release: web_image
- globals.set:
id: show_ha_image
value: !lambda "return false;"
- online_image.release: ha_image
- script.execute: display_script_update
- action: show_web_jpeg_image
variables:
timeout: int
image_url: string
then:
- online_image.set_url:
id: web_image
url: !lambda "return image_url;"
- globals.set:
id: show_web_image
value: !lambda "return true;"
- delay: !lambda "return timeout * 1000;"
- globals.set:
id: show_web_image
value: !lambda "return false;"
- online_image.release: web_image
- script.execute: display_script_update
- action: show_ha_jpeg_image
variables:
timeout: int
image_url: string
then:
- online_image.set_url:
id: ha_image
url: !lambda "return image_url;"
- globals.set:
id: show_ha_image
value: !lambda "return true;"
- delay: !lambda "return timeout * 1000;"
- globals.set:
id: show_ha_image
value: !lambda "return false;"
- online_image.release: ha_image
- script.execute: display_script_update
- action: set_page_led
variables:
led: string
page_name: string
r: float
g: float
b: float
brightness: float
effect: string
then:
- if:
condition:
lambda: |-
// Validate page_name if provided
auto it = std::find(id(page_names).begin(), id(page_names).end(), page_name);
if (it == id(page_names).end()) return true;
return false;
then:
- api.respond:
success: false
error_message: Invalid page_name (not found).
else:
- if:
condition:
lambda: return id(internal_page_leds_r).find(led) == id(internal_page_leds_r).end();
then:
- api.respond:
success: false
error_message: The requested LED does not exist.
else:
- lambda: |-
// Resolve final page index
auto it = std::find(id(page_names).begin(), id(page_names).end(), page_name);
int page_num = std::distance(id(page_names).begin(), it);
id(internal_page_leds_r)[led][page_num] = r;
id(internal_page_leds_g)[led][page_num] = g;
id(internal_page_leds_b)[led][page_num] = b;
id(internal_page_leds_brightness)[led][page_num] = brightness;
id(internal_page_leds_effect)[led][page_num] = effect;
- api.respond:
success: true
- if:
condition:
lambda: |-
auto it = std::find(id(page_names).begin(), id(page_names).end(), page_name);
int page_num = std::distance(id(page_names).begin(), it);
return page_num == id(active_page_nr);
then:
- script.execute: update_all_page_leds
- action: get_info
supports_response: only
then:
- api.respond:
data: !lambda |-
root["num_pages"] = id(nr_of_pages);
JsonArray pages = root["page_names"].to<JsonArray>();
for(const std::string& page_name : id(page_names)){
pages.add(page_name);
}
JsonArray effects = root["effects"].to<JsonArray>();
JsonArray leds = root["leds"].to<JsonArray>();
leds.add("bar1_left_front_rgb_led");
leds.add("bar1_right_front_rgb_led");
leds.add("bar1_left_back_rgb_led");
leds.add("bar1_right_back_rgb_led");
leds.add("bar2_left_front_rgb_led");
leds.add("bar2_right_front_rgb_led");
leds.add("bar2_left_back_rgb_led");
leds.add("bar2_right_back_rgb_led");
leds.add("bar3_left_front_rgb_led");
leds.add("bar3_right_front_rgb_led");
leds.add("bar3_left_back_rgb_led");
leds.add("bar3_right_back_rgb_led");
effects.add("None");
effects.add("Breathe");
effects.add("Blink");
- action: reset_all_page_leds
then:
- lambda: |-
for(auto &kv : id(internal_page_leds_r)) std::fill(kv.second.begin(), kv.second.end(), 0.0);
for(auto &kv : id(internal_page_leds_g)) std::fill(kv.second.begin(), kv.second.end(), 0.0);
for(auto &kv : id(internal_page_leds_b)) std::fill(kv.second.begin(), kv.second.end(), 0.0);
for(auto &kv : id(internal_page_leds_brightness)) std::fill(kv.second.begin(), kv.second.end(), 0.0);
for(auto &kv : id(internal_page_leds_effect)) std::fill(kv.second.begin(), kv.second.end(), std::string());
- script.execute: update_all_page_leds
color:
- id: white
hex: FFFFFF
- id: black
hex: '000000'
- id: grey
hex: A6A6A6
font:
- file:
url: https://github.com/web-fonts/ttf/raw/refs/heads/master/bpg-ingiri-arial-webfont.ttf
type: web
id: font_arial20
size: 20
bpp: 4
globals:
- id: nr_of_pages
type: int
initial_value: '4'
- id: page_names
type: std::vector<std::string>
initial_value: '{"Start", "Music", "Lights", "Security"}'
- id: active_page_nr
type: int
initial_value: '0'
- id: active_page_name
type: std::string
initial_value: ''
- id: internal_notify
type: std::string
initial_value: ''
- id: internal_toast
type: std::string
initial_value: ''
- id: show_web_image
type: bool
initial_value: '''false'''
- id: show_ha_image
type: bool
initial_value: '''false'''
- id: internal_page_leds_r
type: std::unordered_map<std::string, std::vector<float>>
initial_value: '{{"bar1_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar1_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar1_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar1_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar2_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar2_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar2_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar2_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar3_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar3_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar3_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar3_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}}'
- id: internal_page_leds_g
type: std::unordered_map<std::string, std::vector<float>>
initial_value: '{{"bar1_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar1_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar1_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar1_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar2_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar2_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar2_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar2_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar3_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar3_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar3_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar3_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}}'
- id: internal_page_leds_b
type: std::unordered_map<std::string, std::vector<float>>
initial_value: '{{"bar1_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar1_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar1_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar1_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar2_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar2_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar2_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar2_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar3_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar3_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar3_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar3_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}}'
- id: internal_page_leds_brightness
type: std::unordered_map<std::string, std::vector<float>>
initial_value: '{{"bar1_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar1_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar1_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar1_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar2_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar2_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar2_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar2_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar3_left_front_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar3_right_front_rgb_led",
{0.0, 0.0, 0.0, 0.0}}, {"bar3_left_back_rgb_led", {0.0, 0.0, 0.0, 0.0}}, {"bar3_right_back_rgb_led",
{0.0, 0.0, 0.0, 0.0}}}'
- id: internal_page_leds_effect
type: std::unordered_map<std::string, std::vector<std::string>>
initial_value: '{{"bar1_left_front_rgb_led", {"", "", "", ""}}, {"bar1_right_front_rgb_led",
{"", "", "", ""}}, {"bar1_left_back_rgb_led", {"", "", "", ""}}, {"bar1_right_back_rgb_led",
{"", "", "", ""}}, {"bar2_left_front_rgb_led", {"", "", "", ""}}, {"bar2_right_front_rgb_led",
{"", "", "", ""}}, {"bar2_left_back_rgb_led", {"", "", "", ""}}, {"bar2_right_back_rgb_led",
{"", "", "", ""}}, {"bar3_left_front_rgb_led", {"", "", "", ""}}, {"bar3_right_front_rgb_led",
{"", "", "", ""}}, {"bar3_left_back_rgb_led", {"", "", "", ""}}, {"bar3_right_back_rgb_led",
{"", "", "", ""}}}'
sensor:
- platform: template
name: Active Page Number
icon: mdi:order-numeric-ascending
id: active_page_nr_ha
update_interval: never
accuracy_decimals: 0
- platform: sts3x
address: 74
id: buttonplus_temperature
i2c_id: sensors
name: Temperature
update_interval: 10s
unit_of_measurement: "\xB0C"
icon: mdi:thermometer
device_class: temperature
state_class: measurement
accuracy_decimals: 1
- platform: ltr_als_ps
address: 41
i2c_id: sensors
update_interval: 10s
type: ALS
auto_mode: false
gain: 96x
ambient_light:
name: Ambient Light
id: buttonplus_ambientlight
unit_of_measurement: lx
icon: mdi:brightness-6
device_class: illuminance
state_class: measurement
accuracy_decimals: 1
text_sensor:
- platform: template
name: Active Page Name
icon: mdi:order-alphabetical-ascending
id: active_page_name_ha
update_interval: never
number:
- platform: template
name: Page Selector
id: pageselector
optimistic: true
min_value: 0
max_value: 3
step: 1
on_value:
then:
- lambda: |-
if(id(pageselector).state >= id(nr_of_pages)) {
id(active_page_nr) = id(nr_of_pages)-1;
} else {
id(active_page_nr) = id(pageselector).state;
}
- script.execute: set_page
script:
- id: next_page
then:
- if:
condition:
- lambda: !lambda "return id(internal_notify).size() > 0;"
then:
- globals.set:
id: internal_notify
value: !lambda "return std::string();"
- script.execute: display_script_update
- script.stop: next_page
- lambda: |-
id(active_page_nr) = id(active_page_nr) + 1;
if(id(active_page_nr) >= id(nr_of_pages)) {
id(active_page_nr) = 0;
}
- script.execute: update_page
- id: prev_page
then:
- if:
condition:
- lambda: !lambda "return id(internal_notify).size() > 0;"
then:
- globals.set:
id: internal_notify
value: !lambda "return std::string();"
- script.execute: display_script_update
- script.stop: next_page
- lambda: |-
id(active_page_nr) = id(active_page_nr) - 1;
if(id(active_page_nr) < 0) {
id(active_page_nr) = id(nr_of_pages) - 1;
}
- script.execute: update_page
- id: set_page
then:
- lambda: id(active_page_name) = id(page_names)[id(active_page_nr)];
- sensor.template.publish:
id: active_page_nr_ha
state: !lambda "return id(active_page_nr);"
- text_sensor.template.publish:
id: active_page_name_ha
state: !lambda "return id(active_page_name);"
- script.execute: update_all
- script.execute: update_all_page_leds
- id: update_page
then:
- number.set:
id: pageselector
value: !lambda "return id(active_page_nr);"
- script.execute: set_page
- id: test_all_leds
then:
- delay: 1000ms
- light.turn_on:
id: internal_all_rgb
red: 100%
green: 0%
blue: 0%
flash_length: 100ms
- delay: 200ms
- light.turn_on:
id: internal_all_rgb
red: 0%
green: 100%
blue: 0%
flash_length: 100ms
- delay: 200ms
- light.turn_on:
id: internal_all_rgb
red: 0%
green: 0%
blue: 100%
flash_length: 100ms
- id: update_all
mode: restart
then:
- script.execute: bars_script_update
- delay: 0.1s
- script.execute: display_script_update
- id: display_script_update
then:
- component.update: display_disp
- id: display_script_draw
then:
- lambda: |-
id(display_disp).image(0, 235, id(icon_prev_page), ImageAlign::BOTTOM_LEFT, id(grey));
id(display_disp).image(320, 235, id(icon_next_page), ImageAlign::BOTTOM_RIGHT, id(grey));
id(display_disp).print(160, 235, id(font_arial20), id(white), TextAlign::BOTTOM_CENTER, id(active_page_name).c_str());
- script.execute: display_script_draw_user
- lambda: |-
if(id(internal_notify).size() > 0){
// Draw white box over existing text
id(display_disp).filled_rectangle(0, 200, 320, 40, white);
id(display_disp).rectangle(0, 200, 320, 40, accent);
// Show notification message
id(display_disp).print(160, 235, id(font_arial20), id(black), TextAlign::BOTTOM_CENTER, id(internal_notify).c_str());
}
- lambda: |-
if(id(internal_toast).size() > 0){
// Draw white box over existing text
id(display_disp).filled_rectangle(0, 200, 320, 40, white);
// Show toast message
id(display_disp).print(160, 235, id(font_arial20), id(black), TextAlign::BOTTOM_CENTER, id(internal_toast).c_str());
}
- lambda: |-
if(id(show_web_image)){
// Draw web Image
id(display_disp).image(0, 0, id(web_image));
}
- lambda: |-
if(id(show_ha_image)){
// Draw ha Image
id(display_disp).image(0, 0, id(ha_image));
}
- id: bar1_left_script_update
then:
- lambda: |-
id(bar1_left_cs_pin).turn_on();
id(bar1_right_cs_pin).turn_off();
id(bar2_left_cs_pin).turn_off();
id(bar2_right_cs_pin).turn_off();
id(bar3_left_cs_pin).turn_off();
id(bar3_right_cs_pin).turn_off();
id(bar_display).clear();
id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_270_DEGREES);
id(bar1_left_script_draw).execute();
id(bar_display).update();
delay(1);
id(bar1_left_cs_pin).turn_off();
- id: bar1_right_script_update
then:
- lambda: |-
id(bar1_left_cs_pin).turn_off();
id(bar1_right_cs_pin).turn_on();
id(bar2_left_cs_pin).turn_off();
id(bar2_right_cs_pin).turn_off();
id(bar3_left_cs_pin).turn_off();
id(bar3_right_cs_pin).turn_off();
id(bar_display).clear();
id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_90_DEGREES);
id(bar1_right_script_draw).execute();
id(bar_display).update();
delay(1);
id(bar1_right_cs_pin).turn_off();
- id: bar2_left_script_update
then:
- lambda: |-
id(bar1_left_cs_pin).turn_off();
id(bar1_right_cs_pin).turn_off();
id(bar2_left_cs_pin).turn_on();
id(bar2_right_cs_pin).turn_off();
id(bar3_left_cs_pin).turn_off();
id(bar3_right_cs_pin).turn_off();
id(bar_display).clear();
id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_270_DEGREES);
id(bar2_left_script_draw).execute();
id(bar_display).update();
delay(1);
id(bar2_left_cs_pin).turn_off();
- id: bar2_right_script_update
then:
- lambda: |-
id(bar1_left_cs_pin).turn_off();
id(bar1_right_cs_pin).turn_off();
id(bar2_left_cs_pin).turn_off();
id(bar2_right_cs_pin).turn_on();
id(bar3_left_cs_pin).turn_off();
id(bar3_right_cs_pin).turn_off();
id(bar_display).clear();
id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_90_DEGREES);
id(bar2_right_script_draw).execute();
id(bar_display).update();
delay(1);
id(bar2_right_cs_pin).turn_off();
- id: bar3_left_script_update
then:
- lambda: |-
id(bar1_left_cs_pin).turn_off();
id(bar1_right_cs_pin).turn_off();
id(bar2_left_cs_pin).turn_off();
id(bar2_right_cs_pin).turn_off();
id(bar3_left_cs_pin).turn_on();
id(bar3_right_cs_pin).turn_off();
id(bar_display).clear();
id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_270_DEGREES);
id(bar3_left_script_draw).execute();
id(bar_display).update();
delay(1);
id(bar3_left_cs_pin).turn_off();
- id: bar3_right_script_update
then:
- lambda: |-
id(bar1_left_cs_pin).turn_off();
id(bar1_right_cs_pin).turn_off();
id(bar2_left_cs_pin).turn_off();
id(bar2_right_cs_pin).turn_off();
id(bar3_left_cs_pin).turn_off();
id(bar3_right_cs_pin).turn_on();
id(bar_display).clear();
id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_90_DEGREES);
id(bar3_right_script_draw).execute();
id(bar_display).update();
delay(1);
id(bar3_right_cs_pin).turn_off();
- id: setup_bar_displays
then:
- lambda: |-
id(bar1_left_cs_pin).turn_on();
id(bar_display).setup();
delay(5);
id(bar1_left_cs_pin).turn_off();
id(bar1_right_cs_pin).turn_on();
id(bar_display).setup();
delay(5);
id(bar1_right_cs_pin).turn_off();
id(bar2_left_cs_pin).turn_on();
id(bar_display).setup();
delay(5);
id(bar2_left_cs_pin).turn_off();
id(bar2_right_cs_pin).turn_on();
id(bar_display).setup();
delay(5);
id(bar2_right_cs_pin).turn_off();
id(bar3_left_cs_pin).turn_on();
id(bar_display).setup();
delay(5);
id(bar3_left_cs_pin).turn_off();
id(bar3_right_cs_pin).turn_on();
id(bar_display).setup();
delay(5);
id(bar3_right_cs_pin).turn_off();
- id: bars_script_update
then:
- script.execute: bar1_left_script_update
- delay: 0.1s
- script.execute: bar1_right_script_update
- delay: 0.1s
- script.execute: bar2_left_script_update
- delay: 0.1s
- script.execute: bar2_right_script_update
- delay: 0.1s
- script.execute: bar3_left_script_update
- delay: 0.1s
- script.execute: bar3_right_script_update
- id: event_trigger_feedback
parameters:
event_id: esphome::template_::TemplateEvent*
event_msg: std::string
led_id: light::LightState*
r: float
g: float
b: float
then:
- lambda: |-
event_id->trigger(event_msg);
if(led_id != nullptr){
auto call = led_id->make_call();
call.set_state(true);
call.set_rgb(r, g, b);
call.set_brightness(1.0);
call.set_flash_length(200); // Returns to previous state automatically
call.perform();
}
- id: update_all_page_leds
then:
- lambda: |-
id(update_single_led).execute("bar1_left_front_rgb_led", id(bar1_left_front_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar1_right_front_rgb_led", id(bar1_right_front_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar1_left_back_rgb_led", id(bar1_left_back_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar1_right_back_rgb_led", id(bar1_right_back_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar2_left_front_rgb_led", id(bar2_left_front_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar2_right_front_rgb_led", id(bar2_right_front_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar2_left_back_rgb_led", id(bar2_left_back_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar2_right_back_rgb_led", id(bar2_right_back_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar3_left_front_rgb_led", id(bar3_left_front_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar3_right_front_rgb_led", id(bar3_right_front_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar3_left_back_rgb_led", id(bar3_left_back_rgb_led), id(active_page_nr));
id(update_single_led).execute("bar3_right_back_rgb_led", id(bar3_right_back_rgb_led), id(active_page_nr));
- id: update_single_led
parameters:
led_name: string
led_id: light::LightState*
page: int
then:
- lambda: |-
if(led_id != nullptr){
float r = id(internal_page_leds_r)[led_name][page];
float g = id(internal_page_leds_g)[led_name][page];
float b = id(internal_page_leds_b)[led_name][page];
float br = id(internal_page_leds_brightness)[led_name][page];
std::string effect = id(internal_page_leds_effect)[led_name][page];
if(r > 1.5) r = r / 255.0;
if(g > 1.5) g = g / 255.0;
if(b > 1.5) b = b / 255.0;
if(br > 1.5) br = br / 255.0;
auto call = led_id->make_call();
call.set_transition_length(10);
if(br <= 0.0001) {
call.set_state(false);
} else {
call.set_state(true);
call.set_rgb(r,g,b);
call.set_brightness(br);
call.set_effect(effect);
}
call.perform();
}
image:
- file: mdi:chevron-right
id: icon_next_page
resize: 30x30
type: BINARY
- file: mdi:chevron-left
id: icon_prev_page
resize: 30x30
type: BINARY
time:
- platform: homeassistant
id: datetime
i2c:
- id: buttons
sda: GPIO1
scl: GPIO2
frequency: 50khz
- id: sensors
sda: GPIO47
scl: GPIO48
frequency: 50khz
spi:
clk_pin: GPIO6
mosi_pin: GPIO5
light:
- platform: esp32_rmt_led_strip
id: neopixels
rgb_order: RGB
chipset: ws2812
pin: GPIO4
num_leds: 13
internal: true
- platform: partition
id: internal_all_rgb
internal: true
segments:
- id: neopixels
from: 0
to: 12
- platform: monochromatic
output: display_backlight_pwm
gamma_correct: 2.2
name: Main Display Backlight
id: display_backlight
restore_mode: ALWAYS_ON
- platform: partition
id: internal_notification_rgb
internal: true
segments:
- id: neopixels
from: 1
to: 1
- id: neopixels
from: 3
to: 3
- platform: monochromatic
output: bars_backlight_pwm
gamma_correct: 2.2
name: Bars Display Backlight
id: bars_backlight
restore_mode: ALWAYS_ON
- platform: partition
name: BAR 1 Left RGB Front
id: bar1_left_front_rgb_led
segments:
- id: neopixels
from: 0
to: 0
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 1 Left RGB Back
id: bar1_left_back_rgb_led
segments:
- id: neopixels
from: 1
to: 1
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 1 Right RGB Front
id: bar1_right_front_rgb_led
segments:
- id: neopixels
from: 2
to: 2
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 1 Right RGB Back
id: bar1_right_back_rgb_led
segments:
- id: neopixels
from: 3
to: 3
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 2 Left RGB Front
id: bar2_left_front_rgb_led
segments:
- id: neopixels
from: 4
to: 4
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 2 Left RGB Back
id: bar2_left_back_rgb_led
segments:
- id: neopixels
from: 5
to: 5
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 2 Right RGB Front
id: bar2_right_front_rgb_led
segments:
- id: neopixels
from: 6
to: 6
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 2 Right RGB Back
id: bar2_right_back_rgb_led
segments:
- id: neopixels
from: 7
to: 7
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 3 Left RGB Front
id: bar3_left_front_rgb_led
segments:
- id: neopixels
from: 8
to: 8
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 3 Left RGB Back
id: bar3_left_back_rgb_led
segments:
- id: neopixels
from: 9
to: 9
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 3 Right RGB Front
id: bar3_right_front_rgb_led
segments:
- id: neopixels
from: 10
to: 10
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
- platform: partition
name: BAR 3 Right RGB Back
id: bar3_right_back_rgb_led
segments:
- id: neopixels
from: 11
to: 11
effects:
- pulse:
name: Breathe
transition_length: 1s
update_interval: 1.5s
min_brightness: 20%
max_brightness: 100%
- pulse:
name: Blink
transition_length: 50ms
update_interval: 500ms
output:
- platform: ledc
pin: GPIO3
id: display_backlight_pwm
inverted: true
max_power: 1
frequency: 500Hz
- platform: ledc
pin: GPIO46
id: bars_backlight_pwm
inverted: true
max_power: 0.6
frequency: 500Hz
- platform: gpio
id: bar1_left_cs_pin
pin:
mcp23xxx: base_J1
number: 5
mode:
output: true
inverted: true
- platform: gpio
id: bar1_right_cs_pin
pin:
mcp23xxx: base_J1
number: 1
mode:
output: true
inverted: true
- platform: gpio
id: bar2_left_cs_pin
pin:
mcp23xxx: base_J2
number: 5
mode:
output: true
inverted: true
- platform: gpio
id: bar2_right_cs_pin
pin:
mcp23xxx: base_J2
number: 1
mode:
output: true
inverted: true
- platform: gpio
id: bar3_left_cs_pin
pin:
mcp23xxx: base_J3
number: 5
mode:
output: true
inverted: true
- platform: gpio
id: bar3_right_cs_pin
pin:
mcp23xxx: base_J3
number: 1
mode:
output: true
inverted: true
display:
- id: display_disp
platform: ili9xxx
model: ili9341
invert_colors: false
color_order: rgb
update_interval: 30s
dc_pin:
number: GPIO7
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
lambda: id(display_script_draw).execute();
- id: bar_display
platform: ili9xxx
model: ST7735
color_order: bgr
update_interval: never
dc_pin:
number: GPIO7
allow_other_uses: true
invert_colors: false
show_test_card: false
auto_clear_enabled: false
dimensions:
height: 160
width: 80
offset_width: 24
mcp23008:
- id: base_J0
i2c_id: buttons
address: '32'
- id: base_J3
i2c_id: buttons
address: 35
- id: base_J2
i2c_id: buttons
address: 34
- id: base_J1
i2c_id: buttons
address: 33
binary_sensor:
- platform: gpio
id: display_left_btn
name: Main Display button Left
internal: true
pin:
mcp23xxx: base_J0
number: 6
mode: INPUT_PULLUP
inverted: true
filters:
- delayed_off: 10ms
on_multi_click:
- timing:
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute: prev_page
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: display_left_btn_event
led_id: !lambda "return nullptr;"
r: 0
g: 0
b: 255
event_msg: !lambda "return \"double_click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: display_left_btn_event
led_id: !lambda "return nullptr;"
r: 255
g: 0
b: 0
event_msg: !lambda "return \"triple_click \" + id(active_page_name);"
- timing:
- ON for at least 1s
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: display_left_btn_event
led_id: !lambda "return nullptr;"
r: 255
g: 0
b: 255
event_msg: !lambda "return \"hold \" + id(active_page_name);"
- platform: gpio
id: display_right_btn
name: Main Display button Right
internal: true
pin:
mcp23xxx: base_J0
number: 2
mode: INPUT_PULLUP
inverted: true
filters:
- delayed_off: 10ms
on_multi_click:
- timing:
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute: next_page
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: display_right_btn_event
led_id: !lambda "return nullptr;"
r: 0
g: 0
b: 255
event_msg: !lambda "return \"double_click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: display_right_btn_event
led_id: !lambda "return nullptr;"
r: 255
g: 0
b: 0
event_msg: !lambda "return \"triple_click \" + id(active_page_name);"
- timing:
- ON for at least 1s
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: display_right_btn_event
led_id: !lambda "return nullptr;"
r: 255
g: 0
b: 255
event_msg: !lambda "return \"hold \" + id(active_page_name);"
- platform: gpio
id: bar1_left_btn
name: BAR 1 button Left
internal: true
pin:
mcp23xxx: base_J1
number: 6
mode: INPUT_PULLUP
inverted: true
filters:
- delayed_off: 10ms
on_multi_click:
- timing:
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar1_left_btn_event
led_id: bar1_left_front_rgb_led
r: 0
g: 255
b: 0
event_msg: !lambda "return \"click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar1_left_btn_event
led_id: bar1_left_front_rgb_led
r: 0
g: 0
b: 255
event_msg: !lambda "return \"double_click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar1_left_btn_event
led_id: bar1_left_front_rgb_led
r: 255
g: 0
b: 0
event_msg: !lambda "return \"triple_click \" + id(active_page_name);"
- timing:
- ON for at least 1s
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar1_left_btn_event
led_id: bar1_left_front_rgb_led
r: 255
g: 0
b: 255
event_msg: !lambda "return \"hold \" + id(active_page_name);"
- platform: gpio
id: bar1_right_btn
name: BAR 1 button Right
internal: true
pin:
mcp23xxx: base_J1
number: 2
mode: INPUT_PULLUP
inverted: true
filters:
- delayed_off: 10ms
on_multi_click:
- timing:
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar1_right_btn_event
led_id: bar1_right_front_rgb_led
r: 0
g: 255
b: 0
event_msg: !lambda "return \"click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar1_right_btn_event
led_id: bar1_right_front_rgb_led
r: 0
g: 0
b: 255
event_msg: !lambda "return \"double_click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar1_right_btn_event
led_id: bar1_right_front_rgb_led
r: 255
g: 0
b: 0
event_msg: !lambda "return \"triple_click \" + id(active_page_name);"
- timing:
- ON for at least 1s
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar1_right_btn_event
led_id: bar1_right_front_rgb_led
r: 255
g: 0
b: 255
event_msg: !lambda "return \"hold \" + id(active_page_name);"
- platform: gpio
id: bar2_left_btn
name: BAR 2 button Left
internal: true
pin:
mcp23xxx: base_J2
number: 6
mode: INPUT_PULLUP
inverted: true
filters:
- delayed_off: 10ms
on_multi_click:
- timing:
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar2_left_btn_event
led_id: bar2_left_front_rgb_led
r: 0
g: 255
b: 0
event_msg: !lambda "return \"click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar2_left_btn_event
led_id: bar2_left_front_rgb_led
r: 0
g: 0
b: 255
event_msg: !lambda "return \"double_click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar2_left_btn_event
led_id: bar2_left_front_rgb_led
r: 255
g: 0
b: 0
event_msg: !lambda "return \"triple_click \" + id(active_page_name);"
- timing:
- ON for at least 1s
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar2_left_btn_event
led_id: bar2_left_front_rgb_led
r: 255
g: 0
b: 255
event_msg: !lambda "return \"hold \" + id(active_page_name);"
- platform: gpio
id: bar2_right_btn
name: BAR 2 button Right
internal: true
pin:
mcp23xxx: base_J2
number: 2
mode: INPUT_PULLUP
inverted: true
filters:
- delayed_off: 10ms
on_multi_click:
- timing:
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar2_right_btn_event
led_id: bar2_right_front_rgb_led
r: 0
g: 255
b: 0
event_msg: !lambda "return \"click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar2_right_btn_event
led_id: bar2_right_front_rgb_led
r: 0
g: 0
b: 255
event_msg: !lambda "return \"double_click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar2_right_btn_event
led_id: bar2_right_front_rgb_led
r: 255
g: 0
b: 0
event_msg: !lambda "return \"triple_click \" + id(active_page_name);"
- timing:
- ON for at least 1s
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar2_right_btn_event
led_id: bar2_right_front_rgb_led
r: 255
g: 0
b: 255
event_msg: !lambda "return \"hold \" + id(active_page_name);"
- platform: gpio
id: bar3_left_btn
name: BAR 3 button Left
internal: true
pin:
mcp23xxx: base_J3
number: 6
mode: INPUT_PULLUP
inverted: true
filters:
- delayed_off: 10ms
on_multi_click:
- timing:
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar3_left_btn_event
led_id: bar3_left_front_rgb_led
r: 0
g: 255
b: 0
event_msg: !lambda "return \"click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar3_left_btn_event
led_id: bar3_left_front_rgb_led
r: 0
g: 0
b: 255
event_msg: !lambda "return \"double_click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar3_left_btn_event
led_id: bar3_left_front_rgb_led
r: 255
g: 0
b: 0
event_msg: !lambda "return \"triple_click \" + id(active_page_name);"
- timing:
- ON for at least 1s
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar3_left_btn_event
led_id: bar3_left_front_rgb_led
r: 255
g: 0
b: 255
event_msg: !lambda "return \"hold \" + id(active_page_name);"
- platform: gpio
id: bar3_right_btn
name: BAR 3 button Right
internal: true
pin:
mcp23xxx: base_J3
number: 2
mode: INPUT_PULLUP
inverted: true
filters:
- delayed_off: 10ms
on_multi_click:
- timing:
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar3_right_btn_event
led_id: bar3_right_front_rgb_led
r: 0
g: 255
b: 0
event_msg: !lambda "return \"click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar3_right_btn_event
led_id: bar3_right_front_rgb_led
r: 0
g: 0
b: 255
event_msg: !lambda "return \"double_click \" + id(active_page_name);"
- timing:
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at most 0.2s
- ON for at most 300ms
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar3_right_btn_event
led_id: bar3_right_front_rgb_led
r: 255
g: 0
b: 0
event_msg: !lambda "return \"triple_click \" + id(active_page_name);"
- timing:
- ON for at least 1s
- OFF for at least 0.2s
then:
- script.execute:
id: event_trigger_feedback
event_id: bar3_right_btn_event
led_id: bar3_right_front_rgb_led
r: 255
g: 0
b: 255
event_msg: !lambda "return \"hold \" + id(active_page_name);"
http_request: {}
online_image:
- id: web_image
url: https://invalid.jpg
type: RGB565
format: JPG
resize: 320x240
update_interval: never
on_download_finished:
then:
- script.execute: display_script_update
request_headers: {}
- id: ha_image
url: https://invalid.jpg
type: RGB565
format: JPG
resize: 320x240
update_interval: never
on_download_finished:
then:
- script.execute: display_script_update
request_headers:
Authorization: Bearer EXAMPLE_TOKEN
substitutions:
button_events:
- click Start
- double_click Start
- triple_click Start
- hold Start
- click Music
- double_click Music
- triple_click Music
- hold Music
- click Lights
- double_click Lights
- triple_click Lights
- hold Lights
- click Security
- double_click Security
- triple_click Security
- hold Security
event:
- platform: template
id: display_left_btn_event
name: DISPLAY Button Left
device_class: button
event_types: ${button_events}
- platform: template
id: display_right_btn_event
name: DISPLAY Button Right
device_class: button
event_types: ${button_events}
- platform: template
id: bar1_left_btn_event
name: BAR 1 Button Left
device_class: button
event_types: ${button_events}
- platform: template
id: bar1_right_btn_event
name: BAR 1 Button Right
device_class: button
event_types: ${button_events}
- platform: template
id: bar2_left_btn_event
name: BAR 2 Button Left
device_class: button
event_types: ${button_events}
- platform: template
id: bar2_right_btn_event
name: BAR 2 Button Right
device_class: button
event_types: ${button_events}
- platform: template
id: bar3_left_btn_event
name: BAR 3 Button Left
device_class: button
event_types: ${button_events}
- platform: template
id: bar3_right_btn_event
name: BAR 3 Button Right
device_class: button
event_types: ${button_events}