Pico Fan – Simple 5-Button Remote for Lutron Caseta + Haiku (or any fan)

Pico Fan – Simple 5-Button

lutron-pico-5-sm

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

  1. Lutron Caseta Integration: Ensure the Lutron Caseta integration is installed and configured
  2. Pico Remote: A Lutron Pico 5-button remote (PJ2-3BRL-GXX-F01) paired with your Caseta hub
  3. Fan Entity: A fan entity in Home Assistant
  4. Light Entity (optional): A light entity for dimming control

Installation

Open your Home Assistant instance and show the blueprint import dialog with a specific blueprint pre-filled.

  1. Download the Blueprint:

    • Copy the blueprint YAML content
    • Save it to your Home Assistant blueprints/automation/ directory
  2. Import via UI:

    • Go to SettingsAutomations & ScenesBlueprints
    • 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

  1. Create New Automation:

    Settings → Automations & Scenes → Automations → Create Automation → Use Blueprint
    
  2. Select Blueprint:

    • Choose “Pico Fan Simple 5-Button with Long Press”
  3. 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)
  4. 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

  1. Blueprint Import Errors:

    • Ensure the YAML syntax is correct
    • Check that all required fields are present
  2. Remote Not Responding:

    • Verify the Pico remote is properly paired with Caseta hub
    • Check that the device ID is correct in the automation
  3. Light Dimming Not Working:

    • Ensure the light entity supports brightness control
    • Check that the light entity is properly configured
  4. Fan Speed Control Issues:

    • Verify the fan entity supports speed control
    • Check fan entity attributes in Developer Tools

Debugging Steps

  1. Check Entity States:

    Developer Tools → States
    
  2. Monitor Automation Traces:

    Settings → Automations & Scenes → [Your Automation] → Traces
    
  3. Review Logs:

    Settings → System → Logs
    

Customization

Adjusting Long Press Threshold

The blueprint uses a 300ms threshold to detect long presses. To modify this:

  1. Edit the blueprint YAML

  2. 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:

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 and dimming_rate input variables to control the brightness adjustment.
  • Modified the up and down 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