Summary
Lutron Caseta is a home automation lighting and shading control system programmable via the Lutron integration protocol over RS-232 serial or Ethernet Telnet. The protocol uses ASCII command strings with operation characters # (execute), ? (query), and ~ (report/monitor), terminated with <CR><LF>. The same protocol governs RadioRA 2, QS Standalone (QSE-CI-NWK-E), GRAFIK Eye QS, Maestro, Sivoia QS shades, and HVAC controllers; Caseta implements the subset defined by its integration access point.
Transport
protocols:
- tcp
- serial
addressing:
port: null # UNRESOLVED: Telnet port not explicitly stated in source
auth:
type: login # inferred: login credentials documented (nwk, nwk2) with configurable passphrase
credentials:
- username: nwk
- username: nwk2
serial:
baud_rate: 9600
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
RS-232 settings stated for QSE-CI-NWK-E: 9600/19200/38400/115200 (dipswitch-selectable), 8/N/1, no flow control. RadioRA 2 main repeater: 9600/8/N/1, no flow control. Default IPs: QS Standalone 192.168.250.1; RadioRA 2 192.168.1.50 (DHCP default).
Traits
- powerable # inferred: dimmer zone-level on/off commands present
- routable # inferred: output/area/shade group control commands present
- queryable # inferred: ?OUTPUT, ?DEVICE, ?SYSTEM, etc. query commands present
- levelable # inferred: zone-level commands 0-100% present
Actions
- id: parameter_count_mismatch_too_many_or_too_few_parameters_for_the_specified_action
label: "Parameter count mismatch: Too many or too few parameters for the specified action"
kind: action
command: "Too many parameters when activating scene #AREA,2,6,1,1,1,1,1 <CR><LF>"
params: []
- id: response
label: "Response:"
kind: action
command: "~ERROR,1`<CR><LF>"
params: []
- id: object_does_not_exist_the_integration_id_or_serial_number_entered_does_not_map_to_a_known_part_of_the_system
label: "Object does not exist: The Integration ID or serial number entered does not map to a known part of the system"
kind: action
command: "Send command to an ID that is not valid #OUTPUT,1234,1,100.00 <CR><LF>"
params: []
- id: response_2
label: "Response:"
kind: action
command: "~ERROR,2`<CR><LF>"
params: []
- id: invalid_action_the_action_does_not_exist_for_this_command
label: "Invalid Action: The action does not exist for this command"
kind: action
command: "Send invalid action (4321) to Area 2 #AREA,2,4321 <CR><LF>"
params: []
- id: response_3
label: "Response:"
kind: action
command: "~ERROR,3`<CR><LF>"
params: []
- id: parameter_data_out_of_range_the_parameter_data_is_out_of_range_for_this_action
label: "Parameter data out of range: The parameter data is out of range for this action"
kind: action
command: "Send Output 11 to 120% #OUTPUT,11,1,120.00 <CR><LF>"
params: []
- id: response_4
label: "Response:"
kind: action
command: "~ERROR,4`<CR><LF>"
params: []
- id: parameter_data_malformed_the_parameter_data_given_was_not_formatted_properly
label: "Parameter data malformed: The parameter data given was not formatted properly"
kind: action
command: "Set Time to 12:23:24:25 #SYSTEM,1,12:23:24:25 <CR><LF>"
params: []
- id: response_5
label: "Response:"
kind: action
command: "~ERROR,5`<CR><LF>"
params: []
- id: execute_set_time_to_5_45_pm
label: "Execute: Set time to 5:45 PM"
kind: action
command: "#SYSTEM,1,17:45`<CR><LF>"
params: []
- id: execute_set_date_to_june_1,_2009
label: "Execute: Set date to June 1, 2009"
kind: action
command: "#SYSTEM,2,06/01/2009`<CR><LF>"
params: []
- id: response_the_system_time_is_11_05_am
label: "Response: The system time is 11:05 AM"
kind: action
command: "~SYSTEM,1,11:05:00`<CR><LF>"
params: []
- id: response_the_system_date_is_july_3,_2009
label: "Response: The system date is July 3, 2009"
kind: action
command: "~SYSTEM,2,07/03/2009`<CR><LF>"
params: []
- id: execute_set_ip_address_to_192_168_250_1
label: "Execute: Set IP Address to 192.168.250.1"
kind: action
command: "#ETHERNET,0,192.168.250.1`<CR><LF>"
params: []
- id: execute_set_gateway_address_to_10_2_4_1
label: "Execute: Set Gateway Address to 10.2.4.1"
kind: action
command: "#ETHERNET,1,10.2.4.1`<CR><LF>"
params: []
- id: response_the_ip_address_is_192_168_250_1
label: "Response: The IP Address is 192.168.250.1"
kind: action
command: "~ETHERNET,0=,192.168.250.1`<CR><LF>"
params: []
- id: add_shade_at_100%_to_phantom_button_1
label: "Add shade at 100% to phantom button 1"
kind: action
command: "#PROGRAMMING,1,1,1,living room sheer,0,100`<CR><LF>"
params: []
- id: response_6
label: "Response"
kind: action
command: "~PROGRAMMING,1,1,1,living room sheer,0,100`<CR><LF>"
params: []
- id: add_venetian_blind_at_0%_lift_and_50%_tilt_to_phantom_button_2
label: "Add Venetian blind at 0% lift and 50% tilt to phantom button 2"
kind: action
command: "#PROGRAMMING,1,2,5,kitchen venetian,0,0,50`<CR><LF>"
params: []
- id: response_7
label: "Response"
kind: action
command: "~PROGRAMMING,1,2,5,kitchen venetian,0,0,50`<CR><LF>"
params: []
- id: add_venetian_blind_at_75%_tilt_to_phantom_button_3
label: "Add Venetian blind at 75% tilt to phantom button 3"
kind: action
command: "#PROGRAMMING,1,3,6,kitchen venetian,0,75`<CR><LF>"
params: []
- id: response_8
label: "Response"
kind: action
command: "~PROGRAMMING,1,3,6,kitchen venetian,0,75`<CR><LF>"
params: []
- id: add_venetian_blind_at_15%_lift_to_phantom_button_4
label: "Add Venetian blind at 15% lift to phantom button 4"
kind: action
command: "#PROGRAMMING,1,4,7,kitchen venetian,0,15`<CR><LF>"
params: []
- id: response_9
label: "Response"
kind: action
command: "~PROGRAMMING,1,4,7,kitchen venetian,0,15`<CR><LF>"
params: []
- id: turn_on_stop_if_moving_for_phantom_button_5
label: "Turn On Stop-If-Moving for phantom button 5"
kind: action
command: "#PROGRAMMING,1,5,4,1`<CR><LF>"
params: []
- id: response_10
label: "Response"
kind: action
command: "~PROGRAMMING,1,5,4,1`<CR><LF>"
params: []
- id: clear_programming_from_all_the_phantom_buttons
label: "Clear programming from all the phantom buttons"
kind: action
command: "#PROGRAMMING,1,0,3`<CR><LF>"
params: []
- id: response_11
label: "Response"
kind: action
command: "Repeat command to clear all phantom button programming"
params: []
- id: repeat_command_to_clear_all_phantom_button_programming
label: "Repeat command to clear all phantom button programming"
kind: action
command: "#PROGRAMMING,1,0,3`<CR><LF>"
params: []
- id: response_12
label: "Response"
kind: action
command: "~PROGRAMMING,1,0,3`<CR><LF>"
params: []
- id: clear_programming_from_phantom_button_6
label: "Clear programming from phantom button 6"
kind: action
command: "#PROGRAMMING,1,6,3`<CR><LF>"
params: []
- id: response_13
label: "Response"
kind: action
command: "~PROGRAMMING,1,6,3`<CR><LF>"
params: []
- id: execute_press_button_1
label: "Execute: Press Button 1"
kind: action
command: "#DEVICE,4,1,3`<CR><LF>"
params: []
- id: execute_release_button_1
label: "Execute: Release Button 1"
kind: action
command: "#DEVICE,4,1,4`<CR><LF>"
params: []
- id: execute_turn_on_led_1
label: "Execute: Turn On LED 1"
kind: action
command: "#DEVICE,4,101,9`<CR><LF>"
params: []
- id: response_led_1_is_on
label: "Response: LED 1 is On"
kind: action
command: "~DEVICE,4,101,9,1`<CR><LF>"
params: []
- id: execute_disable_diagnostic_monitoring
label: "Execute: Disable Diagnostic Monitoring"
kind: action
command: "#MONITORING,1,2`<CR><LF>"
params: []
- id: execute_enable_event_monitoring
label: "Execute: Enable Event Monitoring"
kind: action
command: "#MONITORING,2,1`<CR><LF>"
params: []
- id: response_diagnostic_monitoring_is_disabled
label: "Response: Diagnostic Monitoring is disabled"
kind: action
command: "~MONITORING,1,2`<CR><LF>"
params: []
- id: execute_execute_the_3rd_event_of_the_time_clock
label: "Execute: Execute the 3rd event of the time clock"
kind: action
command: "#TIMECLOCK,4,5,3`<CR><LF>"
params: []
- id: response_the_time_the_sun_rises
label: "Response: The time the sun rises"
kind: action
command: "~TIMECLOCK,4,2,05:32`<CR><LF>"
params: []
- id: execute_set_dimmer_to_75%_with_a_1_min_30_sec_fade
label: "Execute: Set dimmer to 75% with a 1 min 30 sec fade"
kind: action
command: "#OUTPUT,1,1,75,01:30`<CR><LF>"
params: []
- id: execute_start_raising_zone_level
label: "Execute: Start Raising zone level"
kind: action
command: "#OUTPUT,1,2`<CR><LF>"
params: []
- id: execute_stop_raising_lowering_zone_level
label: "Execute: Stop Raising/Lowering zone level"
kind: action
command: "#OUTPUT,1,4`<CR><LF>"
params: []
- id: response_output_level_is_set_to_90%
label: "Response: Output level is set to 90%"
kind: action
command: "~OUTPUT,1,1,90.00`<CR><LF>"
params: []
- id: execute_set_venetian_blind_to_lift_0%,_tilt_50%
label: "Execute: Set Venetian blind to lift 0%, tilt 50%"
kind: action
command: "#OUTPUT,1,10,0,50`<CR><LF>"
params: []
- id: execute_start_raising_venetian_tilt
label: "Execute: Start raising Venetian tilt"
kind: action
command: "#OUTPUT,1,11`<CR><LF>"
params: []
- id: execute_stop_raising_venetian_tilt
label: "Execute: Stop raising Venetian tilt"
kind: action
command: "#OUTPUT,1,13`<CR><LF>"
params: []
- id: response_venetian_lift_level_is_0%,_tilt_level_50%
label: "Response: Venetian lift level is 0%, tilt level 50%"
kind: action
command: "~OUTPUT,1,10,0.00,50.00`<CR><LF>"
params: []
- id: execute_set_fan_speed_to_medium_high
label: "Execute: Set fan speed to Medium High"
kind: action
command: "#OUTPUT,1,1,75`<CR><LF>"
params: []
- id: response_output_level_is_set_to_high
label: "Response: Output level is set to High"
kind: action
command: "~OUTPUT,1,1,100.00`<CR><LF>"
params: []
- id: set_set_output_to_open
label: "Set: Set output to open"
kind: action
command: "#OUTPUT,21,1,0`<CR><LF>"
params: []
- id: set_set_output_to_close
label: "Set: Set output to close"
kind: action
command: "#OUTPUT,21,1,1`<CR><LF>"
params: []
- id: response_output_state_is_closed
label: "Response: Output state is closed"
kind: action
command: "~OUTPUT,21,1,100.00`<CR><LF>"
params: []
Feedbacks
- id: query_what_is_the_system_time?
label: "Query: What is the system time?"
kind: query
query_command: "?SYSTEM,1`<CR><LF>"
- id: query_what_is_the_system_date?
label: "Query: What is the system date?"
kind: query
query_command: "?SYSTEM,2`<CR><LF>"
- id: query_what_is_the_ip_address?
label: "Query: What is the IP Address?"
kind: query
query_command: "?ETHERNET,0`<CR><LF>"
- id: query_what_is_the_login_information_for_user_1?
label: "Query: What is the Login Information for user 1?"
kind: query
query_command: "?ETHERNET,3,1`<CR><LF>"
- id: query_what_is_the_login_information_for_all_users?_note_0_=_all
label: "Query: What is the Login Information for ALL users? (Note: 0 = ALL)"
kind: query
query_command: "?ETHERNET,3,0`<CR><LF>"
- id: query_what_is_the_state_of_led_1?
label: "Query: What is the state of LED 1?"
kind: query
query_command: "?DEVICE,4,101,9`<CR><LF>"
- id: query_is_diagnostic_monitoring_disabled?
label: "Query: Is Diagnostic Monitoring disabled?"
kind: query
query_command: "?MONITORING,1`<CR><LF>"
- id: query_what_is_the_sunrise_time?
label: "Query: What is the sunrise time?"
kind: query
query_command: "?TIMECLOCK,4,2`<CR><LF>"
- id: query_what_is_the_state_of_the_output?
label: "Query: What is the state of the output?"
kind: query
query_command: "?OUTPUT,1,1`<CR><LF>"
- id: query_what_is_the_state_of_the_venetian_lift_and_tilt?
label: "Query: What is the state of the Venetian lift and tilt?"
kind: query
query_command: "?OUTPUT,1,10`<CR><LF>"
- id: query_what_is_the_state_of_the_output?_2
label: "Query: What is the state of the output?"
kind: query
query_command: "?OUTPUT,21,1`<CR><LF>"
- id: query_what_is_the_temperature_sensors_battery_status?
label: "Query: What is the Temperature Sensor's Battery Status?"
kind: query
query_command: "?DEVICE,1,1,22`<CR><LF>"
- id: response_status_report
label: "Response: Status Report"
kind: query
query_command: "~DEVICE,1,1,22,0x123ABCDE,1,1,03/27/2018 12:55:00`<CR><LF>"
Variables
# No discrete Variables section - system exposes state via query (?OUTPUT, ?DEVICE,
# ?SYSTEM, ?TIMECLOCK, ?HVAC, ?GROUP, ?AREA, ?SHADEGRP) and unsolicited monitor (~)
# reports. Variable-like state is captured in the Feedbacks section.
Events
# Unsolicited monitor reports (~) emitted when system state changes locally.
# Type/scope defined by the corresponding MONITORING enable command.
- id: zone_level_changed
description: "~OUTPUT,<id>,1,<level> - emitted when zone level changes locally or via command (requires Zone Monitoring)"
- id: button_pressed
description: "~DEVICE,<id>,<button>,3 - emitted on button press (requires Button Monitoring)"
- id: button_released
description: "~DEVICE,<id>,<button>,4 - emitted on button release (requires Button Monitoring)"
- id: occupancy_changed
description: "~DEVICE,<id>,2,3|4 - occupancy sensor state transition (requires Occupancy Monitoring)"
- id: led_state_changed
description: "~DEVICE,<id>,<led>,9,<state> - LED state change (requires LED Monitoring)"
- id: hvac_state_changed
description: "~HVAC,<id>,<action>,<params> - HVAC state change (requires HVAC Monitoring)"
- id: error
description: "~ERROR,<code> - emitted on invalid command; codes 1-6"
Macros
# No explicit multi-step macros documented in source. Source best-practice note:
# build multi-light scenes in the Lutron system itself, then activate via a single
# #DEVICE scene command rather than several #OUTPUT commands.
Safety
confirmation_required_for: []
interlocks:
- Raise/Lower commands on areas, shades, and outputs continue until a Stop command is received; always issue Stop to halt
- Fade time parameter accepted but ignored on Sivoia QS shades and Venetian blinds (constant-rate motion)
- Delay time: min 0 s, max 4 hours; fractional seconds rounded down to nearest 1/4 s
- Send a valid Zone Level to stop a flashing output (Start Flashing runs until cancelled)
- For Venetian blinds, Delay time min is 0.25 s, max 4 hours
# UNRESOLVED: no explicit safety warnings or hazard procedures stated in source
Notes
Command syntax: #<COMMAND>,<integration_id>,<action>,<params><CR><LF> (execute); ?<COMMAND>,<id>,<action> (query); ~<COMMAND>,<id>,<action>,<params> (report/monitor). ASCII, case-insensitive, spaces and leading zeros ignored.
Inter-message delay: 100 ms after # commands; 1500 ms after ? queries. Use monitoring (#MONITORING) to maintain current state rather than polling queries.
Authentication: Telnet login. QS Standalone ships with logins nwk and nwk2, passphrases configurable. RadioRA 2 logins defined in the RadioRA 2 software (up to 10 additional). RS-232 and Ethernet are mutually exclusive on QSE-CI-NWK-E.
Scene numbering: Scene 0 = Off. Scenes 1–16 standard (Athena); Quantum 0–326. Shade presets: 0 = Open, 30 = Closed. For switched outputs any non-zero level = on/closed; 0 = off/open.
HVAC note: changing a setpoint turns Eco Mode off. Use 255 as placeholder to leave a parameter unchanged.
Provenance
source_domains:
- assets.lutron.com
- web.archive.org
source_urls:
- https://assets.lutron.com/a/documents/040249.pdf
- https://web.archive.org/web/20241201153838/https://assets.lutron.com/a/documents/040249.pdf
retrieved_at: 2026-04-30T00:10:09.599Z
last_checked_at: 2026-06-25T10:29:05.137Z
Verification Summary
verdict: verified
checked_at: 2026-06-25T10:29:05.137Z
matched_actions: 68
action_count: 68
confidence: medium
summary: "deterministic presence proof: 68/68 payloads verbatim in source; stratified Sonnet sample corroborated (7 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "Caseta-specific model numbers not enumerated in source; document covers broader Lutron integration protocol applicable to Caseta"
- "Telnet port not explicitly stated in source"
- "no explicit safety warnings or hazard procedures stated in source"
- "Telnet port number not explicitly stated in source"
- "Caseta-specific model numbers not enumerated in source"
- "firmware version compatibility ranges not stated in source"
- "UDP multicast port for RadioRA 2 device-discovery not stated in source"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0