ガントチャートを作成したい【Dr.Sum/MotionBoard】

#1．はじめに
**MotionBoard(BIダッシュボードツール)**でガントチャートを作るために必要なデータを
**Dr.Sum(データベース)**に貯めるまでの手順のうち
主に時系列データの加工方法を記します。

###＜使用製品＞
・MotionBoard
　データを可視化するBIダッシュボードツール。
　Dr.Sumと連携することで簡単に設備データを可視化できる。

・Dr.Sum
　大容量データを高速集計できるデータベース。
　(Funnel機能を使う場合はバージョンがDr.Sum 5.1 以降であることが必須。)

・Dr.Sum Data Funnel
　**Dr.Sum(Ver5.1以降)の標準機能**でデータの加工変換処理をしたうえでDr.Sumにデータを貯める機能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/61516a18-7e19-3023-6a36-141faba9bb43.png)
#2.ガントチャートとは


>ガントチャートとは、プロジェクト管理や生産管理などで工程管理に用いられる表の一種で、作業計画を視覚的に表現するために用いられる。棒グラフの一種でもあり、横棒によって作業の進捗状況を表す。(Wikipedia)

つまり、下図のような**進捗確認**などに向いているグラフのことをガントチャートと言うようです。
![ガントチャートサンプル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/002ecb73-3375-5bac-c0c6-0f2a8e58d556.png "ガントチャートサンプル")


#3.データ準備
ガントチャートを作る際に必要なデータの形を確認していきます！
**何(設備や人など)が〇時～〇時までどのような状態だったか**というデータが必要です。
 ＜サンプルデータ＞

|設備名| 状態| 開始時間           | 終了時間    |
|:------------------|:------------------|:------------------|:------------------|
|A　　　　|正常 　　　　　|2020/5/20 9:00|2020/5/20 9:46|
|A　　　　|危険　 　　　　|2020/5/20 9:46|2020/5/20 10:17|
|C　　　　|正常　 　　　　|2020/5/20 9:00|2020/5/20 10:21|

必須項目は下記の通りです。
・日時データ　
　　　該当範囲を塗りつぶすために作業の**開始時刻**と**終了時刻**の両方が必要です。
・作業者名やプロジェクト名など
　　　イメージ図の行項目にあたるデータ
・作業の内容がわかる項目
　　　塗りつぶした箇所の内容を指すデータ

<details><summary>サンプルデータCSV</summary><div>

```csvs:gantt_before.csv

設備,ステータス,時刻
B,正常,2020/5/20 9:00:00
A,危険,2020/5/20 9:46:00
A,正常,2020/5/20 10:17:00
C,危険,2020/5/20 10:21:00
B,危険,2020/5/20 10:44:00
C,正常,2020/5/20 10:46:00
B,正常,2020/5/20 11:00:00
B,危険,2020/5/20 11:26:00
B,停止,2020/5/20 12:00:00
A,危険,2020/5/20 12:44:00
B,正常,2020/5/20 12:44:00
C,危険,2020/5/20 12:44:00
A,正常,2020/5/20 13:55:00
B,危険,2020/5/20 13:55:00
B,正常,2020/5/20 14:22:00
C,正常,2020/5/20 14:22:00
C,危険,2020/5/20 14:50:00
A,危険,2020/5/20 15:30:00
C,停止,2020/5/20 15:44:00
B,危険,2020/5/20 16:58:00
C,正常,2020/5/20 16:58:00
C,危険,2020/5/20 17:11:00
A,正常,2020/5/20 17:44:00
B,正常,2020/5/20 18:37:00
C,正常,2020/5/20 18:37:00
A,危険,2020/5/20 19:18:00
B,危険,2020/5/20 19:40:00
B,正常,2020/5/20 21:13:00
C,危険,2020/5/20 21:15:00
A,正常,2020/5/20 21:55:00
C,正常,2020/5/20 22:00:00
B,危険,2020/5/20 23:26:00
C,危険,2020/5/21 8:58:00
B,正常,2020/5/21 8:59:00
A,危険,2020/5/21 9:10:00
C,停止,2020/5/21 9:50:00
A,正常,2020/5/21 10:17:00
C,危険,2020/5/21 10:20:00
B,危険,2020/5/21 10:27:00

```
</div></details>

###＜データの加工イメージ＞
ここでよくある例として「設備から出力した時点のデータ」と
「ガントチャートの作成に必要なデータ」を比較してみます。

「設備から出力した時点のデータ」には**状態が変わった時点のデータしかない**ため
設備の稼働状態毎に開始・終了時刻を1レコードにするための加工変換が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/cb85d5d1-71c2-cabb-87e2-95704b479e2a.png)

#4.Funnelを設定してみる
＜データの加工イメージ＞で示したデータ加工については
**Funnelを使うことでGUI操作のみで設定が可能でした！！**

実際にどのような設定したかを紹介する前に
機能について少し紹介です。

###Dr.Sum Data Funnelとは？
データの取得と加工はDr.Sum Data Funnelで行います。
Dr.Sum Data Funnelとは、継続的に発生する時系列データをリアルタイムに収集、加工するためのツールです。
※詳しく知りたい方は[マニュアル](https://cs.wingarc.com/manual/drsum/5.5/ja/UUID-22e5cf79-b783-ed52-f7f8-d29f284be8b0.html "Funnel")へどうぞ

データの収集方法は4種類
　・CSV
　・MQTT
　・HTTP
　・OPC UA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/63b9c6c7-e3f9-ee18-09fd-e0c886ad3056.png)

今回は、CSVデータを用意しコマンドを使ってアドホック実行する方法で
データが意図した形に加工できているか確認してみます！！!

###Funnelの設定
事前にFunnelのインストールと初期設定は完了している前提で
今回は**Data Funnel Clientの設定のみ**書いていきます！

セットアップについては[マニュアル](https://cs.wingarc.com/manual/drsum/5.5/ja/UUID-f07007a5-e439-cb47-50de-51332be025ad.html "セットアップ")をご確認ください。

1．Data Funnel Clientで新しいパイプライン定義を作成します。

2．[取り込みデータ]の設定をします。

＜完成イメージ＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/e197d061-54b4-48ae-45e9-fba74374ce09.png)

＜設定内容＞
　パイプライン設定
　　実行種別：アドホック
　取り込み設定　データタイプ：CSV
　テーブルのスキーマ
　　[テーブル化の設定]＞[データを入力して推定]からサンプルデータを入力し
　　データが取得できるか確認すると「設備」、「状態」、「時刻」のデータを取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/d6a94a3f-b286-5ea7-5821-b4697f11fe65.png)

[テーブル化の設定]画面下側の[プレビュー]をクリックし読み取るデータを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/5d8bd3de-a736-57fe-519a-87e4d5027859.png)

3．[サンプルデータ]を設定します。
[サンプルデータ]の「[テーブル化の設定]のプレビューデータを追加」をクリックします。

4．[データ処理]を設定してデータの加工変換をします。
[データ処理]の[アクションの追加]を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/a450609a-7683-c37a-9551-4106db1ceccf.png)

アクションの追加画面で[アクション名：状態変化の検出]を選び
「追加」ボタンをクリックします。

5．[状態変化の検出]＞[変数]、[項目]の設定をします。

まず、開始時刻となるレコードの時刻を入れておく変数を作成します。
＜このアクションの変数＞
　変数名：開始時刻
　型：DATETIME
　識別項目の考慮：する
　複数地の保持：しない
　値の保持期間：常に上書き

次に、加工して新たに作りたい項目を作ります。
＜このアクションで追加する項目＞
　項目名：開始
　型：DATETIME
　
　項目名；前回状態
　型：STRING
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/356a5b19-e2ba-64c7-b341-ca136da6cb53.png)
6．[状態変化の検出]＞[状態変化の検出の設定]をします。

まず、右下にある「処理の設定」を3つ設定します。
＜完成イメージ＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/474b86a5-b8fe-455c-8530-19ff01cfa04f.png)
＜設定内容＞
　◆1つ目　状態変化前の開始時刻の取得
　　[新規作成]ボタンをクリックし下記の通り設定します。
　　　追加タイプ：項目
　　　追加項目名：開始
　　　処理：参照値の追加
　　　値の参照
　　　　参照タイプ：変数
　　　　参照する変数名：開始時刻

　　ここまで設定したら、[処理の設定]＞[参照する値]の入力欄にあるファイルマークのアイコンをクリックします。

　　参照する値に[v:開始時刻:]と入力されたらOKです。

　◆2つ目　1つ前の状態を取得

　　[新規作成]ボタンをクリックし下記の通り設定します。
　　　追加タイプ：項目
　　　追加項目名：前回状態
　　　処理：参照値の追加
　　　値の参照
　　　　参照タイプ：項目
　　　　参照する項目名：状態
　　　　現在値/前回値：前回値

　　ここまで設定したら、[処理の設定]＞[参照する値]の入力欄にあるファイルマークのアイコンをクリックします。

　　参照する値に[p:状態:]と入力されたらOKです。

　◆3つ目　開始時間を取得

　　[新規作成]ボタンをクリックし下記の通り設定します。
　　　追加タイプ：変数
　　　追加項目名：開始時刻
　　　処理：参照値の追加
　　　値の参照
　　　　参照タイプ：項目
　　　　参照する項目名：時刻
　　　　現在値/前回値：現在値

　　ここまで設定したら、[処理の設定]＞[参照する値]の入力欄にあるファイルマークのアイコンをクリックします。

　　参照する値に[c:時刻:]と入力されたらOKです。

7．条件の設定をします。
何を状態変化として検知するかの設定箇所です。
今回は**設備の状態が変化したとき**とします。

条件の編集画面にある説明に設定内容を記入しておくと、あとでわかりやすいです。

　説明：状態が切り替わったら

[条件の設定]の[項目、または変数]を設定していきます。
　値の参照
　　参照タイプ：項目
　　参照する項目名：状態
　　現在値/前回値：現在値

ここまで設定したら、条件の設定の「項目、または変数」の入力欄にあるファイルマークのアイコンをクリックします。

　　参照する値に[c:状態:]と入力されたらOKです。

次に[条件の設定]の「比較する値」をセットしていきます。　
値の参照
　　参照タイプ：項目
　　参照する項目名：状態
　　現在値/前回値：前回値

ここまで設定したら、条件の設定の[項目、または変数]の入力欄にあるファイルマークのアイコンをクリックします。

　　参照する値に[p:状態:]と入力されたらOKです。

**演算子を「!=」**にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/02b002b8-b884-eb90-3173-866ef8ad640f.png)

ここまで設定したら、最後に一番下にある**「追加」**ボタンをクリックして
「状態変化の検出の設定」にこれまでの設定内容が反映されたら設定完了です。

＜状態変化の検出画面　完成イメージ＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/a2e53146-a26e-69fe-6a29-126cb589bede.png)



8．[アクション追加]に戻りSQL処理を追加します。

アクションの追加画面で[アクション名：SQL]を選び
「挿入」ボタンをクリックします。

[SQLの編集]画面が開いたら、「入力データの項目」から必要な項目を選択し
画面左のクエリービルダーへドラック＆ドロップで項目追加し
別名をつけます。
Where句の記入欄には、下記の通り記載します。

```csvs:Where
前回状態 IS NOT NULL
```

設定内容は画像の通りです。
＜完成イメージ＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/68b7c831-8be0-39da-e5b2-dc5da738fa6b.png)

ここまでで[SQLの編集]画面の設定は完了です。

最後にアクション追加の順番は下記の通りにしておきます。
　状態変化の検出
　SQL

＜完成イメージ＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/12d3a162-ed85-b7b6-a484-04d4e821ee7c.png)

9．「Dr.Sumに出力」を設定します。
出力先のテーブルを決める前に、Dr.Sumにテーブルを作成します。
<details><summary>DBとテーブルの作り方</summary><div>

　1．「Dr.Sumに出力」画面真ん中あたりにある[テーブルの作成SQLをクリックボードにコピー]をクリックし、Dr.SumのEnterpriseManagerを開きます。
　2．データベースを作成します。
　3．SQL Executorを開き、[接続先データベース]は2で作成したDBを選びます。
　4．コピーしたSQL文を貼り付け実行します。

</div></details>

テーブルの準備ができたら
「出力する」にチェックを入れ、[出力先サーバーの選択]からDr.Sumにログインし
データ出力先のデータベースおよびテーブルを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/36d691ae-ffff-739a-a446-aa449624eb71.png)

最後に**「パイプライン定義を保存」**すれば、
###データの受け取り　→　加工変換　→　Dr.Sumへの書き込み
の設定が完了です。

#5．アドホック実行してみる
作成したパイプライン定義を右クリック、「アドホック実行」を選択しサンプルデータのCSVファイルを読込ませます。

正常に処理が完了したら、Dr.SumのEnterpriseManagerを開き書き込み先のテーブルを参照すると
ガントチャート作成に必要なデータの形が作れていることが確認できました！

<details><summary>＜ガントチャートに必要なデータサンプル＞</summary><div>

|設備名| 状態| 開始時間           | 終了時間    |
|:------------------|:------------------|:------------------|:------------------|
|A　　　　|正常 　　　　　|2020/5/20 9:00|2020/5/20 9:46|
|A　　　　|危険　 　　　　|2020/5/20 9:46|2020/5/20 10:17|
|C　　　　|正常　 　　　　|2020/5/20 9:00|2020/5/20 10:21|
</div></details>

<details><summary>＜Funnel経由でDr.Sumに入ったデータ＞</summary><div>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/f3fb14ac-a31f-0331-72e6-14335305c8d6.png)
</div></details>

あとはDr.Sumのデータを使ってMotionBoardのガントチャートを作るだけです！
※詳しく知りたい方は[マニュアル](https://cs.wingarc.com/manual/mb/6.2/ja/UUID-3b2ca1a1-719a-c115-bd35-454283802665.html
 "ガント")へどうぞ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520797/43dce9fe-1998-b28f-6767-300925e78fc7.png)

他にもFunnelでの状態変化機能を使って検出できる情報は色々あります！

　想定シナリオ：危険値が続いている場合は担当者が設備をチェックしに行く
　Funnelでできること：値がｎ回上昇したらフラグ通知する

　想定シナリオ：生産数がわかる
　Funnelでできること：サイクルタイムを算出する

　想定シナリオ：設備が〇分以上動いていなかったらチェックしに行く
　Funnelでできること：ある状態が○分以上経過したら通知する　　　　etc.

1時間ほどあれば試せる内容なので
ぜひ試してみてください。