0x8071 · rgbEffects
Modern per-cluster RGB effect engine — claim software control, apply effects with volatile or persistent storage per cluster, and manage power modes and sync events.
The modern per-cluster RGB effect engine, the successor to 0x8070
colorLedEffects. A device groups its LEDs into clusters, each advertising a
set of effects. get_device_info, get_cluster_info, and get_effect_info
query the three info modes of the polymorphic getInfo function (device,
cluster, and per-effect detail respectively). set_rgb_cluster_effect applies a
chosen effect, with up to 10 effect-specific parameter bytes, a
RgbPersistence flag (volatile RAM or non-volatile EEPROM), and a
PowerModeTarget (full-power or power-save mode).
Software must call set_sw_control first to claim ownership of clusters and/or
power modes before any write call will be accepted. get_nv_config /
set_nv_config read and write named non-volatile capabilities (boot-up effect,
demo, active dimming, etc.). Power-mode timeouts are managed with
get_power_mode_config / set_power_mode_config; the current mode with
get_power_mode / set_power_mode. Three unsolicited events are decoded:
EffectSync— a periodic effect reached a synchronization point; carries the cluster index and current timing position in milliseconds.UserActivity— activity detected or the no-activity timeout was reached (ActivityEventType).ClusterChanged— mirrors asetRgbClusterEffectrequest; carries the full params, persistence, and power-mode target.
Key types: RgbDeviceInfo, RgbClusterInfo, RgbEffectInfo, RgbSwControl,
RgbNvConfig, RgbPowerModeConfig, RgbPersistence, RgbPowerMode,
SwControlFlags, RgbNvCapabilities, RgbExtCapabilities.
Spec: Logitech HID++ 2.0 — rgbEffects. Used by: Typed wrapper in
openlogi-hidpp.
Function reference
The RgbEffectsFeature wrapper (0x8071) exposes methods for querying and configuring per-cluster RGB effects, managing software control and non-volatile capabilities, and receiving unsolicited lighting events.
Methods
| Function | HID++ fn | Signature | Returns |
|---|---|---|---|
get_device_info | 0 | () | RgbDeviceInfo |
get_cluster_info | 0 | (cluster_index: u8) | RgbClusterInfo |
get_effect_info | 0 | (cluster_index: u8, cluster_effect_index: u8) | RgbEffectInfo |
get_onboard_effect_info | 0 | (cluster_index: u8, cluster_effect_index: u8, slot: u8, slot_info_type: SlotInfoType) | [u8; 13] |
set_rgb_cluster_effect | 1 | (cluster_index: u8, cluster_effect_index: u8, params: [u8; 10], persistence: RgbPersistence, power_mode: PowerModeTarget) | () |
set_multi_led_cluster_pattern | 2 | (cluster_index: u8, pattern: u8) | () |
get_nv_config | 3 | (capability: RgbNvCapabilities) | RgbNvConfig |
set_nv_config | 3 | (capability: RgbNvCapabilities, state: u8, param1: u8, param2: u8) | () |
get_led_bin_info | 4 | (cluster_index: u8, led_bin_index: LedBinIndex, backup: bool) | [u8; 8] |
set_led_bin_info | 4 | (cluster_index: u8, led_bin_index: LedBinIndex, params: [u8; 8]) | () |
get_sw_control | 5 | () | RgbSwControl |
set_sw_control | 5 | (control: SwControlFlags, events: EventsNotificationFlags) | () |
set_effect_sync_correction | 6 | (cluster_index: u8, drift_value: i16) | () |
get_power_mode_config | 7 | () | RgbPowerModeConfig |
set_power_mode_config | 7 | (config: RgbPowerModeConfig) | () |
get_power_mode | 8 | () | RgbPowerMode |
set_power_mode | 8 | (mode: RgbPowerMode) | () |
shutdown | 9 | () | () |
listen | — | () | async_channel::Receiver<RgbEffectsEvent> |
All pub async fn methods return Result<…, Hidpp20Error>. listen is synchronous and returns a channel receiver directly.
Types
RgbDeviceInfo
Device-level information from get_device_info.
| Field | Type | Description |
|---|---|---|
cluster_count | u8 | Number of RGB clusters. |
nv_capabilities | RgbNvCapabilities | Supported non-volatile capabilities. |
ext_capabilities | RgbExtCapabilities | Extended capabilities. |
multicluster_effect_count | u8 | Number of multi-cluster effects. |
RgbClusterInfo
Cluster-level information from get_cluster_info.
| Field | Type | Description |
|---|---|---|
cluster_index | u8 | Index of the cluster. |
location | u16 | Physical location of the cluster (raw locationEffect value). |
effects_number | u8 | Number of effects the cluster supports. |
display_persistency | DisplayPersistencyCapabilities | Display persistency capabilities. |
effect_persistency | bool | Whether effect persistency to EEPROM is supported. |
multiled_pattern | bool | Whether multi-LED patterns are supported. |
RgbEffectInfo
Effect-level information from get_effect_info.
| Field | Type | Description |
|---|---|---|
cluster_index | u8 | Index of the cluster. |
cluster_effect_index | u8 | Index of the effect within the cluster. |
effect_id | u16 | The effect type identifier (raw effectID). |
effect_capabilities | u16 | Effect capability bitmask (meaning depends on effect_id; 0 means Raptor-compatibility defaults). |
effect_period | u16 | Effect period in milliseconds, or 0 when not available. |
RgbSwControl
Software-control state from get_sw_control.
| Field | Type | Description |
|---|---|---|
control | SwControlFlags | Software-control flags. |
events | EventsNotificationFlags | Event-notification flags. |
RgbNvConfig
A non-volatile configuration entry from get_nv_config.
| Field | Type | Description |
|---|---|---|
capability | RgbNvCapabilities | The capability this entry addresses. |
state | u8 | The capability state (commonly 0 = no change, 1 = enabled, 2 = disabled). |
param1 | u8 | First capability-specific parameter. |
param2 | u8 | Second capability-specific parameter. |
RgbPowerModeConfig
Power-mode configuration from get_power_mode_config.
| Field | Type | Description |
|---|---|---|
flags | u16 | Power-mode flags (raw). |
no_activity_timeout_to_power_save | u16 | No-activity timeout before entering power-save, in seconds. |
no_activity_timeout_to_off | u16 | No-activity timeout before turning off, in seconds. |
RgbPowerMode
An overall RGB power mode.
| Variant | Value | Description |
|---|---|---|
FullRgb | 1 | Full RGB. |
PowerSave | 2 | Power-save. |
PowerOff | 3 | Power-off. |
PowerModeTarget
The power-mode target an effect applies to, packed into set_rgb_cluster_effect.
| Variant | Value | Description |
|---|---|---|
FullPower | 0 | Full-power mode. |
PowerSave | 1 | Power-save mode. |
SlotInfoType
The kind of slot information requested for an onboard-stored effect.
| Variant | Value | Description |
|---|---|---|
SlotState | 0 | Slot state (validity, length). |
Defaults | 1 | Default playback parameters. |
Uuid0To10 | 2 | UUID bytes 0..=10. |
Uuid11To16 | 3 | UUID bytes 11..=16. |
EffectName0To10 | 4 | Effect name characters 0..=10. |
EffectName11To21 | 5 | Effect name characters 11..=21. |
EffectName21To31 | 6 | Effect name characters 21..=31. |
LedBinIndex
Selects which LED bin parameter a LED-bin call addresses.
| Variant | Value | Description |
|---|---|---|
BinValueBrightness | 0 | Bin value: brightness. |
BinValueColor | 1 | Bin value: color. |
CalibrationFactors | 2 | Calibration factors. |
Brightness | 3 | Brightness. |
ColorimetricX | 4 | Colorimetric X. |
ColorimetricY | 5 | Colorimetric Y. |
ActivityEventType
The kind of user-activity event.
| Variant | Value | Description |
|---|---|---|
NoActivityTimeoutReached | 0 | The no-activity timeout was reached. |
UserActivityDetected | 1 | User activity was detected. |
RgbPersistence
Persistence of a cluster effect, packed into the low two bits of the set_rgb_cluster_effect flags byte.
| Flag | Bit/Value | Description |
|---|---|---|
VOLATILE | 1 << 0 | Apply to volatile RAM. |
NON_VOLATILE | 1 << 1 | Store in non-volatile EEPROM. |
RgbExtCapabilities
Extended device capabilities from get_device_info.
| Flag | Bit/Value | Description |
|---|---|---|
GET_ZONE_EFFECT | 1 << 0 | getInfo for stored effects is supported. |
SET_LED_BIN_INFO | 1 << 2 | Setting LED bin info is supported. |
MONOCHROME_ONLY | 1 << 3 | Only monochrome effects are supported. |
NO_EFFECT_SYNC | 1 << 4 | Effect-sync correction / events are not supported. |
SHUTDOWN | 1 << 5 | The shutdown function is supported. |
CLUSTER_CHANGED_EVENT | 1 << 6 | The cluster-changed event is supported. |
RgbNvCapabilities
Supported non-volatile capabilities from get_device_info.
| Flag | Bit/Value | Description |
|---|---|---|
BOOT_UP_EFFECT | 1 << 0 | Boot-up effect. |
DEMO | 1 << 1 | Demo mode. |
USER_DEMO_MODE | 1 << 2 | User demo mode. |
EVENTS_DISPLAY | 1 << 3 | Events display. |
ACTIVE_DIMMING | 1 << 4 | Active dimming. |
RAMP_DOWN_TO_OFF | 1 << 5 | Ramp down to off. |
SHUTDOWN_EFFECT | 1 << 6 | Shutdown effect. |
SwControlFlags
Software-control flags for set_sw_control.
| Flag | Bit/Value | Description |
|---|---|---|
ALL_CLUSTERS | 1 << 0 | Software controls all RGB clusters (required before set_rgb_cluster_effect). |
POWER_MODES | 1 << 1 | Software controls power modes (required before set_power_mode). |
EventsNotificationFlags
Event-notification flags for set_sw_control.
| Flag | Bit/Value | Description |
|---|---|---|
EFFECTS_SYNC | 1 << 0 | Emit effect-sync events. |
USER_ACTIVITY | 1 << 1 | Emit user-activity events. |
NO_USER_ACTIVITY_TIMEOUT | 1 << 2 | Emit no-user-activity-timeout events. |
DisplayPersistencyCapabilities
Display-persistency capabilities of a cluster from get_cluster_info.
| Flag | Bit/Value | Description |
|---|---|---|
ALWAYS_ON | 1 << 0 | Can persist an "always on" state. |
ALWAYS_OFF | 1 << 1 | Can persist an "always off" state. |
ON_THEN_OFF | 1 << 2 | Can persist an "on then off" state. |
Events
RgbEffectsFeature implements EmittingFeature<RgbEffectsEvent>; call listen() to receive an async_channel::Receiver<RgbEffectsEvent> channel.
RgbEffectsEvent
| Variant | Fields | Description |
|---|---|---|
EffectSync | cluster_index: u8, effect_counter: u16 | A periodic effect reached a synchronization point. cluster_index 0xff means all clusters; effect_counter is the timing position in milliseconds. |
UserActivity | ActivityEventType | User activity started or the no-activity timeout was reached. |
ClusterChanged | cluster_index: u8, cluster_effect_index: u8, params: [u8; 10], persistence: RgbPersistence, power_mode: PowerModeTarget | A cluster's effect changed; mirrors a set_rgb_cluster_effect request. |
Wire format
Short (3-byte) requests use call; long (16-byte) requests use call_long. All multi-byte fields are big-endian. Responses are read from the 16-byte extended payload.
get_device_info (fn 0)
Request: [0xff, 0xff, 0x00] (ALL_CLUSTERS, ALL_EFFECTS, typeOfInfo=0)
Response (byte → field):
| Byte | Field | Notes |
|---|---|---|
| 2 | cluster_count | Number of clusters. |
| 3–4 | nv_capabilities | RgbNvCapabilities bitfield, big-endian u16. |
| 5–6 | ext_capabilities | RgbExtCapabilities bitfield, big-endian u16. |
| 7 | multicluster_effect_count | Number of multi-cluster effects. |
get_cluster_info (fn 0)
Request: [cluster_index, 0xff, 0x00] (ALL_EFFECTS, typeOfInfo=0)
Response (byte → field):
| Byte | Field | Notes |
|---|---|---|
| 0 | cluster_index | Echo of requested cluster. |
| 2–3 | location | Big-endian u16 location identifier. |
| 4 | effects_number | Number of supported effects. |
| 5 | display_persistency | DisplayPersistencyCapabilities bitfield. |
| 6 | effect_persistency | Non-zero = EEPROM persistency supported. |
| 7 | multiled_pattern | Non-zero = multi-LED patterns supported. |
get_effect_info (fn 0)
Request: [cluster_index, cluster_effect_index, 0x00] (typeOfInfo=0)
Response (byte → field):
| Byte | Field | Notes |
|---|---|---|
| 0 | cluster_index | Echo. |
| 1 | cluster_effect_index | Echo. |
| 2–3 | effect_id | Big-endian u16 effect type identifier. |
| 4–5 | effect_capabilities | Big-endian u16 capability bitmask. |
| 6–7 | effect_period | Big-endian u16 period in ms; 0 = not available. |
get_onboard_effect_info (fn 0)
Request (long, 16 bytes): [cluster_index, cluster_effect_index, 0x01, slot, slot_info_type, 0…] (typeOfInfo=0x01)
Response: bytes 3–15 → raw [u8; 13] onboard params (meaning depends on SlotInfoType).
set_rgb_cluster_effect (fn 1)
Request (long, 16 bytes):
| Byte | Value |
|---|---|
| 0 | cluster_index |
| 1 | cluster_effect_index |
| 2–11 | params[0..10] (effect-specific) |
| 12 | persistence.bits() | (u8::from(power_mode) << 2) — persistence in bits 0–1, power-mode target in bits 2–3 |
| 13–15 | 0x00 |
Response: acknowledged (no payload fields used).
set_multi_led_cluster_pattern (fn 2)
Request: [cluster_index, pattern, 0x00]
Response: acknowledged.
get_nv_config (fn 3)
Request: [0x00, cap_hi, cap_lo] — getOrSet=0, capability bits as big-endian u16.
Response (byte → field):
| Byte | Field | Notes |
|---|---|---|
| 1–2 | capability | RgbNvCapabilities big-endian u16. |
| 3 | state | Capability state byte. |
| 4 | param1 | First capability parameter. |
| 5 | param2 | Second capability parameter. |
set_nv_config (fn 3)
Request (long, 16 bytes): [0x01, cap_hi, cap_lo, state, param1, param2, 0…] — getOrSet=1.
Response: acknowledged.
get_led_bin_info (fn 4)
Request: [get_or_set, cluster_index, led_bin_index] — get_or_set is 0x00 (active) or 0x02 (backup).
Response: bytes 3–10 → raw [u8; 8] LED bin params.
set_led_bin_info (fn 4)
Request (long, 16 bytes): [0x01, cluster_index, led_bin_index, params[0..8], 0…]
Response: acknowledged.
get_sw_control (fn 5)
Request: [0x00, 0x00, 0x00] — getOrSet=0.
Response (byte → field):
| Byte | Field | Notes |
|---|---|---|
| 1 | control | SwControlFlags bitfield. |
| 2 | events | EventsNotificationFlags bitfield. |
set_sw_control (fn 5)
Request: [0x01, control.bits(), events.bits()] — getOrSet=1.
Response: acknowledged.
set_effect_sync_correction (fn 6)
Request (long, 16 bytes): [cluster_index, 0x00, drift_hi, drift_lo, 0…] — drift_value as big-endian i16; cluster_index=0xff targets all clusters.
Response: acknowledged.
get_power_mode_config (fn 7)
Request: [0x00, 0x00, 0x00] — getOrSet=0.
Response (byte → field):
| Byte | Field | Notes |
|---|---|---|
| 1–2 | flags | Power-mode flags, big-endian u16. |
| 3–4 | no_activity_timeout_to_power_save | Seconds, big-endian u16. |
| 5–6 | no_activity_timeout_to_off | Seconds, big-endian u16. |
set_power_mode_config (fn 7)
Request (long, 16 bytes): [0x01, flags_hi, flags_lo, psave_hi, psave_lo, off_hi, off_lo, 0…] — getOrSet=1.
Response: acknowledged.
get_power_mode (fn 8)
Request: [0x00, 0x00, 0x00] — getOrSet=0.
Response: byte 1 → RgbPowerMode (1=FullRgb, 2=PowerSave, 3=PowerOff).
set_power_mode (fn 8)
Request: [0x01, mode as u8, 0x00] — getOrSet=1.
Response: acknowledged.
shutdown (fn 9)
Request: [0x00, 0x00, 0x00]
Response: acknowledged.
Events (unsolicited)
| Sub-ID | Event | Byte layout |
|---|---|---|
| 0 | EffectSync | byte 0 = cluster_index; bytes 1–2 = effect_counter big-endian u16 (ms) |
| 1 | UserActivity | byte 0 = ActivityEventType (0=timeout, 1=detected) |
| 2 | ClusterChanged | byte 0 = cluster_index; byte 1 = cluster_effect_index; bytes 2–11 = params[0..10]; byte 12 = flags (persistence in bits 0–1, power_mode in bits 2–3) |
Usage (Rust)
use hidpp::{
device::Device,
feature::rgb_effects::{
RgbEffectsFeature, RgbPersistence, PowerModeTarget, SwControlFlags,
EventsNotificationFlags,
},
};
// device: Device, obtained via Device::new(channel, index).await?
device.enumerate_features().await?;
if let Some(feat) = device.get_feature::<RgbEffectsFeature>() {
// Claim software control of all clusters and enable effect-sync events.
feat.set_sw_control(
SwControlFlags::ALL_CLUSTERS,
EventsNotificationFlags::EFFECTS_SYNC,
)
.await?;
// Query cluster 0 and its first effect.
let cluster = feat.get_cluster_info(0).await?;
let effect = feat.get_effect_info(0, 0).await?;
println!("cluster 0 has {} effects; first effect_id={:#06x}", cluster.effects_number, effect.effect_id);
// Apply effect 0 to cluster 0 with default params, volatile, full-power mode.
feat.set_rgb_cluster_effect(
0,
0,
[0u8; 10],
RgbPersistence::VOLATILE,
PowerModeTarget::FullPower,
)
.await?;
// Listen for unsolicited events.
let rx = feat.listen();
if let Ok(event) = rx.recv().await {
println!("event: {event:?}");
}
}