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

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 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/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/master/crates/openlogi-hidpp/src/feature/battery_status.rs) and [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/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/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/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/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/master/crates/openlogi-hidpp/src/feature/hires_wheel.rs)) and ThumbwheelFeature ([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/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/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/master/crates/openlogi-hidpp/src/feature/illumination.rs)), PerKeyLightingFeature ([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/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/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/master/crates/openlogi-hidpp/src/feature/smartshift.rs) and [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/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/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/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/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/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/master/crates/openlogi-hidpp/src/feature/mouse_pointer.rs) and [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/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/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:

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:

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

Adjusting DPI settings:

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

Setting per-key RGB colors:

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.
  • 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. 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, 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 and smartshift_enhanced.rs respectively. These structs provide methods to toggle between ratcheted and free-spinning wheel modes.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →