Trabalhamos com o sensor CO₂ Xiaomi ClearGrass Air Detector localmente, sem servidores chineses



Durante muito tempo, planejei introduzir um sensor de dióxido de carbono CO₂ na automação residencial. Em termos de preço / qualidade / função / aparência, o Xiaomi ClearGrass Air Detector acabou por ser o melhor para mim. O analisador de qualidade do ar contém sensores:

  1. CO₂
  2. tVOC (compostos orgânicos voláteis)
  3. PM2.5
  4. Temperatura
  5. Umidade

O ClearGrass possui uma tela de alta qualidade com grandes ângulos de visão e uma bateria por 6 horas de duração. O preço na região de US $ 130 para esse dispositivo o converte no segmento obrigatório! Ótima revisão pode ser lida no mysku.ru .

O analisador pode ser adicionado ao aplicativo nativo qingping + ou MiHome ; em ambos os casos, os dados passam por servidores chineses, o que categoricamente não combina comigo. Decidi descobrir como obter dados do sensor localmente sem usar servidores remotos de terceiros.

1. Estudar o tráfego


O primeiro passo foi ver como o ClearGrass transfere dados para o aplicativo qingping + . O ClearGrass se conecta à Internet via Wi-Fi. Para ouvir o tráfego, criei um ponto de acesso no Raspberry Pi Wi-Fi e iniciei o tcpdump para coletar informações:

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

A análise do tráfego mostrou que o ClearGrass acessa aproximadamente 5 endereços IP diferentes e, em 154.8.191.174, transmite dados de qualidade do ar não criptografados usando o protocolo MQTT .



2. Reduzimos o tráfego do ClearGrass no Raspberry Pi


Tendo experimentado um pouco com o iptables, cheguei a esta regra:

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

Ele fica assim: "Todo o novo tráfego na interface wlan0 de 192.168.115.19 (IP ClearGrass) deve ser redirecionado localmente." Eu não sou um grande conhecedor de iptables, então terei prazer em sugestões e melhorias. Há menos nesta regra, se o analisador já estiver conectado ao Raspberry Pi, o tráfego não será redirecionado. Primeiro, você precisa executar a regra e só depois conectar o ClearGrass ao Raspberry Pi via Wi-Fi.

Como resultado, depois de atender no MQTT mosquitto corretor sobre o Raspberry Pi, vi que os dados de qualidade transmite analisador de ar uma vez por minuto.

3. Nano-broker MQTT em JS para automação residencial Z-Way


Como servidor de automação residencial, uso o Z-Way, que suporta muitos dispositivos Z-Wave e a capacidade de escrever scripts em JS.



Infelizmente, para o Z-Way, não existe um intermediário MQTT no JS (diferente dos sistemas baseados no node.js.), por isso decidi escrever um intermediário mínimo que aceite apenas dados desse analisador e não possa fazer mais nada. Sem ler particularmente a documentação, observei a comunicação entre o analisador e o mosquito e compilei a seguinte sequência:

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

Como resultado, nasceu um script JS simples:

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();

É claro que, embora muito não seja levado em consideração, por exemplo, em uma premissa, PING e MESSAGE podem surgir, mas vou sentir falta disso. Talvez no futuro eu usarei a base de código do aedes para criar um broker MQTT para o Z-Way. No momento, o objetivo era a oportunidade fundamental de obter dados de qualidade do ar localmente a partir do analisador Xiaomi ClearGrass Air Detector e esse objetivo foi alcançado.

No futuro, quero instalar a versão Z-Wave do respirador TION S3 e controlá-la com base nos dados do ClearGrass.

All Articles