mirror of
https://github.com/actuallymentor/battery.git
synced 2026-02-03 14:03:24 +00:00
Style Fix
This commit is contained in:
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -10,7 +10,7 @@
|
|||||||
"typescriptreact"
|
"typescriptreact"
|
||||||
],
|
],
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll.eslint": true
|
"source.fixAll.eslint": "explicit"
|
||||||
},
|
},
|
||||||
"editor.renderWhitespace": "all",
|
"editor.renderWhitespace": "all",
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
|
|||||||
BIN
app/.DS_Store
vendored
Normal file
BIN
app/.DS_Store
vendored
Normal file
Binary file not shown.
168
battery.sh
168
battery.sh
@@ -67,7 +67,7 @@ Usage:
|
|||||||
eg: battery adapter off
|
eg: battery adapter off
|
||||||
|
|
||||||
battery calibrate
|
battery calibrate
|
||||||
calibrate the battery by discharding it to 15%, then recharging it to 100%, and keeping it there for 1 hour
|
calibrate the battery by discharging it to 15%, then recharging it to 100%, and keeping it there for 1 hour
|
||||||
|
|
||||||
battery charge LEVEL[1-100]
|
battery charge LEVEL[1-100]
|
||||||
charge the battery to a certain percentage, and disable charging when that percentage is reached
|
charge the battery to a certain percentage, and disable charging when that percentage is reached
|
||||||
@@ -101,11 +101,17 @@ Cmnd_Alias BATTERYON = $binfolder/smc -k CH0B -w 00, $binfolder/smc -k CH0C
|
|||||||
Cmnd_Alias DISCHARGEOFF = $binfolder/smc -k CH0I -w 00, $binfolder/smc -k CH0I -r
|
Cmnd_Alias DISCHARGEOFF = $binfolder/smc -k CH0I -w 00, $binfolder/smc -k CH0I -r
|
||||||
Cmnd_Alias DISCHARGEON = $binfolder/smc -k CH0I -w 01
|
Cmnd_Alias DISCHARGEON = $binfolder/smc -k CH0I -w 01
|
||||||
Cmnd_Alias LEDCONTROL = $binfolder/smc -k ACLC -w 04, $binfolder/smc -k ACLC -w 03, $binfolder/smc -k ACLC -w 00, $binfolder/smc -k ACLC -r
|
Cmnd_Alias LEDCONTROL = $binfolder/smc -k ACLC -w 04, $binfolder/smc -k ACLC -w 03, $binfolder/smc -k ACLC -w 00, $binfolder/smc -k ACLC -r
|
||||||
|
Cmnd_Alias NATIVELIMITOFF = $binfolder/smc -k CHWA -w 00
|
||||||
|
Cmnd_Alias NATIVELIMITON = $binfolder/smc -k CHWA -w 01
|
||||||
|
Cmnd_Alias NATIVELIMITREAD = $binfolder/smc -k CHWA -r
|
||||||
ALL ALL = NOPASSWD: BATTERYOFF
|
ALL ALL = NOPASSWD: BATTERYOFF
|
||||||
ALL ALL = NOPASSWD: BATTERYON
|
ALL ALL = NOPASSWD: BATTERYON
|
||||||
ALL ALL = NOPASSWD: DISCHARGEOFF
|
ALL ALL = NOPASSWD: DISCHARGEOFF
|
||||||
ALL ALL = NOPASSWD: DISCHARGEON
|
ALL ALL = NOPASSWD: DISCHARGEON
|
||||||
ALL ALL = NOPASSWD: LEDCONTROL
|
ALL ALL = NOPASSWD: LEDCONTROL
|
||||||
|
ALL ALL = NOPASSWD: NATIVELIMITOFF
|
||||||
|
ALL ALL = NOPASSWD: NATIVELIMITON
|
||||||
|
ALL ALL = NOPASSWD: NATIVELIMITREAD
|
||||||
"
|
"
|
||||||
|
|
||||||
# Get parameters
|
# Get parameters
|
||||||
@@ -176,6 +182,77 @@ function disable_charging() {
|
|||||||
sudo smc -k CH0C -w 02
|
sudo smc -k CH0C -w 02
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Apple Silicon laptops with firmware > 13.0 have a native charge threshold that
|
||||||
|
# does not required any userspace daemon running.
|
||||||
|
# This native limit works even when the laptop is sleeping or powered off therefore
|
||||||
|
# it is preferable to the userspace daemon.
|
||||||
|
# Nonetheless, it only works with fixed thresholds (80% as upper limit and 70% as
|
||||||
|
# lower limit).
|
||||||
|
#
|
||||||
|
# Thanks to @marcan for the implementation details in the Asahi Linux kernel:
|
||||||
|
# https://github.com/AsahiLinux/linux/commit/107ed86e21d1522d5d5d9d629f1d9c371e37df7f#diff-6b2c1b57b60e2829a9973ea707f596a3ff85fa787eca5d6d3b8ac79ebdd0381cR453
|
||||||
|
# https://oftc.irclog.whitequark.org/asahi-dev/2023-04-18#32076880
|
||||||
|
|
||||||
|
# CHWA key is the one used to enable/disable the native limit. 01 = 80% limit, 00 = no limit
|
||||||
|
chwa_key="$( sudo smc -r -k CHWA | grep -q "no data" && echo "unavailable" || echo "available" )"
|
||||||
|
|
||||||
|
function enable_native_limit() {
|
||||||
|
log " Enabling native limit at 80%"
|
||||||
|
sudo smc -k CHWA -w 01
|
||||||
|
}
|
||||||
|
|
||||||
|
function disable_native_limit() {
|
||||||
|
log " Disabling native limit"
|
||||||
|
sudo smc -k CHWA -w 00
|
||||||
|
}
|
||||||
|
function get_native_limit_status() {
|
||||||
|
if [[ "$chwa_key" == "unavailable" ]]; then
|
||||||
|
echo "disabled"
|
||||||
|
else
|
||||||
|
hex_status=$( smc -k CHWA -r | awk '{print $4}' | sed s:\):: )
|
||||||
|
if [[ "$hex_status" == "00" ]]; then
|
||||||
|
echo "disabled"
|
||||||
|
else
|
||||||
|
echo "enabled"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_native_limit() {
|
||||||
|
if [[ "$(get_native_limit_status)" == "enabled" ]]; then
|
||||||
|
echo "80"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# both the daemon and the native limit can be set at the same time so this function
|
||||||
|
# returns the lowest of the two.
|
||||||
|
# When both are set, the daemonic limit is the one that is used while the mac is awake
|
||||||
|
# and the native limit is the one that is used when the mac is sleeping or powered off.
|
||||||
|
function get_actual_limit() {
|
||||||
|
native=$( get_native_limit )
|
||||||
|
daemon=$( get_maintain_percentage )
|
||||||
|
|
||||||
|
# if both are set, return the lowest
|
||||||
|
if [[ ! -z "$native" ]] && [[ ! -z "$daemon" ]]; then
|
||||||
|
if [[ "$native" -lt "$daemon" ]]; then
|
||||||
|
echo "$native"
|
||||||
|
else
|
||||||
|
echo "$daemon"
|
||||||
|
fi
|
||||||
|
# if only one is set, return that one
|
||||||
|
elif [[ ! -z "$native" ]]; then
|
||||||
|
echo "$native"
|
||||||
|
elif [[ ! -z "$daemon" ]]; then
|
||||||
|
echo "$daemon"
|
||||||
|
else
|
||||||
|
# if neither is set, return nothing
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function get_smc_charging_status() {
|
function get_smc_charging_status() {
|
||||||
hex_status=$(smc -k CH0B -r | awk '{print $4}' | sed s:\)::)
|
hex_status=$(smc -k CH0B -r | awk '{print $4}' | sed s:\)::)
|
||||||
if [[ "$hex_status" == "00" ]]; then
|
if [[ "$hex_status" == "00" ]]; then
|
||||||
@@ -433,6 +510,41 @@ if [[ "$action" == "maintain_synchronous" ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# if maintain percentage is 80 and CHWA is available, exit. This daemon is not needed.
|
||||||
|
# This condition could happen in some rare cases, for example when the daemon is started before
|
||||||
|
# updating the tool or before CHWA is available.
|
||||||
|
if [[ "$chwa_key" == "available" ]]; then
|
||||||
|
if [[ "$setting" == "80" ]]; then
|
||||||
|
log "Skipping daemon start as CHWA is available and maintain percentage is $setting"
|
||||||
|
# Disable daemon
|
||||||
|
battery maintain stop
|
||||||
|
battery disable_daemon
|
||||||
|
# Activate the native limit in case this is the first restart after the update of MacOs
|
||||||
|
# or of this tool
|
||||||
|
if [[ "$( get_native_limit_status )" == "disabled" ]]; then
|
||||||
|
enable_native_limit
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
# If $setting is below 80 activate the native charging limiter as a mixed strategy. At
|
||||||
|
# least during sleep it will get as high as 80%, closer to the desired $setting than 100%.
|
||||||
|
if [[ "$setting" -lt "80" ]]; then
|
||||||
|
log "Using mixed limiter (daemon: $setting% / native: 80%)"
|
||||||
|
if [[ "$( get_native_limit_status )" == "disabled" ]]; then
|
||||||
|
enable_native_limit
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Disabling native charging limiter if the limit > 80% as it would interfere with
|
||||||
|
# the daemon.
|
||||||
|
if [[ "$( get_native_limit_status )" == "enabled" ]]; then
|
||||||
|
disable_native_limit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if the user requested that the battery maintenance first discharge to the desired level
|
# Check if the user requested that the battery maintenance first discharge to the desired level
|
||||||
if [[ "$subsetting" == "--force-discharge" ]]; then
|
if [[ "$subsetting" == "--force-discharge" ]]; then
|
||||||
# Before we start maintaining the battery level, first discharge to the target level
|
# Before we start maintaining the battery level, first discharge to the target level
|
||||||
@@ -514,6 +626,23 @@ if [[ "$action" == "maintain" ]]; then
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Use CHWA method if available an 80% is used (it's the only level supported by CHWA)
|
||||||
|
if [[ "$chwa_key" == "available" ]]; then
|
||||||
|
if [[ "$setting" == "80" ]]; then
|
||||||
|
if test -f "$pidfile"; then
|
||||||
|
kill_daemon
|
||||||
|
battery disable_daemon
|
||||||
|
log "Killing and disabling daemon as native limiter is available"
|
||||||
|
fi
|
||||||
|
enable_native_limit
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
log "Native charging limiter is available but only supports 80% limit. Consider using 80% because it works even during sleep."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
kill_daemon
|
||||||
|
|
||||||
# Start maintenance script
|
# Start maintenance script
|
||||||
log "Starting battery maintenance at $setting% $subsetting"
|
log "Starting battery maintenance at $setting% $subsetting"
|
||||||
nohup battery maintain_synchronous $setting $subsetting >>$logfile &
|
nohup battery maintain_synchronous $setting $subsetting >>$logfile &
|
||||||
@@ -548,7 +677,8 @@ if [[ "$action" == "calibrate_synchronous" ]]; then
|
|||||||
while true; do
|
while true; do
|
||||||
log "checking if at 100%"
|
log "checking if at 100%"
|
||||||
# Check if battery level has reached 100%
|
# Check if battery level has reached 100%
|
||||||
if battery status | head -n 1 | grep -q "Battery at 100%"; then
|
if battery status | head -n 1 | grep -q "Battery at 100%";
|
||||||
|
then
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
sleep 300
|
sleep 300
|
||||||
@@ -595,11 +725,37 @@ fi
|
|||||||
|
|
||||||
# Status logger
|
# Status logger
|
||||||
if [[ "$action" == "status" ]]; then
|
if [[ "$action" == "status" ]]; then
|
||||||
|
daemon_limit=$( get_maintain_percentage )
|
||||||
|
native_limit=$( get_native_limit )
|
||||||
|
actual_limit=$( get_actual_limit )
|
||||||
|
|
||||||
log "Battery at $(get_battery_percentage)% ($(get_remaining_time) remaining), smc charging $(get_smc_charging_status)"
|
log "Battery at $( get_battery_percentage )% ($( get_remaining_time ) remaining), smc charging $( get_smc_charging_status )"
|
||||||
if test -f $pidfile; then
|
|
||||||
maintain_percentage=$(cat $maintain_percentage_tracker_file 2>/dev/null)
|
if [[ ! -z "$actual_limit" ]]; then
|
||||||
log "Your battery is currently being maintained at $maintain_percentage%"
|
limit_status="Battery maintenance is set to $actual_limit%"
|
||||||
|
# if both daemon and native limiters are enabled, show both as: " using mixed daemon/native limiter. While your mac is awake the limit will be $setting% and during sleep it will be $native_limit%."
|
||||||
|
if [[ ! -z "$daemon_limit" ]] && [[ ! -z "$native_limit" ]]; then
|
||||||
|
limit_status="$limit_status using mixed daemon/native limiter ($daemon_limit% while your mac is awake / $native_limit% during sleep)."
|
||||||
|
elif [[ ! -z "$native_limit" ]]; then
|
||||||
|
limit_status="$limit_status using native limiter."
|
||||||
|
elif [[ ! -z "$daemon_limit" ]]; then
|
||||||
|
limit_status="$limit_status using daemon limiter (only works while your mac is awake)."
|
||||||
|
else
|
||||||
|
limit_status="$limit_status."
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [[ "$chwa_key" == "available" ]] && [[ ! -z "$daemon_limit" ]]; then
|
||||||
|
limit_status="$limit_status Consider using native limit of 80% instead of $daemon_limit% to improve battery health."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$chwa_key" != "available" ]]; then
|
||||||
|
limit_status="$limit_status Consider upgrading to macOS to enable native battery limiter. It works even during sleep."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -z "$limit_status" ]]; then
|
||||||
|
log "$limit_status"
|
||||||
fi
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user