時系列DB　InfluxDB2.0(APIを使用）メモ

Windows版＋M5Stack UIFlowで試したメモです。MQTTを使うと色々設定などが面倒なので直接APIをUIFlowで使ってみます。(代わりにUIFlowがすこし難しくなります）

MQTT経由のメモはこちらを参考に

https://qiita.com/NWLab/items/9bbbad9c3d598c9d9517

Node-REDのノードでInfluxDBに書き込む方法も書きました。(大規模なシステムは多分これが本命）

https://qiita.com/NWLab/items/57edaaf862914e8f0bf6


#InfluxDB（時系列DB）
時系列DBはリレーショナルDBではない。リレーショナルDBに1億件ぐらいの多量データを入れると、めちゃくちゃ遅くなる。IoTでは、多量のデータを取り扱うのでリレーショナルDBは使いづらい。IoTのセンサーでは、データの更新はほぼなく、時系列で順々にデータが蓄積されて行っているので、検索とかでその特徴を生かされていると思います。
Influxdbはダッシュボードとかもあるので、そのままでも見栄えは良いし、Grafanaを利用したらもっと良くなる？

#Influxdbインストール方法
##ダウンロード
https://docs.influxdata.com/influxdb/v2.0/install/?t=Windows

からダウンロードして、展開して、```C:\Program Files\InfluxData\influxdb\``` に移動する（管理者権限が必要、フォルダを作成する必要あります。）下記のスクリプトをPowerShell(管理者)で動かしても同じことができます。

```
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.8-windows-amd64.zip -UseBasicParsing -OutFile influxdb2-2.0.8-windows-amd64.zip
Expand-Archive .\influxdb2-2.0.8-windows-amd64.zip -DestinationPath 'C:\Program Files\InfluxData\'
mv 'C:\Program Files\InfluxData\influxdb2-2.0.8-windows-amd64' 'C:\Program Files\InfluxData\influxdb'
```

#Influxdbの実行
##実行
実行はPowerShell（管理者権限）で

```
cd -Path 'C:\Program Files\InfluxData\influxdb'
./influxd
```
##設定
設定はGUIとCLIがあるらしい。ここではGUIで
ブラウザで localhost:8086を開いて、[*Get Startted*]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/ec974c09-99cd-4b7b-a726-8dde065e4872.png)

userとpassword、organization name、bucket name(DB名みたいなもの？）を登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/40e2e67b-832c-ea7f-6b7c-0e938fcfcefb.png)
[*Quick Start*]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/d082fdd2-9094-7b9b-da52-6eb2af99c138.png)
なんか動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/443b1ead-b61e-1b23-7d60-0a42ad8c6a6a.png)
データは *c:\user\ユーザーフォルダ\\.infulxdbv2* に保存されていくみたいです。
###Bucketの設定
[Data]の[Buckets]タブの初期設定で作ったbucketの枠内の[*Settings*]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/c2e04b08-340f-df1d-8514-f205abf53287.png)
1週間で消える設定にしてみました。こういうのが出来て楽ですよね。[*Save Changes*]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/b77d0666-367c-bb00-e186-aa8536db92fb.png)
##認証のためのToken発行
データ書込みにはTokenが必要なので作成します。
[Data]の[Tokens]タブの[+ Generate Taken]をクリック　"Read/Write Token"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/4b1cab8d-f415-8632-0baf-7aac9d9e343c.png)
書込みだけでOKなのでWrite Tokenを作ります。Write側の書き込むBucketsを選択し [Save]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/54f0d359-dc45-7eaa-b7fb-824b98c372bf.png)

生成されたTokenをコピーし、Tokenの部分を書き換えます。日付を参考に今作ったTokenの方を選びます。この画面で名前が変更できるのでわかりやすくしておくのも手ですね。名前の部分をクリックするとTokenが見れるのでクリップボードにコピーしてどこかに保存しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/e166c1da-29bc-a1b2-a255-50f85d501ba2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/56f9172a-d679-e29c-34c1-a3c36ee2fa8e.png)

#M5Stack(UI Flow)
PCのIPアドレスとorg名、Bucket名、さっきのTokenが必要です。
Labelを2つ置いて、ブロックを組み立てていきます。
Http Requestでします。
MethodはPOST
URLは、http://PCのIPアドレス:8086/api/v2/write?org=ORG名&bucket=Bucket名 例：```http://192.168.11.11:8086/api/v2/write?org=home&bucket=Data1```

Headerは　Key”Authorization” Value”Token Token文字列”　例　```Token V0-Jx4VPCtZ-IIPdqqz0r6ICy-nRxGN3qA4ZWRotVWXtPD8eBTRy1DOxVcXHBVA71DeiMLOhrFu1qT-ZOhJ8Ew==```

Dataは文字列で”Line Protocol”を書きます。　例では```room temp=xx.xx```としています。roomがDBでいう所のTable（InfluxDBではMESUREMENTと言う） tempがField名になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/f3bcfe85-cdab-cc98-0415-9aa9f11dce59.png)



#確認
[Data Explorer]でデータを確認しましょう。
下の欄のデータを選択していき最後に[Submit]をクリックするとグラフが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/99451132-ef83-6a24-1306-6684d34a682d.png)

#カッコ良くBoard表示にしてみましょう。
左のBoardを選択し、新しく作ります。Add　Cellで足していきます。
さっきのクエリと一緒ですね。最後に右上のチェックをします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/68dc7cf8-f7bb-0926-563a-ad7ba905a0d3.png)
色々足すとこんな感じで表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/20191eb6-761d-728c-16db-2e0acee314d1.png)


#参考　InfluxDbのデータの書き込み
##Line protocol
https://docs.influxdata.com/influxdb/cloud/reference/syntax/line-protocol/
こんな感じで書くらしいです。
```measurementName fieldKey="field string value" 1556813561098000000```

```
// Syntax

<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]

// Example
myMeasurement,tag1=value1,tag2=value2 fieldKey="fieldValue" 1556813561098000000
```
tag（オプション）はIndexになるもので、Fieldはデータらしいです。Tagがあればそれでグループ化できるみたいです。
改行は newline character **\n** で表します。 Line protocol では、スペースに気を付けましょう。
Line protocolでは、tagとFieldでは改行**\n**は使えません。

```
measurementName,tagKey=tagValue fieldKey="fieldValue" 1465839830100400200
--------------- --------------- --------------------- -------------------
       |               |                  |                    |
  Measurement       Tag set           Field set            Timestamp
```

###Measurement
(必須) measurement名. InfluxDBは一つのポイントごとに1つの measurement名を付けます。 Measurement名は大文字小文字を区別されます。measurement名は_で始めることはできません。
Data type: String

###Tag set
(オプション) tag keyとtag valueの組み合わせになります。 Key-value との関係は**=** で表します。 複数のtag key-value の組み合わせは","で区切ります Tag keys と tag values は大文字小文字が区別されます。Tag keys は_で始めることはできません。

Key data type: String
Value data type: String
###Field set
(必須) field keyとfield valueの組み合わせになります。最低1つは必要です。Field keys と string values は大文字小文字が区別されます。 Field keys は_で始めることはできません。

Key data type: String
Value data type: Float | Integer | UInteger | String | Boolean

**"**で始まるのは string field 値です。 

```
measurementName fieldKey="field string value" 1556813561098000000
```
###Timestamp
Optional – The unix timestamp for the data point. InfluxDB accepts one timestamp per point. もしtimestampがない場合は、InfluxDB はHostマシンのsystem time (UTC)を使います。
Data type: Unix timestamp
‎
***タイムスタンプに関する注意***
数値が観測された時刻 (InfluxDB によって受信されない) がデータ ポイントに含まれるようにするには、タイムスタンプを含めます。‎
‎タイムスタンプがナノ秒でない場合は、‎‎データをDBに書き込むときのタイムスタンプの精度を‎‎指定します。‎

###空白（スペース）

空白はline protocolでは空白を使って値を分けます。 1つ目の空白はmeasurement名・the tag set をfield setと区別します。2つ目の空白はfield setとtimestampを区別します。

```
measurementName,tagKey=tagValue fieldKey="fieldValue" 1465839830100400200
                               |                     |
                           1st space             2nd space
```

###データの形式

|Type|方法|例|
|:--|:--|:--|
|Float|IEEE-754 64-bit floating-point numbers.<br/>Default numerical type.<br/>InfluxDB supports scientific notation in float field values.|myMeasurement fieldKey=1.0<br/>myMeasurement fieldKey=1<br/>myMeasurement fieldKey=-1.234456e+78|
|Integer|語尾にiをつける<br/>-9223372036854775808i～<br/>9223372036854775807i|myMeasurement fieldKey=1i<br/>myMeasurement fieldKey=12485903i<br/>myMeasurement fieldKey=-12485903i|
|UInteger|語尾にuをつける<br/>0u～18446744073709551615u|myMeasurement fieldKey=1u<br/>myMeasurement fieldKey=12485903u|
|String|ダブルコーテーションでくくる<br/>長さは最大64kb|myMeasurement fieldKey="this is a string"|
|Boolean|以下の表現が使える<br/>**True**	t, T, true, True, TRUE<br/>**False**	f, F, false, False, FALSE|myMeasurement fieldKey=true<br/>myMeasurement fieldKey=false<br/>myMeasurement fieldKey=t<br/>myMeasurement fieldKey=f<br/>myMeasurement fieldKey=TRUE<br/>myMeasurement fieldKey=FALSE|
|Unix timestamp|Unix timestamp in a specified precision. Default precision is nanoseconds (ns).<br/>-9223372036854775806～<br/>9223372036854775806|myMeasurementName fieldKey="fieldValue" **1556813561098000000**|

###引用符
Line protocolは**'**と**"**が使えます。 

|Element|Double quotes|Single quotes|
|:-----|:--:|:--:|
|Measurement|Limited *|Limited *|
|Tag key|Limited *|Limited *|
|Tag value|Limited *|Limited *|
|Field key|Limited *|Limited *|
|Field value|文字列のみ|なし|
|Timestamp|なし|なし|

* ‎Line protocolは、計測名、タグキー、タグ値、およびフィールドキーで二重引用符と単一引用符を使用できますが、名前、キー、または値の一部として解釈されます。‎

###特殊文字
Line protocolは特殊文字をstring elementsで使えます。**backslash (\)**を使ってescapする必要があります。

|Element|Escape characters|
|:--|:--|
|Measurement|Comma, Space|
|Tag key|Comma, Equals Sign, Space|
|Tag value|Comma, Equals Sign, Space|
|Field key|Comma, Equals Sign, Space|
|Field value|Double quote, Backslash|

ほかの特殊文字はescape不要です。

**Examples of special characters in line protocol**

```
# Measurement name with spaces
my\ Measurement fieldKey="string value"

# Double quotes in a string field value
myMeasurement fieldKey="\"string\" within a string"

# Tag keys and values with spaces
myMeasurement,tag\ Key1=tag\ Value1,tag\ Key2=tag\ Value2 fieldKey=100

# Emojis
myMeasurement,tagKey=🍭 fieldKey="Launch 🚀" 1556813561098000000
```

**backslashe\\** のエスケープ
Line protocolは、バックスラッシュとエスケープ文字としてのバックスラッシュの両方をサポートします。連続する 2 つのバックスラッシュを使用すると、最初のバックスラッシュはエスケープ文字として解釈されます。例えば：

|Backslashes|解釈|
|:--|:--|
| \ | \ |
| \\ | \ |
| \\\ | \\ |
| \\\\ | \\ |
| \\\\\ | \\\ |
| \\\\\\ | \\\ |

###注釈行
Line protocolは行頭に#を使うとコメント行になります。 

```
# This is a comment
myMeasurement fieldKey="string value" 1556813561098000000
```

###名前付けの制限
Measurement names, tag keys, and field keys は最初にアンダーライン_は使えません。_ namespace は予約されています。

###Duplicate points
‎ポイントは、計測名、タグセット、タイムスタンプによって一意に識別されます。同じ測定、タグセット、タイムスタンプを使用して行プロトコルを送信する場合、フィールドセットは古いフィールドセットと新しいフィールドセットの和集合となり、競合が新しいフィールドセットを優先します。‎

#参考にしたところ
https://qiita.com/nmrmsys/items/cdeb4afa76c591acfd3f

https://qiita.com/Kiyotaka/items/21291a416b612c7acb40

https://ittechnicalmemos.blogspot.com/2021/02/influxdbwindows.html

https://qiita.com/riverplus/items/5de5e830ddb622856209