# Which HID++ Features Does OpenLogi Support for Logitech Devices?

> Discover which HID++ features OpenLogi supports for Logitech devices. Explore battery monitoring DPI control Smart Shift RGB lighting and gesture recognition.

- Repository: [Xuan Zhang/OpenLogi](https://github.com/AprilNEA/OpenLogi)
- Tags: api-reference
- Published: 2026-09-03

---

**OpenLogi implements a comprehensive set of Logitech HID++ (1.0/2.0) features—including battery monitoring, DPI control, Smart Shift, RGB lighting, and gesture recognition—via strongly-typed Rust structs in the `openlogi-hidpp` crate.**

The [AprilNEA/OpenLogi](https://github.com/AprilNEA/OpenLogi) repository provides an open-source Rust stack for communicating with Logitech peripherals over the HID++ protocol. Each capability is exposed as a dedicated feature struct that handles low-level protocol encoding and decoding, allowing developers to query device state and configure hardware settings programmatically.

## Battery and Power Management

OpenLogi supports multiple HID++ features for monitoring device power state. The **Unified Battery** feature (`0x1004`) is implemented in [[`crates/openlogi-hidpp/src/feature/unified_battery.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/crates/openlogi-hidpp/src/feature/unified_battery.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/unified_battery.rs) as `UnifiedBatteryFeature`, providing charging percentage and battery level enums.

For older devices, the **Legacy Battery Status** (`0x1000`) and **Battery Voltage** (`0x1001`) features are available via `BatteryStatusFeature` and `BatteryVoltageFeature` in [[`battery_status.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/battery_status.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/battery_status.rs) and [[`battery_voltage.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/battery_voltage.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/battery_voltage.rs) respectively. The `WirelessDeviceStatusFeature` in [[`wireless_device_status.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/wireless_device_status.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/wireless_device_status.rs) handles power status notifications for wireless peripherals.

## Device Identification and Metadata

Device discovery relies on the **Device Information** feature (`0x0005`), implemented as `DeviceInformationFeature` and `DeviceTransport` in [[`crates/openlogi-hidpp/src/feature/device_information.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/crates/openlogi-hidpp/src/feature/device_information.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/device_information.rs). This exposes hardware type, name, and transport protocol metadata.

The **Device Type and Name** sub-feature is handled separately by `DeviceTypeAndNameFeature` in [[`device_type_and_name.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/device_type_and_name.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/device_type_and_name.rs), allowing retrieval of user-friendly device identifiers.

## Input Control: DPI, Scrolling, and Gestures

Precision input is managed through several HID++ features. **DPI Control** (`0x1034`) is implemented as `DpiFeature` in [[`crates/openlogi-device/src/write/dpi.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/crates/openlogi-device/src/write/dpi.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-device/src/write/dpi.rs), providing methods to set sensor resolution programmatically.

For scrolling, **High-Resolution Wheel** (`0x2045`) and **Thumb-Wheel** (`0x2028`) are supported via `HiResWheelFeature` ([[`hires_wheel.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/hires_wheel.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/hires_wheel.rs)) and `ThumbwheelFeature` ([[`thumbwheel.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/thumbwheel.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/thumbwheel.rs)). The **Vertical Scrolling** feature (`0x202C`) is available as `VerticalScrollingFeature` in [[`vertical_scrolling.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/vertical_scrolling.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/vertical_scrolling.rs).

Touch surface input is covered by **Touchpad Raw XY** (`0x2128`) via `TouchpadRawXyFeature` and **Touch Mouse Raw** (`0x212B`) via `TouchMouseRawFeature`. Gesture recognition uses the **Gestures2** feature (`0x2027`), implemented as `Gestures2Feature` in [[`gestures2.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/gestures2.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/gestures2.rs).

## Lighting and Visual Effects

OpenLogi provides extensive lighting control through the **Illumination** (`0x2034`), **Per-Key Lighting** (`0x2120`), and **RGB Effects** (`0x2121`) features. These correspond to `IlluminationFeature` ([[`illumination.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/illumination.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/illumination.rs)), `PerKeyLightingFeature` ([[`per_key_lighting.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/per_key_lighting.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/per_key_lighting.rs)), and `RgbEffectsFeature` ([[`rgb_effects.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/rgb_effects.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/rgb_effects.rs)).

Solar-powered devices are supported via the **Solar Dashboard** feature (`0x2035`), implemented as `SolarDashboardFeature` in [[`solar_dashboard.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/solar_dashboard.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/solar_dashboard.rs).

## Advanced Device Capabilities

The **Smart Shift** feature, which controls adaptive scroll-wheel ratcheting, is implemented in two versions: `SmartShiftFeature` (`0x2110`) and `SmartShiftEnhancedFeature` (`0x2111`) located in [[`smartshift.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/smartshift.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/smartshift.rs) and [[`smartshift_enhanced.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/smartshift_enhanced.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/smartshift_enhanced.rs) respectively.

Audio-specific peripherals are supported through the **Sidetone** feature (`0x2022`) via `SidetoneFeature` in [[`sidetone.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/sidetone.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/sidetone.rs). Button remapping is handled by the **Reprogrammable Controls** feature (`0x2032`) through `ReprogControlsFeature` in [[`reprog_controls.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/reprog_controls.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/reprog_controls.rs).

## Host Connectivity and Platform Support

Multi-device management features include **Report Rate** (`0x2030`) via `ReportRateFeature` in [[`report_rate.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/report_rate.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/report_rate.rs), **Multi-Platform Host Info** (`0x2031`) via `MultiPlatformFeature` in [[`multi_platform.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/multi_platform.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/multi_platform.rs), and **Hosts Info** (`0x2032`) via `HostsInfoFeature` in [[`hosts_info.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/hosts_info.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/hosts_info.rs).

Additional system features include **Mouse Pointer** settings (`0x2036`) via `MousePointerFeature` and **Mode Status** (`0x2025`) via `ModeStatusFeature` in [[`mouse_pointer.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/mouse_pointer.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/mouse_pointer.rs) and [[`mode_status.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/mode_status.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/mode_status.rs) respectively.

## Feature Detection Architecture

OpenLogi discovers device capabilities using the **Root Feature**, which provides access to the device's feature table. Implemented as `RootFeature` in [[`crates/openlogi-hidpp/src/feature/root.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/crates/openlogi-hidpp/src/feature/root.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-hidpp/src/feature/root.rs), this struct enables enumeration of all supported HID++ features.

The probing logic resides in [[`crates/openlogi-device/src/inventory/features.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/crates/openlogi-device/src/inventory/features.rs)](https://github.com/AprilNEA/OpenLogi/blob/master/crates/openlogi-device/src/inventory/features.rs), where OpenLogi walks the feature table to detect specific capabilities including `BatteryStatusFeature`, `DeviceInformationFeature`, `Gestures2Feature`, `HiResWheelFeature`, and `UnifiedBatteryFeature`.

## Programming with HID++ Features in Rust

Interacting with HID++ features requires obtaining a feature index from the device and instantiating the corresponding struct with a communication channel. Below are idiomatic examples using the `openlogi-hidpp` API.

Reading unified battery status:

```rust
let channel = Arc::new(hidpp_channel);
let slot = 0; // Device slot index
let battery = UnifiedBatteryFeature::new(channel.clone(), slot, feature_idx);
let info = battery.get_battery_info().await?;
println!("Battery: {}% ({:?})", info.charging_percentage, info.level);

```

Configuring Smart Shift mode:

```rust
let smart_shift = SmartShiftFeature::new(channel.clone(), slot, ss_idx);
smart_shift.set_wheel_mode(WheelMode::SmartShift).await?;

```

Adjusting DPI settings:

```rust
let dpi = DpiFeature::new(channel.clone(), slot, dpi_idx);
dpi.set_dpi(800).await?;

```

Setting per-key RGB colors:

```rust
let per_key = PerKeyLightingFeature::new(channel.clone(), slot, per_key_idx);
let rgb = Rgb { red: 0xFF, green: 0x00, blue: 0x00 };
per_key.set_key_color(0x04, rgb).await?;

```

## Summary

- OpenLogi supports **25+ HID++ features** across battery, input, lighting, and system categories through the `openlogi-hidpp` crate.
- Each feature is exposed as a **Rust struct** (e.g., `UnifiedBatteryFeature`, `SmartShiftFeature`) that handles protocol encoding in dedicated source files.
- **Feature detection** relies on `RootFeature` and probing logic in [`crates/openlogi-device/src/inventory/features.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/crates/openlogi-device/src/inventory/features.rs).
- **DPI control** is implemented in the higher-level `openlogi-device` crate, while most features reside in `openlogi-hidpp`.
- All features support **async/await** patterns for non-blocking device communication.

## Frequently Asked Questions

### What HID++ feature IDs does OpenLogi use for battery monitoring?

OpenLogi recognizes three battery-related feature IDs: **Unified Battery** (`0x1004`), **Legacy Battery Status** (`0x1000`), and **Battery Voltage** (`0x1001`). These correspond to `UnifiedBatteryFeature`, `BatteryStatusFeature`, and `BatteryVoltageFeature` respectively in the `crates/openlogi-hidpp/src/feature/` directory.

### How does OpenLogi determine which HID++ features a Logitech device supports?

During enumeration, OpenLogi uses the `RootFeature` struct to query the device's feature table, then probes for specific capabilities in [`crates/openlogi-device/src/inventory/features.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/crates/openlogi-device/src/inventory/features.rs). The probe checks for structured features like `DeviceInformationFeature`, `Gestures2Feature`, and `ReprogControlsFeature` to build a capability map.

### Can I control individual key RGB lighting using OpenLogi?

Yes, OpenLogi implements **Per-Key Lighting** (`0x2120`) via `PerKeyLightingFeature` in [`per_key_lighting.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/per_key_lighting.rs), allowing you to set individual key colors using the `set_key_color` method. The **RGB Effects** feature (`0x2121`) is also available for synchronized lighting effects.

### Where is the Smart Shift adaptive scrolling feature implemented?

Smart Shift is implemented in two variants: `SmartShiftFeature` for base feature `0x2110` and `SmartShiftEnhancedFeature` for `0x2111`, located in [`smartshift.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/smartshift.rs) and [`smartshift_enhanced.rs`](https://github.com/AprilNEA/OpenLogi/blob/main/smartshift_enhanced.rs) respectively. These structs provide methods to toggle between ratcheted and free-spinning wheel modes.