Generated IDs

This commit is contained in:
2026-05-18 15:44:42 +02:00
parent fa36a8e4aa
commit 79a3cbe66e
7 changed files with 213 additions and 156 deletions
+20 -6
View File
@@ -14,10 +14,28 @@ GPIO_I2C_BUTTONS_SCL = "GPIO2" #I2C SCL > Buttons
GPIO_I2C_SENSORS_SDA = "GPIO47" #I2C SDA > Temperature & Ambient Sensor
GPIO_I2C_SENSORS_SCL = "GPIO48" #I2S SCL > Temperature & Ambient Sensor
class BarSide(StrEnum):
class Side(StrEnum):
LEFT = "left"
RIGHT = "right"
class Direction(StrEnum):
FRONT = "front"
BACK = "back"
class IdSuffix(StrEnum):
LED = "rgb_led"
BUTTON = "btn"
BACKLIGHT = "backlight"
DISPLAY = "disp"
EVENT_BUTTON = "btn_event"
BACKLIGHT_PWM = "backlight_pwm"
CS_PIN = "cs_pin"
SCRIPT_UPDATE = "script_update"
SCRIPT_DRAW = "script_draw"
class ClickType(StrEnum):
SINGLE = "click"
DOUBLE = "double_click"
@@ -27,7 +45,7 @@ class ClickType(StrEnum):
class Color():
def __init__(self, hex: str):
self.hex = hex.lstrip("#")
self.hex: str = hex.lstrip("#")
offset = 0
@@ -42,10 +60,6 @@ class Color():
self.g = int(self.hex[(offset):(offset*2)], 16)
self.b = int(self.hex[(offset*2):(offset*3)], 16)
def hex(self) -> str:
return "#" + self.hex
TIMING_SINGLE_CLICK = [
"ON for at most 300ms",
-2
View File
@@ -19,7 +19,6 @@ from buttonplus_generator.snippets.services import config_services
from buttonplus_generator.merger import deep_merge
from buttonplus_generator.utils import list_to_click_type
def compose_config(
device_name: str,
version: int,
@@ -65,7 +64,6 @@ def compose_config(
return config
def yaml_dumper(config: Dict[str, Any], fh) -> str:
## Handle multiline strings
+79 -68
View File
@@ -1,7 +1,7 @@
from typing import Dict, Any, List
from buttonplus_generator.constants import *
from buttonplus_generator.merger import deep_merge
from buttonplus_generator.utils import get_light_effects
from buttonplus_generator.utils import bar_id, get_light_effects
def config_bars(version: int, num_bars: int, page_names: List[str], add_effects: bool) -> Dict[str, Any]:
@@ -30,7 +30,7 @@ def bars_backlight() -> Dict[str, Any]:
{
"platform": "ledc",
"pin": GPIO_BACKLIGHT_MINI,
"id": "displays_mini_backlight_pwm",
"id": bar_id(IdSuffix.BACKLIGHT_PWM, None),
"inverted": True,
"max_power": 0.6,
"frequency": "500Hz",
@@ -39,10 +39,10 @@ def bars_backlight() -> Dict[str, Any]:
"light": [
{
"platform": "monochromatic",
"output": "displays_mini_backlight_pwm",
"output": bar_id(IdSuffix.BACKLIGHT_PWM, None),
"gamma_correct": 2.2,
"name": "Bars Display Backlight",
"id": "displays_mini_backlight",
"id": bar_id(IdSuffix.BACKLIGHT, None),
"restore_mode": "ALWAYS_ON",
}
],
@@ -50,7 +50,7 @@ def bars_backlight() -> Dict[str, Any]:
def bars_setup(num_bars: int = 3) -> Dict[str, Any]:
bar_dict = {"mcp23008": []}
bar_dict: Dict[str, Any] = {"mcp23008": []}
# esphome.on_boot.then.[]
scripts = []
@@ -66,8 +66,8 @@ def bars_setup(num_bars: int = 3) -> Dict[str, Any]:
scripts.extend(
[
{"script.execute": "update_bar1_left"},
{"script.execute": "update_bar1_right"},
{"script.execute": bar_id(IdSuffix.SCRIPT_UPDATE, 1, Side.LEFT)},
{"script.execute": bar_id(IdSuffix.SCRIPT_UPDATE, 1, Side.RIGHT)},
]
)
@@ -79,8 +79,8 @@ def bars_setup(num_bars: int = 3) -> Dict[str, Any]:
scripts.extend(
[
{"script.execute": "update_bar2_left"},
{"script.execute": "update_bar2_right"},
{"script.execute": bar_id(IdSuffix.SCRIPT_UPDATE, 2, Side.LEFT)},
{"script.execute": bar_id(IdSuffix.SCRIPT_UPDATE, 2, Side.RIGHT)},
]
)
@@ -92,8 +92,8 @@ def bars_setup(num_bars: int = 3) -> Dict[str, Any]:
scripts.extend(
[
{"script.execute": "update_bar3_left"},
{"script.execute": "update_bar3_right"},
{"script.execute": bar_id(IdSuffix.SCRIPT_UPDATE, 3, Side.LEFT)},
{"script.execute": bar_id(IdSuffix.SCRIPT_UPDATE, 3, Side.RIGHT)},
]
)
@@ -105,8 +105,8 @@ def bars_setup(num_bars: int = 3) -> Dict[str, Any]:
scripts.extend(
[
{"script.execute": "update_bar4_left"},
{"script.execute": "update_bar4_right"},
{"script.execute": bar_id(IdSuffix.SCRIPT_UPDATE, 4, Side.LEFT)},
{"script.execute": bar_id(IdSuffix.SCRIPT_UPDATE, 4, Side.RIGHT)},
]
)
@@ -146,7 +146,7 @@ def _bar_button_entry(bar_nr: int, base_id: str) -> List[Dict[str, Any]]:
return [
{
"platform": "gpio",
"id": f"bar{bar_nr}_btn_left",
"id": bar_id(IdSuffix.BUTTON, bar_nr, Side.LEFT),
"name": f"BAR {bar_nr} button Left",
"internal": True,
"pin": {
@@ -158,7 +158,7 @@ def _bar_button_entry(bar_nr: int, base_id: str) -> List[Dict[str, Any]]:
},
{
"platform": "gpio",
"id": f"bar{bar_nr}_btn_right",
"id": bar_id(IdSuffix.BUTTON, bar_nr, Side.RIGHT),
"name": f"BAR {bar_nr} button Right",
"internal": True,
"pin": {
@@ -202,28 +202,28 @@ def _bar_lights_entry(bar_nr: int, offset: int, add_effects: bool) -> List[Dict[
{
"platform": "partition",
"name": f"BAR {bar_nr} Left RGB Front",
"id": f"bar{bar_nr}_left_rgb_front",
"id": bar_id(IdSuffix.LED, bar_nr, Side.LEFT, Direction.FRONT),
"segments": [{"id": "neopixels", "from": offset + 0, "to": offset + 0}],
"effects": light_effects
},
{
"platform": "partition",
"name": f"BAR {bar_nr} Left RGB Back",
"id": f"bar{bar_nr}_left_rgb_back",
"id": bar_id(IdSuffix.LED, bar_nr, Side.LEFT, Direction.BACK),
"segments": [{"id": "neopixels", "from": offset + 1, "to": offset + 1}],
"effects": light_effects
},
{
"platform": "partition",
"name": f"BAR {bar_nr} Right RGB Front",
"id": f"bar{bar_nr}_right_rgb_front",
"id": bar_id(IdSuffix.LED, bar_nr, Side.RIGHT, Direction.FRONT),
"segments": [{"id": "neopixels", "from": offset + 2, "to": offset + 2}],
"effects": light_effects
},
{
"platform": "partition",
"name": f"BAR {bar_nr} Right RGB Back",
"id": f"bar{bar_nr}_right_rgb_back",
"id": bar_id(IdSuffix.LED, bar_nr, Side.RIGHT, Direction.BACK),
"segments": [{"id": "neopixels", "from": offset + 3, "to": offset + 3}],
"effects": light_effects
},
@@ -261,7 +261,7 @@ def _bar_display_output_entry(bar_nr: int, base_id: str) -> List[Dict[str, Any]]
return [
{
"platform": "gpio",
"id": f"cs_pin_bar{bar_nr}_left",
"id": bar_id(IdSuffix.CS_PIN, bar_nr, Side.LEFT),
"pin": {
"mcp23xxx": base_id,
"number": 5,
@@ -271,7 +271,7 @@ def _bar_display_output_entry(bar_nr: int, base_id: str) -> List[Dict[str, Any]]
},
{
"platform": "gpio",
"id": f"cs_pin_bar{bar_nr}_right",
"id": bar_id(IdSuffix.CS_PIN, bar_nr, Side.RIGHT),
"pin": {
"mcp23xxx": base_id,
"number": 1,
@@ -310,32 +310,32 @@ def bars_scripts(num_bars: int) -> Dict[str, Any]:
setup_cpp = ""
if num_bars > 0:
bar_dict["script"].append(_bars_script_update_entry(1, BarSide.LEFT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(1, BarSide.RIGHT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(1, Side.LEFT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(1, Side.RIGHT, num_bars))
setup_cpp += _bars_script_setup_entry(1, BarSide.LEFT)
setup_cpp += _bars_script_setup_entry(1, BarSide.RIGHT)
setup_cpp += _bars_script_setup_entry(1, Side.LEFT)
setup_cpp += _bars_script_setup_entry(1, Side.RIGHT)
if num_bars > 1:
bar_dict["script"].append(_bars_script_update_entry(2, BarSide.LEFT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(2, BarSide.RIGHT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(2, Side.LEFT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(2, Side.RIGHT, num_bars))
setup_cpp += _bars_script_setup_entry(2, BarSide.LEFT)
setup_cpp += _bars_script_setup_entry(2, BarSide.RIGHT)
setup_cpp += _bars_script_setup_entry(2, Side.LEFT)
setup_cpp += _bars_script_setup_entry(2, Side.RIGHT)
if num_bars > 2:
bar_dict["script"].append(_bars_script_update_entry(3, BarSide.LEFT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(3, BarSide.RIGHT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(3, Side.LEFT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(3, Side.RIGHT, num_bars))
setup_cpp += _bars_script_setup_entry(3, BarSide.LEFT)
setup_cpp += _bars_script_setup_entry(3, BarSide.RIGHT)
setup_cpp += _bars_script_setup_entry(3, Side.LEFT)
setup_cpp += _bars_script_setup_entry(3, Side.RIGHT)
if num_bars > 3:
bar_dict["script"].append(_bars_script_update_entry(4, BarSide.LEFT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(4, BarSide.RIGHT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(4, Side.LEFT, num_bars))
bar_dict["script"].append(_bars_script_update_entry(4, Side.RIGHT, num_bars))
setup_cpp += _bars_script_setup_entry(4, BarSide.LEFT)
setup_cpp += _bars_script_setup_entry(4, BarSide.RIGHT)
setup_cpp += _bars_script_setup_entry(4, Side.LEFT)
setup_cpp += _bars_script_setup_entry(4, Side.RIGHT)
bar_dict["script"].append(
{"id": "setup_bar_displays", "then": [{"lambda": setup_cpp}]}
@@ -345,19 +345,19 @@ def bars_scripts(num_bars: int) -> Dict[str, Any]:
def _bars_script_update_entry(
bar_nr: int, bar_side: BarSide, num_bars: int
bar_nr: int, bar_side: Side, num_bars: int
) -> Dict[str, Any]:
# Generate all possible bars
bars_ids = [
f"cs_pin_bar{nr}_{side}"
bar_id(IdSuffix.CS_PIN, nr, side)
for nr in range(1, num_bars + 1)
for side in [BarSide.LEFT, BarSide.RIGHT]
for side in [Side.LEFT, Side.RIGHT]
]
bars_state = [
"on" if (nr is bar_nr and side is bar_side) else "off"
for nr in range(1, num_bars + 1)
for side in [BarSide.LEFT, BarSide.RIGHT]
for side in [Side.LEFT, Side.RIGHT]
]
generated_cpp = ""
@@ -366,26 +366,32 @@ def _bars_script_update_entry(
for bar, state in zip(bars_ids, bars_state):
generated_cpp += f"id({bar}).turn_{state}();\n"
rotation = "90" if bar_side is BarSide.RIGHT else "270"
rotation = "90" if bar_side is Side.RIGHT else "270"
draw_script_id = bar_id(IdSuffix.SCRIPT_DRAW, bar_nr, bar_side)
update_script_id = bar_id(IdSuffix.SCRIPT_UPDATE, bar_nr, bar_side)
cs_pin_id = bar_id(IdSuffix.CS_PIN, bar_nr, bar_side)
generated_cpp += (
"id(bar_display).clear();\n"
f"id(bar_display).set_rotation(display::DisplayRotation::DISPLAY_ROTATION_{rotation}_DEGREES);\n"
f"id(bar{bar_nr}_{bar_side}_draw).execute();\n"
f"id({draw_script_id}).execute();\n"
"id(bar_display).update();\n"
"delay(1);\n"
f"id(cs_pin_bar{bar_nr}_{bar_side}).turn_off();"
f"id({cs_pin_id}).turn_off();"
)
return {"id": f"update_bar{bar_nr}_{bar_side}", "then": [{"lambda": generated_cpp}]}
return {"id": f"{update_script_id}", "then": [{"lambda": generated_cpp}]}
def _bars_script_setup_entry(bar_nr: int, bar_side: BarSide) -> str:
def _bars_script_setup_entry(bar_nr: int, bar_side: Side) -> str:
cs_pin_id = bar_id(IdSuffix.CS_PIN, bar_nr, bar_side)
return (
f"id(cs_pin_bar{bar_nr}_{bar_side}).turn_on();\n"
f"id({cs_pin_id}).turn_on();\n"
"id(bar_display).setup();\n"
"delay(5);\n"
f"id(cs_pin_bar{bar_nr}_{bar_side}).turn_off();\n"
f"id({cs_pin_id}).turn_off();\n"
)
@@ -398,32 +404,32 @@ def bars_draw_scripts(num_bars: int, page_names: List[str]) -> Dict[str, Any]:
update_list = []
if num_bars > 0:
bar_dict["script"].append(_bars_script_draw_entry(1, BarSide.LEFT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(1, BarSide.RIGHT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(1, Side.LEFT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(1, Side.RIGHT, page_names))
update_list.extend(_bars_script_execute_entry(1, BarSide.LEFT))
update_list.extend(_bars_script_execute_entry(1, BarSide.RIGHT))
update_list.extend(_bars_script_execute_entry(1, Side.LEFT))
update_list.extend(_bars_script_execute_entry(1, Side.RIGHT))
if num_bars > 1:
bar_dict["script"].append(_bars_script_draw_entry(2, BarSide.LEFT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(2, BarSide.RIGHT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(2, Side.LEFT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(2, Side.RIGHT, page_names))
update_list.extend(_bars_script_execute_entry(2, BarSide.LEFT))
update_list.extend(_bars_script_execute_entry(2, BarSide.RIGHT))
update_list.extend(_bars_script_execute_entry(2, Side.LEFT))
update_list.extend(_bars_script_execute_entry(2, Side.RIGHT))
if num_bars > 2:
bar_dict["script"].append(_bars_script_draw_entry(3, BarSide.LEFT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(3, BarSide.RIGHT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(3, Side.LEFT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(3, Side.RIGHT, page_names))
update_list.extend(_bars_script_execute_entry(3, BarSide.LEFT))
update_list.extend(_bars_script_execute_entry(3, BarSide.RIGHT))
update_list.extend(_bars_script_execute_entry(3, Side.LEFT))
update_list.extend(_bars_script_execute_entry(3, Side.RIGHT))
if num_bars > 3:
bar_dict["script"].append(_bars_script_draw_entry(4, BarSide.LEFT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(4, BarSide.RIGHT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(4, Side.LEFT, page_names))
bar_dict["script"].append(_bars_script_draw_entry(4, Side.RIGHT, page_names))
update_list.extend(_bars_script_execute_entry(3, BarSide.LEFT))
update_list.extend(_bars_script_execute_entry(3, BarSide.RIGHT))
update_list.extend(_bars_script_execute_entry(3, Side.LEFT))
update_list.extend(_bars_script_execute_entry(3, Side.RIGHT))
bar_dict["script"].append({"id": "update_bars", "then": update_list[:-1]})
@@ -431,7 +437,7 @@ def bars_draw_scripts(num_bars: int, page_names: List[str]) -> Dict[str, Any]:
def _bars_script_draw_entry(
bar_nr: int, bar_side: BarSide, page_names: List[str]
bar_nr: int, bar_side: Side, page_names: List[str]
) -> Dict[str, Any]:
generated_cpp = "switch (id(active_page_nr)){\n"
@@ -447,13 +453,18 @@ def _bars_script_draw_entry(
generated_cpp += "}\n"
return {"id": f"bar{bar_nr}_{bar_side}_draw", "then": [{"lambda": generated_cpp}]}
draw_script_id = bar_id(IdSuffix.SCRIPT_DRAW, bar_nr, bar_side)
return {"id": f"{draw_script_id}", "then": [{"lambda": generated_cpp}]}
def _bars_script_execute_entry(bar_nr: int, bar_side: BarSide) -> List[Dict[str, str]]:
def _bars_script_execute_entry(bar_nr: int, bar_side: Side) -> List[Dict[str, str]]:
update_script_id = bar_id(IdSuffix.SCRIPT_UPDATE, bar_nr, bar_side)
return [
{
"script.execute": f"update_bar{bar_nr}_{bar_side}",
"script.execute": f"{update_script_id}",
},
{"delay": "0.1s"},
]
+25 -25
View File
@@ -1,6 +1,6 @@
from typing import Dict, Any, List
from buttonplus_generator.constants import *
from buttonplus_generator.utils import get_display_id, get_display_address, get_light_effects
from buttonplus_generator.utils import display_id, get_display_mcp_id, get_display_mcp_address, get_light_effects
from buttonplus_generator.merger import deep_merge
@@ -22,7 +22,7 @@ def display_backlight(num_bars: int) -> Dict[str, Any]:
{
"platform": "ledc",
"pin": GPIO_BACKLIGHT_MAIN,
"id": "display_main_backlight_pwm",
"id": display_id(IdSuffix.BACKLIGHT_PWM),
"inverted": True,
"max_power": 1,
"frequency": "500Hz",
@@ -31,16 +31,16 @@ def display_backlight(num_bars: int) -> Dict[str, Any]:
"light": [
{
"platform": "monochromatic",
"output": "display_main_backlight_pwm",
"output": display_id(IdSuffix.BACKLIGHT_PWM),
"gamma_correct": 2.2,
"name": "Main Display Backlight",
"id": "display_main_backlight",
"id": display_id(IdSuffix.BACKLIGHT),
"restore_mode": "ALWAYS_ON",
}
],
"display": [
{
"id": "main_display",
"id": display_id(IdSuffix.DISPLAY),
"platform": "ili9xxx",
"model": "ili9341",
"invert_colors": False,
@@ -48,7 +48,7 @@ def display_backlight(num_bars: int) -> Dict[str, Any]:
"update_interval": "30s",
"dc_pin": {"number": GPIO_SPI_REG, "allow_other_uses": True},
"cs_pin": {
"mcp23xxx": get_display_id(num_bars),
"mcp23xxx": get_display_mcp_id(num_bars),
"number": 5,
"mode": {"output": True},
"inverted": False,
@@ -56,7 +56,7 @@ def display_backlight(num_bars: int) -> Dict[str, Any]:
"show_test_card": False,
"dimensions": {"height": 240, "width": 320},
"rotation": 180,
"lambda": "id(main_draw).execute();"
"lambda": f"id({display_id(IdSuffix.SCRIPT_DRAW)}).execute();"
},
],
}
@@ -70,9 +70,9 @@ def display_setup(num_bars: int) -> Dict[str, Any]:
return {
"mcp23008": [
{
"id": get_display_id(num_bars),
"id": get_display_mcp_id(num_bars),
"i2c_id": "buttons",
"address": get_display_address(num_bars),
"address": get_display_mcp_address(num_bars),
}
]
}
@@ -86,11 +86,11 @@ def display_buttons(num_bars: int) -> Dict[str, Any]:
"binary_sensor": [
{
"platform": "gpio",
"id": "main_display_btn_left",
"id": display_id(IdSuffix.BUTTON, Side.LEFT),
"name": "Main Display button Left",
"internal": True,
"pin": {
"mcp23xxx": get_display_id(num_bars),
"mcp23xxx": get_display_mcp_id(num_bars),
"number": 6,
"mode": "INPUT_PULLUP",
"inverted": True,
@@ -98,11 +98,11 @@ def display_buttons(num_bars: int) -> Dict[str, Any]:
},
{
"platform": "gpio",
"id": "main_display_btn_right",
"id": display_id(IdSuffix.BUTTON, Side.RIGHT),
"name": "Main Display button Right",
"internal": True,
"pin": {
"mcp23xxx": get_display_id(num_bars),
"mcp23xxx": get_display_mcp_id(num_bars),
"number": 2,
"mode": "INPUT_PULLUP",
"inverted": True,
@@ -126,28 +126,28 @@ def display_lights(num_bars: int, display_has_leds: bool, add_effects: bool) ->
{
"platform": "partition",
"name": "Main Display Left RGB Front",
"id": "main_display_left_rgb_front",
"id": display_id(IdSuffix.LED, Side.LEFT, Direction.FRONT),
"segments": [{"id": "neopixels", "from": 0, "to": 0}],
"effects": light_effects
},
{
"platform": "partition",
"name": "Main Display Left RGB Back",
"id": "main_display_left_rgb_back",
"id": display_id(IdSuffix.LED, Side.LEFT, Direction.BACK),
"segments": [{"id": "neopixels", "from": 1, "to": 1}],
"effects": light_effects
},
{
"platform": "partition",
"name": "Main Display Right RGB Front",
"id": "main_display_right_rgb_front",
"id": display_id(IdSuffix.LED, Side.RIGHT, Direction.FRONT),
"segments": [{"id": "neopixels", "from": 2, "to": 2}],
"effects": light_effects
},
{
"platform": "partition",
"name": "Main Display Right RGB Back",
"id": "main_display_right_rgb_back",
"id": display_id(IdSuffix.LED, Side.RIGHT, Direction.BACK),
"segments": [{"id": "neopixels", "from": 3, "to": 3}],
"effects": light_effects
},
@@ -159,10 +159,10 @@ def update_scripts(page_names: List[str]) -> Dict[str, Any]:
display_dict["script"].append(
{
"id": "update_main",
"id": display_id(IdSuffix.SCRIPT_UPDATE),
"then": [
{
"component.update": "main_display",
"component.update": display_id(IdSuffix.DISPLAY),
}
],
}
@@ -170,12 +170,12 @@ def update_scripts(page_names: List[str]) -> Dict[str, Any]:
generated_cpp = (
"// All pages\n"
"id(main_display).image(0, 235, id(icon_prev_page), ImageAlign::BOTTOM_LEFT, id(grey));\n"
"id(main_display).image(320, 235, id(icon_next_page), ImageAlign::BOTTOM_RIGHT, id(grey));\n"
"id(main_display).print(160, 235, id(font_arial20), id(white), TextAlign::BOTTOM_CENTER, id(active_page_name).c_str());\n"
f"id({display_id(IdSuffix.DISPLAY)}).image(0, 235, id(icon_prev_page), ImageAlign::BOTTOM_LEFT, id(grey));\n"
f"id({display_id(IdSuffix.DISPLAY)}).image(320, 235, id(icon_next_page), ImageAlign::BOTTOM_RIGHT, id(grey));\n"
f"id({display_id(IdSuffix.DISPLAY)}).print(160, 235, id(font_arial20), id(white), TextAlign::BOTTOM_CENTER, id(active_page_name).c_str());\n"
"\n"
"id(main_display).strftime(160, 5, id(font_arial20), TextAlign::TOP_CENTER, \"%H:%M\", id(datetime).now());\n"
"id(main_display).strftime(160, 80, id(font_arial20), TextAlign::TOP_CENTER, \"%d-%m-%Y\", id(datetime).now());\n"
f"id({display_id(IdSuffix.DISPLAY)}).strftime(160, 5, id(font_arial20), TextAlign::TOP_CENTER, \"%H:%M\", id(datetime).now());\n"
f"id({display_id(IdSuffix.DISPLAY)}).strftime(160, 80, id(font_arial20), TextAlign::TOP_CENTER, \"%d-%m-%Y\", id(datetime).now());\n"
"\n"
"switch (id(active_page_nr)){\n"
)
@@ -191,7 +191,7 @@ def update_scripts(page_names: List[str]) -> Dict[str, Any]:
display_dict["script"].append(
{
"id": "main_draw",
"id": display_id(IdSuffix.SCRIPT_DRAW),
"then": [
{"lambda": generated_cpp}
],
+34 -34
View File
@@ -2,7 +2,7 @@ from typing import Any, Dict, List
from buttonplus_generator.constants import *
from buttonplus_generator.merger import deep_merge
from buttonplus_generator.utils import click_type_color, click_type_timing
from buttonplus_generator.utils import bar_id, click_type_color, click_type_timing, display_id
def config_events(
@@ -38,33 +38,33 @@ def events(
event_dict["event"] = []
if num_bars < 4:
event_dict["event"].extend(_event_display_entry(BarSide.LEFT))
event_dict["event"].extend(_event_display_entry(BarSide.RIGHT))
event_dict["event"].extend(_event_display_entry(Side.LEFT))
event_dict["event"].extend(_event_display_entry(Side.RIGHT))
if num_bars > 0:
event_dict["event"].extend(_event_bar_entry(1, BarSide.LEFT))
event_dict["event"].extend(_event_bar_entry(1, BarSide.RIGHT))
event_dict["event"].extend(_event_bar_entry(1, Side.LEFT))
event_dict["event"].extend(_event_bar_entry(1, Side.RIGHT))
if num_bars > 1:
event_dict["event"].extend(_event_bar_entry(2, BarSide.LEFT))
event_dict["event"].extend(_event_bar_entry(2, BarSide.RIGHT))
event_dict["event"].extend(_event_bar_entry(2, Side.LEFT))
event_dict["event"].extend(_event_bar_entry(2, Side.RIGHT))
if num_bars > 2:
event_dict["event"].extend(_event_bar_entry(3, BarSide.LEFT))
event_dict["event"].extend(_event_bar_entry(3, BarSide.RIGHT))
event_dict["event"].extend(_event_bar_entry(3, Side.LEFT))
event_dict["event"].extend(_event_bar_entry(3, Side.RIGHT))
if num_bars > 3:
event_dict["event"].extend(_event_bar_entry(4, BarSide.LEFT))
event_dict["event"].extend(_event_bar_entry(4, BarSide.RIGHT))
event_dict["event"].extend(_event_bar_entry(4, Side.LEFT))
event_dict["event"].extend(_event_bar_entry(4, Side.RIGHT))
return event_dict
def _event_display_entry(display_side: BarSide) -> List[Dict[str, Any]]:
def _event_display_entry(display_side: Side) -> List[Dict[str, Any]]:
return [
{
"platform": "template",
"id": f"display_btn_{display_side}_event",
"id": display_id(IdSuffix.EVENT_BUTTON, display_side),
"name": f"DISPLAY Button {str(display_side).capitalize()}",
"device_class": "button",
"event_types": r"${button_events}",
@@ -72,11 +72,11 @@ def _event_display_entry(display_side: BarSide) -> List[Dict[str, Any]]:
]
def _event_bar_entry(bar_nr: int, bar_side: BarSide) -> List[Dict[str, Any]]:
def _event_bar_entry(bar_nr: int, bar_side: Side) -> List[Dict[str, Any]]:
return [
{
"platform": "template",
"id": f"bar{bar_nr}_btn_{bar_side}_event",
"id": bar_id(IdSuffix.EVENT_BUTTON, bar_nr, bar_side),
"name": f"BAR {bar_nr} Button {str(bar_side).capitalize()}",
"device_class": "button",
"event_types": r"${button_events}",
@@ -133,49 +133,49 @@ def events_timing(
if num_bars < 4:
event_dict["binary_sensor"].extend(
_display_button_entry(version, BarSide.LEFT, click_types, click_confirm)
_display_button_entry(version, Side.LEFT, click_types, click_confirm)
)
event_dict["binary_sensor"].extend(
_display_button_entry(version, BarSide.RIGHT, click_types, click_confirm)
_display_button_entry(version, Side.RIGHT, click_types, click_confirm)
)
if num_bars > 0:
event_dict["binary_sensor"].extend(
_bar_button_entry(1, BarSide.LEFT, click_types, click_confirm)
_bar_button_entry(1, Side.LEFT, click_types, click_confirm)
)
event_dict["binary_sensor"].extend(
_bar_button_entry(1, BarSide.RIGHT, click_types, click_confirm)
_bar_button_entry(1, Side.RIGHT, click_types, click_confirm)
)
if num_bars > 1:
event_dict["binary_sensor"].extend(
_bar_button_entry(2, BarSide.LEFT, click_types, click_confirm)
_bar_button_entry(2, Side.LEFT, click_types, click_confirm)
)
event_dict["binary_sensor"].extend(
_bar_button_entry(2, BarSide.RIGHT, click_types, click_confirm)
_bar_button_entry(2, Side.RIGHT, click_types, click_confirm)
)
if num_bars > 2:
event_dict["binary_sensor"].extend(
_bar_button_entry(3, BarSide.LEFT, click_types, click_confirm)
_bar_button_entry(3, Side.LEFT, click_types, click_confirm)
)
event_dict["binary_sensor"].extend(
_bar_button_entry(3, BarSide.RIGHT, click_types, click_confirm)
_bar_button_entry(3, Side.RIGHT, click_types, click_confirm)
)
if num_bars > 3:
event_dict["binary_sensor"].extend(
_bar_button_entry(3, BarSide.LEFT, click_types, click_confirm)
_bar_button_entry(3, Side.LEFT, click_types, click_confirm)
)
event_dict["binary_sensor"].extend(
_bar_button_entry(3, BarSide.RIGHT, click_types, click_confirm)
_bar_button_entry(3, Side.RIGHT, click_types, click_confirm)
)
return event_dict
def _bar_button_entry(
bar_nr: int, bar_side: BarSide, click_types: List[ClickType], click_confirm: bool
bar_nr: int, bar_side: Side, click_types: List[ClickType], click_confirm: bool
) -> List[Dict[str, Any]]:
multi_click_list = []
@@ -184,8 +184,8 @@ def _bar_button_entry(
for ct in click_types:
multi_click_list.extend(
_timing_entry(
event_id=f"bar{bar_nr}_btn_{bar_side}_event",
led_id=f"bar{bar_nr}_{bar_side}_rgb_front",
event_id=bar_id(IdSuffix.EVENT_BUTTON, bar_nr, bar_side),
led_id=bar_id(IdSuffix.LED, bar_nr, bar_side, Direction.FRONT),
event_type=ct,
timing=click_type_timing(ct),
color=click_type_color(ct),
@@ -194,7 +194,7 @@ def _bar_button_entry(
return [
{
"id": f"bar{bar_nr}_btn_{bar_side}",
"id": bar_id(IdSuffix.BUTTON, bar_nr, bar_side),
"filters": [{"delayed_off": "10ms"}],
"on_multi_click": multi_click_list,
}
@@ -203,7 +203,7 @@ def _bar_button_entry(
def _display_button_entry(
version: int,
display_side: BarSide,
display_side: Side,
click_types: List[ClickType],
click_confirm: bool,
) -> List[Dict[str, Any]]:
@@ -211,13 +211,13 @@ def _display_button_entry(
# TODO click_confirm implement
led_id = f"main_display_{display_side}_rgb_front"
led_id = display_id(IdSuffix.LED, display_side, Direction.FRONT)
if version == 1: # No leds
led_id = YAMLLambda("return nullptr;")
# Add special page changer events
script = "prev_page" if display_side == BarSide.LEFT else "next_page"
script = "prev_page" if display_side == Side.LEFT else "next_page"
multi_click_list.append(
{
"timing": click_type_timing(ClickType.SINGLE),
@@ -232,7 +232,7 @@ def _display_button_entry(
for ct in other_click_types:
multi_click_list.extend(
_timing_entry(
event_id=f"display_btn_{display_side}_event",
event_id=display_id(IdSuffix.EVENT_BUTTON, display_side),
led_id=led_id,
event_type=ct,
timing=click_type_timing(ct),
@@ -242,7 +242,7 @@ def _display_button_entry(
return [
{
"id": f"main_display_btn_{display_side}",
"id": display_id(IdSuffix.BUTTON, display_side),
"filters": [{"delayed_off": "10ms"}],
"on_multi_click": multi_click_list,
}
+17 -16
View File
@@ -1,6 +1,7 @@
from typing import Dict, Any, List
from buttonplus_generator.merger import deep_merge
from buttonplus_generator.constants import *
from buttonplus_generator.utils import bar_id, display_id
def config_services(version: int) -> Dict[str, Any]:
@@ -16,9 +17,9 @@ def toast_service() -> Dict[str, Any]:
generated_cpp = (
"if(id(internal_toast).size() > 0){\n"
" // Draw white box over existing text\n"
" id(main_display).filled_rectangle(0, 200, 320, 40, white);\n"
f" id({display_id(IdSuffix.DISPLAY)}).filled_rectangle(0, 200, 320, 40, white);\n"
" // Show toast message\n"
" id(main_display).print(160, 235, id(font_arial20), id(black), TextAlign::BOTTOM_CENTER, id(internal_toast).c_str());\n"
f" id({display_id(IdSuffix.DISPLAY)}).print(160, 235, id(font_arial20), id(black), TextAlign::BOTTOM_CENTER, id(internal_toast).c_str());\n"
"}\n"
)
@@ -26,7 +27,7 @@ def toast_service() -> Dict[str, Any]:
"globals": [
{"id": "internal_toast", "type": "std::string", "initial_value": ""}
],
"script": [{"id": "main_draw", "then": [{"lambda": generated_cpp}]}],
"script": [{"id": display_id(IdSuffix.SCRIPT_DRAW), "then": [{"lambda": generated_cpp}]}],
"api": {
"actions": [
{
@@ -39,7 +40,7 @@ def toast_service() -> Dict[str, Any]:
"value": YAMLLambda("return message;"),
}
},
{"script.execute": "update_main"},
{"script.execute": display_id(IdSuffix.SCRIPT_UPDATE)},
{"delay": YAMLLambda("return timeout * 1000;")},
{
"globals.set": {
@@ -47,7 +48,7 @@ def toast_service() -> Dict[str, Any]:
"value": YAMLLambda("return std::string();"),
}
},
{"script.execute": "update_main"},
{"script.execute": display_id(IdSuffix.SCRIPT_UPDATE)},
],
}
]
@@ -59,30 +60,30 @@ def notification_service(version: int) -> Dict[str, Any]:
generated_cpp = (
"if(id(internal_notify).size() > 0){\n"
" // Draw white box over existing text\n"
" id(main_display).filled_rectangle(0, 200, 320, 40, white);\n"
" id(main_display).rectangle(0, 200, 320, 40, accent);\n"
f" id({display_id(IdSuffix.DISPLAY)}).filled_rectangle(0, 200, 320, 40, white);\n"
f" id({display_id(IdSuffix.DISPLAY)}).rectangle(0, 200, 320, 40, accent);\n"
" // Show notification message\n"
" id(main_display).print(160, 235, id(font_arial20), id(black), TextAlign::BOTTOM_CENTER, id(internal_notify).c_str());\n"
f" id({display_id(IdSuffix.DISPLAY)}).print(160, 235, id(font_arial20), id(black), TextAlign::BOTTOM_CENTER, id(internal_notify).c_str());\n"
"}\n"
)
notification_led_partition_left = 0
notification_led_partition_right = 2
notification_led_left = "main_display_left_rgb_front"
notification_led_right = "main_display_right_rgb_front"
notification_led_left = display_id(IdSuffix.LED, Side.LEFT, Direction.FRONT)
notification_led_right = display_id(IdSuffix.LED, Side.RIGHT, Direction.FRONT)
# No display leds, switch to BAR 1 wall leds
if version == 1:
notification_led_partition_left = 1
notification_led_partition_right = 3
notification_led_left = "bar1_left_rgb_back"
notification_led_right = "bar1_right_rgb_back"
notification_led_left = bar_id(IdSuffix.LED, 1, Side.LEFT, Direction.BACK)
notification_led_right = bar_id(IdSuffix.LED, 1, Side.RIGHT, Direction.BACK)
service_dict = {
"globals": [
{"id": "internal_notify", "type": "std::string", "initial_value": ""}
],
"script": [{"id": "main_draw", "then": [{"lambda": generated_cpp}]}],
"script": [{"id": display_id(IdSuffix.SCRIPT_DRAW), "then": [{"lambda": generated_cpp}]}],
"api": {
"actions": [
{
@@ -95,7 +96,7 @@ def notification_service(version: int) -> Dict[str, Any]:
"value": YAMLLambda("return message;"),
}
},
{"script.execute": "update_main"},
{"script.execute": display_id(IdSuffix.SCRIPT_UPDATE)},
{
"while": {
"condition": {
@@ -136,7 +137,7 @@ def notification_service(version: int) -> Dict[str, Any]:
"value": YAMLLambda("return std::string();"),
}
},
{"script.execute": "update_main"},
{"script.execute": display_id(IdSuffix.SCRIPT_UPDATE)},
],
},
]
@@ -175,7 +176,7 @@ def notification_service(version: int) -> Dict[str, Any]:
"value": YAMLLambda("return std::string();"),
},
},
{"script.execute": "update_main"},
{"script.execute": display_id(IdSuffix.SCRIPT_UPDATE)},
{"script.stop": "next_page"},
],
},
+38 -5
View File
@@ -1,6 +1,6 @@
import re
from typing import List, Dict, Any
from typing import List, Dict, Any, Optional
from buttonplus_generator.constants import *
@@ -17,20 +17,51 @@ def slugify(input : str) -> str:
s = s[1:]
return s
def display_id(suffix: IdSuffix, side: Optional[Side] = None, dir: Optional[Direction] = None) -> str:
if side is None and dir is None:
return f"display_{suffix}"
if side is None:
return f"display_{dir}_{suffix}"
if dir is None:
return f"display_{side}_{suffix}"
return f"display_{side}_{dir}_{suffix}"
def bar_id(suffix: IdSuffix, bar_nr: Optional[int], side: Optional[Side] = None, dir: Optional[Direction] = None) -> str:
bar_name = f"bars"
if bar_nr is not None:
bar_name = f"bar{bar_nr}"
if side is None and dir is None:
return f"{bar_name}_{suffix}"
if side is None:
return f"{bar_name}_{dir}_{suffix}"
if dir is None:
return f"{bar_name}_{side}_{suffix}"
return f"{bar_name}_{side}_{dir}_{suffix}"
def array_to_cpp_vector(string_array : List[str]) -> str:
return "{" + ', '.join(f'"{entry}"' for entry in string_array) + "}"
def get_display_id(num_bars : int) -> str:
def array_to_cpp_vector_raw(string_array: List[str]) -> str:
return "{" + ', '.join(entry for entry in string_array) + "}"
def get_display_mcp_id(num_bars : int) -> str:
if(num_bars < 1 or num_bars > 3):
raise ValueError("Can't have a display with this number of bars")
return "base_J" + str(3 - num_bars)
def get_display_address(num_bars : int) -> str:
def get_display_mcp_address(num_bars : int) -> str:
if(num_bars < 1 or num_bars > 3):
raise ValueError("Can't have a display with this number of bars")
return 0x23 - num_bars
return f"{0x23 - num_bars}"
def get_light_effects(enabled: bool) -> List[Dict[str, Any]]:
if not enabled:
@@ -64,6 +95,8 @@ def string_to_click_type(ct:str) -> ClickType:
return ClickType.TRIPLE
elif ct == "hold":
return ClickType.HOLD
return ClickType.SINGLE
def list_to_click_type(str_list:List[str]) -> List[ClickType]:
ct_list: List[ClickType] = []
@@ -97,4 +130,4 @@ def click_type_timing(ct: ClickType) -> List[str]:
elif(ct is ClickType.HOLD):
return TIMING_HOLD_CLICK
return TIMING_SINGLE_CLICK
return TIMING_SINGLE_CLICK