From fee66e39e7ecd998eb81389dde6bf1526b633fde Mon Sep 17 00:00:00 2001 From: aderusha Date: Mon, 5 Jul 2021 16:21:43 -0400 Subject: [PATCH] Update alarm blueprint to allow multiple arm services --- .../hasp_Display_Alarm_Control_page7.yaml | 128 ++++++++++++++---- images/hasp_Display_Alarm_Control_page7.png | Bin 7321 -> 7837 bytes 2 files changed, 105 insertions(+), 23 deletions(-) diff --git a/Home_Assistant/blueprints/hasp_Display_Alarm_Control_page7.yaml b/Home_Assistant/blueprints/hasp_Display_Alarm_Control_page7.yaml index 33b7d66..41ddd5f 100644 --- a/Home_Assistant/blueprints/hasp_Display_Alarm_Control_page7.yaml +++ b/Home_Assistant/blueprints/hasp_Display_Alarm_Control_page7.yaml @@ -47,14 +47,32 @@ blueprint: max: 10 mode: slider unit_of_measurement: digits - armservice: - name: "Alarm arm service" - description: 'Enter the alarm service call to issue when the ARM button is pressed. Typically this is one of "alarm_arm_away", "alarm_arm_home", "alarm_arm_night", or "alarm_arm_custom_bypass".' + b13armservice: + name: "Lower-left arm service" + description: "Select the alarm arm service to call when system is armed with the lower-left button" + default: "alarm_arm_home" + selector: + select: + options: + - "alarm_arm_home" + - "alarm_arm_away" + - "alarm_arm_night" + - "alarm_arm_vacation" + - "alarm_arm_custom_bypass" + b15armservice: + name: "Lower-right arm service" + description: "Select the alarm arm service to call when system is armed with the lower-right button" default: "alarm_arm_away" selector: - text: + select: + options: + - "alarm_arm_home" + - "alarm_arm_away" + - "alarm_arm_night" + - "alarm_arm_vacation" + - "alarm_arm_custom_bypass" -mode: parallel +mode: queued max_exceeded: silent variables: @@ -67,7 +85,8 @@ variables: {%- endfor -%} alarmpanel: !input alarmpanel codelength: !input codelength - armservice: !input armservice + b13armservice: !input b13armservice + b15armservice: !input b15armservice commandtopic: '{{ "hasp/" ~ haspname ~ "/command/" }}' jsontopic: '{{ "hasp/" ~ haspname ~ "/state/json" }}' jsoncommandtopic: '{{ "hasp/" ~ haspname ~ "/command/json" }}' @@ -135,10 +154,49 @@ variables: {%- set green=(state_attr(color.source, "rgb_color")[1] * brightness)|int -%} {%- set blue=(state_attr(color.source, "rgb_color")[2] * brightness)|int -%} {{ (red|bitwise_and(248)*256) + (green|bitwise_and(252)*8) + (blue|bitwise_and(248)/8)|int }} - alarmstate: '{% if states(alarmpanel)|lower == "disarmed" %}disarmed{% elif states(alarmpanel)|lower == "arming" %}arming{% else %}armed{% endif %}' - alarmstate_text: '{% if alarmstate == "disarmed" %}not\\rarmed{% elif alarmstate == "arming" %}arming{% else %}armed{% endif %}' - alarmaction_text: '{% if alarmstate == "disarmed" %}arm{% else %}disarm{% endif %}' - armservice_name: '{{"alarm_control_panel." ~ armservice}}' + + b13text: >- + {%- if states(alarmpanel) == "disarmed" -%} + {%- if b13armservice == "alarm_arm_home" -%} + arm\\rhome + {%- elif b13armservice == "alarm_arm_away" -%} + arm\\raway + {%- elif b13armservice == "alarm_arm_night" -%} + arm\\rnight + {%- elif b13armservice == "alarm_arm_vacation" -%} + arm\\rvaca + {%- elif b13armservice == "alarm_arm_custom_bypass" -%} + arm\\rbypass + {%- endif -%} + {%- elif states(alarmpanel) == "arming" -%} + arming + {%- elif states(alarmpanel) == "armed_home" -%} + armed\\rhome + {%- elif states(alarmpanel) == "armed_away" -%} + armed\\raway + {%- elif states(alarmpanel) == "armed_night" -%} + armed\\rnight + {%- elif states(alarmpanel) == "armed_vacation" -%} + armed\\rvaca + {%- elif states(alarmpanel) == "armed_custom_bypass" -%} + armedbypass + {%- endif -%} + b15text: >- + {%- if states(alarmpanel) == "disarmed" -%} + {%- if b15armservice == "alarm_arm_home" -%} + arm\\rhome + {%- elif b15armservice == "alarm_arm_away" -%} + arm\\raway + {%- elif b15armservice == "alarm_arm_night" -%} + arm\\rnight + {%- elif b15armservice == "alarm_arm_vacation" -%} + arm\\rvaca + {%- elif b15armservice == "alarm_arm_custom_bypass" -%} + arm\\rbypass + {%- endif -%} + {%- else -%} + disarm + {%- endif -%} trigger_variables: haspdevice: !input haspdevice @@ -219,7 +277,7 @@ action: payload: >- ["p[7].b[13].font=6", "p[7].b[15].font=6", - {%- if alarmstate == "disarmed" -%} + {%- if states(alarmpanel) == "disarmed" -%} "p[7].b[13].pco={{selectedfg}}", "p[7].b[13].bco={{selectedbg}}", "p[7].b[13].pco2={{unselectedfg}}", @@ -238,8 +296,8 @@ action: "p[7].b[15].pco2={{selectedfg}}", "p[7].b[15].bco2={{selectedbg}}", {%- endif -%} - "p[7].b[13].txt=\"{{alarmstate_text}}\"", - "p[7].b[15].txt=\"{{alarmaction_text}}\""] + "p[7].b[13].txt=\"{{b13text}}\"", + "p[7].b[15].txt=\"{{b15text}}\""] - repeat: count: "{{codelength}}" sequence: @@ -282,7 +340,7 @@ action: data: topic: "{{jsoncommandtopic}}" payload: >- - [{%- if alarmstate == "disarmed" -%} + [{%- if states(alarmpanel) == "disarmed" -%} "p[7].b[13].pco={{selectedfg}}", "p[7].b[13].bco={{selectedbg}}", "p[7].b[13].pco2={{unselectedfg}}", @@ -301,8 +359,8 @@ action: "p[7].b[15].pco2={{selectedfg}}", "p[7].b[15].bco2={{selectedbg}}", {%- endif -%} - "p[7].b[13].txt=\"{{alarmstate_text}}\"", - "p[7].b[15].txt=\"{{alarmaction_text}}\""] + "p[7].b[13].txt=\"{{b13text}}\"", + "p[7].b[15].txt=\"{{b15text}}\""] ######################################################################### # Handle MQTT message triggers @@ -344,12 +402,36 @@ action: {{button|int}} ######################################################################### - # Arm was pressed + # b13 arm was pressed - conditions: - condition: template - value_template: '{{ (trigger.payload_json.event is defined) and (trigger.payload_json.event == "p[7].b[15]") and (trigger.payload_json.value == "ON") and (alarmstate == "disarmed")}}' + value_template: '{{ (trigger.payload_json.event is defined) and (trigger.payload_json.event == "p[7].b[13]") and (trigger.payload_json.value == "ON") and (states(alarmpanel) == "disarmed")}}' sequence: - - service_template: "{{armservice_name}}" + - service_template: "{{'alarm_control_panel.' ~ b13armservice}}" + data: + entity_id: !input alarmpanel + code: >- + {%- set code = namespace() -%} + {%- set code.value = states("number." ~ haspname ~ "_alarmcode_" ~ codelength)|int -%} + {%- for i in range(1,codelength|int) -%} + {%- set code.value = code.value|int * 10 + (states("number." ~ haspname ~ "_alarmcode_" ~ (codelength|int - i))|int) -%} + {%- endfor -%} + {{code.value|int}} + - repeat: + count: "{{codelength}}" + sequence: + # clear out code entry after arm attempt + - service: number.set_value + data: + entity_id: "number.{{haspname}}_alarmcode_{{repeat.index}}" + value: -1 + ######################################################################### + # b15 arm was pressed + - conditions: + - condition: template + value_template: '{{ (trigger.payload_json.event is defined) and (trigger.payload_json.event == "p[7].b[15]") and (trigger.payload_json.value == "ON") and (states(alarmpanel) == "disarmed")}}' + sequence: + - service_template: "{{'alarm_control_panel.' ~ b15armservice}}" data: entity_id: !input alarmpanel code: >- @@ -405,7 +487,7 @@ action: payload: >- [{%- for i in range(4,15) if not i == 13 -%} "p[7].b[{{i}}].pco={{selectedfg}}",{%- endfor -%} - {%- if alarmstate == "disarmed" -%} + {%- if states(alarmpanel) == "disarmed" -%} "p[7].b[13].pco={{selectedfg}}", "p[7].b[15].pco={{selectedfg}}" {%- else -%} @@ -425,7 +507,7 @@ action: payload: >- [{%- for i in range(4,15) if not i == 13 -%} "p[7].b[{{i}}].bco={{selectedbg}}",{%- endfor -%} - {%- if alarmstate == "disarmed" -%} + {%- if states(alarmpanel) == "disarmed" -%} "p[7].b[13].bco={{selectedbg}}", "p[7].b[15].bco={{selectedbg}}" {%- else -%} @@ -445,7 +527,7 @@ action: payload: >- [{%- for i in range(4,15) if not i == 13 -%} "p[7].b[{{i}}].pco2={{unselectedfg}}",{%- endfor -%} - {%- if alarmstate == "disarmed" -%} + {%- if states(alarmpanel) == "disarmed" -%} "p[7].b[13].pco2={{unselectedfg}}", "p[7].b[15].pco2={{unselectedfg}}" {%- else -%} @@ -465,7 +547,7 @@ action: payload: >- [{%- for i in range(4,15) if not i == 13 -%} "p[7].b[{{i}}].bco2={{unselectedbg}}",{%- endfor -%} - {%- if alarmstate == "disarmed" -%} + {%- if states(alarmpanel) == "disarmed" -%} "p[7].b[13].bco2={{unselectedbg}}", "p[7].b[15].bco2={{unselectedbg}}" {%- else -%} diff --git a/images/hasp_Display_Alarm_Control_page7.png b/images/hasp_Display_Alarm_Control_page7.png index 571cb2eada6f8feb4bd37760bec80f1f45b9b71b..97879291d61f8340a46b090e412f51428fb51c10 100644 GIT binary patch literal 7837 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 literal 7321 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