From dc6b021122639f852653741bbe7a3aea74b43829 Mon Sep 17 00:00:00 2001 From: aderusha Date: Sun, 12 Dec 2021 13:05:47 -0500 Subject: [PATCH] Add text and icon color control --- .../hasp_Display_Calendar_with_Icon.yaml | 216 +++++++++++++----- .../hasp_Display_Clock_with_Icon.yaml | 208 ++++++++++++----- ...p_Display_Weather_Condition_with_Icon.yaml | 1 + images/hasp_Theme_Dark_on_Light.png | Bin 8453 -> 8492 bytes images/hasp_Theme_Light_on_BlueDark.png | Bin 0 -> 7998 bytes images/hasp_Theme_Light_on_Dark.png | Bin 8136 -> 8240 bytes 6 files changed, 317 insertions(+), 108 deletions(-) create mode 100644 images/hasp_Theme_Light_on_BlueDark.png diff --git a/Home_Assistant/blueprints/hasp_Display_Calendar_with_Icon.yaml b/Home_Assistant/blueprints/hasp_Display_Calendar_with_Icon.yaml index dbf2035..6703a46 100644 --- a/Home_Assistant/blueprints/hasp_Display_Calendar_with_Icon.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Calendar_with_Icon.yaml @@ -22,6 +22,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: @@ -52,6 +74,51 @@ blueprint: max: 7 mode: slider unit_of_measurement: button + 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 + icon_fgcolor: + name: "Icon foreground color" + description: 'Icon 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 mode: parallel max_exceeded: silent @@ -66,14 +133,15 @@ variables: {%- endfor -%} hasppage: !input hasppage haspbutton: !input haspbutton + selected_fgcolor: !input selected_fgcolor + selected_bgcolor: !input selected_bgcolor + unselected_fgcolor: !input unselected_fgcolor + unselected_bgcolor: !input unselected_bgcolor + icon_fgcolor: !input icon_fgcolor haspobject: '{{ "p[" ~ hasppage ~ "].b[" ~ haspbutton ~ "]" }}' commandtopic: '{{ "hasp/" ~ haspname ~ "/command/" ~ haspobject }}' jsontopic: '{{ "hasp/" ~ haspname ~ "/state/json" }}' jsoncommandtopic: '{{ "hasp/" ~ haspname ~ "/command/json" }}' - selectedfgtopic: '{{ "hasp/" ~ haspname ~ "/light/selectedforegroundcolor/rgb" }}' - selectedbgtopic: '{{ "hasp/" ~ haspname ~ "/light/selectedbackgroundcolor/rgb" }}' - unselectedfgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedforegroundcolor/rgb" }}' - unselectedbgtopic: '{{ "hasp/" ~ haspname ~ "/light/unselectedbackgroundcolor/rgb" }}' activepage: >- {%- set activepage = namespace() -%} {%- for entity in device_entities(haspdevice) -%} @@ -82,54 +150,90 @@ variables: {%- endif -%} {%- endfor -%} {{ states(activepage.entity) | int(default=-1) }} + selectedfgtopic: '{{ "hasp/" ~ haspname ~ "/light/selectedforegroundcolor/rgb" }}' + selectedbgtopic: '{{ "hasp/" ~ haspname ~ "/light/selectedbackgroundcolor/rgb" }}' + 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 -%} + iconcolor: >- + {%- if (icon_fgcolor|int) >= 0 -%} + {{ icon_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 -%} text: '{{(now().strftime("%b "))~now().day}}' font: 8 ypos: "{{(haspbutton|int - 4) * 67 + 2}}" # calculate the top pixel position based on the selected button @@ -212,7 +316,7 @@ action: "{{haspobject}}.bco2={{unselectedbg}}", "{{haspobject}}.txt=\"{{text}} \"" {%- if activepage|int == hasppage|int -%} - ,"delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\"" + ,"delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\"" {%- endif -%}] ######################################################################### # Update the calendar text every day at midnight. If the selected page is currently active, also place the icon. @@ -226,7 +330,7 @@ action: payload: >- ["{{haspobject}}.txt=\"{{text}} \"" {%- if activepage|int == hasppage|int -%} - ,"delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\"" + ,"delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\"" {%- endif -%}] ######################################################################### # Catch MQTT events @@ -251,7 +355,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' - conditions: # Page changed to our page, so place the icon on the screen. - condition: template value_template: '{{ (trigger.topic == jsontopic ) and (trigger.payload_json.event == "page" ) and (trigger.payload_json.value == hasppage|int) }}' @@ -259,7 +363,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' ######################################################################### # Theme: Apply selected foreground color when it changes. # Any change to the button will remove the overlaid icon. @@ -277,7 +381,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{trigger.payload}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' ######################################################################### # Theme: Apply selected background color on change - conditions: @@ -294,7 +398,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' ######################################################################### # Theme: Apply unselected foreground color on change - conditions: @@ -311,7 +415,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' ######################################################################### # Theme: Apply unselected background color on change - conditions: @@ -328,4 +432,4 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' diff --git a/Home_Assistant/blueprints/hasp_Display_Clock_with_Icon.yaml b/Home_Assistant/blueprints/hasp_Display_Clock_with_Icon.yaml index 20de71b..4fb87b2 100644 --- a/Home_Assistant/blueprints/hasp_Display_Clock_with_Icon.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Clock_with_Icon.yaml @@ -22,6 +22,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: @@ -57,6 +79,51 @@ 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 + icon_fgcolor: + name: "Icon foreground color" + description: 'Icon 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 mode: parallel max_exceeded: silent @@ -72,6 +139,11 @@ variables: hasppage: !input hasppage haspbutton: !input haspbutton hour24: !input hour24 + selected_fgcolor: !input selected_fgcolor + selected_bgcolor: !input selected_bgcolor + unselected_fgcolor: !input unselected_fgcolor + unselected_bgcolor: !input unselected_bgcolor + icon_fgcolor: !input icon_fgcolor haspobject: '{{ "p[" ~ hasppage ~ "].b[" ~ haspbutton ~ "]" }}' commandtopic: '{{ "hasp/" ~ haspname ~ "/command/" ~ haspobject }}' jsontopic: '{{ "hasp/" ~ haspname ~ "/state/json" }}' @@ -89,53 +161,85 @@ 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 -%} + iconcolor: >- + {%- if (icon_fgcolor|int) >= 0 -%} + {{ icon_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 -%} text: '{%- if hour24 == true -%}{%- set hourformat="%-H" -%}{%- else %}{%- set hourformat="%I" -%}{%- endif -%}{{(now().strftime(hourformat)|int)~now().strftime(":%M")}}' font: 10 ypos: "{{(haspbutton|int - 4) * 67 + 2}}" # calculate the top pixel position based on the selected button @@ -218,7 +322,7 @@ action: "{{haspobject}}.bco2={{unselectedbg}}", "{{haspobject}}.txt=\"{{text}} \"" {%- if activepage|int == hasppage|int -%} - ,"delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\"" + ,"delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\"" {%- endif -%}] ######################################################################### # Every minute, update the clock text. If the selected page is currently active, also place the icon. @@ -229,7 +333,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["{{haspobject}}.txt=\"{{text}} \""{%- if activepage|int == hasppage|int -%},"delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""{%- endif -%}]' + payload: '["{{haspobject}}.txt=\"{{text}} \""{%- if activepage|int == hasppage|int -%},"delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""{%- endif -%}]' ######################################################################### # Catch MQTT events @@ -254,7 +358,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' - conditions: # Page changed to our page, so place the icon on the screen. - condition: template value_template: '{{ (trigger.topic == jsontopic ) and (trigger.payload_json.event == "page" ) and (trigger.payload_json.value == hasppage|int) }}' @@ -262,7 +366,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' ######################################################################### # Theme: Apply selected foreground color when it changes. # Any change to the button will remove the overlaid icon. @@ -280,7 +384,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{trigger.payload}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' ######################################################################### # Theme: Apply selected background color on change - conditions: @@ -297,7 +401,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' ######################################################################### # Theme: Apply unselected foreground color on change - conditions: @@ -314,7 +418,7 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' ######################################################################### # Theme: Apply unselected background color on change - conditions: @@ -331,4 +435,4 @@ action: - service: mqtt.publish data: topic: "{{jsoncommandtopic}}" - payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{selectedfg}},0,1,1,3,\"{{icon}}\""]' + payload: '["delay=1","xstr {{xpos}},{{ypos}},{{iconwidth}},{{iconheight}},{{iconfont}},{{iconcolor}},0,1,1,3,\"{{icon}}\""]' 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 aa90a09..5098550 100644 --- a/Home_Assistant/blueprints/hasp_Display_Weather_Condition_with_Icon.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Weather_Condition_with_Icon.yaml @@ -43,6 +43,7 @@ blueprint: | Brown | 48192 | + domain: automation input: haspdevice: diff --git a/images/hasp_Theme_Dark_on_Light.png b/images/hasp_Theme_Dark_on_Light.png index d13ddcdbd95be2a0c8d4a85e0e6f3146fcd05320..7e7d44852597e23870a9911d9c46d5e21990a117 100644 GIT binary patch literal 8492 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 literal 0 HcmV?d00001 diff --git a/images/hasp_Theme_Light_on_Dark.png b/images/hasp_Theme_Light_on_Dark.png index bdb5654a356069344a76d71fda153e68f4121fe3..f465f122263cd3eb4fa277db56f27883337787c9 100644 GIT binary patch literal 8240 zcmb_>Wl&tr)-E=cnA!QH|@ zf`v=ob57O0=l=Y@s@}V+dp&FQ+H0@we!4nFS6h_`pB^6#4UI@$O0@Pt`=G*7s;&$&d}Vc%(^BE+s~xWl17k=fC>}Hyf3< zeV)Ia+hje6?)g#Q_IU^#%1a$^oPD#s^(no!cGMJC>QMiZ6BqXA|1P^*M@!8o-#hQk z-)KoJ1U+*Yu?{)|0JFO|vk%D#(SUdNF1!}lmEXm`2lbK?A=e09zs&T#E+Oo=yR_q3`g83(^p5dz>HDqml8JQ)0BAlL-Of)mA@tS1d)e20uMprDY|~>U@5LCD z5dU1jB`fBAJgXU--Qd$ow`_ylAJ}&=6`lA@k|~D5Si9sH{^WY_Odsor5Zy0^0V~Z} zi7c5KcPW6ZxL`WUTJm7QVg0Zf9tl@T6UBG|{vgUGCz(UenEWw9uyN3s;=9YN&1zqw zaSjHi7V`SD&T2Q(AS9zwJy+I9y0Or9v+Xfu`0+p#1|P5aeE9rcSwS?4~!vlfwUR~my!LHDV`D%tb8K6mwn(YWgrw}X2@cdpv>s7v^SFQ4d< z+Vmuf*=Vqu0*9O>dEJj8#?sO56<5b_U##()C8CkVK<^>C)9LW(#m;I;6IS{c?nO>9 z^2X#c*Jwi@fjNahr8!UY8z6DHS!-Xbo+j?%5OJ0p#O8W>3BfBr@2N4e?A&GMr@vk4 z`z(8c^598~EWWu5B*uBOPa34D!hee8jwN0OM%?u7y4ybuOYR(neq&SjIBkOgU|=Y^ zVx4OD0_QPqTdOoBnz>7DZc-Ov{#-xgdXr!F)gtpS@az`mQS8*+y76g{O;w9gkgh#U zRzoxJ_**73M&Vq)rKIeyH<*IItasJl+k8RLwIfnJa@epYK)EjKRV$(g4gHU&3vE!^ zb%*Pc@3J>Xru}o3BiU?ARjCQ+vmMsAr>1sY57E!B{O)gXWbsvA;skyh=5Y?YNM4*2 zFh!D57t%DO`FRbqGRk?Wj!R(sahvh-%aT6ew#f^AEzoj7oSf06sU!-`jWkFwIpYb2 zTf?&Yu>~#$DlrsDA|{u*;W@d{i7-FoX1KC&6}xO^E>lyE#8W;Z%*HcsVbf&Zi!M=n zFG7?YRWH_&A+au+bmJR8FWI-2T@jC@=Kaem1m>Yo(^ZORd=|?}o3Y&fPda@jT<5@D;vwPGlLo;<_c*qCY z0g<9sVg5fnLE+c$i3`jBh$CUlpS^!C*E!jkfbxvTZI)u})vz0dV3<3zDP^wa6)uiZ zQ5Of^Ta7;0O)pI1YQXohD`=NlE$EX$jwafX#xo=I=9TBeLN2@16VIhQTj1RSAc8-5 zwxzMgGt144*E3m7HBx^%jlXPt^bQdX?}lMd@QogOjlYK2_>_(F+pNp_3>$o;i=`3i z@x}p2(E5>&opek}?9~Cifd%24!^F=12usR}Z=>!L4WmwTxVp9D_yG0krHtV^D!=YNUkP zZas4e&O2;$%oW15W-s=>5e^V6F0jGpx$Mj1FR1v)YYo~m{MmHOUxsPTreeCdeFR&I zNwB}ErsB<&Fi#I=@7opKcN&(N(dzKA2wx?OT?IO{BXV?z#0;UW=^Dmaz3VZf3XD4U zho0yXPI%vHNRx|x@nC8OoPXJ)tE6n`)Q02`Y{+5Av&q$~O!EM8y6d{9=`lL*W4Jzs zUh~nGRq@McXx5#5nfX+!f=qtih!$o1Ltx%GJZJk;Dq?QqXyS`TcvZlLp53Zjmmi-S z_5-S_uN6DW_%{YzW{4U{CQ=~iL16Hzt7&AKQ@l5~ZJtyS$g5C>IIuP!48cGL^ilOfUgC--ZGH3<(yq-R3kJRD8=xObeEjzk;i27EgH$~c4|`- z!MAaGUgp`7k!nBmc#Ia;PWZ(Man8{hiWC_re>M(K*jW;>QmWb()Hz+4wm5g=U=WRSZ~d@ z`)&Z%DWTjS0^<%Z#fIQF9V{ORgx56vw6ec>ubYDGPp+lcoI*eOnz6^$Nc$;g^{BT|v1q4HaYV9>)bSdM0zHs9PAmaDg1Y{T%d609G9M!j+wt5a`{-#2o@B{4j6rwspe*!8e6_JAW_9wLRU4ID> zZTR;`x&y`)Y92jWCn!cT-PNh~e5BjA?aLHwes;3BRQ4|n;Sg-J-W(YicLr^26LnOo zzyN^boC@%xAzre5-c!|HvOh zlIu93>^B_c0qO2F4demXO!K0G3!y|{Yl>vi#}qdYG-U;NQr@(7kNJaanUD_>HqIPt z=aVU&SVx{r7w=w!JSa%^`6|e(a)Mh5TcuWUs2!$p`S6*pevI}QY@^;H0Tm!9n`;3| z!*^r?soc~w-*XDmK`BthxVydrj}NXo*;(#S?S)-31((O?m60gUU2j2u_rFM=j+Ttr zR%Ylp%Ce1hce0YEL602HnK=f15bbexqsRQw%b^wZw*o&16|5`^B5*y(`Doa70V!XN z+|;r`$n7$Jl{gP&YS=2n$K;9z6kl|FZLEHfn;PTO-7Obv6$jSc_61AieD-LjaD(3Y zp@G9c*xeY{MnmKW;z8i<3mkincq)-zjvCcM{Kc_5EAe_&37Xp}w(u@Jtk?hZO(cDew@CZKJMh_J@4XG-fJUH8r?&D+Ajo zi%q@461S%SVI~*7mRED_dV((|VpG}|^=bY`K-XKhqBC5N0b>~UbqNXSg8ED3yG=z8 z`Nw30MgiTPj{|(aCPcIryilUmgM52iYa{+@kb0-87YNN|p zZZja}md*}}NE5Wt)0J`QI-%ZF1&6o8yLfJP3CZjB54lVZ?W%fihrX@5qo0@ZPhMkn zM+Gr||G{Dz<9{Y@40~U<79Dyw5RB8!9Q5i+Ky&uYA3yy6q2d3bpGJgz}yC&udvp zaXPp56I;L2Vn=F)2xpu(+7P$UnkTL~m2w$}*y=~Efiaox{d*N>m(TUMY^qa2rxWS+xK5!67I$c>* zOA6p+rk<{9dPz3&Jdy|yk0ATP5_O=+GZV0Va7Zn(J7&~@$SE3S2Dm+aVx(WP>Ozfk zCu{NPvb2@B$`E+5U)oEG(nK&R5mC ztmv1r?anqv=pLSpzzLaP9b_}l-1o+;_W*_FN!&GW^h>JdXbxNQ2(@A2%;AEpqg{kX30lF$7WRM?4sAz_@>ZD* zO97)={`kr|F#P%O-@(NTQun>p+rY)?TYCAxj^srm?K;+Mb>z12DJhDvoFHa%aC?TQ zU2{6bV-~f!r!E=}#iiGu_&L5v1oGdYVd%L|jViGKmH%!8;axYcZ}bc`)3fa0dX4+^ zn6^7)_9!FGKiB3_O_2Iz86S(_oAN`@55^PSuPLB-#0(?Uwr^TZ`YWGT1MDx79PueY zt|Xcv_FPyis=j!v0I|;c7(_)gjN4VDJ&F_soi=d8Jpi;T@W>jSG({lt7^=J2X1t+s z2n!=El5hiG-0PS(#w{4{>gP$R2?F)U=h;GCkkE0rXSmm9-P7bc_iS!YO?e@g6>sXU zJapUJgnEDaJc!m>L;C`NwVFunOFq%Xwt)!2iv~8xSTV)GKF25}HOwj^k9f`orS%fT zvvGZaCw(+rf8fVtR#K}CdJlXRS#svh?sK69 zb^b}O{2ErwYq4i6`Xvl~kB*R1MA@yVtYW`BKTM1yzFVKVM&zc-Ug3h5kg_4bTJJ7a zH_PGdrw}f6-K%0CL4tZz*o?oo6~ zvCmU^V0sZVuic$SA#N^*EBp3-)`u5#JP;cZ{Hu`~D6MAjW7%-3q4#f-TIne1`$^w6 zax+PgLC4OmQ>#iAv>FG(OwYpJa_-VD&}Wrk^5SZ1WCjDP;Qir0cu}rxM#)&+tznwu z!gkI-)on>-h(3rKT6ElfpkexNcKI(x>WRjm*B%l1Vn7jTn=Z7y_uq@R1jqNAKO`Zj zjl4h8oxzzzS)TQhxVdjbe-DOU&2--9yLA4(IQesV@+bEW_G43_Ql;A{d|mPpuJ-d% zczQ;4c^ z2~%)E)6yA&F|CfO#V!tZxfjY8crVcj)BkoS-N~u%HJ=46X8U(V%?McjbwX{ECMLe| z?4(pHa8)-THY0)+81CgJGg8wj2AuW* zzcoP>dF%h0JS#mZ-mspL9I#(x2{teNI;lx3zJ?2zwJLi@RUq!|3|Q7dZbh2NMj7Kf zo%3`oSJb)|1g0@dBp_7fXnvyDKiKcC;0|atpqv~uUWVsR+~Ap8--fNy&%7pHqI{sQ z_&%3kj?I+LQS1)~XWpRaDEP4Sg*Hsg7D&=KHtnYSBjQul#^p!;?fpK!oq$onpBq%U z`N|2o;O>?fms2wyZq0q)dL^n$ZREwUK?y-wlEwOJlrOGE7bhb>6GH}*Y zLXH6fxO>cA!6_B7T8gbdxyTZEPV}O|qdmC^rm4->fj~*6B)L-#R2}T{Jb8eon;Djy zsv&&+2Xi;L=p5pkzqQ-ZQ^$Xz(oswCDvA7j!Vo7m>j|J;GeCi$_{+@+>#n1qv}&EC zUM@%Nq4zb9sw`7{5cSw8JBK0?#$E<1@CSei93qL@FxI4R^pLdfm(-Qg1^Cm&h-hiGDJMIiR7@=dzc z{Pd5zF}KfJQ {Mf6mxN@RYFx{`qS-!I6I?3DrE=j{=hXJFO3&vYa3D(Tv5cn$C# z*k!U(8qdm*T{`PS*|fw>BFp?SyKlEH9QI@Y~~g@ zJEg!%l@mn|jAb>oyvEJ1#H~k<`D>-+853*6*>4fP;+Q}v^;uLA~w(hAYPqo z0SB)bkkdX5>eS0tva~t8M_4hb^kL;9wbkg|)d5bl+DD(p#9RT7=Ha>FfTRX(5<1DM zLp{tYUCo4AbC}pK$58+6M;1B0&BOTb?kL@!*g)-iYw7*8&Mq>YbJ_#c@Dk%zv9Hhj zhsmFXxX{yNVxPxkivl1E-Pz_nYAoABhR>~IiGXN!TU^&98S-M3Z4OC}J%odng*YU_ z9nTtxHabvkpczH3p=FZjs^qE{)ePa#3ukoL@huQE0i2H3TE%Ynl?#mn>grq;R<7OU z#PYB!RRh4!+2tE2B&0b44JBHqTU$qHST0i&EUmTIy}F+4NKE#H2>0USPN3su+lp1@ z!&Up|mGsg`?PkdPQNw<@8jE4)1Ua_0BByAVklxjpwB3qF5)DI%!kv(kK27w*(Qs83 zv9GOQ&fa}uA72GNAZgmFsNn%oUH$%(hqsHAcyN7A`93Z&RyuWKHo~8yiW_5q`JFM9 z;B%yG4Io@P%u<_A-k9H25JvG?hlq(0(3ov%05K~Ua&O;y;%J`QVH4Q%SQZBs@@{3@ zOBeGBT)ZBg1_!*=f9HHFZAN-fTN=zrIH1G_Yzkl`gcTxZgc0JnxnzagKZ$HevuRQ& zzPH1*Q}QOehC@K7lnV8fFT2xf_F*=Jd?3|gG8vAo(ld(=Z{mMnS|El;o%n5S)9Xlm z=8Izkt~rOYAP(-GSSEIBZDDY~_lsGF^aKMJf_XtwdR^0!hFhA7y z{&%!|Ps7fy&YL^_&fDTklm(r8hHN@wF55xyVftp*^lVMLvafC zBH2WQN$y{OT}SR!DHS14^w%vetT@XK@Uyr`gwvz%E1!RVb~h%r?y>{*dh%EXiSrgV z68^G8Sq3c4Tq?t&sw9W)EcYCT()am{H%Hb8OxbotXIYMP?k`HE2?E=_iY*Y#L)HY& zDZnc#h4d+O<|dBpI)o@=p@Tu2GdrA1@3x(G7PsxfCi;eLiW`1f^XieRf!Ho&3ZKV_ zXO9ls?0Fs|MVh}M(^CB~*8xPbL++I<=;&*eP~UG`p%KF2Nt-QR^L(4DFGeJ63?^;w z9CX8nsuxr4?a-7 zpW#hk#FDb&?yf@r95&clPwmfdrjX&h=1L%Xt?cRx3zR6~3OS-wGW~rKkdYnv>Sqb9 z)aJy3Iec3q{n1*C9Qze|6;S=%RCkf-hi6=Wc%^S2F=ema!6wKYB%V;coHs@W)Ik+f zwd(Ydc8*Sa$u$pW3To+_emtJWsd{FR({#73S?GFto~^m&UnO?>%Irv=p{&|Uu+MCv z4~x6y9ywWbYbQfe_CAKtM7d`F^t6FM;E|+aZxn2TOAAPAN)2k&HjO!avxRHUvM#8R z%Hg)f{#^>-9?$m`Lmtw}h-a88dj~ttd`71sv&}9&kouIYRigRjY0mL-?8n53Wwp0X z#fUpL5w|ChVMZ04THa}Wq)Lgvr_EXyoxR!4kBbksF5haMG2DShJY7^%@2{t~p`FRAn!}}+hNE^cM|0h_ z{{AzOEv*=&ycw;@B0Bf*ejf>nvu{D4T_IHctAfm73aO5(L^D+}0m0EH2{JHGuDrK2q@lmxuv>v6Uf> zzTR_VudLkBEHlL8Gdllx_mQ#pU|8C78)zQ)UaK{HC zn2KfqFyPZWV`gn7^%j*{sR@f^Rqk4X-Z$FOFIgb3SS4P^e$RVP=PH(yyew4hqh6M! z?~+8OwZ$Dg=INky29?%hA}%UD+rgFe{`xm2K2`!yrIaEJ3r@&cMn*BGxe&MeOHeO+ z&t|}GX5@lfj>BNf6vx#iAC>1UMF^OLLue1PK{z2*3xth7v$kj*_rZ4=8WBYVAPOh# zkLmCI8epJVllST;xJe&rhC{9kFS1yDf1HfdNdnt?>&l@15L_M zD_tfaoRAr*Lx)8TD>tmkyrn+>>#js2PMT=dIBIwxwHl*4CKfHEi<5ylQLY5jAsxph z;kL4j7)J^w5~J$h`&G!&AG%A^z>fKy4I6J{ea-roFrl)V+Q+q$@SAL-JWj+`JMDdu zmbRH4J#c+AUg}O@Oi^*Gmm)#V@b>VlB0ScBmxNa*UF`32NrR&20R$uBGJgidJ}lJO zl~3#ALvwD;qcnPP6P{JNRzk$6x@UC7tAtBM{pshH6^+0|4Yhe{Y;opK2HEAXR{x zMS!u7Ye2B09|WM`2Z4C|yZZ##nG#{AuqkP&f=xo~4vWR8IN$oJeG?787 z+oTi`=pUZ)7J+7k*t3lK{`*oaV2ixipoqE{vZwk%rzfREY5A+u=S$Z*U~TXNksD4I z=G_ivh2Y@JjMD8S4e$;${$a_RA30nx_L0AV9ClGU&IEacuAV%pe1oCMmS=D-s90Rt zmDQ{UF=@m`AhW#;w-47x+%Vf_=tp13QqH-NRONUmy*s_c{iSa*ygrkyNqi*VU;2%A z$2t#i%=PWu$P+bkS6NpYqBKa_Dz2v)-NpwQr6)m;(|ytbmJhbB-EFoC9&y$4;k3~y zK3!OUAIlNA4U6WsAzw8DWcSJ8ca=Z&8|{pu|>J^6Cmg6z``3p|Yw;Bg$3 z(S!i4)3f3i_zBjN?El31Q@_;Fb*S_$BT3WO_hE*+0M3uCL9RubW>b0NA9YeL>g%n& z6Waz@WC~pg&P^MbG8UaXwqg|}aXBfqUZz-QQd#M@E54tWkdc>H!{n{#jb_3UzgQ;XR> zW?Km7tkL)6y7*KLQdo)=2>*V*oJPf|f$Y;&Gt+5fSCCZ$$Y;qwd3eqmnL{X5kNdd* zj~;2-m^G<#m86i$)ltf+&Y=B-H_>BzkQuD!Dy>W1PPN)tfTJRf5h{~v@}1x@GEAp= zJA4I_!=G|hflM5A{76E4BX#rH%yA>cVl|XD9%%8`AfxRQ=eph@bha(4512UY-agqF z`*1*@PFgzdzs1DR2lk;2{AQ9guC+*9e&0gG-BmiPQ5O=25dUB;)GM)C6d%+%w&)nM z_VCiXB=P-yH<2$9AX?W!gn2iR%)1p@(V2C^y00Nr`H)ZE6SV@6$KP4aA{@xvKB%^M z+oX(M;j6I4DEblQiu9JcPDX=cMD5pK^e(!^tP#v_mz@*T(*!`C;>3_<+i`sB1d@!V zn!Js!T96EkCZ8&akivL5xS)(J`7q;0uF3A@Cgr}SjJ`#0Nk$v82UQ`Wa^Y!ZW{-TB z58A-k2X)@t60scOZa+U5E`tfd^6)jgAI=s%^k{IY4X57etKuYVVqkT2Lb1mSwW1yd z6eA34a!o}n;Ax9p8=?loz*{*bf{=T(Cm)%M(b%O`vU&eOn0wkN(+zCHejE0goDZ$8 zN6Ob2SI17WuoWc4sT0s=-lmMAm9)Po?^Z?e&Fuk?foa^3zhHxO+pwk`Pq4Wn5!{${ zz{^J19eVP<5L~l|0YW-cGmhwwAmcUg{)U2q)z~r}{PYM;!fXv=7kFhpA8cdSD+W!q z91P4jpbqIp>_1TqTP&OoB{65Wwp}XAg?r$}xVhux#!Za017Sb3Ao_-+mKZ2qTztCE4^SK42(za zz`zgPD-E7eyu#-@%)eB<7<*Llsk$q>V89=rERS2%=&(g=lB!x)M{PD7&-HLWyoRx! zUSie{FjS2g)xVo@auNOcgo#s`q4?UQ@?d}EFE{|ADj`-)5!jUS%Du%cyAEOIS4URT z+H~;3dDF>v#X%d_7B4`Ar6GIVG)uls*c;=8?*OfS|2)(}w+EXz0c4+i0 z#7Po6_AUx*-gQ<*RSe4F8uQEp=NsY*iNYGciU;4;%X#HSbPmO#`kIiyhhu#Dp4J+p z@hvk>Hoy)vDSbO66)_{TnR!67;c`rQaEPNsjfE)DJ{q+QEmdb#d2BG1#dWd1)_ zTiU-}RsGz*PLuqXl@!5Bc1{4~zX8mjE>{umZKT7kf^{+C!!*}#A zZziCEF>5O@)3MXL8?|g6>ku^JTyJc9`wxhHoeARqCpG7lmF{<(jm^SY(VKl)K&SLv zL+p?bRuq~)p4z`PQ2uoAmNcz*1D@7}pzSf0)k!XO9dwkoK~d5NfEo#S0*WdMcJi2o zF$pAcxTa7k;x0u4`10j!KEC{5LfZz6S)W#dHCJOmJl|WW=qEv+c^Q9zEyC;`%!_(J zl!GEINEC!WVA!Ngd|7L?Ldeqx{=R^4{qT$_n9h-kE#IcRjRJ1`)<9ht^8i*!@$gL- zEHz(J_=?Cvc>-sL)CLu-OuL)k)7-D1Artcks~WZR1jBUdKRUjb0kO1v;7lY7SSJz0 zz!77bXLfx2%_hEVaWbFhcf7&7JllO5%y?(EhDVSrT1&@*!+V?9=$4&zMS zbD88l6WXp(Aq!$NoA8nmTySvFrh)y^TTq$wx~$wMIENX@UZ}XgnQrJ`!qapCW{wQo zR~b?Und}95rKBo&V;)caCzR)MS8*ywm+(bRrBY&S%m*0jw@tv-v5xsmGf`*xB#8_uAQvD7-{Ds1{KKSDrS0eup7xcViNpU=J*k zsU%<*2p-bRx_hVmEp{Wo7mb8sGz6TE#8Kw4>?OdC+0N!WZpgacex<0R`TLw0&iA#+|d z1eW4Ae;{u66(5UJ@N6P1*cY7J{6z6OAL%P)gSyL`z3#=kU2M`(gom|@&$HqE%2O~E zuP%hVMI{w^Gx$4Y&STo;Z3bqyh=$ke?pOsNU(-Y#y!AEu(5pKI!}G>s!r=MBqFiot z8@(rM!#Z+1scL|6{)d_%8=${fUzbmN7C z^)6kLu)q?p1BE5g#Qg*4b6A|0FOe zM-F)z{J_mjH|Ve0=+R1yJz;WS=VcD3izaLiEwe>25NTbw;t_MnBB3Y!aE40e5#Tkh zTXRku)?gQSzqUmgo$AyIi3RrwW9YFP6TBk z(2e^QW#4F;zogRAIG!#GLT5MVD|bO-rFjAx&NpS%$+BZbjDEw|eLn*%h8)nHd*PMH zTIV4M1`p*T5_)j!;Tt8qljdLhr_BGrd0P6NsWc5TaGTrkFq-$IK`;=_=$saPTeZ9XWBe zd~_z;($twSTrbvIEDQQgz714@YH)phgRfN3t9aOXM?%}D)@t$AYt+5h;Boc#D{}nz zUNy74?$29>02M9#=^059OR}Taz|a%AParwKOdPc8N}RY1$WTo>MlNure*}P5eEYf6%I) zFs2iHC>78RLm~9%PM3>jjjDndu&$EAEeC-kVVkLwQ}&zEemtF-Z33tQE32gpFR_=pJrw#FrTs*IF9?7LB3P1P*>K^7Ia9o(9 zfE9aWC^x8EML?)(?QIu=ZJGw0{%oS9%j8`XBI@=s_u3W}Is)vg+Zn%ut2$!y?Klmt zcMA;pBXBE>QP_gJ29Q_tME-_p>-wZY0x$0Zi=WV+NpA&!Z$}Ua0d#|U#tSdmPeoM% z@DVE}$3}lFcM=iC6uL?6BytoT@mC)1loBdr6-m}guS7Ar+VHqnl;+eB&{LX#?N_Xk zEFAF0XIi5PEZK5>2+c1xsOmR{mCfqlp+BEx#}W`aqnoz2IdZ}>T3;+tyYcT#D#!WY zX0!4A#otqi3Vh?xY1#Lu66U(v5T+lqv1I|DJsN70-mGK&QJ@eu6)`Q@_GgtSkSiMw zD+-L15O&}21J`MjYCoZ){=IDXYMK$QuBT4JOV+Jy+DRJ_#!c5!OC2j&ZMhKWritS6 z1*p?Fyx4fDL{s@I`&j*%wK($*DRK9&H+N4cZ&O5p)8k&v@|!Y$S$Q9Wem5MQl>BE5 zZ+A;=ccq)?xa5O1k=)heHp$;ioToA>aDwb34NHTP0WTmKrGQ6e)n5Gupg~bat_)6) z!s5nrdM=;K9d@D8s_r-)N$tlUOebN$6#Hzu$)9)r zx9a`k@5-^LfE>j)uj!M7-xp+)7mYnTG0RVQ_QlEa4}v%2p|f)R1uTIZ!?3{QV+xq` z^-gN&@5yP{O!KE-mb8_7DKp&%(_L^=efo9gzI zy22IbN#NlbuXAzGzk&a07g4B3ru_JZY}%j~8Nk+ag#Yv@kM82g<=FSu!x+@%r@g>9 zl@2RiAM|TV#?N1+pe=6eCUaxB{D0zveZiHrVgdFo-oAzwM^h+xJASZv23x!G$IySJ zmHth3F1N^V`VyV`im+=8MpCd=IA>mH>}_53dKn#V8p-l5pvb`h34Hv$c)-rD)tQ~5 z6-;+0c>a#vP*fth+^6h_`DUSYc;$JAa#YbSDSvh(gqY2e#+bAD-an%zoFN1x_=dkr z)zj!G!)ZQ5dJJ{^U1ep^L-;w~E0qqZtxBQdbesZq@5J(bS`Vz(J6U_FEhe9CJj2Su z@%lbQjW071SJ*x5`-jbA^>SO6c!P-#k%RlN-G2rXAF4Lq3pcr|Y8#Ab98kx`7q`)~9R=1i*))IBHQy`8#V0Ich;!PQTaS>3eHoMP(o5hO{+; zJCol2w;Jt5TYj#035@dOM5UEp5?FPRiJi8w1ZBL2@Qc?XF#uZ#bjDjcamaet7;*%jt(khTk2 zAn{p3kr~+phS61`vzTjVQS!vxWF}|2hc97?jxF%Mo$RW^8hFQ(kyV+AAJXf)WYrFp zi<P@0Pi2Ls9o-Ut>KGyBqYloB|4pVcBV`%%3 zJE`5PZK4vQwa?|NEtR?Qe$+2H%mT#cR%fxh%K8#wAs$IKB-qgBk=>?2rx+8AXnSbzL z&{|8QkGX87m|!Xu*&FToOGTdlU@uUboumvepf7W;#!~G2EzQ#AD zA7F$lnrL%qE1dMt%B-9qBuxhMw$7m4qmH*oRQC8lFOC34aXZ?C_iQ&R4sqotb>`%c zwBter%R>yPyC0yfTy9|`RtSODB5ux20kTW_;XODF<%vfWJP|KWETsZk{6u|_pzg*A z&=Y$MT1EvGVeD0u$d5eXZoVgaBB>l^)}v%5CR8ms`1h~24-BY5UP<0{1qv!<(< zCe2J}LNo+w;3=qAvYP=kU9qcJL#4(P~`L^Z9{toCC%_ z<_LbAIbh#Pg->mKm>BPi$b&Kg)UB_<1wI(>>Aqm8mcc3U9DlPVv*P6Upz=cHVSs4csIdtmHtL+gr~sc~3cwT2j$3(HS> z6@@&EXYYNzhm^)iWQ_f=7Ja7Cp=K%xn_|%76*b3BLhdN*P&&CII0dB$gZ!7@v~AGR zc7*#f%~h7$8kEe+`sSz)}Xz5+6z9ofxX6^O3h4R$E^jqtX>Pv}}3XeCKH zNECE)uR4u96pX(%J5`sPj=Ls3WGIGBdKShOV9?c1w|OgYjpK{$9jzULGZ&@ejy`tT z)$I!U`IK7=qID$bWb$3MA~KzZ&6MH-{j48<|5U5k%qFChb7|7ONeXJOh6ba`-qZ>! zrqH^Ttm$pm!0fU^OA~zw=Rlg%O? zq1JB$Yy~aVT!}!@g@&Ph{7#CqjLGe67mSzm~zsJVoT-eT!rXC~DKvpMlwp zhH7LL97@B|{OzGdFgWl^O|&S*zo-+CSrI~ZV_JM1nT3DIL-tMR_rM>I-l*+^{}cCj zZtUyZqgPp-h21+f823-&*`MD03|5Lvi&)NlJI4kmx%@d&d~?SJl`egB62A_Q?Defu z!lyskN|nF9hYhTJR(C0|!B)tYUKBRI8)Xi@RDpt(*1GLj7GXG{5oD52atZi#)sKD`^ zQQ}!QN`(CAd)lD_8GM-!OuevywK~4nLs1+1pBgXGgUJD%<-{xOB1XyK9B(X_ly3If zvdvPs8faH+#eX@_$V;ard^*6LJF=*}Fs@>l9eiaMk2X!<>8DjuCQUP&l?Yyj!+9=W zY!Vth)H2Khm^y)JDlWK zmDv}G)@5hDA(FEyV4*wZi3}yv8J-u$XHv5&b}12Y8v613q@_xWKPypWW4f8ZJQof!mT|AC1vO}hzs1)fD# z4Q+cSpRSjzATyuiVPSz)8Db$JL?E(4Nt1EfWLr!;tP}#YwU5;{?H;4u(z7mYhH~EVumQAp;;^1$M=mBtNTA5u&(qs^D>c! zwd+ZPtYme>X`^bJjW~6QyCJmvrrY;(Q{;=e_z9GCJLt4u8garj-n%)fDl626vt)gz z&O(4m36>c7vDt}{&%FAe$rpF3eD6Hf%821oCI`%dU4sUGYIM-GuhU2BslN=4u=Qz&QF^$)}xE z?H1VWWIumQ*A8Gzbl;SwRhB5HaUH@Z-YJBIECYoi1>En+s|>4x%}e5fI83qoSQ2&@ zYuDD81WQ`>7@#&q8n}8u*-w6D4BgM%EQAlX>J|A8&z$4@Y*&S2M2M|kF!YP*(nyRG ztSt-0Yq@l1)cQy)eJq3132d7Lbs)Cl*D;1SmsTeBryYJ7I#|A0pe<^&)J%BH6AjUZ zl2}sFp26%H<7^M!PYV6zU%;y9sd82+?ml&Uh>2cZVrEKxv5*#(JL5znZ!exGMhlL__SVzD~zKyF6`luG}#KeFDUQrq6rX-;| z61sGmOpP(_Vs`O4rU?&Dk)@T!#$q44<}BG|GANNGy^tXRsxn;mo<*_KvHdL1;1{kh zxPO*Ah6thOnn8!~94CYG1Tefc^g_gLh@+j!)a%J6@M-DGVr038H#?nfa}XB)(Q{8(P|4dO4Rg) zB$pp1(P&SyoR_5!A$Aa949|n$;BEKl+wmoG?l+7Mu7Y!u)W{yXlxbYRm%U$DQukeu-&qKuE44N@o@I