Pico Link — A YAML-Based Controller for Lutron Pico Remotes

Pico Link — A YAML-Based Controller for Lutron Pico Remotes

This project provides a flexible way to use Lutron Caseta Pico remotes (including the newer Paddle Pico) as general-purpose controllers inside Home Assistant. The integration listens to lutron_caseta_button_event and translates presses, holds, and releases into more predictable, domain-aware actions.


What the Integration Does

The goal of Pico Link is to take the raw button events exposed by the Lutron Caseta integration and provide a structured, deterministic control model. It handles the timing, ramping, and action decisions so YAML configuration can remain concise.

Key capabilities

  • Tap, hold, and release handling
  • Ramping (brightness, volume, cover travel)
  • Brightness- and volume-step logic
  • Fan speed stepping
  • Optional middle-button override for 5-button models
  • Support for one or multiple entities per device
  • Auto-detection of Pico layout (5-button, 4-button, 2-button, paddle)

How Configuration Works

All configuration is done in configuration.yaml instead of using a UI flow.
The structure is intentionally simple:

pico_link:
  defaults:
    step_pct: 10
    hold_time_ms: 300

  devices:
    - device_id: "12ab34cd56ef78..." (or name: Kitchen Lights Pico)
      type: 3BRL
      lights:
        - light.kitchen_lights
      middle_button:
        - action: light.turn_on
          data:
            color_name: red
          target:
            entity_id:
              - light.kitchen_lights

Defaults Layering

When building the final configuration for a device, the integration merges:

  1. Hardcoded dataclass defaults
  2. Integration level defaults (global)
  3. Device-level overrides

This reduces duplication and ensures consistent behavior across devices unless intentionally changed.


Domain Behavior Overview

The integration adapts actions based on the domain assigned to the device:

Lights

  • Tap on/off
  • Tap raise/lower → step brightness
  • Hold raise/lower → ramp brightness

Fans

  • Tap on/off
  • Tap raise/lower → step speed

Covers

  • Tap on → open
  • Tap off → close
  • Tap on/off while moving → stop
  • Tap middle → stop
  • Tap raise/lower → step position
  • Hold raise/lower → open/close until released

Media Players

  • Tap on → play/pause
  • Tap off → next track
  • Tap raise/lower → step volume

Execution Model

Internally, the integration uses:

  • Per-button press state tracking
  • Token-based hold lifecycle (prevents stray/overlapping tasks)
  • Async tasks for ramping/stepping
  • Automatic cancellation on release
  • Domain-aware action handlers

The design prioritizes consistency, determinism, and minimal latency from button press to action.


Where to Find the Code

Full source, documentation, examples, and ongoing changes are available here:

:point_right: https://github.com/smartqasa/pico-link

This integration is young. Issues and contributions are welcome.

3 Likes