Kami bekerja dengan sensor CO Detector Xiaomi ClearGrass Air Detector secara lokal, tanpa server Cina



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:

  1. CO₂
  2. tVOC (senyawa organik yang mudah menguap)
  3. PM2.5
  4. Suhu
  5. 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]) {
		// 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();

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.

All Articles