A custom integration that takes full control of Lutron SeeTouch, Hybrid SeeTouch, Sunnata, Alisee, Palladiom, and Tabletop keypads (and Pico remotes) through the existing lutron_caseta integration.
Leave every keypad button completely blank in Lutron Designer / RadioRA3 / HomeWorks QSX programming. This component intercepts the lutron_caseta_button_event events fired by the built-in Lutron Caséta integration and dispatches the actions entirely from Home Assistant.
Benefits:
- All logic lives in one place (HA), no split brain between Lutron and HA
- Buttons can trigger any HA entity, scene, script, or automation
- Stateful feedback: LEDs track which scene is active
- Raise/Lower buttons are context-aware (act on the last scene's entities)
- Easy to change without re-programming the Lutron processor
- Home Assistant 2023.6 or newer
- The built-in
lutron_casetaintegration set up and working - RadioRA3, HomeWorks QSX, or RA2 Select processor (Pico works on Caseta bridge too)
- Keypad buttons left unprogrammed in Lutron software
- Copy the
lutron_keypad_controller/folder into yourcustom_components/directory:/config/custom_components/lutron_keypad_controller/ - Restart Home Assistant.
- Add configuration to
configuration.yaml(see below). - Restart Home Assistant again (or reload YAML integrations).
Enable debug logging temporarily:
# configuration.yaml
logger:
logs:
homeassistant.components.lutron_caseta: debugThen press any button on your keypad and look in the HA logs for:
homeassistant.components.lutron_caseta: Sending event for button press:
{'serial': 12345678, 'type': 'SeeTouchKeypad', 'button_number': 1,
'device_name': 'Living Room Keypad', 'area_name': 'Living Room',
'action': 'press'}
Note the serial and the button_number for each physical button.
Alternatively, use Developer Tools → Events → Listen → lutron_caseta_button_event and press each button.
lutron_keypad_controller:
keypads:
- name: "Human-readable keypad name"
device_serial: "12345678" # from lutron_caseta_button_event
device_name: "Living Room" # optional: backup matching
area_name: "Living Room" # optional: backup matching
keypad_type: sunnata # see Keypad Types below
scene_group: "downstairs" # optional: share active-scene state across keypads
buttons:
- button_number: 1
label: "Movie"
action_type: stateful_scene
action_target: scene.living_room_movie
led_entity: switch.living_room_keypad_button_1_led # optional
- button_number: 2
...| Value | Keypad |
|---|---|
seetouch |
SeeTouch (wall-mount) |
seetouch_hybrid |
Hybrid SeeTouch |
sunnata |
Sunnata |
sunnata_hybrid |
Hybrid Sunnata |
alisee |
Alisee |
palladiom |
Palladiom |
tabletop |
Tabletop SeeTouch / RF |
pico |
Pico Remote |
generic |
Any other / unknown |
Activates an HA scene and tracks which button/scene is currently "on". Other stateful_scene buttons on the same keypad (or scene_group) are considered inactive. Optional LED feedback.
- button_number: 1
label: "Movie"
action_type: stateful_scene
action_target: scene.living_room_movie
led_entity: switch.living_room_keypad_button_1_ledLED entities: The built-in
lutron_casetaintegration exposes keypad LEDs asswitch.*entities on RA3/QSX systems. Use those entity IDs here.
Activates an HA scene. No state tracking or LED feedback.
- button_number: 3
label: "All Off"
action_type: ha_scene
action_target: scene.all_offTriggers an automation (bypasses conditions).
- button_number: 4
label: "Good Night"
action_type: automation
action_target: automation.good_night_routineRuns a script. Optionally pass variables.
- button_number: 5
label: "Party Mode"
action_type: script
action_target: script.party_mode
action_params:
variables:
room: living_room
color: blueToggles one or more entities (lights, switches, fans, etc.).
- button_number: 6
label: "Fan"
action_type: entity_toggle
action_target:
- fan.living_room_fan
- switch.living_room_fan_lightCycles covers through: open → stop → close → open ...
Press once: open. Press again: stop. Press again: close. Press again: open.
- button_number: 7
label: "Shades"
action_type: cover_cycle
action_target:
- cover.living_room_east_shade
- cover.living_room_west_shadeCycles lights through brightness levels then off: 100% → 75% → 50% → 25% → off → 100% ...
Customize levels with action_params.levels.
- button_number: 8
label: "Dim"
action_type: light_cycle_dim
action_target:
- light.living_room_cans
action_params:
levels: [100, 75, 50, 25] # optional, these are the defaultsContext-aware raise/lower. The component remembers the last action performed by a non-raise/lower button and acts accordingly:
- If the last action involved covers → raises/lowers those covers
- If the last action involved lights → brightens/dims those lights by 10%
This mirrors how a Lutron raise/lower button works natively, but entirely in HA.
- button_number: 9
label: "Raise"
action_type: raise
- button_number: 10
label: "Lower"
action_type: lowerTip: Place raise/lower as the last two buttons, as is standard on Lutron keypads.
lutron_keypad_controller:
keypads:
- name: "Living Room Sunnata"
device_serial: "28786608"
area_name: "Living Room"
keypad_type: sunnata
scene_group: "main_floor"
buttons:
- button_number: 1
label: "Movie"
action_type: stateful_scene
action_target: scene.living_room_movie
led_entity: switch.living_room_sunnata_button_1_led
- button_number: 2
label: "Entertain"
action_type: stateful_scene
action_target: scene.living_room_entertain
led_entity: switch.living_room_sunnata_button_2_led
- button_number: 3
label: "Relax"
action_type: stateful_scene
action_target: scene.living_room_relax
led_entity: switch.living_room_sunnata_button_3_led
- button_number: 4
label: "All Off"
action_type: ha_scene
action_target: scene.living_room_off
- button_number: 5
label: "Shades"
action_type: cover_cycle
action_target:
- cover.living_room_east
- cover.living_room_west
- button_number: 6
label: "Accent Dim"
action_type: light_cycle_dim
action_target:
- light.living_room_accent
action_params:
levels: [100, 60, 30]
- button_number: 7
label: "Fan"
action_type: entity_toggle
action_target: fan.living_room_fan
- button_number: 8
label: "Good Night"
action_type: automation
action_target: automation.good_night
- button_number: 9
label: "Raise"
action_type: raise
- button_number: 10
label: "Lower"
action_type: lowerFor each configured keypad, two sensor entities are created:
| Entity | Description |
|---|---|
sensor.<name>_status |
Active scene name or last action type |
sensor.<name>_last_button |
Last button number and label pressed |
When multiple keypads serve the same space (e.g., a room with two SeeTouch keypads), assign them the same scene_group. The stateful scene tracking is shared — pressing a scene button on one keypad will deactivate the LED on the other keypad.
# Keypad A
scene_group: "master_suite"
# Keypad B (same room)
scene_group: "master_suite"The component tracks a _last_action dict for each keypad. When a stateful_scene, ha_scene, entity_toggle, cover_cycle, or light_cycle_dim button is pressed, the component records:
- The action type
- The entities that were acted upon
When raise or lower is pressed next, the component looks at this context:
last_action = cover_cycle → open/close the covers in that action
last_action = light_cycle_dim → brighten/dim those lights by 10%
last_action = stateful_scene → attempt to brighten/dim lights involved
If no prior context exists (fresh start), raise/lower is silently ignored.
No events firing at all:
- Confirm the
lutron_casetaintegration is connected and keypads show up as devices in HA - Listen for
lutron_caseta_button_eventin Developer Tools → Events - RA3/QSX: press and hold buttons 1+2 for 3 seconds to factory reset a keypad that isn't communicating
Wrong button numbers:
- Button numbering varies by model. Use the event listener to find exact numbers.
- On Sunnata, the raise button is typically the last + bottom button; lower is the one above it.
LEDs not updating:
- LED switch entities are only available on RA3 and HomeWorks QSX, not Caseta bridge
- Find your LED entities in Settings → Devices & Services → Lutron → Entities, filter by "LED"
Sunnata only fires press, no release:
- This is expected for Sunnata keypads (known Lutron/pylutron-caseta behavior)
- The component ignores release events by default, so this is fine
Scene group LEDs out of sync after restart:
- LEDs are not restored on startup yet (planned). Press any scene button to re-sync.