From 59727e294da4e0cdada70687f9e22198539bc16a Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Mon, 10 Apr 2023 23:57:35 +0200 Subject: [PATCH] Home page: Removing unnecessary calls to panel (#629) Trying to gain a bit on performance by not sending calls to the panel when not needed (element not available, etc.). --- nspanel_blueprint.yaml | 266 ++++++++++++++++++++++------------------- 1 file changed, 146 insertions(+), 120 deletions(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index f18c078..7a1904e 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -2317,6 +2317,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l mode: parallel max: 5000 + trace: stored_traces: 10 @@ -2356,7 +2357,7 @@ variables: date_format: !input "date_format" time_format: !input "time_format" time: "{{ as_timestamp(now()) | timestamp_custom(time_format) }}" - meridiem: "{{ as_timestamp(now()) | timestamp_custom('%p') if time_format == '%-I:%M' else '' }}" + meridiem: "{{ as_timestamp(now()) | timestamp_custom('%p') if time_format == '%-I:%M' }}" sun_is_up: "{{ is_state('sun.sun', 'above_horizon') }}" notification_sound: "switch.{{ nspanel_name }}_notification_sound" @@ -3693,20 +3694,6 @@ condition: "{{ is_state(nextion_inited_trigger, 'on') | default(false) if nextio ##### START - Action ##### ############################################################# action: - - variables: - #settings_entity_value: "{{ states(settings_entity) }}" - settings_entity_value: "{{ states(settings_entity) | default('unavailable') if settings_entity is string else 'unavailable' }}" - settings_entity_split: "{{ settings_entity_value.split(',') if settings_entity_value is string and settings_entity_value not in ['unavailable', 'unknown', None] else [] }}" - settings_entity_count: "{{ settings_entity_split | count if settings_entity_split else 0 }}" - entity_long: "{{ settings_entity_split[0] if settings_entity_count >= 1 else 'unknown' }}" - entity_back: "{{ settings_entity_split[1] if settings_entity_count >= 2 else 'unknown' }}" - entity_long_name: "{{ settings_entity_split[2] if settings_entity_count >= 3 else 'unknown' }}" - entity_long_icon: "{{ settings_entity_split[3] if settings_entity_count >= 4 else 'unknown' }}" - entity_long_icon_color: "{{ settings_entity_split[4] if settings_entity_count >= 5 else 'unknown' }}" - entity_long_domain: "{{ entity_long.split('.')[0] if entity_long.split('.') | count > 0 else 'unknown' }}" - - ######################################################################################################################## - # main - alias: "choose alias (name)" - alias: Main choices choose: @@ -3716,12 +3703,25 @@ action: - condition: trigger id: settings_entity - "{{ trigger.event.data.new_state.state not in ['unavailable', 'unknown', None] }}" - - "{{ entity_long_domain in ['light', 'cover', 'climate'] }}" sequence: - - service: "{{ nextion.commands.printf }}" - data: - cmd: "page {{ nextion.pages[entity_long_domain] }}" - continue_on_error: true + - &variables-settings_entity + variables: + settings_entity_value: "{{ states(settings_entity) | default('unavailable') if settings_entity is string else 'unavailable' }}" + settings_entity_split: "{{ settings_entity_value.split(',') if settings_entity_value is string and settings_entity_value not in ['unavailable', 'unknown', None] else [] }}" + settings_entity_count: "{{ settings_entity_split | count if settings_entity_split else 0 }}" + entity_long: "{{ settings_entity_split[0] if settings_entity_count >= 1 else 'unknown' }}" + entity_back: "{{ settings_entity_split[1] if settings_entity_count >= 2 else 'unknown' }}" + entity_long_name: "{{ settings_entity_split[2] if settings_entity_count >= 3 else 'unknown' }}" + entity_long_icon: "{{ settings_entity_split[3] if settings_entity_count >= 4 else 'unknown' }}" + entity_long_icon_color: "{{ settings_entity_split[4] if settings_entity_count >= 5 else 'unknown' }}" + - variables: + entity_long_domain: "{{ entity_long.split('.')[0] if entity_long.split('.') | count > 0 else 'unknown' }}" + - if: "{{ entity_long_domain in ['light', 'cover', 'climate'] }}" + then: + - service: "{{ nextion.commands.printf }}" + data: + cmd: "page {{ nextion.pages[entity_long_domain] }}" + continue_on_error: true ##### BOOT NSPANEL - boot init ##### - alias: Boot init @@ -3786,6 +3786,7 @@ action: display_target_temperature_state: "{{ states(display_target_temperature) | default('unavailable') if display_target_temperature is string else 'unavailable' }}" - if: "{{ is_number(display_target_temperature_state) }}" then: + - *variables-settings_entity - service: climate.set_temperature data: entity_id: "{{ entity_long }}" @@ -3831,71 +3832,77 @@ action: component: home.time message: "{{ time }}" continue_on_error: true - ### TIME Meridiem Font Color ### - - *delay-default - - service: "{{ nextion.commands.font_color }}" - data: - component: home.meridiem - message: "{{ page_home.general.time.label.color_rgb if is_number(page_home.general.time.label.color_rgb) else ((page_home.general.time.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.time.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.time.label.color_rgb[2] //(2**3)) }}" - continue_on_error: true - ### TIME Meridiem Font ### - - *delay-default - - service: "{{ nextion.commands.text_printf }}" - data: - component: home.meridiem - message: "{{ meridiem }}" - continue_on_error: true + - if: "{{ meridiem }}" + then: + ### TIME Meridiem Font Color ### + - *delay-default + - service: "{{ nextion.commands.font_color }}" + data: + component: home.meridiem + message: "{{ page_home.general.time.label.color_rgb if is_number(page_home.general.time.label.color_rgb) else ((page_home.general.time.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.time.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.time.label.color_rgb[2] //(2**3)) }}" + continue_on_error: true + ### TIME Meridiem Font ### + - *delay-default + - service: "{{ nextion.commands.text_printf }}" + data: + component: home.meridiem + message: "{{ meridiem }}" + continue_on_error: true ##### NSPanel Outdoor Temp ##### - variables: outdoor_temp_state: "{{ states(outdoortemp) | default('unavailable') if outdoortemp is string else 'unavailable' }}" outdoor_temp: "{{ outdoor_temp_state if is_number(outdoor_temp_state) else state_attr(weather_entity, 'temperature') | default('unavailable') if weather_entity is string else 'unavailable' }}" - ### LABEL Outdoor Temp Font Color ### - - *delay-default - - service: "{{ nextion.commands.font_color }}" - data: - component: home.outdoor_temp - message: "{{ page_home.general.outdoor_temp.label.color_rgb if is_number(page_home.general.outdoor_temp.label.color_rgb) else ((page_home.general.outdoor_temp.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.outdoor_temp.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.outdoor_temp.label.color_rgb[2] //(2**3)) }}" - continue_on_error: true - ### LABEL Outdoor Temp Font ### - - *delay-default - - service: "{{ nextion.commands.text_printf }}" - data: - component: home.outdoor_temp - message: "{{ (outdoor_temp | round(1) ~ temperature_units) if is_number(outdoor_temp) else (mui[language].unavailable if outdoor_temp in ['unavailable', 'unknown', None] else outdoor_temp) }}" - continue_on_error: true + - if: "{{ is_number(outdoor_temp) }}" + then: + ### LABEL Outdoor Temp Font Color ### + - *delay-default + - service: "{{ nextion.commands.font_color }}" + data: + component: home.outdoor_temp + message: "{{ page_home.general.outdoor_temp.label.color_rgb if is_number(page_home.general.outdoor_temp.label.color_rgb) else ((page_home.general.outdoor_temp.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.outdoor_temp.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.outdoor_temp.label.color_rgb[2] //(2**3)) }}" + continue_on_error: true + ### LABEL Outdoor Temp Font ### + - *delay-default + - service: "{{ nextion.commands.text_printf }}" + data: + component: home.outdoor_temp + message: "{{ outdoor_temp | round(1) ~ temperature_units }}" + continue_on_error: true ##### NSPanel Indoor Temp ##### - variables: indoor_temp_state: "{{ states(indoortemp) | default('unavailable') if indoortemp is string else 'unavailable' }}" - ### ICON Indoor Temp Font Color ### - - *delay-default - - service: "{{ nextion.commands.font_color }}" - data: - component: home.indoortempicon - message: "{{ page_home.general.indoor_temp.icon.color_rgb if is_number(page_home.general.indoor_temp.icon.color_rgb) else ((page_home.general.indoor_temp.icon.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.indoor_temp.icon.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.indoor_temp.icon.color_rgb[2] //(2**3)) }}" - continue_on_error: true - ### ICON Indoor Temp Font ### - - *delay-default - - service: "{{ nextion.commands.text_printf }}" - data: - component: home.indoortempicon - message: "{{ page_home.general.indoor_temp.icon.icon }}" - continue_on_error: true - ### LABEL Indoor Temp Font Color ### - - *delay-default - - service: "{{ nextion.commands.font_color }}" - data: - component: home.current_temp - message: "{{ page_home.general.indoor_temp.label.color_rgb if is_number(page_home.general.indoor_temp.label.color_rgb) else ((page_home.general.indoor_temp.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.indoor_temp.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.indoor_temp.label.color_rgb[2] //(2**3)) }}" - continue_on_error: true - ### LABEL Indoor Temp Font ### - - *delay-default - - service: "{{ nextion.commands.text_printf }}" - data: - component: home.current_temp - message: "{{ (indoor_temp_state | round(1) ~ temperature_units) if is_number(indoor_temp_state) else (mui[language].unavailable if indoor_temp_state in ['unavailable', 'unknown', None] else indoor_temp_state) }}" - continue_on_error: true + - if: "{{ is_number(indoor_temp_state) }}" + then: + ### ICON Indoor Temp Font Color ### + - *delay-default + - service: "{{ nextion.commands.font_color }}" + data: + component: home.indoortempicon + message: "{{ page_home.general.indoor_temp.icon.color_rgb if is_number(page_home.general.indoor_temp.icon.color_rgb) else ((page_home.general.indoor_temp.icon.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.indoor_temp.icon.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.indoor_temp.icon.color_rgb[2] //(2**3)) }}" + continue_on_error: true + ### ICON Indoor Temp Font ### + - *delay-default + - service: "{{ nextion.commands.text_printf }}" + data: + component: home.indoortempicon + message: "{{ page_home.general.indoor_temp.icon.icon }}" + continue_on_error: true + ### LABEL Indoor Temp Font Color ### + - *delay-default + - service: "{{ nextion.commands.font_color }}" + data: + component: home.current_temp + message: "{{ page_home.general.indoor_temp.label.color_rgb if is_number(page_home.general.indoor_temp.label.color_rgb) else ((page_home.general.indoor_temp.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.indoor_temp.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.indoor_temp.label.color_rgb[2] //(2**3)) }}" + continue_on_error: true + ### LABEL Indoor Temp Font ### + - *delay-default + - service: "{{ nextion.commands.text_printf }}" + data: + component: home.current_temp + message: "{{ (indoor_temp_state | round(1) ~ temperature_units) if is_number(indoor_temp_state) else (mui[language].unavailable if indoor_temp_state in ['unavailable', 'unknown', None] else indoor_temp_state) }}" + continue_on_error: true ##### Weather Icon Home Page ##### - *delay-default @@ -4013,19 +4020,24 @@ action: - &display-home_page_status_bar if: "{{ repeat.item.entity is defined and repeat.item.entity is string and repeat.item.entity | length > 0 }}" then: - ### ICON Font Color ### - - *delay-default - - service: "{{ nextion.commands.font_color }}" - data: - component: "{{ 'home.icon_top_%02d' | format(repeat.index) }}" - message: "{{ repeat.item.icon_color_rgb if is_number(repeat.item.icon_color_rgb) else ((repeat.item.icon_color_rgb[0] //(2**3)) *(2**11))+((repeat.item.icon_color_rgb[1] //(2**2)) *(2**5))+(repeat.item.icon_color_rgb[2] //(2**3)) }}" - continue_on_error: true + - variables: + repeat_item_state: "{{ states(repeat.item.entity) | default('unavailable') }}" + repeat_item_state_is_on: "{{ repeat_item_state in ['on', 'open'] }}" + - if: "{{ repeat_item_state_is_on }}" + then: + ### ICON Font Color ### + - *delay-default + - service: "{{ nextion.commands.font_color }}" + data: + component: "{{ 'home.icon_top_%02d' | format(repeat.index) }}" + message: "{{ repeat.item.icon_color_rgb if is_number(repeat.item.icon_color_rgb) else ((repeat.item.icon_color_rgb[0] //(2**3)) *(2**11))+((repeat.item.icon_color_rgb[1] //(2**2)) *(2**5))+(repeat.item.icon_color_rgb[2] //(2**3)) }}" + continue_on_error: true ### ICON Font ### - *delay-default - service: "{{ nextion.commands.text_printf }}" data: component: "{{ 'home.icon_top_%02d' | format(repeat.index) }}" - message: "{{ repeat.item.icon if is_state(repeat.item.entity, 'on') | default(False) else nextion.icons.blank }}" + message: "{{ repeat.item.icon if repeat_item_state_is_on else nextion.icons.blank }}" continue_on_error: true # {{ is_state(repeat.item.entity, 'on') | default(False) if repeat.item.entity is string else 'unavailable' }} @@ -4052,7 +4064,7 @@ action: - &display-home_page_value if: "{{ repeat.item.entity is string and repeat.item.entity is match 'sensor.' and states(repeat.item.entity) not in ['unavailable', 'unknown', None] }}" then: - - if: "{{ repeat.item.entity_icon | length > 0 }}" + - if: "{{ repeat.item.icon | length > 0 }}" then: ### ICON Font Color ### - *delay-default @@ -4068,42 +4080,50 @@ action: component: "{{ 'home.value%02d_icon' | format(repeat.index) }}" message: "{{ repeat.item.icon }}" continue_on_error: true - ### LABEL Font Color ### - - *delay-default - - service: "{{ nextion.commands.font_color }}" - data: - component: "{{ 'home.value%02d_state' | format(repeat.index) }}" - message: "{{ repeat.item.label_color_rgb if is_number(repeat.item.label_color_rgb) else ((repeat.item.label_color_rgb[0] //(2**3)) *(2**11))+((repeat.item.label_color_rgb[1] //(2**2)) *(2**5))+(repeat.item.label_color_rgb[2] //(2**3)) }}" - continue_on_error: true - ### LABEL Font ### - - *delay-default - - service: "{{ nextion.commands.text_printf }}" - data: - component: "{{ 'home.value%02d_state' | format(repeat.index) }}" - message: "{{ (states(repeat.item.entity) | round(1) ~ (state_attr(repeat.item.entity, 'unit_of_measurement') if state_attr(repeat.item.entity, 'unit_of_measurement') else '')) if is_number(states(repeat.item.entity)) else states(repeat.item.entity) | default('unknown') }}" - continue_on_error: true + - variables: + repeat_item_state: "{{ states(repeat.item.entity) | default('unavailable') }}" + repeat_item_state_available: "{{ repeat_item_state not in ['unavailable', 'unknown', None] }}" + - if: "{{ repeat_item_state_available }}" + then: + ### LABEL Font Color ### + - *delay-default + - service: "{{ nextion.commands.font_color }}" + data: + component: "{{ 'home.value%02d_state' | format(repeat.index) }}" + message: "{{ repeat.item.label_color_rgb if is_number(repeat.item.label_color_rgb) else ((repeat.item.label_color_rgb[0] //(2**3)) *(2**11))+((repeat.item.label_color_rgb[1] //(2**2)) *(2**5))+(repeat.item.label_color_rgb[2] //(2**3)) }}" + continue_on_error: true + ### LABEL Font ### + - *delay-default + - service: "{{ nextion.commands.text_printf }}" + data: + component: "{{ 'home.value%02d_state' | format(repeat.index) }}" + message: "{{ (repeat_item_state | round(1) ~ state_attr(repeat.item.entity, 'unit_of_measurement') | default('')) if is_number(repeat_item_state) else repeat_item_state }}" + continue_on_error: true ##### Set notify icon ##### - variables: notification_unread_state: "{{ states(notification_unread) | default('unavailable') if notification_unread is string else 'unavailable' }}" - notification_text_state: "{{ states(notification_text) | default(None) if notification_text is string else None }}" - set_button04_icon: "{{ page_home.buttons[3].icon if notification_unread_state in ['on', 'off'] and notification_text_state | length > 0 else nextion.icons.blank }}" - set_button04_icon_font: "{{ (page_home.buttons[3].color_rgb[notification_unread_state] if is_number(page_home.buttons[3].color_rgb[notification_unread_state]) else ((page_home.buttons[3].color_rgb[notification_unread_state][0] //(2**3)) *(2**11))+((page_home.buttons[3].color_rgb[notification_unread_state][1] //(2**2)) *(2**5))+(page_home.buttons[3].color_rgb[notification_unread_state][2] //(2**3))) if notification_unread_state in ['on', 'off'] and notification_text_state | length > 0 else nextion.colors.grey_light }}" - ##### SET ICON Font - Notify ##### - - *delay-default - - service: "{{ nextion.commands.text_printf }}" - data: - component: home.button04_icon - message: "{{ set_button04_icon }}" - continue_on_error: true + - if: "{{ notification_unread_state in ['on', 'off'] }}" + then: + - variables: + notification_text_state: "{{ states(notification_text) | default(None) if notification_text is string else None }}" + set_button04_icon: "{{ page_home.buttons[3].icon if notification_unread_state == 'on' and notification_text_state | length > 0 else nextion.icons.blank }}" + set_button04_icon_font: "{{ (page_home.buttons[3].color_rgb[notification_unread_state] if is_number(page_home.buttons[3].color_rgb[notification_unread_state]) else ((page_home.buttons[3].color_rgb[notification_unread_state][0] //(2**3)) *(2**11))+((page_home.buttons[3].color_rgb[notification_unread_state][1] //(2**2)) *(2**5))+(page_home.buttons[3].color_rgb[notification_unread_state][2] //(2**3))) if notification_unread_state in ['on', 'off'] and notification_text_state | length > 0 else nextion.colors.grey_light }}" + ##### SET ICON Font - Notify ##### + - *delay-default + - service: "{{ nextion.commands.text_printf }}" + data: + component: home.button04_icon + message: "{{ set_button04_icon }}" + continue_on_error: true - ##### SET ICON Font Color - Notify ##### - - *delay-default - - service: "{{ nextion.commands.font_color }}" - data: - component: home.button04_icon - message: "{{ set_button04_icon_font }}" - continue_on_error: true + ##### SET ICON Font Color - Notify ##### + - *delay-default + - service: "{{ nextion.commands.font_color }}" + data: + component: home.button04_icon + message: "{{ set_button04_icon_font }}" + continue_on_error: true ###### QR Code - Icon ###### - *delay-default @@ -4447,6 +4467,7 @@ action: - alias: Light settings page conditions: "{{ trigger.event.data.new_state.state == nextion.pages.light }}" sequence: + - *variables-settings_entity - service: "{{ nextion.commands.text_printf }}" data: component: lightsettings.light_name @@ -4535,6 +4556,7 @@ action: conditions: "{{ trigger.event.data.new_state.state == nextion.pages.cover }}" sequence: ##### COVER - OPEN / CLOSE ##### + - *variables-settings_entity - variables: coversettings_icon_font: "{{ entity_long_icon if entity_long_icon | length > 0 else nextion.icons.buttons.cover }}" coversettings_icon_font_color: "{{ entity_long_icon_color if is_state(entity_long, 'open') else nextion.colors.grey_light }}" @@ -4797,6 +4819,7 @@ action: - alias: Climate page conditions: "{{ trigger.event.data.new_state.state == nextion.pages.climate }}" sequence: + - *variables-settings_entity - variables: hvac_mode: "{{ states(entity_long) | default('unavailable') if entity_long is string else 'unavailable' }}" outdoor_temp_state: "{{ states(outdoortemp) | default('unavailable') if outdoortemp is string else 'unavailable' }}" @@ -5014,7 +5037,7 @@ action: message: "{{ mui[language].unavailable }}" continue_on_error: true - *delay-default - + ## PAGE NOTIFICATION ## - alias: Notification page conditions: "{{ trigger.event.data.new_state.state == nextion.pages.notification }}" @@ -5148,13 +5171,13 @@ action: - variables: ##### Entity - Page Button - Toggle Entity ##### last_click_state: "{{ states(last_click) | default('unavailable') if last_click is string else 'unavailable' }}" - last_click_coordinates: "{{ last_click_state.replace('releasebuttonpage', '').split('button') if last_click_state not in ['unavailable', 'unknown', None] else [-1, -1] }}" - last_click_entity_index: "{{ (last_click_coordinates[0] | int(-99) -1)*8 + last_click_coordinates[1] | int(-99) - 1 }}" + last_click_coordinates: "{{ last_click_state.replace('releasebuttonpage', '').split('button') if last_click_state not in ['unavailable', 'unknown', None] else None }}" + last_click_entity_index: "{{ (last_click_coordinates[0] | int(-99) -1)*8 + last_click_coordinates[1] | int(-99) - 1 if last_click_coordinates and last_click_coordinates | count >= 1 else -1 }}" - condition: "{{ last_click_entity_index >= 0 }}" - variables: last_click_button: "{{ button_pages_buttons[last_click_entity_index] | default([]) }}" entity_short: "{{ last_click_button.entity | default('unavailable') if last_click_button and last_click_button.entity is defined }}" - entity_domain: "{{ (entity_short.split('.')[0] | default('unknown')) if entity_short is string and entity_short | length > 0 else 'unknown' }}" + entity_domain: "{{ (entity_short.split('.')[0] | default('unknown')) if entity_short is string and entity_short | length > 0 and entity_short.split('.') | count > 0 else 'unknown' }}" - condition: "{{ entity_domain not in ['unknown', 'person', 'binary_sensor', 'sensor'] }}" - if: "{{ entity_domain == 'climate' }}" then: @@ -5290,6 +5313,7 @@ action: id: light_settings - "{{ nextion.pages.current == nextion.pages.light }}" sequence: + - *variables-settings_entity - choose: ##### Page Lightsettings - Brightness Slider MOVE ##### - conditions: @@ -5376,6 +5400,7 @@ action: id: cover_settings - "{{ nextion.pages.current == nextion.pages.cover }}" sequence: + - *variables-settings_entity - choose: ##### Page Coversettings - Cover Slider MOVE ##### - conditions: @@ -5444,6 +5469,7 @@ action: id: climate_settings - "{{ nextion.pages.current == nextion.pages.climate }}" sequence: + - *variables-settings_entity - variables: entity_long_state: "{{ states(entity_long) | default('unavailable') if entity_long is string else 'unavailable' }}" - choose: