После года эксплуатации, емкость моей батареи ноутбука прилично уменьшилась. Почему? Батарею ноутбука то разряжают в ноль, то забывают на зарядке на несколько дней. Мало кто следит за зарядом батареи. Но и перезаряд, и сильный разряд ведет к быстрой деградации батареи, поэтому она теряет емкость и перестает выполнять свои функции.
Как обеспечить батарее в ноутбуке долгую жизнь и сохранить ее емкость? Ответ казалось бы простой — надо не допускать ни перезаряда, ни излишнего разряда батареи. Но как это сделать? Я для себя решил этот вопрос так — написал небольшую программу на Python, которая включает или выключает зарядное устройство батареи в определенном диапазоне. Т.е. ноутбук сам управляет своей розеткой, сам бережет свою батарею от деградации. А я перестал об думать.
А для простого включения и выключения зарядки я использую умную розетку с прошивкой Тасмота, которая позволяет управлять розеткой по вебхуку прямо по локальной сети. Работает железобетонно.
Привожу код программы, проверено на Python 3.11.4
import psutil
import requests
import time
from datetime import datetimedef send_web_request(url):
try:
response = requests.get(url)
response.raise_for_status()
return response.status_code
except requests.exceptions.RequestException as e:
return str(e)def load_config():
config = {}
with open(«config.txt») as config_file:
lines = config_file.readlines()
for line in lines:
key, value = line.strip().split(«:»)
config[key] = value
return configdef main():
config = load_config()
device_ip = config[«device_ip»]while True:
battery = psutil.sensors_battery()
percent = battery.percentif percent > int(config[«turn_off_percent»]):
response = send_web_request(f»http://{device_ip}/cm?cmnd=Power%20off»)
current_time = datetime.now().strftime(«%d.%m.%y | %H:%M»)
status = f»{current_time} | %:{percent} | ret: {response}»
print(status)
elif percent < int(config[«turn_on_percent»]):
response = send_web_request(f»http://{device_ip}/cm?cmnd=Power%20On»)
current_time = datetime.now().strftime(«%d.%m.%y | %H:%M»)
status = f»{current_time} | %:{percent} | ret: {response}»
print(status)time.sleep(int(config[«check_interval»]))
if __name__ == «__main__»:
main()
Для корректной работы программы, я установил в среде Python 2 библиотеки:
pip install psutil
pip install requests
А также сделал себе exe-файл по Windows, для этого установил
pip install auto-py-to-exe
А для того, чтобы можно было один раз настроить и больше в код не лазить, основные параметры вынес в конфиг config.txt:
Т.е. задаем ip адрес розетки, при 40% включаем, при 97% выключаем, и проверяем каждые 60 секунд.
device_ip:192.168.1.99
turn_on_percent:40
turn_off_percent:97
check_interval:60
Розетки для разных устройств имеют статические ip адреса, и управляются командами:
http://192.168.1.99/cm?cmnd=Power%20off
http://192.168.1.99/cm?cmnd=Power%20On
Дополнительные комментарии по тасмоте и компиляции в exe-файл, чтобы использовать без установки Python:
# Проект умная розетка управляемая ноутбуком v@c0d.su
# Сначала подключаем розетку с прошивкой Тасмота. В принципе подойдет любая умная розетка, которая умеет управляться по веб-хуку. Если не тасмота, то возможно придется модифицировать запрос в программе для включения/выключения розетки.
# Подключаем новую розетку. Если она через минуту не подключилась к Wifi, она открыта как точка доступа. Вводим туда правильную сеть вайфай и перегружаем.
# Находим розетку в роутере и даем ей статический адрес: 1.99 для Ноубука №1
# Проверяем работу веб-команды: http://192.168.1.99/cm?cmnd=Power%20off — работает как часы# Делаем скрипт на питоне:
# Ставим питон с командой PATH при инсталляции. 3.11.4
# Добавляем библиотеки:
pip install psutil
pip install requests
# и обновляем что просят.pip install auto-py-to-exe
# ставится само в эту папку: C:\Users\X\AppData\Local\Programs\Python\Python311\Lib\site-packages\auto_py_to_exeauto-py-to-exe —version
# auto-py-to-exe 2.36.0
# Код 1: D:\Apps\SB6\sb1.py (самая первая версия программы, окончательная версия выше)
import psutil
import requests
import timedef send_web_request(url):
try:
response = requests.get(url)
response.raise_for_status() # Проверяем успешность запроса
print(«Web request sent successfully:», response.status_code)
except requests.exceptions.RequestException as e:
print(«Error sending web request:», e)def main():
while True:
battery = psutil.sensors_battery()
percent = battery.percentif percent > 80:
send_web_request(«http://192.168.1.81/cm?cmnd=Power%20off»)
elif percent < 50:
send_web_request(«http://192.168.1.81/cm?cmnd=Power%20On»)time.sleep(600) # Подождать 600 секунд (10 минут) перед следующим опросом
if __name__ == «__main__»:
main()
Архив с файлом на Python, конфигом и exe-файлом