Wir arbeiten lokal mit dem CO₂ Xiaomi ClearGrass-Luftdetektorsensor ohne chinesische Server



Lange Zeit hatte ich vor, einen Kohlendioxidsensor CO₂ in der Hausautomation einzuführen. In Bezug auf Preis / Qualität / Funktion / Aussehen erwies sich der Xiaomi ClearGrass-Luftdetektor als der beste für mich. Der Luftqualitätsanalysator enthält Sensoren:

  1. CO₂
  2. tVOC (flüchtige organische Verbindungen)
  3. PM2.5
  4. Temperatur
  5. Feuchtigkeit

ClearGrass verfügt über einen hochwertigen Bildschirm mit großen Betrachtungswinkeln und einen Akku für 6 Stunden Akkulaufzeit. Der Preis in der Größenordnung von 130 US-Dollar für ein solches Gerät übersetzt es in das Must-Have-Segment! Eine großartige Rezension kann auf mysku.ru gelesen werden .

Der Analysator kann der nativen qingping + - oder MiHome-Anwendung hinzugefügt werden. In beiden Fällen werden die Daten über chinesische Server übertragen, was kategorisch nicht zu mir passte. Ich habe mich entschlossen, herauszufinden, wie Daten lokal vom Sensor abgerufen werden können, ohne Remote-Server von Drittanbietern zu verwenden.

1. Verkehr studieren


Der erste Schritt bestand darin zu sehen, wie ClearGrass Daten an die qingping + -Anwendung überträgt . ClearGrass stellt über WLAN eine Verbindung zum Internet her. Um den Datenverkehr zu hören, habe ich einen Zugriffspunkt auf dem Raspberry Pi Wi-Fi eingerichtet und tcpdump gestartet, um Informationen zu sammeln:

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

Die Analyse des Datenverkehrs ergab, dass ClearGrass auf etwa 5 verschiedene IP-Adressen zugreift und am 154.8.191.174 Luftqualitätsdaten unverschlüsselt mit dem MQTT- Protokoll überträgt .



2. Wir verpacken den Datenverkehr von ClearGrass auf dem Raspberry Pi


Nachdem ich ein bisschen mit iptables experimentiert hatte , kam ich zu dieser Regel:

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

Es lautet wie folgt: "Der gesamte neue Datenverkehr auf der wlan0-Schnittstelle von 192.168.115.19 (IP ClearGrass) sollte lokal umgeleitet werden." Ich bin kein großer Kenner von iptables, daher freue ich mich über Vorschläge und Verbesserungen. In dieser Regel gibt es ein Minus. Wenn der Analysator bereits mit dem Raspberry Pi verbunden ist, wird der Datenverkehr nicht umgeleitet. Zuerst müssen Sie die Regel ausführen und erst dann ClearGrass über WLAN mit dem Raspberry Pi verbinden.

Als ich den MQTT- Mückenbroker auf dem Raspberry Pi abholte , sah ich, dass der Analysator einmal pro Minute Luftqualitätsdaten überträgt.

3. MQTT Nano-Broker auf JS für die Hausautomation Z-Way


Als Heimautomationsserver verwende ich Z-Way, das viele Z-Wave-Geräte unterstützt und Skripte in JS schreiben kann.



Leider gibt es für Z-Way keinen MQTT-Broker in JS (im Gegensatz zu Systemen, die auf node.js basieren). Daher habe ich beschlossen, einen minimalen Broker zu schreiben, der nur Daten von diesem Analysegerät akzeptiert und nichts anderes tun kann. Ohne die Dokumentation besonders zu lesen, habe ich mir die Kommunikation zwischen dem Analysegerät und der Mücke angesehen und die folgende Sequenz zusammengestellt:

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

Als Ergebnis wurde ein einfaches JS-Skript geboren:

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

Natürlich, obwohl zum Beispiel in einer Prämisse nicht viel berücksichtigt wird, können sowohl PING als auch MESSAGE kommen, aber ich werde einiges davon vermissen. Vielleicht werde ich in Zukunft die aedes- Codebasis verwenden , um einen MQTT-Broker für Z-Way zu erstellen. Im Moment war das Ziel eine grundlegende Gelegenheit, lokale Luftqualitätsdaten vom Xiaomi ClearGrass Air Detector-Analysegerät abzurufen, und dieses Ziel wurde erreicht.

In Zukunft möchte ich die Z-Wave-Version der TION S3-Entlüftung installieren und anhand der Daten von ClearGrass steuern.

All Articles