**Технології індустрії 4.0. Лабораторний практикум. ** Автор і лектор: Олександр Пупена
<- до лаборних робіт | на основну сторінку курсу |
---|---|
Завдання лабораторної роботи навчитися писати дані в базу даних часових рядів Influxdb та ознайомитися з основами роботи з інтерфейсом користувача Influxdb (Influxdb UI) з метою налаштування бази даних, побудови запитів та перегляду даних часових рядів.
Перейдіть на сторінку реєстрації InfluxDB Cloud та заповніть форму або використайте Google чи Microsoft акаунти.
Оберіть будь-якого постачальника хмарних послуг і регіон, близький до вашого місця розташування.
Оберіть план використання InfluxDB Cloud – free tier.
Бакет – це іменована локація зберігання даних часових рядів. Усі бакети мають період збереження, тривалість часу, протягом якого кожен елемент даних зберігається. InfluxDB скидає всі елементи даних з мітками часу, старшими за період зберігання бакету. Бакет належить організації.
firstbucket
. У плані використання InfluxDB Cloud free tier максимальний період збереження 30 днів, тому налаштування Delete Data залиште за замовчуванням.Токени API InfluxDB забезпечують безпечну взаємодію між користувачами та даними. Токен належить організації та визначає дозволи InfluxDB в організації. Токен – це ключ до даних (бакетів, файлів телеграфу). Influxdb надає два типи токенів: All-Access token, Read/Write token.
All-Access token – надає повний доступ для читання та запису до всіх ресурсів організації.
Read/Write token – надає доступ для читання, запису або і те й інше до певних бакетів в організації.
all access token
.У цьому пункті ви спробуєте два способи збору та запису даних в InfluxDB. Перший спосіб (4.1) передбачає збір та запис даних з використанням Node-RED та спеціальних вузлів бібліотеки. Другий спосіб (4.2) - використовуючи службу Telegraf.
node-red-contrib-stackhero-influxdb-v2
.[{"id":"760f23939087cb96","type":"tab","label":"OPC UA to influxdb","disabled":false,"info":"","env":[]},{"id":"ab472f9b460178a2","type":"function","z":"760f23939087cb96","name":"multiplesubscribe","func":"msg.payload=10000;\nfor(i=1;i<11;i++){\n msg.topic=`ns=3;s=AirConditioner_${i}.Temperature`;\n node.send(msg);\n }\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":290,"y":80,"wires":[["a21fad02e87d5aa8"]]},{"id":"c8770202d16a3012","type":"inject","z":"760f23939087cb96","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payloadType":"date","x":110,"y":80,"wires":[["ab472f9b460178a2"]]},{"id":"c79ed1b84a742571","type":"debug","z":"760f23939087cb96","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1090,"y":200,"wires":[]},{"id":"a21fad02e87d5aa8","type":"OpcUa-Client","z":"760f23939087cb96","endpoint":"501a96153c7c8d57","action":"subscribe","deadbandtype":"a","deadbandvalue":1,"time":"10","timeUnit":"s","certificate":"n","localfile":"","localkeyfile":"","securitymode":"None","securitypolicy":"None","folderName4PKI":"","name":"","x":500,"y":80,"wires":[["1ef5bdfa8f62c7a1"]]},{"id":"d3727b6cd9633b8f","type":"Stackhero-InfluxDB-v2-write","z":"760f23939087cb96","server":"","name":"InfluxDBwrite","x":1010,"y":80,"wires":[["c79ed1b84a742571"]]},{"id":"24c0e70e64d3ab41","type":"join","z":"760f23939087cb96","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"10","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":735,"y":80,"wires":[["769db09ab15b6d24"]],"l":false},{"id":"1ef5bdfa8f62c7a1","type":"switch","z":"760f23939087cb96","name":"","property":"topic","propertyType":"msg","rules":[{"t":"cont","v":"ns=3;s=AirConditioner","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":615,"y":80,"wires":[["53fdf054dc0c9e9f"]],"l":false},{"id":"53fdf054dc0c9e9f","type":"function","z":"760f23939087cb96","name":"","func":"let str=\"\";\nlet obj={};\nstr=msg.topic.replace(\"ns=3;s=\",\"\");\nobj.device=str.replace(\".Temperature\",\"\");\nobj.fields={Temperature:msg.payload};\nobj.timestamp=msg.serverTimestamp;\nmsg={};\nmsg.payload=obj;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":675,"y":80,"wires":[["24c0e70e64d3ab41"]],"l":false},{"id":"769db09ab15b6d24","type":"function","z":"760f23939087cb96","name":"msgtoinflux","func":"let datastore=[];\nclass sample {\n constructor(payload) {\n this.data={\n measurement:'Building',\n tags: {\n device: payload.device,\n },\n fields: payload.fields,\n timestamp: new Date(payload.timestamp).getTime()\n }\n }\n}\nfor (let i=0; i<msg.payload.length;i++){\n dataobj=new sample(msg.payload[i]);\n datastore.push(dataobj.data);\n}\nmsg.payload = {\n bucket:'firstbucket',\n precision: 'ms',\n data:datastore,\n};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":80,"wires":[["d3727b6cd9633b8f"]]},{"id":"501a96153c7c8d57","type":"OpcUa-Endpoint","endpoint":"","secpol":"None","secmode":"None","login":false,"credentials":{}}]
OPC UA Client
, прописавши відповідний URL.Host
у випадку використання хмарної версії influxdb можна подивитися у загальних налаштуваннях організації в інтерфейсі користувача influxdb cloud. Пункт меню акаунт (email) -> Organization -> Settings -> Cluster URL. Наприклад, westeurope-1.azure.cloud2.influxdata.com
, вказувати https://
не потрібно.Port
– прописуємо стандартний https port – 443
.Token
– вставляємо рядок скопійований та збережений в пункті 3 при створені токену повного доступу.Organization
можна подивитися у загальних налаштуваннях організації в інтерфейсі користувача influxdb cloud. Пункт меню акаунт (email) -> Organization -> Settings -> Organization ID.Default bucket
– назва бакету “firstbucket”, створеного в пункті 2.""
.Telegraf – серверний агент, який збирає та надсилає метрики з різних джерел даних (баз даних, систем та IoT). Перед тим як збирати дані з OPC UA server за допомогою Telegraf, необхідно його інсталювати на машину, на якій ви запускаєте UaCPPServer. Для цього завантажте Telegraf. Якщо ви працюєте з 64-розрядною операційною системою Windows, тоді запустіть Windows Power Shell від імені адміністратора та виконайте команди:
wget http://dl.influxdata.com/telegraf/releases/telegraf-1.22.1_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.22.1_windows_amd64.zip
Expand-Archive .\telegraf-1.22.1_windows_amd64.zip -DestinationPath 'C:\Program Files\InfluxData\telegraf'
Тепер Telegraf зберігається в папці C:\Program Files\InfluxData\telegraf
.
Якщо ви працюєте з іншою операційною системою, тоді слідуйте вказівкам із сторінки завантажень InfluxDB, обравши Telegraf v1.22 та відповідну платформу.
Оберіть попередньо створений бакет у випадальному списку “firstbucket”.
OPC UA server
.inputs
) як це показано на рисунку нижче. Враховуйте, що значенню параметра endpoint
відповідає URL OPC UA сервера. Значення параметру Nodes скопіюйте звідси:[
{name="Humidity", tags=[["device", "AirConditioner_1" ]], identifier="AirConditioner_1.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_2" ]], identifier="AirConditioner_2.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_3" ]], identifier="AirConditioner_3.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_4" ]], identifier="AirConditioner_4.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_5" ]], identifier="AirConditioner_5.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_6" ]], identifier="AirConditioner_6.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_7" ]], identifier="AirConditioner_7.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_8" ]], identifier="AirConditioner_8.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_9" ]], identifier="AirConditioner_9.Humidity"},
{name="Humidity", tags=[["device", "AirConditioner_10" ]], identifier="AirConditioner_10.Humidity"},
]
INFLUX_TOKEN
, яка буде зберігати токен доступу, який ви щойно скопіювали. Якщо ви працюєте на ОС Windows: Панель керування -> Система -> Додаткові параметри системи -> Змінні середовища -> Змінні середовища користувача -> Створити. Ім’я змінної – “INFLUX_TOKEN”, значення змінної – скопійований токен.За замовчуванням інтервал запису даних, зазначений у конфігураційному файлі телеграфу, дорівнює 20 секунд. Щоб його змінити, потрібно відкрити конфігураційний файл в інтерфейсі користувача Influxdb: пункт меню “Load data” –> Telegraf, обрати необхідну конфігурацію (в нашому випадку OPC UA server
). Параметр, який відповідає за інтервал запису, називається “Interval”.
Змінювати інтервал не потрібно, залиште конфігураційний файл без змін, натиснувши кнопку Cancel.
C:\Program Files\InfluxData\telegraf\telegraf-1.22.1
. Запустіть з папки командний рядок, прописавши в шлях провідника “cmd”. В командному рядку виконайте команду для запуску телеграфу, скопійовану у попередньому пункті. ПовинноСеред повідомлень у вас зявиться попередження, на яке не потрібно звертати увагу:
W! [inputs.opcua] Failed to load certificate: open /etc/telegraf/cert.pem: The system cannot find the path specified.
Інтерфейс користувача InfluxDB UI це інструмент для роботи з даними часових рядів та InfluxDB. Інтерфейс користувача InfluxDB дозволяє:
Data Explorer в інтерфейсі користувача InfluxDB дозволяє створювати, виконувати та візуалізувати запити Flux. Query Builder (конструктор запитів) дозволяє створювати Flux запити без написання коду на мові Flux, а Script Editor (редактор скриптів) – це редактор коду Flux, де можна вручну редагувати запит. При переході на сторінку Data Explorer, за замовчуванням завантажується Конструктор запитів.
Custom
та виставте 30s
; у віконці “Aggregate functions” оберіть Custom
та виставте функцію min
. Після цього натисніть Submit
щоб подивитися на результати. Проекспериментуйте з різними функціями агрегування.SCRIPT EDITOR
. Основи мови Flux буде розглянуто в другій частині лабораторної роботи присвяченої InfluxDB.Дашбоарди - інформаційні пенелі дають можливість надати наперед сконфігуровані панелі перегляду для користувача.
Додайте нову комірку з лінійним трендом “Humidity” для першого кондиціонера. Для цього натисніть Add Cell, щоб відкрити Data Explorer і налаштувати нову комірку для інформаційної панелі.
Побудуйте запит на читання значень “Humidity” одного кондиціонера “AirConditioner_1” за останні 15 хвилин, не застосовуючи функцію агрегування. Натисніть Submit
.
Використовуючи кнопку Customize
налаштуйте відображення тренду :
Humidity
.%
на осі Y (опція “Y Axis Suffix”).Humidity
, вписавши її у полі Name this cell
у лівому верхньому кутку.Confirm
device
для зміни конкретних компонентів запитів без необхідності редагування запитів. Ця змінна буде повертати всі значення тегу device, тобто “AirConditioner_1”, “AirConditioner_2”, “AirConditioner_3” і т.д.
import "influxdata/influxdb/v1"
v1.tagValues(bucket: "firstbucket", tag: "device", predicate: (r) => true, start: -30d)
Save As
) як змінну (Variable
) з назвою device
та типом query
.Створювати зміні можна також в пункті меню “Settings” -> Variables.
За допомогою редактора скриптів змініть запит комірки “Humidity” дашбоарда “Building”, щоб запит формувався динамічно з урахуваннями обраного кондиціонера. Для цього
Перейдіть у пункт меню “Dashboards”.
Відкрийте dashboard “Building” .
Відкрийте редагування комірки “Humidity” (шестерня у правому верхньому куті -> Configure).
У редакторі скриптів "AirConditioner_1"
(разом з лапками) замініть на v.device
і натисніть Submit
.
Збережіть зміни (галочка).
Самостійно! Створіть ще одну аналогічну комірку з назвою “Temperature” для відображення тренду температури кондиціонерів. Можете це зробити з використанням клонування (в налаштуваннях комірки є така команда)
Створіть комірку з назвою Current Humidity
типу “Gauge” для відображення поточного значення вологості. Код запиту:
```flux
from(bucket: “firstbucket”)
> range(start: v.timeRangeStart, stop: v.timeRangeStop) |
> filter(fn: (r) => r[“_measurement”] == “Building”) |
> filter(fn: (r) => r[“_field”] == “Humidity”) |
|> filter(fn: (r) => r[“device”] == v.device) ```
Current Temperature
для відображення поточного значення температури.ESC
.