为笔记本电脑电池充电和放电的Python脚本

为笔记本电脑电池充电和放电的Python脚本,python,battery,batterylevel,powermanager,battery-saver,Python,Battery,Batterylevel,Powermanager,Battery Saver,我的一位朋友最近继承了一台旧笔记本电脑,并新安装了Windows7,希望延长电池寿命。最初,电池的续航时间约为20分钟,但在充电之前,他手动让电池完全放电几次,从而将续航时间延长到一小时左右。我们认为看到我们能提高电池的性能会很有趣!我想写一个脚本,让电池在一夜之间循环使用——这可能对偶尔在任何计算机上运行以保持电池健康有用?我可以获得电池状态,但看不到如何指示笔记本电脑忽略交流电源线的存在并使用电池。我感觉答案就在那里: 但就我的理解而言,我完全处于极限!任何帮助都会很好 import cty

我的一位朋友最近继承了一台旧笔记本电脑,并新安装了Windows7,希望延长电池寿命。最初,电池的续航时间约为20分钟,但在充电之前,他手动让电池完全放电几次,从而将续航时间延长到一小时左右。我们认为看到我们能提高电池的性能会很有趣!我想写一个脚本,让电池在一夜之间循环使用——这可能对偶尔在任何计算机上运行以保持电池健康有用?我可以获得电池状态,但看不到如何指示笔记本电脑忽略交流电源线的存在并使用电池。我感觉答案就在那里: 但就我的理解而言,我完全处于极限!任何帮助都会很好

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:')
导入ctypes
从ctypes导入wintypes
类别系统\u电源\u状态(C类型结构):
_字段=[
('ExternalPower',wintypes.BYTE),
('BatteryFlag',wintypes.BYTE),
('BatteryLifePercent',wintypes.BYTE),
('Reserved1',wintypes.BYTE),
('BatteryLifeTime',wintypes.DWORD)
]
SYSTEM\u POWER\u STATUS\u P=C类型指针(SYSTEM\u POWER\u STATUS)
GetSystemPowerStatus=ctypes.windell.kernel32.GetSystemPowerStatus
GetSystemPowerStatus.argtypes=[SYSTEM\u POWER\u STATUS\u P]
GetSystemPowerStatus.restype=wintypes.BOOL
状态=系统\电源\状态()
如果不是GetSystemPowerStatus(ctypes.pointer(状态)):
raise cytpes.WinError()
打印'ExternalPower',status.ExternalPower
#打印“BatteryFlag”,状态为。BatteryFlag
打印“BatteryLifePercent”,状态为.BatteryLifePercent
打印“BatteryLifeTime”,状态为.BatteryLifeTime
如果status.ExternalPower==True且status.BatteryLifePercent==100:
打印“连接到电源并100%充电:开始放电”
#这就是我想强制使用电池的地方。也许过一会儿吧
#循环(大约每60秒滴答一次)
如果status.BatteryLifePercent>10:
status.ExternalPower=0
elif status.ExternalPower==真,status.BatteryLifePercent<100:
打印“连接到主电源并充电至100%”
status.ExternalPower=1
elif status.ExternalPower==False:
打印“未连接到电源”
其他:
打印“未知系统状态”
x=原始输入('按ENTER键关闭:')
第一个if语句是我想强制使用电池的地方。。。 上面的代码大部分是从计算机上偷来的


谢谢。

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


如果你对破解和逆向工程PC硬件的内部结构感兴趣,这可能是一个不错的项目,这当然很有趣:)

一个非常简单的方法是使用arduino的中继开关,通过python的串行通信给它发指令。

这是什么类型的笔记本电脑?Lenovo/ThinkPad附带了一个实用程序。我打赌你也可以在网上找到一个实用程序。仅仅拔下交流电源的问题是你会将电池完全降到零,而你正试图避免这种情况吗?或者你只是想从Python中获得乐趣?我甚至不知道你可以用Python来做那种事情。我很感兴趣,如果你能让它工作起来的话。@Levon这是一个2007年左右运行Windows7的Tobisha。不,问题不在于手动拔掉电源插头,更重要的是必须将笔记本电脑插上电源(比如说隔夜),并且能够循环充电任意次数。但也是的,这背后的主要原因是玩python的乐趣——当然,手动拔掉插头是可行的(他一直在这么做)。