<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Feinstaub on zefanjas.de - Open Source &amp; Education</title>
    <link>https://zefanjas.de/tags/feinstaub/</link>
    <description>Recent content in Feinstaub on zefanjas.de - Open Source &amp; Education</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>de-DE</language>
    <lastBuildDate>Sat, 09 Mar 2019 09:45:29 +0000</lastBuildDate><atom:link href="https://zefanjas.de/tags/feinstaub/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Wie man ein mobiles Feinstaubmessgerät bauen kann</title>
      <link>https://zefanjas.de/wie-man-ein-mobiles-feinstaubmessgeraet-bauen-kann/</link>
      <pubDate>Sat, 09 Mar 2019 09:45:29 +0000</pubDate>
      
      <guid>https://zefanjas.de/wie-man-ein-mobiles-feinstaubmessgeraet-bauen-kann/</guid>
      <description>&lt;p&gt;Vor ca. einem Jahr habe ich beschrieben, wie man mit einem &lt;a href=&#34;https://zefanjas.de/wie-man-feinstaub-mit-einem-raspberry-pi-messen-kann/&#34;&gt;Raspberry Pi und einem Feinstaubsensor&lt;/a&gt; die Luftqualität messen kann. Das Setup setzen wir so seit einigen Jahren bei uns in der Schule bzw. auch privat ein. Einen Nachteil hat dieses Projekt allerdings: es ist nicht mobil, sondern abhängig von einem WLAN-Netz bzw. einer Netzwerkverbindung. Wenn der Raspberry Pi und das Smartphone / ein Rechner nicht im gleichen Netz sind, kann man nicht auf die Messdaten zugreifen. Deshalb haben wir vor einiger Zeit den Raspberry Pi um einen kleinen Bildschirm ergänzt, sodass man die Werte direkt am Gerät ablesen kann. Wie man diesen Bildschirm für unser mobiles Feinstaubmessgerät einrichtet und welche zusätzlichen Konfigurationen notwendig sind, möchte ich in diesem Artikel kurz vorstellen.&lt;/p&gt;
&lt;h2 id=&#34;bildschirm-für-den-raspberry-pi-einrichten&#34;&gt;Bildschirm für den Raspberry Pi einrichten&lt;/h2&gt;
&lt;p&gt;Auf Amazon oder AliExpress gibt es verschiedene Displays für den Raspberry Pi. Diese reichen von ePaper-Screens bis hin zu LCDs mit Touchfunktion. Wir haben uns für einen 3,5″ LCD mit Touch entschieden, welcher eine Auflösung von 320×480 Pixel hat (&lt;a href=&#34;https://de.aliexpress.com/item/3-5-LCD-TFT-Touch-Screen-Display-with-Stylus-for-Raspberry-Pi-2-Pi-3-Acrylic/32685321852.html&#34;&gt;Modell MPI3501&lt;/a&gt;). Man kann diesen Bildschirm einfach auf die GPIO Pins stecken. Dazu kostet er gerade mal 10-15€. Schön ist auch, dass er mit 3,5″ genauso groß wie ein Raspberry Pi ist.&lt;/p&gt;
&lt;p&gt;Wenn man den Bildschirm aufsteckt und den Raspberry Pi startet, bleibt der Bildschirm weiß. Man muss zuerst noch die &lt;a href=&#34;https://github.com/goodtft/LCD-show&#34;&gt;passenden Treiber für das Display installieren&lt;/a&gt;. Dazu meldet man sich per SSH an und führt folgende Befehle aus:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ rm -rf LCD-show
$ git clone https://github.com/goodtft/LCD-show.git
$ chmod -R 755 LCD-show
$ cd LCD-show/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je nach Bildschirmmodell muss man nun den passenden Befehl ausführen um die Treiber zu installieren. In unserem Fall (für das Modell MPI3501):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo ./LCD35-show
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dieser Befehl installiert die entsprechenden Treiber und startet den Raspberry Pi anschließend neu.&lt;/p&gt;
&lt;h2 id=&#34;pixel-desktop-installieren-und-autostart-einrichten&#34;&gt;Pixel-Desktop installieren und Autostart einrichten&lt;/h2&gt;
&lt;p&gt;Damit wir die Website mit den Messwerten direkt beim Start auf dem Bildschirm angezeigt bekommen sind noch einige Schritte notwendig. Zuerst muss man die Pixel-Desktopumgebung installieren (falls man bisher Raspian Lite verwendet hat) mit&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install raspberrypi-ui-mods
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dann fehlt noch der Chromium-Browser, um die Website anzuzeigen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install chromium-browser
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Standardmäßig ist der Autologin für das Benutzer „pi“ nicht eingerichtet. Dies ist aber notwendig, damit die Messwerte direkt nach dem Start angezeigt werden können, ansonsten begrüßt einen nur der Anmeldebildschirm. Den Autologin kann man über das &lt;em&gt;raspi-config&lt;/em&gt; Programm einrichten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo raspi-config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im Menü wählt man dann &lt;strong&gt;3 Boot Options&lt;/strong&gt; → &lt;strong&gt;B1 Desktop / CLI&lt;/strong&gt; → &lt;strong&gt;B4 Desktop Autologin&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Zu guter Letzt fehlt noch die Einrichtung des Autostarts, damit Chromium nach dem Booten automatisch mit der AQI-Seite gestartet wird. Dazu legt man den Ordner &lt;em&gt;&lt;strong&gt;/home/pi/.config/lxsession/LXDE-pi/&lt;/strong&gt;&lt;/em&gt; an:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$  mkdir -p /home/pi/config/lxsession/LXDE-pi/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anschließend erstellt man in diesem Ordner die Datei &lt;em&gt;&lt;strong&gt;autostart&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ nano /home/pi/.config/lxsession/LXDE-pi/autostart
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;und fügt diesen Inhalt ein:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#@unclutter
@xset s off
@xset -dpms
@xset s noblank

# Chromium im Vollbild beim Start öffnen
@chromium-browser --incognito --kiosk http://localhost
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Möchte man noch den Mauszeiger ausblenden, muss man noch das Paket _unclutter installieren _und am Anfang der &lt;em&gt;&lt;strong&gt;autostart&lt;/strong&gt;&lt;/em&gt; das Kommentarzeichen entfernen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install unclutter
&lt;/code&gt;&lt;/pre&gt;&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2889&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert.jpg&#34; alt=&#34;mobiler Feinstaubsensor&#34; width=&#34;1024&#34; height=&#34;768&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert.jpg 1024w, https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert-300x225.jpg 300w, https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert-768x576.jpg 768w, https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert-360x270.jpg 360w&#34; sizes=&#34;(max-width: 1024px) 100vw, 1024px&#34; /&gt; 
&lt;p&gt;Da ich im letzten Jahr ein paar kleine Änderungen am Code vorgenommen habe, empfiehlt es sich das Skript und die Dateien der AQI-Website neu herunterzuladen (wie das geht, steht im &lt;a href=&#34;https://zefanjas.de/wie-man-feinstaub-mit-einem-raspberry-pi-messen-kann/&#34;&gt;Originalartikel&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Durch das Display hat man nun ein mobiles Feinstaubmessgerät. Wir setzen sie an unserer Schule ein um z.B. die Qualität der Luft in den Klassenzimmern zu überprüfen oder um Vergleichsmessungen durchzuführen. Mit diesem Setup ist man nicht mehr auf eine Netzwerkverbindung oder WLAN angewiesen, sondern kann die kleine Messstation überall einsetzen – mit einer Powerbank sogar noch unabhängig vom Stromnetz.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wie man Feinstaub mit einem Raspberry Pi messen kann [Update]</title>
      <link>https://zefanjas.de/wie-man-feinstaub-mit-einem-raspberry-pi-messen-kann/</link>
      <pubDate>Tue, 27 Feb 2018 12:20:56 +0000</pubDate>
      
      <guid>https://zefanjas.de/wie-man-feinstaub-mit-einem-raspberry-pi-messen-kann/</guid>
      <description>&lt;p&gt;Wir messen an unserer Schule regelmäßig den Feinstaubgehalt in der Luft. Besonders zwischen Februar und Mai sind die Werte hier in Süd-Ost Asien sehr hoch, da es in dieser Zeit kaum regnet, es sehr trocken und heiß ist und viele Wiesen und Felder abgebrannt werden. Das alles wirkt sich negativ auf die Qualität der Luft aus. Heute möchte ich zeigen, wie man den Feinstaub mit einem Raspberry Pi messen kann. Doch vorher möchte ich kurz auf die Frage eingehen: Was ist Feinstaub überhaupt und was wollen wir messen?&lt;/p&gt;
&lt;h3 id=&#34;was-ist-feinstaub&#34;&gt;Was ist Feinstaub?&lt;/h3&gt;
&lt;p&gt;Ganz grob kann man sagen, dass es sich bei Feinstaub um sehr kleine Partikel / Teilchen in der Luft handelt. Man unterscheidet dabei zwischen PM10 und PM2.5 (Particulate Matter, auch F&lt;span class=&#34;tag_trans&#34;&gt;eststoffteilchen&lt;/span&gt;). Bei PM10 handelt es sich dabei um alle Partikel in der Luft, die kleiner als 10µm sind, bei PM2.5 entsprechend alle Teilchen, die kleiner als 2.5µm sind. Je kleiner die Teilchen, also v.a. alles kleiner als 2.5µm, desto gefährlicher sind sie für die Gesundheit, da sie bis in die Lungenbläschen eindringen können.&lt;/p&gt;
&lt;p&gt;Die [WHO][1] empfiehlt z.B. folgende Grenzwerte:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jahresmittel PM&lt;sub&gt;10&lt;/sub&gt; 20 µg/m³&lt;/li&gt;
&lt;li&gt;Jahresmittel PM&lt;sub&gt;2,5&lt;/sub&gt; 10 µg/m³&lt;/li&gt;
&lt;li&gt;Tagesmittel PM&lt;sub&gt;10&lt;/sub&gt; 50 µg/m³ ohne zulässige Tage, an denen eine Überschreitung möglich ist.&lt;/li&gt;
&lt;li&gt;Tagesmittel PM&lt;sub&gt;2,5&lt;/sub&gt; 25 µg/m³ ohne zulässige Tage, an denen eine Überschreitung möglich ist.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Diese Werte liegen unter den in den meisten Ländern festgelegten Grenzen. In EU ist ein Jahresmittel für PM&lt;sub&gt;10&lt;/sub&gt; von 40 µg/m³ zulässig.&lt;/p&gt;
&lt;h3 id=&#34;was-ist-der-air-quality-index-aqi&#34;&gt;Was ist der Air Quality Index (AQI)?&lt;/h3&gt;
&lt;p&gt;Ausgehend von dem Feinstaubgehalt in der Luft kann man den Air Quality Index berechnen. Er gibt an, wie „gut“ oder „schlecht“ die Luft gerade ist. Leider gibt es hier keinen einheitlichen Standard, da verschiedene Länder diesen jeweils anders berechnen oder andere Skalen haben. Der Wikipedia-Artikel zum Air Quality Index liefert dafür einen gute Übersicht. An unserer Schule richten wir uns nach der Einteilung wie sie von der EPA ([United States Environmental Protection Agency][2]) festgelegt wurde.&lt;/p&gt;
&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2485&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_195.png&#34; alt=&#34;AQI&#34; width=&#34;487&#34; height=&#34;244&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_195.png 487w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_195-300x150.png 300w&#34; sizes=&#34;(max-width: 487px) 100vw, 487px&#34; /&gt; 
&lt;p&gt;Soweit ein kurzer Abriss zum Thema Feinstaub und AQI.&lt;/p&gt;
&lt;h3 id=&#34;was-brauchen-wir-für-die-feinstaubmessung&#34;&gt;Was brauchen wir für die Feinstaubmessung?&lt;/h3&gt;
&lt;p&gt;Eigentlich braucht es nur zwei Dinge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einen Raspberry Pi (jedes Modell geht, am besten ein Modell mit WLAN)&lt;/li&gt;
&lt;li&gt;Feinstaubsensor SDS011&lt;/li&gt;
&lt;/ul&gt;
&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2490&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876.jpg&#34; alt=&#34;SDS011&#34; width=&#34;600&#34; height=&#34;600&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876.jpg 600w, https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876-150x150.jpg 150w, https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876-300x300.jpg 300w, https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876-270x270.jpg 270w&#34; sizes=&#34;(max-width: 600px) 100vw, 600px&#34; /&gt; 
&lt;p&gt;Das war es schon 🙂 Wer sich für einen Raspberry Pi Zero W entscheidet, benötigt noch ein Adapterkabel auf einen Standard-USB Anschluss, da der Zero nur Micro-USB hat. Den Sensor bekommt man am besten bei Aliexpress. Dort kostet er um die 17-20$. Der Sensor hat eine USB-Adapter für die serielle Schnittstelle mit dabei.&lt;/p&gt;
&lt;h3 id=&#34;installation&#34;&gt;Installation&lt;/h3&gt;
&lt;p&gt;Für unseren Raspberry Pi laden wir uns das entsprechende Raspbian Lite Image herunter und schreiben es auf die Micro-SD Karte. Dokumentiert ist das z.B. [hier][3]. Auf die Einrichtung der WLAN-Verbindung gehe ich an dieser Stelle nicht ein. Dazu gibt es viele Tutorials im Netz.&lt;/p&gt;
&lt;p&gt;Wer nach dem Booten gleich SSH aktiviert haben möchte, muss in der boot-Partition einen leere Datei mit dem Namen &lt;code&gt;ssh&lt;/code&gt; anlegen. Die IP des Raspberry Pis bekommt man am besten über den eigenen Router / DHCP Server heraus. Danach kann man sich per SSH anmelden (Standardpasswort ist &lt;em&gt;raspberry&lt;/em&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ssh pi@192.168.1.5
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;del&gt;Für unseren Sensor verwenden wir eine &lt;a href=&#34;https://gitlab.com/frankrich/sds011_particle_sensor&#34;&gt;kleines Python-Modul&lt;/a&gt;, was uns einiges an Arbeit abnimmt.&lt;/del&gt; Dazu müssen wir noch einige Pakete installieren &lt;del&gt;und das Repository auf den Pi klonen&lt;/del&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install python-serial python-enum lighttpd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;del&gt;Alle benötigten Pakete sollten jetzt installiert sein und das Modul für unseren Sensor befindet sich in &lt;em&gt;&lt;strong&gt;/home/pi/sds011&lt;/strong&gt;&lt;/em&gt;. Unter &lt;em&gt;&lt;strong&gt;/home/pi/sds011/Code/text.py&lt;/strong&gt;&lt;/em&gt; gibt es ein Testprogramm, mit dem man den Sensor testen kann.&lt;/del&gt; Bevor wir das Programm aufrufen können, müssen wir noch wissen, an welchem seriellen Port der USB-Adapter steckt. dmesg hilft uns weiter:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ dmesg
[ 5.559802] usbcore: registered new interface driver usbserial
[ 5.559930] usbcore: registered new interface driver usbserial_generic
[ 5.560049] usbserial: USB Serial support registered for generic
[ 5.569938] usbcore: registered new interface driver ch341
[ 5.570079] usbserial: USB Serial support registered for ch341-uart
[ 5.570217] ch341 1-1.4:1.0: ch341-uart converter detected
[ 5.575686] usb 1-1.4: ch341-uart converter now attached to ttyUSB0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In der letzten Zeile steht unsere Schnittstelle: &lt;em&gt;ttyUSB0&lt;/em&gt;. Wir brauchen jetzt noch zwei Dinge: einmal ein kleines Python-Skript, welches die Daten ausliest und in eine JSON-Datei speichert und dann werden wir eine kleine HTML-Seite basteln, die diese Daten ausliest und darstellt.&lt;/p&gt;
&lt;h3 id=&#34;daten-auf-dem-raspberry-pi-auslesen-update&#34;&gt;Daten auf dem Raspberry Pi auslesen [Update]&lt;/h3&gt;
&lt;p&gt;Wir erstellen zuerst eine Instanz des Sensors und lesen dann alle 5 Minuten für 30 Sekunden den Sensor aus. Diese Werte können natürlich angepasst werden. Zwischen den Messintervallen versetzen wir den Sensor in einen Schlafmodus, um die Lebensdauer zu erhöhen (Lebensdauer beträgt laut Hersteller ca. 8000 Stunden).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[Update, 27.02.2018]&lt;/strong&gt; Ich habe festgestellt, das meine Python3 Version des Skripts die serielle Schnittstellen nicht ansprechen konnte, z.B. nach einem Reboot. Erst nach mehrmaligem Starten des Skripts konnten dann die Daten gelesen werden. Woran das liegt, habe ich leider nicht herausgefunden, aber mit Python2.7 funktioniert es ohne Probleme. Deshalb hier eine neue Version des Skripts, welche auf Python2.7 basiert.&lt;/p&gt;
&lt;p&gt;Im Homeverzeichnis legen wir eine Datei mit dem Namen aqi.py an und kopieren den folgenden Inhalt hinein:&lt;/p&gt;
&lt;pre class=&#34;height-set:true lang:python decode:true&#34;&gt;#!/usr/bin/python
# coding=utf-8
# &#34;DATASHEET&#34;: http://cl.ly/ekot
# https://gist.github.com/kadamski/92653913a53baf9dd1a8
from __future__ import print_function
import serial, struct, sys, time, json

DEBUG = 0
CMD_MODE = 2
CMD_QUERY_DATA = 4
CMD_DEVICE_ID = 5
CMD_SLEEP = 6
CMD_FIRMWARE = 7
CMD_WORKING_PERIOD = 8
MODE_ACTIVE = 0
MODE_QUERY = 1

ser = serial.Serial()
ser.port = &#34;/dev/ttyUSB0&#34;
ser.baudrate = 9600

ser.open()
ser.flushInput()

byte, data = 0, &#34;&#34;

def dump(d, prefix=&#39;&#39;):
    print(prefix + &#39; &#39;.join(x.encode(&#39;hex&#39;) for x in d))

def construct_command(cmd, data=[]):
    assert len(data) &amp;lt;= 12
    data += [0,]*(12-len(data))
    checksum = (sum(data)+cmd-2)%256
    ret = &#34;\xaa\xb4&#34; + chr(cmd)
    ret += &#39;&#39;.join(chr(x) for x in data)
    ret += &#34;\xff\xff&#34; + chr(checksum) + &#34;\xab&#34;

    if DEBUG:
        dump(ret, &#39;&amp;gt; &#39;)
    return ret

def process_data(d):
    r = struct.unpack(&#39;&amp;lt;HHxxBB&#39;, d[2:])
    pm25 = r[0]/10.0
    pm10 = r[1]/10.0
    checksum = sum(ord(v) for v in d[2:8])%256
    return [pm25, pm10]
    #print(&#34;PM 2.5: {} μg/m^3  PM 10: {} μg/m^3 CRC={}&#34;.format(pm25, pm10, &#34;OK&#34; if (checksum==r[2] and r[3]==0xab) else &#34;NOK&#34;))

def process_version(d):
    r = struct.unpack(&#39;&amp;lt;BBBHBB&#39;, d[3:])
    checksum = sum(ord(v) for v in d[2:8])%256
    print(&#34;Y: {}, M: {}, D: {}, ID: {}, CRC={}&#34;.format(r[0], r[1], r[2], hex(r[3]), &#34;OK&#34; if (checksum==r[4] and r[5]==0xab) else &#34;NOK&#34;))

def read_response():
    byte = 0
    while byte != &#34;\xaa&#34;:
        byte = ser.read(size=1)

    d = ser.read(size=9)

    if DEBUG:
        dump(d, &#39;&amp;lt; &#39;)
    return byte + d

def cmd_set_mode(mode=MODE_QUERY):
    ser.write(construct_command(CMD_MODE, [0x1, mode]))
    read_response()

def cmd_query_data():
    ser.write(construct_command(CMD_QUERY_DATA))
    d = read_response()
    values = []
    if d[1] == &#34;\xc0&#34;:
        values = process_data(d)
    return values

def cmd_set_sleep(sleep=1):
    mode = 0 if sleep else 1
    ser.write(construct_command(CMD_SLEEP, [0x1, mode]))
    read_response()

def cmd_set_working_period(period):
    ser.write(construct_command(CMD_WORKING_PERIOD, [0x1, period]))
    read_response()

def cmd_firmware_ver():
    ser.write(construct_command(CMD_FIRMWARE))
    d = read_response()
    process_version(d)

def cmd_set_id(id):
    id_h = (id&amp;gt;&amp;gt;8) % 256
    id_l = id % 256
    ser.write(construct_command(CMD_DEVICE_ID, [0]*10+[id_l, id_h]))
    read_response()

if __name__ == &#34;__main__&#34;:
    while True:
        cmd_set_sleep(0)
        cmd_set_mode(1);
        for t in range(15):
            values = cmd_query_data();
            if values is not None:
                print(&#34;PM2.5: &#34;, values[0], &#34;, PM10: &#34;, values[1])
                time.sleep(2)

        # open stored data
        with open(&#39;/var/www/html/aqi.json&#39;) as json_data:
            data = json.load(json_data)

        # check if length is more than 100 and delete first element
        if len(data) &amp;gt; 100:
            data.pop(0)

        # append new values
        data.append({&#39;pm25&#39;: values[0], &#39;pm10&#39;: values[1], &#39;time&#39;: time.strftime(&#34;%d.%m.%Y %H:%M:%S&#34;)})

        # save it
        with open(&#39;/var/www/html/aqi.json&#39;, &#39;w&#39;) as outfile:
            json.dump(data, outfile)

        print(&#34;Going to sleep for 5min...&#34;)
        cmd_set_mode(0);
        cmd_set_sleep()
        time.sleep(300)
```

Schneller geht es mit:

```
$ wget -O /home/pi/aqi.py https://raw.githubusercontent.com/zefanja/aqi/master/python/aqi.py
```

Damit das Skript fehlerfrei durchläuft sind noch zwei kleine Dinge nötig:

```
$ sudo chown pi:pi /var/www/html/
$ echo [] &amp;gt; /var/www/html/aqi.json

```

Nun kann man das Skript starten:

```
$ chmod +x aqi.py
$ ./aqi.py
PM2.5: 55.3 , PM10: 47.5
PM2.5: 55.5 , PM10: 47.7
PM2.5: 55.7 , PM10: 47.8
PM2.5: 53.9 , PM10: 47.6
PM2.5: 53.6 , PM10: 47.4
PM2.5: 54.2 , PM10: 47.3
...
```

### Skript automatisch starten lassen [Update]

Damit wir nicht jedes mal das Skript von Hand starten müssen, können wir es mit einem Cronjob z.B. bei jedem Neustart des Raspberry Pis mit starten lassen. Dazu öffnen wir die crontab-Datei

```
$ crontab -e
```

und ergänzen am Ende die nachfolgende Zeile:

```
@reboot cd /home/pi/ &amp;&amp; ./aqi.py
```

Nun startet unser Skript automatisch bei jedem Neustart mit.

### HTML-Seite für Anzeige der Messwerte und AQI

Weiter oben haben wir bereits einen leichtgewichtigen Webserver `lighttpd` installiert. Unsere HTML-, Javascript- und CSS-Datei müssen wir also im Verzeichnis _**/var/www/html/**_ speichern, damit wir von einen anderem Computer / Smartphone auf die Daten zugreifen können. Mit den nächsten drei Befehlen laden wir die entsprechenden Dateien einfach herunter:

```
$ wget -O /var/www/html/index.html https://raw.githubusercontent.com/zefanja/aqi/master/html/index.html
$ wget -O /var/www/html/aqi.js https://raw.githubusercontent.com/zefanja/aqi/master/html/aqi.js
$ wget -O /var/www/html/style.css https://raw.githubusercontent.com/zefanja/aqi/master/html/style.css
```

Die Hauptarbeit findet in der Javascript-Datei statt, die unsere JSON-Datei öffnet, den letzten Wert nimmt und anhand dieses Wertes den AQI berechnet. Dann werden noch die Hintergrundfarben anhand der Skala der EPA angepasst.

Nun man die Adresse des Raspberry Pis einfach im Browser aufrufen und die aktuellen Feinstaubwerte betrachten, z.B. _http://192.168.1.5_:

&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2487&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_196.png&#34; alt=&#34;AQI Website&#34; width=&#34;576&#34; height=&#34;342&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_196.png 576w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_196-300x178.png 300w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_196-455x270.png 455w&#34; sizes=&#34;(max-width: 576px) 100vw, 576px&#34; /&gt; 

Die Seite ist sehr einfach gestaltet und kann noch erweitert werden, z.B. um eine Grafik, die den Verlauf der letzten Stunden anzeigt usw. Pull Requests sind willkommen 🙂 Der komplette [Quellcode befindet sich auf Github][4].

### Fazit

Für relativ wenig Geld können wir jetzt den Feinstaub mit einem Raspberry Pi messen. Ob draußen fest installiert oder als mobiles Messgerät &amp;#8211; Einsatzmöglichkeiten gibt es viele. An unserer Schule haben wir beides im Einsatz. Einerseits einen Sensor der Tag und Nacht die Werte im Freien misst und einen mobilen Sensor, mit dem wir die Effektivität unserer Luftfilter in den Klassenzimmern überprüfen.

So sieht das ganze bei uns in der Schule aus:

&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2497&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_202.png&#34; alt=&#34;AQI Sensor&#34; width=&#34;327&#34; height=&#34;490&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_202.png 327w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_202-200x300.png 200w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_202-180x270.png 180w&#34; sizes=&#34;(max-width: 327px) 100vw, 327px&#34; /&gt; 

Unter &lt;http://luftdaten.info&gt; gibt es noch eine andere Möglichkeit einen ähnlichen Sensor zu bauen. Da bekommt man die Software bereits fertig geliefert und das Messgerät ist noch mal kompakter, da kein Raspberry Pi verwendet wird. Tolles Projekt!

Ein Feinstaubsensor ist ein Projekt, was sich auch gut mit Schülern im Informatikunterricht oder einer Arbeitsgemeinschaft umsetzen lässt!

&lt;p style=&#34;text-align: center;&#34;&gt;
  &lt;strong&gt;Wofür setzt du einen &lt;a href=&#34;https://zefanjas.de/server-bei-stromausfall-herunterfahren-ups-nut-co/&#34;&gt;Raspberry Pi&lt;/a&gt; ein?&lt;/strong&gt;
&lt;/p&gt;

 [1]: https://de.wikipedia.org/wiki/Feinstaub#WHO
 [2]: https://en.wikipedia.org/wiki/United_States_Environmental_Protection_Agency &#34;United States Environmental Protection Agency&#34;
 [3]: https://www.raspberrypi.org/documentation/installation/installing-images/README.md
 [4]: https://github.com/zefanja/aqi</description>
    </item>
    
  </channel>
</rss>
