0.简介
MQTT 简介
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
Node-RED简介
Node-RED是一款基于NodeJS的构建物联网应用程序的强大工具,其重点是简化代码块的“连接”以执行任务。它使用可视化编程方法,允许开发人员将预定义的代码块(称为“节点”,Node)连接起来执行任务。连接的节点,通常是输入节点、处理节点和输出节点的组合,当它们连接在一起时,构成一个“流”(Flows)。
Node-RED最初是IBM在2013年末开发的一个开源项目,以满足他们快速连接硬件和设备到Web服务和其他软件的需求——作为物联网的一种粘合剂,它很快发展成为一种通用的物联网编程工具。重要的是,Node-RED已经迅速形成一个重要的、不断增长的用户基础和一个活跃的开发人员社区,他们正在开发新的节点,同时允许程序员复用Node-RED代码来完成各种各样的任务。
1.配置HA中的MQTT
在 configuration.yaml 中配置如下内容:
mqtt:
discovery: true
discovery_prefix: homeassistant
password: XXXXXXX
具体配置可以参看 官方文档 。 重启HA就可以了。
2.配置Node-RED
自己安装下Node-Red。我是在群晖docker里面装的,镜像说明 是这个。这边是网上的安装教程可以参照着安装
安装好了浏览器输入 http://192.168.XXX.XXX:1880/ 就可以看到界面了。
配置broker,输入MQTT的IP和端口,上面配置了密码,所以安全中要输入下
配置完了就可以使用了。
3.给传感器注入灵魂
按照图示拖拽相关的节点
下面以微博热搜为例
热搜接口地址 通过Get请求到相关数据。数据不是Json格式的,需要转化
转化方法如下:
var respText = msg.payload;
var str = respText.replace("try{window.STK_16157756566583&STK_16157756566583(", "")
str = str.replace(")}catch(e){}","")
msg.payload = str
return msg;
注册传感器数据如下:
msg.payload = {
unique_id: "HA-sensor_wbhot",
name: "wbhot",
icon: "mdi:sina-weibo",
state_topic: "device20210312/sensor_wbhot/state",
json_attributes_topic: "device20210312/sensor_wbhot/attributes",
unit_of_measurement: "",
device: {
identifiers: "20210312",
manufacturer: "MQTT_Sensor",
model: "HA",
name: "微博热搜",
sw_version: "1.0"
}
}
return msg;
注册状态数据如下:
note = msg.payload.data.list[0].note
msg.payload = note
return msg;
注册属性数据如下:
var jsonArray = [];
var dataList = msg.payload.data.list;
for (var i=0, len=10; i<len; i++)
{
var jsObj = {};
jsObj.name = dataList[i].note;
jsObj.url = "https://s.weibo.com/weibo?q=%23" + dataList[i].note + "%23&Refer=top";
jsObj.num = dataList[i].num
jsonArray.push(jsObj)
}
var retList = {}
retList.lists = jsonArray
msg.payload = retList;
return msg;
属性数据用的是Json对象,以便后面展示用。当然也可以弄成字符串,自由发挥。
4.效果展示
展示界面比较简陋,用的vue,之前已经放过结果图了。数据是通过HA的api来获取的。界面就不贴了,太简陋。脚本如下:
new Vue({
el: '#app',
data () {
return {
info: null,
lists: null
}
},
mounted () {
axios.get('/api/states/sensor.wbhot',
{
headers : {'Authorization': "Bearer XXXXXXXX"}
}).then((response) => {
this.lists = response.data.attributes.lists;
})
.catch(function (error) {
console.log(error);
});
}
})
再盗用下之前的图吧