ThingSpeak – Data naar ThingSpeak versturen
Op deze pagina vind je verschillende manieren in programmeertalen om data naar een ThingSpeak server te zenden.
Om bijvoorbeeld gegevens naar ThingSpeak te zenden is deze “API” http call nodig:
1 |
GET https://api.thingspeak.com/update?api_key=[APIKEY]&field1=0 |
PHP (Webserver, Raspberry Pi, Synology NAS)
Simpele code, een GET commando is voldoende:
1 2 3 4 5 6 7 8 |
<?php $url = 'http://api.thingspeak.com/update'; $ThingSpeakApiKey = ""; $veld1waarde = "9"; $handle = fopen($url . "?key=" . $ThingSpeakApiKey . "&field1=" . $veld1waarde, "r"); echo $handle; ?> |
Onderstaande script maakt gebruik van de CURL functie in PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $url = 'http://api.thingspeak.com/update'; $ThingSpeakApiKey = ""; $veld1waarde = "20"; $data = 'key=' . $ThingSpeakApiKey . '&field1=' . $veld1waarde; $ch = curl_init($url); curl_setopt( $ch, CURLOPT_POST, 1); curl_setopt( $ch, CURLOPT_POSTFIELDS, $data); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec( $ch ); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $httpcode; ?> |
Python (Raspberry Pi, Synology NAS)
Simpele code, een GET commando is voldoende:
1 2 3 4 5 6 7 |
import urllib2 ThingSpeakUrl = "http://api.thingspeak.com:80/update" ThingSpeakApiKey = "" veld1waarde = 18 urllib2.urlopen(ThingSpeakUrl + "?key=" + ThingSpeakApiKey + "&field1=" + str(veld1waarde)) |
Moeilijke methode, gevonden hier en hier op het internet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import httplib, urllib ThingSpeakUrl = "api.thingspeak.com" ThingSpeakApiKey = "" veld1waarde = 37 params = urllib.urlencode({'field1': veld1waarde, 'key': ThingSpeakApiKey}) headers = {"Content-typZZe": "application/x-www-form-urlencoded","Accept": "text/plain"} conn = httplib.HTTPConnection(ThingSpeakUrl) try: conn.request("POST", "/update", params, headers) response = conn.getresponse() print response.status, response.reason data = response.read() conn.close() except: print "connection failed" |
AT (ESP8266 met standaard AT firmware)
Met onderstaande AT code kun je bijvoorbeeld eenvoudig via een seriele poort (TTL) of microcontroller data sturen naar thingspeak,
1) Maak internet verbinding met de ESP8266 module (AT)
2) Stel de ESP in voor simultane verbindingen:
AT+CIPMUX=1
3) Start een sessie met de thingspeak server:
AT+CIPSTART=4,"TCP","184.106.153.149",80 (4 is de kanaal ID)
4) Geef aan hoeveel bytes je gaat sturen (voeg daar 4 bytes aan toe voor /r/n):
AT+CIPSEND=4,44 (4 is de kanaal ID)
5) Geef een GET commando om de waarde door te sturen naar thingspeak:
GET /update?key=[APIKEY]&field1=[WAARDE]
Ps. vul de API KEY en WAARDE in, voorbeeld:
GET /update?key=J4P1ABCZI6ZF0ABC&field1=60
Ga je bijvoorbeeld een waarde als 1048 verzenden dan is CIPSEND 46 byte!: AT+CIPSEND=4,46
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
AT+CIPMUX=1 OK AT+CIPSTART=4,"TCP","184.106.153.149",80 4,CONNECT OK AT+CIPSEND=4,44 OK > Recv 44 bytes SEND OK +IPD,4,1:14,CLOSED |
Bron: mcuoneclipse.com
AT versie: V1.3.02_V0.40_AI_AT
1 2 3 4 5 6 7 |
AT+CWMODE=1 AT+MUX=0 AT+CIPSTART="TCP","192.168.178.33",3000 AT+CIPSEND=45 GET /UPDATE?KEY=FRN*************&FIELD1=60 SEND=OK +IP,1:9CLOSED |
LUA (ESP8266 met NodeMCU firmware)
Onderstaande code stuurt bijvoorbeeld elke 60 seconden (aan de passen bij tmr.alarm) sensorgegevens door naar Thingspeak.
TIP: Sluit een sensor aan, en modificeer “veld1waarde” als de waarde van de sensor, sla de code op in het bestand “init.lua“, dan wordt het script automatisch uitgevoerd bij activeren van de ESP8266 module!
Ps. Vul je SSID, wachtwoord en API key in!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
wifi.setmode(wifi.STATION); wifi.sta.config("" ,""); function postThingSpeak() url = "api.thingspeak.com" ThingSpeakApikey = "" veld1waarde = 7 connout = nil connout = net.createConnection(net.TCP, 0) connout:on("receive", function(connout, payloadout) if (string.find(payloadout, "Status: 200 OK") ~= nil) then print("Posted OK"); end end) connout:on("connection", function(connout, payloadout) print ("Posting..."); connout:send("GET /update?api_key=" .. ThingSpeakApikey .. "&field1=" .. veld1waarde .. " HTTP/1.1\r\n" .. "Host: api.thingspeak.com\r\n" .. "Connection: close\r\n" .. "Accept: */*\r\n" .. "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n" .. "\r\n") end) connout:on("disconnection", function(connout, payloadout) connout:close(); collectgarbage(); end) connout:connect(80, url) end tmr.alarm(1, 60000, 1, function() postThingSpeak() end) |
ESP8266 (met ArduinoIDE firmware)
Onderstaande code stuurt bijvoorbeeld elke 60 seconden (aan de passen bij delay(60000)) sensorgegevens door naar Thingspeak.
TIP: Sluit een sensor aan, en modificeer “veld1waarde” als de waarde van de sensor, en upload naar de ESP8266 module met ArduinoIDE.
Ps. Vul je SSID, wachtwoord en API key in!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#include <ESP8266WiFi.h> //Instellingen String apiKey = ""; const char* ssid = ""; const char* password = ""; const char* server = "api.thingspeak.com"; WiFiClient client; void setup() { Serial.begin(9600); delay(10); WiFi.begin(ssid, password); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); } void loop() { float veld1waarde = 24.2; if (client.connect(server,80)) { String postStr = apiKey; postStr +="&field1="; postStr += String(veld1waarde); //postStr +="&field2="; //postStr += String(veld2waarde); postStr += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); Serial.println("Data send to Thingspeak"); } client.stop(); Serial.println("Waiting..."); delay(60000); // thingspeak needs minimum 15 sec delay between updates } |
C++ (Arduino met EthernetShield W5100)
Onderstaande code stuurt bijvoorbeeld elke 60 seconden (aan de passen bij “60L * 1000L”) sensorgegevens door naar Thingspeak.
TIP: Sluit een sensor aan, en modificeer “veld1waarde” als de waarde van de sensor, en upload naar de Arduino UNO/MEGA.
Ps. Vul je SSID, wachtwoord en API key in!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <SPI.h> #include <Ethernet.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; char server[] = "api.thingspeak.com"; String ThingSpeakApikey = "AAOKLNNMKPCRCX8O"; float veld1waarde = 13.25; IPAddress ip(192, 168, 0, 177); EthernetClient client; unsigned long lastConnectionTime = 0; const unsigned long postingInterval = 60L * 1000L; // delay in milliseconds // the "L" is needed to use long type numbers void setup() { Serial.begin(9600); while (!Serial) { ; } delay(1000); Ethernet.begin(mac, ip); Serial.print("My IP address: "); Serial.println(Ethernet.localIP()); } void loop() { if (client.available()) { char c = client.read(); Serial.write(c); } if (millis() - lastConnectionTime > postingInterval) { httpRequest(); } } void httpRequest() { client.stop(); if (client.connect(server, 80)) { Serial.println("connecting..."); client.println("GET /update?key=" + ThingSpeakApikey + "&field1=" + String(veld1waarde) + " HTTP/1.1"); client.println("Host: www.arduino.cc"); client.println("User-Agent: arduino-ethernet"); client.println("Connection: close"); client.println(); Serial.println("connecting..."); lastConnectionTime = millis(); } else { Serial.println("connection failed"); } } |
Bron: Arduino voorbeeld in ArduinoIDE
CURL (BASH, Raspberry Pi, Synology NAS)
Deze methode gebruikt de curl (binairy), je kan het zo vanuit de shell uitvoeren:
1 |
curl --silent --request POST --header "X-THINGSPEAKAPIKEY: [APIKEY]" --data "field1=40" "http://api.thingspeak.com/update" |
CURL icm BASH script (Raspberry Pi, Synology NAS)
Het volgende BASH script zal de temperatuur van de Raspberry Pi naar thingspeak zenden:
1 2 3 4 5 6 7 8 |
#!/bin/bash apiKey=[APIKEY] temp=$(cat /sys/class/thermal/thermal_zone0/temp | awk '{ print $1/1000 }') echo "Temp: $temp C" update=$(curl --silent --request POST --header "X-THINGSPEAKAPIKEY: $apiKey" --data "field1=$temp" "http://api.thingspeak.com/update") echo "Update #$update" |
TER INFO: Beheer van het ThingSpeak kanaal
Databeheer via de API:
1 |
GET https://api.thingspeak.com/update?api_key=VZEZSYPWE7OLE7A1&field1=0 |
1 2 3 |
POST https://api.thingspeak.com/update.json api_key=VZEZSYPWE7OLE7A1 field1=73 |
1 |
GET https://api.thingspeak.com/channels/12345/feeds.json?results=2 |
1 |
GET https://api.thingspeak.com/channels/12345/fields/1.json?results=2 |
1 |
GET https://api.thingspeak.com/channels/12345/status.json |
Kanaalbeheer via de API:
1 2 3 |
POST https://api.thingspeak.com/channels.json api_key=VZEZSYPWE7OLE7A1 name=My New Channel |
1 2 3 |
PUT https://api.thingspeak.com/channels/12345 api_key=VZEZSYPWE7OLE7A1 name=Updated Channel |
1 2 |
DELETE https://api.thingspeak.com/channels/12345/feeds.json api_key=VZEZSYPWE7OLE7A1 |
1 2 |
DELETE https://api.thingspeak.com/channels/12345 api_key=VZEZSYPWE7OLE7A1 |