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:- CO₂
- tVOC (compostos orgânicos voláteis)
- PM2.5
- Temperatura
- 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]) {
case 0xC0:
console.log("---------- MQTT PING RESPONSE");
this.send([0xD0, 0x00]);
break;
case 0x10:
console.log("---------- MQTT CONNECT ACK");
this.send([0x20, 0x02, 0x00, 0x00]);
break;
case 0x82:
console.log("---------- MQTT SUBSCRIBE ACK");
this.send([0x90, 0x03, arr[2], arr[3], 0x00]);
break;
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.