Artikel-Schlagworte: „Perl“

Erweiterung der Wetterstation: Feinstaubmessung

Angeregt durch einen Artikel im Make-Magazin habe ich meine Wetterstation um einen Feinstaubsensor erweitert.
Die Feinstaubmesswerte sind ja seit einiger Zeit ein heißes Eisen, da die EU heftige Strafen für unsere Städte verhängt, wenn die Feinstaubgrenzwerte an zu vielen Tagen im Jahr überschritten werden. Und für unsere Gesundheit ist es ja allemal besser, wenn nicht so viel Dreck in der Luft rumfliegt… 😉

Nun sind die offiziellen Messstationen ja sehr ungleichmäßig über das Stadtgebiet verteilt und da nützt es mir wenig, wenn ich weiß, dass die Messwerte am Hauptbahnhof mal wieder durch die Decke gehen. Mich interessieren ja eher die Werte direkt vor der eigenen Haustür.

Über die Hintergründe zur Messung, was die einzelnen Messwerte und deren Bedeutung betrifft, will ich hier nicht näher eingehen, das kann man besser hier nachlesen. Dort wird auch ausführlich beschrieben, wie man sich selbst mit einfachen Mitteln seine eigene Feinstaub-Messstation aufbauen kann.

Die Messung selbst ist auch für so blutige Amateure wie unsereinen kein Problem. Der Sensor liefert jede Sekunde ein Datentelegramm mit den Messwerten über eine serielle Schnittstelle. Da die meisten PCs heutzutage nicht mehr über letztere verfügen, liefert der Hersteller einen seriell zu USB Konverter gleich mit. Die aufwändige Installation eines Treibers dafür entfällt beim Raspberry Pi zum Glück, der hat den gleich an Bord. Also nur anstöpseln und läuft!

Auch die Spannungsversorgung des Sensors ist problemlos, er bezieht seinen “Saft” über den USB-Anschluß.

Das Skript muss nun nur noch die über die serielle USB-Schnittstelle eingehenden Daten auf Plausibilität prüfen und anschließend in der Datenbank speichern.

Im Gegensatz zu Make-Magazin (den Artikel kann man übrigens auch auf der Homepage des Autors nachlesen) habe ich kein Shellskript zur Messung benutzt, sondern nutze die schon bei der Wetterstation genutzte Variante und habe stattdessen ein Perlskript geschrieben.
Dabei war der Artikel aus dem Make-Magazin aber sehr hilfreich.

Dieses Skript erfasst die Messdaten alle fünf Minuten und schreibt die Messwerte in eine MySQL-Datenbank. Von dort liest ein PHP-Skript auf dem Webserver die Daten und zeigt sie auf der Homepage an. In den nächsten Tagen werde ich dann meine Skriptsammlung noch um eine grafische Auswertung der Messwerte erweitern.

Was gibt es sonst noch zu tun? Im Datenblatt des Sensors steht geschrieben, dass der Sensor nur “gut” für 8000 Betriebsstunden ist. Nach Adam Riese sind das etwa 333 Tage, also nicht mal ein ganzes Jahr. In der Voreinstellung misst der Sensor rund um die Uhr ohne Pause, was also bedeutet, dass man damit rechnen kann, dass der Sensor nach 11 Monaten den Geist aufgeben könnte.
Bei einem Preis von ca. 25€ pro Stück macht es also Sinn, die Betriebsdauer zu verlängern.

Im Datenblatt des Sensors schreibt der Hersteller, dass man den Sensor auch in einen sogenannten “Sleep-Modus” schicken kann. Dabei werden der Lüfter, der die Luft in die Messkammer saugt und der Laser, der die in der Luft enthaltenen Partikel mit einem Laserstrahl “beschießt”, abgeschaltet.
Dadurch kann man die Betriebsdauer natürlich erheblich verlängern.
Nur leider lässt sich der Hersteller im genannten Datenblatt nicht darüber aus, wie man den Sensor dazu bringt, eine Pause zu machen. Auch die Suchmaschine mit den sechs Buchstaben liefert leider nicht sehr viele Ergebnisse zu diesem Thema. Einen Ansatz habe ich schon gefunden. Da gilt es in den nächsten Tagen etwas zu experimentieren.
Also falls es mal keine Messwerte gibt, dann ist dabei etwas schief gegangen… 😉

Foto: Feinstaub-Messstation

Auf dem Foto sieht man meine Messtation im Einsatz, angebaut am Gartengeräte-Häuschen in ca. 1,70m Höhe. Links der Raspberry Pi, ein schon etwas älteres Modell B, darüber der Seriell-zu-USB-Konverter, in der Mitte der eigentliche Feinstaubsensor und rechts daneben Empfänger und Sender für 433Mhz-Signale.
Letzterer ist gedacht zum Ein- und Ausschalten von entsprechenden Funksteckdosen. Aber das ist schon wieder ein anderes Thema ;-).

Alle drei sind auf einer sogenannten Hutschiene mittels selbst entworfener und mit dem 3D-Drucker gedruckten Halterungen befestigt. Wobei ich auf die Konstruktion der Zugentlastung für das Anschlusskabel der 5V-Stromversorgung (das schwarze Ding unten in der Mitte zwischen der blauen und der grünen Klemmleiste) besonders stolz bin. Das Ding sieht zwar nicht sonderlich spektakulär aus, aber da ich ja nicht jeden Tag 3D-Konstruktionen mache und die Konstruktion auf Anhieb in die am Gehäuse vorhandene Aufnahme gepasst hat, darf man sich bestimmt ein bissel darüber freuen ;-).

Kleine Ursache – große Wirkung

Bei der Übertragung der Daten per Funk von den Temperatur-/Luftfeuchtigkeitssensoren zum Wetterdatenempfänger kommt es naturgemäß immer mal wieder zu Übertragungsfehlern und es werden fehlerhafte Werte in die Datenbank eingetragen. Das ist natürlich ärgerlich, weil die zum Teil extrem falschen Werte in der Auswertegrafik sehr auffällig sind.
Leider fehlte mir bisher die Zeit, ein Script zu basteln, dass die falschen Daten schon vor dem Eintrag in die Datenbank rausfiltert.  Deshalb habe ich gestern mal alle fehlerhaften Daten manuell per MySQL auf der Konsole gelöscht. Insgesamt waren das knapp 800 Datensätze. Als ich dann heute in aller Frühe einen Blick auf die Wettergrafik warf, haute es mich fast um, denn die Grafik war inzwischen eher zu einem kleinen Kunstwerk geworden…

Bei der Suche nach den Ursachen dieses “Kunstwerks” stieß ich darauf, dass in der Textdatei, in der mein Auswertescript die Daten ablegt, die Reihenfolge der Daten anders war, als sonst. Da war zwischen Daten vom 02.03.11 plötzlich ein Datensatz vom 18.03.11…
Nun war mir klar, dass der Fehler bei der Abfrage der Daten aus der Datenbank passieren musste. Und drei kleine Worte brachten dann die Lösung des Problems. Einfach ein “order by timestamp” an die Datenbankabfrage angehängt und schon war wieder alles im Lot. Warum nicht gleich so :-))?!

Und wenn ich demnächst irgendwann mal viel Zeit habe, werde ich mich wohl doch noch an die Arbeit machen und eine Fehlerkorrektur vor dem Abspeichern der Daten in der Datenbank einbauen…

Wetternews

Bei der momentanen Kälte sitze ich lieber in der warmen Stube und bastle an meinen Wetterscripten weiter.
Inzwischen ist ein erstes Wetterdiagramm online (siehe Seite ‘Wetter’). Dort wird ein stündlich aktualisiertes Diagramm des Verlaufs von Temperatur und relativer Luftfeuchtigkeit angezeigt.
Dazu wird per Cronjob ein kleines Shellscript gestartet, welches wieder um verschiedene Scripte und Programme aufruft, die dann im Endeffekt das kleine Diagramm erstellen.
Beteiligt sind daran Perl, MySQL, Gnuplot und Imagemagick. Das Perlscript fragt die betreffenden Daten aus der MySQL-Datenbank ab, schreibt sie in eine Textdatei und erzeugt eine Steuerdatei für Gnuplot. Gnuplot lädt die Steuerdatei und erzeugt aus den Daten in der Textdatei eine transparente .png-Bilddatei. Imagemagick kopiert das transparente Diagramm anschließend auf den Wolkenhintergrund und gibt die fertige Grafik aus. Zum Schluß verschiebt das Shellscript die Grafik in den Webspace.

Nebenbei habe ich auch noch einen kleinen Fehler bei der Auswertung der Maximal- / Minimaltemperaturen “entschärft”. Leider kommt es immer mal vor, dass der Wetterdatenempfänger Daten einzelner Sensoren nicht erfasst. Dann stehen für die betreffenden Sensoren falsche Werte (in diesem Fall eine Null) in der Datenbank. Nun kann man z.B. für die Temperatur keine Unterscheidung treffen, ob die Temperatur wirklich 0°C beträgt oder der Wetterdatenempfänger keine Werte erfasst hat. Im Zusammenhang mit der gleichzeitig gesendeten relativen Luftfeuchtigkeit ist es dann aber doch möglich. Denn falls der Wert für die Luftfeuchtigkeit auch Null ist, was in unseren Breiten wohl nie vorkommt, kann man die Daten für den betreffenden Sensor verwerfen.
Nun kann es nicht mehr passieren, dass bei der Minimaltemperatur Mitte Juli 0°C angezeigt werden ;-).

Nachtrag:
Kleine Änderung beim Dateiformat des Diagramms. Die erzeugte .png-Grafik war mit einer Dateigröße von etwa 2MB eindeutig zu groß. Deshalb gibt’s die jetzt im .jpg-Format. Das schont unterwegs die auf 1GB limitierte Datenflatrate fürs Handy ;-).

Wetter-Statistik

Temperaturverlauf vom 14.2.11

So sieht das Ergebnis aus

Heute packte mich mal wieder die Programmierwut und ich habe begonnen, ein kleines Perlscript zu schreiben, das mir den Temperaturverlauf eines Tages (…Woche,Monat,Jahr…) grafisch darstellt.
Dazu frage ich zunächst die Wetterdaten für den entsprechenden Zeitraum in der Datenbank ab und schreibe sie in ein Textfile. Gleichzeitig wird eine Steuerdatei für Gnuplot erzeugt, welches anschließend das erzeugte Textfile mit den Wetterdaten einliest und daraus die Grafik im png-Format berechnet.
Es ist schon erstaunlich, wozu man so eine NSLU bewegen kann, wenn man’s kann ;-).
Als nächstes werde ich das Script so erweitern, dass auch die Temperaturen der anderen Sensoren, bzw. die relative Luftfeuchtigkeit angezeigt wird. Man müsste nur viel mehr Zeit haben… 😉

Es wettert wieder :-)

Manch einer hat sich sicher schon gewundert, dass es hier in letzter Zeit gar kein aktuelles Wetter mehr gab. Mir ist es auch ziemlich peinlich zugeben zu müssen, dass es nach der Ankündigung hier im Blog auf einmal nicht mehr funktionierte.
Inzwischen hatte ich etwas Muße, habe mal nach dem Fehler gesucht und das Script “entlaust”. Wobei im Script nicht mal ein Bug war, eher im Gegenteil. Das Problem lag einfach daran, dass die serielle Schnittstelle nach einem Reboot die Einstellungen “vergessen” hatte und mein Script so ewig auf die Wetterdaten gewartet hätte…

Jetzt habe ich das Script etwas erweitert und die Schnittstelle wird bei jedem Aufruf neu initialisiert. Sicher ist sicher :D.
Allerdings passen durch die lange “Auszeit” des Scriptes die Niederschlagsmengen nicht mehr so richtig, an dieser Stelle muß ich mir noch etwas einfallen lassen.
Hauptsache es läuft erstmal wieder :-).

Ach so, noch was. Der eine Außensensor liegt zu Testzwecken in meiner Bastelbutze auf dem Schreibtisch. Mir wäre die angezeigte Temperatur als Außentemperatur allerdings lieber…

Folge mir auf Twitter
Wetter aktuell
Messung vom 25.11.2017, 01:00

Temperatur: 7.4°C
rel. Luftfeuchtigkeit: 67 %

Wind: 0 km/h

Regensensor: 0 => Kein Regen

Luftdruck: 1009.4 hPa

Feinstaubmesswerte:

PM2,5: 10.7 μg/m³
PM10: 12.7 μg/m³

Sonnenaufgang:  08:43
Sonnenuntergang: 17:11

Von der Idee zur Frontplatte in unter vier Stunden. #FreeCAD #3D-Druck #Rasperry pic.twitter.com/UMGB…

Vor etwa 2 Tagen von portitzers Twitter via Twitter for Android

Aus dem Fotoalbum

Moscheen, Kirchen, Synagogen - Akko

Blühender Granatapfel in Akko

Markt in Akko