So ein Dashboard, hier am Beispiel der CO2 Messungen ist mit dem Cloud Anbieter Ubidots.com schnell gemacht. Kostenlos gibt es 3 Geräte. Es muss ja auch nicht immer Thinkspeak sein.
Hier ist der Api Token zu finden:
Der z.B. in diesem Python Script eingetragen werden muss:
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 58 59 60 61 62 63 |
# # Script zum senden der CO2 und Temperatur Werte an Ubidots.com # # Thomas Wenzlaff http://www.wenzlaff.info import time import requests import math import random import sys import json API_TOKEN = "BBFF...." DEVICE_LABEL = "pi-bplus" VARIABLE_LABEL_1 = "temperatur" VARIABLE_LABEL_2 = "co2" VARIABLE_LABEL_3 = "position" # Position von Langenhagen, latitude und longitude LAT = 52.44758 LNG = 9.73741 def build_payload(variable_1, variable_2, variable_3): # Das JSon das gelesen wird: # {"SS": 0, "UhUl": 2048, "TT": 64, "co2": 402, "temperature": 24} input_json = json.loads(sys.argv[1]) co2 = input_json['co2'] temp = input_json['temperature'] payload = {variable_1: temp, variable_2: co2, variable_3: {"value": 1, "context": {"lat": LAT, "lng": LNG}}} return payload def post_request(payload): url = "http://industrial.api.ubidots.com" url = "{}/api/v1.6/devices/{}".format(url, DEVICE_LABEL) headers = {"X-Auth-API_TOKEN": API_TOKEN, "Content-Type": "application/json"} status = 400 attempts = 0 while status >= 400 and attempts <= 5: req = requests.post(url=url, headers=headers, json=payload) status = req.status_code attempts += 1 time.sleep(1) if status >= 400: print("[ERROR] Could not send data after 5 attempts, please check \ your API_TOKEN credentials and internet connection") return False return True def main(): payload = build_payload( VARIABLE_LABEL_1, VARIABLE_LABEL_2, VARIABLE_LABEL_3) print("[INFO] Sende Daten an ubidots.com ...") post_request(payload) print("[INFO] gesendet") if __name__ == '__main__': main() |
Das Python-Script, senden die drei Werte CO2, Temperatur und den Ort an Ubidots. Es ist auch hier zu finden.
Will man einen Java-Client erstellen, um die Daten abzufragen, geht das auch mit ein paar Zeilen. Es muss nur die ubidots-java Lib eingebunden werden. In der pom.xml folgenden Abhängigkeit ergänzen:
1 2 3 4 5 |
<dependency> <groupId>com.ubidots</groupId> <artifactId>ubidots-java</artifactId> <version>1.6.6</version> </dependency> |
Dann diese UbidotsClient Klasse erstellen:
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 |
package de.wenzlaff.ubidots; import java.util.ArrayList; import java.util.List; import com.ubidots.ApiClient; import com.ubidots.DataSource; import com.ubidots.Variable; /** * Java Ubitods CSV Client. * * @author Thomas Wenzlaff */ public class UbidotsClient { private static final String API_KEY = "BBFF-..."; // aus dem Menü: My Profil - Api Credential public static void main(String[] args) { Variable[] alleVariablen = getAlleVariablen(API_KEY); List<CsvView> alleCsv = toCsv(alleVariablen); for (CsvView csvView : alleCsv) { String titel = csvView.getTitel(); System.out.println(titel); System.out.println(csvView); } } private static List<CsvView> toCsv(Variable[] alleVariablen) { List<CsvView> alleCsv = new ArrayList<>(); for (Variable v : alleVariablen) { CsvView csv = new CsvView(); csv.setValue(v); alleCsv.add(csv); } return alleCsv; } private static Variable[] getAlleVariablen(String apiKey) { ApiClient api = new ApiClient(apiKey); DataSource[] dataSources = api.getDataSources(); Variable[] alleVariablen = dataSources[0].getVariables(); // pi-bplus return alleVariablen; } } |
Und hier noch eine kleine View Klasse CsvView um CSV zu erzeugen:
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 58 59 60 61 62 |
package de.wenzlaff.ubidots; import com.ubidots.Variable; /** * CSV Objekt für Variablen von Ubidots. * * @author Thomas Wenzlaff * */ public class CsvView { private static final String TRENNER = ", "; private Variable wert; public CsvView(Variable v) { this.wert = v; } public CsvView() { wert = null; } @Override public String toString() { StringBuilder builder = new StringBuilder(); if (wert != null) { builder.append(wert.getName()); builder.append(TRENNER); builder.append(wert.getMean()); builder.append(TRENNER); builder.append(wert.getUnit()); builder.append(TRENNER); builder.append(wert.getMax()); builder.append(TRENNER); builder.append(wert.getMin()); builder.append(TRENNER); builder.append(wert.getSum()); builder.append(TRENNER); builder.append(wert.getVariance()); builder.append(TRENNER); builder.append(wert.getCount()); builder.append(TRENNER); } return builder.toString(); } public String getTitel() { return "Name, Mittelwert, Einheit, Max, Min, Summe, Varianz, Anzahl ,"; } public void setValue(Variable v) { this.wert = v; } } |
Das Ergebnis z.B.
1 2 3 4 5 6 |
Name, Mittelwert, Einheit, Max, Min, Summe, Varianz, Anzahl , co2, 670.58, ppm, 1156.0, 400.0, 1195642.0, 17293.29, 1783.0, Name, Mittelwert, Einheit, Max, Min, Summe, Varianz, Anzahl , position, 1.0, null, 1.0, 1.0, 1783.0, 0.0, 1783.0, Name, Mittelwert, Einheit, Max, Min, Summe, Varianz, Anzahl , temperatur, 23.63, null, 25.0, 21.0, 42135.0, 0.28, 1783.0, |