前言

当我们需要手机长期开机,运行挂机服务时候,自动充电是一个需要考虑的问题,涉及到安全问题,这就需要考虑自动充电策略了

软件层面实现

root手机:

控制充断电可以安装app自动充电
https://f-droid.org/en/packages/mattecarra.accapp/

软件层面实现 root两种方法

更新:我没有长期测过adb命令 adb 命令没有root情况下似乎不能真正控制是否充电,虽然电量显示不变化,但是拔掉之后发现电量依然增加

2.1 ADB(Android Debug Bridge)usb调试

在电脑端通过usb数据线ADB控制充电,缺点是,需要你有一个电脑,还得usb 不停 插着 ,局限多。。。所以本文不多介绍,主要讲解ADB电池管理操作

以下是一些常见的使用 ADB 进行电池管理的命令:

查看电池状态信息:

adb shell dumpsys battery
获取电池电量百分比:

控制充电状态

此命令将启用 USB 充电

adb shell dumpsys battery reset
adb -s 127.0.0.1:5555 shell dumpsys battery reset #指定设备

此命令将停用 USB 充电

adb shell dumpsys battery unplug
adb -s 127.0.0.1:5555 shell dumpsys battery unplug #指定设备
adb shell dumpsys battery | grep level

模拟电池充电状态:

adb shell dumpsys battery set status <status>

其中 可以是以下值之一:unknown、charging、discharging、not_charging、full。

2.2 ADB wifi调试(Android 4.0+ 无线调试)

这种方法的好处就是可以实现adb本机控制本机,也可以实现局域网群控

缺点是机型失效,即使电池图标显示没在充电,但是仍然有电流在充电,应该是厂商定制系统的问题

安装软件包

pkg install android-tools curl vim

编辑shell脚本 vim ato-charging.sh:i代码复制粘贴,自己修改参数,保存退出:wq,给予权限 chmod +x ato-charging.sh 运行./ato-charging.sh

代码已经托管到github 命令

wget https://raw.githubusercontent.com/geekplayers/termux-install-typecho-wordpress/main/ato-charging.sh && chmod +x ato-charging.sh

./ato-charging.sh  #运行
#!/data/data/com.termux/files/usr/bin/bash

#script: Automatic Battery Charging Control
#blog:linzimo.com
#environment:termux
#dependences-pkg: curl,android-tools,

#企业微信推送开关"on"开启 其他值关闭
push="off"                                                                                                                                                                                                                                                                                                                                                                                                                                  

#""内改为自己的webhook地址
webhook="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693"

#间隔时间,单位为秒
sleep="60"

# 发送企业微信消息函数
send_wechat_notification() {
    local message="$1"
    
    if [[ "$push" == "on" ]]; then
        curl -s -k -H "Content-Type: application/json" -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"$message\"}}" "$webhook"
    fi
}

# ADB 连接函数
adb_connect() {
    # 检查设备是否已连接
    devices=$(adb devices | grep -v "List of devices attached")
    if [[ -z $devices ]]; then
        echo "未找到已连接的设备"
        return 1
    fi
    
    # IP 地址
    ip=127.0.0.1
    # 连接设备
    adb tcpip 5555
    adb connect $ip:5555
    echo "已连接设备:$ip"
}


# 自动充电函数
auto_charge() {
    # 获取电池电量百分比
    battery_level=$(adb shell dumpsys battery | grep level | awk '{print $2}')
    
    # 获取设备温度
    temperature=$(adb shell cat /sys/class/thermal/thermal_zone0/temp)
    temperature=$(($temperature/1000)) # 转换为摄氏度
    
    echo "电量:$battery_level%"
    echo "温度:$temperature°C"
    
    # 判断温度是否过高
    if [[ $temperature -gt 41 ]]; then
        echo "温度过高,停止充电"
        adb -s 127.0.0.1:5555 shell dumpsys battery unplug
        
        # 发送微信通知
        message="温度高于41度,已停止充电"
        send_wechat_notification "$message"
    elif
      # 判断电量是否低于50%
      [[ $battery_level -lt 50 ]]; then
      
          message="电量低于50%,开始充电..."
          echo "$message"
          send_wechat_notification "$message"
          adb -s 127.0.0.1:5555 shell dumpsys battery reset

    elif [[ $battery_level -gt 90 ]]; then
      
          # 判断电量是否高于90%
          message="电量高于90%,停止充电..."
          echo "$message"
          send_wechat_notification "$message"
         adb -s 127.0.0.1:5555 shell dumpsys battery unplug
    fi
}

# 主函数
main() {
    # 连接 ADB
    adb_connect
    
    # 循环执行自动充电函数
    while true; do
        auto_charge
        sleep $sleep  # 间隔时间,单位为秒
    done
}

# 执行主函数
main

打开开发者选项-->开启无线调试

查看本机ip ifconfig

连接本机 adb connect 127.0.0.1:5555 如果连了WiFi可以 adb connect <局域网IP>:5555

物理层面实现,也是最安全有效的方法

python-miio库控制小米智能插座

我用的是目前相对最便宜的一款( 淘宝¥39 ,目前618活动米家app内商城-->优品新人优惠价¥29):

Gosund电小酷智能插座CP1白色(WIFI版) 单个装 白色

1.脚本获取插座令牌(token)

相比于用找米家修改版、root安卓机查看米家日志(目前已经失效),最简单方法就是使用的是github上的python脚本了

这个脚本模拟Android米家APP的登录,以直接获取到自己账号下的智能设备信息,就能直接拿到token了,当然前提是你在米家app登陆该账号并添加插座设备,这样米家服务会在云端保存插座信息。

Xiaomi Cloud Tokens Extractor

下载运行脚本shell命令

pip3 install requests
wget https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor/raw/master/token_extractor.py
python3 token_extractor.py

2.安装python-miio库

尝试用pip安装

pip install python-miio

遇到编译安装cryptography失败 ERROR: Could not build wheels for cryptography, which is required to install pyproject.toml-based projects

tmp9776.png

pip工具手动安装再次报错 $pip install cryptography,最后在cryptography项目issue上找到最新的解决方法

https://github.com/termux/termux-packages/issues/9982

手动安装官方编译好的python拓展pkg包

pkg install python-cryptography

再次安装python-miio,没有报错,安装成功。

接下来就可以测试插座是否可连接

获取设备信息

由于旧安卓版本adb可能无法连接调试本机,所以获取手机电池信息用termux插件termux-api实现,需要安装termux-api软件,

miiocli device --ip <ip> --token <token> info

注意:termux与插座连接到同一局域网,替换

成功返回结果

~ $ miiocli device --ip 192.168.6.181 --token 5735d4a2ce13e339ac560a6d7f3e2131 info                           
Model: cuco.plug.cp1d  #型号                                
Hardware version: esp8266   #硬件版本                             
Firmware version: 2.1.3_0002  #固件版本

1.在终端中输入以下命令,使用Python解释器逐行执行代码:

python

2.在Python交互式环境中,输入以下代码,按Enter执行:

打开开关

from miio import Device; Device("<设备IP地址>", "<设备令牌>").send("set_properties", [{"siid": 2, "piid": 1, "did": "state", "value": True}])

关闭开关

from miio import Device; Device("<设备IP地址>", "<设备令牌>").send("set_properties", [{"siid": 2, "piid": 1, "did": "state", "value": False}])

执行命令后返回一串信息

[{'did': 'state', 'siid': 2, 'piid': 1, 'code': 0}]

这个列表表示发送命令的响应结果。在这个例子中,响应结果中的'code': 0表示命令执行成功,没有错误发生。

测试完毕后可以使用这个python程序来控制插座了

import argparse
import time
import subprocess
from miio import Device

#myblog:linzimo.com

# ------设置插座的IP地址和令牌-------

ip = "192.168.1.1"
token = "5735d4"

# ------设置插座的IP地址和令牌-------

def get_battery_info():
    battery_info = subprocess.check_output(['termux-battery-status']).decode('utf-8')
    battery_data = {
        'level': int(battery_info.split('"percentgage":')[1].split(',')[0]),
        'temperature': float(battery_info.split('"temperature":')[1].split(',')[0])
    }
    return battery_data

def toggle_gosund_plug(ip, token, state):
    device = Device(ip, token)
    device.send("set_properties", [{"siid": 2, "piid": 1, "did": "state", "value": state}])
    print(f"Gosund插座已{'打开' if state else '关闭'}")

# 解析命令行参数
parser = argparse.ArgumentParser(description='Battery Control')
parser.add_argument('-on', action='store_true', help='打开插座')
parser.add_argument('-off', action='store_true', help='关闭插座')
parser.add_argument('-start', action='store_true', help='开始自动检测触发开关服务')
parser.add_argument('-test', action='store_true', help='测试打开和关闭')
args = parser.parse_args()


if args.on:
    toggle_gosund_plug(ip, token, True)  # 打开插座
elif args.off:
    toggle_gosund_plug(ip, token, False)  # 关闭插座
elif args.test:
        print("正在尝试打开插座...")
        toggle_gosund_plug(ip, token, True)  # 打开插座
        time.sleep(3)
  
        print("正在尝试关闭插座...")
        toggle_gosund_plug(ip, token, False)  # 关闭插座
        time.sleep(3)
  
        print("正在尝试termux-api命令 termux-battery-status...")
        battery_data = get_battery_info()
        print("当前电池信息:")
        print(f"电量:{battery_data['level']}%")
        print(f"温度:{battery_data['temperature']}°C")
elif args.start:
    battery_low_threshold = 50  # 电池电量低于此阈值时,打开插座
    battery_high_threshold = 90  # 电池电量高于此阈值时,关闭插座
    temperature_threshold = 40  # 电池温度高于此阈值时,关闭插座
    
    print("开始自动检测并开关服务...")
    # 运行自动开关逻辑
    while True:
        battery_data = get_battery_info()
        battery_level = battery_data['level']
        battery_temp = battery_data['temperature']

        if battery_level < battery_low_threshold:
            print("当前电量低于{battery_low_threshold},打开插座")
            toggle_gosund_plug(ip, token, True)  # 打开插座
        elif battery_level > battery_high_threshold or battery_temp > temperature_threshold:
            print("当前电量高于{battery_high_threshold},或温度高于{temperature_threshold},关闭插座")
            toggle_gosund_plug(ip, token, False)  # 关闭插座

        time.sleep(60)  # 每隔60秒检查一次电池电量和温度
else:
    parser.print_help()

代码已经托管在github 使用wget下载

wget https://raw.githubusercontent.com/geekplayers/termux-install-typecho-wordpress/main/battery_control.py  #wget下载

python battery_control.py #默认获取命令教程

#加入参数
python battery_control.py -start   #自动检测温度控制
python battery_control.py -on      #单独打开插座

python battery_control.py -off     #单独关闭插座

python battery_control.py -help    #使用命令教程

注意运行前填入你插座ip token,修改温度阈值,并在同一局域网

pkg intall termux-api

参考

插座控制指令:
https://github.com/balistof/miio-dreame-vacuum-mqtt/blob/56c75d4f9926b087f96fae74d7dcae4babab9fda/miio/gosund_plug.py

分类: 网络工具搞机 标签: 暂无标签

评论

暂无评论数据

暂无评论数据

目录