Pico Fan – Simple 5-Button

This Home Assistant blueprint allows you to control a ceiling fan and optional light using a Lutron Pico 5-button remote (model PJ2-3BRL-GXX-F01). The blueprint supports both single presses for fan control and long presses for light dimming.
Features
- Single Press Controls: Control fan speed with up/down buttons
- Long Press Controls: Dim lights with continuous brightness adjustment
- Middle Button: Toggle light (if configured) or fan (if no light)
- On/Off Buttons: Turn fan on/off
- Configurable Dimming: Adjust brightness step size and dimming rate
Button Functions
Button | Single Press | Long Press |
---|---|---|
ON | Turn fan on | - |
UP | Increase fan speed | Brighten light continuously |
MIDDLE | Toggle light (or fan if no light) | - |
DOWN | Decrease fan speed | Dim light continuously |
OFF | Turn fan off | - |
Prerequisites
- Lutron Caseta Integration: Ensure the Lutron Caseta integration is installed and configured
- Pico Remote: A Lutron Pico 5-button remote (PJ2-3BRL-GXX-F01) paired with your Caseta hub
- Fan Entity: A fan entity in Home Assistant
- Light Entity (optional): A light entity for dimming control
Installation
-
Download the Blueprint:
- Copy the blueprint YAML content
- Save it to your Home Assistant
blueprints/automation/
directory
-
Import via UI:
- Go to Settings → Automations & Scenes → Blueprints
- Click Import Blueprint
- Paste the blueprint URL or upload the file
Configuration
Required Inputs
- Lutron Pico: Select your Pico remote device
- Fan: Select the fan entity to control
Optional Inputs
- Light: Select a light entity for dimming control (leave empty to disable light features)
- Brightness Step Percentage: How much to change brightness per step (1-25%, default: 10%)
- Dimming Rate: How fast to change brightness during long press (100-1000ms, default: 200ms)
Setup Instructions
-
Create New Automation:
Settings → Automations & Scenes → Automations → Create Automation → Use Blueprint
-
Select Blueprint:
- Choose “Pico Fan Simple 5-Button with Long Press”
-
Configure Inputs:
- Lutron Pico: Select your paired Pico remote
- Fan: Choose your ceiling fan entity
- Light (optional): Choose your light entity
- Brightness Step: Adjust to your preference (default 10%)
- Dimming Rate: Adjust to your preference (default 200ms)
-
Save Automation:
- Give your automation a descriptive name
- Click “Save”
Example Configuration
alias: penelope - pico - fan - light
description: ""
use_blueprint:
path: billchurch/pico_fan_5_simple.yml.yaml
input:
light_entity: light.pen_fan
pico_remote: 5f1fee7421ad0638ec5fca2c0ab451b7
fan_entity: fan.pen_fan
Troubleshooting
Common Issues
-
Blueprint Import Errors:
- Ensure the YAML syntax is correct
- Check that all required fields are present
-
Remote Not Responding:
- Verify the Pico remote is properly paired with Caseta hub
- Check that the device ID is correct in the automation
-
Light Dimming Not Working:
- Ensure the light entity supports brightness control
- Check that the light entity is properly configured
-
Fan Speed Control Issues:
- Verify the fan entity supports speed control
- Check fan entity attributes in Developer Tools
Debugging Steps
-
Check Entity States:
Developer Tools → States
-
Monitor Automation Traces:
Settings → Automations & Scenes → [Your Automation] → Traces
-
Review Logs:
Settings → System → Logs
Customization
Adjusting Long Press Threshold
The blueprint uses a 300ms threshold to detect long presses. To modify this:
-
Edit the blueprint YAML
-
Change the timeout value in both UP and DOWN button sections:
timeout: "00:00:00.3" # Change to desired duration
Modifying Brightness Limits
- Maximum brightness: Modify the condition in the UP button section
- Minimum brightness: Modify the condition in the DOWN button section
Support
For issues or questions:
- Check the Home Assistant Community Forum
- Review the Lutron Caseta Integration Documentation
- Consult the Home Assistant Blueprint Documentation
Updates
feat: Pico Fan Simple 5-Button with Long Press for Light Dimming
This commit introduces long-press functionality to the Pico Fan Simple 5-Button blueprint, allowing control of light brightness in addition to fan speed.
The following changes were made:
- Updated the blueprint description to reflect the new long-press functionality.
- Added
brightness_step
anddimming_rate
input variables to control the brightness adjustment. - Modified the
up
anddown
button actions to differentiate between short presses (fan speed) and long presses (light dimming). - Implemented a
wait_for_trigger
to detect long presses. - Added logic to continuously brighten or dim the light during a long press using a
repeat
loop. - Added a condition to stop the dimming loop when the light reaches maximum or minimum brightness.
- Changed mode to restart to ensure a release event aborts the running loop.
Blueprint YAML
Click to expand YAML
blueprint:
name: Pico Fan Simple 5-Button with Long Press
description: >
Map a Lutron Fan Pico (PJ2-3BRL-GXX-F01) to one ceiling fan
and an optional light.
Single presses control fan speed, long presses on up/down control light brightness.
domain: automation
author: billchurch
source_url: https://community.home-assistant.io/t/pico-fan-simple-5-button-remote-for-lutron-caseta-haiku-or-any-fan/901507
input:
pico_remote:
name: Lutron Pico
selector:
device:
model: PJ2-3BRL-GXX-F01 (Pico3ButtonRaiseLower)
fan_entity:
name: Fan
selector:
entity:
domain: fan
light_entity:
name: Light (optional)
default: []
selector:
entity:
domain: light
multiple: false
brightness_step:
name: Brightness Step Percentage
description: How much to change brightness on each step during long press
default: 10
selector:
number:
min: 1
max: 25
unit_of_measurement: "%"
dimming_rate:
name: Dimming Rate (ms)
description: How fast to change brightness during long press
default: 200
selector:
number:
min: 100
max: 1000
unit_of_measurement: "ms"
trigger:
- platform: device
device_id: !input pico_remote
domain: lutron_caseta
type: press
subtype: 'on'
id: 'on'
- platform: device
device_id: !input pico_remote
domain: lutron_caseta
type: press
subtype: raise
id: 'up'
- platform: device
device_id: !input pico_remote
domain: lutron_caseta
type: press
subtype: stop
id: 'middle'
- platform: device
device_id: !input pico_remote
domain: lutron_caseta
type: press
subtype: lower
id: 'down'
- platform: device
device_id: !input pico_remote
domain: lutron_caseta
type: press
subtype: 'off'
id: 'off'
variables:
fan: !input fan_entity
light: !input light_entity
step_pct: !input brightness_step
rate_ms: !input dimming_rate
action:
- choose:
################################################
# ON BUTTON ────────────────
################################################
- conditions:
- condition: trigger
id: 'on'
sequence:
- service: fan.turn_on
target:
entity_id: !input fan_entity
################################################
# RAISE (Up) ────────────────
################################################
- conditions: "{{ trigger.id == 'up' }}"
sequence:
# If a light is defined we need to know whether this
# was a *tap* or a *hold*. Wait briefly for a release.
- wait_for_trigger:
- platform: device
device_id: !input pico_remote
domain: lutron_caseta
type: release
subtype: raise
timeout: "00:00:00.3" # 300ms long-press threshold
continue_on_timeout: true
# SHORT PRESS → bump fan speed
- if: "{{ wait.trigger is not none or light|length == 0 }}"
then:
- service: fan.increase_speed
target: { entity_id: "{{ fan }}" }
# LONG PRESS → brighten light continuously
else:
- repeat:
sequence:
- service: light.turn_on
target: { entity_id: "{{ light }}" }
data:
brightness_step_pct: "{{ step_pct }}"
transition: "{{ rate_ms/1000 }}"
- delay:
milliseconds: "{{ rate_ms | int }}"
until:
# Stop when light reaches maximum brightness
- condition: template
value_template: >
{{ (state_attr(light, 'brightness')|default(255)) | int >= 250 }}
################################################
# MIDDLE BUTTON ────────────────
################################################
- conditions:
- condition: trigger
id: 'middle'
sequence:
- variables:
light: !input light_entity
- choose:
- conditions: "{{ light | length > 0 }}"
sequence:
- service: light.toggle
target: { entity_id: "{{ light }}" }
default:
- service: fan.toggle
target: { entity_id: !input fan_entity }
################################################
# LOWER (Down) ────────────────
################################################
- conditions: "{{ trigger.id == 'down' }}"
sequence:
- wait_for_trigger:
- platform: device
device_id: !input pico_remote
domain: lutron_caseta
type: release
subtype: lower
timeout: "00:00:00.3" # 300ms long-press threshold
continue_on_timeout: true
# SHORT PRESS → slower fan
- if: "{{ wait.trigger is not none or light|length == 0 }}"
then:
- service: fan.decrease_speed
target: { entity_id: "{{ fan }}" }
# LONG PRESS → dim light continuously
else:
- repeat:
sequence:
- service: light.turn_on
target: { entity_id: "{{ light }}" }
data:
brightness_step_pct: "{{ 0 - step_pct }}"
transition: "{{ rate_ms/1000 }}"
- delay:
milliseconds: "{{ rate_ms | int }}"
until:
# Stop when light reaches minimum brightness
- condition: template
value_template: >
{{ (state_attr(light, 'brightness')|default(0)) | int < 5 }}
################################################
# OFF BUTTON ────────────────
################################################
- conditions:
- condition: trigger
id: 'off'
sequence:
- service: fan.turn_off
target:
entity_id: !input fan_entity
mode: restart # ensures a release event aborts the running loop