From 1623f3afdf14161d6a4a57237702a7c2417ccbd9 Mon Sep 17 00:00:00 2001 From: ZareMate <0.zaremate@gmail.com> Date: Tue, 4 Feb 2025 06:45:09 +0100 Subject: [PATCH] Refactor display logic for better readability and maintainability; update TV power control logic with override functionality --- desk-lamp.yaml | 2 - display.yaml | 120 +++++++++++++++++++++++++---------------------- mateuszs-tv.yaml | 35 +++++++++----- 3 files changed, 88 insertions(+), 69 deletions(-) diff --git a/desk-lamp.yaml b/desk-lamp.yaml index 524bb8d..c7191c7 100644 --- a/desk-lamp.yaml +++ b/desk-lamp.yaml @@ -38,12 +38,10 @@ output: id: output_cold pin: P26 max_power: 70% # Limit the cold white channel to 80% - min_power: 14% - platform: libretiny_pwm id: output_warm pin: P24 max_power: 70% # Limit the warm white channel to 80% - min_power: 14% light: - platform: cwww diff --git a/display.yaml b/display.yaml index ea94723..c23e4b2 100644 --- a/display.yaml +++ b/display.yaml @@ -57,14 +57,16 @@ display: int row_y = margin + 25; int col_offset = margin + 25; int icon_size = y_step * 0.75; + int col; // Calculate column and row positions - int col_array[] = {margin, col_offset + y_step, col_offset + y_step * 2, col_offset + y_step * 3, col_offset + y_step * 5, col_offset + y_step * 7}; + int col_array[] = {margin, col_offset + y_step, col_offset + y_step * 2, col_offset + y_step * 3, col_offset + y_step * 5, col_offset + y_step * 7}; - it.fill(Color(0, 0, 0)); // Clear screen + // Clear screen + it.fill(Color(0, 0, 0)); // Function to calculate row position - auto row = [&](int row_in) { + auto row_calc = [&](int row_in) { if (row_in == 0) { return margin; } else { @@ -74,12 +76,12 @@ display: // Function to handle all state conditions auto handle_state = [&](int col_index, int row_index, std::string text, std::string type) { - int x, y, center; - x = col_array[col_index]; - y = row(row_index); - center = ((col_array[col_index] + col_array[col_index + 1]) / 2) - 10; - - if (text != "on" && text != "off" && text != "unavailable" && text != "unknown" && text != "") { + + // Calculate center of column + int center = ((col_array[col_index] + col_array[col_index + 1]) / 2) - 10; + + // Check if text is a number and add unit + if (text != "unavailable" && text != "unknown" && text != "") { if (type == "temperature") { text = text + "°C"; } else if (type == "humidity") { @@ -89,61 +91,66 @@ display: if (text == "unavailable" || text == "unknown") { if (id(triangle_visible)) { - it.filled_triangle(center, y + icon_size, center + icon_size, y + icon_size, center + (icon_size / 2), y, Color(255, 0, 0)); - it.print((center + icon_size / 3) + 1, y, id(my_font), Color(255, 255, 255), "!"); + it.filled_triangle(center, row_calc(row_index) + icon_size, center + icon_size, row_calc(row_index) + icon_size, center + (icon_size / 2), row_calc(row_index), Color(255, 0, 0)); + it.print((center + icon_size / 3) + 1, row_calc(row_index), id(my_font), Color(255, 255, 255), "!"); } } else if (text == "" && type == "door" || text == "" && type == "motion") { - it.filled_rectangle(x, y, icon_size, icon_size, Color(128, 128, 128)); + it.filled_rectangle(col_array[col_index], row_calc(row_index), icon_size, icon_size, Color(128, 128, 128)); } else if (text == "on") { - it.filled_rectangle(x, y, icon_size, icon_size, Color(0, 255, 0)); + it.filled_rectangle(col_array[col_index], row_calc(row_index), icon_size, icon_size, Color(0, 255, 0)); } else if (text == "off") { - it.filled_rectangle(x, y, icon_size, icon_size, Color(255, 0, 0)); + it.filled_rectangle(col_array[col_index], row_calc(row_index), icon_size, icon_size, Color(255, 0, 0)); } else if (type == "icon") { - it.print(center, y, id(icon_font), Color(255, 255, 255), text.c_str()); + it.print(center, row_calc(row_index), id(icon_font), Color(255, 255, 255), text.c_str()); } else { - it.print(x, y, id(my_font), Color(255, 255, 255), text.c_str()); + it.print(col_array[col_index], row_calc(row_index), id(my_font), Color(255, 255, 255), text.c_str()); } }; - // Room names (first column) - handle_state(0,0, "󰚡", "icon"); - handle_state(0,1, "Bath", "name"); - handle_state(0,2, "Hall", "name"); - handle_state(0,3, "Kitch", "name");; - handle_state(0,4, "Tom", "name"); - handle_state(0,5, "Mate", "name"); - // Door status (second column) - handle_state(1, 0, "󰠚", "icon"); - handle_state(1, 1, id(bath_door_status).state, "door"); - handle_state(1, 2, id(hall_door_status).state, "door"); - handle_state(1, 3, "", "door"); - handle_state(1, 4, id(tomek_door_status).state, "door"); - handle_state(1, 5, id(mateusz_door_status).state, "door"); + // Room names (column 0) + col = 0; + handle_state(col,0, "󰚡", "icon"); + handle_state(col,1, "Bath", "name"); + handle_state(col,2, "Hall", "name"); + handle_state(col,3, "Kitch", "name");; + handle_state(col,4, "Tom", "name"); + handle_state(col,5, "Mate", "name"); - // Motion status (third column) - handle_state(2, 0, "󰶑", "icon"); - handle_state(2, 1, id(bath_motion_status).state, "motion"); - handle_state(2, 2, id(hall_motion_status).state, "motion"); - handle_state(2, 3, id(kitchen_motion_status).state, "motion"); - handle_state(2, 4, "", "motion"); - handle_state(2, 5, "", "motion"); + // Door status (column 1) + col = 1; + handle_state(col, 0, "󰠚", "icon"); + handle_state(col, 1, id(bath_door_status).state, "door"); + handle_state(col, 2, id(hall_door_status).state, "door"); + handle_state(col, 3, "", "door"); + handle_state(col, 4, id(tomek_door_status).state, "door"); + handle_state(col, 5, id(mateusz_door_status).state, "door"); - // Temperature (fourth column) - handle_state(3, 0, "󰔏", "icon"); - handle_state(3, 1, id(bath_temperature).state, "temperature"); - handle_state(3, 2, id(hall_temperature).state, "temperature"); - handle_state(3, 3, id(kitchen_temperature).state, "temperature"); - handle_state(3, 4, id(tomek_temperature).state, "temperature"); - handle_state(3, 5, id(mateusz_temperature).state, "temperature"); + // Motion status (column 2) + col = 2; + handle_state(col, 0, "󰶑", "icon"); + handle_state(col, 1, id(bath_motion_status).state, "motion"); + handle_state(col, 2, id(hall_motion_status).state, "motion"); + handle_state(col, 3, id(kitchen_motion_status).state, "motion"); + handle_state(col, 4, "", "motion"); + handle_state(col, 5, "", "motion"); - // Humidity (fifth column) - handle_state(4, 0, "󰖌", "icon"); - handle_state(4, 1, id(bath_humidity).state, "humidity"); - handle_state(4, 2, id(hall_humidity).state, "humidity"); - handle_state(4, 3, id(kitchen_humidity).state, "humidity"); - handle_state(4, 4, id(tomek_humidity).state, "humidity"); - handle_state(4, 5, id(mateusz_humidity).state, "humidity"); + // Temperature (column 3) + col = 3; + handle_state(col, 0, "󰔏", "icon"); + handle_state(col, 1, id(bath_temperature).state, "temperature"); + handle_state(col, 2, id(hall_temperature).state, "temperature"); + handle_state(col, 3, id(kitchen_temperature).state, "temperature"); + handle_state(col, 4, id(tomek_temperature).state, "temperature"); + handle_state(col, 5, id(mateusz_temperature).state, "temperature"); + // Humidity (column 4) + col = 4; + handle_state(col, 0, "󰖌", "icon"); + handle_state(col, 1, id(bath_humidity).state, "humidity"); + handle_state(col, 2, id(hall_humidity).state, "humidity"); + handle_state(col, 3, id(kitchen_humidity).state, "humidity"); + handle_state(col, 4, id(tomek_humidity).state, "humidity"); + handle_state(col, 5, id(mateusz_humidity).state, "humidity"); // 3D Printer variables int progress_width = screen_width - (2 * margin) - 120; @@ -151,16 +158,16 @@ display: // 3D Printer progress bar if (id(octo_state).state == "Printing") { - it.print(margin, row(6), id(my_font), Color(255, 255, 255), "3D Printer:"); - it.filled_rectangle(margin + 90, row(6), progress, 20, Color(0, 255, 0)); - it.rectangle(margin + 90, row(6), progress_width, 20, Color(255, 255, 255)); + it.print(margin, row_calc(6), id(my_font), Color(255, 255, 255), "3D Printer:"); + it.filled_rectangle(margin + 90, row_calc(6), progress, 20, Color(0, 255, 0)); + it.rectangle(margin + 90, row_calc(6), progress_width, 20, Color(255, 255, 255)); } // 3D Printer light status if (id(printer_light).state == "on" && id(octo_state).state == "Printing" ) { - it.print(margin + 90 + progress_width + 10, row(6), id(icon_font), Color(255, 255, 255), "󰖨"); + it.print(margin + 90 + progress_width + 10, row_calc(6), id(icon_font), Color(255, 255, 255), "󰖨"); } else if (id(printer_light).state == "on") { - it.print(margin, row(6), id(my_font), Color(255, 255, 255), "3D Printer Light On"); + it.print(margin, row_calc(6), id(my_font), Color(255, 255, 255), "3D Printer Light On"); } # Home Assistant integration @@ -243,6 +250,7 @@ font: - id: my_font file: "fonts/Roboto.ttf" size: 20 + - id: icon_font file: "fonts/JetBrains.ttf" size: 20 diff --git a/mateuszs-tv.yaml b/mateuszs-tv.yaml index 20161a3..4ac747b 100644 --- a/mateuszs-tv.yaml +++ b/mateuszs-tv.yaml @@ -43,8 +43,10 @@ binary_sensor: device_class: power on_state: - lambda: |- - if (!id(power_switch).state == x) { - id(power_switch).publish_state(x); + if (id(override).state == false) { + if (id(power_switch).state != x) { + id(power_switch).publish_state(x); + } } text_sensor: @@ -53,27 +55,38 @@ text_sensor: id: tv_status on_value: - lambda: |- - if (x == "on") { - id(power_switch).turn_on(); - } else { - id(power_switch).turn_off(); - } + if (id(override).state == false) { + if (x == "on" && !id(power_switch).state) { + id(power_switch).turn_on(); + } else if (x == "off" && id(power_switch).state) { + id(power_switch).turn_off(); + } + } # Define the switch to control TV power (Only toggled via Home Assistant) switch: - platform: template name: "Switch" id: power_switch - optimistic: true restore_mode: RESTORE_DEFAULT_OFF # turn_on_action: # - output.turn_off: tv_relay # Set P23 LOW # - delay: 300ms # - output.turn_on: tv_relay # Set P23 HIGH + optimistic: true turn_off_action: - - output.turn_off: tv_relay # Set P23 LOW - - delay: 1500ms - - output.turn_on: tv_relay # Set P23 HIGH + - lambda: |- + if (millis() > 5000) { // Check if 5 seconds have passed since startup + id(tv_relay).turn_off(); // Set P23 LOW + delay(1500); // Delay for 1500ms + id(tv_relay).turn_on(); // Set P23 HIGH + } + + - platform: template + name: "Override" + id: override + optimistic: true + restore_mode: RESTORE_DEFAULT_OFF # Define GPIO23 as the output (normally pull-up) output: