{"id":15203,"date":"2020-08-28T14:26:13","date_gmt":"2020-08-28T12:26:13","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=15203"},"modified":"2020-10-10T09:35:30","modified_gmt":"2020-10-10T07:35:30","slug":"co2-messsystem-mit-raspberry-pi-und-mqtt-und-nodered","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=15203","title":{"rendered":"CO2-Messsystem mit Raspberry Pi und MQTT und NodeRed"},"content":{"rendered":"<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>Hier die Architektur-\u00dcbersicht:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Co2-_Messungen-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Co2-_Messungen-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1919\" class=\"aligncenter size-full wp-image-15189\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Co2-_Messungen-scaled.jpg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Co2-_Messungen-300x225.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Co2-_Messungen-1024x768.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Co2-_Messungen-768x576.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Co2-_Messungen-1536x1151.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/08\/Co2-_Messungen-2048x1535.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p><strong>Installation<\/strong><!--more--><\/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.<!--more--><\/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<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Wir wollen nun mal ein CO2-Messsystem mit dem MH-Z19B aufbauen und die CO2-Konzentrationen 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 1000 ppm erreicht ist, wird noch eine Pushover Nachricht an ein Handy gesendet, so &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=15203\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eCO2-Messsystem mit Raspberry Pi und MQTT und NodeRed\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,538,852,2520,1023,2713],"tags":[4047,4044,4046,527,4061,2359,2824,2190],"class_list":["post-15203","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-co2","category-elektronik","category-heimautomatisierung","category-node-red","category-raspberry-pi","category-statistik","tag-carbon-dioxide","tag-co-2","tag-co-2-dashboard","tag-co2","tag-mh-z19b","tag-mqtt","tag-nodered","tag-raspberry-pi"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/15203","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=15203"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/15203\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15203"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}