| Seite | Inhalt | |
|---|---|---|
| Startseite | Übersicht | |
| Hauptanleitung | Gesamtüberblick, Begriffsklärung, Teil 1–3 (FRITZ!Box, Raspberry Pi/EmonCMS, Sensor-Boxen), Ein-/Ausschalten, Zugänge-Checkliste, SENSOR_ID-Übersicht | |
| Sensoren in EmonCMS einbinden | Wiederkehrender Ablauf für jede neue Sensor-Box: API-Key, Inputs, Feeds, Dashboard | |
| Programmcode der Sensor-Boxen | Vollständiger Arduino-Code: Testsensor, einfacher BME280-Sensor, Klimamessbox, Raummessbox | |
| Raspberry Pi um Echtzeituhr (RTC) erweitern – HW-111 | Nachrüstung eines DS1307-RTC-Moduls, Shutdown-Taster | |
| Schaltung | Platine | |
| Gehäuse | 3D-Druck oder LASER-Cutter | |
| Schule | Einsatz im Unterricht | |
| Sonstiges | dies und das…. |
Diese Anleitung beschreibt den vollständigen Aufbau eines eigenständigen, WLAN-basierten Sensornetzwerks zur Erfassung von Klima- und Raumluftdaten, wie es an der Sankt-Ansgar-Schule Hamburg im Rahmen der Nachhaltigkeits-AG eingesetzt wird. So werden CO2-Konzentration und Raumtemperatur im Winter gesammelt, um die Entwicklung des Wärmebedarfs und das Lüftungsverhalten protokollieren zu können und im Sommer werden Raumtemperatur und Luftfeuchtigkeit in Verbindung mit der Außentemperatur gesammelt, um in die Anpassung des Hitzeschutzplanes der Schule einfließen zu können.
Das System ist bewusst ohne Internetzugang und ohne Abhängigkeit von der Schul-IT aufgebaut – es funktioniert als geschlossenes Inselnetz und kommt größtenteils mit gebrauchter/ausgemusterter Hardware aus (Ausnahme: der Raspberry Pi, der als günstige Neuanschaffung eingeplant werden sollte).
Systemüberblick:
Die Anleitung ist in drei Teile gegliedert, die nacheinander umgesetzt werden können.
Der Name „Klimastation„ hat sich für dieses Projekt eingebürgert, ist aber fachlich nicht ganz präzise – das lohnt sich, Schülerinnen und Schülern gleich zu Beginn zu erklären:
Klima bezeichnet in der Wissenschaft statistische Langzeitmuster des Wetters – die Weltorganisation für Meteorologie (WMO) definiert Klima über Mittelwerte aus mindestens 30 Jahren. Was die Sensor-Boxen hier tatsächlich liefern, sind dagegen Momentanwerte einzelner Messgrößen: Temperatur, Luftfeuchtigkeit, Luftdruck, CO2-Gehalt, Feinstaub und Helligkeit, aufgezeichnet alle 20 bis 300 Sekunden. Das ist fachlich korrekt als Wetter- bzw. Umweltdaten zu bezeichnen (genauer: eine Mischung aus meteorologischen Größen und Luftqualitätsdaten) – nicht als Klimadaten im engeren Sinn. Erst wenn diese Werte über sehr lange Zeiträume gemittelt und ausgewertet würden, ließe sich daraus etwas über das lokale Klima ableiten.
Der Begriff „Raumklima“ (für die Innenraum-Messungen der Raummessbox) ist davon ausgenommen – er ist im Deutschen ein etablierter, fachlich anerkannter Begriff aus der Gebäudetechnik für genau die hier gemessenen Größen (Temperatur, Feuchte, CO2 in Innenräumen).
Kurz gesagt: Trotz des Namens "Klimastation" erfassen die Boxen keine Klimadaten im engeren Sinn, sondern lokale Wetter- und Luftqualitätsdaten - als praktischer Beitrag zur Umweltbildung und zum Verständnis der eigenen Umgebung. Der Projektname wird trotzdem beibehalten, da er im Bildungskontext etabliert und gut verständlich ist.
Hinweis: DokuWiki erzeugt bei mehr als drei Überschriften automatisch ein Inhaltsverzeichnis rechts auf der Seite. Falls das aus irgendeinem Grund nicht erscheint, mit ~~NOTOC~~ am Seitenanfang unterdrücken lässt sich das TOC steuern; hier zusätzlich eine kurze manuelle Übersicht für den schnellen Einstieg:
Inhaltsübersicht:
Hinweis zu den Sprungmarken: DokuWiki erzeugt Anker automatisch aus den Überschriften (Kleinschreibung, Leerzeichen → Bindestriche, Sonderzeichen entfernt). Sollte ein Link nach dem Einfügen ins Wiki nicht funktionieren, den Anker-Namen einmal über die tatsächlich erzeugte Überschrift im Wiki prüfen und ggf. anpassen.
Für dieses Projekt braucht es keinen Internetanschluss und kein aktuelles Router-Modell. Fast jede Schule hat irgendwo eine ausrangierte FRITZ!Box im Schrank liegen – genau die wird hier zur reinen WLAN-Basisstation für das Sensornetz.
In diesem Beispiel: eine FRITZ!Box WLAN 3370 (Dual-Band N-Router, Baujahr ca. 2011), deren Zugangsdaten nicht mehr bekannt sind.
Wichtiger Hinweis zur FRITZ!Box 3370: Dieses Modell hat – anders als viele andere FRITZ!Box-Router – keinen externen Reset-Knopf und keinen Telefonanschluss (FON/DECT), über den sich sonst per Tastencode ein Reset auslösen ließe. Zwei Wege haben sich bewährt:
Weg A – AVM-Wiederherstellungsprogramm (getestet, funktioniert zuverlässig):
download.avm.de/fritzbox/ das eigene Modell auswählen, dann in den Ordner deutschland und weiter in den Unterordner recover wechseln.exe-Datei herunterladen (Namensschema z. B. fritz.box_wlan_3370-06.56.recover.exe – die Versionsnummer im Dateinamen kann je nach zuletzt installierter Firmware variieren) – das Tool läuft nur unter WindowsWeg B – „Kennwort vergessen?“ über die Bedienoberfläche (kein Windows-Rechner nötig, ggf. einen Versuch wert, bevor man das Recovery-Tool lädt):
http://fritz.box, http://192.168.178.1 oder Notfall-IP http://169.254.1.1Damit die Bedienoberfläche im Browser überhaupt erreichbar ist, muss der Rechner per LAN-Kabel (nicht WLAN) verbunden sein und eine IP-Adresse im selben Subnetz wie die FRITZ!Box haben.
Zuerst probieren – meist reicht das schon: Direkt nach dem Werksreset verteilt die Box selbst per DHCP Adressen im Bereich 192.168.178.20–200. Bei aktivem NetworkManager (Standard unter Kubuntu) genügt es normalerweise, das LAN-Kabel einzustecken – der Rechner bekommt automatisch eine passende IP, und http://192.168.178.1 bzw. http://fritz.box ist direkt erreichbar.
Falls das nicht klappt (z. B. weil nur die Notfall-IP reagiert, oder DHCP der Box gerade nicht läuft), muss die IP manuell gesetzt werden. Zunächst den Namen der LAN-Schnittstelle ermitteln:
ip link
(üblich sind Namen wie eth0, enp0s25 oder bei USB-Adaptern enx…; im Folgenden als Platzhalter IFACE verwendet)
Variante A – schnell & temporär (bis zum nächsten Kabel-Stecken oder Neustart):
sudo ip addr flush dev IFACE sudo ip addr add 169.254.1.2/16 dev IFACE sudo ip link set IFACE up
Danach im Browser http://169.254.1.1 aufrufen. Für den regulären Adressbereich stattdessen:
sudo ip addr add 192.168.178.20/24 dev IFACE
und http://192.168.178.1 aufrufen.
Variante B – über NetworkManager (nmcli), als eigenes wiederverwendbares Profil:
nmcli connection add type ethernet ifname IFACE con-name fritzbox-reset \ ipv4.method manual ipv4.addresses 192.168.178.20/24 nmcli connection up fritzbox-reset
Nach getaner Arbeit wieder aufräumen:
nmcli connection down fritzbox-reset nmcli connection delete fritzbox-reset
Variante C – grafisch: Netzwerkeinstellungen → Kabelgebunden → Zahnrad-Symbol → Reiter „IPv4“ → „Manuell“ → Adresse 192.168.178.20, Netzmaske 255.255.255.0 (bzw. /24), kein Gateway nötig → Anwenden → die LAN-Verbindung einmal aus- und wieder einschalten.
Vor dem Browser-Aufruf testen:
ping -c 3 192.168.178.1
bzw. für die Notfall-IP:
ping -c 3 169.254.1.1
Kommt eine Antwort, ist die Bedienoberfläche im Browser erreichbar.
Nach erfolgreichem Reset sind Benutzername/Passwort wieder auf Werkszustand, und die Box ist ohne Kennwort erreichbar.
Unter WLAN → Funknetz:
ARDUINO-MESSNETZDie FRITZ!Box bleibt ohne DSL-/WAN-Anschluss. Das hat zwei angenehme Nebeneffekte:
Empfehlung: Subnetz auf 192.168.1.x umstellen. Die FRITZ!Box arbeitet ab Werk im Adressbereich 192.168.178.x. Falls Sensor-Sketches (wie hier) bereits fest auf die IP-Adresse 192.168.1.2 für den EmonCMS-Server programmiert sind, lohnt es sich, gleich zu Beginn – vor dem Verbinden von Pi und Sensoren – die FRITZ!Box selbst auf das Subnetz 192.168.1.x umzustellen, statt später jeden Sketch anzupassen:
192.168.178.1 auf 192.168.1.1 ändern (Netzmaske 255.255.255.0 bleibt gleich)http://192.168.1.1 bzw. weiterhin http://fritz.box erreichbarUnter Heimnetz → Netzwerk → Netzwerkeinstellungen:
192.168.1.2Als Basis dient das von der OpenEnergyMonitor-Community gepflegte, fertige emonSD-Image – eine vorbereitete Raspberry-Pi-OS-Installation mit vorinstalliertem EmonCMS. Der große Vorteil für den Nachbau ohne Vorkenntnisse: das Image kann komplett ohne Internetzugang in Betrieb genommen werden, da es bei fehlender Internet-/LAN-Verbindung beim ersten Start selbstständig einen eigenen WLAN-Zugangspunkt zur Einrichtung aufspannt.
Für die Einrichtung verwechseln Neulinge leicht zwei völlig unabhängige Netzwerke:
Wichtig: Die FRITZ!Box verbindet LAN-Kabel-Anschluss und WLAN intern zu einem einzigen Netzwerk. Ein per Kabel an die FRITZ!Box angeschlossener Rechner ist also automatisch im selben Netz wie ein Gerät (z. B. der Pi), das per WLAN mit derselben FRITZ!Box verbunden ist – unabhängig davon, ob dieser Rechner gleichzeitig noch über WLAN mit einem ganz anderen Netz (z. B. dem Internet) verbunden ist. Ein Umschalten des eigenen Internet-WLANs ist zur Einrichtung also nicht nötig, solange das LAN-Kabel zur FRITZ!Box gesteckt ist.
Konkret zur Einrichtung des Pi:
http://192.168.1.1) unter Heimnetz → Netzwerk → Netzwerkverbindungen die aktuelle IP-Adresse des Eintrags „emonpi„ ablesen (z. B. 192.168.1.5)ssh pi@192.168.1.5
(die Adresse durch die tatsächlich angezeigte ersetzen) - Passwort: ''emonsd'' (Standard, unbedingt nach dem ersten Login ändern)
docs.openenergymonitor.org/emonsd/download.html (aktuell emonSD-10Mar26, ca. 2,2 GB, basierend auf Raspberry Pi OS Lite 64-bit; kompatibel mit Raspberry Pi Zero 2, 3B, 3B+, 4 und 5).zip-Datei muss nicht entpackt werden – sowohl balenaEtcher als auch der Raspberry Pi Imager können direkt mit der ZIP-Datei arbeitensudo apt install rpi-imager
.zip-Datei auswählen, passende SD-Karte auswählen (mind. 8 GB, empfohlen 16 GB+)Wichtig: Der Benutzername darf beim Schreiben NICHT geändert werden – er muss "pi" bleiben, sonst funktionieren interne emonSD-Skripte nicht korrekt. Die OS-Customisation-Funktion des Imagers (WLAN vorab eintragen o. Ä.) hier NICHT nutzen – das würde den in Schritt 2 beschriebenen Einrichtungs-Zugangspunkt verhindern.
Genau hier liegt der entscheidende Vorteil dieses Images für ein Inselnetz ohne Internet: Wird die SD-Karte ohne vorkonfiguriertes WLAN und ohne angeschlossenes LAN-Kabel gestartet, öffnet der Pi automatisch einen eigenen WLAN-Zugangspunkt zur Einrichtung. Ein Update-Versuch über das Internet wird in diesem Fall gar nicht erst unternommen.
emonpi2016)http://192.168.42.1 aufrufen – dort öffnet sich die integrierte Netzwerk-EinrichtungsseiteBekannter FRITZ!OS-Bug: Bei manchen FRITZ!Box-Firmwareständen lässt sich das Adressfeld für "immer gleiche IPv4-Adresse zuweisen" bei einzelnen Geräten nicht speichern – ein seit Jahren bekanntes, nicht restlos geklärtes Verhalten. Funktioniert die Reservierung über die FRITZ!Box-Oberfläche nicht, ist der robustere Weg, die feste IP direkt auf dem Pi selbst zu setzen (siehe Kasten "Wichtig zum Verständnis" oben für den SSH-Zugriff): sudo nmcli connection modify "NETZWERKNAME" ipv4.method manual \ ipv4.addresses 192.168.1.2/24 ipv4.gateway 192.168.1.1 ipv4.dns 192.168.1.1 sudo nmcli connection down "NETZWERKNAME" && sudo nmcli connection up "NETZWERKNAME" (NETZWERKNAME = Name des WLANs, z. B. "ARDUINO-MESSNETZ"; mit "nmcli connection show" auf dem Pi anzeigen lassen)
Für den nächsten Schritt (feste IP-Adresse per Kommandozeile setzen) wird ein SSH-Login auf den Pi benötigt. Bei aktuellen emonSD-Images ist SSH aus Sicherheitsgründen standardmäßig deaktiviert:
ssh anlegen, z. B. per Terminal:lsblk sudo mkdir -p /mnt/bootfs sudo mount /dev/mmcblk0p1 /mnt/bootfs sudo touch /mnt/bootfs/ssh sudo umount /mnt/bootfs
(Gerätenamen mit ''lsblk'' vorher prüfen und anpassen) - SD-Karte zurück in den Pi, Strom wieder anschließen, ca. 1 Minute warten
Danach ist SSH-Login möglich:
ssh pi@192.168.1.5
(Adresse aus der FRITZ!Box-Geräteliste, siehe Kasten oben; Passwort: emonsd)
Hinweis zu "REMOTE HOST IDENTIFICATION HAS CHANGED"-Warnungen: Wurde eine IP-Adresse während der Einrichtung mehrfach für unterschiedliche Geräte verwendet (z. B. testweise), merkt sich SSH pro Adresse einen "Fingerabdruck" und schlägt bei einer Änderung Alarm – das ist in diesem Fall harmlos (kein Angriff), sondern nur die Folge der Testerei mit IP-Adressen. Lösung: ssh-keygen -f '~/.ssh/known_hosts' -R 'DIE-BETROFFENE-IP' und danach erneut verbinden.
http://192.168.42.1)emonsd, Passwort emonsdOptionales System-Update: Beim Einrichtungsweg über den Access-Point wird das automatische Erst-Update übersprungen. Es kann bei Bedarf später bequem über die Emoncms-Administrations- oberfläche nachgeholt werden – dafür braucht der Pi dann kurzzeitig eine Verbindung mit Internetzugang (z. B. per LAN-Kabel an einem Router mit Internet). Für den Betrieb im isolierten Messnetz ist das aber nicht zwingend nötig.
Wichtiger Hinweis zu PHPFina-Feeds: Das Speicherintervall eines PHPFina-Feeds (Standard-Feed-Engine von EmonCMS) lässt sich NUR bei der Erstellung festlegen und danach nicht mehr ändern! Das passende Intervall unterscheidet sich je nach Boxtyp (siehe Teil 3): Klimamessbox (Außenbereich) = 300 Sekunden (5 Min.), Raummessbox (Innenbereich) = 20 Sekunden. Unbedingt gleich bei der ersten Feed-Anlage korrekt setzen.
Der Raspberry Pi hat werksseitig keine batteriegepufferte Uhr. Im isolierten Messnetz ohne Internetzugang kann er sich außerdem nicht per NTP die korrekte Uhrzeit holen. Nach jedem Neustart oder Stromausfall fällt die Systemzeit daher auf einen falschen Wert zurück – neue Feed-Daten bekommen dann falsche Zeitstempel und erscheinen in Diagrammen/CSV-Exports als fehlend, obwohl sie eigentlich geschrieben wurden.
Die vollständige Einrichtung (Verkabelung, I²C aktivieren, Device-Tree-Overlay, Software-Ersatzuhr entfernen, Uhrzeit setzen) beschreibt eine eigene Seite: Raspberry Pi um Echtzeituhr (RTC) erweitern – HW-111.
wpa_supplicant.conf o. Ä. existiert, und diese ggf. entfernenemonsd/emonsd funktioniert nicht: Zugangsdaten können sich mit neueren Image-Versionen ändern – im Zweifel auf der aktuellen Downloadseite unter „Credentials“ nachsehennull): Klassisches Symptom einer falschen Systemzeit (siehe Schritt 6) – der Redis-Cache zeigt den Wert sofort an, die eigentliche PHPFina-Datei wird aber mit dem (falschen) Systemdatum beschrieben. Mit date prüfen, ob das angezeigte Datum stimmt; falls nicht, RTC nachrüsten oder Uhrzeit zumindest manuell setzen (sudo date -s „JJJJ-MM-TT HH:MM:SS“)Beide Sensor-Boxen basieren auf demselben Grundprinzip: Ein ESP8266 D1 Mini liest mehrere Sensoren aus und sendet die Werte in festen Zeitabständen per WLAN und HTTP an EmonCMS. Beide Boxen teilen sich denselben Netzwerk- und Retry-Mechanismus – nur die angeschlossenen Sensoren unterscheiden sich.
Der vollständige Programmcode (inkl. eines einfachen Testsensors zum Ausprobieren der EmonCMS-Einrichtung ohne fertige Box) steht auf einer eigenen Seite: [[sensor_code|Programmcode der Sensor-Boxen]]. Diese Seite hier beschreibt nur Pin-Belegung, Konfiguration und Funktionsprinzipien.
Verbaute Sensoren:
Hardware: ESP8266 D1 Mini. In der Arduino-IDE als Board „LOLIN(WEMOS) D1 R2 & mini“ wählen. Bei Boot-Abstürzen ersatzweise auf „Generic ESP8266 Module“ mit den Einstellungen Flash Mode: DIO, Flash Frequency: 40MHz, VTables: Flash umstellen.
Pin-Belegung:
| Sensor | Pin(s) | Hinweis |
|---|---|---|
| BME280 | I²C Standard: D1 (SCL), D2 (SDA) | I²C-Adresse 0x76 (ggf. 0x77 prüfen) |
| MH-Z19B | RX = D6 (GPIO12), TX = D5 (GPIO14) | An 5V betrieben; RX-Leitung braucht einen Spannungsteiler 5V→3,3V (1kΩ + 2kΩ), da der ESP8266 nur 3,3V-tolerant ist |
| SDS011 | RX = D7 (GPIO13), TX = D8 (GPIO15) | An 5V betrieben, ohne Spannungsteiler |
| LDR | A0 (analog) | Über Spannungsteiler mit Festwiderstand an A0 |
Konfiguration (nur diese Zeilen pro Box anpassen):
#define SENSOR_ID 134 // Eindeutige Nummer je Sensor-Box (bestimmt Name UND IP-Adresse) #define MODE_LIVE false // true = echte Daten (LIVE-API-Key), false = Testbetrieb #define CO2_OFFSET 40 // Kalibrierungs-Offset, siehe unten #define MESSINTERVALL_MS 120000 // Sendetakt in Millisekunden (120000 = alle 2 Minuten) #define DEBUG true // Ausführliche serielle Ausgaben zur Fehlersuche
Sicherheitshinweis: WLAN-Passwort und EmonCMS-API-Schlüssel stehen
im Original-Sketch als Klartext-Zugangsdaten. Diese NIEMALS in eine
öffentliche Wiki-Seite kopieren! Beim Nachbau durch andere Schulen
müssen eigene, geheime Werte eingetragen werden:
const char* ssid = "<WLAN-NAME>";
const char* password = "<WLAN-PASSWORT>";
const char* APIKEY_LIVE = "<API-KEY-LIVE-AUS-EMONCMS>";
const char* APIKEY_TEST = "<API-KEY-TEST-AUS-EMONCMS>";
Die API-Keys findet man in EmonCMS unter dem jeweiligen Nutzerkonto
("My Account" → "API Keys").
Wichtige Funktionsprinzipien:
SENSOR_ID gebildet (192.168.1.SENSOR_ID), fest im Code über WiFi.config() eingetragen – kein DHCP nötig, jede Box ist damit sofort unter einer vorhersehbaren Adresse erreichbar192.168.1.2 eingestellt (die feste IP des Raspberry Pi aus Teil 2)CO2_OFFSET verwendet: An einem Frischluft-Referenzpunkt (z. B. früh morgens) ablesen, was der Sensor anzeigt, und den Offset so wählen, dass ca. 420–440 ppm (aktueller globaler Referenzwert) erreicht werdenÜbertragene Messwerte (JSON an EmonCMS):
| Feldname | Bedeutung | Einheit |
|---|---|---|
| F_rel | Relative Luftfeuchtigkeit | % |
| T_C | Temperatur | °C |
| P_hPa | Luftdruck (auf Meereshöhe umgerechnet) | hPa |
| CO2_ppm | CO2-Gehalt | ppm |
| PM25 | Feinstaub PM2.5 | µg/m³ |
| PM10 | Feinstaub PM10 | µg/m³ |
| H_bit | Helligkeit (invertiert: hell=klein, dunkel=groß) | – |
EmonCMS-Einrichtung pro Box:
SENSOR_ID aus dem Sketch (z. B. „134“) – erscheint automatisch unter Inputs, sobald die Box zum ersten Mal sendetMESSINTERVALL_MS im Sketch passen und lässt sich nur bei der Erstellung setzen, siehe Teil 2)Verbaute Sensoren:
Im Gegensatz zur Außenbox entfällt der Feinstaubsensor (SDS011) – dafür kommt die LED-Ampel als zusätzliche Ausgabe hinzu.
Hardware: ESP8266 D1 Mini, gleiches Board-Profil wie bei der Klimamessbox („LOLIN(WEMOS) D1 R2 & mini“, bei Bootproblemen alternativ „Generic ESP8266 Module“ mit DIO/40MHz/VTables:Flash).
Pin-Belegung:
| Sensor | Pin(s) | Hinweis |
|---|---|---|
| DHT22 | D7 (GPIO13) | Nur Luftfeuchtigkeit wird ausgelesen |
| BMP180 | I²C Standard: D1 (SCL), D2 (SDA) | Adresse fest in der Bibliothek (SFE_BMP180) |
| MH-Z19B | RX = D6 (GPIO12), TX = D5 (GPIO14) | Wie bei der Klimamessbox: an 5V betrieben, RX-Leitung braucht Spannungsteiler 5V→3,3V |
| LDR | A0 (analog) | Invertiert ausgewertet (hell → kleiner Wert) |
| NeoPixel-LED-Band | D4 (GPIO2) | 4- oder 5-LED-Variante, siehe NUM_LEDS |
Konfiguration (nur diese Zeilen pro Box anpassen):
#define SENSOR_ID 106 // Eindeutige Nummer je Sensor-Box (bestimmt Name UND IP-Adresse) #define MODE_LIVE true // true = echte Daten (LIVE-API-Key), false = Testbetrieb #define NUM_LEDS 4 // Anzahl verbauter LEDs: 5 = Normalausführung, 4 = kompakte Bauform #define CO2_OFFSET 40 // Kalibrierungs-Offset, wie bei der Klimamessbox
Sicherheitshinweis: Wie bei der Klimamessbox stehen im Original- Sketch echte Zugangsdaten (WLAN-Passwort, API-Keys) im Klartext. Auch hier gilt: niemals in die öffentliche Wiki-Seite kopieren, sondern durch eigene, geheime Werte ersetzen (siehe Hinweis-Kasten bei der Klimamessbox oben).
Besonderheiten gegenüber der Klimamessbox:
const int Schreibpause = 20000;), gedacht für engmaschiges Langzeit-Monitoring im Klassenraum. Der EmonCMS-Feed muss dafür mit Intervall 20 statt 300 angelegt werden – nicht mit der Klimamessbox verwechseln!NUM_LEDS-Umschalter: Da im Einsatz zwei Bauformen (4 und 5 LEDs) existieren, passt sich das Anzeigemuster automatisch an – nicht verbaute LED-Positionen werden einfach dunkel gelassenÜbertragene Messwerte (JSON an EmonCMS):
| Feldname | Bedeutung | Einheit |
|---|---|---|
| F_rel | Relative Luftfeuchtigkeit (DHT22) | % |
| T_C | Temperatur (BMP180) | °C |
| P_hPa | Luftdruck (auf Meereshöhe umgerechnet) | hPa |
| CO2_ppm | CO2-Gehalt | ppm |
| H_bit | Helligkeit (invertiert) | – |
EmonCMS-Einrichtung pro Box:
SENSOR_ID (z. B. „106“)MESSINTERVALL_MS – die Konstante schreibpauseRoh zieht die 10 Sekunden SDS011-Aufwachzeit automatisch vom Gesamtintervall ab, bei Intervallen unter 15 Sekunden greift eine Mindestpause von 2 SekundenSENSOR_ID: Führt zu IP- und Node-Konflikten – vor der Inbetriebnahme einer neuen Box unbedingt sicherstellen, dass die Nummer noch nicht vergeben ist (Übersicht am besten zentral im Wiki oder in EmonCMS unter „Inputs“ pflegen)NUM_LEDS muss zur tatsächlich verbauten Bauform passen (4 oder 5) – falsch eingestellt, bleibt entweder die letzte LED immer dunkel oder es wird versucht, eine nicht vorhandene LED anzusteuern
Noch zu ergänzen – dieser Abschnitt dient als Platzhalter und Checkliste, welche Bilder für den Nachbau durch andere Schulen besonders hilfreich sind. Bilder lassen sich in DokuWiki mit der Syntax einbinden (Upload über den „Bild hinzufügen“-Button im Editor oder Medien-Manager).

Empfohlene Aufnahmen:
{{ :platinen:klimamessbox_verkabelung.jpg?600 |Verkabelung der Klimamessbox: MH-Z19B mit Spannungsteiler}}
Damit beim Nachbau nicht versehentlich zwei Boxen dieselbe SENSOR_ID (und damit dieselbe IP-Adresse) bekommen, empfiehlt sich eine zentral gepflegte Tabelle – idealerweise direkt hier im Wiki, gut sichtbar für alle, die neue Boxen in Betrieb nehmen.
| SENSOR_ID | IP-Adresse | Boxtyp | Standort | Node-Name (EmonCMS) | Bemerkung |
|---|---|---|---|---|---|
| 106 | 192.168.1.106 | Raummessbox | z. B. Klassenraum 2.14 | 106 | 4-LED-Variante |
| 134 | 192.168.1.134 | Klimamessbox | z. B. Außenfassade Nordseite | 134 | mit Wetterschutzgehäuse |
| … | 192.168.1…. | … | … | … | … |
Empfehlung zur Nummernvergabe: Feste Wertebereiche pro Boxtyp reservieren, z. B. 100-149 für Raummessboxen und 150-199 für Klimamessboxen (Außenbereich) - das erleichtert auf einen Blick, worum es sich bei einer bestimmten SENSOR_ID handelt, ohne die Tabelle nachschlagen zu müssen. IDs 2-99 bleiben für Infrastruktur (Raspberry Pi = 2, FRITZ!Box = 1, Reserve für Zukünftiges) frei.
Praktisch relevant, sobald die komplette Station (FRITZ!Box, Raspberry Pi, ggf. Sensorboxen) gemeinsam an einer Steckdosenleiste hängt, z. B. in einem Koffer für den mobilen/temporären Einsatz.
Nur der Raspberry Pi braucht eine kontrollierte Abschaltung – FRITZ!Box und ESP8266-Sensorboxen vertragen einfaches Stromwegnehmen problemlos. Beim Pi dagegen kann ein abrupter Stromausfall während eines Schreibvorgangs die SD-Karte beschädigen.
Richtig ausschalten:
ssh pi@192.168.1.2sudo shutdown -h nowWieder einschalten:
Dank RTC-Modul (siehe eigene Seite zur HW-111-Nachrüstung) bleibt die Uhrzeit ab jetzt automatisch korrekt erhalten - ein manuelles Nachstellen der Systemzeit nach dem Wiedereinschalten ist nicht mehr nötig.
ACHTUNG - NICHT ÖFFENTLICH AUSFÜLLEN! Diese Tabelle dient nur als Checkliste, WELCHE vier Zugänge bei der Installation gesetzt werden und WO sie zu finden sind. Die echten Passwörter/Keys gehören NICHT auf diese öffentliche Wiki-Seite, sondern in einen Passwort-Manager oder eine interne, nicht- öffentliche Wiki-Seite (z. B. im geschützten Kollegiumsbereich). Wer diese Anleitung nachbaut, trägt eigene, neue Zugangsdaten ein - niemals die aus einem Beispiel oder einer anderen Schule übernehmen.
Bei der Einrichtung werden vier voneinander unabhängige Zugänge gesetzt bzw. sichtbar:
| # | Zugang | Wo gesetzt/geändert | Wo zu finden | Notiz |
|---|---|---|---|---|
| 1 | FRITZ!Box Admin-Kennwort | Teil 1, Schritt 2 (Ersteinrichtung) | FRITZ!Box-Weboberfläche → System → Kennwörter | Schützt die Router-Konfiguration selbst |
| 2 | WLAN-Kennwort „SAS-ARDUINO“ / „SAS-ARDUINO-mobil“ | Teil 1, Schritt 3 | FRITZ!Box-Weboberfläche → WLAN → Funknetz | Wird 1:1 in jeden Sensor-Sketch eingetragen (Bereich A/B/C, siehe Sensorcode-Seite) |
| 3 | Raspberry Pi – SSH-Login (Benutzer pi) | Teil 2, Schritt 4 (bzw. per passwd nachträglich) | Direkt am Pi per SSH änderbar: ssh pi@[IP-Adresse] → passwd | Getrennt vom EmonCMS-Weblogin, eigenes Passwort |
| 4 | EmonCMS – Weblogin (Benutzer emonsd, änderbar) | Teil 2, Schritt 4 | EmonCMS-Oberfläche → My Account | Zusätzlich dort: Read-&-Write- und Read-Only-API-Key (siehe „Sensoren einbinden“, Schritt 1) |
Empfehlung: Für jede Installation (Produktiv-Pi UND ggf. separater Test-/Entwicklungs-Pi) diese vier Zugänge getrennt und mit klarem Bezug zum jeweiligen Gerät im Passwort-Manager ablegen - gerade bei mehreren Pis (z. B. Schul-Livesystem und ein mobiler Test-Pi) erleichtert das die spätere Übersicht erheblich.
Der Name „Klimastation„ hat sich für dieses Projekt eingebürgert, ist aber fachlich nicht ganz präzise – das lohnt sich, Schülerinnen und Schülern gleich zu Beginn zu erklären:
Klima bezeichnet in der Wissenschaft statistische Langzeitmuster des Wetters – die Weltorganisation für Meteorologie (WMO) definiert Klima über Mittelwerte aus mindestens 30 Jahren. Was die Sensor-Boxen hier tatsächlich liefern, sind dagegen Momentanwerte einzelner Messgrößen: Temperatur, Luftfeuchtigkeit, Luftdruck, CO2-Gehalt, Feinstaub und Helligkeit, aufgezeichnet alle 20 bis 300 Sekunden. Das ist fachlich korrekt als Wetter- bzw. Umweltdaten zu bezeichnen (genauer: eine Mischung aus meteorologischen Größen und Luftqualitätsdaten) – nicht als Klimadaten im engeren Sinn. Erst wenn diese Werte über sehr lange Zeiträume gemittelt und ausgewertet würden, ließe sich daraus etwas über das lokale Klima ableiten.
Der Begriff „Raumklima“ (für die Innenraum-Messungen der Raummessbox) ist davon ausgenommen – er ist im Deutschen ein etablierter, fachlich anerkannter Begriff aus der Gebäudetechnik für genau die hier gemessenen Größen (Temperatur, Feuchte, CO2 in Innenräumen).
Kurz gesagt: Trotz des Namens "Klimastation" erfassen die Boxen keine Klimadaten im engeren Sinn, sondern lokale Wetter- und Luftqualitätsdaten - als praktischer Beitrag zur Umweltbildung und zum Verständnis der eigenen Umgebung. Der Projektname wird trotzdem beibehalten, da er im Bildungskontext etabliert und gut verständlich ist.
Hinweis: DokuWiki erzeugt bei mehr als drei Überschriften automatisch ein Inhaltsverzeichnis rechts auf der Seite. Falls das aus irgendeinem Grund nicht erscheint, mit ~~NOTOC~~ am Seitenanfang unterdrücken lässt sich das TOC steuern; hier zusätzlich eine kurze manuelle Übersicht für den schnellen Einstieg:
Inhaltsübersicht:
Hinweis zu den Sprungmarken: DokuWiki erzeugt Anker automatisch aus den Überschriften (Kleinschreibung, Leerzeichen → Bindestriche, Sonderzeichen entfernt). Sollte ein Link nach dem Einfügen ins Wiki nicht funktionieren, den Anker-Namen einmal über die tatsächlich erzeugte Überschrift im Wiki prüfen und ggf. anpassen.
Für dieses Projekt braucht es keinen Internetanschluss und kein aktuelles Router-Modell. Fast jede Schule hat irgendwo eine ausrangierte FRITZ!Box im Schrank liegen – genau die wird hier zur reinen WLAN-Basisstation für das Sensornetz.
In diesem Beispiel: eine FRITZ!Box WLAN 3370 (Dual-Band N-Router, Baujahr ca. 2011), deren Zugangsdaten nicht mehr bekannt sind.
Wichtiger Hinweis zur FRITZ!Box 3370: Dieses Modell hat – anders als viele andere FRITZ!Box-Router – keinen externen Reset-Knopf und keinen Telefonanschluss (FON/DECT), über den sich sonst per Tastencode ein Reset auslösen ließe. Zwei Wege haben sich bewährt:
Weg A – AVM-Wiederherstellungsprogramm (getestet, funktioniert zuverlässig):
download.avm.de/fritzbox/ das eigene Modell auswählen, dann in den Ordner deutschland und weiter in den Unterordner recover wechseln.exe-Datei herunterladen (Namensschema z. B. fritz.box_wlan_3370-06.56.recover.exe – die Versionsnummer im Dateinamen kann je nach zuletzt installierter Firmware variieren) – das Tool läuft nur unter WindowsWeg B – „Kennwort vergessen?“ über die Bedienoberfläche (kein Windows-Rechner nötig, ggf. einen Versuch wert, bevor man das Recovery-Tool lädt):
http://fritz.box, http://192.168.178.1 oder Notfall-IP http://169.254.1.1Damit die Bedienoberfläche im Browser überhaupt erreichbar ist, muss der Rechner per LAN-Kabel (nicht WLAN) verbunden sein und eine IP-Adresse im selben Subnetz wie die FRITZ!Box haben.
Zuerst probieren – meist reicht das schon: Direkt nach dem Werksreset verteilt die Box selbst per DHCP Adressen im Bereich 192.168.178.20–200. Bei aktivem NetworkManager (Standard unter Kubuntu) genügt es normalerweise, das LAN-Kabel einzustecken – der Rechner bekommt automatisch eine passende IP, und http://192.168.178.1 bzw. http://fritz.box ist direkt erreichbar.
Falls das nicht klappt (z. B. weil nur die Notfall-IP reagiert, oder DHCP der Box gerade nicht läuft), muss die IP manuell gesetzt werden. Zunächst den Namen der LAN-Schnittstelle ermitteln:
ip link
(üblich sind Namen wie eth0, enp0s25 oder bei USB-Adaptern enx…; im Folgenden als Platzhalter IFACE verwendet)
Variante A – schnell & temporär (bis zum nächsten Kabel-Stecken oder Neustart):
sudo ip addr flush dev IFACE sudo ip addr add 169.254.1.2/16 dev IFACE sudo ip link set IFACE up
Danach im Browser http://169.254.1.1 aufrufen. Für den regulären Adressbereich stattdessen:
sudo ip addr add 192.168.178.20/24 dev IFACE
und http://192.168.178.1 aufrufen.
Variante B – über NetworkManager (nmcli), als eigenes wiederverwendbares Profil:
nmcli connection add type ethernet ifname IFACE con-name fritzbox-reset \ ipv4.method manual ipv4.addresses 192.168.178.20/24 nmcli connection up fritzbox-reset
Nach getaner Arbeit wieder aufräumen:
nmcli connection down fritzbox-reset nmcli connection delete fritzbox-reset
Variante C – grafisch: Netzwerkeinstellungen → Kabelgebunden → Zahnrad-Symbol → Reiter „IPv4“ → „Manuell“ → Adresse 192.168.178.20, Netzmaske 255.255.255.0 (bzw. /24), kein Gateway nötig → Anwenden → die LAN-Verbindung einmal aus- und wieder einschalten.
Vor dem Browser-Aufruf testen:
ping -c 3 192.168.178.1
bzw. für die Notfall-IP:
ping -c 3 169.254.1.1
Kommt eine Antwort, ist die Bedienoberfläche im Browser erreichbar.
Nach erfolgreichem Reset sind Benutzername/Passwort wieder auf Werkszustand, und die Box ist ohne Kennwort erreichbar.
Unter WLAN → Funknetz:
ARDUINO-MESSNETZDie FRITZ!Box bleibt ohne DSL-/WAN-Anschluss. Das hat zwei angenehme Nebeneffekte:
Empfehlung: Subnetz auf 192.168.1.x umstellen. Die FRITZ!Box arbeitet ab Werk im Adressbereich 192.168.178.x. Falls Sensor-Sketches (wie hier) bereits fest auf die IP-Adresse 192.168.1.2 für den EmonCMS-Server programmiert sind, lohnt es sich, gleich zu Beginn – vor dem Verbinden von Pi und Sensoren – die FRITZ!Box selbst auf das Subnetz 192.168.1.x umzustellen, statt später jeden Sketch anzupassen:
192.168.178.1 auf 192.168.1.1 ändern (Netzmaske 255.255.255.0 bleibt gleich)http://192.168.1.1 bzw. weiterhin http://fritz.box erreichbarUnter Heimnetz → Netzwerk → Netzwerkeinstellungen:
192.168.1.2Als Basis dient das von der OpenEnergyMonitor-Community gepflegte, fertige emonSD-Image – eine vorbereitete Raspberry-Pi-OS-Installation mit vorinstalliertem EmonCMS. Der große Vorteil für den Nachbau ohne Vorkenntnisse: das Image kann komplett ohne Internetzugang in Betrieb genommen werden, da es bei fehlender Internet-/LAN-Verbindung beim ersten Start selbstständig einen eigenen WLAN-Zugangspunkt zur Einrichtung aufspannt.
Für die Einrichtung verwechseln Neulinge leicht zwei völlig unabhängige Netzwerke:
Wichtig: Die FRITZ!Box verbindet LAN-Kabel-Anschluss und WLAN intern zu einem einzigen Netzwerk. Ein per Kabel an die FRITZ!Box angeschlossener Rechner ist also automatisch im selben Netz wie ein Gerät (z. B. der Pi), das per WLAN mit derselben FRITZ!Box verbunden ist – unabhängig davon, ob dieser Rechner gleichzeitig noch über WLAN mit einem ganz anderen Netz (z. B. dem Internet) verbunden ist. Ein Umschalten des eigenen Internet-WLANs ist zur Einrichtung also nicht nötig, solange das LAN-Kabel zur FRITZ!Box gesteckt ist.
Konkret zur Einrichtung des Pi:
http://192.168.1.1) unter Heimnetz → Netzwerk → Netzwerkverbindungen die aktuelle IP-Adresse des Eintrags „emonpi„ ablesen (z. B. 192.168.1.5)ssh pi@192.168.1.5
(die Adresse durch die tatsächlich angezeigte ersetzen) - Passwort: ''emonsd'' (Standard, unbedingt nach dem ersten Login ändern)
docs.openenergymonitor.org/emonsd/download.html (aktuell emonSD-10Mar26, ca. 2,2 GB, basierend auf Raspberry Pi OS Lite 64-bit; kompatibel mit Raspberry Pi Zero 2, 3B, 3B+, 4 und 5).zip-Datei muss nicht entpackt werden – sowohl balenaEtcher als auch der Raspberry Pi Imager können direkt mit der ZIP-Datei arbeitensudo apt install rpi-imager
.zip-Datei auswählen, passende SD-Karte auswählen (mind. 8 GB, empfohlen 16 GB+)Wichtig: Der Benutzername darf beim Schreiben NICHT geändert werden – er muss "pi" bleiben, sonst funktionieren interne emonSD-Skripte nicht korrekt. Die OS-Customisation-Funktion des Imagers (WLAN vorab eintragen o. Ä.) hier NICHT nutzen – das würde den in Schritt 2 beschriebenen Einrichtungs-Zugangspunkt verhindern.
Genau hier liegt der entscheidende Vorteil dieses Images für ein Inselnetz ohne Internet: Wird die SD-Karte ohne vorkonfiguriertes WLAN und ohne angeschlossenes LAN-Kabel gestartet, öffnet der Pi automatisch einen eigenen WLAN-Zugangspunkt zur Einrichtung. Ein Update-Versuch über das Internet wird in diesem Fall gar nicht erst unternommen.
emonpi2016)http://192.168.42.1 aufrufen – dort öffnet sich die integrierte Netzwerk-EinrichtungsseiteBekannter FRITZ!OS-Bug: Bei manchen FRITZ!Box-Firmwareständen lässt sich das Adressfeld für "immer gleiche IPv4-Adresse zuweisen" bei einzelnen Geräten nicht speichern – ein seit Jahren bekanntes, nicht restlos geklärtes Verhalten. Funktioniert die Reservierung über die FRITZ!Box-Oberfläche nicht, ist der robustere Weg, die feste IP direkt auf dem Pi selbst zu setzen (siehe Kasten "Wichtig zum Verständnis" oben für den SSH-Zugriff): sudo nmcli connection modify "NETZWERKNAME" ipv4.method manual \ ipv4.addresses 192.168.1.2/24 ipv4.gateway 192.168.1.1 ipv4.dns 192.168.1.1 sudo nmcli connection down "NETZWERKNAME" && sudo nmcli connection up "NETZWERKNAME" (NETZWERKNAME = Name des WLANs, z. B. "ARDUINO-MESSNETZ"; mit "nmcli connection show" auf dem Pi anzeigen lassen)
Für den nächsten Schritt (feste IP-Adresse per Kommandozeile setzen) wird ein SSH-Login auf den Pi benötigt. Bei aktuellen emonSD-Images ist SSH aus Sicherheitsgründen standardmäßig deaktiviert:
ssh anlegen, z. B. per Terminal:lsblk sudo mkdir -p /mnt/bootfs sudo mount /dev/mmcblk0p1 /mnt/bootfs sudo touch /mnt/bootfs/ssh sudo umount /mnt/bootfs
(Gerätenamen mit ''lsblk'' vorher prüfen und anpassen) - SD-Karte zurück in den Pi, Strom wieder anschließen, ca. 1 Minute warten
Danach ist SSH-Login möglich:
ssh pi@192.168.1.5
(Adresse aus der FRITZ!Box-Geräteliste, siehe Kasten oben; Passwort: emonsd)
Hinweis zu "REMOTE HOST IDENTIFICATION HAS CHANGED"-Warnungen: Wurde eine IP-Adresse während der Einrichtung mehrfach für unterschiedliche Geräte verwendet (z. B. testweise), merkt sich SSH pro Adresse einen "Fingerabdruck" und schlägt bei einer Änderung Alarm – das ist in diesem Fall harmlos (kein Angriff), sondern nur die Folge der Testerei mit IP-Adressen. Lösung: ssh-keygen -f '~/.ssh/known_hosts' -R 'DIE-BETROFFENE-IP' und danach erneut verbinden.
http://192.168.42.1)emonsd, Passwort emonsdOptionales System-Update: Beim Einrichtungsweg über den Access-Point wird das automatische Erst-Update übersprungen. Es kann bei Bedarf später bequem über die Emoncms-Administrations- oberfläche nachgeholt werden – dafür braucht der Pi dann kurzzeitig eine Verbindung mit Internetzugang (z. B. per LAN-Kabel an einem Router mit Internet). Für den Betrieb im isolierten Messnetz ist das aber nicht zwingend nötig.
Wichtiger Hinweis zu PHPFina-Feeds: Das Speicherintervall eines PHPFina-Feeds (Standard-Feed-Engine von EmonCMS) lässt sich NUR bei der Erstellung festlegen und danach nicht mehr ändern! Das passende Intervall unterscheidet sich je nach Boxtyp (siehe Teil 3): Klimamessbox (Außenbereich) = 300 Sekunden (5 Min.), Raummessbox (Innenbereich) = 20 Sekunden. Unbedingt gleich bei der ersten Feed-Anlage korrekt setzen.
Der Raspberry Pi hat werksseitig keine batteriegepufferte Uhr. Im isolierten Messnetz ohne Internetzugang kann er sich außerdem nicht per NTP die korrekte Uhrzeit holen. Nach jedem Neustart oder Stromausfall fällt die Systemzeit daher auf einen falschen Wert zurück – neue Feed-Daten bekommen dann falsche Zeitstempel und erscheinen in Diagrammen/CSV-Exports als fehlend, obwohl sie eigentlich geschrieben wurden.
Die vollständige Einrichtung (Verkabelung, I²C aktivieren, Device-Tree-Overlay, Software-Ersatzuhr entfernen, Uhrzeit setzen) beschreibt eine eigene Seite: Raspberry Pi um Echtzeituhr (RTC) erweitern – HW-111.
wpa_supplicant.conf o. Ä. existiert, und diese ggf. entfernenemonsd/emonsd funktioniert nicht: Zugangsdaten können sich mit neueren Image-Versionen ändern – im Zweifel auf der aktuellen Downloadseite unter „Credentials“ nachsehennull): Klassisches Symptom einer falschen Systemzeit (siehe Schritt 6) – der Redis-Cache zeigt den Wert sofort an, die eigentliche PHPFina-Datei wird aber mit dem (falschen) Systemdatum beschrieben. Mit date prüfen, ob das angezeigte Datum stimmt; falls nicht, RTC nachrüsten oder Uhrzeit zumindest manuell setzen (sudo date -s „JJJJ-MM-TT HH:MM:SS“)Beide Sensor-Boxen basieren auf demselben Grundprinzip: Ein ESP8266 D1 Mini liest mehrere Sensoren aus und sendet die Werte in festen Zeitabständen per WLAN und HTTP an EmonCMS. Beide Boxen teilen sich denselben Netzwerk- und Retry-Mechanismus – nur die angeschlossenen Sensoren unterscheiden sich.
Der vollständige Programmcode (inkl. eines einfachen Testsensors zum Ausprobieren der EmonCMS-Einrichtung ohne fertige Box) steht auf einer eigenen Seite: [[sensor_code|Programmcode der Sensor-Boxen]]. Diese Seite hier beschreibt nur Pin-Belegung, Konfiguration und Funktionsprinzipien.
Verbaute Sensoren:
Hardware: ESP8266 D1 Mini. In der Arduino-IDE als Board „LOLIN(WEMOS) D1 R2 & mini“ wählen. Bei Boot-Abstürzen ersatzweise auf „Generic ESP8266 Module“ mit den Einstellungen Flash Mode: DIO, Flash Frequency: 40MHz, VTables: Flash umstellen.
Pin-Belegung:
| Sensor | Pin(s) | Hinweis |
|---|---|---|
| BME280 | I²C Standard: D1 (SCL), D2 (SDA) | I²C-Adresse 0x76 (ggf. 0x77 prüfen) |
| MH-Z19B | RX = D6 (GPIO12), TX = D5 (GPIO14) | An 5V betrieben; RX-Leitung braucht einen Spannungsteiler 5V→3,3V (1kΩ + 2kΩ), da der ESP8266 nur 3,3V-tolerant ist |
| SDS011 | RX = D7 (GPIO13), TX = D8 (GPIO15) | An 5V betrieben, ohne Spannungsteiler |
| LDR | A0 (analog) | Über Spannungsteiler mit Festwiderstand an A0 |
Konfiguration (nur diese Zeilen pro Box anpassen):
#define SENSOR_ID 134 // Eindeutige Nummer je Sensor-Box (bestimmt Name UND IP-Adresse) #define MODE_LIVE false // true = echte Daten (LIVE-API-Key), false = Testbetrieb #define CO2_OFFSET 40 // Kalibrierungs-Offset, siehe unten #define MESSINTERVALL_MS 120000 // Sendetakt in Millisekunden (120000 = alle 2 Minuten) #define DEBUG true // Ausführliche serielle Ausgaben zur Fehlersuche
Sicherheitshinweis: WLAN-Passwort und EmonCMS-API-Schlüssel stehen
im Original-Sketch als Klartext-Zugangsdaten. Diese NIEMALS in eine
öffentliche Wiki-Seite kopieren! Beim Nachbau durch andere Schulen
müssen eigene, geheime Werte eingetragen werden:
const char* ssid = "<WLAN-NAME>";
const char* password = "<WLAN-PASSWORT>";
const char* APIKEY_LIVE = "<API-KEY-LIVE-AUS-EMONCMS>";
const char* APIKEY_TEST = "<API-KEY-TEST-AUS-EMONCMS>";
Die API-Keys findet man in EmonCMS unter dem jeweiligen Nutzerkonto
("My Account" → "API Keys").
Wichtige Funktionsprinzipien:
SENSOR_ID gebildet (192.168.1.SENSOR_ID), fest im Code über WiFi.config() eingetragen – kein DHCP nötig, jede Box ist damit sofort unter einer vorhersehbaren Adresse erreichbar192.168.1.2 eingestellt (die feste IP des Raspberry Pi aus Teil 2)CO2_OFFSET verwendet: An einem Frischluft-Referenzpunkt (z. B. früh morgens) ablesen, was der Sensor anzeigt, und den Offset so wählen, dass ca. 420–440 ppm (aktueller globaler Referenzwert) erreicht werdenÜbertragene Messwerte (JSON an EmonCMS):
| Feldname | Bedeutung | Einheit |
|---|---|---|
| F_rel | Relative Luftfeuchtigkeit | % |
| T_C | Temperatur | °C |
| P_hPa | Luftdruck (auf Meereshöhe umgerechnet) | hPa |
| CO2_ppm | CO2-Gehalt | ppm |
| PM25 | Feinstaub PM2.5 | µg/m³ |
| PM10 | Feinstaub PM10 | µg/m³ |
| H_bit | Helligkeit (invertiert: hell=klein, dunkel=groß) | – |
EmonCMS-Einrichtung pro Box:
SENSOR_ID aus dem Sketch (z. B. „134“) – erscheint automatisch unter Inputs, sobald die Box zum ersten Mal sendetMESSINTERVALL_MS im Sketch passen und lässt sich nur bei der Erstellung setzen, siehe Teil 2)Verbaute Sensoren:
Im Gegensatz zur Außenbox entfällt der Feinstaubsensor (SDS011) – dafür kommt die LED-Ampel als zusätzliche Ausgabe hinzu.
Hardware: ESP8266 D1 Mini, gleiches Board-Profil wie bei der Klimamessbox („LOLIN(WEMOS) D1 R2 & mini“, bei Bootproblemen alternativ „Generic ESP8266 Module“ mit DIO/40MHz/VTables:Flash).
Pin-Belegung:
| Sensor | Pin(s) | Hinweis |
|---|---|---|
| DHT22 | D7 (GPIO13) | Nur Luftfeuchtigkeit wird ausgelesen |
| BMP180 | I²C Standard: D1 (SCL), D2 (SDA) | Adresse fest in der Bibliothek (SFE_BMP180) |
| MH-Z19B | RX = D6 (GPIO12), TX = D5 (GPIO14) | Wie bei der Klimamessbox: an 5V betrieben, RX-Leitung braucht Spannungsteiler 5V→3,3V |
| LDR | A0 (analog) | Invertiert ausgewertet (hell → kleiner Wert) |
| NeoPixel-LED-Band | D4 (GPIO2) | 4- oder 5-LED-Variante, siehe NUM_LEDS |
Konfiguration (nur diese Zeilen pro Box anpassen):
#define SENSOR_ID 106 // Eindeutige Nummer je Sensor-Box (bestimmt Name UND IP-Adresse) #define MODE_LIVE true // true = echte Daten (LIVE-API-Key), false = Testbetrieb #define NUM_LEDS 4 // Anzahl verbauter LEDs: 5 = Normalausführung, 4 = kompakte Bauform #define CO2_OFFSET 40 // Kalibrierungs-Offset, wie bei der Klimamessbox
Sicherheitshinweis: Wie bei der Klimamessbox stehen im Original- Sketch echte Zugangsdaten (WLAN-Passwort, API-Keys) im Klartext. Auch hier gilt: niemals in die öffentliche Wiki-Seite kopieren, sondern durch eigene, geheime Werte ersetzen (siehe Hinweis-Kasten bei der Klimamessbox oben).
Besonderheiten gegenüber der Klimamessbox:
const int Schreibpause = 20000;), gedacht für engmaschiges Langzeit-Monitoring im Klassenraum. Der EmonCMS-Feed muss dafür mit Intervall 20 statt 300 angelegt werden – nicht mit der Klimamessbox verwechseln!NUM_LEDS-Umschalter: Da im Einsatz zwei Bauformen (4 und 5 LEDs) existieren, passt sich das Anzeigemuster automatisch an – nicht verbaute LED-Positionen werden einfach dunkel gelassenÜbertragene Messwerte (JSON an EmonCMS):
| Feldname | Bedeutung | Einheit |
|---|---|---|
| F_rel | Relative Luftfeuchtigkeit (DHT22) | % |
| T_C | Temperatur (BMP180) | °C |
| P_hPa | Luftdruck (auf Meereshöhe umgerechnet) | hPa |
| CO2_ppm | CO2-Gehalt | ppm |
| H_bit | Helligkeit (invertiert) | – |
EmonCMS-Einrichtung pro Box:
SENSOR_ID (z. B. „106“)MESSINTERVALL_MS – die Konstante schreibpauseRoh zieht die 10 Sekunden SDS011-Aufwachzeit automatisch vom Gesamtintervall ab, bei Intervallen unter 15 Sekunden greift eine Mindestpause von 2 SekundenSENSOR_ID: Führt zu IP- und Node-Konflikten – vor der Inbetriebnahme einer neuen Box unbedingt sicherstellen, dass die Nummer noch nicht vergeben ist (Übersicht am besten zentral im Wiki oder in EmonCMS unter „Inputs“ pflegen)NUM_LEDS muss zur tatsächlich verbauten Bauform passen (4 oder 5) – falsch eingestellt, bleibt entweder die letzte LED immer dunkel oder es wird versucht, eine nicht vorhandene LED anzusteuern
Noch zu ergänzen – dieser Abschnitt dient als Platzhalter und Checkliste, welche Bilder für den Nachbau durch andere Schulen besonders hilfreich sind. Bilder lassen sich in DokuWiki mit der Syntax einbinden (Upload über den „Bild hinzufügen“-Button im Editor oder Medien-Manager).

Empfohlene Aufnahmen:
{{ :platinen:klimamessbox_verkabelung.jpg?600 |Verkabelung der Klimamessbox: MH-Z19B mit Spannungsteiler}}
Damit beim Nachbau nicht versehentlich zwei Boxen dieselbe SENSOR_ID (und damit dieselbe IP-Adresse) bekommen, empfiehlt sich eine zentral gepflegte Tabelle – idealerweise direkt hier im Wiki, gut sichtbar für alle, die neue Boxen in Betrieb nehmen.
| SENSOR_ID | IP-Adresse | Boxtyp | Standort | Node-Name (EmonCMS) | Bemerkung |
|---|---|---|---|---|---|
| 106 | 192.168.1.106 | Raummessbox | z. B. Klassenraum 2.14 | 106 | 4-LED-Variante |
| 134 | 192.168.1.134 | Klimamessbox | z. B. Außenfassade Nordseite | 134 | mit Wetterschutzgehäuse |
| … | 192.168.1…. | … | … | … | … |
Empfehlung zur Nummernvergabe: Feste Wertebereiche pro Boxtyp reservieren, z. B. 100-149 für Raummessboxen und 150-199 für Klimamessboxen (Außenbereich) - das erleichtert auf einen Blick, worum es sich bei einer bestimmten SENSOR_ID handelt, ohne die Tabelle nachschlagen zu müssen. IDs 2-99 bleiben für Infrastruktur (Raspberry Pi = 2, FRITZ!Box = 1, Reserve für Zukünftiges) frei.
Praktisch relevant, sobald die komplette Station (FRITZ!Box, Raspberry Pi, ggf. Sensorboxen) gemeinsam an einer Steckdosenleiste hängt, z. B. in einem Koffer für den mobilen/temporären Einsatz.
Nur der Raspberry Pi braucht eine kontrollierte Abschaltung – FRITZ!Box und ESP8266-Sensorboxen vertragen einfaches Stromwegnehmen problemlos. Beim Pi dagegen kann ein abrupter Stromausfall während eines Schreibvorgangs die SD-Karte beschädigen.
Richtig ausschalten:
ssh pi@192.168.1.2sudo shutdown -h nowWieder einschalten:
Dank RTC-Modul (siehe eigene Seite zur HW-111-Nachrüstung) bleibt die Uhrzeit ab jetzt automatisch korrekt erhalten - ein manuelles Nachstellen der Systemzeit nach dem Wiedereinschalten ist nicht mehr nötig.
ACHTUNG - NICHT ÖFFENTLICH AUSFÜLLEN! Diese Tabelle dient nur als Checkliste, WELCHE vier Zugänge bei der Installation gesetzt werden und WO sie zu finden sind. Die echten Passwörter/Keys gehören NICHT auf diese öffentliche Wiki-Seite, sondern in einen Passwort-Manager oder eine interne, nicht- öffentliche Wiki-Seite (z. B. im geschützten Kollegiumsbereich). Wer diese Anleitung nachbaut, trägt eigene, neue Zugangsdaten ein - niemals die aus einem Beispiel oder einer anderen Schule übernehmen.
Bei der Einrichtung werden vier voneinander unabhängige Zugänge gesetzt bzw. sichtbar:
| # | Zugang | Wo gesetzt/geändert | Wo zu finden | Notiz |
|---|---|---|---|---|
| 1 | FRITZ!Box Admin-Kennwort | Teil 1, Schritt 2 (Ersteinrichtung) | FRITZ!Box-Weboberfläche → System → Kennwörter | Schützt die Router-Konfiguration selbst |
| 2 | WLAN-Kennwort „SAS-ARDUINO“ / „SAS-ARDUINO-mobil“ | Teil 1, Schritt 3 | FRITZ!Box-Weboberfläche → WLAN → Funknetz | Wird 1:1 in jeden Sensor-Sketch eingetragen (Bereich A/B/C, siehe Sensorcode-Seite) |
| 3 | Raspberry Pi – SSH-Login (Benutzer pi) | Teil 2, Schritt 4 (bzw. per passwd nachträglich) | Direkt am Pi per SSH änderbar: ssh pi@[IP-Adresse] → passwd | Getrennt vom EmonCMS-Weblogin, eigenes Passwort |
| 4 | EmonCMS – Weblogin (Benutzer emonsd, änderbar) | Teil 2, Schritt 4 | EmonCMS-Oberfläche → My Account | Zusätzlich dort: Read-&-Write- und Read-Only-API-Key (siehe „Sensoren einbinden“, Schritt 1) |
Empfehlung: Für jede Installation (Produktiv-Pi UND ggf. separater Test-/Entwicklungs-Pi) diese vier Zugänge getrennt und mit klarem Bezug zum jeweiligen Gerät im Passwort-Manager ablegen - gerade bei mehreren Pis (z. B. Schul-Livesystem und ein mobiler Test-Pi) erleichtert das die spätere Übersicht erheblich.