Untuk waktu yang lama saya berencana untuk memperkenalkan sensor karbon dioksida CO₂ di otomatisasi rumah. Dari segi harga / kualitas / fungsi / penampilan, Xiaomi ClearGrass Air Detector ternyata menjadi yang terbaik untuk saya. Penganalisa kualitas udara mengandung sensor:- CO₂
- tVOC (senyawa organik yang mudah menguap)
- PM2.5
- Suhu
- Kelembaban
ClearGrass memiliki layar berkualitas tinggi dengan sudut pandang besar dan baterai selama 6 jam masa pakai baterai. Harga di wilayah $ 130 untuk perangkat semacam itu menerjemahkannya ke dalam segmen must-have! Ulasan bagus bisa dibaca di mysku.ru .Alat analisis dapat ditambahkan ke aplikasi qingping + atau MiHome asli , dalam kedua kasus data melewati server Cina, yang pasti tidak cocok untuk saya. Saya memutuskan untuk mencari cara mendapatkan data dari sensor secara lokal tanpa menggunakan server jarak jauh pihak ketiga.1. Pelajari traffic
Langkah pertama adalah melihat bagaimana ClearGrass mentransfer data ke aplikasi + qingping . ClearGrass terhubung ke Internet melalui Wi-Fi. Untuk mendengarkan lalu lintas, saya menaikkan titik akses pada Raspberry Pi Wi-Fi dan mulai tcpdump untuk mengumpulkan informasi:sudo tcpdump -i wlan0 -vv -s0 -X -n port 1883 -s 65535 -w cleargrass.pcap
Analisis lalu lintas menunjukkan bahwa ClearGrass mengakses sekitar 5 alamat IP yang berbeda, dan pada 154.8.191.174 ia mentransmisikan data kualitas udara yang tidak dienkripsi menggunakan protokol MQTT .
2. Kami membungkus lalu lintas dari ClearGrass di Raspberry Pi
Setelah bereksperimen sedikit dengan iptables, saya sampai pada aturan ini:sudo iptables -i wlan0 -t nat -A PREROUTING -s 192.168.115.19 -j REDIRECT
Bunyinya seperti ini: "Semua lalu lintas baru pada antarmuka wlan0 dari 192.168.115.19 (IP ClearGrass) harus dialihkan secara lokal." Saya bukan ahli besar iptables, jadi saya akan senang dengan saran dan perbaikan. Ada minus dalam aturan ini, jika penganalisis sudah terhubung ke Raspberry Pi, maka lalu lintas tidak akan dialihkan. Pertama, Anda perlu menjalankan aturan dan hanya kemudian menghubungkan ClearGrass ke Raspberry Pi melalui Wi-Fi.Hasilnya, setelah mengambil makelar mosquitto MQTT di Raspberry Pi, saya melihat bahwa penganalisa mengirimkan data kualitas udara sekali dalam satu menit.3. MQTT nano-broker di JS untuk otomatisasi rumah Z-Way
Sebagai server otomatisasi rumah, saya menggunakan Z-Way, yang mendukung banyak perangkat Z-Wave dan kemampuan untuk menulis skrip dalam JS.
Sayangnya untuk Z-Way tidak ada broker MQTT di JS (tidak seperti sistem berdasarkan node.js), jadi saya memutuskan untuk menulis broker minimal yang hanya menerima data dari analisa ini dan tidak dapat melakukan hal lain. Tanpa membaca dokumentasi secara khusus, saya melihat komunikasi antara penganalisa dan mosquitto dan menyusun urutan berikut: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
Akibatnya, lahirlah skrip JS sederhana: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();
Tentu saja, sementara banyak yang tidak diperhitungkan, misalnya, dalam satu premis, baik PING dan MESSAGE mungkin datang, tetapi saya akan melewatkan beberapa di antaranya. Mungkin di masa depan saya akan menggunakan basis kode aedes untuk membuat broker MQTT untuk Z-Way. Dan saat ini, tujuannya adalah kesempatan mendasar untuk mendapatkan data kualitas udara lokal dari penganalisa Xiaomi ClearGrass Air Detector dan tujuan ini tercapai.Di masa depan saya ingin menginstal versi Z-Wave dari nafas TION S3 dan mengendalikannya berdasarkan data dari ClearGrass.