Skip to content

PHN16-73 and PHN16S-71 Support#65

Open
JakeBrxwn wants to merge 2 commits into0x7375646F:mainfrom
JakeBrxwn:main
Open

PHN16-73 and PHN16S-71 Support#65
JakeBrxwn wants to merge 2 commits into0x7375646F:mainfrom
JakeBrxwn:main

Conversation

@JakeBrxwn
Copy link
Copy Markdown

Tested functionality of thermal profiles, backlight timeout, battery calibration, battery limiter, boot animation sound, fan speed, usb charging, and four zoned keyboard support.

@CarDGee
Copy link
Copy Markdown

CarDGee commented Nov 26, 2025

Hi PHN16-73 owner here, with your commits I can control fan power profile and even turn rgb off but cannot set it to static as its stuck on multicolor wave, what I do notice is when module is loaded keyboard flashes teal 3 times and the speed of the multicolor wave slows down, but cant change pattern or colors, "ls /sys/devices/platform/acer-wmi/" shows me "driver driver_override four_zoned_kb hwmon modalias platform-profile power predator_sense subsystem uevent" inside "four_zoned_kb" there is four_zone_mode and per_zone_mode files but any changes to them do not reflect on keyboard rgb same goes to "/sys/module/linuwu_sense/drivers/platform:acer-wmi/acer-wmi/four_zoned_kb/".

@marinprusac
Copy link
Copy Markdown

Similar with PHN17S-71. I've tested battery limiter, fan speed, performance modes and keyboard settings. Among which all but keyboard settings work. I can only change the brightness of the keyboard, but color, animation, speed, direction and zones do not respond to changes.

@JakeBrxwn
Copy link
Copy Markdown
Author

Hi PHN16-73 owner here, with your commits I can control fan power profile and even turn rgb off but cannot set it to static as its stuck on multicolor wave, what I do notice is when module is loaded keyboard flashes teal 3 times and the speed of the multicolor wave slows down, but cant change pattern or colors, "ls /sys/devices/platform/acer-wmi/" shows me "driver driver_override four_zoned_kb hwmon modalias platform-profile power predator_sense subsystem uevent" inside "four_zoned_kb" there is four_zone_mode and per_zone_mode files but any changes to them do not reflect on keyboard rgb same goes to "/sys/module/linuwu_sense/drivers/platform:acer-wmi/acer-wmi/four_zoned_kb/".

Got it, I will look into it shortly. Thanks for the detailed reply, I'll hopefully have something sometime soon.

@0x189D7997
Copy link
Copy Markdown

I may be wrong but I think the keyboard and lid logo on PHN16S-71 do not use WMI.

When changing their states from Predator Sense on Windows I could not trace any WMI calls and they do not respond to ones which are supposed to work (and do on previous models).
All other features that do work still use WMI calls. With an odd exception: power profiles still work with usual WMI calls but this is not how Predator Sense selects them now, there is no WMI activity when changing them.

This needs proper reverse engineering and I have yet to figure out the new mechanism.

@fcrespo82
Copy link
Copy Markdown

I have a PHN16-73 dual booting windows 11 and cachyos. How can I help reverse engineer the WMI calls for my system?

@0x189D7997
Copy link
Copy Markdown

@fcrespo82
Can you please share C:\ProgramData\OEM\AcerLightingService\LightingProfile\LightingProfile.ini
?

I'm trying to figure out PHN16S-71 and it's a tough one. Figured out a few interesting things things on the way so far.
This file should contain information about all the RGB devices, regardless of they are controlled by WMI, USB or EC (like I suspect on my model).

Another discovery is that you can enable logging built-in into the services by creating the following registry values:
HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AcerLightingService\Log\AcerLightingService REG_DWORD 1
HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AcerAgentService\Log\AACSvc REG_DWORD 1
HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AcerAgentService\Log\AcerAgentService REG_DWORD 1
HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AcerAgentService\Log\AcerHardwareService REG_DWORD 1
Other services such as AcerQAAgent are capable of logging too but I have not yet figured out how to enable that.

The logs are stored in these locations, some really useful information there:
C:\ProgramData\OEM\AcerLightingService\Log
C:\ProgramData\OEM\AcerAgentService\Log
C:\ProgramData\OEM\AcerService
C:\ProgramData\OEM\EZService\Log
And probably in similar locations for other services.

To explore WMI I have used WMI Explorer and WMIMon to monitor calls. Use them at your own judgement, I have not looked through the code.
And some self-written PowerShell scripts (to rough to share but I can clean them up if needed).

@fcrespo82
Copy link
Copy Markdown

I would like to have access to that scripts to help debug and add support for my laptop.

I'm open to help in anyway you can think of. I'm a developer but never did anything lower level like this, but willing to learn.

I've enabled all Logs that you have pointed in earlier message.

I've attached my LightingProfile.

It would be awesome if the driver could control the outer led logo too. Do you think it is possible?

LightingProfile.zip

I found some other files that may be of interest in "C:\Windows\System32\DriverStore\FileRepository\predatorservice.inf_amd64_c634eb8e856fb962"
RGBDevice.zip

I found some strings in the dlls mentioning OpenRGB, searching I found https://openrgb.org/
And installing it on my windows I can control all of it..
image

@0x189D7997
Copy link
Copy Markdown

It would be awesome if the driver could control the outer led logo too. Do you think it is possible?

Yes it absolutely is once we figure out the keyboard, it uses the same control mechanism.

LightingProfile.zip

Thank you very much, I will compare the this to PHN16S-73 shortly and post the results.

RGBDevice.zip

I have already seen this file, it is bundled with Predator Sense, and sadly does not include our models. Gets copied to the location you found it in on installation.

And installing it on my windows I can control all of it..

Yep, AcerLightingService ships with OpenRGB client and interfaces with it using localhost (and maybe also IPC). You can see the communication with Wireshark but nothing too interesting there (use Resource Monitor to find out the currently used port and filter by that).
I think Acer made it this way intentionally to have OpenRGB compatibility.
By the way the communication with Predator Sense UWP app is also done via localhost.

Also currently I'm working on enabling logging for all the Acer services, not just the 'agent' one. Can confirm all of them are capable of it, I will post a full list of registry values once done.
Acer Quick Access service seems to be important one doing some heavy lifting.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 24, 2026

I will compare the this to PHN16S-73 shortly and post the results.

Can confirm it is identical.

RGBDevice1=AcerHIDKeyboard Device
RGBDevice2=AcerHIDModeKeyLED Device
RGBDevice3=AcerHIDCoverLogoLED Device

This is the important part, they are internal device names.
In the Predator Sense installation zip, in PredatorSense_5.1.514/AgentService/driver/,
AcerECKeyboardController.dll and AcerECLightbarController.dll have these strings.

Edit: oops, didn't notice they are also the names in OpenRGB.
AcerLightingService.exe indeed uses them in context of communication with it.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 24, 2026

This whole change seems to be very recent. I have found references to classes named AcerHID2025 and AcerHID2025v2 in AcerQAAgent.exe.

There is also a report that RGB works via WMI on BIOS v1.02 but not v1.05 (on PHN16S-71).
Timeline checks out.

@arrayreduction if you see this, I'd like to see the
C:\ProgramData\OEM\AcerLightingService\LightingProfile\LightingProfile.ini
from your machine too, this can turn out useful.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 24, 2026

@fcrespo82

I would like to have access to that scripts to help debug and add support for my laptop.

Here's one of them, should list all of Acer's WMI classes with methods (relies on the fact they all have Version 1|2.XX string in their desctiption). If there are no methods it is likely a class for event listening:

$acermatch = 0
Get-WmiObject -List -Namespace root/WMI | ForEach-Object {
    $out1 = ""
    foreach ($q1 in $_.Qualifiers) {
        if ($q1.name.equals("Description") -and ($q1.value.contains("Version 2.") -or $q1.value.contains("Version 1."))) {
            $acermatch = 1
            $out1 += $_.__CLASS + ":" + "`n    Description: " + $q1.value
        }
        if ($acermatch -eq 1 -and $q1.name.equals("guid")) {
            $out1 += "`n    guid: " + $q1.value
        }
    }
    if ($acermatch -eq 1) {
        $acermatch = 0
        $out1 += "`n    Methods:"
        foreach ($m1 in $_.Methods) {
            $out1 += "`n        " + $m1.name + ":"
            foreach ($mq1 in $m1.Qualifiers) {
                if ($mq1.name.equals("Description")) {
                    $out1 += "`n            Description: " + $mq1.value
                }
                if ($mq1.name.equals("WmiMethodId")) {
                    $out1 += "`n            WmiMethodId: " + "0x" + $mq1.value.ToString('X2')
                }
            }
            $out1 += "`n            Inputs:"
            foreach ($mp1 in $m1.InParameters.Properties) {
                $out1 += "`n                " + $mp1.name + ": Type: " + $mp1.type + "; IsArray: " + $mp1.isArray
                foreach ($mpq1 in $mp1.Qualifiers) {
                    if ($mpq1.name.equals("ID")) {
                        $out1 += "; ID: " + "0x" + $mpq1.value.ToString('X2')
                    }
                    if ($mpq1.name.equals("MIN")) {
                        $out1 += "; MIN: " + "0x" + $mpq1.value.ToString('X4')
                    }
                    if ($mpq1.name.equals("MAX")) {
                        $out1 += "; MAX: " + "0x" + $mpq1.value.ToString('X4')
                    }
                }
            }
            $out1 += "`n            Outputs:"
            foreach ($mp2 in $m1.OutParameters.Properties) {
                $out1 += "`n                " + $mp2.name + ": Type: " + $mp2.type + "; IsArray: " + $mp2.isArray
                foreach ($mpq2 in $mp2.Qualifiers) {
                    if ($mpq2.name.equals("ID")) {
                        $out1 += "; ID: " + "0x" + $mpq2.value.ToString('X2')
                    }
                    if ($mpq2.name.equals("MIN")) {
                        $out1 += "; MIN: " + "0x" + $mpq2.value.ToString('X4')
                    }
                    if ($mpq2.name.equals("MAX")) {
                        $out1 += "; MAX: " + "0x" + $mpq2.value.ToString('X4')
                    }
                }
            }
            $out1 += "`n"
        }
        $out1 += "`n`n"
        Write-Output $out1
    }
}

Another one brute-forces methods for output values and can be really unsafe. It did not yield useful results on my machine so I don't think publishing it out and about is a good idea.

@fcrespo82
Copy link
Copy Markdown

fcrespo82 commented Jan 26, 2026

Here is my output to the script you sent.
APGeEvent:
    Description: APGe WMI Event, Version 2.94
    guid: {676AA15E-6A47-4D9F-A2CC-1E6D18D14026}
    Methods:


SecEvent:
    Description: Sec. WMI Event, Version 2.94
    guid: {A9D77EF6-55E0-4706-B139-96ACE13F2269}
    Methods:


AcerGenericEvent:
    Description: Acer Generic WMI Event, Version 2.94
    guid: {2E6B3CE2-6A58-4AF2-8767-4640CA8A38E3}
    Methods:


APGeAction:
    Description: APGe WMI Method, Version 2.94
    guid: {61EF69EA-865C-4BC3-A502-A0DEBA0CB531}
    Methods:
        SetFunction:
            Description: APGe WMI Set Devices Function, Version 2.94
            WmiMethodId: 0x01
            Inputs:
                uiInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                uiOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetFunction:
            Description: APGe WMI Get Devices Function, Version 2.94
            WmiMethodId: 0x02
            Inputs:
                uiInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                uiOutput: Type: UInt64; IsArray: False; ID: 0x01



BatteryControl:
    Description: Class used to control smart battery, Version 2.94
    guid: {79772EC5-04B1-4bfd-843C-61E7F77B6CC9}
    Methods:
        GetBattInfoInterface:
            Description: Get battery Information Interface.
            WmiMethodId: 0x13
            Inputs:
                uBatteryInfoIndex: Type: UInt32; IsArray: False; ID: 0x00
                uBatteryNo: Type: UInt32; IsArray: False; ID: 0x01
            Outputs:
                uReturn: Type: UInt32; IsArray: False; ID: 0x02

        GetBatteryHealthControlStatus:
            Description: Get Battery Health Control Status.
            WmiMethodId: 0x14
            Inputs:
                uBatteryNo: Type: UInt8; IsArray: False; ID: 0x00
                uFunctionQuery: Type: UInt8; IsArray: False; ID: 0x01
                uReserved: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x0002
            Outputs:
                uFunctionList: Type: UInt8; IsArray: False; ID: 0x03
                uFunctionStatus: Type: UInt8; IsArray: True; ID: 0x05; MAX: 0x0005
                uReturn: Type: UInt8; IsArray: True; ID: 0x04; MAX: 0x0002

        SetBatteryHealthControl:
            Description: Set Battery Health Control.
            WmiMethodId: 0x15
            Inputs:
                uBatteryNo: Type: UInt8; IsArray: False; ID: 0x00
                uFunctionMask: Type: UInt8; IsArray: False; ID: 0x01
                uFunctionStatus: Type: UInt8; IsArray: False; ID: 0x02
                uReservedIn: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0005
            Outputs:
                uReservedOut: Type: UInt16; IsArray: False; ID: 0x05
                uReturn: Type: UInt16; IsArray: False; ID: 0x04

        GetBatteryFunctionData:
            Description: Get Battery Function Data.
            WmiMethodId: 0x16
            Inputs:
                uFunctionMask: Type: UInt8; IsArray: False; ID: 0x00
                uReservedIn: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0003
            Outputs:
                uBACStartTime: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0002
                uBACStatus: Type: UInt8; IsArray: False; ID: 0x05
                uBACStopTime: Type: UInt8; IsArray: True; ID: 0x04; MAX: 0x0002
                uReservedOut: Type: UInt8; IsArray: True; ID: 0x06; MAX: 0x0009
                uReturnCode: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x0002

        SetBatteryFunctionData:
            Description: Set Battery Function Data.
            WmiMethodId: 0x17
            Inputs:
                uBACSwitch: Type: UInt8; IsArray: False; ID: 0x01
                uFunctionMask: Type: UInt8; IsArray: False; ID: 0x00
                uReservedIn: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x0006
            Outputs:
                uReservedOut: Type: UInt8; IsArray: True; ID: 0x04; MAX: 0x0002
                uReturnCode: Type: UInt16; IsArray: False; ID: 0x03



AcerGamingFunction:
    Description: Class used to Gaming Function, Version 2.94
    guid: {7A4DDFE7-5B5D-40B4-8595-4408E0CC7F56}
    Methods:
        SetGamingProfile:
            Description: Set Acer Gaming Profile Configuration.
            WmiMethodId: 0x01
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        SetGamingLED:
            Description: Set Acer Gaming LED Behavior.
            WmiMethodId: 0x02
            Inputs:
                gmInput: Type: UInt8; IsArray: True; ID: 0x00; MAX: 0x0010
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingProfile:
            Description: Get Acer Gaming Profile Configuration.
            WmiMethodId: 0x03
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        GetGamingLED:
            Description: Get Acer Gaming LED Behavior.
            WmiMethodId: 0x04
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x000F
                gmReturn: Type: UInt8; IsArray: False; ID: 0x01

        GetGamingSysInfo:
            Description: Get Acer Gaming System Information.
            WmiMethodId: 0x05
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetGamingRgbKb:
            Description: Set Acer Gaming RGB Keyboard Setting.
            WmiMethodId: 0x06
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingRgbKb:
            Description: Get Acer Gaming RGB Keyboard Setting.
            WmiMethodId: 0x07
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetGamingProfileSetting:
            Description: Set Acer Gaming Profile Setting.
            WmiMethodId: 0x08
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingProfileSetting:
            Description: Get Acer Gaming Profile Setting.
            WmiMethodId: 0x09
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetGamingLEDBehavior:
            Description: Set Acer Gaming LED Group Behavior.
            WmiMethodId: 0x0A
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingLEDBehavior:
            Description: Get Acer Gaming LED Group Behavior.
            WmiMethodId: 0x0B
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetGamingLEDColor:
            Description: Set Acer Gaming LED Group Color.
            WmiMethodId: 0x0C
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingLEDColor:
            Description: Get Acer Gaming LED Group Color.
            WmiMethodId: 0x0D
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetGamingFanBehavior:
            Description: Set Acer Gaming Fan Group Behavior.
            WmiMethodId: 0x0E
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingFanBehavior:
            Description: Get Acer Gaming Fan Group Behavior.
            WmiMethodId: 0x0F
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetGamingFanSpeed:
            Description: Set Acer Gaming Fan Group Speed.
            WmiMethodId: 0x10
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingFanSpeed:
            Description: Get Acer Gaming Fan Group Speed.
            WmiMethodId: 0x11
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetGamingFanTable:
            Description: Set Acer Gaming Fan Table.
            WmiMethodId: 0x12
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingFanTable:
            Description: Get Acer Gaming Fan Table.
            WmiMethodId: 0x13
            Inputs:
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x00

        SetGamingKBBacklight:
            Description: Set Acer Gaming Keyboard Backlight Behavior.
            WmiMethodId: 0x14
            Inputs:
                gmInput: Type: UInt8; IsArray: True; ID: 0x00; MAX: 0x0010
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingKBBacklight:
            Description: Get Acer Gaming Keyboard Backlight Behavior.
            WmiMethodId: 0x15
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x000F
                gmReturn: Type: UInt8; IsArray: False; ID: 0x01

        SetGamingMiscSetting:
            Description: Set Acer Gaming Miscellaneous Setting.
            WmiMethodId: 0x16
            Inputs:
                gmInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetGamingMiscSetting:
            Description: Get Acer Gaming Miscellaneous Setting.
            WmiMethodId: 0x17
            Inputs:
                gmInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                gmOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetCPUOverclockingProfile:
            Description: Set CPU Overclocking Profile.
            WmiMethodId: 0x18
            Inputs:
                OCProfile: Type: UInt8; IsArray: False; ID: 0x00
                OCStructure: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0200
            Outputs:
                Reserved: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0003
                ReturnCode: Type: UInt8; IsArray: False; ID: 0x02

        GetCPUOverclockingProfile:
            Description: Get CPU Overclocking Profile.
            WmiMethodId: 0x19
            Inputs:
                Reserved: Type: UInt8; IsArray: True; ID: 0x00; MAX: 0x0004
            Outputs:
                OCStructure: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0200
                ReturnCode: Type: UInt8; IsArray: False; ID: 0x01
                ReturnOCProfile: Type: UInt8; IsArray: False; ID: 0x02



DataTrans:
    Description: APGe Secure WMI Method, Version 2.94
    guid: {9F98130E-3B48-40B3-9402-DE8E160F30CC}
    Methods:
        SetBIOSSettings:
            Description: APGe WMI Set Data Function, Version 2.94
            WmiMethodId: 0x01
            Inputs:
                DataLen: Type: UInt8; IsArray: False; ID: 0x03
                EncyData: Type: UInt8; IsArray: True; ID: 0x04; MAX: 0x0080
                EncyMethod: Type: UInt8; IsArray: False; ID: 0x01
                FunctionNum: Type: UInt8; IsArray: False; ID: 0x00
                Reserved: Type: UInt8; IsArray: False; ID: 0x02
            Outputs:
                ReturnCode: Type: UInt16; IsArray: False; ID: 0x05

        GetBIOSSettings:
            Description: APGe WMI Get Data Function, Version 2.94
            WmiMethodId: 0x02
            Inputs:
                CmdLen: Type: UInt8; IsArray: False; ID: 0x03
                EncyCmd: Type: UInt8; IsArray: True; ID: 0x04; MAX: 0x0040
                EncyMethod: Type: UInt8; IsArray: False; ID: 0x01
                FunctionNum: Type: UInt8; IsArray: False; ID: 0x00
                Reserved: Type: UInt8; IsArray: False; ID: 0x02
            Outputs:
                Data: Type: UInt8; IsArray: True; ID: 0x07; MAX: 0x0080
                DataLen: Type: UInt16; IsArray: False; ID: 0x06
                ReturnCode: Type: UInt16; IsArray: False; ID: 0x05



AcerGenericMethod:
    Description: Acer Generic WMI Method, Version 2.94
    guid: {1EA0BC57-521E-461B-A7A9-5D36F141A82A}
    Methods:
        SetFunction:
            Description: Acer Generic Set Devices Function, Version 2.94
            WmiMethodId: 0x01
            Inputs:
                uiInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                uiOutput: Type: UInt32; IsArray: False; ID: 0x01

        GetFunction:
            Description: Acer Generic Get Devices Function, Version 2.94
            WmiMethodId: 0x02
            Inputs:
                uiInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                uiOutput: Type: UInt64; IsArray: False; ID: 0x01

        GetStorageInformation:
            Description: Acer Generic Get Storage Information, Version 2.94
            WmiMethodId: 0x03
            Inputs:
                Reserved: Type: UInt16; IsArray: False; ID: 0x01
                StorageID: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ModelName: Type: UInt16; IsArray: True; ID: 0x05; MAX: 0x0028
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x02
                SerialNumber: Type: UInt16; IsArray: True; ID: 0x07; MAX: 0x0028
                StorageSizeinGB: Type: UInt32; IsArray: False; ID: 0x03
                StringLengthforModelName: Type: UInt16; IsArray: False; ID: 0x04
                StringLengthforSerialNumber: Type: UInt16; IsArray: False; ID: 0x06



LongRunFunction:
    Description: Class used to Long Run, Version 2.94
    guid: {79772EC6-04B1-4bfd-843C-61E7F77B6CC9}
    Methods:
        SetLongRunPara:
            Description: Long Run Para. Pass to BIOS.
            WmiMethodId: 0x01
            Inputs:
                FunctionIndex: Type: UInt8; IsArray: False; ID: 0x00
                Period: Type: UInt8; IsArray: False; ID: 0x01
            Outputs:
                ErrorCode: Type: UInt16; IsArray: False; ID: 0x02

        SetFunctionIndex:
            Description: Long Run Para. Pass to BIOS.
            WmiMethodId: 0x02
            Inputs:
                FunctionIndex: Type: UInt8; IsArray: False; ID: 0x00
            Outputs:
                ErrorCode: Type: UInt16; IsArray: False; ID: 0x01

        SetPeriod:
            Description: Long Run Para. Pass to BIOS.
            WmiMethodId: 0x03
            Inputs:
                Period: Type: UInt8; IsArray: False; ID: 0x00
            Outputs:
                ErrorCode: Type: UInt16; IsArray: False; ID: 0x01



BIOSSetting:
    Description: Class used for BIOS settings, Version 2.94
    guid: {F75F5666-B8B3-4a5d-A91C-7488F62E5637}
    Methods:
        CheckPasswordExist:
            Description: Check password existence.
            WmiMethodId: 0x01
            Inputs:
                Command: Type: String; IsArray: False; ID: 0x00
            Outputs:
                PasswordExists: Type: UInt32; IsArray: False; ID: 0x02
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x01

        GetPowerOnPasswordStatus:
            Description: Get power on password status.
            WmiMethodId: 0x02
            Inputs:
            Outputs:
                PowerOnPasswordStatus: Type: UInt32; IsArray: False; ID: 0x01
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00

        SetPowerOnPasswordStatus:
            Description: Set power on password status.
            WmiMethodId: 0x03
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
                PowerOnPasswordStatus: Type: UInt16; IsArray: False; ID: 0x02
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        GetBootDeviceModelName:
            Description: Get boot device model name.
            WmiMethodId: 0x08
            Inputs:
                Command: Type: String; IsArray: False; ID: 0x00
                DiskNumber: Type: UInt16; IsArray: False; ID: 0x01
            Outputs:
                ModelName: Type: String; IsArray: False; ID: 0x03
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x02

        GetBootDeviceSerialNumber:
            Description: Get boot device serial number.
            WmiMethodId: 0x09
            Inputs:
                Command: Type: String; IsArray: False; ID: 0x00
                DiskNumber: Type: UInt16; IsArray: False; ID: 0x01
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x02
                SerialNum: Type: String; IsArray: False; ID: 0x03

        GetAssetTag:
            Description: Get asset tag.
            WmiMethodId: 0x0A
            Inputs:
            Outputs:
                AssetTag: Type: String; IsArray: False; ID: 0x01
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00

        SetAssetTag:
            Description: Set asset tag.
            WmiMethodId: 0x0B
            Inputs:
                AssetTag: Type: String; IsArray: False; ID: 0x02
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        LoadBIOSDefault:
            Description: Load BIOS default.
            WmiMethodId: 0x0D
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x02

        LoadUserDefault:
            Description: Load user default.
            WmiMethodId: 0x0E
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x02

        GetBootSequence:
            Description: Get boot sequence.
            WmiMethodId: 0x10
            Inputs:
            Outputs:
                BootPriority: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0010
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00

        SetBootSequence:
            Description: Set boot sequence.
            WmiMethodId: 0x11
            Inputs:
                BootPriority: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x0010
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        GetDevicePortState:
            Description: Get device and port state.
            WmiMethodId: 0x12
            Inputs:
                DeviceTypeID: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                DeviceState: Type: UInt32; IsArray: False; ID: 0x02
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x01

        SetDevicePortState:
            Description: Set device and port state.
            WmiMethodId: 0x13
            Inputs:
                DeviceState: Type: UInt32; IsArray: False; ID: 0x04
                DeviceTypeID: Type: UInt32; IsArray: False; ID: 0x03
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
                Reserved: Type: UInt16; IsArray: False; ID: 0x02
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x05

        GetUUID:
            Description: Get UUID.
            WmiMethodId: 0x14
            Inputs:
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00
                UUID: Type: String; IsArray: False; ID: 0x01

        SetUUID:
            Description: Set UUID.
            WmiMethodId: 0x15
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
                UUID: Type: String; IsArray: False; ID: 0x02
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        GetSerialNumber:
            Description: Get Serial Number.
            WmiMethodId: 0x16
            Inputs:
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00
                SerialNumber: Type: String; IsArray: False; ID: 0x01

        SetSerialNumber:
            Description: Set Serial Number.
            WmiMethodId: 0x17
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
                SerialNumber: Type: String; IsArray: False; ID: 0x02
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        GetPBAPOAStatus:
            Description: Get PBA POA status.
            WmiMethodId: 0x18
            Inputs:
            Outputs:
                PBAPOAStatus: Type: UInt32; IsArray: False; ID: 0x01
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00

        SetPBAPOAStatus:
            Description: Set PBA POA status.
            WmiMethodId: 0x19
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
                PBAPOAStatus: Type: UInt16; IsArray: False; ID: 0x02
            Outputs:
                PasswordExistence: Type: UInt32; IsArray: False; ID: 0x04
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        GetPBAPOAData:
            Description: Get PBA POA transferred data.
            WmiMethodId: 0x1A
            Inputs:
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00
                TransferredData: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0008

        SetPBAPOAData:
            Description: Set PBA POA transferred data.
            WmiMethodId: 0x1B
            Inputs:
                TransferredData: Type: UInt8; IsArray: True; ID: 0x00; MAX: 0x0008
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x01

        GetOwnershipTag:
            Description: Get Ownership Tag.
            WmiMethodId: 0x1C
            Inputs:
            Outputs:
                OwnershipTag: Type: String; IsArray: False; ID: 0x01
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00

        SetOwnershipTag:
            Description: Set Ownership Tag.
            WmiMethodId: 0x1D
            Inputs:
                OwnershipTag: Type: String; IsArray: False; ID: 0x02
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03



ListBIOSSettings:
    Description: Data for PowerShell, Version 2.94
    guid: {FDAE8C0C-6FA2-49C3-87A0-97483BE485F2}
    Methods:


S3ResumeFunction:
    Description: Class used to S3 Resume, Version 2.94
    guid: {77B0C3A7-F71D-43cb-B749-91CBFF5DDC43}
    Methods:
        GetS3ResumeTime:
            Description:  Get S3 Resume Time . Pass to BIOS.
            WmiMethodId: 0x01
            Inputs:
                DurationIndex: Type: UInt8; IsArray: False; ID: 0x00
            Outputs:
                DurationTime: Type: UInt16; IsArray: False; ID: 0x01



MethodForPowerShell:
    Description: Method for PowerShell, Version 2.94
    guid: {48E699DB-C63C-4472-9468-4B4189905D24}
    Methods:
        SetBiosSetting:
            Description: Set BIOS Setting
            WmiMethodId: 0x01
            Inputs:
                BiosItem: Type: String; IsArray: False; ID: 0x01
                BiosNewSetting: Type: String; IsArray: False; ID: 0x02
                Password: Type: String; IsArray: False; ID: 0x00
            Outputs:
                Return: Type: String; IsArray: False; ID: 0x03

        GetBiosSetting:
            Description: Get BIOS Setting
            WmiMethodId: 0x02
            Inputs:
                BiosItem: Type: String; IsArray: False; ID: 0x01
                Password: Type: String; IsArray: False; ID: 0x00
            Outputs:
                BiosCurrentSetting: Type: String; IsArray: False; ID: 0x03
                Return: Type: String; IsArray: False; ID: 0x02

        LoadBIOSDefault:
            Description: Load BIOS default
            WmiMethodId: 0x03
            Inputs:
                Password: Type: String; IsArray: False; ID: 0x00
            Outputs:
                Return: Type: String; IsArray: False; ID: 0x01

        LoadUserDefault:
            Description: Load User default
            WmiMethodId: 0x04
            Inputs:
                Password: Type: String; IsArray: False; ID: 0x00
            Outputs:
                Return: Type: String; IsArray: False; ID: 0x01



AcerBiosConfigurationTool:
    Description: Acer BIOS Setting Tool, Version 2.94
    guid: {4BB53443-488A-430D-A25C-874660E23BDD}
    Methods:
        SetBiosOptions:
            Description: Set BIOS Options
            WmiMethodId: 0x01
            Inputs:
                Data: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x0800
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        GetBiosOptions:
            Description: Get BIOS Options
            WmiMethodId: 0x02
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                Data: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0800
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x02

        SetBiosDefaultOptions:
            Description: Set BIOS Default Options
            WmiMethodId: 0x03
            Inputs:
                Data: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x0800
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        GetBiosDefaultOptions:
            Description: Get BIOS Default Options
            WmiMethodId: 0x04
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                Data: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0800
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x02

        GetUSBDeviceFilterStatus:
            Description: Get USB Device Filter Status
            WmiMethodId: 0x05
            Inputs:
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x00
                UDFStatus: Type: UInt8; IsArray: False; ID: 0x01



UtilityFunction:
    Description: Class used for utility, Version 2.94
    guid: {FE1DBBDA-3014-4856-870C-5B3A744BF341}
    Methods:
        CheckPassword:
            Description: Check user supervisor password.
            WmiMethodId: 0x01
            Inputs:
                Command: Type: String; IsArray: False; ID: 0x02
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                PasswordIsDifferent: Type: UInt32; IsArray: False; ID: 0x04
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        SetPassword:
            Description: Set user supervisor password.
            WmiMethodId: 0x02
            Inputs:
                Command: Type: String; IsArray: False; ID: 0x04
                NewPassword: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0080
                NewPasswordLen: Type: UInt16; IsArray: False; ID: 0x02
                OldPassword: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                OldPasswordLen: Type: UInt16; IsArray: False; ID: 0x00
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x05

        GetBIOSSettings:
            Description: Get BIOS settings.
            WmiMethodId: 0x03
            Inputs:
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
                SettingsIndex: Type: UInt16; IsArray: False; ID: 0x02
            Outputs:
                Data: Type: UInt8; IsArray: True; ID: 0x05; MAX: 0x0800
                DataLen: Type: UInt16; IsArray: False; ID: 0x04
                Reserved: Type: UInt8; IsArray: True; ID: 0x06; MAX: 0x0002
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        SetBIOSSettings:
            Description: Set BIOS settings.
            WmiMethodId: 0x04
            Inputs:
                Data: Type: UInt8; IsArray: True; ID: 0x04; MAX: 0x0800
                DataLen: Type: UInt16; IsArray: False; ID: 0x03
                Password: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0080
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x00
                uSettingsIndex: Type: UInt16; IsArray: False; ID: 0x02
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x05

        SetHDDPassword:
            Description: Set HDD password.
            WmiMethodId: 0x05
            Inputs:
                HDDPassword: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0010
                HDDType: Type: UInt16; IsArray: False; ID: 0x03
                Operation: Type: UInt16; IsArray: False; ID: 0x00
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x02
                Reserved: Type: UInt8; IsArray: True; ID: 0x04; MAX: 0x0018
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x05

        DockPortFirmwareProgramming:
            Description: Dock Port Firmware Programming.
            WmiMethodId: 0x06
            Inputs:
                ByteCount: Type: UInt8; IsArray: False; ID: 0x03
                DataByte: Type: UInt8; IsArray: True; ID: 0x06; MAX: 0x001E
                Operation: Type: UInt8; IsArray: False; ID: 0x00
                RomAddrH: Type: UInt8; IsArray: False; ID: 0x05
                RomAddrL: Type: UInt8; IsArray: False; ID: 0x04
                Slaveaddr: Type: UInt8; IsArray: False; ID: 0x01
                SmbusCmd: Type: UInt8; IsArray: False; ID: 0x02
            Outputs:
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x07

        SetAcerDiagnostic:
            Description: Set Acer Diagnostic Status.
            WmiMethodId: 0x07
            Inputs:
                SetCommand: Type: UInt8; IsArray: False; ID: 0x00
                SubFunc: Type: UInt8; IsArray: False; ID: 0x01
            Outputs:
                Reserved: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0003
                ReturnCode: Type: UInt8; IsArray: False; ID: 0x02

        GetAcerDiagnosticStatus:
            Description: Get Acer Diagnostic Status.
            WmiMethodId: 0x08
            Inputs:
                GetCommand: Type: UInt8; IsArray: False; ID: 0x00
                Reserved: Type: UInt8; IsArray: False; ID: 0x01
            Outputs:
                Capability: Type: UInt16; IsArray: False; ID: 0x04
                Result: Type: UInt8; IsArray: False; ID: 0x03
                ReturnCode: Type: UInt8; IsArray: False; ID: 0x02

        DeviceFWProgramming:
            Description: Device Firmware Programming.
            WmiMethodId: 0x09
            Inputs:
                Operation: Type: UInt8; IsArray: False; ID: 0x00
                ReservedIn: Type: UInt8; IsArray: False; ID: 0x01
            Outputs:
                ReservedOut: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0003
                ReturnCode: Type: UInt8; IsArray: False; ID: 0x02

        GetHDDPassword:
            Description: Get HDD password.
            WmiMethodId: 0x0A
            Inputs:
                HDDType: Type: UInt16; IsArray: False; ID: 0x01
                Operation: Type: UInt16; IsArray: False; ID: 0x00
                ReservedIn: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x001C
            Outputs:
                HDDPassword: Type: UInt8; IsArray: True; ID: 0x05; MAX: 0x0010
                PasswordLen: Type: UInt16; IsArray: False; ID: 0x06
                PWStatus: Type: UInt16; IsArray: False; ID: 0x04
                ReservedOut: Type: UInt8; IsArray: True; ID: 0x07; MAX: 0x000C
                ReturnCode: Type: UInt32; IsArray: False; ID: 0x03

        GetLedIndicatorSts:
            Description: Get LED Indicator.
            WmiMethodId: 0x0B
            Inputs:
                uiInput: Type: UInt32; IsArray: False; ID: 0x00
            Outputs:
                uiOutput: Type: UInt64; IsArray: False; ID: 0x01

        SetLedIndicator:
            Description: Set LED Indicator.
            WmiMethodId: 0x0C
            Inputs:
                uiInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                uiOutput: Type: UInt32; IsArray: False; ID: 0x01

        SetEDIDtoSystem:
            Description: Set EDID to System.
            WmiMethodId: 0x0D
            Inputs:
                EDIDData: Type: UInt8; IsArray: True; ID: 0x00; MAX: 0x0100
            Outputs:
                ReservedOut: Type: UInt8; IsArray: True; ID: 0x02; MAX: 0x0003
                ReturnCode: Type: UInt8; IsArray: False; ID: 0x01

        GetSecondDisplayDeviceStatus:
            Description: Get Second Display Device Status.
            WmiMethodId: 0x0E
            Inputs:
                ReservedIn: Type: UInt8; IsArray: True; ID: 0x00; MAX: 0x0004
            Outputs:
                DeviceStatus: Type: UInt8; IsArray: False; ID: 0x02
                ReservedOut: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0002
                ReturnCode: Type: UInt8; IsArray: False; ID: 0x01

        SetSecondDisplayDeviceStatus:
            Description: Set Second Display Device Status.
            WmiMethodId: 0x0F
            Inputs:
                DeviceStatus: Type: UInt8; IsArray: False; ID: 0x00
                ReservedIn: Type: UInt8; IsArray: True; ID: 0x01; MAX: 0x0003
            Outputs:
                ReservedOut: Type: UInt8; IsArray: True; ID: 0x03; MAX: 0x0003
                ReturnCode: Type: UInt8; IsArray: False; ID: 0x02

        NotifyWifiStatus:
            Description: Notify WiFi Status
            WmiMethodId: 0x10
            Inputs:
                uiInput: Type: UInt64; IsArray: False; ID: 0x00
            Outputs:
                uiOutput: Type: UInt32; IsArray: False; ID: 0x01

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 27, 2026

@fcrespo82
Thank you, here's the output from PHN16S-71 on BIOS v1.06 and on BIOS v1.21.

However, WMI is somewhat irrelevant now, while RGB methods still exist - they do nothing.
AcerLightingService now uses HID API to interface devices using their hardware identifiers.

Can you please run this script that will list all the devices on your machine?
The the output will be rather large so direct it to a file. I know what to look for in there, also first have a look through yourself in case there is some sensitive info, this lists all device properties:

Get-PnpDevice | ForEach-Object {
    $out1 = $_.Name + ":"
    foreach($p1 in $_.psobject.Properties) {
        if(!$p1.Name.StartsWith("Cim")) {
            $out1 += "`n    " + $p1.Name + ":"
            $out1 += " " + ($p1.Value -join "`n        ")
        }
    }
    $out1 += "`n"
    Write-Output $out1
}

@0x189D7997
Copy link
Copy Markdown

I also need SYSTEM_AcerECKeyboard_<latest>.log and SYSTEM_AcerECLightbar_<latest>.log from PHN16-73.
Located in %PROGRAMDATA%\OEM\AcerLightingService\Log\

@fcrespo82
Copy link
Copy Markdown

fcrespo82 commented Jan 28, 2026

Here is the output of the new script second.txt

I could not find the logs on %PROGRAMDATA%\OEM\AcerLightingService\Log\
I've enabled the setting in the registry but it did not generated any logs
image

My BIOS version is 1.21

After some thinkering I found that the %PROGRAMDATA%\OEM\AcerAgentService\Log\SISTEMA_AcerAgentService.log had some logged calls for the SetDeviceLightingMode function.
SISTEMA_AcerAgentService.log

Maybe this one have something interesting too.
SISTEMA_AcerHardwareService.log

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 28, 2026

@fcrespo82
With your help I figured out which device is used to control rgb, using I2C bus:
On both laptops it is
HID\VID_0CF2&UP:FF5A_U:0001
Referencing
HID\ENEK5130\5&7108364&0&0000 on PHN16S-71
HID\ENEK5130\5&22D8E1B6&0&0000 on PHN16-73
Which points to
ACPI\ENEK5130\4&E8E96F2&0 (PHN16S-71)
ACPI\ENEK5130\4&1071AAD7&0 (PHN16-73)
Both are also referenced as ACPI\PNP0C50
On PHN16S-71 it is located on I2C1:0x50, and I assume the same for your model. To confirm I'd need to look at your DSDT but I don't think it is necessary.

I have used asl.exe from EWDK (19 GB download) to dump mine but there is probably a better way.

Located in <EWDK>\Program Files\Windows Kits\10\Tools\10.0.26100.0\x64\ACPIVerify
Run asl.exe /tab=DSDT /a
It will create DSDT.ASL in the current folder so don't run it directly from read-only ISO.

Now I need to locate it under Linux and figure out the exact data to send. i2c-tools can help with that, should be available on your distro. However, be very careful with this tool, it can corrupt firmware on some chips if used incorrectly.

@0x189D7997
Copy link
Copy Markdown

I've enabled the setting in the registry but it did not generated any logs

It looks to me there is a space after AcerLightingService which should not be there. If I'm mistaken this is very odd, this registry key should enable logging no matter what.

My BIOS version is the same but this also should not matter.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 29, 2026

Here's the data structure but it might be wrapped in something, I have not tried sending it yet:

10 bytes (in hex):

21 (keyboard) | 83 (back logo) | 65 (power profile button)
02 (static) | 04 (breathing) | 05 (neon) | 06 (power profile change/?) | 07 (wave) | 08 (ripple) | 09 (zoom) | 0A (snake) | 0B (disco) | ?? (direct) | ?? (opmode) | ?? (shifting) | ?? (meteor) | ?? (twinkling) - mode
00 (off) | 19 (=0d25) | 32 (=0d50) | 4B (=0d75) | 64 (=0d100) - brightness
00 | 01 | 03 | 05 | 07 | 09 - speed
00 | 01 (->) | 02 (<-) - direction
RR
GG
BB
00 (logo/button) | 01 (left most) | 02 | 04 | 08 | 0F (all?) (keyboard) - zone
00 - ?

It can actually be found in the log discussed above, I'd appreciate any ideas on unknown/skipped values and what the unused mode values do.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 29, 2026

Here are all rgb device ids present in code, is useful for other models:

0x21 - 4 zone keyboard
0x22 - front lightbar
0x23 - left lightbar
0x24 - right lightbar
0x25 - rear lightbar
0x64 - turbo button
0x65 - mode (power profile) button
0x83 - cover (back) logo
0x84 - base (front?) logo

If there is no exact match it will use generic device name (lighbar, logo, ...) as a fallback.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 29, 2026

Another funny thing - custom boot logo never worked for me from Predator Sense.
I decided to look what it is actually trying to do and it is as simple as placing an image named
AcerLogo.jpg or AcerLogo.gif into boot/efi/EFI/OEM/ (or wherever your EFI partition is).
And viola - it works!
Can be on any of the two drives.
Boot animation setting in BIOS has to be enabled, sound does not have to be.

Not sure thoougt what will happen if you place an incompatible/huge image there... Worst case scenario - disassembling laptop to remove the file from NVMe drive manually.
Also boot sound... I wonder if custom sound might be a thing? Need to reverse engineer the BIOS itself for that though.. I did not see it mentioned in Predator Sense.

@ZoeBattleSand
Copy link
Copy Markdown

I have done a little bit of work on this and have created a simple C++ program which can control RGB. It works on my PHN16S-71 with BIOS v1.21.

It uses hidraw, so all it really does is write the structure figured by 0x189D7997 to /dev/hidrawX (additonally, I have figured out that 0xFF is the mode for shifting, but I'm unsure of the rest.)

Here's the data structure but it might be wrapped in something, I have not tried sending it yet:

10 bytes (in hex):

21 (keyboard) | 83 (back logo) | 65 (power profile button)
02 (static) | 04 (breathing) | 05 (neon) | 06 (power profile change/?) | 07 (wave) | 08 (ripple) | 09 (zoom) | 0A (snake) | 0B (disco) | ?? (direct) | ?? (opmode) | ?? (shifting) | ?? (meteor) | ?? (twinkling) - mode
00 (off) | 19 (=0d25) | 32 (=0d50) | 4B (=0d75) | 64 (=0d100) - brightness
00 | 01 | 03 | 05 | 07 | 09 - speed
00 | 01 (->) | 02 (<-) - direction
RR
GG
BB
00 (logo/button) | 01 (left most) | 02 | 04 | 08 | 0F (all?) (keyboard) - zone
00 - ?

It can actually be found in the log discussed above, I'd appreciate any ideas on unknown/skipped values and what the unused mode values do.

However, you must add 0xA4 at the beginning (PredatorSense also has a function with 0xA2, but I haven't looked into what that does.)

This program is just to show how it is done, and isn't good code but it works. By default it uses /dev/hidraw2, but it might be different for you so you can put the correct hidraw file as an argument to the program (./rgb /dev/hidrawX) and the correct file should show the device name when running the program as something like "ENEK5130:00 0CF2:5130"

The program is here (compile with "clang++ -std=c++23 ./rgb.cpp -o ./rgb" or "g++ -std=c++23 ./rgb.cpp -o ./rgb") It seems to work fine on my laptop, so it should be fine? Let me know if it works.

@fcrespo82
Copy link
Copy Markdown

Just tested the program and it works... 🎉 Thanks a lot for putting the effort in making this!!!!

I know it still has a lot to do before it comes to the linux module, but it is awesome to have it working.

I wish I was able to do that...

@0x189D7997
Copy link
Copy Markdown

@ZoeBattleSand Wooow, amazing work!
I already saw that i2c:1:50 was already used by something under Linux and was confused by that. To figure out it was hidraw and that it can actually be used would have taken me ages if I ever did.

However, you must add 0xA4 at the beginning

Oops, missed this one because it is defined in a different place, me dumb.

PredatorSense also has a function with 0xA2, but I haven't looked into what that does.

acer::KYD100::Lighting::LightingHID::GetLightingDeviceBaseInfo
I assume it is either to check which rgb features the device supports or its current state (less likely).
Used in CreateAcerHIDKeyboardControllerClassInstance() but I may have named it like that myself. Anyways, it's a good description of what it does.

If you know what KYD100 stands for I'm really curious. It is not exclusive to the keyboard.

Let me know if it works.

It does! Again, amazing job, I'm very impressed!

Now we need to figure out the power profile switching and the button for that. WMI still works for switching but not the button. However Predator Sense no longer uses WMI for switching either.
Should be either in AcerQAAgent.exe or AcerHardwareService .exe.

Here are my very old notes on which services are required for what:

Acer Agent Service             (AcerCentralService.exe)       - set fan speed (via WMI), needed for rgb, get backlight and logo brightness, backlight timeout, boot logo
Acer Care Center               (AcerCCAgent.exe)              - battery care, ac adapter detection
Acer Lighting Service          (AcerLightingService.exe)      - rgb backlight and logo, set backlight and logo brightness
Acer Quick Access              (AcerQAAgent.exe)              - performance mode (NOT WMI!), performance button, usb charging, bluelight shield
Acer System Monitior Service   (AcerSystemCentralService.exe) - get fan speed, sense button
Acer Device Enabling Sevice V2 (ADESv2Svc.exe)                - nothing, i really dislike what this one is doing

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 30, 2026

AcerQAAgent.exe

Actually I'd really appreciate help with enabling logging for this one. It is done via registry too but using a different mechanism and my disassembler fd up so I have trouble determining the exact key:value needed.
Should be something under HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AcerQAAgent\LogLevel

@0x189D7997
Copy link
Copy Markdown

I know it still has a lot to do before it comes to the linux module, but it is awesome to have it working.

I'll try my best, no experience with this but it's never too late.

@ZoeBattleSand
Copy link
Copy Markdown

ZoeBattleSand commented Jan 30, 2026

I wonder if this might need a new project. Since we can use hidraw, we can do everything from userspace, and the kernel module seems to deal with WMI which means the new hid api stuff doesn't make sense here. I think we could make a PredatorSense like application for linux instead? At least that's what I'm gathering from the RGB, but the power profiles might be different.

Additionally, have you figured out a way to get events from the turbo/power profile button? I can't see a way to get any from my quick experimenting. I'll keep looking into it and share any findings.

Great to see the program working! It wouldn't have been possible without all of your research.

@0x189D7997
Copy link
Copy Markdown

Connecting the DC charger produces following sequence on A0:

00 01 00
01 01 FF
03 00 FF

DC Disconnecting (from laptop):

00 00 00
00 00 00
01 00 FF
03 01 FF

DC Disconnecting (charger from outlet, different behavior likely caused by gradually decreasing voltage):

00 01 00
01 00 FF
03 01 FF
00 00 00

USB-C charger:

00 04 00
00 04 00
00 04 00

USB-C charger disconnecting (does not matter how):

00 04 00
00 00 00
00 00 00

The remaining bytes are always padded with FF.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Jan 31, 2026

I am planning on writing a nicer program supporting both RGB and power profiles

I think support for USB rgb devices would be an important feature too, so we should figure this out too beforehand. Currently waiting on a response from owner of PH18-73 in #81, should resolve a lot of unknowns.
If you need any help with the program feel free to ask me to code something specific, got myself familiar enough with original version.

@ZoeBattleSand
Copy link
Copy Markdown

I am still trying to figure out how to set the power profile (since I don't have a windows install, and therefore cannot look at what PredatorSense is sending, it is proving quite the challenge), but in my attempts I did figure out how to enable the keyboard lighting timeout. (not sure if this has already been figured out, but hopefully this info is useful)

It uses feature id 0xA0 on device 1025174B (this is the same feature id and device used in the charger stuff)

The sequence is 0xA0 0x0 0xA0 0x0A 0x0 0x01 0x02 0x01 0x0 0x64 0x00 0x${TIMEOUT_VALUE_IN_SECONDS} with the rest being padding. That last value is the actual seconds, which can be any value. Setting it to 0 disables it. (it seems that PredatorSense only sets it to 30, but maybe I'm wrong)

This comes from treadstone::TsClientCommandProcessor::hid_set_keyborad_backlight30s() (not a typo!) and acer::KYD100::EcHID::SetDeviceStatus() (look, KYD100 again!) in AcerHardwareService.exe

Here is a testing script (use the same as the other ones)

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Feb 1, 2026

@ZoeBattleSand amazing work again! Doing this without running PS is a next-level impossible challenge and you're crushing it!
I was busy figuring out s2idle from #81, sorry for not contributing today. Made some progress, see my latest comment there. Here's the binary of the driver I mentioned intelpep.zip. There is be a bounty proposed if it is figured out before deadline. And even if I do, I will not take it, but maybe you'd want to?

I believe treadstone is an internal name for IPC protocol Acer uses. Still no ideas on KYD100 (except maybe for "Kill Your Device 100%", a real funny name for something that interacts with firmware ;)
Also there are a LOT of typos, don't be surprised. In registry keys and service's display names included.

I will play around with the timeout, custom values are really interesting, in PS it either off or on (30 seconds) (if I am not mistaken previously it was just a boolean BIOS setting).
Thank you for the script!

@0x189D7997
Copy link
Copy Markdown

I am still trying to figure out how to set the power profile

Look for
i3d::AcerHID2025::SetTargetSystemUsageMode
in AcerQAAgent/AcerQAAgent.exe

Also i3d::AcerHID2025::SetBatteryBoundary?? Does this imply that battery limit can be set to any value and not just 80%?

I3D Technology Inc. is a name of a company which likely developed AcerQAAgent and AcerCCAgent. Other services are written in different style and do not reference I3D.

These services also include a lot of useful debug info like actual method signatures.

@ZoeBattleSand
Copy link
Copy Markdown

ZoeBattleSand commented Feb 1, 2026

I was busy figuring out s2idle from #81

I will look into it as well, though it seems you are making good progress. It would be great if we can get a solution for sleep not working correctly.

Look for
i3d::AcerHID2025::SetTargetSystemUsageMode
in AcerQAAgent/AcerQAAgent.exe

Maybe I'm going crazy, but it seems sending the hid features in this does something with the fans. I'll keep looking into it. When setting the power profile in PredatorSense, does the keyboard flash like it does when setting it using WMI in linux?

Also i3d::AcerHID2025::SetBatteryBoundary?? Does this imply that battery limit can be set to any value and not just 80%?

Yes! You can set a custom upper and lower charging limit. The sequence is:

0xA0
0x00
0xA0
0x03
0x0B
0x01
0x03
status (0x00 to disable limit, 0x01 to enable)
upper_limit (eg 0x46 for 70% max)
lower_limit (eg 0x41 for 65% minimum)

As usual, a script for testing

Edit: to clarify, here is the behavior I have seen: (note that this might be different with a USB-C charger)
If you plug the laptop in when the current battery percentage is between the limits, it will just remain there (eg if the limits are 80% and 70%, and you plug it in at 75%, it will remain at 75%)
If it is below the lower limit, it will charge up to the upper limit.
If it is above the upper limit, it will just remain at whatever percent it is at.

@0x189D7997
Copy link
Copy Markdown

When setting the power profile in PredatorSense, does the keyboard flash like it does when setting it using WMI in linux?

Yes, however the signal to flash (effect 06) is sent to the mode button, keyboard and logo explicitly. Stopping AcerLightingService stops the flashing but mode change still occurs, confirmed by change of CPU dynamic PL1 (Eco = 45W, Quiet = 55W, Normal = 65W, Performance = 75W, Turbo = 85W). Many other settings probably change too, I did not look at them.
To eliminate doubt entirely, i3d::AcerHID2025::GetCurrentSystemUsageMode can be used.
Here are the colors allowed in effect 06 as promised:
Eco: #10DC00
Quiet: #FFFFFF
Normal: #00AEC7
Performance: #2E09C7
Turbo: #C700FF
Might be more for some unused modes, did not check for that yet.
There are more modes for different laptops, such as Silent, Default, Extreme, Quite (not typo), Eco+ and Custom(!). Worth trying to apply to our laptops too? Eco+ with an ultra-low power limit would be really nice.
Silent, Default and Extreme may be aliases to Quiet, Normal and Performance.
There is a large JSON structure describing them at address 1405395b1
I assume which ones are available is checked with i3d::AcerHID2025::GetSystemUsageModeCapability

Nvidia 'Whisper' mode seems to be applied separately with i3d::AcerHID2025::SetWhisperMode
And OC at an OS level via NvAPI, see

i3d::`anonymous-namespace'::NvidiaGPUSetOverclock
i3d::AQAAgentSvis::ApplyNVOverclocking

I think we can replicate that on Linux too.

Maybe I'm going crazy, but it seems sending the hid features in this does something with the fans.

It absolutely does in when doing that with Predator Sense. To my eye Performance and Turbo seem to have a more aggressive auto fan profile. Or maybe this is done for a 'rev up' effect.
Also there is i3d::AcerWMI::GetSwitchFanTableCurrentStatus and i3d::AcerWMI::SetFanControl.

If it is below the lower limit, it will charge up to the upper limit.

Lower limit?? I've only seen this tech on f-ing solar power stations. This may be the best discovery so far. I'm gonna test it with more values. Amazing progress!

AcerQAAgent is a platinum mine, worth looking at every single method there.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Feb 2, 2026

Actually your question about keyboard flashing tells me you figured this one out already too :)

worth looking at every single method there

Especially i3d::AcerWMI::SetUSBChargingStatus (charging connected devices when laptop is powered off). Yes it is still done via WMI (APGeAction::SetFunction) and I think Linuwu Sense supports it already but maybe there is something new to discover.
This feature is responsible for draining my laptop from 100% to 0% in (probably) less then a month.
When I disabled it battery stayed at 100% untouched for more that a month.
Ye, I didn't use the fancy new laptop for several months for reasons.

@ZoeBattleSand
Copy link
Copy Markdown

ZoeBattleSand commented Feb 2, 2026

Here are my findings from i3d::AcerHID2025::SetTargetSystemUsageMode
Note that this is just what I'm seeing so the info may not be correct.

The sequence is 0xA0 0x00 0xA0 0x01 0x00 0x01 0x{USAGE_MODE}

I'm not sure exactly what the actual modes are, as the ones in the JSON you mentioned don't seem to match. From what I can tell based on CPU power draw they are as follows:

0x00 = turbo
0x01 = performance
0x02 = normal
0x03 = quiet (or maybe eco?)
0x04 = also either eco or quiet
0x05 = possibly eco+? cpu power is limited to 10-15 watts and seemingly locked to 400-800MHz (not a pleasant experience)

You are right, the RGB doesn't flash on its own doing it this way, so I guess it has to be manually implemented.

Doing it this way does not update /sys/firmware/acpi/platform_profile

Again, I have no idea how correct this information is. I am going to keep seeing what I can find. I'll look into i3d::AcerHID2025::GetCurrentSystemUsageMode

edit: here is a script

@0x189D7997
Copy link
Copy Markdown

Doing it this way does not update /sys/firmware/acpi/platform_profile

And WMI does? Odd, I will look into this. I assume /sys/firmware/acpi/pm_profile is the same thing on a different distro?

i3d::AcerHID2025::GetSystemUsageModeLimit is what I assume is responsible for deciding which profiles are available (depending on charging state and level, checked by firmware?).
Is there any hardware reason to actually limit available modes?

@ZoeBattleSand
Copy link
Copy Markdown

And WMI does? Odd, I will look into this. I assume /sys/firmware/acpi/pm_profile is the same thing on a different distro?

No, if you load acer_wmi with predator_v4=1 you can change the platform profile with /sys/firmware/acpi/platform_profile. However pm_profile also doesn't change.

@0x189D7997
Copy link
Copy Markdown

Give me an hour so I can boot Linux on PHN16S-71, got confused because there is no platform_profile on a Swift laptop running stock acer_wmi.

@0x189D7997
Copy link
Copy Markdown

No, if you load acer_wmi with predator_v4=1

Actually this makes me think platform_profile is a creation of acer_wmi and indeed should not change unless it does the changing itself.
Skipped the homework on how this actually works.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Feb 2, 2026

Try invoking acer_predator_v4_platform_profile_get and see if that actually updates /sys/firmware/acpi/platform_profile after you changed it with HID report.

I.e. Set the profile with HID, query (get) with WMI.

@ZoeBattleSand
Copy link
Copy Markdown

WMI always reports the profile last set with WMI. Setting it with HID makes no difference. There is definitely something missing here.

Try invoking acer_predator_v4_platform_profile_get and see if that actually updates /sys/firmware/acpi/platform_profile after you changed it with HID report.

It is called everytime /sys/firmware/acpi/platform_profile is read, so I would think if the profile changed so would it.

I think we should get the output of i3d::AcerHID2025::GetCurrentSystemUsageMode to see what that says.

There is definitely something changing, but I'm not sure if everything is being changed.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Feb 2, 2026

I think we should get the output of i3d::AcerHID2025::GetCurrentSystemUsageMode to see what that says.

Should be A0 00 A0 01 00 02 00 00 00

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Feb 2, 2026

Here are the HID2025 methods I've looked at:

GetOCProfileTable            : A0 00 A0 02 00 02 {profile}
GetOCProfileCapability       : A0 00 A0 00 00 04 00 00 00
SetBatteryBoundary           : A0 00 A0 03 11 01 03 {status} {upper} {lower}
GetBatteryBoundary           : A0 00 A0 03 11 02 00 00
GetBatteryInformation        : A0 00 A0 00 11 02 00 00
GetOCProfile                 : uses GetOCProfileTable
SetWhisperMode               : A0 00 A0 02 00 01 {profile}
GetWhisperMode               : uses GetOCProfileTable
SetAppStatus(bool)           : A0 00 A0 00 00 01 00 00|01
SetTargetSystemUsageMode     : A0 00 A0 01 00 01 {mode} 00 00
GetCurrentSystemUsageMode    : A0 00 A0 01 00 02 00 00 00
GetPDAdaptorCapability       : A0 00 A0 00 00 07 00 00 00
GetSystemUsageModeLimit      : A0 00 A0 00 00 06 00 00 00
GetSystemUsageModeCapability : A0 00 A0 00 00 05 00 00 00
GetACStatus                  : A0 00 A0 00 00 03 00 00 00
GetBatteryBoostStatus        : A0 00 A0 00 00 02 00 00 00

In AcerHIDArm but maybe works on x86 too?:
InternalGetHIDSpecVersion    : A0 00 A0 00 00 00
SetFanControlStatus          : A0 00 A0 04 00 01 00 00
GetFanControlStatus          : A0 00 A0 04 00 02 00 00 02
GetSwitchFanTableCapability  : A0 00 A0 04 00 02 00 00 00
GetACStatus                  : A0 00 A0 00 00 03

There may be inaccuracies and more methods likely exist, I'll try to fill in the question marks later.

Wonder what A0 00 A0 00 00 01 00 00 00 (SetAppStatus) does...

Sorted by binary to avoid confusion:

InternalGetHIDSpecVersion    : A0 00 A0 00 00 00
SetAppStatus(bool)           : A0 00 A0 00 00 01 00 00|01
GetBatteryBoostStatus        : A0 00 A0 00 00 02 00 00 00
GetACStatus                  : A0 00 A0 00 00 03 00 00 00
GetOCProfileCapability       : A0 00 A0 00 00 04 00 00 00
GetSystemUsageModeCapability : A0 00 A0 00 00 05 00 00 00
GetSystemUsageModeLimit      : A0 00 A0 00 00 06 00 00 00
GetPDAdaptorCapability       : A0 00 A0 00 00 07 00 00 00
GetBatteryInformation        : A0 00 A0 00 11 02 00 00
SetTargetSystemUsageMode     : A0 00 A0 01 00 01 {mode} 00 00
GetCurrentSystemUsageMode    : A0 00 A0 01 00 02 00 00 00
SetWhisperMode               : A0 00 A0 02 00 01 {profile}
GetOCProfileTable            : A0 00 A0 02 00 02 {profile}
SetBatteryBoundary           : A0 00 A0 03 11 01 03 {status} {upper} {lower}
GetBatteryBoundary           : A0 00 A0 03 11 02 00 00
SetFanControlStatus          : A0 00 A0 04 00 01 00 00
GetSwitchFanTableCapability  : A0 00 A0 04 00 02 00 00 00
GetFanControlStatus          : A0 00 A0 04 00 02 00 00 02

Edit: I see no more references to HID reports in both AcerQAAgent and AcerCCAgent. Maybe this is all?

@0x189D7997
Copy link
Copy Markdown

Seems like 4th byte is a category:
00 - query generic or fixed information
01 - usage mode
02 - OC
03 - battery boundary
04 - fan control (exclusive to ARM?)

@0x189D7997
Copy link
Copy Markdown

I still need to figure out logging to see exactly which methods Predator Sense calls on mode change.

If you want to help feel free to look at i3d::InitEasylogging

@0x189D7997
Copy link
Copy Markdown

Figured out logging, I was looking the the wrong place:

HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AcerQAAgent\LogLevel REG_DWORD 9
HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AQAUserPS\LogLevel   REG_DWORD 9
HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AcerCCAgent\LogLevel REG_DWORD 9
HKEY_LOCAL_MACHINE\SOFTWARE\OEM\ACCUserPS\LogLevel   REG_DWORD 9
HKEY_LOCAL_MACHINE\SOFTWARE\OEM\AcerDIAgent\LogLevel REG_DWORD 9

Located in:

%WINDIR%\Temp\QuickAccess\AcerQAAgent.log
%TEMP%\QuickAccess\AQAUserPS.log
%WINDIR%\Temp\CareCenter\AcerCCAgent.log
%TEMP%\QuickAccess\ACCUserPS.log
%WINDIR%\Temp\DeviceInfo\AcerDIAgent.log

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Feb 5, 2026

@ZoeBattleSand mode change done by Predator Sense is just
i3d::AcerHID2025::SetTargetSystemUsageMode followed by
i3d::AQAAgentSvis::ApplyNVOverclocking

ApplyNVOverclocking logs its parameters and for Turbo it is

ENG CLK (MHz) : 100
VRAM CLK (MHz): 200

and

ENG CLK (MHz) : 0
VRAM CLK (MHz): 0

for all other modes meaning no OC.

Mode ids from log, confirms your observation:

i3d::`anonymous-namespace'::LogHIDUsageModeTable() supported system usage modes:

Mode: 5 (Eco mode)
HID : 4

Mode: 2 (Quiet mode)
HID : 3

Mode: 0 (Normal mode)
HID : 2

Mode: 3 (Performance mode)
HID : 1

Mode: 4 (Turbo mode)
HID : 0

@ZoeBattleSand
Copy link
Copy Markdown

i3d::AcerHID2025::SetTargetSystemUsageMode followed by
i3d::AQAAgentSvis::ApplyNVOverclocking

Hmm, if that's it then I wonder why WMI doesn't update.

Mode ids from log, confirms your observation:

That's good, although I still wonder about mode 0x05, it might be a hidden eco+?

I am working on a new project similar to the one made by fcrespo82, but adding all the newly discovered non-rgb features like battery charge limiting and the keyboard backlight timeout (and some other enhancements.) I'll create a repo in the coming days. I know you want to get USB RGB working as well, so that's something we can work on once this is done.

Also, have you gotten any closer to figuring out s2idle? I might try to install windows and do some work myself because it is really starting to annoy me.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Feb 6, 2026

@ZoeBattleSand

Hmm, if that's it then I wonder why WMI doesn't update.

I am looking into that, will share the results if anything comes up. Needs custom kernel level logic so that will take some time.

That's good, although I still wonder about mode 0x05, it might be a hidden eco+?

I was going to look into this too, ideally figure out the color for it.

I know you want to get USB RGB working as well, so that's something we can work on once this is done.

Yep, and we have some data now, might even be enough for full support.

Also, have you gotten any closer to figuring out s2idle?

Yes, this is an Intel issue, observed on Acer, Lenovo and Framework running Arrow Lake-HX and and Meteor Lake-H (very likely many others).
I'd appreciate any info on ARL/MTL-U because I know s2idle works correctly on RPL-U (yes the one that destroys itself and is actually the reason I had to change my laptop).

Currently I'm understanding kernel code responsible for this (drivers/platform/x86/intel/pmc) and there are a lot of things which can go wrong, especially with s0ix.
How familiar are you with the kernel? Because I am not and learning (which is what I am actively doing) is the main reason slowing me down.

I might try to install windows and do some work myself

I don't think there is a need to because we already know the exact driver responsible for proper sleep (intelpep.sys, shared above). It is not too large and decompiles very nicely. If you're going to look at it - I'm really interested what EnableArrowLakeAccounting/EnableMeteorLakeAccounting does.

@0x189D7997
Copy link
Copy Markdown

0x189D7997 commented Feb 6, 2026

Also if you need anything specific from Windows - I'm ready to do whatever is needed and provide info/files. Worth avoiding at all costs.

If you connect it to the internet, Update will automatically install ADESv2 (mentioned way above) which I suspect is a telemetry service (to hola.acer.com) running on ring 0 which might be capable of flashing something. Eww.
AcerDIAgent is a telemetry service too.

When done with all the actually useful stuff I will look into what they do.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants