Inhaltsverzeichnis
Sensoren in EmonCMS einbinden
| 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…. |
Sensoren in EmonCMS einbinden
Diese Seite beschreibt den Ablauf, um einen bereits fertig verkabelten und geflashten Sensor (hier durchgängig am Beispiel des einfachen BME280-Testsensors, siehe Hauptanleitung und Sensorcode) in EmonCMS sichtbar zu machen und seine Messwerte dauerhaft aufzuzeichnen. Genau derselbe Ablauf wiederholt sich später bei jeder neuen Sensor-Box (Klimamessbox, Raummessbox) – nur die Anzahl der Datenfelder und das passende Feed-Interval unterscheiden sich.
Voraussetzung: Der Testsensor ist fertig konfiguriert (eigene SENSOR_ID, eigener API-Key eingetragen, siehe Hauptanleitung Teil 3 bzw. Sensorcode-Seite) und mit Strom versorgt.
Schritt 1: API-Key besorgen
- In EmonCMS einloggen (Standard: Benutzername
emonsd, siehe Hauptanleitung Teil 2)- Oben rechts auf den Benutzernamen bzw. das Konto-Symbol klicken → „My Account“
- alternativ direkt die Adresse
http://[IP-Adresse-des-Pi]/user/viewaufrufen, z. B.http://192.168.1.2/user/view
- Dort erscheinen zwei Schlüssel:
- „Read & Write API Key“ – dieser wird gebraucht, da der Testsensor Daten *sendet* (
input/post.json) - „Read Only API Key“ – nur für lesende Abfragen/Dashboards, für Sensor-Boxen ungeeignet
- Den „Read & Write API Key“ kopieren
Verwechslungsgefahr: Unter Administration/Setup gibt es eine "Server Information"-Seite mit vielen Systemdaten - dort steht KEIN API-Key! Der Key findet sich ausschließlich unter "My Account" (bzw. der /user/view-Seite des jeweiligen Benutzerkontos).
Wichtig bei mehreren EmonCMS-Installationen (z. B. Produktiv-System und separater Test-/Entwicklungs-Pi): Vor dem Kopieren unbedingt prüfen, bei welcher Installation man gerade eingeloggt ist - die Adressleiste des Browsers zeigt die IP-Adresse des jeweiligen Pi. Ein Key vom Produktiv-System darf niemals in Test- oder Entwicklungs-Sketches landen.
Diesen Wert im Sketch des Testsensors eintragen (siehe Programmcode-Seite, Platzhalter apikey im jeweils aktiven Netzwerk-Bereich A/B/C), Sketch neu hochladen, Testsensor neu starten.
Nachdem der Testsensor läuft, kann EmonCMS eingerichtet werden:
Schritt 2: Prüfen, ob die Messdaten ankommen
Der Testsensor sendet erfolgreich, erkennbar am seriellen Monitor:
13:14:53.275 -> [HTTP] code=200 | T=25.00°C F=49.4% P=1015.0hPa 13:15:23.311 -> [HTTP] code=200 | T=24.97°C F=48.7% P=1014.9hPa 13:15:53.373 -> [HTTP] code=200 | T=24.93°C F=48.5% P=1014.9hPa 13:16:23.428 -> [HTTP] code=200 | T=24.91°C F=48.4% P=1014.9hPa 13:16:53.451 -> [HTTP] code=200 | T=24.90°C F=48.5% P=1015.0hPa
- In EmonCMS zu **Inputs** wechseln
- Sobald der Testsensor mindestens einmal erfolgreich gesendet hat, erscheint dort automatisch ein neuer Eintrag mit dem Node-Namen =
SENSOR_IDdes Testsensors (in diesem Beispiel „100“) - Darunter erscheinen die einzelnen Datenfelder aus dem JSON des Testsensors:
T_C,F_rel,P_hPa
Hinweis zur SENSOR_ID 100: Laut SENSOR_ID-Übersichtstabelle in der Hauptanleitung sind die Bereiche 100-149 künftig für Raummessboxen und 150-199 für Klimamessboxen vorgesehen. Für einen dauerhaft genutzten Testsensor empfiehlt sich daher langfristig eine ID aus dem für Infrastruktur/Tests reservierten Bereich (z. B. 998), um spätere Kollisionen mit echten Raummessboxen zu vermeiden.
Erscheint nach mehreren Minuten immer noch nichts unter "Inputs": - Serielle Debug-Ausgabe des Sensors prüfen (USB-Kabel + Arduino IDE, serieller Monitor bei 115200 Baud) - zeigt HTTP-Statuscode und Fehlermeldungen des letzten Sendeversuchs - API-Key auf Tippfehler prüfen (führt zu HTTP 401 bzw. keiner Aufnahme des Inputs) - Feste IP des Sensors (aus SENSOR_ID) auf Kollision mit einem anderen Gerät im Netz prüfen (siehe SENSOR_ID-Übersichtstabelle in der Hauptanleitung)
Schritt 3: Feeds anlegen (ein Feed pro Messwert)
Für jedes Datenfeld, das dauerhaft gespeichert und später als Diagramm angezeigt werden soll, wird ein eigener Feed angelegt:
- Bei Inputs neben dem gewünschten Feld (z. B.
T_C) auf das Zahnrad-/Stift-Symbol klicken - Bei „Add feed to log“ bzw. über den Prozess „Log to feed“ einen neuen Feed erstellen → „CREATE NEW“
- Feed-Engine: Wird als „Fixed Interval Time Series“ angezeigt – das ist nur die ausgeschriebene Bezeichnung für PHPFina (Standard, empfohlen), keine andere Engine auswählen
- Name wird automatisch aus SENSOR_ID + Feldname vorgeschlagen, z. B.
100_T_C– so übernehmen (gute, eindeutige Namenskonvention bei vielen Sensoren) - Interval unbedingt korrekt setzen (Standardvorschlag ist oft 10s – abändern!) – abhängig vom Sensortyp:
- Testsensor (BME280, siehe Sensorcode-Seite): 10 Sekunden
- Klimamessbox (Außenbereich): 300 Sekunden (5 Min.)
- Raummessbox (Innenbereich): 20 Sekunden
Auffällig umständlicher Klick-Ablauf zum Abschließen (drei separate
Klicks nötig, sonst bleibt nichts gespeichert):
1. "Add" - übernimmt die Einstellungen in die Prozessliste des Inputs
2. "Save" - speichert die Prozessliste dauerhaft (OHNE diesen Klick
geht die Änderung beim Schließen wieder verloren!)
3. "Close" - schließt den Dialog
Alle drei Klicks sind erforderlich, in genau dieser Reihenfolge.
KRITISCH: Das Interval eines PHPFina-Feeds lässt sich nach der Erstellung NICHT mehr ändern! Bei einem falsch gesetzten Interval bleibt nur die Neuanlage des Feeds - alte Daten gehen dabei verloren bzw. müssten aufwändig migriert werden. Vor dem Speichern also lieber zweimal prüfen.
Diesen Vorgang für jedes relevante Feld wiederholen (beim Testsensor 3 Feeds, bei der Klimamessbox später bis zu 7 Feeds, bei der Raummessbox 5 Feeds).
Schritt 4: Feeds kontrollieren
- Zu Feeds wechseln (linke Navigation)
- Dort sollten nun alle drei neu angelegten Feeds des Testsensors auftauchen, mit einem sich regelmäßig aktualisierenden „Last value“
- Für die grafische Kontrolle nicht die Feed-ID als direkte URL aufrufen (z. B.
/graph/11funktioniert bei dieser EmonCMS-Version nicht) – stattdessen über die linke Seitenleiste den Menüpunkt „Data viewer“ (Graph-Symbol) öffnen. Dort links den gewünschten Feed (z. B.T_C) per Häkchen aktivieren, rechts erscheint die Kurve - Zeitraum bei Bedarf über die Felder „Start“/„End“ bzw. den Dropdown (z. B. „1 hour“, „6 hours“) anpassen
Lücken/Aussetzer in der Kurve sind normal, wenn der Sensor zwischendurch neu geflasht, der Pi neu gestartet oder die Systemzeit korrigiert wurde - jede Unterbrechung der Stromversorgung bzw. des Sendevorgangs erzeugt eine Lücke. Ein durchgehend laufender Produktivsensor zeigt eine lückenlose Linie.
Schritt 5 (optional): Dashboard erstellen
Für eine übersichtliche Darstellung mehrerer Werte des Testsensors (oder später mehrerer Boxen) gemeinsam:
- Zu Dashboards wechseln → „New Dashboard“
- Über den Editor „Graph“- oder „Value“-Widgets hinzufügen, jeweils mit dem gewünschten Feed verknüpfen
- Mehrere Widgets lassen sich frei auf der Fläche anordnen (z. B. Temperatur- und Luftdruck-Verlauf des Testsensors nebeneinander)
- Dashboard speichern und ggf. über „Make public“ auch ohne Login einsehbar machen (z. B. für einen Klassenraum-Bildschirm)
Stolpersteine
- Input-Feld heißt anders als erwartet: Die Feldnamen im JSON (beim Testsensor:
T_C,F_rel,P_hPa; bei den vollständigen Boxen zusätzlichCO2_ppm,PM25,PM10,H_bit) müssen exakt mit denen im Sketch übereinstimmen – Groß-/Kleinschreibung wird unterschieden. Bei Unsicherheit den Sketch-Quellcode (Funktionloop/HTTP-POST-Body) als Referenz nutzen - Feed zeigt „no data“ trotz laufendem Testsensor: Meist wurde der Prozess „Log to feed“ nicht korrekt mit dem Input-Feld verknüpft – unter Inputs → Zahnrad-Symbol → Prozessliste prüfen, ob der Log-to-feed-Eintrag wirklich vorhanden ist
- Falsches Interval gewählt: Es gibt keine Fehlermeldung – das System läuft einfach mit schlechterer Datenqualität weiter:
- Feed-Interval länger als der tatsächliche Sendetakt des Sensors (z. B. Sensor sendet alle 10 s, Feed steht auf 60 s): EmonCMS speichert pro Zeitschlitz nur den zuletzt eingetroffenen Wert – alle dazwischenliegenden Messungen werden kommentarlos überschrieben, bevor sie je gespeichert wurden, und gehen verloren
- Feed-Interval kürzer als der tatsächliche Sendetakt (z. B. Sensor sendet alle 120 s, Feed steht auf 30 s): Für die meisten Zeitschlitze kommt kein neuer Wert an, sie bleiben leer (
null) – das Diagramm wirkt lückenhaft/gezackt - In beiden Fällen: keine Fehlermeldung, kein Absturz, aber nachträglich nicht reparierbar (Interval-Änderung nur durch Neuanlage des Feeds möglich, siehe Warnhinweis oben). Deshalb: Feed-Interval muss exakt dem
MESSINTERVALL_MS/Schreibpause-Wert im jeweiligen Sketch entsprechen
- Ab dem 33. Sensor erscheint kein neuer Input, in der seriellen Ausgabe steht „Reached the maximal allowed number of different NodeIds, limit is 32. Node '138' was ignored.“: EmonCMS erlaubt standardmäßig nur 32 verschiedene Nodes pro Benutzerkonto (jede
SENSOR_IDist ein eigener Node). Der Server antwortet dabei trotzdem mit HTTP 200 – der Fehler steht nur im Antworttext. Die Daten des abgewiesenen Sensors werden verworfen. Das Limit lässt sich auf dem Pi erhöhen:
sudo nano /var/www/emoncms/settings.ini
Im Abschnitt ''[input]'' die Zeile ''max_node_id_limit'' ergänzen bzw. ändern (z. B. auf 100):
[input] max_node_id_limit = 100
Speichern und den Webserver neu starten: ''sudo systemctl restart apache2''. Bereits eingebundene Sensoren bleiben unverändert, der abgewiesene Sensor erscheint nach der nächsten Sendung unter „Inputs“ * **Neuer oder ausgetauschter ESP mit bereits verwendeter SENSOR_ID: Die ersten Sendungen scheitern mit „code=-1 (connection failed)“, obwohl das WLAN verbunden ist, und nach 1–3 Minuten läuft es von selbst:** Wahrscheinliche Ursache ist ein veralteter Eintrag in der ARP-Tabelle des Pi. Er kennt für die IP-Adresse (192.168.1.SENSOR_ID) noch die MAC-Adresse des früheren Geräts und schickt die Antworten dorthin. Abhilfe per SSH auf dem Pi (IP durch die des betroffenen Sensors ersetzen):
ip neigh show 192.168.1.207 sudo ip neigh flush 192.168.1.207
Der erste Befehl zeigt den gespeicherten Eintrag; steht dort eine andere MAC-Adresse als die des neuen ESP, ist das die Bestätigung. Nach dem ''flush'' den ESP neu starten – Versuch 1 klappt dann sofort. Ohne Eingriff lösen die Wiederholversuche des Sketches das Problem meist von selbst, es entstehen aber Lücken in der Aufzeichnung * **Zwei Feeds mit identischem Namen:** EmonCMS erlaubt das technisch, führt aber zu Verwirrung bei der späteren Auswertung – eindeutige Namenskonvention (SENSOR_ID + Feldname) von Anfang an einhalten * **Werte wirken "verzögert":** Bei einer langsam messenden Box (z. B. Klimamessbox mit größerem Intervall) ist das normal – die Grafik aktualisiert sich dann entsprechend seltener. Beim Testsensor (10 Sekunden) ist die Aktualisierung deutlich schneller sichtbar
Copyright (C) 2025 Biebl/Sankt-Ansgar-Schule Hamburg
"Klimamessstation für Schulen" von Martin Biebl/Sankt-Ansgar-Schule Hamburg, lizenziert unter CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/)
Diese Programme sind freie Software: Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren Version. Die Veröffentlichung dieser Programme erfolgt in der Hoffnung, dass es Ihnen von Nutzen sein wird, aber OHNE JEDE GEWÄHRLEISTUNG, sogar ohne die implizite Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. Vollständiger Lizenztext: https://www.gnu.org/licenses/gpl-3.0.de.html

