Skip to content

Instantly share code, notes, and snippets.

@thomasmaxson
Last active September 7, 2025 16:49
Show Gist options
  • Select an option

  • Save thomasmaxson/7327b309459d38d8a36ee3bb18ce6b9e to your computer and use it in GitHub Desktop.

Select an option

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 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