blueprint:
  name: Controller - Philips 929002398602 Hue Dimmer switch v2
  description: "# Controller - Philips 929002398602 Hue Dimmer switch v2\n\nController
    automation for executing any kind of action triggered by the provided Philips
    929002398602 Hue Dimmer switch v2. Allows to optionally loop an action on a button
    long press.\nSupports ZHA, Zigbee2MQTT.\n\nAutomations created with this blueprint
    can be connected with one or more [Hooks](https://epmatt.github.io/awesome-ha-blueprints/docs/blueprints/hooks)
    supported by this controller.\nHooks allow to easily create controller-based automations
    for interacting with media players, lights, covers and more.\nSee the list of
    [Hooks available for this controller](https://epmatt.github.io/awesome-ha-blueprints/docs/blueprints/controllers/philips_929002398602#available-hooks)
    for additional details.\n\n\U0001F4D5 Full documentation regarding this blueprint
    is available [here](https://epmatt.github.io/awesome-ha-blueprints/docs/blueprints/controllers/philips_929002398602).\n\n\U0001F680
    This blueprint is part of the **[Awesome HA Blueprints](https://epmatt.github.io/awesome-ha-blueprints)
    project**.\n\nℹ️ Version 2022.08.08\n"
  source_url: https://github.com/EPMatt/awesome-ha-blueprints/blob/main/blueprints/controllers/philips_929002398602/philips_929002398602.yaml
  domain: automation
  input:
    integration:
      name: (Required) Integration
      description: Integration used for connecting the remote with Home Assistant.
        Select one of the available values.
      selector:
        select:
          options:
          - ZHA
          - Zigbee2MQTT
          sort: false
          custom_value: false
          multiple: false
    controller_device:
      name: (ZHA) Controller Device
      description: The controller device to use for the automation. Choose a value
        only if the remote is integrated with ZHA.
      default: ''
      selector:
        device: {}
    controller_entity:
      name: (Zigbee2MQTT) Controller Entity
      description: The action sensor of the controller to use for the automation.
        Choose a value only if the remote is integrated with Zigbee2MQTT.
      default: ''
      selector:
        entity:
          domain:
          - sensor
          multiple: false
    helper_last_controller_event:
      name: (Required) Helper - Last Controller Event
      description: Input Text used to store the last event fired by the controller.
        You will need to manually create a text input entity for this, please read
        the blueprint Additional Notes for more info.
      default: ''
      selector:
        entity:
          domain:
          - input_text
          multiple: false
    action_button_on_short:
      name: (Optional) On button short press
      description: Action to run on short on button press.
      default: []
      selector:
        action: {}
    action_button_on_long:
      name: (Optional) On button long press
      description: Action to run on long on button press.
      default: []
      selector:
        action: {}
    action_button_on_release:
      name: (Optional) On button release
      description: Action to run on on button release after long press.
      default: []
      selector:
        action: {}
    action_button_on_double:
      name: (Optional) On button double press
      description: Action to run on double on button press.
      default: []
      selector:
        action: {}
    action_button_off_short:
      name: (Optional) Off button short press
      description: Action to run on short off button press.
      default: []
      selector:
        action: {}
    action_button_off_long:
      name: (Optional) Off button long press
      description: Action to run on long off button press.
      default: []
      selector:
        action: {}
    action_button_off_release:
      name: (Optional) Off button release
      description: Action to run on off button release after long press.
      default: []
      selector:
        action: {}
    action_button_off_double:
      name: (Optional) Off button double press
      description: Action to run on double off button press.
      default: []
      selector:
        action: {}
    action_button_up_short:
      name: (Optional) Up button short press
      description: Action to run on short up button press.
      default: []
      selector:
        action: {}
    action_button_up_long:
      name: (Optional) Up button long press
      description: Action to run on long up button press.
      default: []
      selector:
        action: {}
    action_button_up_release:
      name: (Optional) Up button release
      description: Action to run on up button release after long press.
      default: []
      selector:
        action: {}
    action_button_up_double:
      name: (Optional) Up button double press
      description: Action to run on double up button press.
      default: []
      selector:
        action: {}
    action_button_down_short:
      name: (Optional) Down button short press
      description: Action to run on short down button press.
      default: []
      selector:
        action: {}
    action_button_down_long:
      name: (Optional) Down button long press
      description: Action to run on long down button press.
      default: []
      selector:
        action: {}
    action_button_down_release:
      name: (Optional) Down button release
      description: Action to run on down button release after long press.
      default: []
      selector:
        action: {}
    action_button_down_double:
      name: (Optional) Down button double press
      description: Action to run on double down button press.
      default: []
      selector:
        action: {}
    button_on_long_loop:
      name: (Optional) On button long press - loop until release
      description: Loop the on button action until the button is released.
      default: false
      selector:
        boolean: {}
    button_on_long_max_loop_repeats:
      name: (Optional) On button long press - Maximum loop repeats
      description: Maximum number of repeats for the custom action, when looping is
        enabled. Use it as a safety limit to prevent an endless loop in case the corresponding
        stop event is not received.
      default: 500
      selector:
        number:
          min: 1.0
          max: 5000.0
          mode: slider
          step: 1.0
    button_off_long_loop:
      name: (Optional) Off button long press - loop until release
      description: Loop the off button action until the button is released.
      default: false
      selector:
        boolean: {}
    button_off_long_max_loop_repeats:
      name: (Optional) Off button long press - Maximum loop repeats
      description: Maximum number of repeats for the custom action, when looping is
        enabled. Use it as a safety limit to prevent an endless loop in case the corresponding
        stop event is not received.
      default: 500
      selector:
        number:
          min: 1.0
          max: 5000.0
          mode: slider
          step: 1.0
    button_up_long_loop:
      name: (Optional) Up button long press - loop until release
      description: Loop the up button action until the button is released.
      default: false
      selector:
        boolean: {}
    button_up_long_max_loop_repeats:
      name: (Optional) Up button long press - Maximum loop repeats
      description: Maximum number of repeats for the custom action, when looping is
        enabled. Use it as a safety limit to prevent an endless loop in case the corresponding
        stop event is not received.
      default: 500
      selector:
        number:
          min: 1.0
          max: 5000.0
          mode: slider
          step: 1.0
    button_down_long_loop:
      name: (Optional) Down button long press - loop until release
      description: Loop the down button action until the button is released.
      default: false
      selector:
        boolean: {}
    button_down_long_max_loop_repeats:
      name: (Optional) Down button long press - Maximum loop repeats
      description: Maximum number of repeats for the custom action, when looping is
        enabled. Use it as a safety limit to prevent an endless loop in case the corresponding
        stop event is not received.
      default: 500
      selector:
        number:
          min: 1.0
          max: 5000.0
          mode: slider
          step: 1.0
    button_on_double_press:
      name: (Optional) Expose on button double press event
      description: Choose whether or not to expose the virtual double press event
        for the on button. Turn this on if you are providing an action for the on
        button double press event.
      default: false
      selector:
        boolean: {}
    button_off_double_press:
      name: (Optional) Expose off button double press event
      description: Choose whether or not to expose the virtual double press event
        for the off button. Turn this on if you are providing an action for the off
        button double press event.
      default: false
      selector:
        boolean: {}
    button_up_double_press:
      name: (Optional) Expose up button double press event
      description: Choose whether or not to expose the virtual double press event
        for the up button. Turn this on if you are providing an action for the up
        button double press event.
      default: false
      selector:
        boolean: {}
    button_down_double_press:
      name: (Optional) Expose down button double press event
      description: Choose whether or not to expose the virtual double press event
        for the down button. Turn this on if you are providing an action for the down
        button double press event.
      default: false
      selector:
        boolean: {}
    helper_double_press_delay:
      name: (Optional) Helper - Double Press delay
      description: Max delay between the first and the second button press for the
        double press event. Provide a value only if you are using a double press action.
        Increase this value if you notice that the double press action is not triggered
        properly.
      default: 500
      selector:
        number:
          min: 100.0
          max: 5000.0
          unit_of_measurement: milliseconds
          mode: box
          step: 10.0
    helper_debounce_delay:
      name: (Optional) Helper - Debounce delay
      description: Delay used for debouncing RAW controller events, by default set
        to 0. A value of 0 disables the debouncing feature. Increase this value if
        you notice custom actions or linked Hooks running multiple times when interacting
        with the device. When the controller needs to be debounced, usually a value
        of 100 is enough to remove all duplicate events.
      default: 0
      selector:
        number:
          min: 0.0
          max: 1000.0
          unit_of_measurement: milliseconds
          mode: box
          step: 10.0
variables:
  integration: !input integration
  button_on_long_loop: !input button_on_long_loop
  button_on_long_max_loop_repeats: !input button_on_long_max_loop_repeats
  button_on_double_press: !input button_on_double_press
  button_off_long_loop: !input button_off_long_loop
  button_off_long_max_loop_repeats: !input button_off_long_max_loop_repeats
  button_off_double_press: !input button_off_double_press
  button_up_long_loop: !input button_up_long_loop
  button_up_long_max_loop_repeats: !input button_up_long_max_loop_repeats
  button_up_double_press: !input button_up_double_press
  button_down_long_loop: !input button_down_long_loop
  button_down_long_max_loop_repeats: !input button_down_long_max_loop_repeats
  button_down_double_press: !input button_down_double_press
  helper_last_controller_event: !input helper_last_controller_event
  helper_double_press_delay: !input helper_double_press_delay
  helper_debounce_delay: !input helper_debounce_delay
  integration_id: '{{ integration | lower }}'
  adjusted_double_press_delay: '{{ [helper_double_press_delay - helper_debounce_delay,
    100] | max }}'
  actions_mapping:
    zha:
      button_on_short:
      - on_press
      - on_press_release
      button_on_long:
      - on_hold
      button_on_release:
      - on_long_release
      button_off_short:
      - off_press
      - off_press_release
      button_off_long:
      - off_hold
      button_off_release:
      - off_long_release
      button_up_short:
      - up_press
      button_up_long:
      - up_hold
      button_up_release:
      - up_long_release
      button_down_short:
      - down_press
      button_down_long:
      - down_hold
      button_down_release:
      - down_long_release
    zigbee2mqtt:
      button_on_short:
      - on_press
      - on_press_release
      button_on_long:
      - on_hold
      button_on_release:
      - on_hold_release
      button_off_short:
      - off_press
      - off_press_release
      button_off_long:
      - off_hold
      button_off_release:
      - off_hold_release
      button_up_short:
      - up_press
      button_up_long:
      - up_hold
      button_up_release:
      - up_hold_release
      button_down_short:
      - down_press
      button_down_long:
      - down_hold
      button_down_release:
      - down_hold_release
  button_on_short: '{{ actions_mapping[integration_id]["button_on_short"] }}'
  button_on_long: '{{ actions_mapping[integration_id]["button_on_long"] }}'
  button_on_release: '{{ actions_mapping[integration_id]["button_on_release"] }}'
  button_off_short: '{{ actions_mapping[integration_id]["button_off_short"] }}'
  button_off_long: '{{ actions_mapping[integration_id]["button_off_long"] }}'
  button_off_release: '{{ actions_mapping[integration_id]["button_off_release"] }}'
  button_up_short: '{{ actions_mapping[integration_id]["button_up_short"] }}'
  button_up_long: '{{ actions_mapping[integration_id]["button_up_long"] }}'
  button_up_release: '{{ actions_mapping[integration_id]["button_up_release"] }}'
  button_down_short: '{{ actions_mapping[integration_id]["button_down_short"] }}'
  button_down_long: '{{ actions_mapping[integration_id]["button_down_long"] }}'
  button_down_release: '{{ actions_mapping[integration_id]["button_down_release"]
    }}'
  controller_entity: !input controller_entity
  controller_device: !input controller_device
  controller_id: '{% if integration_id=="zigbee2mqtt" %}{{controller_entity}}{% else
    %}{{controller_device}}{% endif %}'
mode: restart
max_exceeded: silent
trigger:
- platform: event
  event_type: state_changed
  event_data:
    entity_id: !input controller_entity
- platform: event
  event_type:
  - zha_event
  event_data:
    device_id: !input controller_device
condition:
- condition: and
  conditions:
  - '{%- set trigger_action -%} {%- if integration_id == "zigbee2mqtt" -%} {{ trigger.event.data.new_state.state
    }} {%- elif integration_id == "deconz" -%} {{ trigger.event.data.event }} {%-
    elif integration_id == "zha" -%} {{ trigger.event.data.command }} {%- endif -%}
    {%- endset -%} {{ trigger_action not in ["","None"] }}'
  - '{{ integration_id != "zigbee2mqtt" or trigger.event.data.new_state.state != trigger.event.data.old_state.state
    }}'
action:
- delay:
    milliseconds: !input helper_debounce_delay
- variables:
    trigger_action: '{%- if integration_id == "zigbee2mqtt" -%} {{ trigger.event.data.new_state.state
      }} {%- elif integration_id == "deconz" -%} {{ trigger.event.data.event }} {%-
      elif integration_id == "zha" -%} {{ trigger.event.data.command }} {%- endif
      -%}'
    trigger_delta: '{{ (as_timestamp(now()) - ((states(helper_last_controller_event)
      | from_json).t if helper_last_controller_event is not none and (states(helper_last_controller_event)
      | regex_match("^\{((\"a\": \".*\"|\"t\": \d+\.\d+)(, )?){2}\}$")) else as_timestamp("1970-01-01
      00:00:00"))) * 1000 }}'
- service: input_text.set_value
  data:
    entity_id: !input helper_last_controller_event
    value: '{{ {"a":trigger_action,"t":as_timestamp(now())} | to_json }}'
- choose:
  - conditions: '{{ trigger_action | string in button_on_short }}'
    sequence:
    - choose:
      - conditions: '{{ button_on_double_press }}'
        sequence:
        - choose:
          - conditions: '{{ trigger_action | string in states(helper_last_controller_event)
              and trigger_delta | int <= helper_double_press_delay | int }}'
            sequence:
            - service: input_text.set_value
              data:
                entity_id: !input helper_last_controller_event
                value: '{{ {"a":"double_press","t":as_timestamp(now())} | to_json
                  }}'
            - event: ahb_controller_event
              event_data:
                controller: '{{ controller_id }}'
                action: button_on_double
            - choose:
              - conditions: []
                sequence: !input action_button_on_double
          default:
          - delay:
              milliseconds: '{{ adjusted_double_press_delay }}'
          - event: ahb_controller_event
            event_data:
              controller: '{{ controller_id }}'
              action: button_on_short
          - choose:
            - conditions: []
              sequence: !input action_button_on_short
      default:
      - event: ahb_controller_event
        event_data:
          controller: '{{ controller_id }}'
          action: button_on_short
      - choose:
        - conditions: []
          sequence: !input action_button_on_short
  - conditions: '{{ trigger_action | string in button_on_long }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_on_long
    - choose:
      - conditions: '{{ button_on_long_loop }}'
        sequence:
        - repeat:
            while: '{{ repeat.index < button_on_long_max_loop_repeats | int }}'
            sequence: !input action_button_on_long
      default: !input action_button_on_long
  - conditions: '{{ trigger_action | string in button_on_release }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_on_release
    - choose:
      - conditions: []
        sequence: !input action_button_on_release
  - conditions: '{{ trigger_action | string in button_off_short }}'
    sequence:
    - choose:
      - conditions: '{{ button_off_double_press }}'
        sequence:
        - choose:
          - conditions: '{{ trigger_action | string in states(helper_last_controller_event)
              and trigger_delta | int <= helper_double_press_delay | int }}'
            sequence:
            - service: input_text.set_value
              data:
                entity_id: !input helper_last_controller_event
                value: '{{ {"a":"double_press","t":as_timestamp(now())} | to_json
                  }}'
            - event: ahb_controller_event
              event_data:
                controller: '{{ controller_id }}'
                action: button_off_double
            - choose:
              - conditions: []
                sequence: !input action_button_off_double
          default:
          - delay:
              milliseconds: '{{ adjusted_double_press_delay }}'
          - event: ahb_controller_event
            event_data:
              controller: '{{ controller_id }}'
              action: button_off_short
          - choose:
            - conditions: []
              sequence: !input action_button_off_short
      default:
      - event: ahb_controller_event
        event_data:
          controller: '{{ controller_id }}'
          action: button_off_short
      - choose:
        - conditions: []
          sequence: !input action_button_off_short
  - conditions: '{{ trigger_action | string in button_off_long }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_off_long
    - choose:
      - conditions: '{{ button_off_long_loop }}'
        sequence:
        - repeat:
            while: '{{ repeat.index < button_off_long_max_loop_repeats | int }}'
            sequence: !input action_button_off_long
      default: !input action_button_off_long
  - conditions: '{{ trigger_action | string in button_off_release }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_off_release
    - choose:
      - conditions: []
        sequence: !input action_button_off_release
  - conditions: '{{ trigger_action | string in button_up_short }}'
    sequence:
    - choose:
      - conditions: '{{ button_up_double_press }}'
        sequence:
        - choose:
          - conditions: '{{ trigger_action | string in states(helper_last_controller_event)
              and trigger_delta | int <= helper_double_press_delay | int }}'
            sequence:
            - service: input_text.set_value
              data:
                entity_id: !input helper_last_controller_event
                value: '{{ {"a":"double_press","t":as_timestamp(now())} | to_json
                  }}'
            - event: ahb_controller_event
              event_data:
                controller: '{{ controller_id }}'
                action: button_up_double
            - choose:
              - conditions: []
                sequence: !input action_button_up_double
          default:
          - delay:
              milliseconds: '{{ adjusted_double_press_delay }}'
          - event: ahb_controller_event
            event_data:
              controller: '{{ controller_id }}'
              action: button_up_short
          - choose:
            - conditions: []
              sequence: !input action_button_up_short
      default:
      - event: ahb_controller_event
        event_data:
          controller: '{{ controller_id }}'
          action: button_up_short
      - choose:
        - conditions: []
          sequence: !input action_button_up_short
  - conditions: '{{ trigger_action | string in button_up_long }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_up_long
    - choose:
      - conditions: '{{ button_up_long_loop }}'
        sequence:
        - repeat:
            while: '{{ repeat.index < button_up_long_max_loop_repeats | int }}'
            sequence: !input action_button_up_long
      default: !input action_button_up_long
  - conditions: '{{ trigger_action | string in button_up_release }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_up_release
    - choose:
      - conditions: []
        sequence: !input action_button_up_release
  - conditions: '{{ trigger_action | string in button_down_short }}'
    sequence:
    - choose:
      - conditions: '{{ button_down_double_press }}'
        sequence:
        - choose:
          - conditions: '{{ trigger_action | string in states(helper_last_controller_event)
              and trigger_delta | int <= helper_double_press_delay | int }}'
            sequence:
            - service: input_text.set_value
              data:
                entity_id: !input helper_last_controller_event
                value: '{{ {"a":"double_press","t":as_timestamp(now())} | to_json
                  }}'
            - event: ahb_controller_event
              event_data:
                controller: '{{ controller_id }}'
                action: button_down_double
            - choose:
              - conditions: []
                sequence: !input action_button_down_double
          default:
          - delay:
              milliseconds: '{{ adjusted_double_press_delay }}'
          - event: ahb_controller_event
            event_data:
              controller: '{{ controller_id }}'
              action: button_down_short
          - choose:
            - conditions: []
              sequence: !input action_button_down_short
      default:
      - event: ahb_controller_event
        event_data:
          controller: '{{ controller_id }}'
          action: button_down_short
      - choose:
        - conditions: []
          sequence: !input action_button_down_short
  - conditions: '{{ trigger_action | string in button_down_long }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_down_long
    - choose:
      - conditions: '{{ button_down_long_loop }}'
        sequence:
        - repeat:
            while: '{{ repeat.index < button_down_long_max_loop_repeats | int }}'
            sequence: !input action_button_down_long
      default: !input action_button_down_long
  - conditions: '{{ trigger_action | string in button_down_release }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_down_release
    - choose:
      - conditions: []
        sequence: !input action_button_down_release
