نحن نعمل مع جهاز استشعار CO₂ Xiaomi ClearGrass Air Detector محليًا ، بدون خوادم صينية



خططت لفترة طويلة لتقديم مستشعر ثاني أكسيد الكربون CO₂ في التشغيل الآلي للمنزل. من حيث السعر / الجودة / الوظيفة / المظهر ، تبين أن Xiaomi ClearGrass Air Detector هو الأفضل بالنسبة لي. يحتوي محلل جودة الهواء على أجهزة استشعار:

  1. CO₂
  2. tVOC (المركبات العضوية المتطايرة)
  3. PM2.5
  4. درجة الحرارة
  5. رطوبة

تتميز ClearGrass بشاشة عالية الجودة مع زوايا مشاهدة كبيرة وبطارية لمدة 6 ساعات من عمر البطارية. السعر في منطقة 130 دولارًا لمثل هذا الجهاز يترجمه إلى الجزء الذي يجب أن يكون لديك! يمكن قراءة مراجعة رائعة على mysku.ru .

يمكن إضافة المحلل إلى تطبيق qingping + أو MiHome الأصلي ، وفي كلتا الحالتين تمر البيانات عبر الخوادم الصينية ، والتي لم تناسبني بشكل قاطع. قررت معرفة كيفية الحصول على البيانات من المستشعر محليًا دون استخدام خوادم بعيدة تابعة لجهات خارجية.

1. دراسة حركة المرور


كانت الخطوة الأولى هي معرفة كيفية نقل ClearGrass للبيانات إلى تطبيق qingping + . تتصل ClearGrass بالإنترنت عبر Wi-Fi. للاستماع إلى حركة المرور ، رفعت نقطة وصول على 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. نلف حركة المرور من ClearGrass على Raspberry Pi


بعد أن جربت قليلاً مع 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 ، فلن تتم إعادة توجيه حركة المرور. تحتاج أولاً إلى تشغيل القاعدة ، وبعد ذلك فقط قم بتوصيل ClearGrass بـ Raspberry Pi عبر Wi-Fi.

ونتيجة لذلك ، بعد أن التقطت وسيط البعوض MQTT على Raspberry Pi ، رأيت أن المحلل ينقل بيانات جودة الهواء مرة واحدة في الدقيقة.

3. MQTT nano-broker على JS لأتمتة المنزل Z-Way


كخادم التشغيل الآلي للمنزل ، أستخدم Z-Way ، الذي يدعم العديد من أجهزة Z-Wave والقدرة على كتابة البرامج النصية في JS.



لسوء الحظ بالنسبة لـ Z-Way لا يوجد وسيط MQTT في JS (على عكس الأنظمة القائمة على 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 ، لكنني سأفتقد بعضًا من هذا. وربما في المستقبل وسوف تستخدم الزاعجة رمز قاعدة لخلق وسيط MQTT لZ-الطريق. وفي الوقت الحالي ، كان الهدف هو الفرصة الأساسية للحصول على بيانات جودة الهواء محليًا من محلل Xiaomi ClearGrass Air Detector وتم تحقيق هذا الهدف.

في المستقبل ، أريد تثبيت إصدار Z-Wave من استراحة TION S3 والتحكم فيه استنادًا إلى البيانات من ClearGrass.

All Articles