Skip to content

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:

powercfg /a

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

powercfg /change standby-timeout-ac 240

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

  1. diag.ps1 showed slot 1 holding the dead mouse: wpid 0x4087, name G903 LS.
  2. Opening the lock was rejected: 10 FF 8F 80 B2 05 00. HID++ error 0x05 means too many devices: this receiver holds exactly one device, and passing a slot number or timeout didn't get around it.
  3. pair.ps1 was changed to unpair slot 1 when it gets error 0x05 (10 FF 80 B2 00 00 00 = success), then open the lock again.
  4. 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 …).
  5. ping.ps1 got 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:

U28E590 (NVIDIA High Definition Audio)

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:

sc.exe config logi_lamparray_service start= disabled
sc.exe stop logi_lamparray_service

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]:

powershell -NoProfile -ExecutionPolicy Bypass -File .\g915-lighting.ps1 -Release

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:

sc.exe config logi_lamparray_service start= auto
sc.exe start logi_lamparray_service

Troubleshooting

"The laptop went to sleep / looks shut off while plugged in":

  • Check the three Current AC Power Setting Index values under Verifying. A Windows feature update or an ASUS utility may have reset them.
  • Read the 506/42 events. 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. If SW control flags isn't 0x00, something has taken control of the keyboard again.
  • Check the service is still disabled: sc.exe qc logi_lamparray_service | Select-String START_TYPE should read DISABLED. 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), not Speakers (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.