Iot Service ThingSpeak, einrichten und betreiben
Mit dem Service von ThingSpeak.com kann man Daten von seinen IoT GerÀten auswerten und grafisch anzeigen lassen. Und wie man dieses macht, möchte ich in diesem Tutorial beschreiben.
Wenn du dich bereits auf ThingSpeak.com registriert und angemeldet hast, so kannst du das erste Kapitel gerne ĂŒberspringen und mit der "Einrichten eines Channels" fortfĂŒhren.
Registrieren auf ThingSpeak
Bevor man diesen Service nutzen kann, muss man sich registrieren (wie bei so vielen anderen Services dieser Art).Â
Auf der Hauptseite wird die grĂŒne SchaltflĂ€che "Get Started For Free" geklickt und man wird dann (nach einer kurzen Ladezeit) weitergeleitet.
Einrichten eines Accounts auf ThingSpeak
Die eigentliche Anmeldung erfolgt auf der neuen Seite, nachdem man die Felder befĂŒllt hat und die Checkbox fĂŒr das
Akzeptieren der "Online Service Agreement" aktiviert hat, wird die SchaltflÀche "Continue" zum Klicken freigegeben.
ThingSpeak Registrieren eines neuen Benutzers
Bei der Eingabe des Passwortes gibt es folgende Regeln zu beachten:
ThingSpeak - Regeln fĂŒr das Passwort eines Benutzers
Nachdem die Registrierung des neuen Benutzers abgesendet wurde, erhĂ€lt man eine E-Mail, welche man bestĂ€tigen muss. Hier hat mich als erstes gewundert das diese von der Adresse mathworks.com stammt und nicht von thingspeak.com.Â
BestÀtigungsmail von mathworks.com
Wurde nun das Profil aktiviert, so kann man sich unter der Adresse https://thingspeak.com/login anmelden. Im ersten Schritt der Anmeldung gibt man die E-Mail-Adresse ein.Â
ThingSpeak - Anmelden Schritt #1 E-Mail Adresse eingeben
Im zweiten Schritt wird nun zusĂ€tzlich das Passwort mit eingegeben, hier taucht auch nun der Hinweis auf das man sich eigentlich bei MathWorks.com anmeldet. Es erschlieĂt sich hier nicht warum man sich bei thingspeak.com anmelden muss um den Service von mathworks.com nutzen kann.
ThingSpeak -Anmelden Schritt #2 - Passwort eingeben und bei MathWorks.com anmelden
Nach der Eingabe des Passwortes und dem klicken auf die SchaltflÀche "Sign In" wird man weitergeleitet und es erscheint die Meldung:
Thingspeak - Anmeldung erfolgreich
Einrichten eines Channels
Nachdem wir uns nun auf ThingSpeak registriert und angemeldet haben können wir uns einen Channel anlegen. Das Anlegen eines neuen Channels geschieht mit der SchaltflÀche "New Channel".
ThingSpeak - Channel erstellen
In der neuen Seite wird nun der Channel angelegt. Es gibt KEINE Pflichtfelder in dieser Maske man kann also auch einfach die SchaltflÀche "Save Channel" betÀtigen.
Aber gehen wir die Felder von oben nach untern durch einmal durch:
Name
Hier wird der Name des Channels vergeben.
Description
Eine kurze Beschreibung des Channels
Field(n)
Ein Feldbezeichner, dieser wird im Diagramm als Achsenbezeichnung genutzt. Das erste Eingabefeld und die Checkbox ist aktiviert. Um weitere Felder und somit Diagramme zu nutzen mĂŒssen die jeweiligen Checkboxen und dann natĂŒrlich die Eingabefelder befĂŒllt werden.
Metadata
ErlÀuterung der Daten des Channels, hier können Strukturen wie JSON, XML oder CSV Daten abgelegt werden.
Tags
Hier können SchlĂŒsselwörter aufgefĂŒhrt werden, um den Channel hervorzuheben.
Link to External Site
Wenn eine externe, Webseite fĂŒr diesen Channel existiert, so kann diese hier genannt und spĂ€ter verlinkt werden.
Link to GitHub
Wenn der Quellcode welcher fĂŒr ThingSpeak verwendet wird auf einem Repository bei GitHub gehostet wird, so kann dieses hier angegeben werden. (Dazu sollte natĂŒrlich das Repository "public" sein.)
Elevation
Die Höhe der Messstation in Meter ĂŒber dem Meeresspiegel.
Show Channel Location
Wenn die Checkbox aktiviert ist, so werden die Eingabefelder fĂŒr "Latitude" & "Longitude" fĂŒr die Eingabe aktiviert.
Show Video
Wenn die Checkbox aktiviert ist, so kann man wiederum wĂ€hlen, ob ein Video auf YouTube oder Vimeo verlinkt werden soll, welches spezielle oder weitere Informationen zu diesem Channel bietet. Es wird bei der Aktivierung auch das Eingabefeld "Video URL" fĂŒr die Eingabe aktiviert.
Show Status
Wenn die Checkbox aktiviert wird dann ???
SchaltflÀche "Save Channel"
Nachdem alle erforderlichen Felder befĂŒllt wurden, sind, kann der neue Channel gespeichert werden.
Im vorherigen Schritt haben wir einen Channel erzeugt, welchen wir nun weiter verwenden möchten.Â
Navigieren wir dazu ĂŒber die MenĂŒpunkte "Channels", "My Channels" zur Ăbersichtsseite und wĂ€hlen dort den neu erzeugten Channel aus.
ThingSpeak - Channel Reiter und Informationen
Auf der Ăbersichtsseite des Channels sieht man neben dem Namen, dem Benutzernamen und der Beschreibung auch die Diagramme (welche zuerst leer und ohne jegliche Beschriftung sind).
ThingSpeak - leeres Diagramm
Ăber dem Diagramm findet man die kleine MenĂŒleiste, um das Diagramm zu konfigurieren. Wollen wir also zuerst unser Diagramm korrekt beschriften. Dazu klicken wir auf das weiĂe Stiftsymbol. Es sollte sich nun ein kleiner Dialog öffnen, in welchem wir das Diagramm konfigurieren können.
ThingSpeak - Channel Diagramm konfigurieren
Wir wollen in dieses Diagramm spĂ€ter Daten von einem DHT22 Sensor ĂŒber einen Wemos D1 mini (ESP8266) eintragen.
Nun sollte das Diagramm wie folgt aussehen:
Thingspeak - Channel_Diagramm fĂŒr Temperatur "konfiguriert"
Abrufen und EinfĂŒgen von Daten in den Channel
Nun kommen wir zu dem Hauptteil, dem EinfĂŒgen von Daten in den Channel. Dieses wird mit einem einfachen HTTP/S Request gemacht. Hierzu navigieren wir zuerst im geöffneten Channel zum Reiter "API Keys". Dort finden wir rechts die verschiedenen HTTP/S Request welche man vom GerĂ€t oder Browser absenden kann.
Zum Testen verwende ich das Tool Postman, welches es auch als Browser-Plugin fĂŒr Google Chrome gibt. Dieses Tool hat einige Vorteile, wenn man sich anmelden muss und so den HTTP Header bearbeiten muss.
Abrufen von Daten
Wollen wir uns zuerst die Daten abrufen. Hierzu nutzen wir den HTTP/S Request aus dem Bereich "Get a Channel Feed". In meinem Fall lautet die Adresse "https://api.thingspeak.com/channels/617084/feeds.json?results=2" wenn diese nun ĂŒber den Browser abgesendet wird, so erhĂ€lt man einen JSON Respond (Anwort vom Server) mit den Daten aus dem Channel (inkl. den Kopfdaten).
{
"channel": {
"id": 617084,
"name": "MyTest",
"description": "Ein Test",
"latitude": "0.0",
"longitude": "0.0",
"field1": "Temperatur",
"created_at": "2018-11-02T10:47:18Z",
"updated_at": "2018-11-02T20:25:50Z",
"last_entry_id": null
},
"feeds":
}
Da es aber bisher noch keine Daten gibt, ist das Array von "feeds" leer.
FĂŒgen wir also einen Datensatz ein.
EinfĂŒgen von Daten
Ăhnlich wie das Abrufen funktioniert auch das Absenden von Daten, hier muss nur ein anderer Request verwendet werden. Es wird nun der HTTP/S Request aus dem Bereich "Update a Channel Feed" genutzt. In meinem Fall lautet die Adresse "https://api.thingspeak.com/update?api_key=TGYVOE76T8X0S3B5&field1=0". Hier muss man noch zusĂ€tzlich den Wert fĂŒr den SchlĂŒssel "field1" anpassen.Â
Wenn Gleitkommazahlen abgesendet werden sollen, so mĂŒssen diese mit einem Punkt getrennt sein.Â
Als RĂŒckgabe erhĂ€lt man hier eine Zahl >-1 diese reprĂ€sentiert die Anzahl der DatensĂ€tze, welche in dem Channel zu diesem Feed existieren.
In diesem Tutorial nutze ich die kostenfreie Version von ThingSpeak diese hat gegenĂŒber der kostenpflichtigen Version die EinschrĂ€nkung das Intervall zum Absenden von Daten auf 15 Sekunden begrenzt ist. Sollte der Updateintervall noch nicht erreicht sein, so wird eine "0" zurĂŒckgeliefert.
Beispiel #1 - Wemos D1 mini mit DHT22 Sensor
In diesem Beispiel möchte ich nun anhand eines Wemos D1 mini mit dem DHT22 Sensor Shield zeigen wie man die Daten an den IoT Service von ThingSpeak sendet.
Das DHT22 Shield fĂŒr den Wemos D1 mini habe ich bereits im Tutorial Wemos D1 mini Shield: DHT22 Shield erlĂ€utert, daher möchte ich hier auf die Verbindung zum Service von ThingSpeak eingehen.Â
Schritt #1Â - erstellen eines Channels
Der DHT22 Sensor liefert Daten ĂŒber die Temperatur sowie der Luftfeuchtigkeit. Daher wird nun im ersten Schritt ein Channel erzeugt, wo zwei Felder angelegt werden (jeweils ein Feld fĂŒr die Temperatur sowie eines fĂŒr die Luftfeuchtigkeit).
Channel fĂŒr einen DHT22 Sensor
Schritt #2 - Verbindung zu einem internen Netzwerk aufbauen
Damit der Wemos D1 mini mit dem Internet verbunden werden kann, muss man zunĂ€chst eine Verbindung zu einem internen Netzwerk aufbauen. Im folgenden Sketch muss die SSID und das WLAN Passwort vom eigenen Router ergĂ€nzt werden.Â
#include
const char* ssid = ""; //SSID aus dem Router
const char* password = ""; //Passwort fĂŒr den Zugang zum WLAN
WiFiServer server(80); //Port auf welchem der Server laufen soll.
void setup() {
Serial.begin(115200); //Baudrate fĂŒr die Serielle Geschwindigkeit.
delay(10); //10ms. Warten damit die Seriele Kommunikation aufgebaut wurde.
Serial.print("Aufbau der Verbindung zu: "); //Ausgabe der SSID auf der Seriellen Schnittstelle.
Serial.println(ssid);
WiFi.begin(ssid, password); //Initialisieren der Wifi Verbindung.
while (WiFi.status() != WL_CONNECTED) { //Warten bis die Verbindung aufgebaut wurde.
delay(500);
//Einen Punkt auf der Seriellen Schnittstelle ausgeben so das der Benutzer erkennt dass, das Sketch noch lÀuft.
Serial.print(".");
}
//Bei erfolgreicher Verbindung wird der folgende Text ausgeben.
Serial.print("Mit ");
Serial.print(ssid);
Serial.print("erfolgreich verbunden!");
server.begin(); // Starten des Servers.
Serial.println("Server gestartet"); //Ausgabe auf der Seriellen Schnittstelle das der Server gestartet wurde.
// Ausgabe der IP Adresse
Serial.print("Adresse : http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {}
Schritt #3 - Auslesen der Werte vom DHT22 Sensor Shield
Im nĂ€chsten Schritt werden nun die Werte vom DHT22 Sensor Shield gelesen. Mein Plan war es das DHT22 Shield fĂŒr den Wemos D1 mini zu nutzen jedoch hat mein Mikrocontroller ein Problem mit dem digitalen Pin D4 und genau dieser wird von dem Shield benötigt. Somit habe ich zu einem "normalen" DHT22 Sensor gewechselt.
#include "DHT.h"
#define DHT22PIN D1
#define DHT22TYPE DHT22
DHT dht22(DHT22PIN, DHT22TYPE);
void setup(){
Serial.begin(74880);
Serial.println("DHT22");
dht22.begin();
}
void loop(){
float humidyDHT22 = dht22.readHumidity(); //relative Luftfeuchtigkeit vom Sensor DHT22 lesen
float tempDHT22 = dht22.readTemperature(); //Temperatur vom Sensor DHT22 lesen
// PrĂŒfen ob eine gĂŒltige gleitkomma Zahl empfangen wurde.
// Wenn NaN (not a number) zurĂŒckgegeben wird, soll eine Fehlermeldung ausgeben werden.
if (isnan(humidyDHT22) || isnan(tempDHT22)) {
Serial.println("DHT22 konnte nicht ausgelesen werden");
} else {
printValues("DHT22", humidyDHT22, tempDHT22);
}
delay(15000);
}
void printValues(String sensor, float humidy, float temp){
Serial.print(sensor);
Serial.print("t");
Serial.print("Luftfeuchte: ");
Serial.print(humidy);
Serial.print(" %t");
Serial.print("Temperatur: ");
Serial.print(temp);
Serial.println(" C");
}
Ich habe in diesem Sketch die serielle Ausgabe mit 74880 Baud ausgegeben, dieses hat den Vorteil das man zusĂ€tzlich die Debugausgaben vom Wemos D1 mini zu sehen bekommt.Â
Die Ausgabe auf dem seriellen Monitor der Arduino IDE sieht dann wie folgt aus:
DHT22
DHT22 Luftfeuchte: 61.20 % Temperatur: 22.60 C
DHT22 Luftfeuchte: 61.50 % Temperatur: 22.60 C
DHT22 Luftfeuchte: 61.40 % Temperatur: 22.60 C
DHT22 Luftfeuchte: 62.40 % Temperatur: 22.60 C
DHT22 Luftfeuchte: 61.60 % Temperatur: 22.60 C
DHT22 Luftfeuchte: 61.90 % Temperatur: 22.60 C
DHT22 Luftfeuchte: 62.40 % Temperatur: 22.60 C
Im nÀchsten Schritt werden wir also die beiden Sketche aus Schritt 2 & 3 verbinden und die Daten absenden.
Schritt #4 - Absenden der Daten
Und im letzten Schritt senden wir die Daten an den Service von ThingSpeak. Da ich wie bereits erwÀhnt den kostenfreien Service nutzen kann ich nur alle 15 Sekunden einen neuen Wert senden. Ich gebe hier jedoch einen kleinen Puffer (2sek.) darauf damit ich sicher sein kann das Intervall stimmen.
Adressen
FĂŒr das Absenden von Temperaturdaten verwenden wir die AdresseÂ
https://api.thingspeak.com/update?api_key=APY8I2NQXTAVJ1OL&field1=0&field2=0
Diese Adresse enthĂ€lt die SchlĂŒssel / Werte Paare "field1" sowie "field2", es muss hier die Zahl 0 durch den entsprechenden Wert ersetzt werden.
Quellcode
Der finale Quellcode sieht dann wie folgt aus:
#include "DHT.h"
#include
#include
#include
#define DHT22PIN D1
#define DHT22TYPE DHT22
DHT dht22(DHT22PIN, DHT22TYPE);
const char* ssid = ""; //SSID aus dem Router
const char* password = ""; //Passwort fĂŒr den Zugang zum WLAN
ESP8266WiFiMulti WiFiMulti;
HTTPClient http;
String url = "http://api.thingspeak.com/update?api_key=APY8I2NQXTAVJ1OL&field1=";
void setup(){
Serial.begin(74880);
dht22.begin();
WiFiMulti.addAP(ssid, password);
Serial.print("time");
Serial.print("t");
Serial.print("httpCode");
Serial.print("t");
Serial.print("humidity (%)");
Serial.print("t");
Serial.print("temp");
Serial.print("temperature (°C)");
Serial.print("t");
Serial.println("url");
}
void loop(){
if((WiFiMulti.run() == WL_CONNECTED)) {
float humidyDHT22 = dht22.readHumidity();
float tempDHT22 = dht22.readTemperature();
if (isnan(humidyDHT22) || isnan(tempDHT22)) {
Serial.println("DHT22 konnte nicht ausgelesen werden");
} else {
sendDht22Data(url, tempDHT22,humidyDHT22);
}
delay(15500);
}
}
void sendDht22Data(String ineturl, float tempValue, float humidityValue){
String url = ineturl + tempValue + "&field2=" + humidityValue;
http.begin(url);
Serial.print(millis());
int httpCode = http.GET();
Serial.print("t");
Serial.print(httpCode);
Serial.print("t");
Serial.print(humidityValue);
Serial.print("t");
Serial.print(tempValue);
Serial.print("t");
Serial.println(url);
Read the full article