文件预览

get_current_threshold.py

查看 jf-open-pro-device-battery-manage 技能包中的文件内容。

文件内容

scripts/get_current_threshold.py

#!/usr/bin/env python3
"""
查询设备当前低电量阈值(开发版)

API: POST /gwp/v3/rtc/device/getconfig/{deviceToken}
Name: Ability.AovAbility
"""

import os
import sys
import requests

# 导入加密工具
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
try:
    from crypto import get_time_millis, generate_signature
except ImportError:
    print("❌ 错误:找不到 crypto.py 模块")
    sys.exit(1)


def get_headers(uuid: str, app_key: str, app_secret: str, move_card: int) -> dict:
    """生成请求头"""
    time_millis = get_time_millis()
    signature = generate_signature(uuid, app_key, app_secret, time_millis, move_card)
    
    return {
        "Content-Type": "application/json; charset=UTF-8",
        "uuid": uuid,
        "appKey": app_key,
        "timeMillis": time_millis,
        "signature": signature,
        "X-Request-Id": os.urandom(16).hex()
    }


def get_current_threshold(device_token: str, uuid: str, app_key: str, app_secret: str, move_card: int, endpoint: str):
    """
    获取当前低电量阈值
    
    API: POST /gwp/v3/rtc/device/getconfig/{deviceToken}
    Name: Dev.LowElectrMode
    
    官方文档:https://docs.jftech.com/docs?menusId=54582398fd8d4248962354e92ac2e47a&siderId=9bf993f3140ad9f9b4390fee750ba740&lang=zh
    """
    base_url = f"https://{endpoint}/gwp/v3"
    url = f"{base_url}/rtc/device/getconfig/{device_token}"
    headers = get_headers(uuid, app_key, app_secret, move_card)
    
    body = {
        "Name": "Dev.LowElectrMode"
    }
    
    response = requests.post(url, headers=headers, json=body, timeout=30)
    result = response.json()
    
    if result.get("code") == 2000:
        data = result.get("data", {})
        low_elect_mode = data.get("Dev.LowElectrMode", {})
        return {
            "PowerThreshold": low_elect_mode.get("PowerThreshold"),
            "LowElectrMin": low_elect_mode.get("LowElectrMin"),
            "LowElectrMax": low_elect_mode.get("LowElectrMax")
        }
    else:
        raise RuntimeError(f"查询失败:{result.get('msg', '未知错误')}")


if __name__ == "__main__":
    import argparse
    
    parser = argparse.ArgumentParser(description="查询当前低电量阈值")
    parser.add_argument("--device-sn", required=True, help="设备序列号")
    parser.add_argument("--device-token", required=True, help="设备 Token")
    parser.add_argument("--uuid", default=os.getenv("JF_UUID"), help="开放平台用户 uuid")
    parser.add_argument("--app-key", default=os.getenv("JF_APP_KEY"), help="应用 appKey")
    parser.add_argument("--app-secret", default=os.getenv("JF_APP_SECRET"), help="应用密钥")
    parser.add_argument("--move-card", type=int, default=os.getenv("JF_MOVE_CARD", "2"), help="移动卡标识")
    parser.add_argument("--endpoint", default=os.getenv("JF_ENDPOINT", "api-cn.jftechws.com"), help="API 接入地址")
    
    args = parser.parse_args()
    
    # 验证必需参数
    if not args.uuid:
        print("❌ 错误:缺少 --uuid 或 JF_UUID 环境变量")
        sys.exit(1)
    if not args.app_key:
        print("❌ 错误:缺少 --app-key 或 JF_APP_KEY 环境变量")
        sys.exit(1)
    if not args.app_secret:
        print("❌ 错误:缺少 --app-secret 或 JF_APP_SECRET 环境变量")
        sys.exit(1)
    
    try:
        print(f"正在查询设备 {args.device_sn} 的当前低电量阈值...")
        print()
        
        result = get_current_threshold(
            device_token=args.device_token,
            uuid=args.uuid,
            app_key=args.app_key,
            app_secret=args.app_secret,
            move_card=args.move_card,
            endpoint=args.endpoint
        )
        
        print("✅ 查询成功")
        print()
        print("设备信息:")
        print(f"  设备:{args.device_sn}")
        if result['PowerThreshold'] is not None:
            print(f"  当前阈值:{result['PowerThreshold']}%")
        else:
            print(f"  当前阈值:未设置")
        print(f"  最小阈值:{result['LowElectrMin']}%")
        print(f"  最大阈值:{result['LowElectrMax']}%")
        print()
        print(f"💡 提示:设置阈值时请在 {result['LowElectrMin']}% ~ {result['LowElectrMax']}% 范围内")
        
    except RuntimeError as e:
        print(f"❌ 错误:{e}")
        sys.exit(1)