『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
楼主: omegaojian

[插件集成] 小白手撕Panasonic Smart China 松下新风WIFI成功接入HA

  [复制链接]

0

主题

11

帖子

254

积分

中级会员

Rank: 3Rank: 3

积分
254
金钱
243
HASS币
0
发表于 2024-9-19 23:58:57 | 显示全部楼层
arthurfsy 发表于 2024-9-19 14:51
我在2年前找了大佬要了登录PJ算法,也通过NR实现登录这一部分的功能,但是后面不了了之今天(2024/09/19) ...

有用的,登陆完全没问题,但是第二个问题依然存在,每台设备还对应了一个设备token,还是不知道生成算法是啥,看代码估计也是比较恶心的重复加密

下面是python3的登陆实现

import hashlib
import requests
import json
import time

usrId = "xxx"
password = "xxx"
token_start = None
token_final = None
usrId_final = None
ssId = None
realFamilyId = None
familyId = None
deviceId1 = None
deviceId2 = None

headers = {
    'User-Agent': 'SmartApp',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Host': 'app.psmartcloud.com'
}


# 获取初始Token
def get_initial_token():
    global usrId, token_start
    url = "https://app.psmartcloud.com/App/UsrGetToken"
    payload = json.dumps({
        "id": 4,
        "uiVersion": 4.0,
        "params": {"usrId": usrId}
    })
    response = requests.post(url, headers=headers, data=payload, verify=False)
    data = response.json()
    token_start = data['results']['token']
    return token_start

# 获取密码MD5
def get_password_md5(password):
    return hashlib.md5(password.encode()).hexdigest().upper()

# 生成最终Token
def generate_final_token(password_md5):
    global usrId, token_start, token_final
    intermediate_md5 = hashlib.md5((password_md5 + usrId).encode()).hexdigest().upper()
    final_md5 = hashlib.md5((intermediate_md5 + token_start).encode()).hexdigest().upper()
    token_final = final_md5
    print(token_final)
    return token_final

# 登录并获取主要参数
def login_and_get_params():
    global usrId, token_final, usrId_final, ssId, realFamilyId, familyId
    url = "https://app.psmartcloud.com/App/UsrLogin"
    payload = json.dumps({
        "id": 5,
        "uiVersion": 4.0,
        "params": {
            "telId": "02:00:00:00:00:00",
            "checkFailCount": 1,
            "usrId": usrId,
            "pwd": token_final
        }
    })
    response = requests.post(url, headers=headers, data=payload, verify=False)
    data = response.json()
    # 检查是否登陆成功
    print(data)
    usrId_final = data['results']['usrId']
    ssId = data['results']['ssId']
    realFamilyId = data['results']['realFamilyId']
    familyId = data['results']['familyId']

# 获取绑定设备信息
def get_bind_device_info():
    global ssId, usrId_final, realFamilyId, familyId, deviceId1, deviceId2
    url = "https://app.psmartcloud.com/App/UsrGetBindDevInfo"
    headers_with_cookie = headers.copy()
    headers_with_cookie['Cookie'] = f"SSID={ssId}"
    payload = json.dumps({
        "id": 5,
        "uiVersion": 4.0,
        "params": {
            "realFamilyId": realFamilyId,
            "familyId": familyId,
            "usrId": usrId_final
        }
    })
    response = requests.post(url, headers=headers_with_cookie, data=payload, verify=False)
    data = response.json()
    print(data)
    dev_list = data['results']['devList']
    deviceId1 = dev_list[0]['deviceId']
    return dev_list

# 设置设备状态
def set_device_status(device_id, usr_id, token, params):
    url = "https://app.psmartcloud.com/App/ACDevGetStatusInfoAW"
    headers_with_cookie = headers.copy()
    headers_with_cookie['Cookie'] = f"SSID={ssId}"
    payload = {
        "id": 1, 
        "uiVersion": 4.0, 
        "deviceId": device_id,
        "usrId": usr_id,
        "token": token
    }
    response = requests.post(url, headers=headers_with_cookie, json=payload, verify=False)
    return response.json()

def main():
    global usrId, password
    token_start = get_initial_token()
    password_md5 = get_password_md5(password)
    generate_final_token(password_md5)
    login_and_get_params()
    device_info = get_bind_device_info()
    # 编辑params中的指令
    # 还需要设备对应token的加密算法,替换掉token_final
    print(set_device_status(deviceId1, usrId_final, token_final, {"your": "params"}))

if __name__ == "__main__":
    main()
回复

使用道具 举报

7

主题

166

帖子

1302

积分

论坛技术达人

积分
1302
金钱
1131
HASS币
60
发表于 2024-9-20 09:56:09 | 显示全部楼层
设备token是“通过deviceid进行sha512循环位与”计算得到的,但是当时大佬没有提供写法  是帮我直接算出来了,我后面琢磨琢磨怎么得到
回复

使用道具 举报

0

主题

16

帖子

115

积分

注册会员

Rank: 2

积分
115
金钱
99
HASS币
0
发表于 2024-10-6 23:56:27 | 显示全部楼层
我的空调是松下洵风系列,测试下来(可能是版本问题)空调开关的指令和上述同学的不一致,供大家参考:
1)输出空调指令URL为:https://app.psmartcloud.com/App/ACDevSetStatusNewProtocol
2)常用指令集为:
运行模式runMode = 66【制冷】,67【制热】,68【除湿】
运行状态(开关机)runStatus = 48【开机】,49【关机】
设置温度setTemperature = xxx 【设置温度为摄氏度,如25】
风量 windSet = xxx 【见下表】
自动 = 65
风量20% = 49
风量40% = 50
风量60% = 52
风量80% = 54
风量100% = 55

水平扫风orientationWindSet =  xxx 【见下表】
自动 = 64
左右1 = 66
左右2 = 108
左右3 = 67
左右4 = 87
左右5 = 65

上下扫风portraitWindSet =  xxx 【见下表】
自动 = 70
方向1 = 65
方向2 = 68
方向3 = 67
方向4 = 69
方向5 = 66

睡眠模式 sleep= 1 【打开睡眠模式】,0【关闭睡眠模式】
指示灯 lamp= 1【指示灯打开】,0【指示灯关闭】
回复

使用道具 举报

1

主题

53

帖子

196

积分

注册会员

Rank: 2

积分
196
金钱
143
HASS币
0
发表于 2024-10-11 20:59:33 | 显示全部楼层
松下壁挂新风。做个标记。有时间尝试一下。
回复

使用道具 举报

0

主题

30

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
金钱
404
HASS币
0
发表于 2024-10-17 17:22:13 | 显示全部楼层
感谢楼主做的贡献,两年了,希望有大佬能能接手写个插件
回复

使用道具 举报

0

主题

16

帖子

115

积分

注册会员

Rank: 2

积分
115
金钱
99
HASS币
0
发表于 2024-11-2 17:06:05 | 显示全部楼层
根据上述前人的成果,稍微修改了一下,在HA里实现了对空调的初步控制
Untitled.png
回复

使用道具 举报

0

主题

16

帖子

115

积分

注册会员

Rank: 2

积分
115
金钱
99
HASS币
0
发表于 2024-11-2 17:07:28 | 显示全部楼层
我的空调支持制冷、制热、除湿,响应的用Python实现了HA和Panasonic Smart App的数据交换(中间使用了MQTT,大大的简化了代码编写)
回复

使用道具 举报

0

主题

16

帖子

115

积分

注册会员

Rank: 2

积分
115
金钱
99
HASS币
0
发表于 2024-11-6 23:42:34 | 显示全部楼层
总共5个空调全部搞定
111.png
回复

使用道具 举报

1

主题

20

帖子

90

积分

注册会员

Rank: 2

积分
90
金钱
70
HASS币
0
发表于 2024-11-9 21:35:30 | 显示全部楼层
凡不了 发表于 2024-11-2 17:07
我的空调支持制冷、制热、除湿,响应的用Python实现了HA和Panasonic Smart App的数据交换(中间使用了MQTT ...

大佬,想有偿请教Panasonic Smart App对接的方法,抓包吗,basicfu
回复

使用道具 举报

0

主题

16

帖子

115

积分

注册会员

Rank: 2

积分
115
金钱
99
HASS币
0
发表于 2024-11-10 00:55:07 | 显示全部楼层
basicfu 发表于 2024-11-9 21:35
大佬,想有偿请教Panasonic Smart App对接的方法,抓包吗,basicfu

是的,这里面有2个问题:1)怎么从自己的用户名+密码,计算出SSID(就是cookie里面用的),这个前面已经有大佬破解了,我是直接抄的代码;2)根据每一个设备号(DeviceId),计算操作设备的Token,这一个现在还没法自己计算,我也是抓包的。

有了这2个,就解决了最核心的问题,然后就是用代码把数据和设备连接起来(上面的坛友用commandline来模拟空调的ON、OFF功能,我是扩展了一下,把常用操控功能(比如运行模式、风量大小、扫风模式等等)给做出来了,取之于民,用之于民,我稍后会把完整的实现贴出来。

反正,这里面核心的核心,就是DeviceId到Device Token的转换,这个目前只能抓包。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-21 20:48 , Processed in 1.905870 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表