I'm having trouble enabling the battery status. I already installed Kext ACPIBatteryManager and tried to apply a ready-made RehabMan patch for Dell models, the patch compiles without errors but does not correct the problem.
The percentage is stuck at 99% and the icon is as if it were charging, Can someone help me?
My laptop is a Dell Inspiron 14 Series, model i14-5458
Recently I had been looking for ways to control the battery charging on my hackintosh which is a Thinkpad T460 with dual batteries. On Windows there's a program Lenovo Vantage that lets you set the Battery Charging Start and Stop Thresholds. These thresholds continue to apply even when the laptop is turned off as these thresholds are managed by the embedded controller, so from that perspective its a set once and forget.
But there was one more thing that was frustrating me. By default Lenovo uses the external battery first and once its almost drained (less than 5%), it switches to the internal battery.
Although the Charging Start and Stop Limits are a good way to increase the life span of Lithium batteries (by lowering the max charge limit), the complete drainage of the external battery prior to switching to internal is not a good idea.
Fortunately Lenovo EC provide options to force drain (use) a battery (even with the ac adapter connected) thereby allowing to manually switch to the internal one, however these are manual controls. In Linux, there's a program tpacpi-bat that runs as a daemon and performs an efficient management of the dual batteries such as switching to internal battery when the external one reaches a configurable lower limit. However, this is Linux only and uses the ACPI interface.
I did some research to understand my options in macOS. I found RehabMan's ACPIDebug.kext and its ability (using another RehabMan's tool ioio) to call a function defined in the DSDT. With information collected tpacpi-bat and ACPIDebug.kext, I have created a dirty version.
So this is how you use it...
1. Use the attached SSDT-RMDT. As this was just a rough work to validate my understanding, I just did a hard coding for the first battery.
2. Install ACPIDebug.kext
3. After the reboot, you can trigger the following battery operations...
a. Set Battery Charge Start Threshold
ioio -s org_rehabman_ACPIDebug dbg1 <start-percent>
a. Set Battery Charge Stop Threshold
ioio -s org_rehabman_ACPIDebug dbg2 <stop-percent>
a. Force Discharge
ioio -s org_rehabman_ACPIDebug dbg3 <0|1> //0 to disable, 1 to enable
a. Inhibit battery charging for specified number of minutes
ioio -s org_rehabman_ACPIDebug dbg4 <minutes> //0 to disable
a. View Battery Info
ioio -s org_rehabman_ACPIDebug dbg5 <anything> //pass anything, its ignored
a. View Battery Charge Start/Stop Thresholds
ioio -s org_rehabman_ACPIDebug dbg0 <anything> //pass anything, its ignored
At this time, I just hard-coded for the BAT0 to quickly validate my understanding and its working well.
What's next? As I understand (and please correct me if I'm wrong), I can't return values with ACPIDebug.kext along with ioio, plus this is also all very hacky.
To be able to create a program that reads the current remaining capacity (percent) and switches control to internal batter, I need a way to return this info. Currently I'm just outputting it to the logs.
My thinking is to modify ACPIDebug.kext or one of these other kexts (ACPISensors.kext) to add code for above and then create a program to optimally manage the operation of my two batteries.
However, I'm very new to all of this and will take some time.
In the meanwhile, here is it for your playing pleasures. Please be aware that my SSDT-RMDT is currently hard-coded for BAT0 and doesn't have all the validations.
Credits to RehabMan, tpacpi-bat, and other resources on internet.