找回密码
 立即注册
查看: 486|回复: 3

[经验分享] 智灵开门接入homeassistant|更新nodered

[复制链接]

5

主题

82

回帖

665

积分

论坛积极会员

积分
665
金钱
578
HASS币
0
发表于 2025-2-6 20:51:04 | 显示全部楼层 |阅读模式
本帖最后由 mozzie 于 2025-2-7 15:10 编辑

  • 引言

家里有个门禁,用的智灵开门进行远程控制,最近打算从AppStore下载app发现已经下架了,咨询了卖家得知该品牌已经倒闭了,服务器还不知道哪天就停了,于是就萌生了部署到本地的想法。

  • 实现过程

物联网设备多数通过mqtt服务连接到服务器,前期路由器抓包得到了所需的topic和服务器地址,但是没有获取到认证信息。后来抱着试试看的想法把打开了 http://www.jyyltech.com:8080/jyapi/居然打开了WEB端,也顺利的获取到了所需信息。

  • 数据分析

网页源码截取:

function connect(userid){
            var hostname = "47.100.xx.xxx";
            var port = 8083;
            var clientId = "pcc_"+userid;
            var path = "";
            var user = window.appId; //网页源码内直接写好了
            var pass = window.appSecrit;//网页源码内直接写好了
            var keepAlive = 120;
            var timeout = 3;
            var tls = false;
            var cleanSession = true;
            var lastWillTopic = "";
            var lastWillQos = 0;
            var lastWillRetain = false;
            var lastWillMessage = "";

<script type="text/javascript">
        window.userid = "";
        window.productId = "";
        window.userpass = "";
        window.appId="明文appid"; //对应上面的user
        window.appSecrit="明文appSecri";//对应上面的pass
        window.wxappId="明文";
        window.deviceType = "明文"
        window.mgId = "";
        window.userStart = 0;
</script

function creatMsgId(){ //消息ID,取随机数,经测试固定ID也没关系。
                var messageRandomId = 0;
                messageRandomId = Math.random()*999999 + 800;
                messageRandomId = parseInt(messageRandomId, 10);
                return messageRandomId;
        }
function deviceopenlock(deviceId){
                subscribe(deviceId);
                msgId = creatMsgId();
                var msg_body_json ={
                                "id":window.userid //智灵开门登录手机号
                }
                var jsondata = {
                                "msg_id" :msgId,  
                                "msg_type":"set",
                                "ablity":"open",
                                "body":msg_body_json
                };

分析网页源码获取到了MQTT服务器、用户名和密码,window.appId、window.appSecrit都是以明文形式写死在index.html?Token=​这个文件内的。至此,我们获取到了mqtt所需的全部信息。

MQTT服务器:47.100.xx.xxx

MQTT端口:8083

MQTT用户名:明文appid

MQTT密码:明文appSecri

发送主题:`/dev/a/"+window.productId+"/"+deviceid.split(";")[2];`(调试工具终端内可以直接查看)

订阅主题:`"/usr/a/"+window.productId+"/"+deviceid.split(";")[2];`(调试工具终端内可以直接查看)


开锁命令:
`{"msg_id":701234,"msg_type":"set","ablity":"open","body":{"code":1,"msg":"reset","data":""}}`

  • 设备接入homeassistant

设备管理内添加mqtt服务器

编辑configuration.yaml​

mqtt:

  sensor:
    - name: "Lock Open Status" #创建传感器,用于监测门锁状态
      state_topic: "/usr/a/xxxxxxxx/xxxxxxx"  #订阅主题
      value_template: >-
        {% if value_json.body.msg == "ok" %}   #判断收到的消息,如果返回ok即代表开锁成功
          Open Success
        {% else %}
          Closed
        {% endif %}
      qos: 0

  lock:
    - name: "门锁"
      unique_id: "xxxxxxxx"  # 确保每个设备都有唯一的ID
      command_topic: "/dev/a/xxxxxx/xxxxxxx"
      state_topic: "/usr/a/xxxxxx/xxxxxxx"
      value_template: >-
        {% if value_json.body.msg == "ok" %}
          unlocked
        {% else %}
          locked
        {% endif %}
      qos: 1
      optimistic: false
      payload_unlock: '{"msg_id":701234,"msg_type":"set","ablity":"open","body":{"id":"xxxxxxxxx"}}'
      state_locked: "locked"
      state_unlocked: "unlocked"

automation:
  - alias: "Reset Lock Open Status After 30 Seconds" #自动刷新门锁状态
    trigger:
      platform: state
      entity_id: sensor.lock_open_status
      to: 'Open Success'
    action:
      - delay: 00:00:30
      - service: mqtt.publish
        data:
          topic: "/usr/a/xxxxxx/xxxxxxxx"
          payload: '{"body":{"msg":"reset"}}'

至此,设备接入homeassistant完成。
20250707更新:
因为homeassistant限制只能连接一个MQTT服务器,不少人本身已经有业务在跑了,也就导致了没办法按照这个流程来走了,这时候我们可以通过NodeRed来实现。

实现过程:
1、上述流程保持不变,但不需要连接新的MQTTT服务器
2、nodered下,连接两个MQTT服务器,分别是本机MQTT和远程MQTT服务
3、画四个MQTT节点如下:
MQTT out节点 连接远程服务器,主题为/dev/xxxxxxx
MQTT In节点 连接本机服务器,主题同上。
上述两个节点相连
MQTT out节点 连接本地服务器,主题为/usr/a/xxxxxx
MQTT in节点 连接远程服务器,主题同上
上述两个节点相连
示例.png
回复

使用道具 举报

14

主题

1533

回帖

4980

积分

论坛元老

积分
4980
金钱
3433
HASS币
0
发表于 2025-2-6 22:30:43 | 显示全部楼层
ha里的mqtt服务器设置在哪儿搞的?又或者你只搞了这一个mqtt设备?
回复

使用道具 举报

5

主题

82

回帖

665

积分

论坛积极会员

积分
665
金钱
578
HASS币
0
 楼主| 发表于 2025-2-7 11:44:23 | 显示全部楼层
隔壁的王叔叔 发表于 2025-2-6 22:30
ha里的mqtt服务器设置在哪儿搞的?又或者你只搞了这一个mqtt设备?

这个单独连一个mqtt服务器,如果多个mqtt设备的话,可以用nodered接入
回复

使用道具 举报

14

主题

1533

回帖

4980

积分

论坛元老

积分
4980
金钱
3433
HASS币
0
发表于 2025-2-7 13:50:38 | 显示全部楼层
mozzie 发表于 2025-2-7 11:44
这个单独连一个mqtt服务器,如果多个mqtt设备的话,可以用nodered接入

哦,明白了,谢谢
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2025-5-5 00:48 , Processed in 0.087231 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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