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

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

[新奇玩法] (多个)蓝牙网关 TTL->MQTT,支持任意米家蓝牙设备接入HA/NR

  [复制链接]

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11435
金钱
8504
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-7-31 20:45:39 | 显示全部楼层
本帖最后由 XCray 于 2020-8-1 08:30 编辑
dscao 发表于 2020-7-30 17:42
今天发现个问题,换了MQTT服务器的IP后,重新配置 MQTT服务器的IP总是改不过来。清除wifi配置后再设置或者 ...

OTA不会清除之前保存的设置,哪怕之前是用其他固件设置的,OTA也不会清除。

一般情况下,线刷会清除掉所有设置(其实是线刷前会自动擦除整个flash)。
如果我碰到你说的这种情况,我更倾向于线刷一遍(毕竟折腾wifi信号动静太大,牵涉到太多的东西)
回复

使用道具 举报

3

主题

84

帖子

2134

积分

金牌会员

Rank: 6Rank: 6

积分
2134
金钱
2050
HASS币
0
发表于 2020-8-2 09:48:10 | 显示全部楼层
XCray 发表于 2020-7-31 20:38
两天没来论坛,好几个朋友问问题啊。
~~~~~~~~~~~~~~~~~~~~~~~~~

绿米的N100门锁,我给你看下开关门NR接收到的信息。
topic: "mqttl/1011358567/11"
payload: "5f26199900000000a4"
qos: 0
retain: false
_msgid: "7c2ef6cf.085028"
====================
topic: "mqttl/1011358567/7"
payload: "5f26199900"
qos: 0
retain: false
_msgid: "56262c2d.00de24"
=================
topic: "mqttl/1011358567/7"
payload: "5f26199d01"
qos: 0
retain: false
_msgid: "94e83f42.524eb"
=================
以上三条是从室内开关门后出现的。
payload里的格式要求进行逆序调整?然后解析字符串么,解析后要怎么对照
回复

使用道具 举报

3

主题

84

帖子

2134

积分

金牌会员

Rank: 6Rank: 6

积分
2134
金钱
2050
HASS币
0
发表于 2020-8-2 09:53:10 | 显示全部楼层
siri10086 发表于 2020-8-2 09:48
绿米的N100门锁,我给你看下开关门NR接收到的信息。
topic: "mqttl/1011358567/11"
payload: "5f261999000 ...

我之前刷的一个用的是下面来解析门锁的,因为不稳定,就换成这个。做了逆序调整然后解析也对照不起来。
let mac = msg.payload.dev.mac;
let eid = msg.payload.evt[0].eid;
let edata = msg.payload.evt[0].edata;
let state, method, action, key_id, arert, bolt_state, battery;
let edata1, edata2, edata3;
let time = new Date().Format("yyyy年MM月dd日hh:mm:ss")

msg = {
    payload: {}
}

if (eid === 7 || eid === 11 || eid === 4106 || eid === 4110) {
    if (eid === 7) {
        edata = edata.substring(0, 2);
        state = parseInt(edata, 16);
        switch (state) {
            case 0:
                state = "开门";
                break;
            case 1:
                state = "关门";
                break;
            case 2:
                state = "超时未关门";
                break;
            case 3:
                state = "敲门";
                break;
            case 4:
                state = "撬门";
                break;
            case 5:
                state = "门卡住";
                break;
        }

        msg.payload.state = state;
        msg.payload.time = time;
        msg.topic = "bt/" + mac + "/state"
        return msg;
    }

    if (eid === 11) {
        edata1 = edata.substring(0, 1);
        edata2 = edata.substring(1, 2);
        edata3 = edata.substring(2, 10);

        method = parseInt(edata1, 16);
        action = parseInt(edata2, 16);

        switch (method) {
            case 0:
                method = "蓝牙";
                break;
            case 1:
                method = "密码";
                break;
            case 2:
                method = "指纹";
                break;
            case 3:
                method = "应急钥匙";
                break;
            case 4:
                method = "转盘方式";
                break;
            case 5:
                method = "NFC";
                break;
            case 6:
                method = "一次性密码";
                break;
            case 7:
                method = "双重验证";
                break;
            case 10:
                method = "人工";
                break;
            case 11:
                method = "自动";
                break;
            case 15:
                method = "异常";
                break;
        }
        switch (action) {
            case 0:
                action = "开门";
                break;
            case 1:
                action = "上提把手锁门";
                break;
            case 2:
                action = "反锁";
                break;
            case 3:
                action = "解除反锁";
                break;
            case 4:
                action = "室内开门";
                break;
            case 5:
                action = "门内上锁";
                break;
            case 6:
                action = "开启童锁";
                break;
            case 7:
                action = "关闭童锁";
                break;
            case 15:
                action = "异常";
                break;
        }
        if (
            edata3.substring(2, 8) === "00dec0" ||
            edata3.substring(2, 8) === "10dec0"
        ) {
            edata4 = edata3.substring(1, 2);
            arert = parseInt(edata4, 16);
            if (edata3.substring(2, 8) === "00dec0") {
                switch (arert) {
                    case 0:
                        arert = "密码多次验证失败";
                        break;
                    case 1:
                        arert = "指纹多次验证失败";
                        break;
                    case 2:
                        arert = "密码输入超时";
                        break;
                    case 3:
                        arert = "撬锁";
                        break;
                    case 4:
                        arert = "重置按键按下";
                        break;
                    case 5:
                        arert = "有人撬锁或钥匙未拔"; /////钥匙频繁开锁
                        break;
                    case 6:
                        arert = "钥匙孔异物";
                        break;
                    case 7:
                        arert = "钥匙未取出";
                        break;
                    case 8:
                        arert = "NFC设备多次验证失败";
                        break;
                    case 9:
                        arert = "超时未按要求上锁";
                        break;
                }
            } else {
                switch (arert) {
                    case 0:
                        arert = "电量低于10%";
                        break;
                    case 1:
                        arert = "电量低于5%";
                        break;
                    case 2:
                        arert = "指纹传感器异常";
                        break;
                }
            }
            
            msg.payload.arert = arert;
            msg.payload.time = time;
        } else {
            key_id = edata3;
            ///////00000000管理员密码;0a000(1/2)80:0a为第几个密码(指纹+密码),180为指纹,280为密码;00000280一次性密码
            msg.payload.event = method + action;
            msg.payload.time = time;
            if (key_id !== "ffffffff") {
                switch (key_id) {
                    case "00000000":
                        key = "我";
                        break;
                    case "08000180":
                        key = "我的右手拇指";
                        break;
                    case "03000180":
                        key = "我的左手拇指";
                        break;
                    case "01000280":
                        key = "我的管理员密码";
                        break;   
                    case "0400280":
                        key = "客人";
                        break;
                    default:
                        key = key_id;
                        break;
                }
            }
            msg.payload.key = key;
        }
        msg.topic = "bt/" + mac + "/event"
        return msg;
    }
   
    if (eid === 4106) {
        edata = edata.substring(0, 2);
        battery = parseInt(edata, 16);

        msg.payload.battery = battery;
        msg.topic = "bt/" + mac + "/battery"
        return msg;
    }

    if (eid === 4110) {
        bolt_state = parseInt(edata, 16);
        switch (bolt_state) {
            case 0:
                bolt_state = "所有锁舌收回";
                break;
            case 4:
                bolt_state = "斜舌弹出";
                break;
            case 5:
                bolt_state = "方舌/斜舌弹出";
                break;
            case 6:
                bolt_state = "呆舌/斜舌弹出";
                break;
            case 7:
                bolt_state = "所有锁舌弹出";
                break;
        }
        
        msg.payload.bolt = bolt_state;
        msg.topic = "bt/" + mac + "/bolt"
        return msg;
    }
}
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11435
金钱
8504
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-8-2 11:22:08 | 显示全部楼层
本帖最后由 XCray 于 2020-8-2 14:38 编辑
siri10086 发表于 2020-8-2 09:48
绿米的N100门锁,我给你看下开关门NR接收到的信息。
topic: "mqttl/1011358567/11"
payload: "5f261999000 ...

其实解析真的不难。

第一条,前面已经分析过了,不妨再仔细说说。

topic最后一段对应的是eid(事件id),这里就是11,根据经验(以及文档),这个就是“锁事件”;payload前面8位是时间戳,5f261999转换成10进制是1596332441,再转换成人类可读的格式,就是“2020-08-02 09:40:41”(你这是刚刚测试的啊~)。
后面的八个0是keyid的位置,最后的“a4”是“操作”的位置,这里a4代表的就是“人工操作、门内开锁”。因为只是门内转把手,所以也就没有具体的KeyID了,所以keyid那儿就只是一串0;

第二条和第三条,eid=7,根据经验和文档,这个是“门事件”。
前面8位仍然是时间戳,第二条的时间戳和第一条是一样的,第三条就是最后一位由9变成了d,也就是说,你开门操作后4秒。
第二条和第三条最后的“00”和“01”,分别代表“开门”和“关门”。

很显然,室内开门后4秒你又把门关上了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
对了,你83楼贴的那一大堆代码现在没啥意义了,那是之前的思路(在esp的程序里进行解析判断)。
回复

使用道具 举报

4

主题

224

帖子

1302

积分

金牌会员

Rank: 6Rank: 6

积分
1302
金钱
1078
HASS币
0
发表于 2020-8-2 21:24:49 | 显示全部楼层
感谢大佬分享
回复

使用道具 举报

3

主题

84

帖子

2134

积分

金牌会员

Rank: 6Rank: 6

积分
2134
金钱
2050
HASS币
0
发表于 2020-8-3 09:35:35 | 显示全部楼层
XCray 发表于 2020-8-2 11:22
其实解析真的不难。

第一条,前面已经分析过了,不妨再仔细说说。

好的 非常感谢 讲解的很详细。文档方便贴一个嘛
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11435
金钱
8504
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-8-3 16:26:23 | 显示全部楼层
siri10086 发表于 2020-8-3 09:35
好的 非常感谢 讲解的很详细。文档方便贴一个嘛

就是小米的官网,iot.mi.com,具体来说,https://iot.mi.com/new/doc/embed ... e/object-definition 这个链接和这个帖子关联最大
回复

使用道具 举报

0

主题

19

帖子

116

积分

注册会员

Rank: 2

积分
116
金钱
97
HASS币
0
发表于 2020-8-3 17:15:17 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

0

主题

19

帖子

116

积分

注册会员

Rank: 2

积分
116
金钱
97
HASS币
0
发表于 2020-8-3 17:17:40 | 显示全部楼层
厉害了,学习一下
回复

使用道具 举报

3

主题

84

帖子

2134

积分

金牌会员

Rank: 6Rank: 6

积分
2134
金钱
2050
HASS币
0
发表于 2020-8-3 17:52:05 | 显示全部楼层
XCray 发表于 2020-8-3 16:26
就是小米的官网,iot.mi.com,具体来说,https://iot.mi.com/new/doc/embedded-development/ble/object-d ...

好的 非常感谢
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-20 01:31 , Processed in 0.074487 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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