From d3e7e7128e5359ec6bc0cb2d601acf13099f0e57 Mon Sep 17 00:00:00 2001 From: aderusha Date: Sun, 12 Dec 2021 14:02:41 -0500 Subject: [PATCH] Improved theme handling --- .../blueprints/hasp_Apply_Theme.yaml | 16 +- .../hasp_Display_Calendar_with_Icon.yaml | 8 +- .../hasp_Display_Clock_with_Icon.yaml | 8 +- ...asp_Display_Entity_State_or_Attribute.yaml | 152 ++++++++++----- .../blueprints/hasp_Display_Template.yaml | 174 ++++++++++++----- .../blueprints/hasp_Display_Text.yaml | 16 +- .../hasp_Display_Weather_Condition.yaml | 178 ++++++++++++----- ...p_Display_Weather_Condition_with_Icon.yaml | 8 +- .../hasp_Display_Weather_Forecast.yaml | 184 +++++++++++++----- images/hasp_Display_Calendar_with_Icon.png | Bin 1668 -> 1484 bytes images/hasp_Display_Clock_with_Icon.png | Bin 2163 -> 1797 bytes ...sp_Display_Weather_Condition_with_Icon.png | Bin 2138 -> 2031 bytes ...ather_Temperature_with_Icon_and_Colors.png | Bin 1586 -> 1694 bytes 13 files changed, 518 insertions(+), 226 deletions(-) diff --git a/Home_Assistant/blueprints/hasp_Apply_Theme.yaml b/Home_Assistant/blueprints/hasp_Apply_Theme.yaml index 4872ca0..3d9c40d 100644 --- a/Home_Assistant/blueprints/hasp_Apply_Theme.yaml +++ b/Home_Assistant/blueprints/hasp_Apply_Theme.yaml @@ -283,39 +283,39 @@ action: # Theme: Apply selected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: topic: "{{commandtopic}}.pco" - payload: "{{selectedfg}}" + payload: "{{trigger.payload}}" ######################################################################### # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: topic: "{{commandtopic}}.bco" - payload: "{{selectedbg}}" + payload: "{{trigger.payload}}" ######################################################################### # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: topic: "{{commandtopic}}.pco2" - payload: "{{unselectedfg}}" + payload: "{{trigger.payload}}" ######################################################################### # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: topic: "{{commandtopic}}.bco2" - payload: "{{unselectedbg}}" + payload: "{{trigger.payload}}" diff --git a/Home_Assistant/blueprints/hasp_Display_Calendar_with_Icon.yaml b/Home_Assistant/blueprints/hasp_Display_Calendar_with_Icon.yaml index 6703a46..6a3ed23 100644 --- a/Home_Assistant/blueprints/hasp_Display_Calendar_with_Icon.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Calendar_with_Icon.yaml @@ -369,7 +369,7 @@ action: # Any change to the button will remove the overlaid icon. - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -386,7 +386,7 @@ action: # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -403,7 +403,7 @@ action: # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -420,7 +420,7 @@ action: # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: diff --git a/Home_Assistant/blueprints/hasp_Display_Clock_with_Icon.yaml b/Home_Assistant/blueprints/hasp_Display_Clock_with_Icon.yaml index 4fb87b2..52872d6 100644 --- a/Home_Assistant/blueprints/hasp_Display_Clock_with_Icon.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Clock_with_Icon.yaml @@ -372,7 +372,7 @@ action: # Any change to the button will remove the overlaid icon. - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -389,7 +389,7 @@ action: # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -406,7 +406,7 @@ action: # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -423,7 +423,7 @@ action: # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: diff --git a/Home_Assistant/blueprints/hasp_Display_Entity_State_or_Attribute.yaml b/Home_Assistant/blueprints/hasp_Display_Entity_State_or_Attribute.yaml index e5c24c8..c8f4848 100644 --- a/Home_Assistant/blueprints/hasp_Display_Entity_State_or_Attribute.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Entity_State_or_Attribute.yaml @@ -184,6 +184,42 @@ blueprint: default: false selector: boolean: + selected_fgcolor: + name: "Selected foreground color" + description: 'Selected foreground color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme selected foreground color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + selected_bgcolor: + name: "Selected background color" + description: 'Selected background color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme selected background color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + unselected_fgcolor: + name: "Unselected foreground color" + description: 'Unselected foreground color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme unselected foreground color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + unselected_bgcolor: + name: "Unselected background color" + description: 'Unselected background color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme unselected background color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider mode: parallel max_exceeded: silent @@ -210,6 +246,10 @@ variables: ycen: '{{ ycen_select.split(" - ")[0] | int }}' wrap: !input wrap title_case: !input title_case + selected_fgcolor: !input selected_fgcolor + selected_bgcolor: !input selected_bgcolor + unselected_fgcolor: !input unselected_fgcolor + unselected_bgcolor: !input unselected_bgcolor haspobject: '{{ "p[" ~ hasppage ~ "].b[" ~ haspbutton ~ "]" }}' commandtopic: '{{ "hasp/" ~ haspname ~ "/command/" ~ haspobject }}' jsoncommandtopic: '{{ "hasp/" ~ haspname ~ "/command/json" }}' @@ -238,53 +278,69 @@ variables: unselectedfgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedforegroundcolor/rgb" }}' unselectedbgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedbackgroundcolor/rgb" }}' selectedfg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_selected_foreground_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (selected_fgcolor|int) >= 0 -%} + {{ selected_fgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_selected_foreground_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} selectedbg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_selected_background_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (selected_bgcolor|int) >= 0 -%} + {{ selected_bgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_selected_background_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} unselectedfg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_unselected_foreground_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (unselected_fgcolor|int) >= 0 -%} + {{ unselected_fgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_unselected_foreground_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} unselectedbg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_unselected_background_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (unselected_bgcolor|int) >= 0 -%} + {{ unselected_bgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_unselected_background_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} trigger_variables: haspdevice: !input haspdevice @@ -382,7 +438,7 @@ action: # Theme: Apply selected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -392,7 +448,7 @@ action: # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -402,7 +458,7 @@ action: # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -412,7 +468,7 @@ action: # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: diff --git a/Home_Assistant/blueprints/hasp_Display_Template.yaml b/Home_Assistant/blueprints/hasp_Display_Template.yaml index c4b5d8f..6803888 100644 --- a/Home_Assistant/blueprints/hasp_Display_Template.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Template.yaml @@ -72,6 +72,28 @@ blueprint: + ## Nextion color codes + +
+ + The Nextion environment utilizes RGB 565 encoding. [Use this handy convertor](https://nodtem66.github.io/nextion-hmi-color-convert/index.html) to select your colors and convert to the RGB 565 format. + + Here are some example colors: + + | Color | Code | + |--------|-------| + | White | 65535 | + | Black | 0 | + | Grey | 25388 | + | Red | 63488 | + | Green | 2016 | + | Blue | 31 | + | Yellow | 65504 | + | Orange | 64512 | + | Brown | 48192 | + +
+ domain: automation input: haspdevice: @@ -157,6 +179,42 @@ blueprint: default: false selector: boolean: + selected_fgcolor: + name: "Selected foreground color" + description: 'Selected foreground color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme selected foreground color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + selected_bgcolor: + name: "Selected background color" + description: 'Selected background color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme selected background color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + unselected_fgcolor: + name: "Unselected foreground color" + description: 'Unselected foreground color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme unselected foreground color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + unselected_bgcolor: + name: "Unselected background color" + description: 'Unselected background color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme unselected background color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider mode: parallel max_exceeded: silent @@ -180,6 +238,10 @@ variables: ycen_select: !input ycen_select ycen: '{{ ycen_select.split(" - ")[0] | int }}' wrap: !input wrap + selected_fgcolor: !input selected_fgcolor + selected_bgcolor: !input selected_bgcolor + unselected_fgcolor: !input unselected_fgcolor + unselected_bgcolor: !input unselected_bgcolor haspobject: '{{ "p[" ~ hasppage ~ "].b[" ~ haspbutton ~ "]" }}' commandtopic: '{{ "hasp/" ~ haspname ~ "/command/" ~ haspobject }}' jsoncommandtopic: '{{ "hasp/" ~ haspname ~ "/command/json" }}' @@ -189,53 +251,69 @@ variables: unselectedfgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedforegroundcolor/rgb" }}' unselectedbgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedbackgroundcolor/rgb" }}' selectedfg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_selected_foreground_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (selected_fgcolor|int) >= 0 -%} + {{ selected_fgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_selected_foreground_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} selectedbg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_selected_background_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (selected_bgcolor|int) >= 0 -%} + {{ selected_bgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_selected_background_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} unselectedfg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_unselected_foreground_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (unselected_fgcolor|int) >= 0 -%} + {{ unselected_fgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_unselected_foreground_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} unselectedbg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_unselected_background_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (unselected_bgcolor|int) >= 0 -%} + {{ unselected_bgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_unselected_background_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} trigger_variables: haspdevice: !input haspdevice @@ -355,7 +433,7 @@ action: # Theme: Apply selected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -365,7 +443,7 @@ action: # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -375,7 +453,7 @@ action: # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -385,7 +463,7 @@ action: # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: diff --git a/Home_Assistant/blueprints/hasp_Display_Text.yaml b/Home_Assistant/blueprints/hasp_Display_Text.yaml index 213554e..d189e8e 100644 --- a/Home_Assistant/blueprints/hasp_Display_Text.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Text.yaml @@ -380,39 +380,39 @@ action: # Theme: Apply selected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: topic: "{{commandtopic}}.pco" - payload: "{{selectedfg}}" + payload: "{{trigger.payload}}" ######################################################################### # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: topic: "{{commandtopic}}.bco" - payload: "{{selectedbg}}" + payload: "{{trigger.payload}}" ######################################################################### # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: topic: "{{commandtopic}}.pco2" - payload: "{{unselectedfg}}" + payload: "{{trigger.payload}}" ######################################################################### # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: topic: "{{commandtopic}}.bco2" - payload: "{{unselectedbg}}" + payload: "{{trigger.payload}}" diff --git a/Home_Assistant/blueprints/hasp_Display_Weather_Condition.yaml b/Home_Assistant/blueprints/hasp_Display_Weather_Condition.yaml index 0653bc9..b2967b8 100644 --- a/Home_Assistant/blueprints/hasp_Display_Weather_Condition.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Weather_Condition.yaml @@ -60,6 +60,28 @@ blueprint: + ## Nextion color codes + +
+ + The Nextion environment utilizes RGB 565 encoding. [Use this handy convertor](https://nodtem66.github.io/nextion-hmi-color-convert/index.html) to select your colors and convert to the RGB 565 format. + + Here are some example colors: + + | Color | Code | + |--------|-------| + | White | 65535 | + | Black | 0 | + | Grey | 25388 | + | Red | 63488 | + | Green | 2016 | + | Blue | 31 | + | Yellow | 65504 | + | Orange | 64512 | + | Brown | 48192 | + +
+ domain: automation input: haspdevice: @@ -140,6 +162,42 @@ blueprint: default: false selector: boolean: + selected_fgcolor: + name: "Selected foreground color" + description: 'Selected foreground color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme selected foreground color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + selected_bgcolor: + name: "Selected background color" + description: 'Selected background color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme selected background color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + unselected_fgcolor: + name: "Unselected foreground color" + description: 'Unselected foreground color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme unselected foreground color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + unselected_bgcolor: + name: "Unselected background color" + description: 'Unselected background color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme unselected background color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider mode: parallel max_exceeded: silent @@ -162,6 +220,10 @@ variables: ycen_select: !input ycen_select ycen: '{{ ycen_select.split(" - ")[0] | int }}' wrap: !input wrap + selected_fgcolor: !input selected_fgcolor + selected_bgcolor: !input selected_bgcolor + unselected_fgcolor: !input unselected_fgcolor + unselected_bgcolor: !input unselected_bgcolor haspobject: '{{ "p[" ~ hasppage ~ "].b[" ~ haspbutton ~ "]" }}' commandtopic: '{{ "hasp/" ~ haspname ~ "/command/" ~ haspobject }}' jsoncommandtopic: '{{ "hasp/" ~ haspname ~ "/command/json" }}' @@ -173,53 +235,69 @@ variables: unselectedfgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedforegroundcolor/rgb" }}' unselectedbgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedbackgroundcolor/rgb" }}' selectedfg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_selected_foreground_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (selected_fgcolor|int) >= 0 -%} + {{ selected_fgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_selected_foreground_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} selectedbg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_selected_background_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (selected_bgcolor|int) >= 0 -%} + {{ selected_bgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_selected_background_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} unselectedfg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_unselected_foreground_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (unselected_fgcolor|int) >= 0 -%} + {{ unselected_fgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_unselected_foreground_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} unselectedbg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_unselected_background_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (unselected_bgcolor|int) >= 0 -%} + {{ unselected_bgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_unselected_background_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} trigger_variables: haspdevice: !input haspdevice @@ -313,12 +391,10 @@ action: sequence: - choose: ######################################################################### - # Theme: Apply selected foreground color when it changes. - # If the page is currently active, delay a moment before applying the overlay - # so it will fire after any other theme elements being applied. + # Theme: Apply selected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -328,7 +404,7 @@ action: # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -338,7 +414,7 @@ action: # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -348,7 +424,7 @@ action: # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: diff --git a/Home_Assistant/blueprints/hasp_Display_Weather_Condition_with_Icon.yaml b/Home_Assistant/blueprints/hasp_Display_Weather_Condition_with_Icon.yaml index 5098550..5ba6dfd 100644 --- a/Home_Assistant/blueprints/hasp_Display_Weather_Condition_with_Icon.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Weather_Condition_with_Icon.yaml @@ -457,7 +457,7 @@ action: # Any change to the button will remove the overlaid icon. - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -474,7 +474,7 @@ action: # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -491,7 +491,7 @@ action: # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -508,7 +508,7 @@ action: # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: diff --git a/Home_Assistant/blueprints/hasp_Display_Weather_Forecast.yaml b/Home_Assistant/blueprints/hasp_Display_Weather_Forecast.yaml index bbfd0b5..620d45b 100644 --- a/Home_Assistant/blueprints/hasp_Display_Weather_Forecast.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Weather_Forecast.yaml @@ -12,7 +12,9 @@ blueprint: ![Preview](https://raw.githubusercontent.com/HASwitchPlate/HASPone/main/images/hasp_Display_Weather_Forecast.png) - ### HASPone Page and Button reference + ## HASPone Page and Button Reference + + The images below show each available HASPone page along with the layout of available button objects.
@@ -58,6 +60,30 @@ blueprint: ![HASPone Fonts 0-3](https://raw.githubusercontent.com/HASwitchPlate/HASPone/main/images/NextionUI_Fonts_0-3.png) ![HASPone Fonts 4-7](https://raw.githubusercontent.com/HASwitchPlate/HASPone/main/images/NextionUI_Fonts_4-7.png) ![HASPone Fonts 8-10](https://raw.githubusercontent.com/HASwitchPlate/HASPone/main/images/NextionUI_Fonts_8-10.png) +
+ + ## Nextion color codes + +
+ + The Nextion environment utilizes RGB 565 encoding. [Use this handy convertor](https://nodtem66.github.io/nextion-hmi-color-convert/index.html) to select your colors and convert to the RGB 565 format. + + Here are some example colors: + + | Color | Code | + |--------|-------| + | White | 65535 | + | Black | 0 | + | Grey | 25388 | + | Red | 63488 | + | Green | 2016 | + | Blue | 31 | + | Yellow | 65504 | + | Orange | 64512 | + | Brown | 48192 | + +
+ domain: automation input: haspdevice: @@ -166,6 +192,42 @@ blueprint: default: true selector: boolean: + selected_fgcolor: + name: "Selected foreground color" + description: 'Selected foreground color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme selected foreground color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + selected_bgcolor: + name: "Selected background color" + description: 'Selected background color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme selected background color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + unselected_fgcolor: + name: "Unselected foreground color" + description: 'Unselected foreground color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme unselected foreground color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider + unselected_bgcolor: + name: "Unselected background color" + description: 'Unselected background color in Nextion RGB565 format (see "Nextion color codes" above for reference). -1 = Current theme unselected background color.' + default: -1 + selector: + number: + min: -1 + max: 65535 + mode: slider mode: parallel max_exceeded: silent @@ -192,6 +254,10 @@ variables: ycen: '{{ ycen_select.split(" - ")[0] | int }}' wrap: !input wrap title_case: !input title_case + selected_fgcolor: !input selected_fgcolor + selected_bgcolor: !input selected_bgcolor + unselected_fgcolor: !input unselected_fgcolor + unselected_bgcolor: !input unselected_bgcolor haspobject: '{{ "p[" ~ hasppage ~ "].b[" ~ haspbutton ~ "]" }}' commandtopic: '{{ "hasp/" ~ haspname ~ "/command/" ~ haspobject }}' jsoncommandtopic: '{{ "hasp/" ~ haspname ~ "/command/json" }}' @@ -200,9 +266,9 @@ variables: {{ prefix }} {%- endif -%} {%- if title_case -%} - {{ state_attr(weather_provider, "forecast")[forecast_index|int(default=0)].get(forecast_attribute) | title }} + {{ state_attr(weather_provider, "forecast")[forecast_index|int(default=0)].get(forecast_attribute)|replace("windy-variant","windy")|replace("clear-night","clear night")|replace("partlycloudy","partly cloudy")|replace("lightning-rainy","lightning & rain")|replace("snowy-rainy","snow & rain") | title }} {%- else -%} - {{ state_attr(weather_provider, "forecast")[forecast_index|int(default=0)].get(forecast_attribute) }} + {{ state_attr(weather_provider, "forecast")[forecast_index|int(default=0)].get(forecast_attribute)|replace("windy-variant","windy")|replace("clear-night","clear night")|replace("partlycloudy","partly cloudy")|replace("lightning-rainy","lightning & rain")|replace("snowy-rainy","snow & rain") }} {%- endif -%} isbr: "{% if wrap == true %}1{% else %}0{% endif %}" selectedfgtopic: '{{ "hasp/" ~ haspname ~ "/light/selectedforegroundcolor/rgb" }}' @@ -210,53 +276,69 @@ variables: unselectedfgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedforegroundcolor/rgb" }}' unselectedbgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedbackgroundcolor/rgb" }}' selectedfg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_selected_foreground_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (selected_fgcolor|int) >= 0 -%} + {{ selected_fgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_selected_foreground_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} selectedbg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_selected_background_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (selected_bgcolor|int) >= 0 -%} + {{ selected_bgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_selected_background_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} unselectedfg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_unselected_foreground_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (unselected_fgcolor|int) >= 0 -%} + {{ unselected_fgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_unselected_foreground_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} unselectedbg: >- - {%- set color = namespace() -%} - {%- for entity in device_entities(haspdevice) -%} - {%- if entity|regex_search("^light\..*_unselected_background_color(?:_\d+|)$") -%} - {%- set color.source=entity -%} - {%- endif -%} - {%- endfor -%} - {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} - {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} - {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} - {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} - {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- if (unselected_bgcolor|int) >= 0 -%} + {{ unselected_bgcolor }} + {%- else -%} + {%- set color = namespace() -%} + {%- for entity in device_entities(haspdevice) -%} + {%- if entity|regex_search("^light\..*_unselected_background_color(?:_\d+|)$") -%} + {%- set color.source=entity -%} + {%- endif -%} + {%- endfor -%} + {%- set brightness = state_attr(color.source, "brightness")|int(default=255) / 255 -%} + {%- set red=(state_attr(color.source, "rgb_color")[0] * brightness)|int(default=0) -%} + {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int(default=0) -%} + {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int(default=0) -%} + {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} + {%- endif -%} trigger_variables: haspdevice: !input haspdevice @@ -350,7 +432,7 @@ action: # Theme: Apply selected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedfgtopic }}" + value_template: "{{ (trigger.topic == selectedfgtopic) and ((selected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -360,7 +442,7 @@ action: # Theme: Apply selected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == selectedbgtopic }}" + value_template: "{{ (trigger.topic == selectedbgtopic) and ((selected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -370,7 +452,7 @@ action: # Theme: Apply unselected foreground color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedfgtopic }}" + value_template: "{{ (trigger.topic == unselectedfgtopic) and ((unselected_fgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: @@ -380,7 +462,7 @@ action: # Theme: Apply unselected background color on change - conditions: - condition: template - value_template: "{{ trigger.topic == unselectedbgtopic }}" + value_template: "{{ (trigger.topic == unselectedbgtopic) and ((unselected_bgcolor|int) == -1) }}" sequence: - service: mqtt.publish data: diff --git a/images/hasp_Display_Calendar_with_Icon.png b/images/hasp_Display_Calendar_with_Icon.png index bf8816691e8a3ca231dfacbf0518288561c7f228..ee358f88a85440e4721c1f30b3cd3ff062619ce6 100644 GIT binary patch delta 1385 zcmV-v1(y1R4a^IWbbmuhL_t(|UhSRXahy67gkkFzkB($gs2`#EZ zLW`=9(4s0Nw5SRREvh0_=*zFmkN;}QQrT5?|+Uuf1X(?#MMX@y7RIL zn97Q2>^;y#;%y+rY9zF%3JEQ$LPCqGkkG>OV)**{V(FbQA~ZyN`}yWvyhflEefqdT z9top#p_Xw9~d2Xx^~xR9$(oOC%*R%o>T`ufUqetE&>?1}e;9xf90 ziIfFQm0*x4&VNF#>KWSz6cHMYK0iOR2Lm1-A7MFn9ncec|LM64_TXShXa^=>_{z4U zU^gDqrzfuP z9vqC@7y7Deo7LEFAnpe6Gq%{1+ZUQeH%8>TN$8SXPiV}nSS=ub1D?z2iwAZnz@nDb zIrD>SDc0;BUT>sqEJ@(%34T?4cG zZ^5-SJlT1n&!6YZughp;{5=5n;9yvx0X9=`#@J=@*8+SApNLBoXwHjOhT6gdU1#Xjc~JAU7XM>7Hm6)730)HS#Iaf{G}Pho0hVrqxdLT{ zX1YM)^^wpek%7_N(^kkBQ`E;JIdbOX#4 zNc^#%`>e*&wYU$9={AFy&$dx`*WHFpGpP zOGcrAa|@sZO?1E#w-1l(!@6MA(0?=L%Ka-?!)%M_oR-ifffgK)96|$|Fa;jghjp!> z&gm((*bF3e4P+M@;Gy3vC*m~EbRN@(dzke@JSVDFuQWO&bPZq_{yn?{8)vv7kPJDQ zJ%CNLI4d9b9{XD2Iy`kttiW}3Dcwm)Xi*hCq2KjC_=`KIC-g;sV@2FKJz}9j#vlHr z2iq26GhS$L{ygudwf;__$jgY(LfkJBT2zIE7F8jkMO8>>Q56zeRE2~VRUx58RY+)2 r6%txh#lz|8q)=275?WDFJe~dm$;BFsk|4=r00000NkvXXu0mjfELEKT delta 1571 zcmZ8hdoJ@j69CzR+Bs~=9QIKW5$Rrn+hu}x!z@0q`YRN zkjHc*Vty%1nmQ$y&~Zvj33uK8>D=#s-|zSHIp6R1bI#{G2^JVrc=Jy54C9=%M}Gm5&TmFpyo;0_0UJ3~&6)1o7TcLb*_6F<3A97qlY zOahU^(Ic7iA9=e|P+PVAiJ8BoL40OFL73cOTc*hP+Kp&Yz(8 zGeA{L>k6(E1o_8CD-`!XwgKPt&F7R#cJ8LS*;|^_;A4F1^09kOtg-0SWWi`7$gHcY zii$w|N3=~)2^e9;+o-U96#GNn8PAOBdq?<2) z?fayZYGo5=j%l86V=(vs9yQF*q9@&0+mq+}3QgARok`u&>aOC&_rg+=hbm!c}6wFz_(d`& z=9AJ;ql@hm1Bp2+gU^iwrPN!%11~an5Nvgq zsqPFSer(J>sXWYb(BIw#BP= zMtn#|Ci3tL&3F>wV79c+RV^T74v3Iln&Fo$=v0}2*nzCmEt8O&XiVQ_hO<7H7Wti>e|NZSOO;OurTpt(OWkcYj#x@}xwT5BE0tNbpQ0)))tFp@ z_(~=Aft1J!uExuEhC^-fWUtpWY2Hze%=_Ad*Yt<)duQed_{HY6v&{fFUyTQ_<6S7F zA%!)n1FrU4t??`&u`aYGQEyK9;lz}kXU{?*j?>8Eq#JdB+5P?LnFAmF3H#tm;bn7W zIC3UkFUx&a<2#tiewIUx4f3X3u@$TpQx<9K;f-OME^wNP*smo-@1~oedZ)%x5u*Wt z>Aoll^4k8}CB}iIo-Y~y1*vm@kp)$z0y;@f>kY$wVBuvl2ArK?+36y6eZ1u z+Y~p9;~<8sMFxuhNw8i*&ft6~-$jeJN8e=*mZ)wigizF9)Ykp1qM;(4;e~Di!7@0b z=(HdpZM6<18k^w($8-!axIBlj%iVG*J`m8Dr4hn-mu?2qEoP%cW{Kf!o{dtQTym1I z8ynv`ATdh%hRK2aygeU9=b$-G=jy>23OG$;K_tPXJ+g?Tvu@j6O~Nqs-6*!x2e(0@ zOF-tzi__(*B%BqD1tTV!@$nS(vQlK_XGcF*{a#3lf%3QDeVxYcr*xrqkDvCtq-{)9 zLw|s_Ts2n<euEc&x&-FdI9lQHoer+P#UYs$eEOjDYfv>q7cKI3DFHNXjl8foCx6nyKQwmQh<}dMu39{Q zy0SIoJ8osKb{nV*fYcg|ZRSC~w|3~lsQnQm#f96cQ@dg+@b!G~&YU~KFN!yz#;xu1 zx!9)tB-5rZa^K8u^)DSBfVYQvotIlphCTBg0b%BnBeeCho+KhA?hB%BcwWNvaiob` z3MMwr)3Uoo#p0_8+b{IIK9@_pZ+yM#^9t_iLiB7W3eiAiq`|x;3`a2m+}th0^g zWlpRk57c&wo6Cu1;W74OafS^Uzr5pL{_7u|2RfH$i)MI6K#E1mfzEXheRP-4tLSyK Pf;>D9dAZaR$Ql0vf@|L! diff --git a/images/hasp_Display_Clock_with_Icon.png b/images/hasp_Display_Clock_with_Icon.png index f7205ccb347199dd61eb013e50644c0d95ae2a33..f53fe6f5b1efa9587ed60f08cd41d99a7169db2a 100644 GIT binary patch delta 1702 zcmV;X23h&@5QPqqbAJYWNklfZnB?*C zk!CETxmTyq@9*zF|NZ&n`wzs|f4;`?{OuWyxQag1+gWpee@~At;kH80TUcqIWZ6&X z;4zeC5)0vG$Kd;v9$JB02|aINPft%YMKyZ}4Jp%PTpt+gTGu?w6Slz=p|dta z<<|U){#mVSw#3od`F*IKsS86-8j}Oc;_lRS0(qgcHh*i_0W_`2e8R1PaJ6z_=tcw9U}owu znT*g(JA9-I1z3M-Es&NUbioRnwJEfNh4dkzUg%QUfCW&GHTx{Al>SSr8V(nl3Abr8 zi2Ea`wSNrT0QS!Eggh6L=n$c4K!T79XD_U@XTs$Buo4;tK&%>~rX*lPs8xhHZST;7 zp5&Uv3BAyz^c)b!U0Al>z?^h>7p_8gOBRnpQ0o?bo993*>3<53nVLSiq0nI7!l>(-bRb#)?uC`$ z55o6J2Unrlzi-!{Kg6RD)LKD2%3dW6!ZV`}5qhCZU+#fTMP@9F<^Bb_{L!KG$_Q}l zA!c9i*R5AP5J9aKuq{NbCqOTB$sQoQ6mFtf7&=hbHQ}l-b4+%dH9_}d^+rmrBjQ|Qh18c?04TnV-rZm z@vewNs9}^F>7bYtS{O?`3QQ52)v~Scg$rzBgeVEk-UwT3_v2zxXyKo@+Xr&YAvH-5To)m%gu? zAiovTJgP4YSTTbboBI!hd4Hinx6^&^f(ymmo@P@-pMvT3K+LGlkAmJCxm2Z2?FNdJ8Ay}i#tIEEsxnpM)-*=P#%@mQ=_OEv zz)N(1+`;eg2ehD_9cjmL&bm1Uj~UM|OZKp~1p1Q>pD4etM=gwjv45B$H5)D1mdZ6V zw!fa>s9?jy^E!iog+L>mC2H#}Ayrp~CuU~{+Fl?aWox!Ze^=SrjW(ed;Anab z7f0~e3k+vxI)!HZc^UkGK0D5h7$daf{3W>1jwxJd#}qEKV+t4AF@+25n8Jm2OyNR1 wrf{JhQ@GHMDef*07atD~GvPve7>b9>|0Y$s6;)1?Hvj+t07*qoM6N<$f-)&9+W-In delta 2071 zcmV+y2v`)q3`A2*ib>MTHgk(fGbv_w)*LAkL4e@H z5AouB{$W!f1p)(*e*60Picfr&`Glb3v()G9-ym3s5OlBdg6=Cg3AV}=SEuQ~)tGzt7;n!zhU^B*7z}E< zB515`TrltmTE`v$EYlZ^*msigDtvvo)iDr8E;os$yP|>Cn2=do3^2HBOVC=I!7CwL z8tGuV))nUVo>#-pD++!uX?(F8=iK5q979gw7=S+>-G6h%Gu1-?D<}9{!J{q>RnSE> z!)%9uDPI+cg z%_D8KxZ71VZ8R!c2>4hqUC*K!4LKJe>3=j{r}(({zKQCRzUaTz^@N zB+=rGaq?>MH!cHUR+IK`WJH&=6ZmgXM^2t)?b)d_T5oXFBunAMrt%_iV}jyw)N$-; zhd{!axGLIPWJk9ZuWesE=bI^=;r1 zWc{K@YuLx(i%p<8XUn(MDK%Y<$uvO^7CJ|LWKrPgTG*LB@?cH#tu>$xNTMoh7=Lhr z4mOCTj$$(y5;WJiA&bd|(>6HjBl~yE(S>j(??`L>yW#s&Nyv@ zqdu~-=I9c5I+n&`S~XwRh~ZoJmW!3pFX+q<{7lcBaN5Sm^wzmAOEtB3x=HFC%E~rv#F>Z__@bAJeCcXd>G&?nVCp z3?Qv@UqQFt;W+J#)0?cIIeKxhckV|ZHEOrC)?CcRmL`o#pkh6pes7)peWtasCJKUX ztqd)H$5y0~g^Z&Yhno>-9XC6sGHCQ9j5DMvI2b@1QrTGZSg6|etKuobcz+$=+Huku zrEG8eSPbxiqgTcV1uaS-N;DE2bN_e@$66bohV}|RZiLgaLQI2A7^jSplEFfHL9~`u z)ulG^>0zNCf>{lyxbf~?Q@dG}*lpFI=$w|z?5ufiE1Cs2BdCVd=!LX+5_Cc^OVC{I zOt%<*gT<9@jGQKLg{#~!wtt;ja`fVGGlGi>+VEeB93O%&fU`w2R~Q!?@Zf zgT$&Wc;G%-o1P8|N(At(qZdt#<%2pp)G=T8utyr{Rpb**Q8^YI{F2I zoZwIiJT*Ft0i7r@m@>G;g#>-BCQjAAx7EbRx>fj&4US%)EQUvDp?^RlfzesyyR@=N z)dG9J3Xy$dFJMF-TJ?g#PI`)RRy5cTAIv7Z-YnCe0rtXO2@ubs2yE$Styh~;)O02w z%*BYdGRCt6NetO(LdUpg<&io8dE3a|XZYQX3@#rm0rJ6(DIlatOprdlR1?f~&tN(q zm!Q#sEau}F#gGh;)_)^uu*!IA%Qr9cfmra_3}gcvtjHH+qIxvl*sqYY<_g-7gk5Pi zQ@UrNnx#*(`m_w|N|%iz+};>Q*qcyjq zo#1B)x+=RqK~L;!WkG{t2>K)_%LB}+$XCXHcg(0J*e)0v9e*gMpcPpsl2$<@M04+) zs-S^Z));p>p~bPUFs=v^+$3w%xihx%#7k(!fMvCW+Q9#6f$jJO4gWnA(uyT$VEBi9 zB0w-eq*4yj7mQ%s$f7?w%Yd+8*GOS8EPEtr?M4dJ6WipBog+Mgw=jb-r}==ry=>o3 z{Zs@EY!{orI)AMJ3aUUKAOf4H3p#<2QI);?g^f9QJYGR3Aj;Nm4f~LC@G#m0y#tME ze@YTb$8in@52jPl84zxQzk}dO%n@`Dya*xaU@1b-!BT{vgQW;T2TKux4wfPW9V|r% zI#`Mjbg&d5=wK<{zCOO<6Q5;1A?Wxl^!fPu4^ITs{}3Jj9i9LH002ovPDHLkV1o1h B?tlOQ diff --git a/images/hasp_Display_Weather_Condition_with_Icon.png b/images/hasp_Display_Weather_Condition_with_Icon.png index 3e743e4f8f8b7101de0cdedc98c3da329c8975ff..407c52bc6ba3134d6542f1491b59dfeea80785e0 100644 GIT binary patch delta 1937 zcmV;C2X6S<5bqC=bbn?^L_t(|UhSMcj@(8NM)xp#7-{d~NQV%dZfN@icHm4f;81`w zg@S{HBZmS6=mhrX>Q8h{^<`(a7!~ zxGh%+{p;_4y!rm8V!Zv~=Rg1Yn|VQSD^>~(S&hNPfbkp<1UF%g&`z6E7^hQxf_6;d z=)y;K1i==p5nB7|iDWGbYtxuJaN4w(2&aQh7!$fS%U&Otr@4C%Zf0gk=mm`8`2E4nfqNBhx$7GcLT}7Ep~36duephx38DYT z__uj*H#1{|#>X5~8tlFVUEIpfaDT$LTXGD&PgxzPq<_;NgmAC30V!#Ul*nu?ftfNl z`(}E5(+`E8K7ZNuaj+QJGGj;^4=nH+DiMbZjP1U1917-`(Awi9f z(EGhf@yA^A^a`Q%5Wv=86`ijy{UOnPW3Kh-6+)xT-~fTGJy3$DIyix!{V!`cMyQq1 z>@FpsMSt%a`)$|aCYh}ckj!E73$nFI>+8F3v7rM;!ecr-`06R9TWFj%4iMN{0^VTz z*ep{^peS$a1(+(-3}g4@+Kc|}a%#?*QEYX<0fIh^2Cc2{`l5R%CVDHbPu{jOblYP? zdp={5&=oo@kejQnM)6n11;%cnwnu{*)xAm+Eq|epP;aEbk?@!f&kCXSLPukWSr0)b zTClrBu6x59W(ZxOv1Q{{d%x)dFzB>mLXQ4@F`TVET0-A`sjd+`ro)4C%#+|g4a^oW zoUIv)RhWH?)0LS-8+&Jl&=p!!oA|YSAm66*E~H_q(7xel<`8YxlNm zoPVz6vs>^B&5jD)IhcJyS5Whdu+>2;HEQS;_=Uzf(-MHj^z27(v*r!E1*g!pw1uvM zLzlX~&Wo2vjh4{IS>>4M^@=`i03UOV$BFJac7pA5i}fpn-GWnSwl-m^kl!58!akvW zw_%ddy_Phc12tmZD|j?BpndW)GzqoYLx1Snb_~oGiksE*ZeyD(3hsqY_7NuOi58*3 z3ZeZ^JRbHC+Brw+J5O;48rdzdHA8R5c`YsU^}p}p-9!s^i6Nm!&z1pqZ77n!rV<_- z*ezfzTQ6a^P|GoNg$C>viaA4-Nsenizt_{@M9+c?aEPZu5XUaiw_U(tZXf}+pnuhA zfZcJ}CF~Y%EHn;@8I?k-o6yGlh2HotNU^UO|8^AU^MMo0)=Ste_|KWCEIk}hXfpw` zRlyEnMKLx!L%_55A3p9ElX|@15!$Hf(WN#eqdkEO1G@(JnSF;88sJcwlquWQy~~<0 zK?69%v(a3M)8`(rwSqPvfxXm{e}q(HNNAl5iV}$Ptv18>+=e7 z1^qR&Sq%h778)>Bz9{{@Ie&LoWK8H(LM*}73i|zGw?xrzZKj^2M}-F317MyGjq$bF zOYe8#;6mqDV1nJN7#pm$Lo{j$qduacsa8J)J0@g>(E4r*@=?Zk0Ijj3gz4260D8HJ zOV};kQE0$yMeUfK3#oIRwyUVSnfwE8-QpSZ}1rtB$w- zn4Z4{^g8tQkAsP^ss;Kkrs9X1%?U`EifR0}TM+BbPWm_)jDJFxh3g*&6C0G_L9hZ{ zJp;C0O$Z&_0b_G*d2t0Hbg(;meL8I8B7m5hsdQPyYfV X0ha#@+Dl&m015yANkvXXu0mjfgHNkV delta 2044 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