افزایش عمر باتری لپ‌‌تاپ

باتری‌های لیتیوم-یون

باتری‌های لیتیوم یونی نباید خیلی خالی یا خیلی پر شوند. به این معنی که نباید اجازه داد شارژ آنها کاملا تخلیه شود تا منجر به خاموش شدن دستگاه شوند و همچنین نباید پس از وقتی که شارژشان پر شد، به منبع شارژ متصل بمانند.

در حالت ایده‌آل نباید اجازه داد که یک باتری لیتیوم یونی بیش از ۸۰ درصد شارژ شود یا کمتر از ۲۰ درصد تخلیه شود،

با توجه به اینکه امروزه همه ما از لپ‌تاپ‌ها بیشتر در حالتی که به شارژر وصل هستند استفاده می‌کنیم و کمتر پیش می‌آید دسترسی و امکان اتصال لپ‌تاپ به برق را نداشته باشیم، پیشنهاد می‌شود برای افزایش طول عمر باتری میزان شارژ آن را حدود ۶۰ درصد نگهداریم.

بیشتر برندهای لپ‌تاپهای امروزی روی ویندوز ابزارهای رسمی برای کنترل میزان آستانه شارژ لپ‌تاپ دارند.

تنظیم threshold

کرنل لینوکس هم از ورژن V4.17 و به صورت دقیق‌تر با این پچ یک ماژول رابط کاربری برای کنترل آستانه شارژ باتری‌ها معرفی کرد که در ابتدا برای چند سری از Thinkpadهای شرکت لنوو به صورت آزمایشی فعال شد و در ادامه دستگاه‌های بیشتری را پشتیبانی می‌کند.

برای اینکه بدانید آیا لپ‌تاپ شما هم از این پشتیبانی برخوردار است راه‌های مختلفی وجود دارد. ساده‌ترین کار این است که ببینید در مسیر فایل‌های سیستمی مدیریت توان لپ‌تاپ شما، فایلی برای کنترل رفتار آستانه باتری وجود دارد یا خیر. این فایل معمولا با اسم ‎charge_control_{start,end}_threshold‬ و در مسیر ‎/sys/class/power_supply/BAT[0-9]‬ قرار دارد.

اگر به صورت دستی مقدار این فایل را تغییر دهید، خواهید دید که شارژ شدن باتری در آستانه تعریف شده توسط شما متوقف می‌شود. برای این کار از فرامین echo و tee بهره ببرید. آشکار است که برای این کار باید دسترسی روت داشته باشید.

استفاده از TLP

برای کنترل آستانه شارژ باطری می‌توانید از TLP نیز استفاده کنید. اگر این ابزار هنوز از سیستم شما پشتیبانی نمی‌کند و اطمینان دارید که دستگاه شما چنین قابلیتی دارد، می‌توانید با توجه به دستور‌العملی که در این کامنت آمده عمل کنید و یک gist بسازید و لینک آن را زیر همین #issue321& کامنت بگذارید تا توسعه‌دهندگان در ویرایش‌های بعد، پشتیبانی از دستگاه شما را هم پیگیری کنند. دقت کنید که پیش از شما مشخصات دستگاهتان ثبت نشده باشد و اسپم نکنید.

نمونه خروجی به این شکل خواهد بود :

$ sudo tlp-stat -s -b
--- TLP 1.3.1 --------------------------------------------

+++ System Info
System         = ASUSTeK COMPUTER INC. 1.0        ZenBook 14 UX410UFR
BIOS           = UX410UFR.201
Kernel         = 5.5.3-arch1-1 #1 SMP PREEMPT Tue, 11 Feb 2020 15:35:41 +0000 x86_64
/proc/cmdline  = BOOT_IMAGE=/vmlinuz-linux root=UUID=805eb372-94c7-4e8c-87b4-54b0414fa84a rw loglevel=3 quiet
Init system    = systemd 
Boot mode      = UEFI

+++ TLP Status
State          = enabled
RDW state      = enabled
Last run       = 09:11:45 PM,   1613 sec(s) ago
Mode           = AC
Power source   = AC

Notice: systemd-rfkill.service is not masked -- invoke "systemctl mask systemd-rfkill.service" to correct this!
Notice: systemd-rfkill.socket is not masked -- invoke "systemctl mask systemd-rfkill.socket" to correct this!

+++ Battery Features: Charge Thresholds and Recalibrate
natacpi    = inactive (laptop not supported)
tpacpi-bat = inactive (laptop not supported)
tp-smapi   = inactive (laptop not supported)

+++ Battery Status: BAT0
/sys/class/power_supply/BAT0/manufacturer                   = ASUSTeK
/sys/class/power_supply/BAT0/model_name                     = ASUS Battery
/sys/class/power_supply/BAT0/cycle_count                    =     35
/sys/class/power_supply/BAT0/energy_full_design             =  48336 [mWh]
/sys/class/power_supply/BAT0/energy_full                    =  45474 [mWh]
/sys/class/power_supply/BAT0/energy_now                     =  31327 [mWh]
/sys/class/power_supply/BAT0/power_now                      =      0 [mW]
/sys/class/power_supply/BAT0/status                         = Not charging

Charge                                                      =   68.9 [%]
Capacity                                                    =   94.1 [%]

# **NOTE**
# (I manually set the charge_control_end_threshold t0 60)

$ grep '.*' /sys/class/power_supply/BAT?/*
/sys/class/power_supply/BAT0/alarm:4833000
/sys/class/power_supply/BAT0/capacity:68
/sys/class/power_supply/BAT0/capacity_level:Normal
/sys/class/power_supply/BAT0/charge_control_end_threshold:60
/sys/class/power_supply/BAT0/cycle_count:35
/sys/class/power_supply/BAT0/energy_full:45474000
/sys/class/power_supply/BAT0/energy_full_design:48336000
/sys/class/power_supply/BAT0/energy_now:31327000
/sys/class/power_supply/BAT0/manufacturer:ASUSTeK
/sys/class/power_supply/BAT0/model_name:ASUS Battery
/sys/class/power_supply/BAT0/power_now:0
/sys/class/power_supply/BAT0/present:1
/sys/class/power_supply/BAT0/serial_number: 
/sys/class/power_supply/BAT0/status:Not charging
/sys/class/power_supply/BAT0/technology:Li-ion
/sys/class/power_supply/BAT0/type:Battery
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_NAME=BAT0
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_STATUS=Not charging
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_PRESENT=1
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_TECHNOLOGY=Li-ion
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_CYCLE_COUNT=35
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_VOLTAGE_MIN_DESIGN=11400000
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_VOLTAGE_NOW=11400000
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_POWER_NOW=0
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_ENERGY_FULL_DESIGN=48336000
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_ENERGY_FULL=45474000
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_ENERGY_NOW=31327000
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_CAPACITY=68
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_CAPACITY_LEVEL=Normal
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_MODEL_NAME=ASUS Battery
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_MANUFACTURER=ASUSTeK
/sys/class/power_supply/BAT0/uevent:POWER_SUPPLY_SERIAL_NUMBER= 
/sys/class/power_supply/BAT0/voltage_min_design:11400000
/sys/class/power_supply/BAT0/voltage_now:11400000

و برای udevadm test:

$ udevadm test /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:19/PNP0C09:01/PNP0C0A:03/power_supply/BAT0
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

Load module index
Parsed configuration file /usr/lib/systemd/network/99-default.link
Created link configuration context.
Reading rules file: /usr/lib/udev/rules.d/01-md-raid-creating.rules
Reading rules file: /usr/lib/udev/rules.d/10-dm.rules
Reading rules file: /usr/lib/udev/rules.d/11-dm-lvm.rules
Reading rules file: /usr/lib/udev/rules.d/13-dm-disk.rules
Reading rules file: /usr/lib/udev/rules.d/39-usbmuxd.rules
Reading rules file: /usr/lib/udev/rules.d/40-usb-media-players.rules
Reading rules file: /usr/lib/udev/rules.d/50-udev-default.rules
Reading rules file: /usr/lib/udev/rules.d/60-autosuspend-chromiumos.rules
Reading rules file: /usr/lib/udev/rules.d/60-block.rules
Reading rules file: /usr/lib/udev/rules.d/60-cdrom_id.rules
Reading rules file: /usr/lib/udev/rules.d/60-drm.rules
Reading rules file: /usr/lib/udev/rules.d/60-evdev.rules
Reading rules file: /usr/lib/udev/rules.d/60-fido-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-input-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-alsa.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-input.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage-tape.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-v4l.rules
Reading rules file: /usr/lib/udev/rules.d/60-rfkill.rules
Reading rules file: /usr/lib/udev/rules.d/60-sensor.rules
Reading rules file: /usr/lib/udev/rules.d/60-serial.rules
Reading rules file: /usr/lib/udev/rules.d/61-autosuspend-manual.rules
Reading rules file: /usr/lib/udev/rules.d/63-md-raid-arrays.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs-dm.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs.rules
Reading rules file: /usr/lib/udev/rules.d/64-md-raid-assembly.rules
Reading rules file: /usr/lib/udev/rules.d/65-libwacom.rules
Reading rules file: /usr/lib/udev/rules.d/69-cd-sensors.rules
Reading rules file: /usr/lib/udev/rules.d/69-dm-lvm-metad.rules
Reading rules file: /usr/lib/udev/rules.d/69-libmtp.rules
Reading rules file: /usr/lib/udev/rules.d/69-md-clustered-confirm-device.rules
Reading rules file: /usr/lib/udev/rules.d/70-infrared.rules
Reading rules file: /usr/lib/udev/rules.d/70-joystick.rules
Reading rules file: /usr/lib/udev/rules.d/70-mouse.rules
Reading rules file: /usr/lib/udev/rules.d/70-power-switch.rules
Reading rules file: /usr/lib/udev/rules.d/70-touchpad.rules
Reading rules file: /usr/lib/udev/rules.d/70-uaccess.rules
Reading rules file: /usr/lib/udev/rules.d/71-seat.rules
Reading rules file: /usr/lib/udev/rules.d/73-seat-late.rules
Reading rules file: /usr/lib/udev/rules.d/75-net-description.rules
Reading rules file: /usr/lib/udev/rules.d/75-probe_mtd.rules
Reading rules file: /usr/lib/udev/rules.d/78-sound-card.rules
Reading rules file: /usr/lib/udev/rules.d/80-drivers.rules
Reading rules file: /usr/lib/udev/rules.d/80-libinput-device-groups.rules
Reading rules file: /usr/lib/udev/rules.d/80-net-setup-link.rules
Reading rules file: /usr/lib/udev/rules.d/80-udisks2.rules
Reading rules file: /usr/lib/udev/rules.d/84-nm-drivers.rules
Reading rules file: /usr/lib/udev/rules.d/85-nm-unmanaged.rules
Reading rules file: /usr/lib/udev/rules.d/85-tlp.rules
Reading rules file: /usr/lib/udev/rules.d/89-alsa-ucm.rules
Reading rules file: /usr/lib/udev/rules.d/90-alsa-restore.rules
Reading rules file: /usr/lib/udev/rules.d/90-backlight.rules
Reading rules file: /usr/lib/udev/rules.d/90-brightnessctl.rules
Reading rules file: /usr/lib/udev/rules.d/90-libinput-fuzz-override.rules
Reading rules file: /usr/lib/udev/rules.d/90-nm-thunderbolt.rules
Reading rules file: /usr/lib/udev/rules.d/90-pulseaudio.rules
Reading rules file: /usr/lib/udev/rules.d/90-vconsole.rules
Reading rules file: /usr/lib/udev/rules.d/95-cd-devices.rules
Reading rules file: /usr/lib/udev/rules.d/95-dm-notify.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-csr.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-hid.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-hidpp.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-wup.rules
Reading rules file: /usr/lib/udev/rules.d/96-e2scrub.rules
Reading rules file: /usr/lib/udev/rules.d/99-fuse.rules
Reading rules file: /usr/lib/udev/rules.d/99-fuse3.rules
Reading rules file: /usr/lib/udev/rules.d/99-systemd.rules
Reading rules file: /etc/udev/rules.d/99_battery_threshold.rules
BAT0: /etc/udev/rules.d/99_battery_threshold.rules:1 Failed to write ATTR{/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:19/PNP0C09:01/PNP0C0A:03/power_supply/BAT0/charge_control_end_threshold}, ignoring: Permission denied
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:19/PNP0C09:01/PNP0C0A:03/power_supply/BAT0
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Not charging
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CYCLE_COUNT=35
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=11400000
POWER_SUPPLY_VOLTAGE_NOW=11400000
POWER_SUPPLY_POWER_NOW=0
POWER_SUPPLY_ENERGY_FULL_DESIGN=48336000
POWER_SUPPLY_ENERGY_FULL=45349000
POWER_SUPPLY_ENERGY_NOW=35260000
POWER_SUPPLY_CAPACITY=77
POWER_SUPPLY_CAPACITY_LEVEL=Normal
POWER_SUPPLY_MODEL_NAME=ASUS Battery
POWER_SUPPLY_MANUFACTURER=ASUSTeK
POWER_SUPPLY_SERIAL_NUMBER=
ACTION=add
SUBSYSTEM=power_supply
USEC_INITIALIZED=1882376914
Unload module index
Unloaded link configuration context.

تنظیم آستانه شارژ با udev

چنانچه می‌خواهید همواره با بوت شدن سیستم‌ آستانه شارژ روی مقدار مشخصی تنظیم شود می‌توانید با افزودن udev rule و تنظیم مقدار threshold در زمان بوت شدن سیستم این کار را انجام دهید.

برای انجام این کار می‌بایست یک فایل جدید با پسوند ‎.ruls‬ در مسیر ‎/etc/udev/rules.d‬ بسازید.

تنظیمات فایل من به این صورت است:

$ cat /etc/udev/rules.d/99_battery_threshold.rules
KERNEL=="BAT[0-9]", SUBSYSTEM=="power_supply", ATTR{charge_control_end_threshold}="60"

برای درک بیشتر udev و چگونگی استفاده از آن برای ارتباط با ماژول‌های کرنل می‌توانید به این صفحه در ویکی آرچ لینوکس مراجعه کنید.