{"id":15230,"date":"2020-08-30T09:02:05","date_gmt":"2020-08-30T07:02:05","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=15230"},"modified":"2021-11-22T17:14:07","modified_gmt":"2021-11-22T16:14:07","slug":"weil-heute-sonntag-ist-java-co2-mqtt-client","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=15230","title":{"rendered":"Weil heute Sonntag ist: Java CO2 MQTT Client"},"content":{"rendered":"<p>Weil heute Sonntag ist. &#8222;<strong>Freut euch immer<\/strong>&#8222;! Nun ein kleiner Java CO2 MQTT Client um auch auf allen Betriebssystemen mit Java die CO2 Daten zu empfangen. Nicht nur f\u00fcr den Raspberry Pi auch Mac und Windows (ungetestet;-)).<\/p>\n<p>Das selbstausf\u00fchrende JAR laden (siehe unten) und starten mit:<\/p>\n<p><strong>java -jar TWCo2Monitor-0.0.1-SNAPSHOT-jar-with-dependencies.jar [PI-Rechner Name\/Adresse]<\/strong><\/p>\n<p>Hier mal eine Ausgabe auf einem Raspberry Pi W Zero:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-java.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-java.png\" alt=\"\" width=\"1918\" height=\"1182\" class=\"aligncenter size-full wp-image-15231\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-java.png 1918w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-java-300x185.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-java-1024x631.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-java-768x473.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-java-1536x947.png 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Der MQTT Client besteht nur aus ein paar Zeilen Java Code:<!--more--><\/p>\n<pre class=\"lang:java decode:true \" >\t\t\r\n\r\n                MqttClient client = new MqttClient(\"tcp:\/\/\" + server, generateClientId());\r\n\r\n\t\tSystem.out.println(\"Starte den CO2 MQTT-Client mit Server \" + server + \" und ID: \" + client.getClientId() + \" ...\");\r\n\r\n\t\tclient.setCallback(new MqttCallback() {\r\n\r\n\t\t\t@Override\r\n\t\t\tpublic void connectionLost(Throwable throwable) {\r\n\t\t\t}\r\n\r\n\t\t\t@Override\r\n\t\t\tpublic void messageArrived(String topic, MqttMessage nachricht) throws Exception {\r\n\r\n\t\t\t\tleseCo2(nachricht);\r\n\t\t\t}\r\n\r\n\t\t\tprivate void leseCo2(MqttMessage nachricht) {\r\n\r\n\t\t\t\tJSONObject jsonNachricht = new JSONObject(nachricht.toString());\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tJSONArray nachrichten = jsonNachricht.getJSONObject(\"messung\").getJSONArray(\"satz\");\r\n\t\t\t\t\tJSONObject satz = (JSONObject) nachrichten.get(1);\r\n\t\t\t\t\tint co2 = satz.getInt(\"co2\");\r\n\r\n\t\t\t\t\tSystem.out.println(\"CO2: \" + co2 + \" ppm\");\r\n\r\n\t\t\t\t\tCO2Bewertung.bewertungUBAausgeben(co2);\r\n\t\t\t\t\tCO2Bewertung.bewertungDINEN1377Ausgeben(co2);\r\n\r\n\t\t\t\t} catch (JSONException e) {\r\n\t\t\t\t\tSystem.err.println(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t@Override\r\n\t\t\tpublic void deliveryComplete(IMqttDeliveryToken t) {\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tclient.connect();\r\n\r\n\t\tclient.subscribe(TOPIC);\r\n<\/pre>\n<p>Kurz, es muss nur eine Instanz vom MqttClient mit der Serverurl angelegt werden. Dann die Callback-Methode setCallback setzen. Dann braucht nur noch ein Connect und ein Subscribe des Topics (co2) erfolgen. Das ist schon alles. Es wird jetzt in einen Hintergrund Thread jeweis beim eintreffen einer MqttMessage der JSon String gelesen und ausgewertet.<\/p>\n<p>Als Abh\u00e4ngigkeiten brauch man nur den <a href=\"http:\/\/blog.wenzlaff.de\/?p=7194\" rel=\"noopener noreferrer\" target=\"_blank\">Paho-Client<\/a> und eine JSon-Lib:<\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;dependencies&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.eclipse.paho&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;org.eclipse.paho.client.mqttv3&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;1.2.5&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.json&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;json&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;20200518&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t&lt;\/dependencies&gt;<\/pre>\n<p>Dann habe ich noch eine kleine Klasse f\u00fcr die DIN Norm und die Einsch\u00e4tzung der Werte gem. UBA geschrieben. Die <em>bewertungUBAausgeben<\/em> Methode liefert auch noch die <strong>L\u00fcftungsampel<\/strong> zur\u00fcck.<\/p>\n<pre class=\"lang:java decode:true \" >\/**\r\n\t * DIN EN 13779 ldt. Absolute CO2-Konzentration in der Innenraumluft (ppm).\r\n\t * \r\n\t * Quelle:\r\n\t * https:\/\/www.hamburg.de\/contentblob\/1016516\/7073fd694816ce7e8edd0eb82a2593e6\/data\/gesundheitliche-bewertung-co2.pdf\r\n\t * \r\n\t * @param co2\r\n\t *\/\r\n\tpublic static void bewertungDINEN1377Ausgeben(int co2) {\r\n\t\tif (co2 &lt; 800) {\r\n\t\t\tSystem.out.println(\"Laut DIN EN 13779: Raumluft Kategorie: IDA 1 - Hohe Raumluftqualit\u00e4t\");\r\n\t\t} else if (co2 &gt; 800 &amp;&amp; co2 &lt; 1000) {\r\n\t\t\tSystem.out.println(\"Laut DIN EN 13779: Raumluft Kategorie: IDA 2 - Mittlere Raumluftqualit\u00e4t\");\r\n\t\t} else if (co2 &gt; 1000 &amp;&amp; co2 &lt; 1400) {\r\n\t\t\tSystem.out.println(\"Laut DIN EN 13779: Raumluft Kategorie: IDA 3 - M\u00e4\u00dfige Raumluftqualit\u00e4t\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"Laut DIN EN 13779: Raumluft Kategorie: IDA 4 - Niedrige Raumluftqualit\u00e4t\");\r\n\t\t}\r\n\t}\r\n\r\n\t\/**\r\n\t * Quelle:\r\n\t * https:\/\/www.hamburg.de\/contentblob\/1016516\/7073fd694816ce7e8edd0eb82a2593e6\/data\/gesundheitliche-bewertung-co2.pdf\r\n\t * \r\n\t * https:\/\/www.dguv.de\/medien\/ifa\/de\/pub\/rep\/pdf\/reports2013\/innenraumarbeitsplaetze\/kapitel_12_4_1.pdf\r\n\t * \r\n\t * @param co2\r\n\t *\/\r\n\tpublic static L\u00dcFTUNGSAMPEL bewertungUBAausgeben(int co2) {\r\n\t\tif (co2 &lt; 1000) {\r\n\t\t\tSystem.out.println(\"Laut UBA GR\u00dcN: Hygienisch unbedenklich, keine weiteren Ma\u00dfnahmen\");\r\n\t\t\treturn L\u00dcFTUNGSAMPEL.GR\u00dcN;\r\n\t\t} else if (co2 &gt; 1000 &amp;&amp; co2 &lt; 2000) {\r\n\t\t\tSystem.out.println(\"Laut UBA GELB: Hygienisch auff\u00e4llig, L\u00fcftungsma\u00dfnahmen erh\u00f6hen, L\u00fcftungsverhalten \u00fcberpr\u00fcfen und verbessern\");\r\n\t\t\treturn L\u00dcFTUNGSAMPEL.GELB;\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"Laut UBA ROT: Hygienisch inakzeptabel, Bel\u00fcftbarkeit des Raumes pr\u00fcfen ggf. weitergehende Ma\u00dfnahmen pr\u00fcfen\");\r\n\t\t\treturn L\u00dcFTUNGSAMPEL.ROT;\r\n\t\t}\r\n\t}\r\n<\/pre>\n<p>Das ganze Projekt kann von GitBucket geclont werden mit:<br \/>\n<strong><br \/>\ngit clone https:\/\/itberater@bitbucket.org\/itberater\/mqttco2client.git<\/strong><\/p>\n<p>Oder man l\u00e4dt sich das Jar mit<\/p>\n<p><strong>wget https:\/\/bitbucket.org\/itberater\/mqttco2client\/downloads\/TWCo2Monitor-0.0.1-SNAPSHOT-jar-with-dependencies.jar<\/strong><\/p>\n<p>auf den Rechner. Oder direkt aus der <a href=\"https:\/\/bitbucket.org\/itberater\/mqttco2client\/downloads\/\" rel=\"noopener noreferrer\" target=\"_blank\">Web-Gui des Projekts<\/a>.<\/p>\n<p>Und hier die aktuellen Werte von Sonntag:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-sonntag-node-red-java.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-sonntag-node-red-java.png\" alt=\"\" width=\"780\" height=\"2358\" class=\"aligncenter size-full wp-image-15238\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-sonntag-node-red-java.png 780w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-sonntag-node-red-java-99x300.png 99w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-sonntag-node-red-java-339x1024.png 339w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-sonntag-node-red-java-768x2322.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-sonntag-node-red-java-508x1536.png 508w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-sonntag-node-red-java-677x2048.png 677w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Weil heute Sonntag ist. &#8222;Freut euch immer&#8222;! Nun ein kleiner Java CO2 MQTT Client um auch auf allen Betriebssystemen mit Java die CO2 Daten zu empfangen. Nicht nur f\u00fcr den Raspberry Pi auch Mac und Windows (ungetestet;-)). Das selbstausf\u00fchrende JAR laden (siehe unten) und starten mit: java -jar TWCo2Monitor-0.0.1-SNAPSHOT-jar-with-dependencies.jar [PI-Rechner Name\/Adresse] Hier mal eine Ausgabe &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=15230\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eWeil heute Sonntag ist: Java CO2 MQTT Client\u201c <\/span>weiterlesen<\/a><\/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,3897,5,3163,79,1023,2752],"tags":[527,4049,4041,2178,4061,2359,2548,2828,4048],"class_list":["post-15230","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-co2","category-heimautomatisierung","category-java-programmierung","category-java","category-maven","category-programmierung","category-raspberry-pi","category-raspberry-pi-zero-w","tag-co2","tag-co2-werte","tag-co2-sensor","tag-java","tag-mh-z19b","tag-mqtt","tag-mqtt-client","tag-umwelt","tag-umweltbundesamt"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/15230","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=15230"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/15230\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15230"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}