PLCNEXT#Play with Influxdb

今回はInfluxDB第1話です。まずInfluxDB基本コンセプトを紹介・UbnutuのDockerからInfluxDBをインストール・コマンドラインからのデータベース操作、そしてEPC1522内蔵のInfluxDBとNode-redを試します。よろしくお願いします。

Thanks!

今回の記事で使用するEPC1522エッジPCはフエニックス・コンタクトJapanが貸してくださったものです。誠にありがとうございます。

フエニックス・コンタクトは1923年ドイツで設立、全世界55拠点、20,300名の従業員が働くグローバル企業です。

“All Electric Society”のコンセプトで、すべての産業セクターで包括的に電動化、ネットワーク化、自動化の実現などのソリューションを提供していくことを掲げています。産業用生産設備、インフラ、エネルギー、電子機器の接続など様々な用途にフエニックス・コンタクトの製品が使用されています。

日本のフエニックス・コンタクト株式会社は1987年12月に、アジアで初の現地法人として横浜で設立され、現在は国内10営業拠点で事業を展開しています。

HPはこちらです。

https://www.phoenixcontact.com/ja-jp/

What is InfluxDB?

InfluxDBはOpensourcesの時系列データベースです。従来のRelational データベースではTable Formatでデータベースの中にたくさんのTableがあり、各Tableにも関連するイメージです。一方、InfluxDBは時刻情報をメインキーとしたデータを扱う時系列データベースの一つです。

時系列データベースはITの世界では活用されている場合が多く、例えばシステムのMemory・CPUの Utiliziation・Diskの容量・ネットワークTrackingの監視するによく使われています。他にはIOTシステムでセンサーの情報を時間と共に扱うのは便利で、Grafanaのようなデータ可視化ツールと連携も簡単になります。

Elements

InfluxDBは様々な部品もありますが、今回の記事ではいくつか重要な部品だけを紹介します。では仮にいまこのような時系列のデータをがあるとします。

_time_measurementlocaltionstation_field_value
10:15censusTOKYOT-1bees15
10:15censusOSAKAO-1ants40
10:16censusTOKYOT-1bees18
10:16censusOSAKAO-1ants31
10:17censusTOKYOT-1bees29
10:17censusOSAKAO-1ants50
10:18censusTOKYOT-1bees26
10:18censusOSAKAO-1ants52

_time

Timestampです。InfluxDBは時系列データベースなので、Timestampがあるのは当たり前でしょう。InfluxDBに保存されたデータはすべて_timeがあり、中にデータが書き込まれたときのTimestampが格納されています。

_measurement

String Formatで保存されている_measurementはcensus(個体調査数)です。

_field

FieldにはField Key(_field)/ Field Value(_value)があり、そのField Key x Field Value x Timestmapを組み合わせるとField Setになります。

Field Key

Field Keyは文字列で、この例だとField Key beesとantsになります。

Field Value

Field Valueは該当するField Keyに表現する与え値になります。Field Valueは文字列、Floats、整数、Boolも可能です。この例だとField Key beesは15,18,29,26で、Field Key antsは40,31,50,52になります。

Field Set

field setはField key-Valueの組み合わせで更にTimeStampに紐付けられているものです。

Tags

Exampleデータだとlocaltionとstationは”Tags”です。Tagsは文字列のTag KeysとTag Valueが格納されてます。

Tags Key

先のデータExampleではTags KeyはStationとLocation、2つのTags Keyあります。

Tag Values

次はStation Tag KeysにはT-1とO-1のTag Valueがあり、location Tag KeysはTOKYOとOSAKAのTag Valueです。

Tag sets

Tag setsはTag key-valueの組み合わせになります。先のデータExampleでは以下のTag setsがあります。

location=TOKYO,station=T-1
location=OSAKA,station=O-1
location=TOKYO,station=O-1
location=OSAKA,station=T-1

Organization

InfluxDBのOrganizationはUser groupのWorkspaceになります。Organizationが管理するのはBucketだけではなく、dashboard、taskなどもそのOrganizationの下で管理されています。

Buckets

InfluxDBのデータはすべてBucketsの中に保存されています。そのBucketsに貯められたデータは設定されてる期間まではずっと保存します。更にExampleをあげましょう。いまはとある都市の天気データを取っています。

Play with Docker First!

Ubuntu Version

今回使用するのはUbuntu Version 22.04 LTSです。

Docker Installation

下記のLinkからDockerをインストールしてください。

Docker#Installation in Ubuntu

Install InfluxDB Docker

influxdb Dockerをインストールします。

sudo docker pull influxdb

Start the InfluxDB Server

下記のコマンドでInfluxDB Dockerを起動します。

Portは8086、USERNAME=my-user、PASSWORD=my-passwordです。

sudo docker run -p 8086:8086 \
      -v influxdb:/var/lib/influxdb \
      -v influxdb2:/var/lib/influxdb2 \
      -e DOCKER_INFLUXDB_INIT_MODE=upgrade \
      -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \
      -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \
      -e DOCKER_INFLUXDB_INIT_ORG=my-org \
      -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \
      influxdb

Chrome から下記のLINKにアクセスします。

http://localhost:8086

username=my-user,password=my-password

Check the Condition

まずDockerの稼働状態をCheckします。

sudo docker ps

COTANIER IDとIMAGEはinfluxdbが見えるはずです。

Exectute

InfluxDB コマンドラインを起動します。

sudo docker exec –it 35e2597700b4 /bin/bash

35e2597700b4 は先ほど確認したCONTAINER IDと同じです。

Check Version

InfluxDBのVersionを確認します。いまInfluxDB Image Versionは2.4.0です。

root@35e2597700b4:/# influx version
Influx CLI 2.4.0 (git: 5c7c34f) build_date: 2022-08-18T19:26:48Z

Check Configuration

InfluxDBのURL、有効しているかをCheckします。

root@35e2597700b4:/# influx config
Active Name       URL Org
*     default http://localhost:8086

Create Organization

まずOrganizationを作成してみます。

Serverから401のエラーが返答され、認証なしのアクセスはNGだと。

root@35e2597700b4:/# influx org create -n soup01
Error: failed to create org “soup01”: 401 Unauthorized: unauthorized access

Authentication

まず認証をやります。先程のInfluxDB Server Dashboardにアクセスします。

my-user’s Tokenをクリックします。

Tokenがありますね。”COPY TO CLIPBOARD”ボタンでTokenをCopyします。

次のコマンドでINFLUX_TOKEN変数に定義し先のTokenを貼り付けます。

root@35e2597700b4:/# export INFLUX_TOKEN=Zknskd0l6yGlcu-WlkTfMWBBIdsqR7V7RpznIB3Aal03bs0BIr5Cnnnm-h1_NbzS-EjxsOU-nYcvOgiR801QbQ==

Create Organization Again

先と同じコマンドでもう一度実行し、一番最後のパラメーターに -t $INFLUX_TOKENを追加すればOrganizationを作成できます。

root@35e2597700b4:/# influx org create -n soup01 -t $INFLUX_TOKEN
ID Name
39f953d4a69e707e soup01

Dashboardでもう一度確認しましょう。Switch Organizationsをクリックします。

Popupが表示され、soup01の新しいOrganizationが作成されました!

Check Organization List

同じくコマンドラインでも確認できます。

root@35e2597700b4:/# influx org list
ID Name
39f953d4a69e707e soup01
64eeccdac1a33dcd my-org

重複なOrganization名を作成するとエラー422が返答されます。

root@35e2597700b4:/# influx org create -n soup01                  
Error: failed to create org “soup01”: 422 Unprocessable Entity: organization with name soup01 already exists

Create the Buckets

新しいBucketsを作成します。

root@35e2597700b4:/# influx bucket create -n soup01 -o my-org -t $INFLUX_TOKEN

Create Data

データを作成します。

  1. Organization my-org、Buckets ST2、myHostでtestField=”testData”
  2. Organization my-org、Buckets ST2、myHostでtestField=”testData2”
  3. Organization my-org、Buckets ST2、myHostでtempature=30.5
  4. Organization my-org、Buckets ST2、myHostでtempature=30.7
root@5e024f1d1590:/# influx write -b ST2 -o my-org -p s -t $INFLUX_TOKEN ‘myMeasurement,host=myHost testField=”testData”‘

root@5e024f1d1590:/# influx write -b ST2 -o my-org -p s -t $INFLUX_TOKEN ‘myMeasurement,host=myHost testField=”testData2″‘

root@5e024f1d1590:/# influx write -b ST2 -o my-org -p s -t $INFLUX_TOKEN ‘myMeasurement,host=myHost temperature=30.5’

root@5e024f1d1590:/# influx write -b ST2 -o my-org -p s -t $INFLUX_TOKEN ‘myMeasurement,host=myHost temperature=30.7’

Check Query

Queryを作成しデータを取得します。

Organization my-orgのbucket ST2から1時間前のデータを取得します。Serverからデータ返答しました!

root@5e024f1d1590:/# influx query -o my-org ‘from (bucket:”ST2″) |> range(start:-1h)’
Result: _result
Table: keys: [_start, _stop, _field, _measurement, host]
                  _start:time                      _stop:time           _field:string     _measurement:string             host:string                      _time:time                  _value:float
——————————  ——————————  ———————-  ———————-  ———————-  ——————————  —————————-
2022-10-02T13:19:46.301108942Z  2022-10-02T14:19:46.301108942Z             temperature           myMeasurement                  myHost  2022-10-02T14:07:04.000000000Z                          30.5
2022-10-02T13:19:46.301108942Z  2022-10-02T14:19:46.301108942Z             temperature           myMeasurement                  myHost  2022-10-02T14:17:18.000000000Z                          30.7
Table: keys: [_start, _stop, _field, _measurement, host]
                  _start:time                      _stop:time           _field:string     _measurement:string             host:string                      _time:time           _value:string
——————————  ——————————  ———————-  ———————-  ———————-  ——————————  ———————-
2022-10-02T13:19:46.301108942Z  2022-10-02T14:19:46.301108942Z               testField           myMeasurement                  myHost  2022-10-02T14:00:32.000000000Z                testData
2022-10-02T13:19:46.301108942Z  2022-10-02T14:19:46.301108942Z               testField           myMeasurement                  myHost  2022-10-02T14:06:08.000000000Z               testData2
root@5e024f1d1590:/# 

Check in dashboard

Checkboxからも確認できます。

ST2>myMeasurement>testField>testFieldを選び、Medium last”を選び>SUBMITをクリックしQUERYを発行します。Severから返答ができました。

ST2>myMeasurement>testField>temperatureを選び、Mediumを選び>SUBMITをクリックしQUERYを発行します。Severから返答ができました。

Play with EPC1522!

次はPhoenix Contactに内蔵してるInfluxDBとNodeRedからも試してみましょう。

Check Status

まずEdge>DashboardからInfluxDBがRunningしてるかをCheckします。

Configuration

Chromeからhttps://yourip:8086をアクセスします。

Get Startedで設定が始まります。

初期USER画面が表示されます。

USER情報を入力し、Continueします。

よし、これでOKです。

Quick Startで完了です。

Node-red

下記のLinkでNode-Redにアクセスします。

https://192.168.2.10:1880

今回InfluxDBとやりとりするにはそのPlug-inを使用します。

https://flows.nodered.org/node/node-red-contrib-influxdb

Create Data

データをInfluxDB Bucketsに載せてみます。左にあるInflux batch NodeをFlow画面に追加します。

Influx batch Nodeが追加され、ダブルクリックします。

アクセスするSeverを設定します。

Server

ServerのFieldにあるペンICONをクリックします。

NameはNode-Redに表示するNode 名なので入力しなくても大丈夫です。

Version

Version Fieldで該当するServerのVersionを設定します。今回はV2.0にします。

URL

URL FieldはHttps://yourIP:8086を入力してください。

Token

Tokenを入力します。

Token Keyを確認するにはInfluxDBのDashboardにアクセスし、Data>Tokens>User名のところをダブルクリックします。

そのTokenをCopyし、先のToken Fieldに貼り付ければOKです。

Organization

Organizationを確認するにもInfluxDB Dashboardにアクセスする必要があります。

User>User名の下にあるのはOrganizationになります。

Bucket 

次はBucketを設定します。

Dashboard>ExplorerでいまOrganizationに管理されているBucketsを一覧できます。

今回使用するのはStation1というBucketsです。

Function

Node-RedでFunction NodeをFlowに追加します。

Function Nodeを開きます。

このCodeを貼り付けます。

msg.payload = [
    {
        measurement: “weather_sensor”,
        fields: {
            temp: 5.5,
            light: 481,
            humidity: 51
        },
        tags:{
            location:”garden”
        },
        timestamp: new Date()
    },
    {
        measurement: “alarm_sensor”,
        fields: {
            proximity: 1003,
            temp: 19.5
        },
        tags:{
            location:”home”
        },
        timestamp: new Date()
    }
];
return msg;
Concepts

先のMessageは実際このようなメッセージをInfluxDBに送信しています。

Inject

InfluxDB にデータ送信のTriggerを作成するためにinject Nodeを追加します。

Inject once after x secondsに起動のDelayを設定します。

RepeatをIntervalを選び>Cycle時間を1s、つまり1sことにTriggerされます。

3つのNodeを繋がりましょう。

Deploy

右上にあるDeloyボダンでFlowをDownloadします。

Check it

Explore>Data Explorerからデータを確認しましょう。

Queryを作成します。そのQueryというのはデータを取得するリクエストだと思ってください。_fieldと_measureementのすべてを選びます。

SubmitのボタンをクリックしたらDataが上にGraphに表示されるようになりました!

Query Data

次はNode-RedからQuery リクエストを作成します。

influxdb in のNodeをFlowに追加します。

Flow

先ほどとあまり変わらないFlowになります。

Function

FunctionのNodeに以下のCodeを貼り付けてください。

bucket名”Station1”から_measurementのweather_sensorのtemp Fieldのデータ1時間分を取り出します。

msg.query =

`
from(bucket: “Station1”)
|> range(start: -1h, stop: now())
|> filter(fn: (r) => r._measurement == “weather_sensor”)
|> filter(fn: (r) => r._field == “temp”)
`
return msg;

debug

結果がみたいので、Common Nodeからdebug Node追加します。

Test it

最後はInjectをクリックし返答を確認しましょう。

リクエストしたデータがServerから返答しましたね!

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする