{"id":15572,"date":"2020-11-06T02:56:52","date_gmt":"2020-11-06T01:56:52","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=15572"},"modified":"2023-08-20T14:55:18","modified_gmt":"2023-08-20T12:55:18","slug":"co2-mit-dem-raspberry-pi","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=15572","title":{"rendered":"CO2 mit dem Raspberry Pi"},"content":{"rendered":"<p>Hier mal eine Zusammenfassung eines CO2-Messsystems (CO2-Ampel) mit dem Raspberry Pi an dem der MH-Z19b, OLED Anzeige, LED-Rgb-Ampel h\u00e4ngen. Auch werden die Daten Online an Thinkspeak, MQTT, NodeRed, Alexa ausgabe von Warnungen und abfrage der Co2 Werte, Pushover nachrichten ans Handy, REST Java-Client, Docker Container und an einen History Browser gesendet. Wie <a href=\"http:\/\/blog.wenzlaff.de\/?cat=4084\" rel=\"noopener noreferrer\" target=\"_blank\">hier<\/a> auch schon einzeln ver\u00f6ffentlicht.<\/p>\n\n<h1>Die Architektur<\/h1>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/CO2-Messung-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/CO2-Messung-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1919\" class=\"aligncenter size-full wp-image-15573\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/CO2-Messung-scaled.jpg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/CO2-Messung-300x225.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/CO2-Messung-1024x768.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/CO2-Messung-768x576.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/CO2-Messung-1536x1151.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/11\/CO2-Messung-2048x1535.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><!--more--><\/p>\n<h1>Nachhaltiges CO2-Geh\u00e4use<\/h1>\n<p>Werbefreie Version der Co2-Ampel.<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co-2-ampel-gepimpt-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co-2-ampel-gepimpt-scaled.jpg\" alt=\"\" width=\"1920\" height=\"2560\" class=\"aligncenter size-full wp-image-15523\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co-2-ampel-gepimpt-scaled.jpg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co-2-ampel-gepimpt-225x300.jpg 225w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co-2-ampel-gepimpt-768x1024.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co-2-ampel-gepimpt-1152x1536.jpg 1152w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co-2-ampel-gepimpt-1536x2048.jpg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<h1>CO2 Infos<\/h1>\n<p>Vor dem CO2-Messprojekt mit einem Raspberry Pi und einem MH-Z19B hier mal ein paar Infos zum CO2:<br \/>\nBei leichten T\u00e4tigkeiten betr\u00e4gt die CO2-Abgabe des Menschen ungef\u00e4hr <strong>20 000 ml\/h<\/strong>. ( 20 L\/h)<\/p>\n<p>Bei <strong>1000 ppm<\/strong> empfinden rund <strong>20 %<\/strong> der Personen die Raumluft als unbefriedigend.<\/p>\n<p>Diese Konzentration entspricht der <strong>Pettenkofer-Zahl<\/strong>, die von dem Hygieniker Max von Pettenkofer (1858) als Richtwert f\u00fcr die maximale CO2- Konzentration in Wohn- und Aufenthaltsr\u00e4umen mit 0,1 Vol% CO2 (1000 ppm) definiert wurde. <\/p>\n<p>Wo es viel CO2 gibt, werden auch besonders viele Keime gefunden. Die amerikanischen Wissenschaftler Rudnick und Milton zum Beispiel untersuchten 2003, wie hoch das Grippe Ansteckungsrisiko in einem Klassenraum ist. 30 Personen waren vier Stunden lang im Klassenraum, eine Person hatte akut Grippe. Das Ergebnis: Bei 1.000 ppm CO2 steckten sich f\u00fcnf Personen an, bei 2.000 ppm waren es zw\u00f6lf und bei 3.000 ppm sogar 15.<\/p>\n<p><a href=\"https:\/\/de.wikipedia.org\/wiki\/Maximale_Arbeitsplatz-Konzentration\" rel=\"noopener noreferrer\" target=\"_blank\">MAK-Werte Deutschland<\/a> f\u00fcr CO2: 9100 mg\/m3<\/p>\n<p>Die DIN EN 13779 teilt die Raumluft je nach Kohlenstoffdioxid-Konzentration in vier Qualit\u00e4tsstufen ein.<br \/>\n1. Bei Werten unter 800 ppm gilt die Raumluftqualit\u00e4t als gut,<br \/>\n2. Werte zwischen 800 und 1000 ppm (0,08 bis 0,1 Vol.-%) gelten als mittel,<br \/>\n3. Werte von 1000 bis 1400 ppm als m\u00e4\u00dfige Qualit\u00e4t.<br \/>\n4. Bei Werten \u00fcber 1400 ppm gilt die Raumluftqualit\u00e4t als niedrig. <\/p>\n<p>Zum Vergleich: Im globalen Mittel liegt der CO2-Anteil der Luft bei etwa <strong>400 ppm<\/strong> Volumenanteil; er schwankt aber regional, tageszeitabh\u00e4ngig und jahreszeitabh\u00e4ngig stark. Die Maximale Arbeitsplatz-Konzentration f\u00fcr eine t\u00e4gliche Exposition von acht Stunden pro Tag liegt bei <strong>5000 ppm<\/strong>. <\/p>\n<p>Beim Einatmen enth\u00e4lt frische Luft ungef\u00e4hr 400 ppm Kohlendioxid. Beim Ausatmen enth\u00e4lt die Luft den ca. <strong>100-fachen Anteil<\/strong> an CO2, also <strong>knapp 4% oder 40.000 ppm<\/strong>. Dies ist bei jedem Menschen ziemlich gleich. Nur die tats\u00e4chlich ausgeatmete Menge an Kohlendioxid ist stark abh\u00e4ngig vom Lungenvolumen (und damit von Alter und Gr\u00f6\u00dfe) und der Aktivit\u00e4tder Person.<\/p>\n<p>Bei einer Konzentration von 1,5 % (15.000 ppm) nimmt das Atemzeitvolumen um mehr als 40 % zu. <\/p>\n<p><strong>Umrechnungsfaktoren<\/strong> (bei 293,15 K, 1013,25 hPa):<br \/>\n1 ppm = 1,83 mg\/m3<br \/>\n1 mg\/m3 = 0,546 ppm<br \/>\n1 Vol% = 10 000 ppm<br \/>\n1 ppm = 0,0001 Vol% <\/p>\n<p>Kohlendioxidkonzentration unter 1 000 ppm = hygienisch unbedenklich<br \/>\nKohlendioxidkonzentration zwischen 1 000 und 2 000 ppm = hygienisch auff\u00e4llig<br \/>\nKohlendioxidkonzentration \u00fcber 2 000 ppm = hygienisch inakzeptabe<\/p>\n<p>Weitere Infos <a href=\"https:\/\/de.wikipedia.org\/wiki\/Kohlenstoffdioxid\" rel=\"noopener noreferrer\" target=\"_blank\">bei Wikipedia.<\/a><\/p>\n<h2>CO2 Mindmap<\/h2>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/kohlenstoffdioxid.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/kohlenstoffdioxid.png\" alt=\"Co 2\" width=\"3192\" height=\"2386\" class=\"aligncenter size-full wp-image-15195\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/kohlenstoffdioxid.png 3192w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/kohlenstoffdioxid-300x224.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/kohlenstoffdioxid-1024x765.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/kohlenstoffdioxid-768x574.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/kohlenstoffdioxid-1536x1148.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/kohlenstoffdioxid-2048x1531.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a> Dank f\u00fcr die Mindmap geht an (c) <a href=\"http:\/\/kleinhirn.eu\/\" rel=\"noopener noreferrer\" target=\"_blank\">Dr.Kleinhirn.eu<\/a><\/p>\n<h2>CO2 Podcast<\/h2>\n<p>Die 3. Folge des Podcast. Das Thema &#8222;<a href=\"https:\/\/podcasters.spotify.com\/pod\/show\/wenzlaff\" rel=\"noopener noreferrer\" target=\"_blank\">Acht Fragen zum Kohlendioxid (CO2)<\/a>&#8222;, viel Spa\u00df beim <a href=\"https:\/\/podcasters.spotify.com\/pod\/show\/wenzlaff\" rel=\"noopener noreferrer\" target=\"_blank\">h\u00f6ren<\/a> &#8230; <\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/anchor.fm\/wenzlaff\/embed\/episodes\/8-Fragen-zum-Kohlendioxid-CO2-e95gfi\" height=\"102px\" width=\"400px\" frameborder=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<p>Der <a href=\"https:\/\/podcasters.spotify.com\/pod\/show\/wenzlaff\" rel=\"noopener noreferrer\" target=\"_blank\">Podcast<\/a> ist \u00fcbrigens seit 2019 auch im Apple-Store, Spotify und bei Google <a href=\"http:\/\/blog.wenzlaff.de\/?p=13892\" rel=\"noopener noreferrer\" target=\"_blank\">verf\u00fcgbar<\/a>.<\/p>\n<h1>Der Sensor MH-Z19B<\/h1>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co-2-sensor-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co-2-sensor-scaled.jpg\" alt=\"\" width=\"1920\" height=\"2560\" class=\"aligncenter size-full wp-image-15190\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co-2-sensor-scaled.jpg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co-2-sensor-225x300.jpg 225w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co-2-sensor-768x1024.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co-2-sensor-1152x1536.jpg 1152w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co-2-sensor-1536x2048.jpg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Der CO2 Sensor MH-Z19B (<a href=\"https:\/\/de.wikipedia.org\/wiki\/Nichtdispersiver_Infrarotsensor\" rel=\"noopener noreferrer\" target=\"_blank\">NDIR-Sensor<\/a>). Die Genauigkeit liegt bei \u00b150 ppm+5%.<\/p>\n<p>Hier gibt es das <a href=\"https:\/\/www.winsen-sensor.com\/d\/files\/PDF\/Infrared%20Gas%20Sensor\/NDIR%20CO2%20SENSOR\/MH-Z19%20CO2%20Ver1.0.pdf\" rel=\"noopener noreferrer\" target=\"_blank\">Handbuch (engl.)<\/a> zu dem Sensor als PDF vom Hersteller und <a href=\"https:\/\/revspace.nl\/MHZ19#Command_0x86_.28read_concentration.29\" rel=\"noopener noreferrer\" target=\"_blank\">hier die Kommandos<\/a>.<\/p>\n<h1>Raspberry Pi<\/h1>\n<p>Wir wollen nun mal ein <strong>CO2-Messsystem<\/strong> mit dem <a href=\"http:\/\/blog.wenzlaff.de\/?p=15188\" rel=\"noopener noreferrer\" target=\"_blank\">MH-Z19B<\/a> aufbauen und die <a href=\"http:\/\/blog.wenzlaff.de\/?p=15196\" rel=\"noopener noreferrer\" target=\"_blank\">CO2-Konzentrationen<\/a> mit einem Raspberry Pi einlesen und per MQTT an eine NodeRed-Installation senden. Parallel dazu werden die Daten noch in einer CSV-Datei geschrieben f\u00fcr Langzeitauswertungen. Wenn der Grenzwert von <strong>1000 ppm<\/strong> erreicht ist, wird noch eine Pushover Nachricht an ein Handy gesendet, so das rechtzeitig gel\u00fcftet werden kann. <\/p>\n<p><strong>Installation<\/strong><\/p>\n<p>1. raspi-config aufrufen und die Serielle-Schnittstelle aktivieren<\/p>\n<p>2. Sensor mit den vier Dr\u00e4hten an den Pi anschlie\u00dfen wie hier beschrieben <\/p>\n<p><a href=\"https:\/\/github.com\/IT-Berater\/mh-z19\" rel=\"noopener noreferrer\" target=\"_blank\">https:\/\/github.com\/IT-Berater\/mh-z19.git<\/a><\/p>\n<p>3. Git installieren wenn noch nicht vorhanden mit: sudo apt-get install git<\/p>\n<p>4. Leeres Verzichnis erstellen und darin das setup.sh aufrufen<br \/>\n<code><br \/>\nmkdir co2<br \/>\ncd co2<br \/>\ngit clone https:\/\/github.com\/IT-Berater\/mh-z19.git<br \/>\ncd mh-z19<br \/>\n.\/setup.sh<br \/>\n<\/code><\/p>\n<p>5. Testen ob die co2 Werte geliefert werden mit Python (Python 2.7.16)<\/p>\n<p><strong>sudo python -m mh_z19 <\/strong><\/p>\n<p>Wenn diese R\u00fcckgabe kommt ist es geschafft:<\/p>\n<p>{&#8218;co2&#8216;: 668}<\/p>\n<p>6. MQTT installieren und aktivieren<br \/>\n<code><br \/>\nsudo apt-get install -y mosquitto mosquitto-clients<br \/>\nsudo systemctl enable mosquitto.service<br \/>\n<\/code><\/p>\n<p>7. Das Bash Script in das Verzeichnis kopieren und ausf\u00fchren:<\/p>\n<p><strong>sudo chmod +x send-co2-per-mqtt.sh <\/strong><\/p>\n<p>Das Bash Script <strong>send-co2-per-mqtt.sh<\/strong> erstellt ein JSON Objekt und sendet die \u00fcber Python mh_z19 ermittelten Werte per MQTT unter dem Pfad co2 zum Dashboard.<\/p>\n<p>Das Script liegt auch in \/example\/<a href=\"https:\/\/github.com\/IT-Berater\/mh-z19\/tree\/master\/example\" rel=\"noopener noreferrer\" target=\"_blank\">send-co2-per-mqtt.sh<\/a> Verzeichnis.<\/p>\n<pre class=\"lang:zsh decode:true \" >\r\n\r\n#!\/bin\/sh\r\n\r\n# (c) 2020 Thomas Wenzlaff\r\n# send-co2-per-mqtt.sh\r\n\r\n# Sendet jede alle 1 Minuten die co2 Werte an MQTT NODERED\r\nwhile (true) do\r\n\r\n   zeit=$(date +\"%d.%m.%Y %H:%M\")\r\n   wert=$(sudo python -m mh_z19 --all 2&gt;%1)\r\n   echo \"Sende CO2 Messung: $wert um $zeit\"\r\n   # erstellen ein JSON Objekt\r\n   sende=\"{ \\\"messung\\\":{\\\"satz\\\": [{\\\"zeitpunkt\\\":\\\"$zeit\\\" },$wert ]}}\"\r\n\r\n   mosquitto_pub -d -t co2 -m \"$sende\"\r\n\r\n   sleep 60;\r\ndone;<\/pre>\n<p>Das Script dann sp\u00e4ter im Hintergrund gestartet werden mit <strong>.\/send-co2-to-mqtt.sh &#038;<\/strong><\/p>\n<p>8. Den NodeRed-Flow kopieren und den Mqtt-Server eingeben. Hier das CO2 Daschboard mit dem Trend und die aktuellen Werte die jede Minute aktualisiert werden:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Bildschirmfoto-2020-08-28-um-12.20.16.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Bildschirmfoto-2020-08-28-um-12.20.16.png\" alt=\"\" width=\"832\" height=\"1128\" class=\"aligncenter size-full wp-image-15194\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Bildschirmfoto-2020-08-28-um-12.20.16.png 832w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Bildschirmfoto-2020-08-28-um-12.20.16-221x300.png 221w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Bildschirmfoto-2020-08-28-um-12.20.16-755x1024.png 755w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Bildschirmfoto-2020-08-28-um-12.20.16-768x1041.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Der n\u00f6tige <a href=\"https:\/\/flows.nodered.org\/flow\/12cc2910e662a61bd70b39df13dff2de\" rel=\"noopener noreferrer\" target=\"_blank\">NodeRed-Flow<\/a> zum Download:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-nodered-flow.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-nodered-flow.png\" alt=\"\" width=\"2516\" height=\"1528\" class=\"aligncenter size-full wp-image-15209\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-nodered-flow.png 2516w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-nodered-flow-300x182.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-nodered-flow-1024x622.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-nodered-flow-768x466.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-nodered-flow-1536x933.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-nodered-flow-2048x1244.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>9. Sensor auf <strong>400 ppm kalibriere<\/strong>n. Dazu den Sensor an frischer Luft eine halbe Stunde laufen lassen und mit dem Programm <strong>mh_z19<\/strong><br \/>\neinmal mit dem Parameter 5000 (je nach Sensor) und mit zero_point_calibration aufrufen.<\/p>\n<p>sudo python -m mh_z19 &#8211;detection_range_5000<br \/>\nsudo python -m mh_z19 &#8211;zero_point_calibration<\/p>\n<p>aufrufen, wie hier beschrieben.<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\nsudo python -m mh_z19 --help\r\n\r\nusage: __main__.py [-h] [--serial_device SERIAL_DEVICE]\r\n                   [--serial_console_untouched]\r\n                   [--version | --all | --abc_on | --abc_off]\r\n                   [--span_point_calibration SPAN_POINT_CALIBRATION]\r\n                   [--zero_point_calibration] [--detection_range_10000]\r\n                   [--detection_range_5000] [--detection_range_2000]\r\n\r\nreturn CO2 concentration as object as {'co2': 416}\r\n\r\noptional arguments:\r\n  -h, --help            show this help message and exit\r\n  --serial_device SERIAL_DEVICE\r\n                        Use this serial device file\r\n  --serial_console_untouched\r\n                        Don't close\/reopen serial console before\/after sensor\r\n                        reading\r\n  --version             show version\r\n  --all                 return all (co2, temperature, TT, SS and UhUl) as json\r\n  --abc_on              Set ABC functionality on model B as ON.\r\n  --abc_off             Set ABC functionality on model B as OFF.\r\n  --span_point_calibration SPAN_POINT_CALIBRATION\r\n                        Call calibration function with SPAN point\r\n  --zero_point_calibration\r\n                        Call calibration function with ZERO point\r\n  --detection_range_10000\r\n                        Set detection range as 10000\r\n  --detection_range_5000\r\n                        Set detection range as 5000\r\n  --detection_range_2000\r\n                        Set detection range as 2000\r\n<\/pre>\n<h1>OLED Anzeige<\/h1>\n<h2>OLED CO2 Anzeige<\/h2>\n<p>Damit die CO2-Werte der <a href=\"http:\/\/blog.wenzlaff.de\/?cat=4084\" rel=\"noopener noreferrer\" target=\"_blank\">Co2-Ampel<\/a> auch ohne Internet angezeigt werden, habe ich ein kleine <a href=\"http:\/\/blog.wenzlaff.de\/?s=oled\" rel=\"noopener noreferrer\" target=\"_blank\">OLED-Display<\/a> an den Raspberry Pi angeschlossen. Das hatte ich noch in der Bastelkiste. Hatte es auch schon an einem <a href=\"http:\/\/blog.wenzlaff.de\/?s=oled\" rel=\"noopener noreferrer\" target=\"_blank\">Arduino<\/a>. So werden die Werte nun dauernd angezeigt:<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9981-scaled.jpeg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9981-scaled.jpeg\" alt=\"\" width=\"1920\" height=\"2560\" class=\"aligncenter size-full wp-image-15461\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9981-scaled.jpeg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9981-225x300.jpeg 225w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9981-768x1024.jpeg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9981-1152x1536.jpeg 1152w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9981-1536x2048.jpeg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-18-um-16.14.41.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-18-um-16.14.41.png\" alt=\"\" width=\"704\" height=\"590\" class=\"aligncenter size-full wp-image-15463\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-18-um-16.14.41.png 704w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-18-um-16.14.41-300x251.png 300w\" sizes=\"auto, (max-width: 704px) 100vw, 704px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9975-scaled.jpeg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9975-scaled.jpeg\" alt=\"\" width=\"1920\" height=\"2560\" class=\"aligncenter size-full wp-image-15459\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9975-scaled.jpeg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9975-225x300.jpeg 225w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9975-768x1024.jpeg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9975-1152x1536.jpeg 1152w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9975-1536x2048.jpeg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9976-scaled.jpeg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9976-scaled.jpeg\" alt=\"\" width=\"1920\" height=\"2560\" class=\"aligncenter size-full wp-image-15460\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9976-scaled.jpeg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9976-225x300.jpeg 225w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9976-768x1024.jpeg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9976-1152x1536.jpeg 1152w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/IMG_9976-1536x2048.jpeg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>F\u00fcr die Anzeige verwende ich den kostenlosen <a href=\"https:\/\/www.dafont.com\/vcr-osd-mono.font?af=on&#038;text=co2+432+ppm\" rel=\"noopener noreferrer\" target=\"_blank\">VCR_OSD_MONO_1.001.ttf<\/a> Font. Die Datei muss parallel zum Script liegen. Dann der Aufruf:<\/p>\n<pre class=\"lang:default decode:true \" >font = ImageFont.truetype('VCR_OSD_MONO_1.001.ttf', 18)<\/pre>\n<h2>OLED Temperatur Anzeige<\/h2>\n<p>Zus\u00e4tzlich zur CO2-Ampel auch noch die Temperatur zur Anzeige des CO2-Wertes hinzuf\u00fcgen. Das ist schnell gemacht, hier das Ergebnis:<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-temp-gui-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-temp-gui-scaled.jpg\" alt=\"\" width=\"1920\" height=\"2560\" class=\"aligncenter size-full wp-image-15472\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-temp-gui-scaled.jpg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-temp-gui-225x300.jpg 225w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-temp-gui-768x1024.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-temp-gui-1152x1536.jpg 1152w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-temp-gui-1536x2048.jpg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Das zus\u00e4tzliche Einlesen der Temperatur ist in Python auch schnell gemacht:<\/p>\n<pre class=\"lang:python decode:true \" >input_json = json.loads(sys.argv[1])\r\nmessung_json = input_json['messung']\r\nsatz_json = messung_json['satz']\r\nsatz_array_json = satz_json[1]\r\nco2_wert = satz_array_json['co2']\r\ntemperatur_wert = satz_array_json['temperature']<\/pre>\n<p>So sieht ja das JSon File welches per MQTT gesendet wird aus:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-19-um-16.05.54.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-19-um-16.05.54.png\" alt=\"\" width=\"774\" height=\"486\" class=\"aligncenter size-full wp-image-15473\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-19-um-16.05.54.png 774w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-19-um-16.05.54-300x188.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-19-um-16.05.54-768x482.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>In Java ist das Einlesen auch schnell gemacht:<\/p>\n<pre class=\"lang:java decode:true \" >\r\n\r\nJSONObject jsonNachricht = new JSONObject(nachricht.toString());\r\n\t\t\r\nJSONArray nachrichten = jsonNachricht.getJSONObject(\"messung\").getJSONArray(\"satz\");\r\nJSONObject satz = (JSONObject) nachrichten.get(1);\r\nint co2 = satz.getInt(\"co2\");\r\nint temp = satz.getInt(\"temperature\");\r\n<\/pre>\n<h1>RGB LED CO2-Ampel<\/h1>\n<p>F\u00fcr die CO2-Ampel noch eine RGB LED,<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/rgb-led.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/rgb-led.jpg\" alt=\"\" width=\"1905\" height=\"1085\" class=\"aligncenter size-full wp-image-15496\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/rgb-led.jpg 1905w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/rgb-led-300x171.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/rgb-led-1024x583.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/rgb-led-768x437.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/rgb-led-1536x875.jpg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><br \/>\ndie ich seit l\u00e4ngerer Zeit liegen hatte angeschlossen:<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.58.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.58.png\" alt=\"\" width=\"406\" height=\"470\" class=\"aligncenter size-full wp-image-15488\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.58.png 406w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.58-259x300.png 259w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><\/a><br \/>\nSo zeigt sie ROT:<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-ampel-rgb-led-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-ampel-rgb-led-scaled.jpg\" alt=\"\" width=\"1920\" height=\"2560\" class=\"aligncenter size-full wp-image-15490\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-ampel-rgb-led-scaled.jpg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-ampel-rgb-led-225x300.jpg 225w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-ampel-rgb-led-768x1024.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-ampel-rgb-led-1152x1536.jpg 1152w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/co2-ampel-rgb-led-1536x2048.jpg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Das Python-Script f\u00fcr die Ansteuerung liegt <a href=\"https:\/\/gitlab.com\/IT-Berater\/twco2ampel\/-\/blob\/c7c94210b749d00619a72d4178bc1999b840e509\/src\/main\/scripts\/co2rgb.py\" rel=\"noopener noreferrer\" target=\"_blank\">hier<\/a>. Und <a href=\"https:\/\/gitlab.com\/IT-Berater\/twco2ampel\" rel=\"noopener noreferrer\" target=\"_blank\">hier<\/a> liegen die erstellten Python-Scripte und bash-Scripte f\u00fcr die Ansteuerung der coolen CO2-Ampel.<\/p>\n<h1>Schaltplan der CO2-Ampel<\/h1>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.49.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.49.png\" alt=\"\" width=\"2968\" height=\"2114\" class=\"aligncenter size-full wp-image-15487\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.49.png 2968w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.49-300x214.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.49-1024x729.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.49-768x547.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.49-1536x1094.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-22-um-19.18.49-2048x1459.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<h1>CO2 Online an Thinkspeak<\/h1>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-thinkspeak.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-thinkspeak.png\" alt=\"\" width=\"2608\" height=\"1390\" class=\"aligncenter size-full wp-image-15224\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-thinkspeak.png 2608w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-thinkspeak-300x160.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-thinkspeak-1024x546.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-thinkspeak-768x409.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-thinkspeak-1536x819.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/co2-thinkspeak-2048x1092.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><br \/>\nMein Raspberry Pi misst ja seit einigen Tagen die CO2 Werte in der Luft, wie <a href=\"http:\/\/blog.wenzlaff.de\/?p=15203\" rel=\"noopener noreferrer\" target=\"_blank\">hier<\/a> beschrieben. Nun k\u00f6nnen hier die Werte in Echtzeit abgelesen werden. Sie werden von NodeRed jede Minute aktuallisiert und weitergeleite.<br \/>\n<center><br \/>\n<iframe loading=\"lazy\" width=\"450\" height=\"260\" style=\"border: 1px solid #cccccc;\" src=\"https:\/\/thingspeak.com\/channels\/143430\/charts\/1?bgcolor=%23ffffff&#038;color=%23d62020&#038;dynamic=true&#038;results=60&#038;title=CO2&#038;type=line\"><\/iframe><br \/>\n<\/center><\/p>\n<h1>CO2 REST Service mit Quarkus<\/h1>\n<p>Einen REST Service in 15 min mit Quarkus, OpenAPI, Swagger UI und JUnit-Test erstellen und um CO2-Ampel Service erweitern ist nicht kompliziert.<br \/>\nVorraussetzungen Java 11 und Maven. Test mit:<\/p>\n<p><strong>mvn -version<\/strong><\/p>\n<p>auf der Kommandozeile:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n~ mvn -version\r\nApache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)\r\nMaven home: \/opt\/local\/share\/java\/maven3\r\nJava version: 11.0.9, vendor: AdoptOpenJDK, runtime: \/Library\/Java\/JavaVirtualMachines\/adoptopenjdk-11.jdk\/Contents\/Home\r\nDefault locale: de_DE, platform encoding: UTF-8\r\nOS name: \"mac os x\", version: \"10.15.7\", arch: \"x86_64\", family: \"mac\"<\/pre>\n<p>Dann fangen wir in einem leeren Verzeichnis an<\/p>\n<pre class=\"lang:default decode:true \" >mkdir rest-co2ampel\r\ncd rest-co2ampel<\/pre>\n<p>jetzt rufen wir mit dem Maven Quarkus Plugin das create Goal auf:<\/p>\n<pre class=\"lang:default decode:true \" >mvn io.quarkus:quarkus-maven-plugin:1.9.0.Final:create -DprojectGroupId=de.wenzlaff.co2ampel -DprojectArtifactId=info-kleinhirn -DclassName=\"de.wenzlaff.Co2AmpelResource\" -Dpath=\"\/co2ampel\"<\/pre>\n<p>Zwei Sekunden sp\u00e4ter, ist das Projekt angelegt:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n[INFO] ========================================================================================\r\n[INFO] Your new application has been created in \/Users\/thomaswenzlaff\/rest-co2ampel\/info-kleinhirn\r\n[INFO] Navigate into this directory and launch your application with mvn quarkus:dev\r\n[INFO] Your application will be accessible on http:\/\/localhost:8080\r\n[INFO] ========================================================================================\r\n[INFO]\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] BUILD SUCCESS\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] Total time:  1.898 s\r\n[INFO] Finished at: 2020-10-27T12:57:17+01:00\r\n[INFO] ------------------------------------------------------------------------\r\n<\/pre>\n<p>Nun gehen wir in das erzeugte Verzeichnis: <strong>cd info-kleinhirn<\/strong><\/p>\n<p>Nun starten wir den build und den Server mit:<\/p>\n<p><strong>mvn quarkus:dev<\/strong><\/p>\n<p>Ein paar Sekunden sp\u00e4ter ist alles gebaut, und der Server l\u00e4uft:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n[INFO] Compiling 1 source file to \/Users\/thomaswenzlaff\/rest-co2ampel\/info-kleinhirn\/target\/classes\r\nListening for transport dt_socket at address: 5005\r\n__  ____  __  _____   ___  __ ____  ______\r\n --\/ __ \\\/ \/ \/ \/ _ | \/ _ \\\/ \/\/_\/ \/ \/ \/ __\/\r\n -\/ \/_\/ \/ \/_\/ \/ __ |\/ , _\/ ,< \/ \/_\/ \/\\ \\\r\n--\\___\\_\\____\/_\/ |_\/_\/|_\/_\/|_|\\____\/___\/\r\n2020-10-27 13:00:57,115 INFO  [io.quarkus] (Quarkus Main Thread) info-kleinhirn 1.0-SNAPSHOT on JVM (powered by Quarkus 1.9.0.Final) started in 0.836s. Listening on: http:\/\/0.0.0.0:8080\r\n2020-10-27 13:00:57,118 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.\r\n2020-10-27 13:00:57,118 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy]\r\n<\/pre>\n<p>Ein Aufruf von <\/p>\n<p><a href=\"http:\/\/localhost:8080\/\" rel=\"noopener noreferrer\" target=\"_blank\">http:\/\/localhost:8080\/<\/a> <\/p>\n<p>bringt die statische Webseite. Und ein <\/p>\n<p><a href=\"http:\/\/localhost:8080\/co2ampel\" rel=\"noopener noreferrer\" target=\"_blank\">http:\/\/localhost:8080\/co2ampel<\/a><\/p>\n<p>liefert den Aufruf des REST CO2Ampel Services.<\/p>\n<p>Nun unterbrechen wir den Server mit CTLR-C und erg\u00e4nzen f\u00fcr den Test die Swaggert GUI hinzu, einfach ein<\/p>\n<pre class=\"lang:default decode:true \" >.\/mvnw quarkus:add-extension -Dextensions=\"quarkus-smallrye-openapi\"<\/pre>\n<p>und ein neues starten:<\/p>\n<p><strong>.\/mvnw compile quarkus:dev<\/strong><\/p>\n<p>Dann im Browser die GUI Aufrufen:<\/p>\n<p><a href=\"http:\/\/localhost:8080\/swagger-ui\/\" rel=\"noopener noreferrer\" target=\"_blank\">http:\/\/localhost:8080\/swagger-ui\/<\/a><\/p>\n<p>Cool:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.10.44.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.10.44.png\" alt=\"\" width=\"2942\" height=\"1740\" class=\"aligncenter size-full wp-image-15543\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.10.44.png 2942w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.10.44-300x177.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.10.44-1024x606.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.10.44-768x454.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.10.44-1536x908.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.10.44-2048x1211.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Und openapi geht auch, einfach in einem neuen Fenster ein <\/p>\n<p><strong>curl http:\/\/localhost:8080\/openapi <\/strong><\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.13.10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.13.10.png\" alt=\"\" width=\"912\" height=\"822\" class=\"aligncenter size-full wp-image-15544\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.13.10.png 912w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.13.10-300x270.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-13.13.10-768x692.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>So, jetzt nur noch echt CO2 Messung einbauen. Ich habe einen Mqtt-Broker der die Werte liefert.<\/p>\n<p>Wir gehen in das Verzeichnis und <strong>\/rest-co2ampel\/info-kleinhirn\/src\/main\/java\/de\/wenzlaff<\/strong> und holen uns die zwei Beispielklasse von github mit:<\/p>\n<pre class=\"lang:default decode:true \" >\r\ncurl https:\/\/gist.githubusercontent.com\/IT-Berater\/c58da54b1f20337827f8de827715d728\/raw\/10d721ca73148b3be195d6fc2fa45ff02af42d9d\/CO2AmpelResource.java &gt; CO2AmpelResource.java\r\n\r\ncurl https:\/\/gist.githubusercontent.com\/IT-Berater\/dc7695fdb406d6f93d4a47553d309ec9\/raw\/a7928a1527d164d2a51ddece19fefc431c3c46a1\/MqttCo2Client.java &gt; MqttCo2Client.java<\/pre>\n<p>Dann gehen wir in das Wurzelverzeichnis des Projektes und f\u00fcgen in der <strong>pom.xml<\/strong> diese beiden abh\u00e4ngigkeiten hinzu:<\/p>\n<pre class=\"lang:xhtml decode:true \" >\r\n&lt;dependency&gt;\r\n   &lt;groupId&gt;org.eclipse.paho&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;org.eclipse.paho.client.mqttv3&lt;\/artifactId&gt;\r\n   &lt;version&gt;1.2.5&lt;\/version&gt;\r\n&lt;\/dependency&gt;\r\n&lt;dependency&gt;\r\n  &lt;groupId&gt;org.json&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;json&lt;\/artifactId&gt;\r\n  &lt;version&gt;20200518&lt;\/version&gt;\r\n&lt;\/dependency&gt;\r\n<\/pre>\n<p>Dann m\u00fcssen wir noch den JUnit Test anpassen.Dazu die Testklasse Co2AmpelResourceTest.java in der Methode testHelloEndpoint() diesen Inhalt einf\u00fcgen: <\/p>\n<pre class=\"lang:default decode:true \" >given().when().get(\"\/v1\/rest\/co2\").then().statusCode(200).body(is(\"CO2 Wert: 0\"));<\/pre>\n<p>So, nun k\u00f6nnen wir das Projekt starten:<\/p>\n<p><strong>.\/mvnw compile quarkus:dev <\/strong><\/p>\n<p>So der JUnit Test wurde erfolgreich ausgef\u00fchrt. Nun kann der REST-Service \u00fcber die URL<\/p>\n<p><a href=\"http:\/\/localhost:8080\/v1\/rest\/co2\" rel=\"noopener noreferrer\" target=\"_blank\">http:\/\/localhost:8080\/v1\/rest\/co2<\/a><\/p>\n<p>abgefragt werden. Wenn der Mqtt-Service Werte die entsprechenden Werte liefert, sonst 0 \ud83d\ude09<\/p>\n<p>Und auch \u00fcber die openapi stehen die REST-Services bereit, cool ...<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.55.34.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.55.34.png\" alt=\"\" width=\"2904\" height=\"1830\" class=\"aligncenter size-full wp-image-15547\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.55.34.png 2904w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.55.34-300x189.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.55.34-1024x645.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.55.34-768x484.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.55.34-1536x968.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.55.34-2048x1291.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.57.55.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.57.55.png\" alt=\"\" width=\"2826\" height=\"1564\" class=\"aligncenter size-full wp-image-15548\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.57.55.png 2826w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.57.55-300x166.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.57.55-1024x567.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.57.55-768x425.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.57.55-1536x850.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-18.57.55-2048x1133.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Openapi geht auch:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.05.34.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.05.34.png\" alt=\"\" width=\"824\" height=\"1276\" class=\"aligncenter size-full wp-image-15554\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.05.34.png 824w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.05.34-194x300.png 194w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.05.34-661x1024.png 661w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.05.34-768x1189.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Und hier, wenn der Mqtt-Server echte Werte liefert (evl. den Server localhost in der Java-Klasse MqttCo2Client durch einen anderen ersetzen, bei mir l\u00e4uf der CO2-Sensor auf einem Raspberry Pi, wie hier im Blog beschrieben):<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.25.39.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.25.39.png\" alt=\"\" width=\"2680\" height=\"1586\" class=\"aligncenter size-full wp-image-15559\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.25.39.png 2680w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.25.39-300x178.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.25.39-1024x606.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.25.39-768x454.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.25.39-1536x909.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.25.39-2048x1212.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>So, jetzt muss ich aber l\u00fcften ...<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.07.52.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.07.52.png\" alt=\"\" width=\"770\" height=\"862\" class=\"aligncenter size-full wp-image-15557\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.07.52.png 770w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.07.52-268x300.png 268w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-27-um-19.07.52-768x860.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<h1>Docker Container<\/h1>\n<p>Wer noch 5 Minuten hat, kann das <a href=\"http:\/\/blog.wenzlaff.de\/?p=15541\" rel=\"noopener noreferrer\" target=\"_blank\">Beispielprojekt<\/a> mit der CO2-Ampel auch gleich in einem <a href=\"https:\/\/de.wikipedia.org\/wiki\/Docker_(Software)\" rel=\"noopener noreferrer\" target=\"_blank\">Docker<\/a> Container laufen lassen. Vorraussetzung Docker l\u00e4uft und das <a href=\"http:\/\/blog.wenzlaff.de\/?p=15541\" rel=\"noopener noreferrer\" target=\"_blank\">Beispielprojekt<\/a> wurde installiert.<br \/>\nDann sind, dank der automatisch generierten Docker-Files nur diese 3 Schritte im Verzeichnis der root pom n\u00f6tig:<\/p>\n<pre class=\"lang:default decode:true \" >\/\/ 1. das Projekt bauen\r\nmvn package -Dquarkus.package.type=fast-jar\r\n\r\n\/\/ 2. das Image bauen, man beachte den Punkt am Ende\r\ndocker build -f src\/main\/docker\/Dockerfile.fast-jar -t quarkus\/info-kleinhirn-fast-jar .\r\n\r\n\/\/ 3. den Container starten mit\r\ndocker run -i --rm -p 8080:8080 quarkus\/info-kleinhirn-fast-jar\r\n<\/pre>\n<p>Schon l\u00e4uft der CO2 Service <a href=\"http:\/\/localhost:8080\/v1\/rest\/co2\" rel=\"noopener noreferrer\" target=\"_blank\">http:\/\/localhost:8080\/v1\/rest\/co2<\/a> und CO2-Ampel \u00fcber <a href=\"http:\/\/localhost:8080\/v1\/rest\/co2ampel\" rel=\"noopener noreferrer\" target=\"_blank\">http:\/\/localhost:8080\/v1\/rest\/co2ampel<\/a> <\/p>\n<p><strong>Cool<\/strong>. Und hier das Dockerfile:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\nFROM registry.access.redhat.com\/ubi8\/ubi-minimal:8.1\r\n\r\nARG JAVA_PACKAGE=java-11-openjdk-headless\r\nARG RUN_JAVA_VERSION=1.3.8\r\n\r\nENV LANG='en_US.UTF-8' LANGUAGE='en_US:en'\r\n\r\nRUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \\\r\n    &amp;&amp; microdnf update \\\r\n    &amp;&amp; microdnf clean all \\\r\n    &amp;&amp; mkdir \/deployments \\\r\n    &amp;&amp; chown 1001 \/deployments \\\r\n    &amp;&amp; chmod \"g+rwX\" \/deployments \\\r\n    &amp;&amp; chown 1001:root \/deployments \\\r\n    &amp;&amp; curl https:\/\/repo1.maven.org\/maven2\/io\/fabric8\/run-java-sh\/${RUN_JAVA_VERSION}\/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o \/deployments\/run-java.sh \\\r\n    &amp;&amp; chown 1001 \/deployments\/run-java.sh \\\r\n    &amp;&amp; chmod 540 \/deployments\/run-java.sh \\\r\n    &amp;&amp; echo \"securerandom.source=file:\/dev\/urandom\" &gt;&gt; \/etc\/alternatives\/jre\/lib\/security\/java.security\r\n\r\nENV JAVA_OPTIONS=\"-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager\"\r\n\r\nCOPY --chown=1001 target\/quarkus-app\/lib\/ \/deployments\/lib\/\r\nCOPY --chown=1001 target\/quarkus-app\/*.jar \/deployments\/\r\nCOPY --chown=1001 target\/quarkus-app\/app\/ \/deployments\/app\/\r\nCOPY --chown=1001 target\/quarkus-app\/quarkus\/ \/deployments\/quarkus\/\r\n\r\nEXPOSE 8080\r\nUSER 1001\r\n<\/pre>\n<h1>Autostart nach Reboot<\/h1>\n<p>Wie k\u00f6nnen bash Scripte wie die CO2-Ampel auf dem Raspberry Pi automatisch nach dem reboot gestartet werden? Mit einem Service <strong>systemctl<\/strong>. Was ist n\u00f6tig? <\/p>\n<p>1. Erstellen einer Datei: <\/p>\n<p><strong>\/lib\/systemd\/system\/co2ampel.service <\/strong><\/p>\n<p>mit Inhalt<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\n[Unit]\r\nDescription=CO2Ampel Service\r\nAfter=multi-user.target\r\n\r\n[Service]\r\nExecStart=\/home\/pi\/twco2ampel\/src\/main\/scripts\/send-co2-per-mqtt.sh &\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\n\r\n<\/pre>\n<p>2. Dann ausf\u00fchrbar machen:<\/p>\n<p><strong>sudo chmod 644 \/lib\/systemd\/system\/co2ampel.service<\/strong><\/p>\n<p>Service kann nun gestartet werden mit:<\/p>\n<p><strong>sudo systemctl start co2ampel<\/strong><\/p>\n<p>Status abfragen:<\/p>\n<p><strong>sudo systemctl status co2ampel<\/strong><\/p>\n<p>Stoppen:<\/p>\n<p><strong>sudo systemctl stop co2ampel<\/strong><\/p>\n<p>Oder restart:<\/p>\n<p><strong>sudo systemctl restart co2ampel<\/strong><\/p>\n<p>3. Damit der Service beim <strong>rebooten<\/strong> gestartet wird ein<\/p>\n<p><strong>sudo systemctl enable co2ampel<\/strong><\/p>\n<p>4. Das system reloaden:<\/p>\n<p><strong>sudo systemctl daemon-reload<\/strong><\/p>\n<h1>Alexa CO2<\/h1>\n<p>Alexa sagt den Co2-Wert in der Luft in <strong>ppm<\/strong> an, wenn man sie fragt. Hier ein kurzes Demo-Video:<br \/>\n<div style=\"width: 525px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-15572-1\" width=\"525\" height=\"295\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/CO2-Ampel.mp4?_=1\" \/><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/CO2-Ampel.mp4\">http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/CO2-Ampel.mp4<\/a><\/video><\/div><\/p>\n<p>Auf dem Raspberry Pi l\u00e4uft ein <strong>NodeRed<\/strong> mit dem <strong>node-red-contrib-alexa-remote2<\/strong> der nicht nur Text ausgeben kann, sondern auch Befehle auswerten kann. Hier der relevante Teil der Sprachausgabe:<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.37.09.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.37.09.png\" alt=\"\" width=\"2348\" height=\"896\" class=\"aligncenter size-full wp-image-15364\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.37.09.png 2348w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.37.09-300x114.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.37.09-1024x391.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.37.09-768x293.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.37.09-1536x586.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.37.09-2048x782.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Es kommt auch noch eine Ansage, wenn der Wert von 1000 ppm \u00fcberschritten wird, das nun gel\u00fcftet werden muss:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.40.30.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.40.30.png\" alt=\"\" width=\"3132\" height=\"916\" class=\"aligncenter size-full wp-image-15367\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.40.30.png 3132w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.40.30-300x88.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.40.30-1024x299.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.40.30-768x225.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.40.30-1536x449.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/09\/wenzlaff.de-2020-09-24-um-21.40.30-2048x599.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<h1>CO2 History Browser<\/h1>\n<p>Ein Raspberry Pi dient ja als <a href=\"http:\/\/blog.wenzlaff.de\/?cat=4084\" rel=\"noopener noreferrer\" target=\"_blank\">CO2-Ampel<\/a> und misst jede Minute den CO2-Wert bei mir in der Luft. Die Werte werden auch als CSV-Datei gespeichert. Jeden Tag wird eine neue Datei erzeugt. Die Dateien sind dann nur ca. 30 kB gro\u00df. <\/p>\n<p>Mit dem CO2-History Browser kann ich nun mit jeden Browser auch die CO2-Vergangenheit leicht anzeigen lassen. Es braucht nur die entsprechende Datei ausgew\u00e4hlt zu werden und auf den \"GRAPH\" Button geklickt zu werden. Hier z.B. der CO2-Verlauf von gestern:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2-file-browser.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2-file-browser.png\" alt=\"\" width=\"2000\" height=\"1750\" class=\"aligncenter size-full wp-image-15431\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2-file-browser.png 2000w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2-file-browser-300x263.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2-file-browser-1024x896.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2-file-browser-768x672.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2-file-browser-1536x1344.png 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Mit klick auf den \"OPEN\"-Button kann die Datei auch im CSV-File geladen, und dann in Excel oder Numbers ge\u00f6ffnet werden:<br \/>\n<figure id=\"attachment_15433\" aria-describedby=\"caption-attachment-15433\" style=\"width: 221px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-10-um-19.11.32.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-10-um-19.11.32-221x300.png\" alt=\"CO2 to Excel\" width=\"221\" height=\"300\" class=\"size-medium wp-image-15433\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-10-um-19.11.32-221x300.png 221w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-2020-10-10-um-19.11.32.png 584w\" sizes=\"auto, (max-width: 221px) 100vw, 221px\" \/><\/a><figcaption id=\"caption-attachment-15433\" class=\"wp-caption-text\">co2 to numbers<\/figcaption><\/figure><\/p>\n<p>Hier der NodeRed Flow, der diesen CO2-History-Browser erzeugt:<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2ampel-history.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2ampel-history.png\" alt=\"\" width=\"2696\" height=\"1356\" class=\"aligncenter size-full wp-image-15432\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2ampel-history.png 2696w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2ampel-history-300x151.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2ampel-history-1024x515.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2ampel-history-768x386.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2ampel-history-1536x773.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/10\/wenzlaff.de-co2ampel-history-2048x1030.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Weitere Infos unter dieser <a href=\"http:\/\/blog.wenzlaff.de\/?cat=4084\" rel=\"noopener noreferrer\" target=\"_blank\">Kategorie CO2<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hier mal eine Zusammenfassung eines CO2-Messsystems (CO2-Ampel) mit dem Raspberry Pi an dem der MH-Z19b, OLED Anzeige, LED-Rgb-Ampel h\u00e4ngen. Auch werden die Daten Online an Thinkspeak, MQTT, NodeRed, Alexa ausgabe von Warnungen und abfrage der Co2 Werte, Pushover nachrichten ans Handy, REST Java-Client, Docker Container und an einen History Browser gesendet. Wie hier auch schon &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=15572\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eCO2 mit dem Raspberry Pi\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,2791,4,538,566,852,2062,3083,5,4080,808,217,2520,3522,4023,3769,1023],"tags":[527,4058,4112,4111,2392],"class_list":["post-15572","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-co2","category-docker","category-eclipse","category-elektronik","category-hardware","category-heimautomatisierung","category-info","category-information","category-java","category-kicad","category-linux-2","category-mind-map","category-node-red","category-podcast","category-python","category-quarkus-framework","category-raspberry-pi","tag-co2","tag-co2-ampel","tag-hauptartikel","tag-main","tag-summe"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/15572","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=15572"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/15572\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15572"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}