Что вы можете сделать с парой устройств IoT, Node.js, Elasticsearch и MQTT? Вы можете собрать свой собственный интернет вещей для измерения загрязнения воздуха, как и я. В этом сообщении я поделюсь всеми подробностями о настройке оборудования, конфигурации программного обеспечения, аналитике данных, панели панели IoT и интеграции Broker на основе MQTT с другими инструментами из экосистемы IoT, таких как Node-Red и Octoblu. Конечно, я также поделюсь несколькими интересными выводами о измерениях датчиков IoT загрязнения воздуха, взятых в нескольких местах в Германии. Взгляните — это это много Проще, чем вы думаете, когда используете правильные инструменты!
Недавно Volkswagen Emission Scandal (Википедия) снова обострилась. Причины были спорными экспериментами на животных как Сообщается New York Times Анкет Это вызвало многочисленные дебаты о Запрещение дизельных автомобилей из городских центров в Германии , где я живу. Люди говорят о глобальных запретах на автомобиль, но я поражен, что никто еще не говорит о концепциях Smart-City. Помимо дискуссии о мошенничестве при выбросах оксида азота, ЕС хочет обеспечить более низкие пределы частицы (измеряется в PM10 и PM2.5 ) в Германии. Влияние на здоровье высокой концентрации PM10 описывается в «Влиянии частиц на здоровье в окружающем воздухе ».
Что ж, это политика и медицина, и мы — компьютерные ученые, инженеры данных или специалисты по DevOps, поэтому я спросил себя
» Что мы можем сделать для защиты окружающей среды «? Жизнь в мире, где решения, основанные на данных, становятся все более распространенными, собирать данные и визуализация фактов-один из способов внесения вклад.
Твитнуть @sematext
Как показывает недавний скандал, крупные компании могут влиять на научные исследования, лоббисты влияют на правительства, так почему бы не собирать данные с открытым исходным кодом и не создать независимую аналитику и Независимые мнения На основе открытых данных — или ваших собственных данных! Мы можем помочь с рецептами для настройки устройств, конфигурации программного обеспечения или обмена данными на платформе или анализировать данные, помочь с интерпретацией, и мы могли бы говорить об этом на публике, на встречах, конференциях и т. Д.
Что касается меня, я просто хотел увидеть измерения в моей среде, потому что данные государственного правительства перечисляют только крупные города, а в отчетах, которые они предоставляют, обычно имеют карты с низким разрешением. Поэтому я решил запустить небольшой проект DIY IoT с готовыми компонентами, чтобы измерить загрязнение воздуха с помощью конкретного датчика вещества/пыли, отслеживая PM10, PM2.5, а также значения отношения PM2,5/PM10. Я хотел иметь возможность сделать это с помощью мобильного устройства и измерить в различных местах, где я работаю и живу. Мой офис находится недалеко от главной улицы и недалеко от промышленной зоны, но недавно я переехал в новый дом в сельском городе, который ощущается как «климатический спа -центр» и на самом деле имеет медицинский курорт. Чтобы другим было легко собрать системы Интернета вещей, подобных описанным здесь, который я создал «Трекер загрязнения воздуха» Таким образом, любой может собирать данные в своих местах, экспериментировать с настройкой и делиться своими данными.
Хорошо, давайте получим технические и сначала увидим настройку аппаратного обеспечения датчика IoT, которое я собрал вместе:
Так вот как выглядит наша установка. Посмотрим, какова каждая часть этого датчика IoT, и делает:
- Измерение твердых частиц с помощью датчика пыли Nova SDS011
- Регистрировать местоположение измерения с помощью датчика GPS
- Подключение Wi-Fi с мобильным телефоном для передачи результатов измерения через MQTT
- Банк питания обеспечивает мощность для банано-Pi устройства
- Банано-пи, (более мощный, чем raspberry pi ) с Debian Linux и Node.js Для сбора данных и доставки данных датчика
Обратите внимание, что мощность USB может быть недостаточно для GPS, Wi-Fi, датчика PM и внутреннего интерфейса Ethernet.
Архитектура программного обеспечения основана на MQTT Сообщения, которые предназначены для масштабирования до тысяч устройств и поддерживают простой способ обмена данными в режиме реального времени для любого вида обработки. Мы создали Плагины с открытым исходным кодом для @sematext/logagent в node.js для сбора и корреляции данных из Nova SDS011 датчик и устройство GPS. Измерения отправляются в формате JSON в брокер MQTT, который может хранить данные в Elasticsearch или, как мы это сделали, в Sematext Cloud Анкет Архитектура на основе MQTT позволяет другим клиентам прослушать поток событий и создавать, например, Оповещения или публичные твиты или управляют светофорами, когда достигаются ограничения PM10. Кроме того, сообщения MQTT записаны для исторического анализа и визуализации.
Архитектура
Обнюхивая свежий воздух и сбор данных с датчика PM
Проект начался с Google Search для датчиков частиц и наличия драйверов Device и Node.js, потому что Node.js — мой любимый язык программирования. После некоторого исследования я заказал Nova SDS011 с USB в серийный преобразователь. Чтение значений из последовательного порта выглядела легко в реализации, а интерфейс USB работает на моем MacBook и устройстве Banana-Pi. Следующим шагом было создание плагина ввода для @sematext/logagent Чтобы ввести данные датчика в трубопровод Logagent обработки. Logagent может отправлять данные в MQTT, Elasticsearch, Apache Kafka или простой вывод файла.
Я хотел измерить качество воздуха в нескольких местах, поэтому мне нужно было собрать местоположение измерений. Это позволило бы мне визуализировать загрязнение воздуха на карте. Первоначальный подход заключался в том, чтобы добавить информацию о статическом месте в конфигурацию плагина, но затем я изменил вещи, чтобы получить информацию о местоположении из других источников, таких как GPS или отслеживая мой iPhone. Плагин Logagent для датчика Nova SDS011 является открытым исходным кодом и опубликовано в реестре NPM. Конфигурация Logagent для плагина Nova SDS011 требует названия модуля и названия последовательного порта. Необязательно, вы можете указать частоту сбора измерений, используя настройку рабочегоперида за считанные минуты:
input: novaSDS011: module: input-nova-sda011 comPort: /dev/ttyUSB0 # persistent setting for measurement interval in minutes workingPeriod: 1
Получение точной позиции GPS
После настройки драйвера последовательного порта и Logagent первые эксперименты начались на моем MacBook. Чтобы получить точную позицию GPS при смене места, я хотел бы автоматически отслеживать свое местоположение. Сначала я использовал плагин Logagent Логагент-Апле-Локация Чтобы отслеживать позицию моего iPhone. Для этого мне пришлось расширить плагин датчика PM, чтобы прослушать события « место », чтобы обогатить данные датчика координатами GPS и полученного адреса. Это было хорошим началом для экспериментов, пока мое новое устройство GPS наконец не появилось, и я не переключился на использование Logagent-GPS плагин, чтобы получить точные позиции GPS независимо от подключения к Интернету. Когда подключение к Интернету присутствует, плагин запрашивает API Google Maps, чтобы найти адрес текущего местоположения, и использует кэш, чтобы избежать быстрого достижения предела Google API. Недостатком кеша является потеря точности. С кешем на месте, номера улиц и адреса не меняются на расстоянии на несколько сотен метров. Конфигурация для плагина Logagent GPS очень проста. Ему нужен только COM -порт для серийного интерфейса и имя модуля NPM:
input: gps: module: logagent-gps comPort: /dev/ttyACM0
Расчет значений по измерениям датчиков
Меньшие частицы считаются более опасными, и поэтому может быть интересно увидеть соотношение значений PM10 и PM2,5. Nova SDS011 предоставляет только измерения PM10 и PM2,5, и необходимо рассчитать отношение PM2,5/PM10. Обратите внимание, что масса частиц PM2,5 является подмножеством частиц PM10. Поэтому значение PM2,5 всегда меньше, чем значение PM10. Logagent поддерживает функции JavaScript Для входных и выходных фильтров в файле конфигурации, так что это то, что мы использовали здесь.
# calculate PM2.5/PM10 ratio in percent outputFilter: - module: !!js/function > function (context, config, eventEmitter, data, callback) { if (data.PM10 && data.PM10 > 0) { data.PM25ratio = (data['PM2.5']/data.PM10) * 100 } callback(null, data) }
Переменная «Данные» содержит текущие значения измерения, и функция обратного вызова необходимо вызвать для возврата модифицированного объекта данных после расчета. Новый объект данных теперь содержит PM10, PM2.5 и вычисленные значения PM25Ratio!
Данные датчика доставки и потребления с MQTT
Стандартизированный протокол MQTT имеет очень небольшие накладные расходы, и большинство инструментов IoT поддерживают MQTT. MQTT работает с Pub/Sub Mechanisms для распространения сообщений для нескольких клиентов. В нашем случае сенсорное устройство отправляет сообщения JSON в брокеру MQTT, используя тему, называемую «датчиками датчиков». Мы используем Logagent Plugin и государственная служба mqtt://test.mosquitto.org. Обратите внимание, что вам следует использовать сервер test.mosquitto.org только для коротких тестов. Для настройки производства вы должны запустить свой собственный брокер MQTT. Например, вы можете запустить Mosquito MQTT Broker в контейнере Docker или вы можете использовать Logagent MQTT-брокер плагин и запустите другой экземпляр Logagent в качестве брокера MQTT.
output: mqtt: module: output-mqtt url: mqtt://test.mosquitto.org topic: sensor-data debug: false # optional filter settings matching data field with regular expressions filter: field: logSource match: Nova
Теперь мы могли бы использовать любой клиент MQTT на другой машине, подключенный к тому же брокеру MQTT и подписаться на сообщения, прибывающие в тему «Датчик-дат».
Если вы хотите каким -то образом обработать измерения или действовать на них, вы можете использовать такие инструменты, как Узел-Ред или Octoblu и создать рабочие процессы IoT. Например, плагин MQTT в Node-Red принимает адрес брокера MQTT в качестве параметров, поэтому вы можете использовать его для подписки на эту тему «датчики датчиков» и получить измерения, которые были отправлены в брокер MQTT, как только вы запускаете узлы- Red указал на брокера MQTT, вы получите данные загрязнения воздуха в свой рабочий процесс узла. Затем вы выполняете различные действия или на основе полученных измерений. Например, вы можете чирикать сообщения, когда условия соответствуют или изменяют цвет светодиодных фонарей в соответствии со значениями датчиков, или вы можете контролировать кондиционирование воздуха … возможности здесь бесконечны! Думая немного больше, умный город может решить контролировать трафик и использовать загрязнение воздуха в качестве одного из критериев для решений о маршрутизации дорожного движения. Узел-красный архитектура может подключать устройства, логические элементы или Нейронная сеть компоненты. Node-Red-отличная игровая площадка для прототипа любой логики на основе измерений загрязнения воздуха.
Узел-красные рабочие процессы IoT
Хранение данных в Elasticsearch или Sematext Cloud
Мы сохранили то, что эффективно является данными датчика временных рядов IoT через Logagent Elasticsearch Plagin прямо в Sematext Cloud. Sematext Cloud предоставляет Elasticsearch API, совместимые с конечными точками для данных, панелей и оповещений. Плагин Elasticsearch нуждается в URL Elasticsearch URL и имя индекса. Для Sematext Cloud мы используем токен записи, предоставленный Sematext UI в качестве имени индекса:
sematext-cloud: module: elasticsearch url: https://logsene-receiver.sematext.com index: 9eed3c42-1e14-44d2-b319-XXXXXXX
Полная настройка устройства для банана-пи
Установка для устройства банано-PI через несколько шагов:
- Создать банан ( Debian) SD -карта
- Настройте карту Wi-Fi для вашего мобильного телефона, установив WPA_– Essid и WPA -Password_ в /etc/network/interfaces Для интерфейса WLAN0. Включите интернет, привязанный к мобильному телефону («Горячая точка» на iPhone).
- Установите node.js
curl -sL https://deb.nodesource.com/setup\_8.x | bash - && apt-get install -y nodejs
- Установить @sematext/logagent и соответствующие плагины
npm i -g --unsafe-perm @sematext/logagent logagent-gps logagent-novasds npm i -g --unsafe-perm @sematext/logagent-nodejs-monitor logagent-setup -t YOUR-TOKEN -e [https://logsene-receiver.sematext.com](https://logsene-receiver.sematext.com) service logagent stop
- Создайте конфигурацию Logagent (см. Ниже). Проверьте конфигурацию с
logagent --config logagent.conf
Скопируйте рабочую конфигурацию в /etc/sematext/logagent.conf и начать сервис с
# Example for Logagent configuration # Plase adjust following settings: # input.novaSDS011.comPort # input.gps.comPort # input.nodejsMonitor.SPM_TOKEN # output.mqtt.url # output.elasticsearch.url # output.elasticsearch.indices options: # suppress log event output to console suppress: true # Write Logagent stats in the Logagent log file /var/log/logagent.log # The stats show how many events have been processed and shipped # Log interval in seconds printStats: 60 input: novaSDS011: module: input-nova-sda011 # Find TTY name: ls -l /dev/tty* | grep 'dialout' comPort: /dev/ttyUSB0 # Working period in minutes. The setting is persistent # for the connected Nova SDS011 sensor # 1 minute measurement interval workingPeriod: 1 gps: module: logagent-gps # Find TTY name: ls -l /dev/tty* | grep 'dialout' comPort: /dev/ttyACM0 # Emit only location event, to share the location with nova sensor emitOnlyLocationEvent: true # disable debug output debug: false # Optional, monitor logagent and device performance # Create in Sematext Cloud a Node.js monitoring app # to obtain the SPM_TOKEN nodejsMonitor: module: @sematext/logagent-nodejs-monitor SPM_TOKEN: YOUR_SEMATEXT_NODEJS_MONITORING_TOKEN # collect all system logs for troubleshooting files: - /var/log/**/*.log # calculate PM2.5/PM10 ratio in percent outputFilter: - module: !!js/function > function (context, config, eventEmitter, data, callback) { if (data.PM10 && data.PM10 > 0) { data.PM25ratio = (data['PM2.5']/data.PM10) * 100 } callback(null, data) } output: # print log events in yaml format # when options.suppress=false stdout: yaml # Forward sensor logs to MQTT broker mqtt: module: output-mqtt url: mqtt://test.mosquitto.org topic: sensor-data debug: false # optional filter settings matching data field with regular expressions # we use the filter to exclude the system log files filter: field: logSource match: Nova # Store log events & sensor data in Sematext Cloud or Elasticsearch # Create a log application in Sematext Cloud to obtain a token elasticsearch: module: elasticsearch url: https://logsene-receiver.sematext.com # url: https://logsene-receiver.eu.sematext.com # url: http://127.0.0.1:9200 # We route system logs and sensor data to different indices # each index has a list of regular expressions matching the logSource field indices: # sensor data index YOUR_SEMATEXT_LOGS_TOKEN: - Nova # system logs index ANOTHER__SEMATEXT_LOGS_TOKEN: - var.log.*
ЦП и следов памяти
Многое из того, что я делаю в Sematext, связано с мониторинг производительности Поэтому я не мог с собой поделать и должен был посмотреть на телеметрию этой DIY DIY IoT Setup. Низкое использование ресурсов Logagent на основе Node.js с процессором менее 1% и менее 34 МБ память впечатляет! Другие инструменты для ведения журнала, такие как Logstash, требуют в 20 раз больше памяти (600 МБ+), и будут использовать большинство ресурсов на микрокомпьютерах, таких как банано-Pi или Raspberry-Pi, и в кратчайшие сроки вычеркивает батарею!
Если вам любопытно о производительности, как и я, но также, если вы хотите, чтобы вас уведомляли, когда есть проблемы с производительностью или стабильностью с вашей настройкой, вы можете добавить Logagent nodejs-Monitor плагин, как показано ниже. Наконец, мы завершаем конфигурацию с помощью коллекции всех журналов устройств с плагином ввода файла. Файлы журнала в/var/log содержат ценную информацию, такую как статус Wi-Fi или информация об устройстве USB.
input: nodejs-monitor: module: '@sematext/logagent-nodejs-monitor' SPM_TOKEN: 2f3e0e1f-94b5-47ad-8c72-6a09721515d8 files: - /var/log/**/*.log
Мы перезагружаем Logagent для применения изменений конфигурации:
_service restart logagent_
Через несколько секунд мы увидим журналы и метрики в пользовательском интерфейсе Sematext. Наличие показателей производительности и журналов в одном представлении действительно полезно для любого вида устранения неполадок. В моем случае у USB -провода был плохой контакт, и утраченное USB -соединение было вобег в/var/kern.log (см. Скриншот).
Узел.
Визуализация загрязнения воздуха
Прежде чем мы создаем визуализацию, нам нужно знать структуру данных сообщений, созданных датчиком/логагентом. Мы могли бы легко нарисовать числовые значения как гистограмму даты, такую как PM10, PM2_5 и PM25Ratio . Карты могут быть созданы с геоорнатами. Наличие адреса каждого измерения позволяет легко найти измерения в определенном городе, и имя хоста может помочь нам определить датчивое устройство.
{ "@timestamp": "2018-02-05T20:59:38.230Z", "severity": "info", "host": "bananapi", "ip": "172.20.10.9", "PM2_5": 7.6, "PM10": 18, "geoip": { "location": [ 6.83125466218682, 49.53914001560465 ] } "address": "Weiskirchen, Germany", "city": "Weiskirchen", "country": "Germany", "logSource": "NovaSDS011", "PM25ratio": 42.22222222222222, "@timestamp_received": "2018-02-05T20:59:58.569Z", "logsene_original_type": "logs" }
Пример сообщения JSON, хранящийся в Elasticsearch/Sematext Cloud
Чтобы визуализировать все данные, я использовал Kibana, которая интегрирована в Sematext Cloud. После того, как визуализация создана в Кибане, мы можем создать панель панели, показывающая значения карты и датчиков. На первый взгляд мы можем сразу же увидеть, что загрязнение воздуха на 50% ниже на севере (где я живу), чем в офисе, который находится недалеко от главной улицы.
Индиническая панель Kibana в Sematext Cloud
Наблюдение концентраций твердых частиц в различных сценариях
Следующий график был записан во время поездки из моего офиса до моего дома. Спайк на графике произошел, когда я остановил свою машину и вытащил из машины измерительное устройство. Вы можете видеть, что значение PM10 подскочило на короткое время до 80 мкг/м³ , что вдвое превышает предел ЕС 40 мкг/м³ в среднем в год, хотя и на минуту. Приятно знать, что воздух в моем родном городе имеет только половину частиц по сравнению с местом офиса — по крайней мере, как долго я не запускаю свой дизельный двигатель … во всяком случае, веская причина остаться в домашнем офисе.
Уровни PM10 в Weiskirchen (Orange) и Nalbach (красный)
Environment.on («Smog», Alert)
Наличие панелей — это круто, но вы не можете смотреть приборную панель весь день. Итак, давайте использовать оповещения. Стек Elk с открытым исходным кодом имеет свои пределы-нет встроенного оповещения-но мы можем использовать оповещения в облаке Sematext. Здесь сохраненный запрос, фильтрация только значений PM10 больше 40 (предел ЕС) или 50 (Limit) используется для запуска оповещений:
Оповещение настройки для значений PM10 выше 50.
Уведомление о предупреждении в пользовательском интерфейсе Sematext
При таком предупреждении мы можем добавить поток событий (скриншот выше) с оповещениями на панель инструментов (скриншот ниже) и получить оповещения через канал Slack на мобильном телефоне, например.
Панель инструментов в Sematext UI, включая уведомления о предупреждениях
Уведомление о Slack, когда PM10 достигает настроенного порога PM10> 40 или PM10> 50
Затраты на различные сенсорные устройства низкие и сборка гаджетов, и настройка программного обеспечения может быть сделано буквально несколько часов. Мне потребовалось гораздо больше времени, чтобы найти хорошие решения для различных крошечных проблем и кодировать несколько Logagent Plugins , но даже сценарий модуля плагина занимает всего несколько часов. Используя Sematext Cloud Вместо локального стека Elk является большой экономией для настройки сервера (мне не нужны физические или облачные серверы, только устройства и Sematext SaaS). Предупреждение о запросах Elasticsearch и передаче оповещений в Slack завершило решение.
Самым большим источником удовлетворения в этом проекте было сделать невидимый видимым с «электронным носом» — вы чувствуете себя как привидения! Вы видите, как PM10 значения увеличиваются при открытии окна, или когда вы начинаете пылесовать в гостиной или когда вы забываете свои спагетти на плите во время программирования… наружных датчиков «пахнут», когда сосед запускает машину, посетители парковы его машину Перед вашим домом гость начинает курить сигарету на террасе …
Интересным фактом является то, что значения PM10 выше близко к главной улице и фактически достигли предела ЕС (PM10> 40) и немецкого лимита (PM10> 50) в час пик перед моим офисом! Максимальное измеренное значение было в окне моего офиса. Значения PM10 уменьшаются с точки зрения нескольких сотен метров от главной улицы. Подумайте о том, как осознание этого может повлиять на ваши жизненные решения — переход в новую квартиру или офис может действительно повлиять на ваше здоровье. Знание времени самого высокого загрязнения воздуха может также помочь убрать частицы в вашей квартире. Мои измерения показали, что трансляция офисной комнаты до 14:00 и после 9 вечера было бы лучше, чтобы поддерживать низкую концентрацию PM. К счастью, я недавно переехал в маленькую деревню, и хорошо, что я могу найти здесь, это свежий воздух, и, как вы можете видеть, вдохновение и время для свежих идей!
Настоящим сюрпризом для меня было то, что я оказался в политике, позвонив городской администрации на встречу с мэром, чтобы обсудить с ним светофор, который переключается на Red, как только ограничен PM10. Автомобили могут быть удержаны от города, потому что обходная дорога уже существует, но в настоящее время недостаточно используется и должна использоваться гораздо большим. Я надеюсь, что я получу встречу с мэром, запланированным в ближайшее время, и когда я поговорю с ним, у меня будут данные, чтобы подтвердить мои предложения. Администрация сначала попросила письменное письмо, чтобы дать мне официальное заявление-давайте посмотрим, получим ли мы еще один умный город на этой планете, наконец, приняв решения, основанные на данных, применяемые в реальной жизни, и не только в бизнесе, следите за обновлениями!
Пост IoT: отслеживание загрязнения воздуха с помощью Node.js, Elastic Stack и MQTT появился первым на Sematext Анкет
Оригинал: «https://dev.to/sematext/iot-air-pollution-tracking-with-nodejs-elastic-stack-and-mqtt-3lmi»