{"id":15608,"date":"2020-11-08T08:30:06","date_gmt":"2020-11-08T07:30:06","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=15608"},"modified":"2020-11-25T13:36:35","modified_gmt":"2020-11-25T12:36:35","slug":"cloud-dashboard-fuer-co2-messungen-co2-ampel-mit-ubidots-fuer-java-und-python","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=15608","title":{"rendered":"Cloud Dashboard f\u00fcr CO2-Messungen (CO2-Ampel) mit Ubidots f\u00fcr Java und Python"},"content":{"rendered":"<p>So ein Dashboard, hier am Beispiel der CO2 Messungen ist mit dem Cloud Anbieter <a href=\"https:\/\/ubidots.com\/\" rel=\"noopener noreferrer\" target=\"_blank\">Ubidots.com<\/a> schnell gemacht. Kostenlos gibt es 3 Ger\u00e4te. Es muss ja auch nicht immer Thinkspeak sein.<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-08-um-08.11.57.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-08-um-08.11.57.png\" alt=\"ubidots\" width=\"3398\" height=\"2210\" class=\"aligncenter size-full wp-image-15611\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-08-um-08.11.57.png 3398w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-08-um-08.11.57-300x195.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-08-um-08.11.57-1024x666.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-08-um-08.11.57-768x499.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-08-um-08.11.57-1536x999.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-08-um-08.11.57-2048x1332.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Hier der Aufbau:<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/Ubidots-cloud-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/Ubidots-cloud-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1919\" class=\"aligncenter size-full wp-image-15609\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/Ubidots-cloud-scaled.jpg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/Ubidots-cloud-300x225.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/Ubidots-cloud-1024x768.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/Ubidots-cloud-768x576.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/Ubidots-cloud-1536x1151.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/Ubidots-cloud-2048x1535.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Hier ist der Api Token zu finden:<!--more--><br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-07-um-09.10.04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-07-um-09.10.04.png\" alt=\"\" width=\"2812\" height=\"914\" class=\"aligncenter size-full wp-image-15610\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-07-um-09.10.04.png 2812w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-07-um-09.10.04-300x98.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-07-um-09.10.04-1024x333.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-07-um-09.10.04-768x250.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-07-um-09.10.04-1536x499.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/wenzlaff.de-2020-11-07-um-09.10.04-2048x666.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Der z.B. in diesem Python Script eingetragen werden muss:<\/p>\n<pre class=\"lang:python decode:true \" >#\r\n# Script zum senden der CO2 und Temperatur Werte an Ubidots.com\r\n#\r\n# Thomas Wenzlaff http:\/\/www.wenzlaff.info\r\n\r\nimport time\r\nimport requests\r\nimport math\r\nimport random\r\nimport sys\r\nimport json\r\n\r\nAPI_TOKEN = \"BBFF....\"\r\nDEVICE_LABEL = \"pi-bplus\"\r\nVARIABLE_LABEL_1 = \"temperatur\"\r\nVARIABLE_LABEL_2 = \"co2\"\r\nVARIABLE_LABEL_3 = \"position\"\r\n# Position von Langenhagen, latitude und longitude\r\nLAT = 52.44758\r\nLNG = 9.73741\r\n\r\ndef build_payload(variable_1, variable_2, variable_3):\r\n    # Das JSon das gelesen wird:\r\n    # {\"SS\": 0, \"UhUl\": 2048, \"TT\": 64, \"co2\": 402, \"temperature\": 24}\r\n    input_json = json.loads(sys.argv[1])\r\n    co2  = input_json['co2']\r\n    temp  = input_json['temperature']\r\n\r\n    payload = {variable_1: temp,\r\n               variable_2: co2,\r\n               variable_3: {\"value\": 1, \"context\": {\"lat\": LAT, \"lng\": LNG}}}\r\n\r\n    return payload\r\n\r\ndef post_request(payload):\r\n    url = \"http:\/\/industrial.api.ubidots.com\"\r\n    url = \"{}\/api\/v1.6\/devices\/{}\".format(url, DEVICE_LABEL)\r\n    headers = {\"X-Auth-API_TOKEN\": API_TOKEN, \"Content-Type\": \"application\/json\"}\r\n\r\n    status = 400\r\n    attempts = 0\r\n    while status &gt;= 400 and attempts &lt;= 5:\r\n        req = requests.post(url=url, headers=headers, json=payload)\r\n        status = req.status_code\r\n        attempts += 1\r\n        time.sleep(1)\r\n\r\n    if status &gt;= 400:\r\n        print(\"[ERROR] Could not send data after 5 attempts, please check \\\r\n            your API_TOKEN credentials and internet connection\")\r\n        return False\r\n    return True\r\n\r\ndef main():\r\n    payload = build_payload(\r\n        VARIABLE_LABEL_1, VARIABLE_LABEL_2, VARIABLE_LABEL_3)\r\n\r\n    print(\"[INFO] Sende Daten an ubidots.com ...\")\r\n    post_request(payload)\r\n    print(\"[INFO] gesendet\")\r\n\r\nif __name__ == '__main__':\r\n        main()<\/pre>\n<p>Das Python-Script, senden die drei Werte CO2, Temperatur und den Ort an Ubidots. Es ist auch <a href=\"https:\/\/gitlab.com\/IT-Berater\/twco2ampel\/-\/tree\/master\/src\/main\/scripts\" rel=\"noopener noreferrer\" target=\"_blank\">hier<\/a> zu finden.<\/p>\n<p>Will man einen Java-Client erstellen, um die Daten abzufragen, geht das auch mit ein paar Zeilen. Es muss nur die <a href=\"https:\/\/github.com\/ubidots\/ubidots-java\" rel=\"noopener noreferrer\" target=\"_blank\">ubidots-java Lib<\/a> eingebunden werden. In der pom.xml folgenden Abh\u00e4ngigkeit erg\u00e4nzen:<\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;dependency&gt;\r\n  &lt;groupId&gt;com.ubidots&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;ubidots-java&lt;\/artifactId&gt;\r\n  &lt;version&gt;1.6.6&lt;\/version&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<p>Dann diese <strong>UbidotsClient<\/strong> Klasse erstellen:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.ubidots;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.ubidots.ApiClient;\r\nimport com.ubidots.DataSource;\r\nimport com.ubidots.Variable;\r\n\r\n\/**\r\n * Java Ubitods CSV Client.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class UbidotsClient {\r\n\r\n\tprivate static final String API_KEY = \"BBFF-...\"; \/\/ aus dem Men\u00fc: My Profil - Api Credential\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\tVariable[] alleVariablen = getAlleVariablen(API_KEY);\r\n\r\n\t\tList&lt;CsvView&gt; alleCsv = toCsv(alleVariablen);\r\n\r\n\t\tfor (CsvView csvView : alleCsv) {\r\n\t\t\tString titel = csvView.getTitel();\r\n\t\t\tSystem.out.println(titel);\r\n\t\t\tSystem.out.println(csvView);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static List&lt;CsvView&gt; toCsv(Variable[] alleVariablen) {\r\n\r\n\t\tList&lt;CsvView&gt; alleCsv = new ArrayList&lt;&gt;();\r\n\r\n\t\tfor (Variable v : alleVariablen) {\r\n\t\t\tCsvView csv = new CsvView();\r\n\t\t\tcsv.setValue(v);\r\n\t\t\talleCsv.add(csv);\r\n\t\t}\r\n\t\treturn alleCsv;\r\n\t}\r\n\r\n\tprivate static Variable[] getAlleVariablen(String apiKey) {\r\n\r\n\t\tApiClient api = new ApiClient(apiKey);\r\n\r\n\t\tDataSource[] dataSources = api.getDataSources();\r\n\r\n\t\tVariable[] alleVariablen = dataSources[0].getVariables(); \/\/ pi-bplus\r\n\r\n\t\treturn alleVariablen;\r\n\t}\r\n}\r\n<\/pre>\n<p>Und hier noch eine kleine View Klasse <strong>CsvView<\/strong> um CSV zu erzeugen:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.ubidots;\r\n\r\nimport com.ubidots.Variable;\r\n\r\n\/**\r\n * CSV Objekt f\u00fcr Variablen von Ubidots.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\r\n *\/\r\npublic class CsvView {\r\n\r\n\tprivate static final String TRENNER = \", \";\r\n\tprivate Variable wert;\r\n\r\n\tpublic CsvView(Variable v) {\r\n\t\tthis.wert = v;\r\n\t}\r\n\r\n\tpublic CsvView() {\r\n\t\twert = null;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\tStringBuilder builder = new StringBuilder();\r\n\t\tif (wert != null) {\r\n\t\t\tbuilder.append(wert.getName());\r\n\t\t\tbuilder.append(TRENNER);\r\n\r\n\t\t\tbuilder.append(wert.getMean());\r\n\t\t\tbuilder.append(TRENNER);\r\n\r\n\t\t\tbuilder.append(wert.getUnit());\r\n\t\t\tbuilder.append(TRENNER);\r\n\r\n\t\t\tbuilder.append(wert.getMax());\r\n\t\t\tbuilder.append(TRENNER);\r\n\r\n\t\t\tbuilder.append(wert.getMin());\r\n\t\t\tbuilder.append(TRENNER);\r\n\r\n\t\t\tbuilder.append(wert.getSum());\r\n\t\t\tbuilder.append(TRENNER);\r\n\r\n\t\t\tbuilder.append(wert.getVariance());\r\n\t\t\tbuilder.append(TRENNER);\r\n\r\n\t\t\tbuilder.append(wert.getCount());\r\n\t\t\tbuilder.append(TRENNER);\r\n\t\t}\r\n\t\treturn builder.toString();\r\n\t}\r\n\r\n\tpublic String getTitel() {\r\n\t\treturn \"Name, Mittelwert, Einheit, Max, Min, Summe, Varianz, Anzahl ,\";\r\n\t}\r\n\r\n\tpublic void setValue(Variable v) {\r\n\t\tthis.wert = v;\r\n\t}\r\n}\r\n<\/pre>\n<p>Das Ergebnis z.B.<\/p>\n<pre class=\"lang:default decode:true \" >Name, Mittelwert, Einheit, Max, Min, Summe, Varianz, Anzahl ,\r\nco2, 670.58, ppm, 1156.0, 400.0, 1195642.0, 17293.29, 1783.0, \r\nName, Mittelwert, Einheit, Max, Min, Summe, Varianz, Anzahl ,\r\nposition, 1.0, null, 1.0, 1.0, 1783.0, 0.0, 1783.0, \r\nName, Mittelwert, Einheit, Max, Min, Summe, Varianz, Anzahl ,\r\ntemperatur, 23.63, null, 25.0, 21.0, 42135.0, 0.28, 1783.0, <\/pre>\n","protected":false},"excerpt":{"rendered":"<p>So ein Dashboard, hier am Beispiel der CO2 Messungen ist mit dem Cloud Anbieter Ubidots.com schnell gemacht. Kostenlos gibt es 3 Ger\u00e4te. Es muss ja auch nicht immer Thinkspeak sein. Hier der Aufbau: Hier ist der Api Token zu finden:<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,4084,852,5,3897,79,4023,1023],"tags":[527,4058,1721,252,56,4114,4115],"class_list":["post-15608","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-co2","category-heimautomatisierung","category-java","category-java-programmierung","category-programmierung","category-python","category-raspberry-pi","tag-co2","tag-co2-ampel","tag-csv","tag-dashboard","tag-java-client","tag-ubidots","tag-ubidots-com"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/15608","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=15608"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/15608\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15608"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15608"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}