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:- CO₂
- tVOC (flüchtige organische Verbindungen)
- PM2.5
- Temperatur
- 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]) {
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();
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.