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

 找回密码
 立即注册
查看: 11891|回复: 11

[教程系列] 小爱同学->blinker-Node-RED虚拟设备接入homeassistant(已实现)

[复制链接]

1

主题

167

帖子

608

积分

高级会员

Rank: 4

积分
608
金钱
441
HASS币
0
发表于 2020-2-21 19:11:45 | 显示全部楼层 |阅读模式
本帖最后由 suwill 于 2020-2-29 21:43 编辑

QQ截图20200229213941.png
不是很会写Folow,大概弄了下,先这样吧。
节点已开源
https://gitee.com/suwillT_T/node-red-contrib-blinker-mqtt

=======================================================================================

背景:
小爱同学的红外接入,用过esp8266烧录OpenMqttGageWay的红外方式,暂时放弃
绿板小爱要外挂单片机,放弃
黑板小爱买不到,放弃

曲线救国:
小爱同学支持blinker的自定义设备

写了个node-red的自定义插件,已经不需要烧录esp8266模块就能让blinker的app里显示设备在线,并监听到手机app点击按钮时mqtt服务器发来的消息了
主要参考了这里:
https://www.cnblogs.com/kekeoutlook/p/9375351.html
和blinker的官方js-sdk:
https://github.com/blinker-iot/blinker-js/blob/master/lib/BlinkerMQTT.js

大概梳理了下,设备的secureKey请求blinker服务器,得到登录阿里云(暂时只写了这个)mqtt的用户名、密码、clientID等信息;
重新组装下参数,拿开源的mqtt.js去模拟登录阿里云的mqtt服务器,并订阅主题
这部分参考了墨澜姐姐的教程
https://yq.aliyun.com/articles/673939?spm=a2c4e.11155435.0.0.311621b7RdZh8r

目前实现的是:
心跳包,根据blinker的机制,服务器发送get:state的时候,客户端必须要发送心跳包,否则服务器收不到心跳包则认为设备不在线根据Arduino论坛里,官方帖子里写的:
心跳包与初始化UI
在blinker app上,点击设备图标进入设备控制页面时,app会向设备发送一个状态查询指令(心跳查询)
此后,WiFi设备,每59秒会返回一次心跳包;Ble设备,每29秒返回一次心跳包
状态查询指令,如下:

{"get":"state"}
默认状态下,WiFi接入设备会返回:

{"state":"online"}
BLE接入设备会返回:

{"state":"connected"}

QQ截图20200221192530.png
附图如下:
微信图片_20200221190217.jpg
QQ浏览器截图20200221190436.png

目前遇到的难题:
1,node-red里,在工作区挪动下节点,重新部署,会导致自定义节点不停的rest,不知道是什么原因
2,小爱同学已经能控制虚拟设备,但是手机上反馈:“嗯,尝试了一下,先看看设备状态吧”
看了blinker的文档,
小爱数据管理
智能音箱接口, 反馈数据到小爱同学
==任何控制务必即时反馈==
==超时2s以上再反馈,小爱同学就默认设备不在线,小爱同学会反馈“智能家居控制出了点问题”==

现在还不知道怎样把数据通过mqtt反馈给给小爱同学,而实际上指令已经发出了,Node-Red的虚拟设备能收到

个人猜测应该是把ToDevice写成"MIOT",fromDevice写自己,然后发mqtt包,还没时间验证。
20200221_1412300263.jpg

3.个人对blinker的APP还不是很了解,他们家APP最多能模拟米家的4孔插排,如果要控制论坛定制的hassmart改装模块,我猜也就一个设备控制4盏灯

有没有相同爱好的同学,欢迎跟帖交流,也希望论坛大佬能指点迷津。





回复

使用道具 举报

1

主题

167

帖子

608

积分

高级会员

Rank: 4

积分
608
金钱
441
HASS币
0
 楼主| 发表于 2020-2-21 19:16:12 | 显示全部楼层
本帖最后由 suwill 于 2020-2-24 14:32 编辑

EDIT:不需要日志了,已经做了个Node-red自定义节点并发布了,node-red-contrib-blinker-mqtt

评分

参与人数 1金钱 +20 收起 理由
+ 20 厉害了word楼主!

查看全部评分

回复

使用道具 举报

1

主题

167

帖子

608

积分

高级会员

Rank: 4

积分
608
金钱
441
HASS币
0
 楼主| 发表于 2020-2-21 22:02:58 | 显示全部楼层
本帖最后由 suwill 于 2020-3-5 13:46 编辑

edit:过程不表了edit : 简单实用教程
https://gitee.com/suwillT_T/node ... 8%E8%AF%B4%E6%98%8E
回复

使用道具 举报

13

主题

554

帖子

4298

积分

论坛元老

Jeff

Rank: 8Rank: 8

积分
4298
金钱
3744
HASS币
10

活跃会员

发表于 2020-2-23 22:20:07 | 显示全部楼层
厉害!膜拜大神。这么说,理想状态下,可以把HA的实体和点灯做个关联,通过点灯再接入米家?
Jeff
回复

使用道具 举报

1

主题

167

帖子

608

积分

高级会员

Rank: 4

积分
608
金钱
441
HASS币
0
 楼主| 发表于 2020-2-24 14:26:40 | 显示全部楼层
karl_31 发表于 2020-2-23 22:20
厉害!膜拜大神。这么说,理想状态下,可以把HA的实体和点灯做个关联,通过点灯再接入米家? ...

node-red-contrib-blinker-mqtt 节点已发布,欢迎拍砖


QQ截图20200224142526.png
回复

使用道具 举报

1

主题

108

帖子

664

积分

论坛积极会员

积分
664
金钱
556
HASS币
0
发表于 2020-2-24 17:03:14 | 显示全部楼层
小白我刚进来时一脸蒙蔽,百度谷歌了好久才找出点头绪:
1. 小爱同学可以控制其它平台设备(米家APP--我的--其他平台设备),其中包括点灯科技
2. 点灯科技能绑定其它非米家产品
3. 楼主做了个接口,实现了在Node-red上虚拟出各种设备(图上说的那些)接入点灯APP
4. 用node-red把这些虚拟的设备和真实设备关联起来,这样,小爱同学就能控制非米家设备了。
楼主是这样么?

QQ截图20200224170047.png

希望大佬能出个详细教程


回复

使用道具 举报

1

主题

108

帖子

664

积分

论坛积极会员

积分
664
金钱
556
HASS币
0
发表于 2020-2-24 17:46:31 | 显示全部楼层
感谢大佬!我已经成功让小爱开关hassmart改装模块控制的灯了!!!
几个问题请教大佬:
1.  如何让小爱知道灯的状态?
2.  node-red里的Blinker节点能改名么?因为一个对应着一个设备,多了就分不清了,虽然我不在小米全家桶的也就几个灯。。。
回复

使用道具 举报

1

主题

167

帖子

608

积分

高级会员

Rank: 4

积分
608
金钱
441
HASS币
0
 楼主| 发表于 2020-2-29 10:01:40 | 显示全部楼层
本帖最后由 suwill 于 2020-2-29 21:13 编辑
nnkn 发表于 2020-2-24 17:46
感谢大佬!我已经成功让小爱开关hassmart改装模块控制的灯了!!!
几个问题请教大佬:
1.  如何让小爱知道 ...

简单教程:
https://bbs.hassbian.com/thread-9343-1-1.html

目前已更新到1.0.6版,支持多个虚拟设备,支持重命名

有自动反馈小爱(无ha状态)和手工反馈(自己写流获取HA状态后经BLINKER OUT节点发布主题)两种方式选择

由于国内众所周知的原因,代码开源托管到码云了

https://gitee.com/suwillT_T/node-red-contrib-blinker-mqtt
研究了下flow,大概写了个流,供参考
[{"id":"65a77e7e.bea8d","type":"tab","label":"小爱->Blinker控灯","disabled":false,"info":""},{"id":"34d4d6f2.f9f9da","type":"Blinker-IN","z":"65a77e7e.bea8d","name":"客厅4个灯","blinker":"a9068b30.e9caf8","x":80,"y":240,"wires":[["3bdeb5b1.03b3fa"]]},{"id":"508b96a6.691288","type":"api-call-service","z":"65a77e7e.bea8d","name":"开关控制","server":"c21a3934.c1b6c8","version":1,"debugenabled":true,"service_domain":"light","service":"","entityId":"","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":460,"y":240,"wires":[["b2c123d5.4b862"]]},{"id":"5a448244.ad561c","type":"Blinker-OUT","z":"65a77e7e.bea8d","x":910,"y":180,"wires":[[]]},{"id":"3bdeb5b1.03b3fa","type":"function","z":"65a77e7e.bea8d","name":"开关匹配","func":"var myLights={\n    "1f844d0eeef9":[\n    "light.vv_livingroom_zd",//客厅大灯\n    "light.vv_livingroom_sd",//客厅灯带\n    "light.vv_bedroom_sub",//入户灯\n    "light.vv_livingroom_zl"//走廊灯\n    ]\n}\nvar new_msg={};\nif(msg.payload.hasOwnProperty("get")){\n    //状态查询\n    new_msg.type="get";\n    new_msg.SecretKey=msg.SecretKey;\n    new_msg.payload={\n        entity_id:myLights[msg.SecretKey][msg.payload.num-1]\n    };\n    return [new_msg,null,null];\n}else if(msg.payload.hasOwnProperty("set")){\n    //操控指令\n    new_msg.type="set";\n    // new_msg.payload=msg.payload;\n    new_msg.SecretKey=msg.SecretKey;\n    new_msg.payload= {\n        domain:"light",\n        service: msg.payload.set.pState?"turn_on":"turn_off",\n        data:{\n            entity_id:myLights[msg.SecretKey][msg.payload.set.num-1]\n        }\n    }\n    return[null,new_msg,null];\n}else{\n    new_msg.type="other"\n    new_msg.payload=msg.payload\n    return[null,null,new_msg];\n}\n","outputs":3,"noerr":0,"x":260,"y":240,"wires":[["e3d6ac63.5df78"],["508b96a6.691288"],["618ed9d6.d44098"]]},{"id":"b2c123d5.4b862","type":"debug","z":"65a77e7e.bea8d","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":690,"y":240,"wires":[]},{"id":"76658294.1a74bc","type":"debug","z":"65a77e7e.bea8d","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":890,"y":240,"wires":[]},{"id":"e3d6ac63.5df78","type":"api-current-state","z":"65a77e7e.bea8d","name":"状态查询","server":"c21a3934.c1b6c8","version":1,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"","state_type":"habool","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":460,"y":180,"wires":[["d5fe930d.c487d"],["d5fe930d.c487d"]]},{"id":"d5fe930d.c487d","type":"function","z":"65a77e7e.bea8d","name":"状态反馈包","func":"var myLights={\n    "1f844d0eeef9":[\n    "light.vv_livingroom_zd",//客厅大灯\n    "light.vv_livingroom_sd",//客厅灯带\n    "light.vv_bedroom_sub",//入户灯\n    "light.vv_livingroom_zl"//走廊灯\n    ]\n}\nreturn {\n    send:true,\n    SecretKey:msg.SecretKey,\n    payload:{\n        pState:msg.data.state,\n        num:myLights[msg.SecretKey].indexOf(msg.data.entity_id)+1\n    }\n}","outputs":1,"noerr":0,"x":690,"y":180,"wires":[["76658294.1a74bc","5a448244.ad561c"]]},{"id":"618ed9d6.d44098","type":"debug","z":"65a77e7e.bea8d","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":450,"y":300,"wires":[]},{"id":"a9068b30.e9caf8","type":"blinker-conf","z":"","name":"客厅控制","SecretKey":"1f844d0eeef9","DeviceType":"multi_outlet","autoRes":"false"},{"id":"c21a3934.c1b6c8","type":"server","z":"","name":"Home Assistant","legacy":false,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]



回复

使用道具 举报

1

主题

72

帖子

233

积分

中级会员

Rank: 3Rank: 3

积分
233
金钱
161
HASS币
0
发表于 2020-3-2 20:15:57 | 显示全部楼层
本帖最后由 ssiucn 于 2020-3-2 20:22 编辑

暂时不错,只不过有时反应有点慢,如果能获取到小爱的具体命令,那能控制的东西就多了去了,哈哈!
现在只能获得get的值和set的pState和num,如果能获取到比如“打开电视机”这样的命令就爽了
点灯科技最多只能支持5个设备,都当成4位插座,一共20个设备,还有每个插座有个总开关,另外算5个设置,一共25个设备。
YUM${JPC9CRQNA$FU}YWC`3.png
回复

使用道具 举报

1

主题

167

帖子

608

积分

高级会员

Rank: 4

积分
608
金钱
441
HASS币
0
 楼主| 发表于 2020-3-4 21:17:56 | 显示全部楼层
ssiucn 发表于 2020-3-2 20:15
暂时不错,只不过有时反应有点慢,如果能获取到小爱的具体命令,那能控制的东西就多了去了,哈哈!
现在只 ...

想获取到具体的指令,可以使用论坛里大佬写的读取小爱日志,用拦截词那种方式,受制于指定的设备(个人不确定在某台小爱上破解并折腾了拦截词之后,用其他的小爱,比如手机上的小爱)一样能控制自定义设备。
blinker毕竟是免费的服务,效果可能不如米家那么及时,有时候米家自己都慢,更何况到Blinker那边绕了一圈。暂时当做过度方案还是挺唬人的。

目前在尝试红外方案,等有了结果再分享。

感谢关注
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-13 06:31 , Processed in 0.393874 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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