From 018555268a360798883ca77fb4ef29a3db9091e3 Mon Sep 17 00:00:00 2001 From: kennyboy55 Date: Mon, 11 May 2026 16:02:48 +0200 Subject: [PATCH] Dynamically generate events file --- .../expected_output/3bar_1display_events.yaml | 358 +++++++ generate/generate_events.py | 162 ++++ package/3bar_1display_events.yaml | 896 +++++++++++------- 3 files changed, 1064 insertions(+), 352 deletions(-) create mode 100644 generate/expected_output/3bar_1display_events.yaml create mode 100644 generate/generate_events.py diff --git a/generate/expected_output/3bar_1display_events.yaml b/generate/expected_output/3bar_1display_events.yaml new file mode 100644 index 0000000..a7fe3f5 --- /dev/null +++ b/generate/expected_output/3bar_1display_events.yaml @@ -0,0 +1,358 @@ +## Dynamically generated on xx-xx-xxxx +## Run python script again to update + +substitutions: + nr_of_pages: 2 + + # Dynamically generated list + display_events: + - "double_click page 0" + - "triple_click page 0" + - "hold page 0" + - "double_click page 1" + - "triple_click page 1" + - "hold page 1" + + # Dynamically generated list + button_events: + - "click page 0" + - "double_click page 0" + - "triple_click page 0" + - "hold page 0" + - "click page 1" + - "double_click page 1" + - "triple_click page 1" + - "hold page 1" + +event: + - platform: template + name: DISPLAY Button Left event + id: display_btn_left_event + device_class: button + event_types: ${display_events} + - platform: template + name: DISPLAY Button Right event + id: display_btn_right_event + device_class: button + event_types: ${display_events} + - platform: template + name: BAR1 Button Left event + id: bar1_btn_left_event + device_class: button + event_types: ${button_events} + - platform: template + name: BAR1 Button Right event + id: bar1_btn_right_event + device_class: button + event_types: ${button_events} + - platform: template + name: BAR2 Button Left event + id: bar2_btn_left_event + device_class: button + event_types: ${button_events} + - platform: template + name: BAR2 Button Right event + id: bar2_btn_right_event + device_class: button + event_types: ${button_events} + - platform: template + name: BAR3 Button Left event + id: bar3_btn_left_event + device_class: button + event_types: ${button_events} + - platform: template + name: BAR3 Button Right event + id: bar3_btn_right_event + device_class: button + event_types: ${button_events} + +binary_sensor: + - id: !extend main_display_btn_left + filters: + - delayed_off: 10ms + internal: true + 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: + lambda: |- + id(display_btn_left_event).trigger("double_click page " + std::to_string(id(actual_page))); + - 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: + lambda: |- + id(display_btn_left_event).trigger("triple_click page " + std::to_string(id(actual_page))); + - timing: + - ON for 1s to 5s + - OFF for at least 0.2s + then: + lambda: |- + id(display_btn_left_event).trigger("hold page " + std::to_string(id(actual_page))); + + - id: !extend main_display_btn_right + filters: + - delayed_off: 10ms + internal: true + 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: + lambda: |- + id(display_btn_right_event).trigger("double_click page " + std::to_string(id(actual_page))); + - 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: + lambda: |- + id(display_btn_right_event).trigger("triple_click page " + std::to_string(id(actual_page))); + - timing: + - ON for 1s to 5s + - OFF for at least 0.2s + then: + lambda: |- + id(display_btn_right_event).trigger("hold page " + std::to_string(id(actual_page))); + + - id: !extend bar1_btn_left + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + lambda: |- + id(bar1_btn_left_event).trigger("click page " + std::to_string(id(actual_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: + lambda: |- + id(bar1_btn_left_event).trigger("double_click page " + std::to_string(id(actual_page))); + - 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: + lambda: |- + id(bar1_btn_left_event).trigger("triple_click page " + std::to_string(id(actual_page))); + - timing: + - ON for 1s to 5s + - OFF for at least 0.2s + then: + lambda: |- + id(bar1_btn_left_event).trigger("hold page " + std::to_string(id(actual_page))); + + + - id: !extend bar1_btn_right + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + lambda: |- + id(bar1_btn_right_event).trigger("click page " + std::to_string(id(actual_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: + lambda: |- + id(bar1_btn_right_event).trigger("double_click page " + std::to_string(id(actual_page))); + - 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: + lambda: |- + id(bar1_btn_right_event).trigger("triple_click page " + std::to_string(id(actual_page))); + - timing: + - ON for 1s to 5s + - OFF for at least 0.2s + then: + lambda: |- + id(bar1_btn_right_event).trigger("hold page " + std::to_string(id(actual_page))); + + + - id: !extend bar2_btn_left + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + lambda: |- + id(bar2_btn_left_event).trigger("click page " + std::to_string(id(actual_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: + lambda: |- + id(bar2_btn_left_event).trigger("double_click page " + std::to_string(id(actual_page))); + - 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: + lambda: |- + id(bar2_btn_left_event).trigger("triple_click page " + std::to_string(id(actual_page))); + - timing: + - ON for 1s to 5s + - OFF for at least 0.2s + then: + lambda: |- + id(bar2_btn_left_event).trigger("hold page " + std::to_string(id(actual_page))); + + - id: !extend bar2_btn_right + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + lambda: |- + id(bar2_btn_right_event).trigger("click page " + std::to_string(id(actual_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: + lambda: |- + id(bar2_btn_right_event).trigger("double_click page " + std::to_string(id(actual_page))); + - 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: + lambda: |- + id(bar2_btn_right_event).trigger("triple_click page " + std::to_string(id(actual_page))); + - timing: + - ON for 1s to 5s + - OFF for at least 0.2s + then: + lambda: |- + id(bar2_btn_right_event).trigger("hold page " + std::to_string(id(actual_page))); + + + - id: !extend bar3_btn_left + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + lambda: |- + id(bar3_btn_left_event).trigger("click page " + std::to_string(id(actual_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: + lambda: |- + id(bar3_btn_left_event).trigger("double_click page " + std::to_string(id(actual_page))); + - 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: + lambda: |- + id(bar3_btn_left_event).trigger("triple_click page " + std::to_string(id(actual_page))); + - timing: + - ON for 1s to 5s + - OFF for at least 0.2s + then: + lambda: |- + id(bar3_btn_left_event).trigger("hold page " + std::to_string(id(actual_page))); + + + - id: !extend bar3_btn_right + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + lambda: |- + id(bar3_btn_right_event).trigger("click page " + std::to_string(id(actual_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: + lambda: |- + id(bar3_btn_right_event).trigger("double_click page " + std::to_string(id(actual_page))); + - 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: + lambda: |- + id(bar3_btn_right_event).trigger("triple_click page " + std::to_string(id(actual_page))); + - timing: + - ON for 1s to 5s + - OFF for at least 0.2s + then: + lambda: |- + id(bar3_btn_right_event).trigger("hold page " + std::to_string(id(actual_page))); diff --git a/generate/generate_events.py b/generate/generate_events.py new file mode 100644 index 0000000..460d174 --- /dev/null +++ b/generate/generate_events.py @@ -0,0 +1,162 @@ +import yaml + +# CONFIGURATION +NR_OF_PAGES = 3 +INCLUDE_DISPLAY_EXTRA = True # Enable Double, Triple, Hold for main display buttons +LED_CONFIRMATION = True # Flash LED on press +FILENAME = "3bar_1display_events.yaml" + +# --- ESPHome YAML Handling Fixes --- +class ESPHomeExtend: + def __init__(self, value): self.value = value + +class ESPHomeLambda: + def __init__(self, value): self.value = value + +class LiteralString(str): pass + +def represent_extend(dumper, data): + return dumper.represent_scalar('!extend', data.value) + +def represent_lambda(dumper, data): + # Ensures !lambda is followed by a quoted string or block for ESPHome compatibility + return dumper.represent_scalar('!lambda', data.value, style='"') + +def represent_literal(dumper, data): + return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|') + +yaml.add_representer(ESPHomeExtend, represent_extend) +yaml.add_representer(ESPHomeLambda, represent_lambda) +yaml.add_representer(LiteralString, represent_literal) +# ----------------------------------- + +def generate(): + # 1. Define event lists for substitutions + base_types = ["click", "double_click", "triple_click", "hold"] + display_types = [] + (base_types[1:] if INCLUDE_DISPLAY_EXTRA else []) + + display_events = [] + button_events = [] + for p in range(NR_OF_PAGES): + display_events.extend([f"{t} page {p}" for t in display_types]) + button_events.extend([f"{t} page {p}" for t in base_types]) + + data = { + "substitutions": { + "nr_of_pages": str(NR_OF_PAGES), + "display_events": display_events, + "button_events": button_events + }, + "script": [{ + "id": "trigger_with_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": { + "condition": {"lambda": "return led_id != nullptr;"}, + "then": [{"lambda": LiteralString( + "auto call = led_id->make_call();\n" + "call.set_state(true);\n" + "call.set_rgb(r, g, b);\n" + "call.set_brightness(1.0);\n" + "call.set_flash_length(200); // Returns to previous state automatically\n" + "call.perform();" + )}] + }} + ] + }], + "event": [] + } + + # 2. Event Entities + buttons = [ + ("DISPLAY Button Left", "display_btn_left_event", "${display_events}"), + ("DISPLAY Button Right", "display_btn_right_event", "${display_events}"), + ("BAR1 Button Left", "bar1_btn_left_event", "${button_events}"), + ("BAR1 Button Right", "bar1_btn_right_event", "${button_events}"), + ("BAR2 Button Left", "bar2_btn_left_event", "${button_events}"), + ("BAR2 Button Right", "bar2_btn_right_event", "${button_events}"), + ("BAR3 Button Left", "bar3_btn_left_event", "${button_events}"), + ("BAR3 Button Right", "bar3_btn_right_event", "${button_events}"), + ] + for name, eid, types in buttons: + data["event"].append({ + "platform": "template", "name": name, "id": eid, + "device_class": "button", "event_types": types + }) + + # 3. Binary Sensor Extensions + data["binary_sensor"] = [] + triggers = { + "click": (0.0, 1.0, 0.0), # Green + "double_click": (0.0, 0.0, 1.0), # Blue + "triple_click": (1.0, 0.0, 1.0), # Purple + "hold": (1.0, 0.5, 0.0) # Orange + } + + btn_configs = [ + ("main_display_btn_left", "display_btn_left_event", None, "prev_page"), + ("main_display_btn_right", "display_btn_right_event", None, "next_page"), + ("bar1_btn_left", "bar1_btn_left_event", "bar1_left_rgb_front", None), + ("bar1_btn_right", "bar1_btn_right_event", "bar1_right_rgb_front", None), + ("bar2_btn_left", "bar2_btn_left_event", "bar2_left_rgb_front", None), + ("bar2_btn_right", "bar2_btn_right_event", "bar2_right_rgb_front", None), + ("bar3_btn_left", "bar3_btn_left_event", "bar3_left_rgb_front", None), + ("bar3_btn_right", "bar3_btn_right_event", "bar3_right_rgb_front", None), + ] + + for btn_id, event_id, led_id, page_script in btn_configs: + sensor = { + "id": ESPHomeExtend(btn_id), + "filters": [{"delayed_off": "10ms"}], + "internal": True, + "on_multi_click": [] + } + + is_display = "main_display" in btn_id + for t_name, color in triggers.items(): + if is_display and t_name != "click" and not INCLUDE_DISPLAY_EXTRA: + continue + + multi_click = {"timing": []} + if t_name == "click": + multi_click["timing"] = ["ON for at most 300ms", "OFF for at least 0.2s"] + elif t_name == "double_click": + multi_click["timing"] = ["ON for at most 300ms", "OFF for at most 0.2s", "ON for at most 300ms", "OFF for at least 0.2s"] + elif t_name == "triple_click": + multi_click["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"] + elif t_name == "hold": + multi_click["timing"] = ["ON for at least 1s", "OFF for at least 0.2s"] + + actions = [] + if t_name == "click" and page_script: + actions.append({"script.execute": page_script}) + else: + # The Feedback call with proper ESPHome formatting + actions.append({ + "script.execute": { + "id": "trigger_with_feedback", + "event_id": event_id, + "event_msg": ESPHomeLambda(f'return "{t_name} page " + std::to_string(id(actual_page));'), + "led_id": led_id if (led_id and LED_CONFIRMATION) else ESPHomeLambda("return nullptr;"), + "r": color[0], "g": color[1], "b": color[2] + } + }) + multi_click["then"] = actions + sensor["on_multi_click"].append(multi_click) + data["binary_sensor"].append(sensor) + + # 4. Write output + with open(FILENAME, "w") as f: + f.write("## Dynamically generated event configuration\n") + f.write("## Do not edit manually - run generator script to update\n\n") + yaml.dump(data, f, sort_keys=False, default_flow_style=False) + print(f"Generated {FILENAME} successfully.") + +if __name__ == "__main__": + generate() \ No newline at end of file diff --git a/package/3bar_1display_events.yaml b/package/3bar_1display_events.yaml index a7fe3f5..6456b06 100644 --- a/package/3bar_1display_events.yaml +++ b/package/3bar_1display_events.yaml @@ -1,358 +1,550 @@ -## Dynamically generated on xx-xx-xxxx -## Run python script again to update +## Dynamically generated event configuration +## Do not edit manually - run generator script to update substitutions: - nr_of_pages: 2 - - # Dynamically generated list + nr_of_pages: '3' display_events: - - "double_click page 0" - - "triple_click page 0" - - "hold page 0" - - "double_click page 1" - - "triple_click page 1" - - "hold page 1" - - # Dynamically generated list + - double_click page 0 + - triple_click page 0 + - hold page 0 + - double_click page 1 + - triple_click page 1 + - hold page 1 + - double_click page 2 + - triple_click page 2 + - hold page 2 button_events: - - "click page 0" - - "double_click page 0" - - "triple_click page 0" - - "hold page 0" - - "click page 1" - - "double_click page 1" - - "triple_click page 1" - - "hold page 1" - + - click page 0 + - double_click page 0 + - triple_click page 0 + - hold page 0 + - click page 1 + - double_click page 1 + - triple_click page 1 + - hold page 1 + - click page 2 + - double_click page 2 + - triple_click page 2 + - hold page 2 +script: +- id: trigger_with_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: + condition: + lambda: return led_id != nullptr; + then: + - lambda: |- + 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(); event: - - platform: template - name: DISPLAY Button Left event - id: display_btn_left_event - device_class: button - event_types: ${display_events} - - platform: template - name: DISPLAY Button Right event - id: display_btn_right_event - device_class: button - event_types: ${display_events} - - platform: template - name: BAR1 Button Left event - id: bar1_btn_left_event - device_class: button - event_types: ${button_events} - - platform: template - name: BAR1 Button Right event - id: bar1_btn_right_event - device_class: button - event_types: ${button_events} - - platform: template - name: BAR2 Button Left event - id: bar2_btn_left_event - device_class: button - event_types: ${button_events} - - platform: template - name: BAR2 Button Right event - id: bar2_btn_right_event - device_class: button - event_types: ${button_events} - - platform: template - name: BAR3 Button Left event - id: bar3_btn_left_event - device_class: button - event_types: ${button_events} - - platform: template - name: BAR3 Button Right event - id: bar3_btn_right_event - device_class: button - event_types: ${button_events} - +- platform: template + name: DISPLAY Button Left + id: display_btn_left_event + device_class: button + event_types: ${display_events} +- platform: template + name: DISPLAY Button Right + id: display_btn_right_event + device_class: button + event_types: ${display_events} +- platform: template + name: BAR1 Button Left + id: bar1_btn_left_event + device_class: button + event_types: ${button_events} +- platform: template + name: BAR1 Button Right + id: bar1_btn_right_event + device_class: button + event_types: ${button_events} +- platform: template + name: BAR2 Button Left + id: bar2_btn_left_event + device_class: button + event_types: ${button_events} +- platform: template + name: BAR2 Button Right + id: bar2_btn_right_event + device_class: button + event_types: ${button_events} +- platform: template + name: BAR3 Button Left + id: bar3_btn_left_event + device_class: button + event_types: ${button_events} +- platform: template + name: BAR3 Button Right + id: bar3_btn_right_event + device_class: button + event_types: ${button_events} binary_sensor: - - id: !extend main_display_btn_left - filters: - - delayed_off: 10ms - internal: true - 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: - lambda: |- - id(display_btn_left_event).trigger("double_click page " + std::to_string(id(actual_page))); - - 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: - lambda: |- - id(display_btn_left_event).trigger("triple_click page " + std::to_string(id(actual_page))); - - timing: - - ON for 1s to 5s - - OFF for at least 0.2s - then: - lambda: |- - id(display_btn_left_event).trigger("hold page " + std::to_string(id(actual_page))); - - - id: !extend main_display_btn_right - filters: - - delayed_off: 10ms - internal: true - 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: - lambda: |- - id(display_btn_right_event).trigger("double_click page " + std::to_string(id(actual_page))); - - 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: - lambda: |- - id(display_btn_right_event).trigger("triple_click page " + std::to_string(id(actual_page))); - - timing: - - ON for 1s to 5s - - OFF for at least 0.2s - then: - lambda: |- - id(display_btn_right_event).trigger("hold page " + std::to_string(id(actual_page))); - - - id: !extend bar1_btn_left - filters: - - delayed_off: 10ms - internal: true - on_multi_click: - - timing: - - ON for at most 300ms - - OFF for at least 0.2s - then: - lambda: |- - id(bar1_btn_left_event).trigger("click page " + std::to_string(id(actual_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: - lambda: |- - id(bar1_btn_left_event).trigger("double_click page " + std::to_string(id(actual_page))); - - 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: - lambda: |- - id(bar1_btn_left_event).trigger("triple_click page " + std::to_string(id(actual_page))); - - timing: - - ON for 1s to 5s - - OFF for at least 0.2s - then: - lambda: |- - id(bar1_btn_left_event).trigger("hold page " + std::to_string(id(actual_page))); - - - - id: !extend bar1_btn_right - filters: - - delayed_off: 10ms - internal: true - on_multi_click: - - timing: - - ON for at most 300ms - - OFF for at least 0.2s - then: - lambda: |- - id(bar1_btn_right_event).trigger("click page " + std::to_string(id(actual_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: - lambda: |- - id(bar1_btn_right_event).trigger("double_click page " + std::to_string(id(actual_page))); - - 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: - lambda: |- - id(bar1_btn_right_event).trigger("triple_click page " + std::to_string(id(actual_page))); - - timing: - - ON for 1s to 5s - - OFF for at least 0.2s - then: - lambda: |- - id(bar1_btn_right_event).trigger("hold page " + std::to_string(id(actual_page))); - - - - id: !extend bar2_btn_left - filters: - - delayed_off: 10ms - internal: true - on_multi_click: - - timing: - - ON for at most 300ms - - OFF for at least 0.2s - then: - lambda: |- - id(bar2_btn_left_event).trigger("click page " + std::to_string(id(actual_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: - lambda: |- - id(bar2_btn_left_event).trigger("double_click page " + std::to_string(id(actual_page))); - - 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: - lambda: |- - id(bar2_btn_left_event).trigger("triple_click page " + std::to_string(id(actual_page))); - - timing: - - ON for 1s to 5s - - OFF for at least 0.2s - then: - lambda: |- - id(bar2_btn_left_event).trigger("hold page " + std::to_string(id(actual_page))); - - - id: !extend bar2_btn_right - filters: - - delayed_off: 10ms - internal: true - on_multi_click: - - timing: - - ON for at most 300ms - - OFF for at least 0.2s - then: - lambda: |- - id(bar2_btn_right_event).trigger("click page " + std::to_string(id(actual_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: - lambda: |- - id(bar2_btn_right_event).trigger("double_click page " + std::to_string(id(actual_page))); - - 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: - lambda: |- - id(bar2_btn_right_event).trigger("triple_click page " + std::to_string(id(actual_page))); - - timing: - - ON for 1s to 5s - - OFF for at least 0.2s - then: - lambda: |- - id(bar2_btn_right_event).trigger("hold page " + std::to_string(id(actual_page))); - - - - id: !extend bar3_btn_left - filters: - - delayed_off: 10ms - internal: true - on_multi_click: - - timing: - - ON for at most 300ms - - OFF for at least 0.2s - then: - lambda: |- - id(bar3_btn_left_event).trigger("click page " + std::to_string(id(actual_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: - lambda: |- - id(bar3_btn_left_event).trigger("double_click page " + std::to_string(id(actual_page))); - - 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: - lambda: |- - id(bar3_btn_left_event).trigger("triple_click page " + std::to_string(id(actual_page))); - - timing: - - ON for 1s to 5s - - OFF for at least 0.2s - then: - lambda: |- - id(bar3_btn_left_event).trigger("hold page " + std::to_string(id(actual_page))); - - - - id: !extend bar3_btn_right - filters: - - delayed_off: 10ms - internal: true - on_multi_click: - - timing: - - ON for at most 300ms - - OFF for at least 0.2s - then: - lambda: |- - id(bar3_btn_right_event).trigger("click page " + std::to_string(id(actual_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: - lambda: |- - id(bar3_btn_right_event).trigger("double_click page " + std::to_string(id(actual_page))); - - 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: - lambda: |- - id(bar3_btn_right_event).trigger("triple_click page " + std::to_string(id(actual_page))); - - timing: - - ON for 1s to 5s - - OFF for at least 0.2s - then: - lambda: |- - id(bar3_btn_right_event).trigger("hold page " + std::to_string(id(actual_page))); +- id: !extend 'main_display_btn_left' + filters: + - delayed_off: 10ms + internal: true + 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: trigger_with_feedback + event_id: display_btn_left_event + event_msg: !lambda "return \"double_click page \" + std::to_string(id(actual_page));" + led_id: !lambda "return nullptr;" + r: 0.0 + g: 0.0 + b: 1.0 + - 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: trigger_with_feedback + event_id: display_btn_left_event + event_msg: !lambda "return \"triple_click page \" + std::to_string(id(actual_page));" + led_id: !lambda "return nullptr;" + r: 1.0 + g: 0.0 + b: 1.0 + - timing: + - ON for at least 1s + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: display_btn_left_event + event_msg: !lambda "return \"hold page \" + std::to_string(id(actual_page));" + led_id: !lambda "return nullptr;" + r: 1.0 + g: 0.5 + b: 0.0 +- id: !extend 'main_display_btn_right' + filters: + - delayed_off: 10ms + internal: true + 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: trigger_with_feedback + event_id: display_btn_right_event + event_msg: !lambda "return \"double_click page \" + std::to_string(id(actual_page));" + led_id: !lambda "return nullptr;" + r: 0.0 + g: 0.0 + b: 1.0 + - 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: trigger_with_feedback + event_id: display_btn_right_event + event_msg: !lambda "return \"triple_click page \" + std::to_string(id(actual_page));" + led_id: !lambda "return nullptr;" + r: 1.0 + g: 0.0 + b: 1.0 + - timing: + - ON for at least 1s + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: display_btn_right_event + event_msg: !lambda "return \"hold page \" + std::to_string(id(actual_page));" + led_id: !lambda "return nullptr;" + r: 1.0 + g: 0.5 + b: 0.0 +- id: !extend 'bar1_btn_left' + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar1_btn_left_event + event_msg: !lambda "return \"click page \" + std::to_string(id(actual_page));" + led_id: bar1_left_rgb_front + r: 0.0 + g: 1.0 + b: 0.0 + - 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: trigger_with_feedback + event_id: bar1_btn_left_event + event_msg: !lambda "return \"double_click page \" + std::to_string(id(actual_page));" + led_id: bar1_left_rgb_front + r: 0.0 + g: 0.0 + b: 1.0 + - 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: trigger_with_feedback + event_id: bar1_btn_left_event + event_msg: !lambda "return \"triple_click page \" + std::to_string(id(actual_page));" + led_id: bar1_left_rgb_front + r: 1.0 + g: 0.0 + b: 1.0 + - timing: + - ON for at least 1s + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar1_btn_left_event + event_msg: !lambda "return \"hold page \" + std::to_string(id(actual_page));" + led_id: bar1_left_rgb_front + r: 1.0 + g: 0.5 + b: 0.0 +- id: !extend 'bar1_btn_right' + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar1_btn_right_event + event_msg: !lambda "return \"click page \" + std::to_string(id(actual_page));" + led_id: bar1_right_rgb_front + r: 0.0 + g: 1.0 + b: 0.0 + - 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: trigger_with_feedback + event_id: bar1_btn_right_event + event_msg: !lambda "return \"double_click page \" + std::to_string(id(actual_page));" + led_id: bar1_right_rgb_front + r: 0.0 + g: 0.0 + b: 1.0 + - 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: trigger_with_feedback + event_id: bar1_btn_right_event + event_msg: !lambda "return \"triple_click page \" + std::to_string(id(actual_page));" + led_id: bar1_right_rgb_front + r: 1.0 + g: 0.0 + b: 1.0 + - timing: + - ON for at least 1s + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar1_btn_right_event + event_msg: !lambda "return \"hold page \" + std::to_string(id(actual_page));" + led_id: bar1_right_rgb_front + r: 1.0 + g: 0.5 + b: 0.0 +- id: !extend 'bar2_btn_left' + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar2_btn_left_event + event_msg: !lambda "return \"click page \" + std::to_string(id(actual_page));" + led_id: bar2_left_rgb_front + r: 0.0 + g: 1.0 + b: 0.0 + - 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: trigger_with_feedback + event_id: bar2_btn_left_event + event_msg: !lambda "return \"double_click page \" + std::to_string(id(actual_page));" + led_id: bar2_left_rgb_front + r: 0.0 + g: 0.0 + b: 1.0 + - 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: trigger_with_feedback + event_id: bar2_btn_left_event + event_msg: !lambda "return \"triple_click page \" + std::to_string(id(actual_page));" + led_id: bar2_left_rgb_front + r: 1.0 + g: 0.0 + b: 1.0 + - timing: + - ON for at least 1s + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar2_btn_left_event + event_msg: !lambda "return \"hold page \" + std::to_string(id(actual_page));" + led_id: bar2_left_rgb_front + r: 1.0 + g: 0.5 + b: 0.0 +- id: !extend 'bar2_btn_right' + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar2_btn_right_event + event_msg: !lambda "return \"click page \" + std::to_string(id(actual_page));" + led_id: bar2_right_rgb_front + r: 0.0 + g: 1.0 + b: 0.0 + - 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: trigger_with_feedback + event_id: bar2_btn_right_event + event_msg: !lambda "return \"double_click page \" + std::to_string(id(actual_page));" + led_id: bar2_right_rgb_front + r: 0.0 + g: 0.0 + b: 1.0 + - 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: trigger_with_feedback + event_id: bar2_btn_right_event + event_msg: !lambda "return \"triple_click page \" + std::to_string(id(actual_page));" + led_id: bar2_right_rgb_front + r: 1.0 + g: 0.0 + b: 1.0 + - timing: + - ON for at least 1s + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar2_btn_right_event + event_msg: !lambda "return \"hold page \" + std::to_string(id(actual_page));" + led_id: bar2_right_rgb_front + r: 1.0 + g: 0.5 + b: 0.0 +- id: !extend 'bar3_btn_left' + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar3_btn_left_event + event_msg: !lambda "return \"click page \" + std::to_string(id(actual_page));" + led_id: bar3_left_rgb_front + r: 0.0 + g: 1.0 + b: 0.0 + - 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: trigger_with_feedback + event_id: bar3_btn_left_event + event_msg: !lambda "return \"double_click page \" + std::to_string(id(actual_page));" + led_id: bar3_left_rgb_front + r: 0.0 + g: 0.0 + b: 1.0 + - 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: trigger_with_feedback + event_id: bar3_btn_left_event + event_msg: !lambda "return \"triple_click page \" + std::to_string(id(actual_page));" + led_id: bar3_left_rgb_front + r: 1.0 + g: 0.0 + b: 1.0 + - timing: + - ON for at least 1s + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar3_btn_left_event + event_msg: !lambda "return \"hold page \" + std::to_string(id(actual_page));" + led_id: bar3_left_rgb_front + r: 1.0 + g: 0.5 + b: 0.0 +- id: !extend 'bar3_btn_right' + filters: + - delayed_off: 10ms + internal: true + on_multi_click: + - timing: + - ON for at most 300ms + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar3_btn_right_event + event_msg: !lambda "return \"click page \" + std::to_string(id(actual_page));" + led_id: bar3_right_rgb_front + r: 0.0 + g: 1.0 + b: 0.0 + - 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: trigger_with_feedback + event_id: bar3_btn_right_event + event_msg: !lambda "return \"double_click page \" + std::to_string(id(actual_page));" + led_id: bar3_right_rgb_front + r: 0.0 + g: 0.0 + b: 1.0 + - 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: trigger_with_feedback + event_id: bar3_btn_right_event + event_msg: !lambda "return \"triple_click page \" + std::to_string(id(actual_page));" + led_id: bar3_right_rgb_front + r: 1.0 + g: 0.0 + b: 1.0 + - timing: + - ON for at least 1s + - OFF for at least 0.2s + then: + - script.execute: + id: trigger_with_feedback + event_id: bar3_btn_right_event + event_msg: !lambda "return \"hold page \" + std::to_string(id(actual_page));" + led_id: bar3_right_rgb_front + r: 1.0 + g: 0.5 + b: 0.0