Advertisement
Guest User

Untitled

a guest
Apr 30th, 2025
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 10.92 KB | None | 0 0
  1. blueprint:
  2.     name: EnOcean PTM215Z Double Click and Dimming, v4
  3.     description: |
  4.      This blueprint provides dimming control for two separate light groups.
  5.       Left buttons (1-2) control the left group, right buttons (3-4) control the right group.
  6.       Hold buttons to dim, short press for other actions.
  7.       Buttons 1+3 and 2+4 combinations support long press actions.
  8.       Double-click support is available for all buttons.
  9.     domain: automation
  10.     input:
  11.       controller_left:
  12.         name: (Zigbee2MQTT) Device Name (Left Group)
  13.         description: The name of the left group device as defined in z2m
  14.         default: ''
  15.       controller_right:
  16.         name: (Zigbee2MQTT) Device Name (Right Group)
  17.         description: The name of the right group device as defined in z2m
  18.         default: ''
  19.       base_topic:
  20.         name: (Zigbee2MQTT) Base mqtt topic
  21.         description: The base topic as configured in z2m
  22.         default: zigbee2mqtt
  23.       switch:
  24.         name: HA device name, action entity
  25.         description: The entity from HA
  26.         selector:
  27.           entity:
  28.             filter:
  29.               - integration: mqtt
  30.                 domain: event
  31.             multiple: true
  32.       dim_speed:
  33.         name: Dimming Speed
  34.         description: The speed of the dimming effect
  35.         default: 50
  36.         selector:
  37.           number:
  38.             min: 1
  39.             max: 500
  40.             step: 1
  41.       double_click_threshold:
  42.         name: Double Click Threshold
  43.         description: Maximum time between clicks to register as double-click (in seconds)
  44.         default: 0.5
  45.         selector:
  46.           number:
  47.             min: 0.1
  48.             max: 2.0
  49.             step: 0.1
  50.             unit_of_measurement: s
  51.  
  52.       button_1_short_release:
  53.         name: Button 1 short release (upper left)
  54.         description: Action to run when button 1 is released after short press
  55.         default: []
  56.         selector:
  57.           action: {}
  58.       button_2_short_release:
  59.         name: Button 2 short release (lower left)
  60.         description: Action to run when button 2 is released after short press
  61.         default: []
  62.         selector:
  63.           action: {}
  64.       button_3_short_release:
  65.         name: Button 3 short release (upper right)
  66.         description: Action to run when button 3 is released after short press
  67.         default: []
  68.         selector:
  69.           action: {}
  70.       button_4_short_release:
  71.         name: Button 4 short release (lower right)
  72.         description: Action to run when button 4 is released after short press
  73.         default: []
  74.         selector:
  75.           action: {}
  76.  
  77.       button_13_short_release:
  78.         name: Buttons 1+3 short release (both upper)
  79.         description: Action to run when both upper buttons are released after short press
  80.         default: []
  81.         selector:
  82.           action: {}
  83.       button_13_long_release:
  84.         name: Buttons 1+3 long release (both upper)
  85.         description: Action to run when both upper buttons are released after long press
  86.         default: []
  87.         selector:
  88.           action: {}
  89.       button_24_short_release:
  90.         name: Buttons 2+4 short release (both lower)
  91.         description: Action to run when both lower buttons are released after short press
  92.         default: []
  93.         selector:
  94.           action: {}
  95.       button_24_long_release:
  96.         name: Buttons 2+4 long release (both lower)
  97.         description: Action to run when both lower buttons are released after long press
  98.         default: []
  99.         selector:
  100.           action: {}
  101.  
  102.       button_1_double_click:
  103.         name: Button 1 double click (upper left)
  104.         description: Action to run when button 1 is double-clicked
  105.         default: []
  106.         selector:
  107.           action: {}
  108.       button_2_double_click:
  109.         name: Button 2 double click (lower left)
  110.         description: Action to run when button 2 is double-clicked
  111.         default: []
  112.         selector:
  113.           action: {}
  114.       button_3_double_click:
  115.         name: Button 3 double click (upper right)
  116.         description: Action to run when button 3 is double-clicked
  117.         default: []
  118.         selector:
  119.           action: {}
  120.       button_4_double_click:
  121.         name: Button 4 double click (lower right)
  122.         description: Action to run when button 4 is double-clicked
  123.         default: []
  124.         selector:
  125.           action: {}
  126.  
  127. mode: restart
  128. max_exceeded: silent
  129.  
  130. triggers:
  131.   - trigger: state
  132.     entity_id: !input 'switch'
  133.     attribute: event_type
  134.     to:
  135.      - release_1
  136.       - release_2
  137.       - release_3
  138.       - release_4
  139.       - release_1_and_3
  140.       - release_2_and_4
  141.       - press_1
  142.       - press_2
  143.       - press_3
  144.       - press_4
  145.       - press_1_and_3
  146.       - press_2_and_4
  147.  
  148. variables:
  149.   base_topic: !input base_topic
  150.   controller_left: !input controller_left
  151.   controller_right: !input controller_right
  152.   dimspeed_p: !input 'dim_speed'
  153.   double_click_threshold: !input 'double_click_threshold'
  154.   keypress: '{{ trigger.to_state.attributes.event_type }}'
  155.   timediff: >-
  156.     {{ (trigger.to_state.last_changed -
  157.     trigger.from_state.last_changed).total_seconds() }}
  158.   last_release: '{{ states("input_text.last_button_release") }}'
  159.   last_press: '{{ states("input_text.last_button_press") }}'
  160.   time_since_last_release: >-
  161.     {% if last_release != "unknown" %}
  162.       {{ (trigger.to_state.last_changed -
  163.       strptime(last_release, "%Y-%m-%d %H:%M:%S")).total_seconds() }}
  164.     {% else %}
  165.       999
  166.     {% endif %}
  167.   time_since_last_press: >-
  168.     {% if last_press != "unknown" %}
  169.       {{ (trigger.to_state.last_changed -
  170.       strptime(last_press, "%Y-%m-%d %H:%M:%S")).total_seconds() }}
  171.     {% else %}
  172.       999
  173.     {% endif %}
  174.   is_double_click: >-
  175.     {{ time_since_last_release < double_click_threshold and
  176.     time_since_last_press < double_click_threshold and
  177.     time_since_last_release > 0 }}
  178.  
  179. action:
  180.   - variables:
  181.       dimspeed_n: '{{ dimspeed_p | int * -1 }}'
  182.   - choose:
  183.     - conditions: '{{ keypress == ''press_1'' }}'
  184.       sequence:
  185.       - action: input_text.set_value
  186.         data:
  187.           entity_id: input_text.last_button_press
  188.           value: '{{ trigger.to_state.last_changed }}'
  189.       - delay:
  190.           seconds: 1
  191.       - action: mqtt.publish
  192.         data:
  193.           topic: '{{ base_topic ~ ''/'' ~ controller_left ~ ''/set''}}'
  194.           payload: "{\"brightness_move_onoff\": {{ dimspeed_p }} }"
  195.  
  196.     - conditions: '{{ keypress == ''press_2'' }}'
  197.       sequence:
  198.       - action: input_text.set_value
  199.         data:
  200.           entity_id: input_text.last_button_press
  201.           value: '{{ trigger.to_state.last_changed }}'
  202.       - delay:
  203.           seconds: 1
  204.       - action: mqtt.publish
  205.         data:
  206.           topic: '{{ base_topic ~ ''/'' ~ controller_left ~ ''/set''}}'
  207.           payload: "{\"brightness_move_onoff\": {{ dimspeed_n }} }"
  208.  
  209.     - conditions: '{{ keypress == ''press_3'' }}'
  210.       sequence:
  211.       - action: input_text.set_value
  212.         data:
  213.           entity_id: input_text.last_button_press
  214.           value: '{{ trigger.to_state.last_changed }}'
  215.       - delay:
  216.           seconds: 1
  217.       - action: mqtt.publish
  218.         data:
  219.           topic: '{{ base_topic ~ ''/'' ~ controller_right ~ ''/set''}}'
  220.           payload: "{\"brightness_move_onoff\": {{ dimspeed_p }} }"
  221.  
  222.     - conditions: '{{ keypress == ''press_4'' }}'
  223.       sequence:
  224.       - action: input_text.set_value
  225.         data:
  226.           entity_id: input_text.last_button_press
  227.           value: '{{ trigger.to_state.last_changed }}'
  228.       - delay:
  229.           seconds: 1
  230.       - action: mqtt.publish
  231.         data:
  232.           topic: '{{ base_topic ~ ''/'' ~ controller_right ~ ''/set''}}'
  233.           payload: "{\"brightness_move_onoff\": {{ dimspeed_n }} }"
  234.  
  235.     - conditions: '{{ keypress == ''release_1'' }}'
  236.       sequence:
  237.       - action: input_text.set_value
  238.         data:
  239.           entity_id: input_text.last_button_release
  240.           value: '{{ trigger.to_state.last_changed }}'
  241.       - choose:
  242.         - conditions: '{{ timediff > 1 }}'
  243.           sequence:
  244.             - action: mqtt.publish
  245.               data:
  246.                 topic: '{{ base_topic ~ ''/'' ~ controller_left ~ ''/set''}}'
  247.                 payload: "{\"brightness_move\": \"stop\"}"
  248.         - conditions: '{{ is_double_click }}'
  249.           sequence: !input button_1_double_click
  250.         default:
  251.           sequence: !input button_1_short_release
  252.  
  253.     - conditions: '{{ keypress == ''release_2'' }}'
  254.       sequence:
  255.       - action: input_text.set_value
  256.         data:
  257.           entity_id: input_text.last_button_release
  258.           value: '{{ trigger.to_state.last_changed }}'
  259.       - choose:
  260.         - conditions: '{{ timediff > 1 }}'
  261.           sequence:
  262.             - action: mqtt.publish
  263.               data:
  264.                 topic: '{{ base_topic ~ ''/'' ~ controller_left ~ ''/set''}}'
  265.                 payload: "{\"brightness_move\": \"stop\"}"
  266.         - conditions: '{{ is_double_click }}'
  267.           sequence: !input button_2_double_click
  268.         default:
  269.           sequence: !input button_2_short_release
  270.  
  271.     - conditions: '{{ keypress == ''release_3'' }}'
  272.       sequence:
  273.       - action: input_text.set_value
  274.         data:
  275.           entity_id: input_text.last_button_release
  276.           value: '{{ trigger.to_state.last_changed }}'
  277.       - choose:
  278.         - conditions: '{{ timediff > 1 }}'
  279.           sequence:
  280.             - action: mqtt.publish
  281.               data:
  282.                 topic: '{{ base_topic ~ ''/'' ~ controller_right ~ ''/set''}}'
  283.                 payload: "{\"brightness_move\": \"stop\"}"
  284.         - conditions: '{{ is_double_click }}'
  285.           sequence: !input button_3_double_click
  286.         default:
  287.           sequence: !input button_3_short_release
  288.  
  289.     - conditions: '{{ keypress == ''release_4'' }}'
  290.       sequence:
  291.       - action: input_text.set_value
  292.         data:
  293.           entity_id: input_text.last_button_release
  294.           value: '{{ trigger.to_state.last_changed }}'
  295.       - choose:
  296.         - conditions: '{{ timediff > 1 }}'
  297.           sequence:
  298.             - action: mqtt.publish
  299.               data:
  300.                 topic: '{{ base_topic ~ ''/'' ~ controller_right ~ ''/set''}}'
  301.                 payload: "{\"brightness_move\": \"stop\"}"
  302.         - conditions: '{{ is_double_click }}'
  303.           sequence: !input button_4_double_click
  304.         default:
  305.           sequence: !input button_4_short_release
  306.  
  307.     - conditions: '{{ keypress == ''release_1_and_3'' }}'
  308.       sequence:
  309.       - choose:
  310.         - conditions: '{{ timediff > 1 }}'
  311.           sequence: !input button_13_long_release
  312.         default:
  313.           - sequence: !input button_13_short_release
  314.  
  315.     - conditions: '{{ keypress == ''release_2_and_4'' }}'
  316.       sequence:
  317.       - choose:
  318.         - conditions: '{{ timediff > 1 }}'
  319.           sequence: !input button_24_long_release
  320.         default:
  321.           - sequence: !input button_24_short_release
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement