用于充电和放电笔记本电池的Python脚本

时间:2013-12-23 17:58:46

标签: python battery batterylevel powermanager battery-saver

我的一位朋友最近继承了一台旧笔记本电脑,刚刚安装了Windows 7,并希望延长电池续航时间。最初电池持续约20分钟,但通过手动让电池在充电前完全放电几次,他已设法将电池寿命延长到一个小时左右。我们认为看到我们可以提高电池性能的程度会很有趣!我想写一个脚本让电池在一夜之间循环 - 这对于偶尔在任何一台电脑上运行来维持电池健康状况可能会有用吗?我可以获得电池状态,但无法看到如何指示笔记本电脑忽略交流电源线的存在并使用电池。我有一种感觉答案就在那里: https://pypi.python.org/pypi/LaptopControlPanel但我对我的理解完全处于极限!任何帮助都会很棒。

import ctypes
from ctypes import wintypes


class SYSTEM_POWER_STATUS(ctypes.Structure):
    _fields_ = [
        ('ExternalPower', wintypes.BYTE),
        ('BatteryFlag', wintypes.BYTE),
        ('BatteryLifePercent', wintypes.BYTE),
        ('Reserved1', wintypes.BYTE),
        ('BatteryLifeTime', wintypes.DWORD)
        ]

SYSTEM_POWER_STATUS_P = ctypes.POINTER(SYSTEM_POWER_STATUS)
GetSystemPowerStatus = ctypes.windll.kernel32.GetSystemPowerStatus
GetSystemPowerStatus.argtypes = [SYSTEM_POWER_STATUS_P]
GetSystemPowerStatus.restype = wintypes.BOOL

status = SYSTEM_POWER_STATUS()
if not GetSystemPowerStatus(ctypes.pointer(status)):
        raise cytpes.WinError()
print 'ExternalPower', status.ExternalPower
#print 'BatteryFlag', status.BatteryFlag
print 'BatteryLifePercent', status.BatteryLifePercent
print 'BatteryLifeTime', status.BatteryLifeTime

if status.ExternalPower == True and status.BatteryLifePercent == 100:
    print 'Connected to mains and at 100% charge: Begining decharge'
    # This is where I would like to force battery use. Perhaps with a while
 #loop (that ticks every 60 seconds or so)
    if status.BatteryLifePercent > 10 :
        status.ExternalPower = 0

elif status.ExternalPower == True and status.BatteryLifePercent < 100:
    print 'Connected to mains and charging up to 100%'
    status.ExternalPower = 1

elif status.ExternalPower == False:
    print 'Not connected to mains'

else:
    print ' Unknown system status'

x = raw_input('Press ENTER to close:')

第一个if语句是我想强制使用电池的地方...... 上述代码大部分来自In Python, how can I detect whether the computer is on battery power?

感谢-你。

2 个答案:

答案 0 :(得分:1)

AFAIK,实现它的能力与Python或其他编程语言没有多大关系。它基本上是笔记本电脑硬件的功能,可能根本不存在。如果它确实存在,则它需要由制造商的驱动程序公开,您可能需要一些低级别的操作系统特定的向导来实际从Python调用驱动程序API,因为没有操作系统抽象。鉴于您拥有API的文档,可能不公开......

如果您对PC硬件内部的黑客攻击和逆向工程感兴趣,这可能是一个不错的项目,这当然很有趣:)

答案 1 :(得分:0)

一个非常简单的方法是使用带有arduino的中继开关,并通过python串行通信给它命令