我们在本地使用CO²小米ClearGrass空气探测器传感器,而没有中文服务器



很长时间以来,我计划在家庭自动化中引入二氧化碳传感器CO 2。在价格/质量/功能/外观方面,小米ClearGrass空气检测仪原来是最适合我的。空气质量分析仪包含以下传感器:

  1. 二氧化碳
  2. tVOC(挥发性有机化合物)
  3. PM2.5
  4. 温度
  5. 湿度

ClearGrass具有高视角,高品质的屏幕和可续航6个小时的电池。这种设备的价格在$ 130左右,成为了必不可少的部分!很棒的评论可以在mysku.ru阅读

可以将分析仪添加到本机qingping +MiHome应用程序中,在两种情况下,数据都通过中文服务器发送,这绝对不适合我。我决定弄清楚如何在不使用第三方远程服务器的情况下从本地获取传感器的数据。

1.研究流量


第一步是查看ClearGrass如何将数据传输到qingping +应用程序ClearGrass通过Wi-Fi连接到Internet。为了收听流量,我在Raspberry Pi Wi-Fi上建立了一个接入点,并启动了tcpdump来收集信息:

sudo tcpdump -i wlan0 -vv -s0 -X -n port 1883 -s 65535 -w cleargrass.pcap

流量分析表明,ClearGrass访问了大约5个不同的IP地址,并在154.8.191.174上传输了使用MQTT协议未加密的空气质量数据。



2.我们在Raspberry Pi上包装来自ClearGrass的流量


在尝试了iptables之后,我得出了以下规则:

sudo iptables -i wlan0 -t nat -A PREROUTING -s 192.168.115.19 -j REDIRECT

内容如下:“ wlan0接口上所有来自192.168.115.19(IP ClearGrass)的新流量都应在本地重定向。” 我不是iptables的大鉴赏家,所以我很乐意提出建议和改进。此规则有一个减号,如果分析仪已经连接到Raspberry Pi,则流量将不会重定向。首先,您需要运行规则,然后才通过Wi-Fi将ClearGrass连接到Raspberry Pi。

结果,我在Raspberry Pi上捡起了MQTT 蚊子经纪人后,发现分析仪每分钟发送一次空气质量数据。

3.用于家庭自动化Z-Way的JS上的MQTT纳米经纪人


作为家庭自动化服务器,我使用Z-Way,它支持许多Z-Wave设备并能够用JS编写脚本。



不幸的是,对于Z-Way,JS中没有MQTT代理(与基于node.js的系统不同),所以我决定编写一个最小的代理,该代理仅接受来自此分析器的数据,而不能执行其他任何操作。在没有特别阅读文档的情况下,我查看了分析仪和蚊子之间的通信,并编译了以下顺序:

MQTT PROTOCOL

Connect Command (sensor -> broker)
	0x10 - Connect Command

Connect Ack (broker -> sensor)
	0x20 - Connect Ack
	0x02 - Len 2
	0x00
	0x00 - Connection Accepted

Subscribe Request (sensor -> broker)
	0x82 - 0b1000 0010; 0b1000 - Subscribe Request

Subscribe Ack (broker -> sensor)
	0x90 - 0b1001 0000; 0b1001 - Subscribe Ack
	0x03 - Len 3
	0x00
	0x08 - Message identifier 8
	0x00 - Fire and Forget

Ping Request (sensor -> broker)
	0xC0 - Ping Request
	0x00 - Len 0

Ping Response (broker -> sensor)
	0xD0 - Ping Response
	0x00 - Len 0

Publish Message (sensor -> broker)
	0x30 - Publish Message
	0x96
	0x04 - Len 534

结果,一个简单的JS脚本诞生了:

mqttSocket.reusable();
mqttSocket.bind(1883);
mqttSocket.onrecv = function(data, host, port) {
	var arr = new Uint8Array(data);

	switch(arr[0]) {
		// PING
		case 0xC0:
			console.log("---------- MQTT PING RESPONSE");
			this.send([0xD0, 0x00]);
			break;
		// CONNECT
		case 0x10:
			console.log("---------- MQTT CONNECT ACK");
			this.send([0x20, 0x02, 0x00, 0x00]);
			break;
		// SUBSCRIBE
		case 0x82:
			console.log("---------- MQTT SUBSCRIBE ACK");
			this.send([0x90, 0x03, arr[2], arr[3], 0x00]);
			break;
		// PUBLISH
		case 0x30:
			var sensorPayload = self.getPayload(arr);
			var sensorMessage = sensorPayload.substr(sensorPayload.indexOf('{'), sensorPayload.lastIndexOf('}'));
			var sensorObj = JSON.parse(sensorMessage);
			console.logJS("---------- MQTT MESSAGE:", sensorObj);
			console.logJS("---------- CO2: ", sensorObj.data.co2);
			self.vDevCO2.set("metrics:level", sensorObj.data.co2);
			break;
	}
};
mqttSocket.listen();

当然,虽然没有太多考虑,例如,在一处前提下,PING和MESSAGE都可以使用,但是我会错过其中的一些。也许将来我会使用aedes代码库为Z-Way创建MQTT代理。目前,该目标是从小米ClearGrass空气检测仪分析仪获取本地空气质量数据的基本机会,并且这一目标得以实现。

将来,我想安装Z-Wave版本的TION S3通气阀,并根据来自ClearGrass的数据进行控制。

All Articles