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

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

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

  [复制链接]

10

主题

140

帖子

649

积分

论坛积极会员

积分
649
金钱
509
HASS币
0
发表于 2020-7-17 14:23:20 | 显示全部楼层
米家门锁能接上不?
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24293
金钱
22862
HASS币
290
发表于 2020-7-17 14:56:22 | 显示全部楼层
本帖最后由 dscao 于 2020-7-17 15:02 编辑

我用原版加你的代码修改的,配网后如果全部正确就没什么问题。如果mqtt服务器是关闭的或什么原因连不上就导致系统ota及telnet都没反应。
之后修改了一处,没反应变成有反应,只是慢一点,但至少能操作了。

bool mqtt_reconnect() {
    if (!mqtt_client.connected()) {    //while改为if ,调用的地方本身就一直循环检测了,这里应该不需要再循环了。
        if (mqtt_client.connect(HOSTNAME, MQTT_USER, MQTT_PASS)) {
            Serial.println(F("MQTT connected!"));
            mqtt_client.publish("mqttl/status", "alive");
            //mqtt_client.subscribe("mqttl/set");
            //delay(5000);
            //break;//防止配网后陷入发布alive的死循环
        }
        else {
            Serial.print(F("MQTT Connection failed: rc="));
            Serial.println(mqtt_client.state());
            Serial.println(F(" Retrying in 5 seconds"));
            delay(5000);
        }
    }
    return true;
}


    ……


可以试试看效果怎样,我还不太会怎么调试消息。

我的情况是消息太少了,有时以为是不是坏了,一点动静都没有。蓝牙温湿计上报时间间隔太久了,只好加入其它消息,用遥控器操作操作以显示点消息,好让我知道它在工作。今天编译+ota了几十次了,先这样了。后续再学习或请教 yaml 中的配置。
15.jpg

回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24293
金钱
22862
HASS币
290
发表于 2020-7-17 15:05:24 | 显示全部楼层
kite3721 发表于 2020-7-17 14:23
米家门锁能接上不?

我认为此方案原理肯定能接上,如果锁的参数不一样可能需要自己查锁的pid和eid,所以还是保留了telnet或mqssl/json的输出。
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-7-17 17:33:32 | 显示全部楼层
kite3721 发表于 2020-7-17 14:23
米家门锁能接上不?

你这有明知故问的嫌疑啊?

都说过了,适应米家所有蓝牙设备(只要它能连接蓝牙网关)。

当然,需要自己动手在ha侧编辑yaml配置,米家门锁可参考killadm大神提供的yaml修改。

或者和任意蓝牙设备一样,收集mqtt消息和debug消息(json),结合官方文档和自己的需要即可编辑yaml了。

有问题具体讨论
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-7-17 17:37:59 | 显示全部楼层
本帖最后由 XCray 于 2020-7-17 18:03 编辑
dscao 发表于 2020-7-17 14:56
我用原版加你的代码修改的,配网后如果全部正确就没什么问题。如果mqtt服务器是关闭的或什么原因连不上就导 ...

我搞清楚之前碰到的问题了。

本来想稳妥,原来的esp-01s保持正常工作(刷入wifi硬编码的固件),用另一个esp-01s刷入通用固件进行测试。没想到这两个模块连接mqtt时使用的clientid是一样的,导致连接被反复中断然后俩模块都玩命重连。。。

你现在只有蓝牙温湿度计?这个东西消息确实非常少,报告频率很低,比花花草草都低得多。

除了蓝牙事件,其他消息的格式之类的需要另行研究
回复

使用道具 举报

1

主题

16

帖子

292

积分

中级会员

Rank: 3Rank: 3

积分
292
金钱
276
HASS币
0
发表于 2020-7-17 23:41:23 | 显示全部楼层
楼主能不能做个刷好的提供购买啊
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-7-18 06:25:08 | 显示全部楼层
本帖最后由 XCray 于 2020-7-18 07:18 编辑
lustlost 发表于 2020-7-17 23:41
楼主能不能做个刷好的提供购买啊

我不是商家,只是自己喜欢玩。没有从商经验,更没有电商经验,倒是在网上卖过几样个人闲置出二手的东西(咸鱼,应该不超过10件)。。。

你说的这事儿理论上没问题,但实际操作可行性似乎不大。

模块网上我能找到的最便宜又非常可靠的货源,5.3/个,运费6元/次,一次买多个的话能再省点儿运费。

软件、工具、刷写方法都是公开的,不宜收费也没想收费。

发货,这个是最大的问题。我印象中发快递最低是12元/单。

这东西需求量不可能太大,怎么看都是免费给快递公司打工了。

哪位有这方面的经验或资源,倒是可以尝试。
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24293
金钱
22862
HASS币
290
发表于 2020-7-18 12:34:16 | 显示全部楼层
在你的基础上再作个改进:

bool mqtt_reconnect() {
    String mqttlname = HOSTNAME + String(ESP.getChipId()).substring(0, 4);
    while (!mqtt_client.connected()) {
        if (mqtt_client.connect(mqttlname.c_str(), MQTT_USER, MQTT_PASS)) {
            Serial.println(F("MQTT connected!"));
            mqtt_client.publish("mqttl/status", "alive");
            //mqtt_client.subscribe("mqttl/set");
            delay(5000);
            break;//防止配网后陷入发布alive的死循环
        }
        else {
            Serial.print(F("MQTT Connection failed: rc="));
            Serial.println(mqtt_client.state());
            Serial.println(F(" Retrying in 5 seconds"));
            delay(5000);
        }
    }
    return true;
}

这样每个芯片不同,clientid就不同了,仿热点名后缀的。
16.jpg
通用性越来越强了,这样家里同一台服务器可以服务多个网关设备了。
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-7-18 14:08:19 | 显示全部楼层
本帖最后由 XCray 于 2020-7-18 14:30 编辑
dscao 发表于 2020-7-18 12:34
在你的基础上再作个改进:

bool mqtt_reconnect() {

哈哈,想到一起了!

我上午刚把自己主用的模块更新了,clientid和你说的一摸一样。

不过问题原因弄明白了,delay和break那两个语句就没啥意义了(当时有些怀疑mqtt_client.connected()这个方法的实现有bug以为是在这儿陷入死循环的)。

你说的“多个网关设备”这一点很重要(我开始都没往这儿想,我家里只有一个蓝牙网关,但我相信家里有多个蓝牙网关的朋友应该也有不少),我在主贴里特意更新了一版代码和固件并加入了文字说明。

回复

使用道具 举报

7

主题

397

帖子

2268

积分

金牌会员

Rank: 6Rank: 6

积分
2268
金钱
1871
HASS币
0
发表于 2020-7-18 23:04:01 | 显示全部楼层
我有几个蓝牙夜灯 下次试试大佬的固件!!
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-22 18:29 , Processed in 0.106461 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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