Instantly share code, notes, and snippets.
Last active
September 7, 2025 16:49
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
-
Save thomasmaxson/7327b309459d38d8a36ee3bb18ce6b9e to your computer and use it in GitHub Desktop.
Home Assistant Blueprint to control your devices with Lutron Pico remotes using the Lutron Caseta integration.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # This blueprint uses an Lutron Pico 3 Button with Raise/Lower Remote Control | |
| # This blueprint allows you to run custom actions with the remote's buttons | |
| # | |
| # | Button | Action | Event | | |
| # | ------ | ------------ | ------------ | | |
| # | On | Press | Custom event | | |
| # | On | Double Press | Custom event | | |
| # | On | Press & Hold | Custom event | | |
| # | Raise | Press | Custom event | | |
| # | Raise | Double Press | Custom event | | |
| # | Raise | Press & Hold | Custom event | | |
| # | Preset | Press | Custom event | | |
| # | Preset | Double Press | Custom event | | |
| # | Preset | Press & Hold | Custom event | | |
| # | Lower | Press | Custom event | | |
| # | Lower | Double Press | Custom event | | |
| # | Lower | Press & Hold | Custom event | | |
| # | Off | Press | Custom event | | |
| # | Off | Double Press | Custom event | | |
| # | Off | Press & Hold | Custom event | | |
| # PJ2-3BRL-GXX-F01 = Fans (icons only) | |
| # PJ2-3BRL-GXX-L01 = Lights (icons only) | |
| # PJ2-3BRL-GXX-S01 = Shades (icons only) | |
| # PJ2-3BRL-GXX-S02 = Shades (icons + text) | |
| # PJ2-3BRL-GXX-S03 = Blackouts (icons + text) | |
| # PJ2-3BRL-GXX-S04 = Sheers (icons + text) | |
| # PJ2-3BRL-GXX-S05 = Blinds (icons + text) | |
| # PJ2-3BRL-GXX-S06 = Skylights (icons + text) | |
| # PJ2-3BRL-GXX-S07 = Draperies (icons + text) | |
| # PJ2-3BRL-GXX-S08 = N/A | |
| # PJ2-3BRL-GXX-S09 = Horizontal Sheer Blinds (icons + text) | |
| # PJ2-3BRL-GWH-S10 = Tilt Blinds (icons) | |
| blueprint: | |
| name: Lutron Pico, 3 Button with Raise/Lower Remote Control | |
| description: Control devices with your Lutron Pico 3 button with raise/lower remote. | |
| author: Thomas Maxson | |
| source_url: https://gist.github.com/thomasmaxson/7327b309459d38d8a36ee3bb18ce6b9e | |
| homeassistant: | |
| min_version: 2024.6.0 | |
| domain: automation | |
| input: | |
| remote: | |
| name: Lutron Pico remote control | |
| description: Select the Lutron Pico remote to trigger your automations. | |
| selector: | |
| device: | |
| multiple: false | |
| filter: | |
| - integration: lutron_caseta | |
| manufacturer: Lutron Electronics Co., Inc | |
| model: PJ2-3BRL-GXX-F01 (Pico3ButtonRaiseLower) | |
| - integration: lutron_caseta | |
| manufacturer: Lutron Electronics Co., Inc | |
| model: PJ2-3BRL-GXX-X01 (Pico3ButtonRaiseLower) | |
| actions_single_press: | |
| name: Single Press Button Events | |
| icon: mdi:gesture-tap | |
| collapsed: false | |
| input: | |
| event_button_press_on_single: | |
| name: On Button Press Event | |
| description: The action to perform on _single press_ of the **On Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_raise_single: | |
| name: Raise Button Press Event | |
| description: The action to perform on _single press_ of the **Raise Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_preset_single: | |
| name: Preset Button Press Event | |
| description: The action to perform on _single press_ of the **Preset Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_lower_single: | |
| name: Lower Button Press Event | |
| description: The action to perform on _single press_ of the **Lower Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_off_single: | |
| name: Off Button Press Event | |
| description: The action to perform on _single press_ of the **Off Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| actions_double_tap: | |
| name: Double Press Button Events | |
| icon: mdi:gesture-double-tap | |
| collapsed: true | |
| input: | |
| event_button_press_on_double: | |
| name: On Button Press Twice Event | |
| description: The action to perform on _double press_ of the **On Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_preset_double: | |
| name: Preset Button Press Twice Event | |
| description: The action to perform on _double press_ of the **Preset Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_off_double: | |
| name: Off Button Press Twice Event | |
| description: The action to perform on _double press_ of the **Off Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| duration_double_tap: | |
| name: Double Tap Delay | |
| description: Duration used for the double tap detection | |
| default: 250 | |
| selector: | |
| number: | |
| min: 100 | |
| max: 2000 | |
| unit_of_measurement: milliseconds | |
| step: 50 | |
| mode: slider | |
| actions_hold_press: | |
| name: Press and Hold Button Events | |
| icon: mdi:gesture-tap-hold | |
| collapsed: true | |
| input: | |
| event_button_press_on_hold: | |
| name: On Button Hold Event | |
| description: The action to perform on _press and hold_ of the **On Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_raise_hold: | |
| name: Raise Button Hold Event | |
| description: The action to perform on _press and hold_ of the **Raise Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_preset_hold: | |
| name: Preset Button Hold Event | |
| description: The action to perform on _press and hold_ of the **Preset Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_lower_hold: | |
| name: Lower Button Hold Event | |
| description: The action to perform on _press and hold_ of the **Lower Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| event_button_press_off_hold: | |
| name: Off Button Hold Event | |
| description: The action to perform on _press and hold_ of the **Off Button**. | |
| default: [] | |
| selector: | |
| action: {} | |
| duration_hold: | |
| name: Hold Delay | |
| description: Duration used for the hold detection | |
| default: 500 | |
| selector: | |
| number: | |
| min: 500 | |
| max: 4000 | |
| unit_of_measurement: milliseconds | |
| step: 500 | |
| mode: slider | |
| automation_config: | |
| name: Configuration | |
| icon: mdi:cog | |
| collapsed: true | |
| input: | |
| config_mode: | |
| name: Automation Mode | |
| description: Mode that automation runs in. | |
| default: restart | |
| selector: | |
| select: | |
| options: | |
| - single | |
| - restart | |
| - queued | |
| - parallel | |
| custom_value: false | |
| multiple: false | |
| config_max_num: | |
| name: Mode Max | |
| description: > | |
| Maximum number of runs that can be executed or queued at a time. | |
| <br>Ignored by _Single_ and _Restart_ Modes. | |
| default: 10 | |
| selector: | |
| number: | |
| mode: slider | |
| unit_of_measurement: runs | |
| min: 1.0 | |
| max: 15.0 | |
| step: 1.0 | |
| mode: !input config_mode | |
| max: !input config_max_num | |
| max_exceeded: silent | |
| variables: | |
| trigger_device_id: "{{ trigger.event.data.device_id }}" | |
| var_remote: !input remote | |
| var_duration_hold: !input duration_hold | |
| var_duration_double_tap: !input duration_double_tap | |
| triggers: | |
| - alias: On Button Pressed | |
| trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: "on" | |
| id: trigger_on_press | |
| - alias: Raise Button Pressed | |
| trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: raise | |
| id: trigger_raise_press | |
| - alias: Preset/Stop Button Pressed | |
| trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: stop | |
| id: trigger_preset_press | |
| - alias: Lower Button Pressed | |
| trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: lower | |
| id: trigger_lower_press | |
| - alias: Off Button Pressed | |
| trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: "off" | |
| id: trigger_off_press | |
| conditions: | |
| - condition: template | |
| value_template: "{{ var_remote | count > 0 }}" | |
| actions: | |
| - choose: | |
| # Button Press (ON) | |
| - conditions: | |
| - condition: trigger | |
| id: trigger_on_press | |
| sequence: | |
| - wait_for_trigger: | |
| - trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: release | |
| subtype: "on" | |
| timeout: | |
| hours: 0 | |
| minutes: 0 | |
| seconds: 0 | |
| milliseconds: "{{ var_duration_hold | float }}" | |
| continue_on_timeout: true | |
| - if: | |
| - condition: template | |
| value_template: "{{ wait.trigger == none }}" | |
| then: !input event_button_press_on_hold | |
| else: | |
| - wait_for_trigger: | |
| - trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: "on" | |
| timeout: | |
| hours: 0 | |
| minutes: 0 | |
| seconds: 0 | |
| milliseconds: "{{ var_duration_double_tap | float }}" | |
| continue_on_timeout: true | |
| - if: | |
| - condition: template | |
| value_template: "{{ wait.trigger == none }}" | |
| then: !input event_button_press_on_single | |
| else: !input event_button_press_on_double | |
| # Button Press (RAISE) | |
| - conditions: | |
| - condition: trigger | |
| id: trigger_raise_press | |
| sequence: | |
| - wait_for_trigger: | |
| - trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: raise | |
| timeout: | |
| hours: 0 | |
| minutes: 0 | |
| seconds: 0 | |
| milliseconds: "{{ var_duration_hold | float }}" | |
| continue_on_timeout: true | |
| - if: | |
| - condition: template | |
| value_template: "{{ wait.trigger == none }}" | |
| then: !input event_button_press_raise_single | |
| else: !input event_button_press_raise_hold | |
| # Button Press (PRESET/STOP) | |
| - conditions: | |
| - condition: trigger | |
| id: trigger_preset_press | |
| sequence: | |
| - wait_for_trigger: | |
| - trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: release | |
| subtype: stop | |
| timeout: | |
| hours: 0 | |
| minutes: 0 | |
| seconds: 0 | |
| milliseconds: "{{ var_duration_hold | float }}" | |
| continue_on_timeout: true | |
| - if: | |
| - condition: template | |
| value_template: "{{ wait.trigger == none }}" | |
| then: !input event_button_press_preset_hold | |
| else: | |
| - wait_for_trigger: | |
| - trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: stop | |
| timeout: | |
| hours: 0 | |
| minutes: 0 | |
| seconds: 0 | |
| milliseconds: "{{ var_duration_double_tap | float }}" | |
| continue_on_timeout: true | |
| - if: | |
| - condition: template | |
| value_template: "{{ wait.trigger == none }}" | |
| then: !input event_button_press_preset_single | |
| else: !input event_button_press_preset_double | |
| # Button Press (LOWER) | |
| - conditions: | |
| - condition: trigger | |
| id: trigger_lower_press | |
| sequence: | |
| - wait_for_trigger: | |
| - trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: lower | |
| timeout: | |
| hours: 0 | |
| minutes: 0 | |
| seconds: 0 | |
| milliseconds: "{{ var_duration_hold | float }}" | |
| continue_on_timeout: true | |
| - if: | |
| - condition: template | |
| value_template: "{{ wait.trigger == none }}" | |
| then: !input event_button_press_lower_single | |
| else: !input event_button_press_lower_hold | |
| # Button Press (OFF) | |
| - conditions: | |
| - condition: trigger | |
| id: trigger_off_press | |
| sequence: | |
| - wait_for_trigger: | |
| - trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: release | |
| subtype: "off" | |
| timeout: | |
| hours: 0 | |
| minutes: 0 | |
| seconds: 0 | |
| milliseconds: "{{ var_duration_hold | float }}" | |
| continue_on_timeout: true | |
| - if: | |
| - condition: template | |
| value_template: "{{ wait.trigger == none }}" | |
| then: !input event_button_press_off_hold | |
| else: | |
| - wait_for_trigger: | |
| - trigger: device | |
| device_id: !input remote | |
| domain: lutron_caseta | |
| type: press | |
| subtype: "off" | |
| timeout: | |
| hours: 0 | |
| minutes: 0 | |
| seconds: 0 | |
| milliseconds: "{{ var_duration_double_tap | float }}" | |
| continue_on_timeout: true | |
| - if: | |
| - condition: template | |
| value_template: "{{ wait.trigger == none }}" | |
| then: !input event_button_press_off_single | |
| else: !input event_button_press_off_double |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment