From 51170c514d9f2520a07883a35dcced47d9bb6424 Mon Sep 17 00:00:00 2001 From: deejaybeam Date: Tue, 7 Feb 2023 19:33:02 +0100 Subject: [PATCH 01/11] fix: ignore unassigned hw-buttons --- nspanel_blueprint.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index a59509c..56a3984 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -4999,6 +4999,8 @@ action: - conditions: - condition: trigger id: left_button_press + - condition: template + value_template: '{{ left_button_entity |length > 0 }}' sequence: - service: >- {% if left_button_entity is match 'light.' %} @@ -5050,6 +5052,8 @@ action: - conditions: - condition: trigger id: right_button_press + - condition: template + value_template: '{{ right_button_entity |length > 0 }}' sequence: - service: >- {% if right_button_entity is match 'light.' %} From 5ba5d2fb08ee871a35397f093fff9d1ab0bec459 Mon Sep 17 00:00:00 2001 From: deejaybeam Date: Wed, 8 Feb 2023 22:24:17 +0100 Subject: [PATCH 02/11] fix: issue on ha-restart --- nspanel_blueprint.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index 56a3984..da58510 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -3271,7 +3271,7 @@ trigger: ############################################################# ##### START - Action ##### ############################################################# - +condition: '{{ states(relay01_entity) != "unavailable" and states(relay02_entity) != "unavailable" }}' action: - variables: ##### Entity - Page Lightsettings ##### From a22311c4e862989662f70360cd3551cef33de1f2 Mon Sep 17 00:00:00 2001 From: deejaybeam Date: Fri, 10 Feb 2023 20:56:14 +0100 Subject: [PATCH 03/11] upd: prep for release 3.1.1 --- nspanel_blueprint.yaml | 839 +++++++++++++++++++++++------------------ nspanel_esphome.yaml | 94 ++--- 2 files changed, 495 insertions(+), 438 deletions(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index da58510..5f1e240 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -32,7 +32,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l 🎉 Roadmap Roadmap can be found here [Roadmap](https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/roadmap) -ℹ️ Version: v.3.1.0 +ℹ️ Version: v.3.1.1 ' @@ -256,6 +256,16 @@ The goal was to create a version that allows everyone to use the NSpanel fully l text: {} ##### HARDWARE BUTTONS ##### + hold_delay: + name: Delay for HW-Button hold in seconds + description: '* *Time in seconds to detect a hold*' + default: 1.0 + selector: + number: + min: 1.0 + max: 10.0 + step: 1.0 + unit_of_measurement: seconds left_button_entity: name: Left Button (Optional) description: '* *Left Hardware Button - Select the entity that should be switched*' @@ -285,6 +295,21 @@ The goal was to create a version that allows everyone to use the NSpanel fully l description: '* *activate this to use left button to toggle relay 1 if display is offline* ' selector: boolean: + left_button_hold_select: + name: Left button hold assignment (Optional) + description: '* *select what shold happen on hold*' + default: 'Default' + selector: + select: + options: + - Default + - Custom Action + left_button_hold_custom_action: + name: Left button custom hold action (Optional) + description: '* The action(s) to launch on hold**' + default: [] + selector: + action: right_button_entity: name: Right Button (Optional) description: '* *Right Hardware Button - Select the entity that should be switched*' @@ -314,6 +339,21 @@ The goal was to create a version that allows everyone to use the NSpanel fully l description: '* *activate this to use right button to toggle relay 2 if display is offline* ' selector: boolean: + right_button_hold_select: + name: Right button hold assignment (Optional) + description: '* *select what shold happen on hold*' + default: 'Default' + selector: + select: + options: + - Default + - Custom Action + right_button_hold_custom_action: + name: Right button custom hold action (Optional) + description: '* The action(s) to launch on hold**' + default: [] + selector: + action: ##### BUTTON Page Labels ##### button_page01_label: @@ -2001,28 +2041,29 @@ trace: ############################################################# trigger_variables: - nspanel_name_trigger: !input "nspanel_name" - last_click: "sensor.{{ nspanel_name_trigger }}_last_click" - last_click_lightsettings: "sensor.{{ nspanel_name_trigger }}_last_click_lightsettings" - last_click_coversettings: "sensor.{{ nspanel_name_trigger }}_last_click_coversettings" - last_click_climatesettings: "sensor.{{ nspanel_name_trigger }}_last_click_climatesettings" - left_button: "binary_sensor.{{ nspanel_name_trigger }}_left_button" - right_button: "binary_sensor.{{ nspanel_name_trigger }}_right_button" - weather_forcast_button: "binary_sensor.{{ nspanel_name_trigger }}_weather_forcast" - nextion_inited_trigger: "switch.{{ nspanel_name_trigger }}_nextion_inited" - # current_page: "sensor.{{ nspanel_name_trigger }}_current_page" - current_page: "sensor.{{ nspanel_name_trigger }}_currentpage" + nspanel_name: !input "nspanel_name" + last_click: "sensor.{{ nspanel_name }}_last_click" + last_click_lightsettings: "sensor.{{ nspanel_name }}_last_click_lightsettings" + last_click_coversettings: "sensor.{{ nspanel_name }}_last_click_coversettings" + last_click_climatesettings: "sensor.{{ nspanel_name }}_last_click_climatesettings" + left_button: "binary_sensor.{{ nspanel_name }}_left_button" + right_button: "binary_sensor.{{ nspanel_name }}_right_button" + weather_forcast_button: "binary_sensor.{{ nspanel_name }}_weather_forcast" + nextion_inited_trigger: "switch.{{ nspanel_name }}_nextion_inited" + # current_page: "sensor.{{ nspanel_name }}_current_page" + current_page: "sensor.{{ nspanel_name }}_currentpage" hotwatercharge: !input "hotwatercharge" heatingsystemflame: !input "heatingsystemflame" - display_target_temperature: "sensor.{{ nspanel_name_trigger }}_display_target_temperature" - relay01_entity: "switch.{{ nspanel_name_trigger }}_relay_1" - relay02_entity: "switch.{{ nspanel_name_trigger }}_relay_2" - nspaneltemp: "sensor.{{ nspanel_name_trigger }}_temperature" + display_target_temperature: "sensor.{{ nspanel_name }}_display_target_temperature" + relay01_entity: "switch.{{ nspanel_name }}_relay_1" + relay02_entity: "switch.{{ nspanel_name }}_relay_2" + nspaneltemp: "sensor.{{ nspanel_name }}_temperature" + settings_entity: "sensor.{{ nspanel_name }}_settings_entity" ##### notification Trigger ##### - notification_unread: "switch.{{ nspanel_name_trigger }}_notification_unread" - notification_text: "sensor.{{ nspanel_name_trigger }}_notification_text" - notification_label: "sensor.{{ nspanel_name_trigger }}_notification_label" + notification_unread: "switch.{{ nspanel_name }}_notification_unread" + notification_text: "sensor.{{ nspanel_name }}_notification_text" + notification_label: "sensor.{{ nspanel_name }}_notification_label" ##### WEATHER Trigger ##### weather: !input "weather" @@ -2031,13 +2072,12 @@ trigger_variables: variables: ##### GENERAL ##### - blueprint_version: "3.1.0" - nspanel_name: !input "nspanel_name" + blueprint_version: "3.1.1" time: "{{ (as_timestamp(now()) | timestamp_custom('%H:%M')) }}" language: !input "language" - notification_sound: "switch.{{ nspanel_name_trigger }}_notification_sound" - confirmation_message: "switch.{{ nspanel_name_trigger }}_confirmation_message" + notification_sound: "switch.{{ nspanel_name }}_notification_sound" + confirmation_message: "switch.{{ nspanel_name }}_confirmation_message" ##### PUSH TO NEXTION DISPLAY ##### command_text_printf: "esphome.{{ nspanel_name }}_send_command_text_printf" @@ -2049,6 +2089,7 @@ variables: command_notification_show: "esphome.{{ nspanel_name }}_notification_show" command_notification_clear: "esphome.{{ nspanel_name }}_notification_clear" command_play_rtttl: "esphome.{{ nspanel_name }}_play_rtttl" + command_set_settings_entity: "esphome.{{ nspanel_name }}_set_settings_entity" ###### SYNC SETTINGS ##### delay_boot: !input "delay" @@ -2079,6 +2120,8 @@ variables: left_button_name: !input "left_button_name" right_button_entity: !input "right_button_entity" right_button_name: !input "right_button_name" + left_button_hold_select: !input "left_button_hold_select" + right_button_hold_select: !input "right_button_hold_select" ##### NEXTION PIC MAPPING ##### button_light_off: "62" @@ -2883,8 +2926,17 @@ trigger: ##### Reboot - Trigger "nspanel_boot_init" ##### - platform: template value_template: '{{ states(nextion_inited_trigger) is match "on" }}' + for: + seconds: 1 id: nspanel_boot_init + ##### settings_entity - Trigger "settings_entity" ##### + - platform: event + event_type: state_changed + event_data: + entity_id: "{{ settings_entity }}" + id: settings_entity + ##### Automation reload - platform: event event_type: automation_reloaded @@ -3271,122 +3323,24 @@ trigger: ############################################################# ##### START - Action ##### ############################################################# -condition: '{{ states(relay01_entity) != "unavailable" and states(relay02_entity) != "unavailable" }}' +#condition: '{{ states(relay01_entity) != "unavailable" and states(relay02_entity) != "unavailable" }}' +condition: '{{ states(nextion_inited_trigger) == "on" }}' action: - variables: - ##### Entity - Page Lightsettings ##### + settings_entity_value: '{{ states(settings_entity) }}' entity_long: >- - {%- if states(last_click) == "pressbuttonpage01button01" -%} {{ entity01 }} - {%- elif states(last_click) == "pressbuttonpage01button02" -%} {{ entity02 }} - {%- elif states(last_click) == "pressbuttonpage01button03" -%} {{ entity03 }} - {%- elif states(last_click) == "pressbuttonpage01button04" -%} {{ entity04 }} - {%- elif states(last_click) == "pressbuttonpage01button05" -%} {{ entity05 }} - {%- elif states(last_click) == "pressbuttonpage01button06" -%} {{ entity06 }} - {%- elif states(last_click) == "pressbuttonpage01button07" -%} {{ entity07 }} - {%- elif states(last_click) == "pressbuttonpage01button08" -%} {{ entity08 }} - {%- elif states(last_click) == "pressbuttonpage02button01" -%} {{ entity09 }} - {%- elif states(last_click) == "pressbuttonpage02button02" -%} {{ entity10 }} - {%- elif states(last_click) == "pressbuttonpage02button03" -%} {{ entity11 }} - {%- elif states(last_click) == "pressbuttonpage02button04" -%} {{ entity12 }} - {%- elif states(last_click) == "pressbuttonpage02button05" -%} {{ entity13 }} - {%- elif states(last_click) == "pressbuttonpage02button06" -%} {{ entity14 }} - {%- elif states(last_click) == "pressbuttonpage02button07" -%} {{ entity15 }} - {%- elif states(last_click) == "pressbuttonpage02button08" -%} {{ entity16 }} - {%- elif states(last_click) == "pressbuttonpage03button01" -%} {{ entity17 }} - {%- elif states(last_click) == "pressbuttonpage03button02" -%} {{ entity18 }} - {%- elif states(last_click) == "pressbuttonpage03button03" -%} {{ entity19 }} - {%- elif states(last_click) == "pressbuttonpage03button04" -%} {{ entity20 }} - {%- elif states(last_click) == "pressbuttonpage03button05" -%} {{ entity21 }} - {%- elif states(last_click) == "pressbuttonpage03button06" -%} {{ entity22 }} - {%- elif states(last_click) == "pressbuttonpage03button07" -%} {{ entity23 }} - {%- elif states(last_click) == "pressbuttonpage03button08" -%} {{ entity24 }} - {%- elif states(last_click) == "pressbuttonpage04button01" -%} {{ entity25 }} - {%- elif states(last_click) == "pressbuttonpage04button02" -%} {{ entity26 }} - {%- elif states(last_click) == "pressbuttonpage04button03" -%} {{ entity27 }} - {%- elif states(last_click) == "pressbuttonpage04button04" -%} {{ entity28 }} - {%- elif states(last_click) == "pressbuttonpage04button05" -%} {{ entity29 }} - {%- elif states(last_click) == "pressbuttonpage04button06" -%} {{ entity30 }} - {%- elif states(last_click) == "pressbuttonpage04button07" -%} {{ entity31 }} - {%- elif states(last_click) == "pressbuttonpage04button08" -%} {{ entity32 }} - {%- elif states(last_click) == "pressbuttonleft" -%} {{ left_button_entity }} - {%- elif states(last_click) == "pressbuttonright" -%} {{ right_button_entity }} + {%- if settings_entity_value != "unknown" -%} {{ settings_entity_value.split(',')[0] }} + {%- else -%} unknown {%- endif -%} - - ##### Entity Name - Page Lightsettings ##### entity_long_name: >- - {%- if states(last_click) == "pressbuttonpage01button01" -%} {{ entity01_name }} - {%- elif states(last_click) == "pressbuttonpage01button02" -%} {{ entity02_name }} - {%- elif states(last_click) == "pressbuttonpage01button03" -%} {{ entity03_name }} - {%- elif states(last_click) == "pressbuttonpage01button04" -%} {{ entity04_name }} - {%- elif states(last_click) == "pressbuttonpage01button05" -%} {{ entity05_name }} - {%- elif states(last_click) == "pressbuttonpage01button06" -%} {{ entity06_name }} - {%- elif states(last_click) == "pressbuttonpage01button07" -%} {{ entity07_name }} - {%- elif states(last_click) == "pressbuttonpage01button08" -%} {{ entity08_name }} - {%- elif states(last_click) == "pressbuttonpage02button01" -%} {{ entity09_name }} - {%- elif states(last_click) == "pressbuttonpage02button02" -%} {{ entity10_name }} - {%- elif states(last_click) == "pressbuttonpage02button03" -%} {{ entity11_name }} - {%- elif states(last_click) == "pressbuttonpage02button04" -%} {{ entity12_name }} - {%- elif states(last_click) == "pressbuttonpage02button05" -%} {{ entity13_name }} - {%- elif states(last_click) == "pressbuttonpage02button06" -%} {{ entity14_name }} - {%- elif states(last_click) == "pressbuttonpage02button07" -%} {{ entity15_name }} - {%- elif states(last_click) == "pressbuttonpage02button08" -%} {{ entity16_name }} - {%- elif states(last_click) == "pressbuttonpage03button01" -%} {{ entity17_name }} - {%- elif states(last_click) == "pressbuttonpage03button02" -%} {{ entity18_name }} - {%- elif states(last_click) == "pressbuttonpage03button03" -%} {{ entity19_name }} - {%- elif states(last_click) == "pressbuttonpage03button04" -%} {{ entity20_name }} - {%- elif states(last_click) == "pressbuttonpage03button05" -%} {{ entity21_name }} - {%- elif states(last_click) == "pressbuttonpage03button06" -%} {{ entity22_name }} - {%- elif states(last_click) == "pressbuttonpage03button07" -%} {{ entity23_name }} - {%- elif states(last_click) == "pressbuttonpage03button08" -%} {{ entity24_name }} - {%- elif states(last_click) == "pressbuttonpage04button01" -%} {{ entity25_name }} - {%- elif states(last_click) == "pressbuttonpage04button02" -%} {{ entity26_name }} - {%- elif states(last_click) == "pressbuttonpage04button03" -%} {{ entity27_name }} - {%- elif states(last_click) == "pressbuttonpage04button04" -%} {{ entity28_name }} - {%- elif states(last_click) == "pressbuttonpage04button05" -%} {{ entity29_name }} - {%- elif states(last_click) == "pressbuttonpage04button06" -%} {{ entity30_name }} - {%- elif states(last_click) == "pressbuttonpage04button07" -%} {{ entity31_name }} - {%- elif states(last_click) == "pressbuttonpage04button08" -%} {{ entity32_name }} - {%- elif states(last_click) == "pressbuttonleft" -%} {{ left_button_name }} - {%- elif states(last_click) == "pressbuttonright" -%} {{ right_button_name }} + {%- if settings_entity_value != "unknown" -%} {{ settings_entity_value.split(',')[2] }} + {%- else -%} unknown + {%- endif -%} + entity_back: >- + {%- if settings_entity_value != "unknown" -%} {{ settings_entity_value.split(',')[1] }} + {%- else -%} unknown {%- endif -%} - ##### Entity - Page Lightsettings - Skip Back ##### - entity_back: >- - {%- if states(last_click) == "pressbuttonpage01button01" -%} {{ "page buttonpage01" }} - {%- elif states(last_click) == "pressbuttonpage01button02" -%} {{ "page buttonpage01" }} - {%- elif states(last_click) == "pressbuttonpage01button03" -%} {{ "page buttonpage01" }} - {%- elif states(last_click) == "pressbuttonpage01button04" -%} {{ "page buttonpage01" }} - {%- elif states(last_click) == "pressbuttonpage01button05" -%} {{ "page buttonpage01" }} - {%- elif states(last_click) == "pressbuttonpage01button06" -%} {{ "page buttonpage01" }} - {%- elif states(last_click) == "pressbuttonpage01button07" -%} {{ "page buttonpage01" }} - {%- elif states(last_click) == "pressbuttonpage01button08" -%} {{ "page buttonpage01" }} - {%- elif states(last_click) == "pressbuttonpage02button01" -%} {{ "page buttonpage02" }} - {%- elif states(last_click) == "pressbuttonpage02button02" -%} {{ "page buttonpage02" }} - {%- elif states(last_click) == "pressbuttonpage02button03" -%} {{ "page buttonpage02" }} - {%- elif states(last_click) == "pressbuttonpage02button04" -%} {{ "page buttonpage02" }} - {%- elif states(last_click) == "pressbuttonpage02button05" -%} {{ "page buttonpage02" }} - {%- elif states(last_click) == "pressbuttonpage02button06" -%} {{ "page buttonpage02" }} - {%- elif states(last_click) == "pressbuttonpage02button07" -%} {{ "page buttonpage02" }} - {%- elif states(last_click) == "pressbuttonpage02button08" -%} {{ "page buttonpage02" }} - {%- elif states(last_click) == "pressbuttonpage03button01" -%} {{ "page buttonpage03" }} - {%- elif states(last_click) == "pressbuttonpage03button02" -%} {{ "page buttonpage03" }} - {%- elif states(last_click) == "pressbuttonpage03button03" -%} {{ "page buttonpage03" }} - {%- elif states(last_click) == "pressbuttonpage03button04" -%} {{ "page buttonpage03" }} - {%- elif states(last_click) == "pressbuttonpage03button05" -%} {{ "page buttonpage03" }} - {%- elif states(last_click) == "pressbuttonpage03button06" -%} {{ "page buttonpage03" }} - {%- elif states(last_click) == "pressbuttonpage03button07" -%} {{ "page buttonpage03" }} - {%- elif states(last_click) == "pressbuttonpage03button08" -%} {{ "page buttonpage03" }} - {%- elif states(last_click) == "pressbuttonpage04button01" -%} {{ "page buttonpage04" }} - {%- elif states(last_click) == "pressbuttonpage04button02" -%} {{ "page buttonpage04" }} - {%- elif states(last_click) == "pressbuttonpage04button03" -%} {{ "page buttonpage04" }} - {%- elif states(last_click) == "pressbuttonpage04button04" -%} {{ "page buttonpage04" }} - {%- elif states(last_click) == "pressbuttonpage04button05" -%} {{ "page buttonpage04" }} - {%- elif states(last_click) == "pressbuttonpage04button06" -%} {{ "page buttonpage04" }} - {%- elif states(last_click) == "pressbuttonpage04button07" -%} {{ "page buttonpage04" }} - {%- elif states(last_click) == "pressbuttonpage04button08" -%} {{ "page buttonpage04" }} - {%- elif states(last_click) == "pressbuttonleft" -%} {{ "page home" }} - {%- elif states(last_click) == "pressbuttonright" -%} {{ "page home" }} - {%- endif -%} ######################################################################################################################## @@ -3658,7 +3612,7 @@ action: ##### Update home-buttons on automation-reload only ##### - if: - condition: template - value_template: '{{ states(current_page) == page_home }}' + value_template: '{{ trigger.id == "automation_reloaded" and states(current_page) == page_home }}' then: ###### QR Code - Icon ###### - if: @@ -3694,10 +3648,34 @@ action: data: cmd: "homebt06_pic.pic={{ home_button_blank }}" + ##### NSPanel Left Button Name ##### + - if: + - condition: template + value_template: '{{ left_button_name |length > 0 }}' + then: + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: home.left_bt_text + message: "{{ left_button_name }}" + + ##### NSPanel Right Button Name ##### + - if: + - condition: template + value_template: '{{ right_button_name |length > 0 }}' + then: + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: home.right_bt_text + message: "{{ right_button_name }}" + ##### NSPanel boot init only ##### - if: - condition: template - value_template: '{{ trigger.id == "nspanel_boot_init" }}' + value_template: '{{ trigger.id == "nspanel_boot_init" and states(current_page) != page_home }}' then: ###### INIT Notify ###### - service: "{{ command_notification_clear }}" @@ -4145,7 +4123,8 @@ action: ##### LIGHTSETTINGS PAGE - LIGHT Entity ##### - conditions: - condition: template - value_template: '{{ entity_long is match "light." }}' + # value_template: '{{ entity_long is match "light." }}' TODO + value_template: '{{ states(current_page) == page_lightsettings }}' sequence: - choose: ##### LIGHT ON / OFF @@ -4265,7 +4244,8 @@ action: ##### COVERSETTINGS PAGE - COVER Entity ##### - conditions: - condition: template - value_template: '{{ entity_long is match "cover." }}' + # value_template: '{{ entity_long is match "cover." }}' TODO + value_template: '{{ states(current_page) == page_coversettings }}' sequence: ##### COVER OPEN ##### - choose: @@ -4538,179 +4518,85 @@ action: - condition: trigger id: long_press sequence: - - choose: - ##### LONG Press - LIGHT Entity ##### - - conditions: - - condition: template - value_template: '{{ entity_long is match "light." }}' - sequence: - ##### LIGHT Generel Values ##### - - service: "{{ command_printf }}" - data: - cmd: page lightsettings - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: lightsettings.light_name - message: '{{ entity_long_name }}' - - delay: - milliseconds: "{{ delay_value }}" - - if: - - condition: template - value_template: "{{ state_attr(entity_long, 'brightness') != none }}" - then: - - service: "{{ command_value }}" - data: - component: lightsettings.lightslider - message: '{{ (state_attr(entity_long, "brightness") | int ) |round(0) }}' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: lightsettings.light_value - message: '{{ (state_attr(entity_long, "brightness") | int * 100 /255) | round(0) }}%' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: lightsettings.light_value_2 - message: '{{ (state_attr(entity_long, "brightness") | int * 100 /255) | round(0) }}%' - else: - - service: "{{ command_value }}" - data: - component: lightsettings.lightslider - message: '0' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: lightsettings.light_value - message: '0 %' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: lightsettings.light_value_2 - message: '0 %' - - ##### LIGHT Check Color_Temp Value is available when yes send some current Values ##### - - if: - - condition: template - value_template: "{{ state_attr(entity_long, 'color_temp') != none }}" - then: - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: lightsettings.temp_value - message: '{{ (state_attr(entity_long, "color_temp") | int ) |round(0) }}' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: lightsettings.temp_value_2 - message: '{{ (state_attr(entity_long, "color_temp") | int ) |round(0) }}' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_value }}" - data: - component: lightsettings.tempslider - message: '{{ (state_attr(entity_long, "color_temp") | int ) |round(0) }}' - - ##### LIGHT ON / OFF ##### - - choose: - ##### LIGHT PIC - ON ##### - - conditions: - - condition: template - value_template: '{{ states(entity_long) == "on" }}' - sequence: - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_printf }}" - data: - cmd: lightsettings.light_status.pic={{ light_pic_on }} - - ##### LIGHT PIC - OFF ##### - - conditions: - - condition: template - value_template: '{{ states(entity_long) == "off" }}' - sequence: - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_printf }}" - data: - cmd: lightsettings.light_status.pic={{ light_pic_off }} - - ##### LONG Press - COVER Entity ##### - - conditions: - - condition: template - value_template: '{{ entity_long is match "cover." }}' - sequence: - ##### COVER Generel Values ##### - - service: "{{ command_printf }}" - data: - cmd: page coversettings - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_value }}" - data: - component: coversettings.coverslider - message: '{{ (state_attr(entity_long, "current_position") | int ) |round(0) }}' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: coversettings.cover_value - message: '{{ (state_attr(entity_long, "current_position") | int ) |round(0) }} %' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: coversettings.cover_name - message: '{{ entity_long_name }}' - - ##### COVER Battery ICON Yes / NO ##### - - if: - - condition: template - value_template: "{{ state_attr(entity_long, 'battery') != none }}" - then: - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_text_printf }}" - data: - component: coversettings.battery_value - message: '{{ (state_attr(entity_long, "battery") | int ) |round(0) }} %' - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_printf }}" - data: - cmd: coversettings.battery_icon.pic={{ battery_icon }} + - variables: + ##### Long Press Entity ##### + entity_long: >- + {%- if trigger.to_state.state == "pressbuttonpage01button01" -%} {{ entity01 }} + {%- elif trigger.to_state.state == "pressbuttonpage01button02" -%} {{ entity02 }} + {%- elif trigger.to_state.state == "pressbuttonpage01button03" -%} {{ entity03 }} + {%- elif trigger.to_state.state == "pressbuttonpage01button04" -%} {{ entity04 }} + {%- elif trigger.to_state.state == "pressbuttonpage01button05" -%} {{ entity05 }} + {%- elif trigger.to_state.state == "pressbuttonpage01button06" -%} {{ entity06 }} + {%- elif trigger.to_state.state == "pressbuttonpage01button07" -%} {{ entity07 }} + {%- elif trigger.to_state.state == "pressbuttonpage01button08" -%} {{ entity08 }} + {%- elif trigger.to_state.state == "pressbuttonpage02button01" -%} {{ entity09 }} + {%- elif trigger.to_state.state == "pressbuttonpage02button02" -%} {{ entity10 }} + {%- elif trigger.to_state.state == "pressbuttonpage02button03" -%} {{ entity11 }} + {%- elif trigger.to_state.state == "pressbuttonpage02button04" -%} {{ entity12 }} + {%- elif trigger.to_state.state == "pressbuttonpage02button05" -%} {{ entity13 }} + {%- elif trigger.to_state.state == "pressbuttonpage02button06" -%} {{ entity14 }} + {%- elif trigger.to_state.state == "pressbuttonpage02button07" -%} {{ entity15 }} + {%- elif trigger.to_state.state == "pressbuttonpage02button08" -%} {{ entity16 }} + {%- elif trigger.to_state.state == "pressbuttonpage03button01" -%} {{ entity17 }} + {%- elif trigger.to_state.state == "pressbuttonpage03button02" -%} {{ entity18 }} + {%- elif trigger.to_state.state == "pressbuttonpage03button03" -%} {{ entity19 }} + {%- elif trigger.to_state.state == "pressbuttonpage03button04" -%} {{ entity20 }} + {%- elif trigger.to_state.state == "pressbuttonpage03button05" -%} {{ entity21 }} + {%- elif trigger.to_state.state == "pressbuttonpage03button06" -%} {{ entity22 }} + {%- elif trigger.to_state.state == "pressbuttonpage03button07" -%} {{ entity23 }} + {%- elif trigger.to_state.state == "pressbuttonpage03button08" -%} {{ entity24 }} + {%- elif trigger.to_state.state == "pressbuttonpage04button01" -%} {{ entity25 }} + {%- elif trigger.to_state.state == "pressbuttonpage04button02" -%} {{ entity26 }} + {%- elif trigger.to_state.state == "pressbuttonpage04button03" -%} {{ entity27 }} + {%- elif trigger.to_state.state == "pressbuttonpage04button04" -%} {{ entity28 }} + {%- elif trigger.to_state.state == "pressbuttonpage04button05" -%} {{ entity29 }} + {%- elif trigger.to_state.state == "pressbuttonpage04button06" -%} {{ entity30 }} + {%- elif trigger.to_state.state == "pressbuttonpage04button07" -%} {{ entity31 }} + {%- elif trigger.to_state.state == "pressbuttonpage04button08" -%} {{ entity32 }} + {%- endif -%} - ##### COVER OPEN / CLOSE - - choose: - ##### COVER PIC - open ##### - - conditions: - - condition: template - value_template: '{{ states(entity_long) == "open" }}' - sequence: - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_printf }}" - data: - cmd: coversettings.cover_status.pic={{ cover_pic_open }} - - ##### COVER PIC - Closed - - conditions: - - condition: template - value_template: '{{ states(entity_long) == "closed" }}' - sequence: - - delay: - milliseconds: "{{ delay_value }}" - - service: "{{ command_printf }}" - data: - cmd: coversettings.cover_status.pic={{ cover_pic_closed }} - + ##### Long Press Entity Name ##### + entity_long_name: >- + {%- if trigger.to_state.state == "pressbuttonpage01button01" -%} {{ entity01_name }} + {%- elif trigger.to_state.state == "pressbuttonpage01button02" -%} {{ entity02_name }} + {%- elif trigger.to_state.state == "pressbuttonpage01button03" -%} {{ entity03_name }} + {%- elif trigger.to_state.state == "pressbuttonpage01button04" -%} {{ entity04_name }} + {%- elif trigger.to_state.state == "pressbuttonpage01button05" -%} {{ entity05_name }} + {%- elif trigger.to_state.state == "pressbuttonpage01button06" -%} {{ entity06_name }} + {%- elif trigger.to_state.state == "pressbuttonpage01button07" -%} {{ entity07_name }} + {%- elif trigger.to_state.state == "pressbuttonpage01button08" -%} {{ entity08_name }} + {%- elif trigger.to_state.state == "pressbuttonpage02button01" -%} {{ entity09_name }} + {%- elif trigger.to_state.state == "pressbuttonpage02button02" -%} {{ entity10_name }} + {%- elif trigger.to_state.state == "pressbuttonpage02button03" -%} {{ entity11_name }} + {%- elif trigger.to_state.state == "pressbuttonpage02button04" -%} {{ entity12_name }} + {%- elif trigger.to_state.state == "pressbuttonpage02button05" -%} {{ entity13_name }} + {%- elif trigger.to_state.state == "pressbuttonpage02button06" -%} {{ entity14_name }} + {%- elif trigger.to_state.state == "pressbuttonpage02button07" -%} {{ entity15_name }} + {%- elif trigger.to_state.state == "pressbuttonpage02button08" -%} {{ entity16_name }} + {%- elif trigger.to_state.state == "pressbuttonpage03button01" -%} {{ entity17_name }} + {%- elif trigger.to_state.state == "pressbuttonpage03button02" -%} {{ entity18_name }} + {%- elif trigger.to_state.state == "pressbuttonpage03button03" -%} {{ entity19_name }} + {%- elif trigger.to_state.state == "pressbuttonpage03button04" -%} {{ entity20_name }} + {%- elif trigger.to_state.state == "pressbuttonpage03button05" -%} {{ entity21_name }} + {%- elif trigger.to_state.state == "pressbuttonpage03button06" -%} {{ entity22_name }} + {%- elif trigger.to_state.state == "pressbuttonpage03button07" -%} {{ entity23_name }} + {%- elif trigger.to_state.state == "pressbuttonpage03button08" -%} {{ entity24_name }} + {%- elif trigger.to_state.state == "pressbuttonpage04button01" -%} {{ entity25_name }} + {%- elif trigger.to_state.state == "pressbuttonpage04button02" -%} {{ entity26_name }} + {%- elif trigger.to_state.state == "pressbuttonpage04button03" -%} {{ entity27_name }} + {%- elif trigger.to_state.state == "pressbuttonpage04button04" -%} {{ entity28_name }} + {%- elif trigger.to_state.state == "pressbuttonpage04button05" -%} {{ entity29_name }} + {%- elif trigger.to_state.state == "pressbuttonpage04button06" -%} {{ entity30_name }} + {%- elif trigger.to_state.state == "pressbuttonpage04button07" -%} {{ entity31_name }} + {%- elif trigger.to_state.state == "pressbuttonpage04button08" -%} {{ entity32_name }} + {%- endif -%} + + ##### Current Page ##### + entity_back: '{{ states(current_page) }}' + - service: '{{ command_set_settings_entity }}' + data: + entity: '{{ entity_long }},{{ entity_back }},{{ entity_long_name }}' + ##### LASTCLICK_LIGHTSETTINGS - Changes on page Light-Settings ##### - conditions: - condition: trigger @@ -4776,9 +4662,12 @@ action: - condition: template value_template: '{{ trigger.event.data.new_state.state == "releaselightsettingsclose" }}' sequence: + - service: '{{ command_set_settings_entity }}' + data: + entity: 'unknown' - service: "{{ command_printf }}" data: - cmd: "{{ entity_back }}" + cmd: "page {{ entity_back }}" ##### LASTCLICK_COVERSETTINGS - Changes on page Cover-Settings ##### - conditions: @@ -4840,9 +4729,12 @@ action: - condition: template value_template: '{{ trigger.event.data.new_state.state == "releasecoversettingsclose" }}' sequence: + - service: '{{ command_set_settings_entity }}' + data: + entity: 'unknown' - service: "{{ command_printf }}" data: - cmd: "{{ entity_back }}" + cmd: "page {{ entity_back }}" ##### LASTCLICK_CLIMATESETTINGS - Changes on page Climate-Settings ##### - conditions: @@ -4998,36 +4890,59 @@ action: ##### Left button press ##### - conditions: - condition: trigger - id: left_button_press - - condition: template - value_template: '{{ left_button_entity |length > 0 }}' + id: left_button_press sequence: - - service: >- - {% if left_button_entity is match 'light.' %} - light.toggle - {% elif left_button_entity is match 'switch.' %} - switch.toggle - {% elif left_button_entity is match 'cover.' %} - cover.toggle - {% elif left_button_entity is match 'input_boolean.' %} - input_boolean.toggle - {% elif left_button_entity is match 'automation.' %} - automation.toggle - {% elif left_button_entity is match 'button.' %} - button.press - {% elif left_button_entity is match 'input_button.' %} - input_button.press - {% elif left_button_entity is match 'scene.' %} - scene.turn_on - {% elif left_button_entity is match 'script.' %} - script.turn_on - {% elif left_button_entity is match 'fan.' %} - fan.toggle - {% endif %} - data: - entity_id: "{{ left_button_entity }}" - - delay: - milliseconds: "{{ delay_value }}" + - wait_template: "{{ is_state(left_button, 'off') }}" + timeout: !input hold_delay + continue_on_timeout: true + - if: + - condition: template + value_template: "{{ not wait.completed }}" + then: # Hold + - choose: + - conditions: '{{ left_button_hold_select == "Default" and left_button_entity |length > 0 }}' + sequence: + - variables: + entity_long: '{{ left_button_entity }}' + entity_long_name: >- + {%- if left_button_name |length > 0 -%} {{ left_button_name }} + {%- elif states(left_button_entity) == 'unavailable' -%} {{ left_button_entity }} + {%- else -%} {{ state_attr(left_button_entity, "friendly_name")| default('no name') }} + {%- endif -%} + entity_back: '{{ page_home }}' + - service: '{{ command_set_settings_entity }}' + data: + entity: '{{ entity_long }},{{ entity_back }},{{ entity_long_name }}' + + - conditions: '{{ left_button_hold_select == "Custom Action" }}' + sequence: !input left_button_hold_custom_action + else: # Single Click + - condition: template + value_template: '{{ left_button_entity |length > 0 }}' + - service: >- + {% if left_button_entity is match 'light.' %} + light.toggle + {% elif left_button_entity is match 'switch.' %} + switch.toggle + {% elif left_button_entity is match 'cover.' %} + cover.toggle + {% elif left_button_entity is match 'input_boolean.' %} + input_boolean.toggle + {% elif left_button_entity is match 'automation.' %} + automation.toggle + {% elif left_button_entity is match 'button.' %} + button.press + {% elif left_button_entity is match 'input_button.' %} + input_button.press + {% elif left_button_entity is match 'scene.' %} + scene.turn_on + {% elif left_button_entity is match 'script.' %} + script.turn_on + {% elif left_button_entity is match 'fan.' %} + fan.toggle + {% endif %} + data: + entity_id: "{{ left_button_entity }}" ##### Left button State ##### - conditions: @@ -5052,33 +4967,59 @@ action: - conditions: - condition: trigger id: right_button_press - - condition: template - value_template: '{{ right_button_entity |length > 0 }}' + sequence: - - service: >- - {% if right_button_entity is match 'light.' %} - light.toggle - {% elif right_button_entity is match 'switch.' %} - switch.toggle - {% elif right_button_entity is match 'cover.' %} - cover.toggle - {% elif right_button_entity is match 'input_boolean.' %} - input_boolean.toggle - {% elif right_button_entity is match 'automation.' %} - automation.toggle - {% elif right_button_entity is match 'button.' %} - button.press - {% elif right_button_entity is match 'input_button.' %} - input_button.press - {% elif right_button_entity is match 'scene.' %} - scene.turn_on - {% elif right_button_entity is match 'script.' %} - script.turn_on - {% elif right_button_entity is match 'fan.' %} - fan.toggle - {% endif %} - data: - entity_id: "{{ right_button_entity }}" + - wait_template: "{{ is_state(right_button, 'off') }}" + timeout: !input hold_delay + continue_on_timeout: true + - if: + - condition: template + value_template: "{{ not wait.completed }}" + then: # Hold + - choose: + - conditions: '{{ right_button_hold_select == "Default" and right_button_entity |length > 0 }}' + sequence: + - variables: + entity_long: '{{ right_button_entity }}' + entity_long_name: >- + {%- if right_button_name |length > 0 -%} {{ right_button_name }} + {%- elif states(right_button_entity) == 'unavailable' -%} {{ right_button_entity }} + {%- else -%} {{ state_attr(right_button_entity, "friendly_name")| default('no name') }} + {%- endif -%} + entity_back: '{{ page_home }}' + - service: '{{ command_set_settings_entity }}' + data: + entity: '{{ entity_long }},{{ entity_back }},{{ entity_long_name }}' + + - conditions: '{{ right_button_hold_select == "Custom Action" }}' + sequence: !input right_button_hold_custom_action + else: # Single Click + - condition: template + value_template: '{{ right_button_entity |length > 0 }}' + - service: >- + {% if right_button_entity is match 'light.' %} + light.toggle + {% elif right_button_entity is match 'switch.' %} + switch.toggle + {% elif right_button_entity is match 'cover.' %} + cover.toggle + {% elif right_button_entity is match 'input_boolean.' %} + input_boolean.toggle + {% elif right_button_entity is match 'automation.' %} + automation.toggle + {% elif right_button_entity is match 'button.' %} + button.press + {% elif right_button_entity is match 'input_button.' %} + input_button.press + {% elif right_button_entity is match 'scene.' %} + scene.turn_on + {% elif right_button_entity is match 'script.' %} + script.turn_on + {% elif right_button_entity is match 'fan.' %} + fan.toggle + {% endif %} + data: + entity_id: "{{ right_button_entity }}" ##### Right button State ##### - conditions: @@ -6802,10 +6743,158 @@ action: ## PAGE LIGHTSETTUNGS ## - conditions: '{{ trigger.event.data.new_state.state == page_lightsettings }}' sequence: + - service: "{{ command_text_printf }}" + data: + component: lightsettings.light_name + message: '{{ entity_long_name }}' + - delay: + milliseconds: "{{ delay_value }}" + - if: + - condition: template + value_template: "{{ state_attr(entity_long, 'brightness') != none }}" + then: + - service: "{{ command_value }}" + data: + component: lightsettings.lightslider + message: '{{ (state_attr(entity_long, "brightness") | int ) |round(0) }}' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: lightsettings.light_value + message: '{{ (state_attr(entity_long, "brightness") | int * 100 /255) | round(0) }}%' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: lightsettings.light_value_2 + message: '{{ (state_attr(entity_long, "brightness") | int * 100 /255) | round(0) }}%' + else: + - service: "{{ command_value }}" + data: + component: lightsettings.lightslider + message: '0' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: lightsettings.light_value + message: '0 %' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: lightsettings.light_value_2 + message: '0 %' + + ##### LIGHT Check Color_Temp Value is available when yes send some current Values ##### + - if: + - condition: template + value_template: "{{ state_attr(entity_long, 'color_temp') != none }}" + then: + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: lightsettings.temp_value + message: '{{ (state_attr(entity_long, "color_temp") | int ) |round(0) }}' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: lightsettings.temp_value_2 + message: '{{ (state_attr(entity_long, "color_temp") | int ) |round(0) }}' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_value }}" + data: + component: lightsettings.tempslider + message: '{{ (state_attr(entity_long, "color_temp") | int ) |round(0) }}' + + ##### LIGHT ON / OFF ##### + - choose: + ##### LIGHT PIC - ON ##### + - conditions: + - condition: template + value_template: '{{ states(entity_long) == "on" }}' + sequence: + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_printf }}" + data: + cmd: lightsettings.light_status.pic={{ light_pic_on }} + + ##### LIGHT PIC - OFF ##### + - conditions: + - condition: template + value_template: '{{ states(entity_long) == "off" }}' + sequence: + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_printf }}" + data: + cmd: lightsettings.light_status.pic={{ light_pic_off }} ## PAGE COVERSETTINGS ## - conditions: '{{ trigger.event.data.new_state.state == page_coversettings }}' sequence: + - service: "{{ command_value }}" + data: + component: coversettings.coverslider + message: '{{ (state_attr(entity_long, "current_position") | int ) |round(0) }}' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: coversettings.cover_value + message: '{{ (state_attr(entity_long, "current_position") | int ) |round(0) }} %' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: coversettings.cover_name + message: '{{ entity_long_name }}' + + ##### COVER Battery ICON Yes / NO ##### + - if: + - condition: template + value_template: "{{ state_attr(entity_long, 'battery') != none }}" + then: + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_text_printf }}" + data: + component: coversettings.battery_value + message: '{{ (state_attr(entity_long, "battery") | int ) |round(0) }} %' + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_printf }}" + data: + cmd: coversettings.battery_icon.pic={{ battery_icon }} + + ##### COVER OPEN / CLOSE + - choose: + ##### COVER PIC - open ##### + - conditions: + - condition: template + value_template: '{{ states(entity_long) == "open" }}' + sequence: + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_printf }}" + data: + cmd: coversettings.cover_status.pic={{ cover_pic_open }} + + ##### COVER PIC - Closed + - conditions: + - condition: template + value_template: '{{ states(entity_long) == "closed" }}' + sequence: + - delay: + milliseconds: "{{ delay_value }}" + - service: "{{ command_printf }}" + data: + cmd: coversettings.cover_status.pic={{ cover_pic_closed }} ## PAGE BUTTONPAGE01 ## - conditions: '{{ trigger.event.data.new_state.state == page_buttonpage01 }}' @@ -7325,6 +7414,26 @@ action: data: cmd: home.icon_top_03.pic={{ top_menu_climate }} + ##### Settings Entity changed -> open settings-page ##### + - conditions: + - condition: trigger + id: settings_entity + - condition: template + value_template: "{{ trigger.event.data.new_state.state != 'unknown' }}" + sequence: + - choose: + - conditions: '{{ entity_long is match "light." }}' + sequence: + - service: "{{ command_printf }}" + data: + cmd: "page {{ page_lightsettings }}" + - conditions: '{{ entity_long is match "cover." }}' + sequence: + - service: "{{ command_printf }}" + data: + cmd: "page {{ page_coversettings }}" + - conditions: '{{ entity_long is match "climate." }}' + sequence: [] ############################################################# diff --git a/nspanel_esphome.yaml b/nspanel_esphome.yaml index 6cda307..c178b7d 100644 --- a/nspanel_esphome.yaml +++ b/nspanel_esphome.yaml @@ -161,7 +161,7 @@ api: - lambda: 'id(disp1).set_component_value(component.c_str(), message);' ##### Service to send a command "hide componente" directly to the display ##### - - service: send_command_hide + - service: send_command_hide ### unused ### variables: component: string then: @@ -170,7 +170,7 @@ api: - lambda: 'id(disp1).hide_component(component.c_str());' ##### Service to send a command "show componente" directly to the display ##### - - service: send_command_show + - service: send_command_show ### unused ### variables: component: string then: @@ -229,6 +229,16 @@ api: id(notification_text).publish_state(""); - switch.turn_off: notification_unread + ##### Service to set entity-information for settings-page(s) + - service: set_settings_entity + variables: + entity: string + then: + - wait_until: + switch.is_on: nextion_init + - lambda: |- + id(settings_entity).publish_state(entity.c_str()); + ##### Service to play a rtttl tones ##### # Example tones : https://codebender.cc/sketch:109888#RTTTL%20Songs.ino - service: play_rtttl @@ -338,18 +348,13 @@ binary_sensor: ###### LEFT BUTTON BELOW DISPLAY TO TOGGLE RELAY##### - platform: gpio - # name: ${device_name} Left Button + name: ${device_name} Left Button id: left_button pin: number: 14 inverted: true on_click: - - min_length: 50ms - max_length: 1000ms then: - - binary_sensor.template.publish: - id: left_button_short - state: ON - if: condition: and: @@ -365,50 +370,17 @@ binary_sensor: switch.is_on: relay_1 then: - lambda: id(disp1).send_command_printf("home.icon_top_01.pic=105"); - - delay: 500ms - - binary_sensor.template.publish: - id: left_button_short - state: OFF - on_press: - then: - - lambda: |- - if (id(disp1_currentpage).state == "lightsettings" or id(disp1_currentpage).state == "coversettings") { - ESP_LOGD("nspanel", "settingspage -> no press"); - } else { - // ESP_LOGD("nspanel", "release button"); - id(disp1_lastclick_general).set_state("pressbuttonleft",true,true); - } - on_release: - then: - - lambda: |- - if (id(disp1_currentpage).state == "lightsettings" or id(disp1_currentpage).state == "coversettings") { - ESP_LOGD("nspanel", "settingspage -> no release"); - } else { - // ESP_LOGD("nspanel", "release button"); - id(disp1_lastclick_general).set_state("releasebuttonleft",true,true); - } - - - platform: template - name: ${device_name} Left Button - id: left_button_short - lambda: |- - return {}; ##### RIGHT BUTTON BELOW DISPLAY TO TOGGLE RELAY ##### - platform: gpio - # name: ${device_name} Right Button + name: ${device_name} Right Button id: right_button pin: number: 27 inverted: true on_click: - - min_length: 50ms - max_length: 1000ms then: - - binary_sensor.template.publish: - id: right_button_short - state: ON - if: condition: and: @@ -424,34 +396,6 @@ binary_sensor: switch.is_on: relay_2 then: - lambda: id(disp1).send_command_printf("home.icon_top_02.pic=106"); - - delay: 500ms - - binary_sensor.template.publish: - id: right_button_short - state: OFF - on_press: - then: - - lambda: |- - if (id(disp1_currentpage).state == "lightsettings" or id(disp1_currentpage).state == "coversettings") { - ESP_LOGD("nspanel", "settingspage -> no press"); - } else { - // ESP_LOGD("nspanel", "release button"); - id(disp1_lastclick_general).set_state("pressbuttonright",true,true); - } - on_release: - then: - - lambda: |- - if (id(disp1_currentpage).state == "lightsettings" or id(disp1_currentpage).state == "coversettings") { - ESP_LOGD("nspanel", "settingspage -> no release"); - } else { - // ESP_LOGD("nspanel", "release button"); - id(disp1_lastclick_general).set_state("releasebuttonright",true,true); - } - - - platform: template - name: ${device_name} Right Button - id: right_button_short - lambda: |- - return {}; ##### Restart NSPanel Button - Setting Page ##### - platform: nextion @@ -616,6 +560,10 @@ text_sensor: name: ${device_name} Notification Text id: notification_text + - platform: template + name: ${device_name} Settings Entity + id: settings_entity + ##### last click sensor, the main action variable - push to HA ##### - platform: nextion nextion_id: disp1 @@ -950,11 +898,11 @@ display: on_setup: then: - lambda: id(disp1).send_command_printf("page 8"); - - lambda: id(disp1).set_component_text_printf("boot.esph_version", "%s", "3.1.0"); ### esphome-version ### + - lambda: id(disp1).set_component_text_printf("boot.esph_version", "%s", "3.1.1"); ### esphome-version ### - wait_until: api.connected - lambda: id(disp1).set_component_text_printf("boot.ip_addr", "%s", id(ip_address).state.c_str()); - - delay: 0.5s + - delay: 1s - number.set: id: display_brightness value: !lambda 'return id(display_brightness_global);' @@ -967,7 +915,7 @@ display: - lambda: id(disp1).send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global)); - lambda: id(disp1).send_command_printf("home.sleepmodus.val=%i", id(sleep_modus_global)); - lambda: id(disp1).set_component_value("settings.a02", id(sleep_modus_global) == 1); - - delay: 0.5s + - delay: 1s - switch.template.publish: id: nextion_init state: on From da611e384ad27e0bd099bfa7535e401c99cabcae Mon Sep 17 00:00:00 2001 From: deejaybeam Date: Sat, 11 Feb 2023 18:28:41 +0100 Subject: [PATCH 04/11] upd: multi-climate --- nspanel_blueprint.yaml | 213 ++++++++++++++++++++++++++++------------- 1 file changed, 149 insertions(+), 64 deletions(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index 5f1e240..4fff37e 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -387,7 +387,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l ##### BUTTONS ##### entity01: name: Button 01 (Optional) - description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -404,6 +404,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity01_name: name: Name "Button 01" (Optional) description: '* *Button label - 10 characters are supported*' @@ -418,7 +419,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity02: name: Button 02 (Optional) - description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -435,6 +436,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity02_name: name: Name "Button 02" (Optional) description: '* *Button label - 10 characters are supported*' @@ -449,7 +451,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity03: name: Button 03 (Optional) - description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -466,6 +468,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity03_name: name: Name "Button 03" (Optional) description: '* *Button label - 10 characters are supported*' @@ -480,7 +483,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity04: name: Button 04 (Optional) - description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -497,6 +500,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity04_name: name: Name "Button 04" (Optional) description: '* *Button label - 10 characters are supported*' @@ -511,7 +515,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity05: name: Button 05 (Optional) - description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -528,6 +532,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity05_name: name: Name "Button 05" (Optional) description: '* *Button label - 10 characters are supported*' @@ -542,7 +547,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity06: name: Button 06 (Optional) - description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -559,6 +564,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity06_name: name: Name "Button 06" (Optional) description: '* *Button label - 10 characters are supported*' @@ -573,7 +579,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity07: name: Button 07 (Optional) - description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -590,6 +596,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity07_name: name: Name "Button 07" (Optional) description: '* *Button label - 10 characters are supported*' @@ -604,7 +611,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity08: name: Button 08 (Optional) - description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 1"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -621,6 +628,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity08_name: name: Name "Button 08" (Optional) description: '* *Button label - 10 characters are supported*' @@ -635,7 +643,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity09: name: Button 09 (Optional) - description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -652,6 +660,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity09_name: name: Name "Button 09" (Optional) description: '* *Button label - 10 characters are supported*' @@ -666,7 +675,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity10: name: Button 10 (Optional) - description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -683,6 +692,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity10_name: name: Name "Button 10" (Optional) description: '* *Button label - 10 characters are supported*' @@ -697,7 +707,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity11: name: Button 11 (Optional) - description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -714,6 +724,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity11_name: name: Name "Button 11" (Optional) description: '* *Button label - 10 characters are supported*' @@ -728,7 +739,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity12: name: Button 12 (Optional) - description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -745,6 +756,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity12_name: name: Name "Button 12" (Optional) description: '* *Button label - 10 characters are supported*' @@ -759,7 +771,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity13: name: Button 13 (Optional) - description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -776,6 +788,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity13_name: name: Name "Button 13" (Optional) description: '* *Button label - 10 characters are supported*' @@ -790,7 +803,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity14: name: Button 14 (Optional) - description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -807,6 +820,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity14_name: name: Name "Button 14" (Optional) description: '* *Button label - 10 characters are supported*' @@ -821,7 +835,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity15: name: Button 15 (Optional) - description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -838,6 +852,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity15_name: name: Name "Button 15" (Optional) description: '* *Button label - 10 characters are supported*' @@ -852,7 +867,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity16: name: Button 16 (Optional) - description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 2"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -869,6 +884,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity16_name: name: Name "Button 16" (Optional) description: '* *Button label - 10 characters are supported*' @@ -883,7 +899,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity17: name: Button 17 (Optional) - description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -900,6 +916,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity17_name: name: Name "Button 17" (Optional) description: '* *Button label - 10 characters are supported*' @@ -914,7 +931,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity18: name: Button 18 (Optional) - description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -931,6 +948,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity18_name: name: Name "Button 18" (Optional) description: '* *Button label - 10 characters are supported*' @@ -945,7 +963,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity19: name: Button 19 (Optional) - description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -962,6 +980,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity19_name: name: Name "Button 19" (Optional) description: '* *Button label - 10 characters are supported*' @@ -976,7 +995,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity20: name: Button 20 (Optional) - description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -993,6 +1012,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity20_name: name: Name "Button 20" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1007,7 +1027,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity21: name: Button 21 (Optional) - description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1024,6 +1044,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity21_name: name: Name "Button 21" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1038,7 +1059,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity22: name: Button 22 (Optional) - description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1055,6 +1076,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity22_name: name: Name "Button 22" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1069,7 +1091,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity23: name: Button 23 (Optional) - description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1086,6 +1108,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity23_name: name: Name "Button 23" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1100,7 +1123,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity24: name: Button 24 (Optional) - description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 3"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1117,6 +1140,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity24_name: name: Name "Button 24" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1131,7 +1155,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity25: name: Button 25 (Optional) - description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1148,6 +1172,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity25_name: name: Name "Button 25" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1162,7 +1187,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity26: name: Button 26 (Optional) - description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1179,6 +1204,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity26_name: name: Name "Button 26" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1193,7 +1219,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity27: name: Button 27 (Optional) - description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1210,6 +1236,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity27_name: name: Name "Button 27" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1224,7 +1251,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity28: name: Button 28 (Optional) - description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1241,6 +1268,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity28_name: name: Name "Button 28" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1255,7 +1283,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity29: name: Button 29 (Optional) - description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1272,6 +1300,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity29_name: name: Name "Button 29" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1286,7 +1315,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity30: name: Button 30 (Optional) - description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1303,6 +1332,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity30_name: name: Name "Button 30" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1317,7 +1347,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity31: name: Button 31 (Optional) - description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1334,6 +1364,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity31_name: name: Name "Button 31" (Optional) description: '* *Button label - 10 characters are supported*' @@ -1348,7 +1379,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l boolean: entity32: name: Button 32 (Optional) - description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan)*' + description: '* *Displayed on **"Button Page 4"** - (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*' default: [] selector: entity: @@ -1365,6 +1396,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l - script - binary_sensor - fan + - climate entity32_name: name: Name "Button 32" (Optional) description: '* *Button label - 10 characters are supported*' @@ -2144,6 +2176,8 @@ variables: button_binary_sensor_on: '108' button_fan_off: "121" button_fan_on: "122" + button_climate_off: "121" + button_climate_on: "122" hardware_button_pic_off: "98" hardware_button_pic_on: "99" @@ -3327,7 +3361,11 @@ trigger: condition: '{{ states(nextion_inited_trigger) == "on" }}' action: - variables: - settings_entity_value: '{{ states(settings_entity) }}' + #settings_entity_value: '{{ states(settings_entity) }}' + settings_entity_value: >- + {%- if states(settings_entity) != "unavailable" -%} {{ states(settings_entity) }} + {%- else -%} unknown + {%- endif -%} entity_long: >- {%- if settings_entity_value != "unknown" -%} {{ settings_entity_value.split(',')[0] }} {%- else -%} unknown @@ -3500,6 +3538,8 @@ action: {%- elif repeat.item.entity is match "binary_sensor." and states[repeat.item.entity].state == 'off' -%} {{ button_binary_sensor_off }} {%- elif repeat.item.entity is match "fan." and states[repeat.item.entity].state == 'on' -%} {{ button_fan_on }} {%- elif repeat.item.entity is match "fan." and states[repeat.item.entity].state == 'off' -%} {{ button_fan_off }} + {%- elif repeat.item.entity is match "climate." and states[repeat.item.entity].state != 'off' -%} {{ button_climate_on }} + {%- elif repeat.item.entity is match "climate." and states[repeat.item.entity].state == 'off' -%} {{ button_climate_off }} {%- endif -%} # TEXT and BRIGHTNESS Background btn_bg: >- @@ -3508,6 +3548,8 @@ action: {%- elif states[repeat.item.entity].state == 'off' or states[repeat.item.entity].state == 'closed' -%} {{ button_color_2 }} {%- elif repeat.item.entity is match "person." and states[repeat.item.entity].state == 'home' -%} {{ button_color_1 }} {%- elif repeat.item.entity is match "person." and states[repeat.item.entity].state != 'home' -%} {{ button_color_2 }} + {%- elif repeat.item.entity is match "climate." and states[repeat.item.entity].state != 'off' -%} {{ button_color_1 }} + {%- elif repeat.item.entity is match "climate." and states[repeat.item.entity].state == 'off' -%} {{ button_color_2 }} {%- endif -%} # TEXT Font btn_txt_font: >- @@ -3516,6 +3558,8 @@ action: {%- elif states[repeat.item.entity].state == 'off' or states[repeat.item.entity].state == 'closed' -%} {{ button_color_1 }} {%- elif repeat.item.entity is match "person." and states[repeat.item.entity].state == 'home' -%} {{ button_color_2 }} {%- elif repeat.item.entity is match "person." and states[repeat.item.entity].state != 'home' -%} {{ button_color_1 }} + {%- elif repeat.item.entity is match "climate." and states[repeat.item.entity].state != 'off' -%} {{ button_color_2 }} + {%- elif repeat.item.entity is match "climate." and states[repeat.item.entity].state == 'off' -%} {{ button_color_1 }} {%- endif -%} # BRIGHTNESS Font btn_bri_font: "{{ button_color_2 }}" @@ -3524,6 +3568,7 @@ action: btn_bri_txt: >- {%- if repeat.item.entity is match "light." and states(repeat.item.entity) == 'on' and state_attr(repeat.item.entity, "brightness") != None -%} {{ (state_attr(repeat.item.entity, "brightness") | int * 100 /255) | round(0) }}% {%- elif repeat.item.entity is match "cover." and states(repeat.item.entity) == 'open' and state_attr(repeat.item.entity, "current_position") != None -%} {{ (state_attr(repeat.item.entity, "current_position") | int(100)) | round(0) }}% + {%- elif repeat.item.entity is match "climate." and states(repeat.item.entity) != 'off' and state_attr(repeat.item.entity, "current_temperature") != None -%} {{ (state_attr(repeat.item.entity, "current_temperature") | int) | round(0) }}° {%- else -%} 0 {%- endif -%} @@ -3949,6 +3994,8 @@ action: {%- elif trigger.to_state.entity_id is match "binary_sensor." and trigger.to_state.state == 'off' -%} {{ button_binary_sensor_off }} {%- elif trigger.to_state.entity_id is match "fan." and trigger.to_state.state == 'on' -%} {{ button_fan_on }} {%- elif trigger.to_state.entity_id is match "fan." and trigger.to_state.state == 'off' -%} {{ button_fan_off }} + {%- elif trigger.to_state.entity_id is match "climate." and trigger.to_state.state != 'off' -%} {{ button_climate_on }} + {%- elif trigger.to_state.entity_id is match "climate." and trigger.to_state.state == 'off' -%} {{ button_climate_off }} {%- endif -%} # TEXT and BRIGHTNESS Background btn_bg: >- @@ -3957,6 +4004,8 @@ action: {%- elif trigger.to_state.state == 'off' or trigger.to_state.state == 'closed' -%} {{ button_color_2 }} {%- elif trigger.to_state.entity_id is match "person." and trigger.to_state.state == 'home' -%} {{ button_color_1 }} {%- elif trigger.to_state.entity_id is match "person." and trigger.to_state.state != 'home' -%} {{ button_color_2 }} + {%- elif trigger.to_state.entity_id is match "climate." and trigger.to_state.state != 'off' -%} {{ button_color_1 }} + {%- elif trigger.to_state.entity_id is match "climate." and trigger.to_state.state == 'off' -%} {{ button_color_2 }} {%- endif -%} # TEXT Font btn_txt_font: >- @@ -3965,6 +4014,8 @@ action: {%- elif trigger.to_state.state == 'off' or trigger.to_state.state == 'closed' -%} {{ button_color_1 }} {%- elif trigger.to_state.entity_id is match "person." and trigger.to_state.state == 'home' -%} {{ button_color_2 }} {%- elif trigger.to_state.entity_id is match "person." and trigger.to_state.state != 'home' -%} {{ button_color_1 }} + {%- elif trigger.to_state.entity_id is match "climate." and trigger.to_state.state != 'off' -%} {{ button_color_2 }} + {%- elif trigger.to_state.entity_id is match "climate." and trigger.to_state.state == 'off' -%} {{ button_color_1 }} {%- endif -%} # BRIGHTNESS Font btn_bri_font: "{{ button_color_2 }}" @@ -4006,6 +4057,7 @@ action: btn_bri_txt: >- {%- if trigger.to_state.entity_id is match "light." and trigger.to_state.state == 'on' and trigger.to_state.attributes.brightness is defined -%} {{ (trigger.to_state.attributes.brightness | int * 100 /255) | round(0) }}% {%- elif trigger.to_state.entity_id is match "cover." and trigger.to_state.state == 'open' and trigger.to_state.attributes.current_position is defined -%} {{ (trigger.to_state.attributes.current_position | int) | round(0) }}% + {%- elif trigger.to_state.entity_id is match "climate." and trigger.to_state.state != 'off' and trigger.to_state.attributes.current_temperature is defined -%} {{ (trigger.to_state.attributes.current_temperature | int) | round(0) }}° {%- else -%} 0 {%- endif -%} @@ -4397,7 +4449,7 @@ action: {%- elif states(last_click) == "releasebuttonpage04button08" -%} {{ entity32_confirm }} {%- endif -%} - condition: template - value_template: '{{ entity_short |length > 0 and entity_short is not match "person." and entity_short is not match "binary_sensor." }}' + value_template: '{{ entity_short |length > 0 and entity_short is not match "person." and entity_short is not match "binary_sensor." and entity_short is not match "climate." }}' - if: - condition: template value_template: "{{ entity_confirm }}" @@ -4662,9 +4714,6 @@ action: - condition: template value_template: '{{ trigger.event.data.new_state.state == "releaselightsettingsclose" }}' sequence: - - service: '{{ command_set_settings_entity }}' - data: - entity: 'unknown' - service: "{{ command_printf }}" data: cmd: "page {{ entity_back }}" @@ -4729,9 +4778,6 @@ action: - condition: template value_template: '{{ trigger.event.data.new_state.state == "releasecoversettingsclose" }}' sequence: - - service: '{{ command_set_settings_entity }}' - data: - entity: 'unknown' - service: "{{ command_printf }}" data: cmd: "page {{ entity_back }}" @@ -4759,11 +4805,11 @@ action: sequence: - if: - condition: template - value_template: '{{ states(climate) == "off" }}' + value_template: '{{ states(entity_long) == "off" }}' then: - service: climate.turn_on ############ data: - entity_id: !input climate + entity_id: '{{ entity_long }}' # - service: climate.set_temperature # data: # entity_id: !input climate @@ -4772,7 +4818,7 @@ action: else: - service: climate.turn_off ############ data: - entity_id: !input climate + entity_id: '{{ entity_long }}' # - service: climate.set_temperature # data: # entity_id: !input climate @@ -4784,11 +4830,11 @@ action: sequence: - if: - condition: template - value_template: '{{ states(climate) != "off" }}' + value_template: '{{ states(entity_long) != "off" }}' then: - if: - condition: template - value_template: '{{ climate_optimistic == true }}' + value_template: '{{ climate_optimistic == true }}' ## TODO - remove from here then: - variables: current_setpoint: "{{states(display_target_temperature) | round(1)}}" @@ -4797,10 +4843,10 @@ action: value: "{{ current_setpoint -0.5 }}" else: - variables: - current_setpoint: "{{state_attr(climate, 'temperature') | round(1)}}" + current_setpoint: "{{state_attr(entity_long, 'temperature') | round(1)}}" - service: climate.set_temperature data: - entity_id: !input climate + entity_id: '{{ entity_long }}' #hvac_mode: 'heat' temperature: "{{ current_setpoint -0.5 }}" @@ -4810,13 +4856,13 @@ action: sequence: - if: - condition: template - value_template: '{{ states(climate) != "off" }}' + value_template: '{{ states(entity_long) != "off" }}' then: - variables: - current_setpoint: "{{state_attr(climate, 'temperature') | round(1)}}" + current_setpoint: "{{state_attr(entity_long, 'temperature') | round(1)}}" - if: - condition: template - value_template: '{{ climate_optimistic == true }}' + value_template: '{{ climate_optimistic == true }}' ## TODO - remove from here then: - variables: current_setpoint: "{{states(display_target_temperature) | round(1)}}" @@ -4825,10 +4871,10 @@ action: value: "{{ current_setpoint +0.5 }}" else: - variables: - current_setpoint: "{{state_attr(climate, 'temperature') | round(1)}}" + current_setpoint: "{{state_attr(entity_long, 'temperature') | round(1)}}" - service: climate.set_temperature data: - entity_id: !input climate + entity_id: '{{ entity_long }}' #hvac_mode: 'heat' temperature: "{{ current_setpoint +0.5 }}" @@ -4838,7 +4884,7 @@ action: sequence: - if: - condition: template - value_template: '{{ states(climate) != "off" }}' + value_template: '{{ states(entity_long) != "off" }}' then: - variables: #climateslider: '{{ trigger.event.data.new_state.state |replace("climateslider","") | int }}' @@ -4875,7 +4921,7 @@ action: {%- endif -%} - if: - condition: template - value_template: '{{ climate_optimistic == true }}' + value_template: '{{ climate_optimistic == true }}' ## TODO - remove from here then: - service: "{{ command_thermostat_cycle }}" data: @@ -4883,10 +4929,19 @@ action: else: - service: climate.set_temperature data: - entity_id: !input climate + entity_id: '{{ entity_long }}' #hvac_mode: 'heat' temperature: "{{ new_setpoint }}" + ##### Page Climate - Close Climate Page ##### TODO + # - conditions: + # - condition: template + # value_template: '{{ trigger.event.data.new_state.state == "releaseclimateclose" }}' + # sequence: + # - service: "{{ command_printf }}" + # data: + # cmd: "page {{ entity_back }}" + ##### Left button press ##### - conditions: - condition: trigger @@ -5192,6 +5247,9 @@ action: ## PAGE HOME ## - conditions: '{{ trigger.event.data.new_state.state == page_home }}' sequence: + - service: '{{ command_set_settings_entity }}' + data: + entity: 'unknown' ##### NSPanel Date ##### - delay: milliseconds: "{{ delay_value }}" @@ -5393,7 +5451,7 @@ action: data: cmd: home.icon_top_02.pic={{ relay02_pic }} - ##### climate-page left - apply climate temperature if climate_optimistic ##### + ##### climate-page left - apply climate temperature if climate_optimistic ##### ## TODO - remove from here - if: - condition: template value_template: '{{ trigger.event.data.old_state.state == page_climate }}' @@ -6656,7 +6714,7 @@ action: alias: 'climate page' sequence: - variables: - hvac_mode: "{{ states(climate) }}" + hvac_mode: "{{ states(entity_long) }}" outdoor_temp: >- {%- if outdoortemp is match "sensor." and states(outdoortemp).state != "unavailable" -%} {{ states(outdoortemp) |round(0) }} {%- elif state_attr(weather_entity, "temperature") != None -%} {{state_attr(weather_entity,"temperature") | round(0)}} @@ -6666,7 +6724,12 @@ action: {%- if hvac_mode == "off" -%} {{ off_mui }} {%- elif hvac_mode != "off" -%} {{ on_mui }} {%- endif -%} - + - service: "{{ command_text_printf }}" + data: + component: climate.climate_name + message: '{{ entity_long_name }}' + - delay: + milliseconds: "{{ delay_value }}" - service: "{{ command_text_printf }}" data: component: outdoor_temp @@ -6674,13 +6737,13 @@ action: - service: "{{ command_text_printf }}" data: component: current_temp - message: "{{state_attr(climate, 'current_temperature') | round(1)}}°" + message: "{{state_attr(entity_long, 'current_temperature') | round(1)}}°" - if: condition: template value_template: '{{ hvac_mode != "off" }}' then: - variables: - target_temp: "{{state_attr(climate, 'temperature') | round(1)}}" + target_temp: "{{state_attr(entity_long, 'temperature') | round(1)}}" - service: "{{ command_thermostat_cycle }}" data: value: "{{target_temp}}" @@ -6899,6 +6962,9 @@ action: ## PAGE BUTTONPAGE01 ## - conditions: '{{ trigger.event.data.new_state.state == page_buttonpage01 }}' sequence: + - service: '{{ command_set_settings_entity }}' + data: + entity: 'unknown' ##### Button Page Label ##### - if: - condition: template @@ -6912,6 +6978,9 @@ action: ## PAGE BUTTONPAGE02 ## - conditions: '{{ trigger.event.data.new_state.state == page_buttonpage02 }}' sequence: + - service: '{{ command_set_settings_entity }}' + data: + entity: 'unknown' ##### Button Page Label ##### - if: - condition: template @@ -6925,6 +6994,9 @@ action: ## PAGE BUTTONPAGE03 ## - conditions: '{{ trigger.event.data.new_state.state == page_buttonpage03 }}' sequence: + - service: '{{ command_set_settings_entity }}' + data: + entity: 'unknown' ##### Button Page Label ##### - if: - condition: template @@ -6938,6 +7010,9 @@ action: ## PAGE BUTTONPAGE04 ## - conditions: '{{ trigger.event.data.new_state.state == page_buttonpage04 }}' sequence: + - service: '{{ command_set_settings_entity }}' + data: + entity: 'unknown' ##### Button Page Label ##### - if: - condition: template @@ -7286,9 +7361,16 @@ action: - condition: template value_template: '{{ climate |length > 0 }}' then: - - service: "{{ command_printf }}" + - variables: + entity_long: '{{ climate }}' + entity_long_name: >- + {%- if states(climate) == 'unavailable' -%} {{ climate }} + {%- else -%} {{ state_attr(climate, "friendly_name")| default('no name') }} + {%- endif -%} + entity_back: '{{ page_home }}' + - service: '{{ command_set_settings_entity }}' data: - cmd: "page {{ page_climate }}" + entity: '{{ entity_long }},{{ entity_back }},{{ entity_long_name }}' ##### Set Flame-Symbol ##### - conditions: @@ -7387,7 +7469,7 @@ action: cmd: heating_bt_pic.pic={{ heating_bt_pic }} - if: - condition: template - value_template: '{{ trigger.event.data.new_state.state != "off" }}' + value_template: '{{ trigger.event.data.new_state.state != "off" }}' #### TODO AND->OR (not) not optimistic-mode then: - service: "{{ command_thermostat_cycle }}" data: @@ -7433,7 +7515,10 @@ action: data: cmd: "page {{ page_coversettings }}" - conditions: '{{ entity_long is match "climate." }}' - sequence: [] + sequence: + - service: "{{ command_printf }}" + data: + cmd: "page {{ page_climate }}" ############################################################# From c058fd4fb130a9f176b60acfddfdcf8d0ad9887a Mon Sep 17 00:00:00 2001 From: deejaybeam Date: Sat, 11 Feb 2023 19:02:19 +0100 Subject: [PATCH 05/11] upd: open climate on short_press too --- nspanel_blueprint.yaml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index 4fff37e..4013a84 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -4449,7 +4449,23 @@ action: {%- elif states(last_click) == "releasebuttonpage04button08" -%} {{ entity32_confirm }} {%- endif -%} - condition: template - value_template: '{{ entity_short |length > 0 and entity_short is not match "person." and entity_short is not match "binary_sensor." and entity_short is not match "climate." }}' + value_template: '{{ entity_short |length > 0 and entity_short is not match "person." and entity_short is not match "binary_sensor." }}' + - if: + - condition: template + value_template: '{{ entity_short is match "climate." }}' + then: + - variables: + entity_long: '{{ entity_short }}' + entity_long_name: >- + {%- if states(entity_short) == 'unavailable' -%} {{ entity_short }} + {%- else -%} {{ state_attr(entity_short, "friendly_name")| default('no name') }} + {%- endif -%} + entity_back: '{{ states(current_page) }}' + - service: '{{ command_set_settings_entity }}' + data: + entity: '{{ entity_long }},{{ entity_back }},{{ entity_long_name }}' + - condition: template + value_template: '{{ entity_short is not match "climate." }}' - if: - condition: template value_template: "{{ entity_confirm }}" From 281be927a70698cbe63ceb8c3b6566a65fe98f18 Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Sat, 11 Feb 2023 20:53:16 +0100 Subject: [PATCH 06/11] Fix default language input Fix default language so it can be used when no selection is done (like when upgrading from earlier version when language input was not available). --- nspanel_blueprint.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index 4013a84..f50e69b 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -54,7 +54,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l language: name: Language for NSPanel description: '* *select the language for your NSPanel*' - default: 'EN' + default: 'ENG' selector: select: mode: dropdown From b0161d41f8a74ff8ad1be8edf5d522297e472aa9 Mon Sep 17 00:00:00 2001 From: Blackymas <41958506+Blackymas@users.noreply.github.com> Date: Sun, 12 Feb 2023 11:36:16 +0100 Subject: [PATCH 07/11] new fields climate page --- nspanel_eu.tft | Bin 8162516 -> 8164104 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/nspanel_eu.tft b/nspanel_eu.tft index 0dbca556289da3ddf25b0ff96224fb793f1eac3f..dfa88921d5764f84a65c959636f47eca923e44a6 100644 GIT binary patch delta 32125 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 p;+_*!L0A~OI delta 32001 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 Date: Sun, 12 Feb 2023 11:45:57 +0100 Subject: [PATCH 08/11] Notification and QR code wake up after sleep --- nspanel_eu.tft | Bin 8164104 -> 8164136 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/nspanel_eu.tft b/nspanel_eu.tft index dfa88921d5764f84a65c959636f47eca923e44a6..90457b5bec5e59de720f2215ebdb70481abb7eac 100644 GIT binary patch delta 5807 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 From 4801f6c6b97b05f1ca7e2fad36bc14a5196e7511 Mon Sep 17 00:00:00 2001 From: deejaybeam Date: Sun, 12 Feb 2023 12:23:41 +0100 Subject: [PATCH 09/11] upd: use new tft multi-climate --- nspanel_blueprint.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index f50e69b..c748d46 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -4949,14 +4949,14 @@ action: #hvac_mode: 'heat' temperature: "{{ new_setpoint }}" - ##### Page Climate - Close Climate Page ##### TODO - # - conditions: - # - condition: template - # value_template: '{{ trigger.event.data.new_state.state == "releaseclimateclose" }}' - # sequence: - # - service: "{{ command_printf }}" - # data: - # cmd: "page {{ entity_back }}" + #### Page Climate - Close Climate Page ##### TODO + - conditions: + - condition: template + value_template: '{{ trigger.event.data.new_state.state == "releaseclimateclose" }}' + sequence: + - service: "{{ command_printf }}" + data: + cmd: "page {{ entity_back }}" ##### Left button press ##### - conditions: @@ -6742,7 +6742,7 @@ action: {%- endif -%} - service: "{{ command_text_printf }}" data: - component: climate.climate_name + component: climate.climate_label message: '{{ entity_long_name }}' - delay: milliseconds: "{{ delay_value }}" From 3ff82ef8cd67d7a3a744b8fb4a7010e5a7c8b7da Mon Sep 17 00:00:00 2001 From: Blackymas <41958506+Blackymas@users.noreply.github.com> Date: Sun, 12 Feb 2023 23:40:48 +0100 Subject: [PATCH 10/11] change Climate Label, Climate Back, Sleep QR/Noti --- nspanel_eu.tft | Bin 8164136 -> 8164140 bytes nspanel_us.tft | Bin 8296448 -> 8297952 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/nspanel_eu.tft b/nspanel_eu.tft index 90457b5bec5e59de720f2215ebdb70481abb7eac..02bc2a16a0a15a2ba9970cbc9c937aac4f79bbb4 100644 GIT binary patch delta 11953 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 AlK=n! diff --git a/nspanel_us.tft b/nspanel_us.tft index 03c8e88f2be06069ecde0ef3db50d986639726a9..5d760fb820fee16655349f8e136ecbcfe9aced20 100644 GIT binary patch delta 25819 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 From 45907e1ce53ba8a093750cf78bf6ba0d89777e63 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 13 Feb 2023 09:05:08 +0100 Subject: [PATCH 11/11] fix: applying climate-settings --- nspanel_blueprint.yaml | 43 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index c748d46..6a48244 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -4949,7 +4949,7 @@ action: #hvac_mode: 'heat' temperature: "{{ new_setpoint }}" - #### Page Climate - Close Climate Page ##### TODO + #### Page Climate - Close Climate Page ##### - conditions: - condition: template value_template: '{{ trigger.event.data.new_state.state == "releaseclimateclose" }}' @@ -5259,6 +5259,26 @@ action: - condition: trigger id: current_page_changed sequence: + ##### climate-page left - apply climate temperature if climate_optimistic ##### ## TODO - remove from here + - if: + - condition: template + value_template: '{{ trigger.event.data.old_state.state == page_climate }}' + then: + - if: + - condition: template + value_template: '{{ climate_optimistic == true }}' + then: + - variables: + display_target_temperature: "{{states(display_target_temperature) | round(1)}}" + - if: + - condition: template + value_template: '{{ display_target_temperature != 0.0 }}' + then: + - service: climate.set_temperature + data: + entity_id: '{{ entity_long }}' + #hvac_mode: 'heat' + temperature: "{{ display_target_temperature }}" - choose: ## PAGE HOME ## - conditions: '{{ trigger.event.data.new_state.state == page_home }}' @@ -5466,27 +5486,6 @@ action: - service: "{{ command_printf }}" data: cmd: home.icon_top_02.pic={{ relay02_pic }} - - ##### climate-page left - apply climate temperature if climate_optimistic ##### ## TODO - remove from here - - if: - - condition: template - value_template: '{{ trigger.event.data.old_state.state == page_climate }}' - then: - - if: - - condition: template - value_template: '{{ climate_optimistic == true }}' - then: - - variables: - display_target_temperature: "{{states(display_target_temperature) | round(1)}}" - - if: - - condition: template - value_template: '{{ display_target_temperature != 0.0 }}' - then: - - service: climate.set_temperature - data: - entity_id: !input climate - #hvac_mode: 'heat' - temperature: "{{ display_target_temperature }}" ##### Set notify icon ##### - variables: