Die Werte eines USB CO₂ Monitors auslesen

Disclaimer: TFA Dorstmann hat mir kostenfrei ein AirCO2NTROL Coach gesendet, damit ich die USB-Schnittstelle teste und über sie schreibe.

This article is also available in English on this blog. It’s not linked because Hexo doesn’t support internal links.


An meinem ehemaligen Arbeitsplatz hatten wir ein Messgerät für Kohlenstoffdioxid (CO₂) zur Messung der Luftqualität im Raum. Bei hoher CO₂-Konzentration (ca. 1200 Teile pro Millionen) ist es schwieriger sich zu konzentrieren und die Kollegen fühlen sich schneller müde.

Das Gerät bekommt seinen Strom über ein USB-Kabel. Nach kurzer Suche fand ich online Bewertungen und Code-Beispiele, die behaupteten man könne die Werte auslesen. Dieser Artikel beschreibt, wie ich nun den CO₂-Messer für Hausautomatisierung nutze.

Setze die USB-Berechtigungen (nur für Linux)

Als Linux-Anwender musste ich zuerst meinem Nutzer erlauben direkt auf das USB-Gerät zuzugreifen. MacOS und Windows sind nicht so restriktiv, wenn es um Zugriffe auf die Hardware geht.

Als root anmeldet, führte ich folgende Befehle aus. Der Name beispielnutzer muss mit dem Nutzer, welcher das NodeJS-Skript ausführen wird, ersetzt werden.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

# Füge eine Regel hinzu, die Nutzern in der Gruppe plugdev erlaubt, auf den
# CO₂ Monitor zuzugreifen.
cat > /etc/udev/rules.d/98-co2mon.rules <<EOF
SUBSYSTEM=="usb", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="a052", GROUP="plugdev", MODE="0666"
KERNEL=="hidraw*", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="a052", GROUP="plugdev", MODE="0666"
EOF

# Erstelle die Gruppe plugdev, sollte sie nicht existieren.
groupadd plugdev

# Füge einen Nutzer zur Gruppe hinzu.
usermod -a -G plugdev exampleusername

# Lies die Gerät-Regeln neu ein.
udevadm control --reload-rules && udevadm trigger

Auslesen des AirCO2NTROL Mini

Ich began mit dem AirCO2NTROL Mini, welches das Gerät auf meiner Arbeit war. Die NodeJS-Bibliothek node-co2-monitor vom GitHub-Nutzer huhamhire kann die Werte auslesen und dekodieren.

Bereits nach wenigen Versuchen erschienen die gewünschten Werte auf dem Computer-Bildschirm. Das Gerät sendet gemittelte Werte in Intervallen von circa zwei Sekunden.

1
2
3
4
5
6
co2: 789
temp: 23.2
co2: 789
temp: 23.2
co2: 794
temp: 23.3

Henryk Plötz beschrieb in mehreren englischen Blog-Posts, wie er die Ausgabe des AirCO2NTROL Minis dekodierte. Sein Artikel All your base are belong to us fasst seine Befunde zusammen.

Auslesen des AirCO2NTROL Coach

Der Verkäufer des AirCO2NTROL Mini hat mehrere ähnliche Geräte. Eines davon ist das AirCO2NTROL Coach. Es misst die CO₂ Werte genauer (besonders für Werte über 1500 Teile pro Millionen) und misst zusätzlich die relative Luftfeuchtigkeit.

Ich starte meine eigene Version des oben genannten NodeJS-Projekts, um beide Geräte zu unterstützen. Während sie die Geräte eine Vendor-ID und Device-ID teilen, unterscheiden sich ihre Revisionsnummern. Das Mini sendet 1.00 (0x0100) und das Coach die 2.00 (0x0200). Es ist wichtig die beiden auseinander zu halten, weil das Mini den Datenstrom verschlüsselt.

Mein verbessertes node-co2-monitor unterstüzt beide Geräte.

Verfügbare Werte

Sowohl Mini als auch Coach senden ihre Daten in Blöcken von 8 Bytes. Mit dieser Buffer-Größe können die Werte so schnell wie möglich ausgelesen werden.

Byte 1 verrät, welcher Wert übertragen wurde. Byte 2 und 3 beinhalten den neuen Wert.

Luftfeuchtigkeit

Gleicht Byte 1 0x41, wurde die Luftfeuchtigkeit übertragen. Der Wert muss durch 100 geteilt werden, um die relative Luftfeuchtigkeit zu erhalten.

1
relativeHumidity = value / 100

Auch das AirCO2NTROL Mini überträgt diesen Wert, allerdings ist er immer 0.

Temperatur

Gleicht Byte 1 0x42, wurde die Temperatur übertragen. Der Wert muss durch 16 geteilt werden, um die Temeratur in Kelvin zu erhalten.

1
2
3
kelvin = value / 16
celcius = value / 16 - 273.15
fahrenheit = 1.8 * (value / 16 - 273.15) + 32

Kohlenstoffdioxid

Gleicht Byte 1 0x50, wurde die Konzentration von Kohlenstoffdioxid übertragen. Die Einheit ist Teile in Millionen (ppm). Eine transformation des Wertes ist nicht nötig.

1
co2 = value

Nutzung für Hausautomatisierung

Mit Mozilla IoT können die Funktionen vom Internet der Dinge lokal nutzen, ohne Daten an Dritte zu senden. Die Software kann auf einem lokalen Rechner oder Raspberry Pi laufen.

Es gibt bereits Adapter, welche Benachrichtigungen an den Browser oder per E-Mail senden. Diese können zum Beispiel auf eine zu hohe Konzentration von CO₂ hinweisen. Mozilla IoT eignet sich auch um den Verlauf von Werten in einem Diagramm zu betrachten.

Der, zugegeben noch instabile, Code für meinen CO₂ Monitor Adapter habe ich auf GitLab veröffentlicht. Läuft die Software auf einem Raspberry Pi, ist ein manueller Schritt notwendig, um die Berechtigungen zu setzen. Wer Ideen hat, um diesen Extraschritt zu umgehen, kann sich gerne bei mir melden. Ebenso habe ich die Frage zu udev-Regeln in Mozillas Forum gestellt.

Wen das Thema mehr interessiert, kann sich meinen englischen Vortrag “How to build Webthings?“ anschauen.