Zephyrus Desk Setup¶
How the ASUS ROG Zephyrus laptop is set up to work as a desktop: lid closed, always on AC, sharing a keyboard, mouse and speakers with a MacBook Pro. Covers the Windows power settings, re-pairing a Logitech LIGHTSPEED dongle without G HUB, audio routing, and the G915 backlight turning itself off.
Layout¶
┌──────────────────────┐
G915 TKL dongle ──┤ ├── Zephyrus (Windows 11, lid closed, on AC)
G903 dongle ──────┤ USB switch │
│ (B0CH7T76RX) ├── MacBook Pro
└──────────────────────┘
Zephyrus ── display cable ── Samsung U28E590 ── 3.5 mm jack ── speakers
| Part | Role |
|---|---|
| ASUS ROG Zephyrus (Windows 11 Home) | Main machine, used closed-lid as a desktop |
| MacBook Pro | Second machine on the same desk |
| USB switch | Moves the USB peripherals between the two machines with one button |
Logitech G915 TKL (LIGHTSPEED, 046D:C545) |
Keyboard, dongle in the switch |
Logitech G903 (LIGHTSPEED receiver 046D:C539) |
Mouse, dongle in the switch |
| Samsung U28E590 | Monitor; its headphone jack drives the speakers |
1. Desktop-mode power settings¶
The problem¶
Left idle, the laptop went to sleep and sometimes looked like it had shut off. The Windows event log showed what was actually happening:
Kernel-Power 506 The system is entering Modern Standby Reason: Sleep Button.
Kernel-Power 506 The system is entering Modern Standby Reason: Austerity Battery Drain Budget Exceeded.
Kernel-Power 42 The system is entering sleep. Sleep Reason: Hibernate from Sleep - Standby Battery Budget Exceeded
So it wasn't shutting down. It entered Modern Standby, then Windows moved it to hibernate once the standby battery budget ran out. Hibernate looks exactly like being off. Separately, the plugged-in Sleep after timer was set to 4 hours.
This machine only supports S0 Modern Standby and hibernate. S3 sleep isn't available, so there's no "classic sleep" option to fall back on:
What was changed¶
All plugged-in (AC) values. Battery (DC) behaviour was left as it was, so the laptop still sleeps normally on battery.
| Setting | powercfg alias | Before (AC) | After (AC) |
|---|---|---|---|
| Sleep after | SUB_SLEEP STANDBYIDLE |
4 h (0x3840) |
Never (0) |
| Hibernate after | SUB_SLEEP HIBERNATEIDLE |
Never | Never (set explicitly) |
| Lid close action | SUB_BUTTONS LIDACTION |
Do nothing | Do nothing (set explicitly) |
The values were written to every power scheme (only Balanced exists on this machine), so switching plans won't bring sleep back:
$schemes = (powercfg /list | Select-String 'GUID: ([0-9a-f-]{36})').Matches | ForEach-Object { $_.Groups[1].Value }
foreach ($s in $schemes) {
powercfg /setacvalueindex $s SUB_SLEEP STANDBYIDLE 0
powercfg /setacvalueindex $s SUB_SLEEP HIBERNATEIDLE 0
powercfg /setacvalueindex $s SUB_BUTTONS LIDACTION 0
}
powercfg /setactive SCHEME_CURRENT
LIDACTION is hidden in plain powercfg /query. Use /qh to see it.
Verifying¶
powercfg /qh SCHEME_CURRENT SUB_SLEEP STANDBYIDLE | Select-String Current
powercfg /qh SCHEME_CURRENT SUB_SLEEP HIBERNATEIDLE | Select-String Current
powercfg /qh SCHEME_CURRENT SUB_BUTTONS LIDACTION | Select-String Current
All three Current AC Power Setting Index lines should read 0x00000000.
To see why the machine last went to sleep, read the Modern Standby entry/exit events:
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-Kernel-Power'; Id=506,507,42} -MaxEvents 20 |
Format-Table TimeCreated, Id, Message -Wrap
Reverting¶
Not done yet¶
- MyASUS → Battery Health Charging → Maximum Lifespan (60%). Recommended for a laptop that sits on the charger permanently, but not yet set.
2. Re-pairing the G903 dongle without G HUB¶
The problem¶
The G903's LIGHTSPEED dongle (046D:C539) was still paired to an older G903 that broke. The replacement G903 only worked over its USB cable.
Logitech's supported route is G HUB → Settings → App Settings → Device Pairing Tool (Logitech support). G HUB wasn't installed, and installing it just to send one command wasn't worth it. Instead, the dongle was paired by sending the same HID++ 1.0 register writes directly from PowerShell, which is the same approach Solaar uses on Linux.
Scripts¶
The scripts are in docs/files/g903-pairing/ in this repo. They need no installs, just Windows PowerShell 5.1 and Add-Type:
| File | What it does |
|---|---|
Hidpp.cs |
Finds the receiver's vendor HID collections (usage page 0xFF00), reads input reports on a background thread, writes short/long reports |
diag.ps1 |
Read-only: dumps the notification flags, connection count and slot 1 pairing info and name |
pair.ps1 |
Interactive: frees the slot if needed, opens the pairing lock, waits for the mouse |
ping.ps1 |
HID++ 2.0 ping to slot 1, to prove the wireless link is up |
Run them from the folder they're in:
powershell -NoProfile -ExecutionPolicy Bypass -File .\diag.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File .\pair.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File .\ping.ps1
pair.ps1 prompts for each step: unplug the cable, switch the mouse off, press Enter, then switch it on while the pairing window is open (45 s). The keyboard and touchpad keep working while the mouse is off.
How it works¶
The receiver exposes HID++ on interface MI_02 as three vendor-defined collections:
| Collection | Report ID | Length | Used for |
|---|---|---|---|
col01 |
0x10 |
7 bytes | Short HID++ (register reads/writes, notifications) |
col02 |
0x11 |
20 bytes | Long HID++ (register replies with payloads) |
col03 |
0x20 |
32 bytes | DJ reports |
The receiver registers used:
| Request | Bytes | Meaning |
|---|---|---|
| Read pairing info, slot 1 | 10 FF 83 B5 20 00 00 |
Returns the wireless product ID (wpid) of the paired device |
| Read device name, slot 1 | 10 FF 83 B5 40 00 00 |
ASCII name, e.g. G903 LS |
| Open pairing lock | 10 FF 80 B2 01 00 00 |
Accept a new device (default timeout) |
| Unpair slot 1 | 10 FF 80 B2 03 01 00 |
Remove the device in slot 1 |
| Close pairing lock | 10 FF 80 B2 02 00 00 |
Cancel pairing |
What happened on 2026-10-18¶
diag.ps1showed slot 1 holding the dead mouse: wpid0x4087, nameG903 LS.- Opening the lock was rejected:
10 FF 8F 80 B2 05 00. HID++ error0x05means too many devices: this receiver holds exactly one device, and passing a slot number or timeout didn't get around it. pair.ps1was changed to unpair slot 1 when it gets error0x05(10 FF 80 B2 00 00 00= success), then open the lock again.- The new mouse was switched on, and the receiver reported a device connection (
10 01 41 …) followed by the lock closing with no error (10 FF 4A 00 00 …). ping.ps1got an answer from the mouse through the dongle (HID++ 4.2), which confirmed the wireless link.
A wpid identifies the model, not the individual mouse, so it reads 0x4087 before and after. The pairing record itself changed, and the old mouse is gone.
Things to know¶
- A LIGHTSPEED mouse pairs to one receiver at a time. If the G903 is ever paired to another dongle, this one stops working with it. The same script pairs it back.
- Charging over the cable still works; the mouse just runs wired while the cable is plugged in.
3. Speakers¶
The USB switch has no audio output. A USB-A-to-3.5 mm adapter on the switch worked, but it was dropped in favour of something simpler: the speakers plug into the monitor's headphone jack.
Windows sends audio to the monitor over the display cable, through the NVIDIA GPU's HDMI/DP audio. It shows up as this output device:
Select it in Settings → System → Sound → Output.
The monitor's jack plays whichever input the monitor is currently showing, so speaker audio follows the monitor input, not the USB switch.
4. G915 TKL backlight turning off¶
The problem¶
On the Zephyrus, and never on the MacBook, the G915 TKL's backlight switched off after a few minutes idle.
The cause was the Logitech LampArray Service (logi_lamparray_service). Windows Update installs it with the logi_lamparray_usb.inf driver, without G HUB, to expose Logitech keyboards to Windows Dynamic Lighting. The service takes control of the keyboard's lighting power modes (HID++ feature 0x8071 rgbEffects). From then on, the keyboard firmware no longer dims or wakes itself. It only reports "idle" to the host, and the service switches the lights off. The Mac has no such service, so there the firmware handles idle itself.
Read from the keyboard on 2026-10-18 with the service running:
0x8071 at feature index 10
Idle -> power save (dim): 60 s
Idle -> off: 300 s
Power mode: 3 (1 = full, 2 = power save, 3 = off)
SW control flags: 0x02 (0x01 = host owns LEDs, 0x02 = host owns power modes)
Event flags: 0x06
What didn't work: disabling the idle timers¶
Setting both timers to 0xFFFF (never) over 0x8071 function 7 brought the lights back and stopped the idle events. One round trip through the USB switch undid it. When its dongle reconnects, the keyboard resets the timers to 60 s / 300 s, and the service claims control again.
What was done: disable the service, hand control back to the firmware¶
Windows Dynamic Lighting was already off (AmbientLightingEnabled = 0 under HKCU\Software\Microsoft\Lighting), so the service wasn't doing anything useful. From an elevated PowerShell:
Stopping the service did not release its claim on the keyboard (flags still 0x02), so the claim was released explicitly with 0x8071 function 5 [01 00 00]:
Result: SW control flags 0x00. The keyboard firmware owns its lighting again and behaves as it does on the Mac: it dims after 60 s idle, turns off after 300 s, and comes back on the next key press.
Scripts¶
These sit in docs/files/g903-pairing/ next to the pairing scripts, because they use the same Hidpp.cs helper:
| File | What it does |
|---|---|
features.ps1 |
Read-only: lists every HID++ 2.0 feature of a device behind a receiver (default: G915 TKL on 046D:C545) |
g915-lighting.ps1 |
Reads the 0x8071 idle timers, power mode and SW-control flags. -Release hands control back to the firmware. -Dim/-Off set the timers (seconds, 65535 = never). -Mode 1 turns the lights on while a host owns power modes |
0x8071 functions used (long reports, big-endian, first byte 00 = get / 01 = set):
| fn | Name | Bytes used |
|---|---|---|
| 5 | manageSwControl | get [00 00 00], release [01 00 00] |
| 7 | manageRgbPowerModeConfig | get [00 00 00] → [00 flags flags dim dim off off], timers in seconds |
| 8 | manageRgbPowerMode | get [00 00 00], set [01 mode 00] (only while a host owns power modes) |
Byte layout from openlogi's 0x8071 reference and logirgb.
Undoing it¶
To give the keyboard back to Windows Dynamic Lighting:
Troubleshooting¶
"The laptop went to sleep / looks shut off while plugged in":
- Check the three
Current AC Power Setting Indexvalues under Verifying. A Windows feature update or an ASUS utility may have reset them. - Read the
506/42events. Austerity Battery Drain Budget Exceeded means it was on battery; check the charger is actually connected. - Reason: Sleep Button means a sleep key (e.g. an Fn combo) was pressed. That's a separate setting (
SUB_BUTTONS SBUTTONACTION) and was left at Sleep.
"pair.ps1 says Receiver rejected open-lock: 10 FF 8F 80 B2 05 00":
- Error
0x05= receiver full. The current script handles this by unpairing slot 1. If you see it from an older copy, update the script.
"Pairing window timed out (mouse not seen)":
- The cable must be unplugged. With the cable in, the mouse stays in wired mode and never looks for a receiver.
- Switch it on after the green "Pairing window is OPEN" line, not before.
"The G915 backlight turns off and stays off on the Zephyrus":
- Run
g915-lighting.ps1. IfSW control flagsisn't0x00, something has taken control of the keyboard again. - Check the service is still disabled:
sc.exe qc logi_lamparray_service | Select-String START_TYPEshould readDISABLED. A Logitech driver update through Windows Update may re-enable it. - Re-disable it, then run
g915-lighting.ps1 -Release.
"No speaker sound":
- Check the output device is
U28E590 (NVIDIA High Definition Audio), notSpeakers (Realtek(R) Audio). Windows can switch back to the built-in speakers after the display reconnects. - Check the monitor is showing the Zephyrus's input.
Decisions¶
Raw HID++ instead of G HUB. One register write doesn't justify installing G HUB and its background services. The scripts are small, read-only by default (diag.ps1), and do exactly what G HUB's Device Pairing Tool does underneath.
Sleep disabled on AC only. On battery the laptop still sleeps and hibernates normally, so taking it off the desk needs no settings changes.
Firmware-owned keyboard lighting over "never dim". Keeping the lights on permanently would mean re-sending the timer setting after every press of the USB switch and every keyboard power cycle, through a scheduled task competing with the service. Handing control back to the firmware gives the same behaviour on both machines, with nothing running on Windows.
Monitor jack over a USB audio adapter. The adapter worked, but one fewer device on the switch is one fewer thing to break, and the monitor already gets audio over the display cable.