Omega2 + AWS IoT – Моніторинг датчика температури

Omega2 + AWS IoT – Моніторинг датчика температури

Це стаття про те, як налаштувати Omega для з'єднання з AWS IoT,
відправити дані з датчика на AWS та візуалізувати їх на графіку


Цікавить стаття? напишіть нам!


Omega2 + AWS IoT – Моніторинг датчика температури

Інформація про проект

  • Рівень складності - Середній
  • Необхідний час – 1 година

Що потрібно для проекту

Компоненти:

IotT-миникомпьютер Omega2 Plus Onion Omega2 Plus
Набір кабелів
Датчик температури DS18B20
Резистор 4,75 кОм
Onion Expansion Dock Onion Expansion Dock

Програми та онлайн-сервіси:

Amazon Web Services AWS IoT Amazon Web Services AWS IoT

Вступ

В статті описано як з'єднати Omega з веб сервісом від Амазон (AWS IoT). Передбачається, що читач вже знайомий з MQTT та AWS IoT. Якщо ви ще не знайомі з AWS IoT, ми рекомендуємо вам ознайомитись з наступною статтею: https://aws.amazon.com/iot-core/. Потім ми приєднаємо 1-провідний датчик температури, проведемо його ініціалізацію при завантаженні мікрокомп'ютера та напишемо скрипт для публікації отриманих з датчика даних на сервісі AWS IoT. Насамкінець ми використаємо AWS для візуалізації даних з датчика. Спершу ми створимо місце для зберігання даних датчика (ElasticSearch), зробимо в AWS IoT правило, що відправлятиме данні з датчика в ElasticSearch та використаємо Kibana для візуалізації.

Зауваження перед початком: AWS це платний сервіс і за використання з вас може стягуватись плата. Користуйтесь AWS на свій розсуд.


Налаштування AWS IoT

Вам знадобиться профіль в Amazon AWS, якщо у вас його ще немає, перейдіть за посиланням https://aws.amazon.com/ і зареєструйтесь.

Потім перейдіть на сервіс AWS IoT, ви побачите щось подібне:

Налаштування AWS IoT

Натисніть кнопку Register a thing ("Зареєструвати річ").

Налаштування AWS IoT - Register a thing

Ми створимо лише один пристрій, тому натисніть Create a single thing ("Створити одну річ"). Далі у вас запросять ввести назву для цієї речі, в нашому випадку назва співпадає з назвою мікрокомп'ютера:

Налаштування AWS IoT

Решту налаштувань поки що пропустимо, можна завжди повернутись до них та зробити поправки. Прогорніть сторінку до низу і натисніть Next. Наступним кроком ми створимо засоби автентифікації вашого Omega з AWS IoT. Зі списку оберіть створення сертифікату одним кліком (One-Click certificate creation):

Налаштування AWS IoT - One-Click certificate creation

В результаті буде згенеровано сертифікат, публічний та приватний ключі. Завантажте сертифікат та приватний ключ на комп'ютер, після чого натисніть Activate ("Активувати") для приведення сертифікатів у дію:

Натисніть Attach a policy ("Додати правила"), після чого ви потрапите на відповідну сторінку. Тепер потрібно створити правила, для чого натисніть знову Register Thing.

Налаштування AWS IoT - Натисніть Attach a policy (додати правила), після чого ви потрапите на відповідну сторінку. Тепер потрібно створити правила, для чого натисніть знову Register Thing.

Тепер ми створили нашу Річ та повернулись на головну консоль AWS IoT. Проте все ще потрібно створити правила, щоб надати доступ до щойно створеного сертифікату. Отже перейдіть до меню Secure ("Безпека"), а потім до підменю Policies ("Правила") і натисніть Create Policy ("Створити правило"):

Налаштування AWS IoT - Create Policy

Вигадайте назву для правила (ми назвали його omega-thing-policy) і натисніть Advanced Mode ("Розширений режим)", щоб записати власне правило. Але перед цим зауважте, що вам потрібно змінити написане нижче правило під ваш власний AWS профіль та регіон використання. Замініть [YOUR AWS REGION] на ваш регіон та замініть [YOUR AWS ACCOUNT NUMBER] на номер вашого профілю AWS, який можна побачити у верхньому правому кутку консолі AWS, після спадних меню Support та Region.

{
 "Version": "2012-10-17",
 "Statement": [
   {
     "Effect": "Allow",
     "Action": "iot:Connect",
     "Resource": "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:client/${iot:ClientId}"
   },
   {
     "Effect": "Allow",
     "Action": [
       "iot:Receive",
       "iot:Publish"
     ],
     "Resource": [
       "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*"
     ]
   },
   {
     "Effect": "Allow",
     "Action": [
       "iot:Subscribe"
     ],
     "Resource": [
       "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/*",
       "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get/*"
     ]
   },
   {
     "Effect": "Allow",
     "Action": [
       "iot:GetThingShadow",
       "iot:UpdateThingShadow"
     ],
     "Resource": [
       "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:thing/${iot:Connection.Thing.ThingName}"
     ]
   }
 ]
}

Це правило потрібно приєднати до сертифікату. В загальному випадку доступ пристроїв, що автентифікуються з сертифікатом встановлюється в правилі. Створене нами правило призначене бути стандартним та придатним для повторного використання, тому ви можете використовувати це правило з іншими сертифікатами.

Для допитливих, нижче наведено короткий огляд доступу, що надається нашим правилом:

  • Дозволяє MQTT з'єднання пристрою клієнта з ID, що відповідає назві Речі
  • З цим сертифікатом можна зробити лише одне MQTT з'єднання з AWS IoT
  • Дозволяє приєднаному пристрою отримувати повідомлення та здійснювати публікації у всіх розділах MQTT, що пов’язані з даною Річчю
  • Дозволяє приєднаному пристрою підписуватись на всі shadow/update та shadow/get теми даної Речі
  • Дозволяє пристрою оновлювати та повертати в початковий стан тінь Речі (Thing shadow)

Тепер, коли правило створене, його потрібно приєднати до сертифікату. Вам потрібно повернутись до перегляду правил, натиснути на підменю Certificates ("Cертифікати") і обрати свій сертифікат:

Налаштування AWS IoT - Certificates 

В меню огляду сертифікату зайдіть в спадне меню Actions ("Дії"), а потім натисніть Attach Policy ("Додати правило"):

Налаштування AWS IoT - Attach Policy

Оберіть правило з назвою omega-thing-policy і натисніть Attach ("Додати"):

Налаштування AWS IoT - Attach

Чудово, ми завершили налаштовувати AWS IoT, переходимо до роботи з Omega!


Налаштування Omega

Спершу потрібно перевірити, чи підключено наш Omega до інтернету через WIFI і чи встановлено на ньому останнє програмне забезпечення. Для деталей перегляньте статтю про перше налаштування Omega.

Далі нам потрібно завантажити сертифікат та приватний ключ на Omega. Скористаємось командою rsync для передачі файлів в директорію /root на Omega (проте є й інші способи це зробити).

Тепер ми готові завантажити та запустити наступний скрипт:

wget -qP /tmp https://raw.githubusercontent.com/OnionIoT/Onion-Scripts/master/awsiot_setup.sh;
sh /tmp/awsiot_setup.sh;
rm /tmp/awsiot_setup.sh

Це встановить необхідні інструменти Mosquitto MQTT та дозволить користувачу налаштувати MQTT з'єднання.

Перше, що потрібно ввести, це кінцева точка AWS IoT, за допомогою якої буде здійснюватися MQTT з'єднання. Ця IoT кінцева точка є унікальною для кожного профілю AWS. Щоб знайти кінцеву точку для свого профілю, перейдіть до вашого меню Things ("Речі" в консолі IoT, оберіть підменю Interact ("Взаємодія") та скопіюйте кінцеву точку з Rest API Endpoint:

Налаштування AWS IoT - кінцева точка AWS IoT

Вхідні дані є досить прозорими:

  • Введіть назву Речі, в даному випадку - Omega-27BF
  • Введіть шлях до файлу сертифікату
  • І, насамкінець, введіть шлях до файлу приватного ключа

Після цього налаштування з'єднання MQTT буде завершено, а в консолі ви побачите кілька прикладів для приєднання та публікації в темах AWS IoT:

Налаштування AWS IoT

Ця інформація досить корисна, тому вона копіюється у файл: /root/aws-topics.txt. Тепер у вас налаштовано з’єднання з AWS IoT!

Перевірка з'єднання

Перевіримо наше з'єднання, оновивши тінь пристрою за допомогою Omega:

mosquitto_pub -t \$aws/things/Omega-27BF/shadow/update -m '{"state": {"desired": {"temperature": 1 }}}' -q 1

Якщо все було налаштовано правильно, в консолі AWS IoT ви побачите, що Thing shadow оновлено.

Перевірка з'єднання

Періодична передача даних з датчика на AWS IoT

Наступним кроком необхідно організувати передачу даних з датчика на AWS IoT через певні проміжки часу. Нижче буде описано, як підключити датчик, налаштувати Omega для ініціалізації датчика при завантаженні системи та написати скрипт передачі зчитаних даних на AWS IoT.

Апаратна частина

Тут все просто, з'єднуємо наступні виводи:

  • Землю датчика (чорний провід) з виводом GND на платі Omega
  • Підтягуючий резистор: з'єднайте вивід датчика Vcc (червоний провід) з лінією передачі даних (жовтий провід) за допомогою резистора
  • Приєднайте лінію передачі даних (жовтий провід) до виводу GPIO18 на платі Omega
  • Приєднайте вивід датчика Vcc (червоний провід) до виводу 3,3V на платі Omega

Апаратна частина

Налаштування датчика

Перейдемо до програмного забезпечення. Програмний код можна знайти на сховищі GitHub.

Для початку ми налаштуємо Omega для автоматичної ініціалізації однопровідного датчика на виводі GPIO18 (до якого ми приєднали датчик раніше) при завантаженні системи. Щоб зробити це додамо файл в директорію /etc/modules.d. Під час увімкнення Omega, в цій директорії шукатимуться модулі ядра, що повинні бути завантаженими до завершення процесу запуску системи. Отже створимо файл /etc/modules.d/w1-gpio-custom і запишемо в ньому наступне:

w1-gpio-custom bus0=0,18,0

Перезавантажте ваш Omega, і якщо все було зроблено правильно, у вас з'явиться директорія /sys/devices/w1_bus_master1/.

Написання скрипту

Тепер нам потрібен скрипт, який робитиме наступне:

  • Зчитуватиме показання датчика та форматуватиме вихідні дані
  • Генеруватиме стрічку тексту, сумісну з AWS IoT JSON форматом
  • І, насамкінець, використовуватиме MQTT для оновлення AWS IoT Thing shadow

Для завантаження скрипту запустимо наступну команду:

cd /root; wget

Для запуску скрипту необхідно вказати назву вашої "Речі" як аргумент команди. На приклад якщо ім'я вашої Речі - "Omega-27BF", команда для запуску скрипту матиме наступний вигляд:

sh publishReading.sh Omega-27BF

Якщо вам цікаво, як працює скрипт, погляньте на нього на GitHub.

Автоматизація передачі даних

Насамкінець налаштуємо періодичне виконання цього скрипту (кожні 5 хвилин) за допомогою cron. Для цього запустіть команду crontab –e, після чого введіть наступну стрічку, замінивши [THING NAME] на ім'я вашої Речі:

#
*/5 * * * * sh /root/publishReading.sh [THING NAME]
#

Перезапустіть cron:

/etc/init.d/cron restart

після чого ваш Omega почне відправляти дані з датчика на AWS кожні 5 хвилин.

Візуалізація даних на AWS

Ми використаємо AWS для візуалізації даних з датчика. Спершу створимо кластер ElasticSearch для зберігання та індексування даних з датчика, після чого створимо правило, що перенаправлятиме дані в наш кластер, і на сам кінець, ми скористаємось Kibana для візуалізації даних.

Створення домену ElasticSearch

Увійдемо в AWS та перейдемо в сервіс ElasticSearch, де створимо новий домен (new domain):

Створення домену ElasticSearch

Тепер необхідно назвати ваш домен. Назвемо його iot-dashboard:

назвати ваш домен

Наступним кроком буде налаштування кластера ElasticSearch. Для наших цілей чудово підійдуть налаштування за умовчанням. Прогортайте сторінку донизу і натисніть Next.

Далі ми налаштуємо доступ. Оскільки ми хочемо мати доступ до домену ElasticSearch з будь-якого браузера, а не лише з внутрішнього сервісу AWS, обираємо публічний доступ (Public Access):

Elasticsearch Public Access

Тепер нам потрібно налаштувати доступ до домену. Зробимо його повністю відкритим:

доступ до домену

Важливе зауваження: Відкритий доступ не рекомендовано застосовувати для виробничих проектів та при роботі з точними даними. В нашому випадку цей вид доступу обрано для ілюстративності процесу і в майбутньому ми рекомендуємо вам використовувати більш захищені види доступу.

Прогляньте свої налаштування і натисніть "Confirm" ("Підтвердити") щоб створити домен. Може пройти кілька хвилин, поки домен запуститься. Після цього ви можете перевірити свій домен ElasticSearch та скопіювати в блокнот кінцеву точку (endpoint), оскільки вона нам знадобиться.

створити домен

В домені ElasticSearch подібні дані зберігаються (і так само можуть бути знайдені) під індексами index. Один домен ElasticSearch може мати як-завгодно багато індексів. Окремі елементи даних в комірці з індексом index зберігаються в документі document у форматі JSON. В нашому випадку ми отримаємо дані від кожного зчитування датчика в окремому документі document. Останнім елементом головоломки є мепінг mapping, що визначає як документ document зберігається та індексується. Мепінг зазвичай використовують разом з індексуванням.

Створимо новий індекс index та мепінг mapping в нашому домені ElasticSearch за допомогою HTTP-запиту PUT. Встановіть curl на ваш Omega:

opkg update
opkg install curl

Запустіть наступний код на вашому Omega, тільки не забудьте замінити кінцеву точку в кінці на вашу власну:

curl -i -H'Content-Type: application/json' -X PUT
  -d
'{
 "mappings": {
   "temperature": {
     "properties": {
       "timestamp": {
         "type": "long",
         "copy_to": "datetime"
       },
       "datetime": {
         "type": "date",
         "store": true
       },
       "temperature": {
         "type": "float"
       }
     }
   }
 }
}
'
'https://search-iot-dashboard-ogqgvki7phpnbtfrjtyoi6bt7e.us-east-2.es.amazonaws.com/temperature'

В результаті буде створено індекс з назвою temperature і налаштовано мепінг для дати, часу та значень температури.

Передача даних з AWS IoT в домен ElasticSearch

Тепер, коли домен ElasticSearch та індекс налаштовано, нам потрібно налаштувати нашу IoT Річ автоматично збільшувати індекс з кожним наступним зчитуванням. Спершу перейдіть в сервіс AWS IoT, після чого перейдіть в меню Act та натисніть кнопку "Create a rule" ("Створити правило"):

Створити правило

Назвіть правило:

Створити правило

Прогорніть сторінку вниз та налаштуйте message source (джерело повідомлень). Нам потрібно отримувати всі повідомлення за останній тиждень від Речі з назвою Omega-27BF, тому ми налаштуємо фільтр так:

$aws/things/Omega-27BF/shadow/update/accepted

Для максимальної гнучкості додамо штамп часу, при цьому атрибути виглядатимуть так:

*, timestamp() AS timestamp

Зауважте, як поле Rule query statement автоматично оновлюється:

поле Rule query statement

Тепер необхідно записати дію для Правила. Прогорніть сторінку нижче і натисніть Add action ("Додати дію"):

Додати дію

Оберіть як дію Send messages to the Amazon ElasticSearch Service ("Надсилати повідомлення в сервіс Amazon ElasticSearch") і натисніть Configure Action ("Налаштувати дію"):

Send messages to the Amazon ElasticSearch Service

 

На новій сторінці оберіть назву домену зі спадного меню. Ми оберемо iot-dashboard, який ми створили раніше:

оберіть назву домену зі спадного меню

Після цього форма кінцевої точки заповниться автоматично. Останні три параметри визначають як кожен новий документ буде створюватись: документ розміщуватиметься за індексом temperature, створеним нами раніше, він матиме тип temperature, і кожен новий документ матиме унікальний ID, що генерується через uuid:

форма кінцевої точки

І, на кінець, нам потрібно надати для AWS IoT доступ до ресурсу ElasticSearch. Натисніть Create a new role, після чого AWS створить нову роль та сконфігурує доступ. Назвемо нову роль iot-es-access:

Create a new role

Прогорніть сторінку нижче і натисніть Add Action ("Додати дію"). Ви перейдете назад на сторінку з правилами, прогорніть її донизу і натисніть Create rule ("Створити правило"):

Create rule

Тепер правило налаштоване і всі дані від пристрою Omega-27BF будуть додаватись за індексом temperature ElasticSearch. Якщо ви виконували все за інструкціями, ваш Omega кожні 5 хвилин відправлятиме дані з датчика на AWS IoT, а звідти в індекс ElasticSearch!

Щоб перевірити, чи відправляються дані, зачекайте півгодини і за допомогою вашого Omega виконайте запит індексу ElasticSearch:

curl -i -X GET \ 'https://search-iot-dashboard-ogqgvki7phpnbtfrjtyoi6bt7e.us-east-2.es.amazonaws.com/temperature/_search'

Знову ж, не забудьте змінити в команді кінцеву точку на свою власну. В результаті виконання команди ви маєте побачити щось подібне:

{
 "took": 16,
 "timed_out": false,
 "_shards": {
 "total": 5,
 "successful": 5,
 "skipped": 0,
 "failed": 0
 },
 "hits": {
 "total": 5,
 ...
 }
}

Зверніть особливу увагу на поле hits.total, оскільки там відображається кількість комірок даних, що зберігаються в індексі ElasticSearch.


Візуалізація даних

Тепер отримуємо результат всього проробленого шляху: візуалізація зібраних даних. Ми використаємо новий інструмент під назвою Kibana, що допоможе нам з цією задачею. Kibana може використовуватись для створення досить складних графіків, тому ми рекомендуємо вам ознайомитись з цим інструментом детальніше.


Цікавить стаття? напишіть нам!


Посилання до проекту

Залишити відповідь