blueprint:
  name: Controller - IKEA E1743 TRÅDFRI On/Off Switch & Dimmer
  description: "# Controller - IKEA E1743 TRÅDFRI On/Off Switch & Dimmer\n\nController
    automation for executing any kind of action triggered by the provided IKEA E1743
    TRÅDFRI On/Off Switch & Dimmer. Allows to optionally loop an action on a button
    long press.\nSupports deCONZ, 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/ikea_e1743#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/ikea_e1743).\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/ikea_e1743/ikea_e1743.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:
          - deCONZ
          - ZHA
          - Zigbee2MQTT
          custom_value: false
          multiple: false
          sort: false
    controller_device:
      name: (deCONZ, ZHA) Controller Device
      description: The controller device to use for the automation. Choose a value
        only if the remote is integrated with deCONZ, 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_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_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_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_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:
    deconz:
      button_up_short:
      - '1002'
      button_up_long:
      - '1001'
      button_up_release:
      - '1003'
      button_down_short:
      - '2002'
      button_down_long:
      - '2001'
      button_down_release:
      - '2003'
    zha:
      button_up_short:
      - 'on'
      button_up_long:
      - move_with_on_off_0_83
      button_up_release:
      - stop
      button_down_short:
      - 'off'
      button_down_long:
      - move_1_83
      button_down_release:
      - stop
    zigbee2mqtt:
      button_up_short:
      - 'on'
      button_up_long:
      - brightness_move_up
      button_up_release:
      - brightness_stop
      button_down_short:
      - 'off'
      button_down_long:
      - brightness_move_down
      button_down_release:
      - brightness_stop
  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"]
    }}'
  integrations_with_prev_event_storage:
  - zha
  - zigbee2mqtt
  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:
  - deconz_event
  - 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 }}{{"_" if trigger.event.data.args|length
    > 0}}{{ trigger.event.data.args|join("_") }} {%- 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 }}{{"_" if trigger.event.data.args|length
      > 0}}{{ trigger.event.data.args|join("_") }} {%- 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 }}'
    last_controller_event: '{{ (states(helper_last_controller_event) | from_json).a
      if helper_last_controller_event is not none and (states(helper_last_controller_event)
      | regex_match("^\{((\"a\": \".*\"|\"t\": \d+\.\d+)(, )?){2}\}$")) else "" }}'
- 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_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 }}'
    - '{{ not integration_id in integrations_with_prev_event_storage or last_controller_event
      | string in button_up_long }}'
    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 }}'
    - '{{ not integration_id in integrations_with_prev_event_storage or last_controller_event
      | string in button_down_long }}'
    sequence:
    - event: ahb_controller_event
      event_data:
        controller: '{{ controller_id }}'
        action: button_down_release
    - choose:
      - conditions: []
        sequence: !input action_button_down_release
