シグナルウォッチャーのデータ+PowerBIでダッシュボードを作ってみた

前回の記事では、シグナルウォッチャーのセットアップとソフト上でのセンサー情報の可視化を紹介しました。
今回の記事では、CSVダウンロードした後にPowerBIで読み込んで見る方法をご紹介します。
今回はシグナルウォッチャーから取得できるデータのみでPowerBIを作成します。

こんなダッシュボードが作れます
SeaglleViewerから出力したCSVをPowerBIに読み込ませてデータを整形することで、以下のようなダッシュボードが作成できます。

- 「現在の装置の様子」と「本日の生産目標数」は、SeaglleViewerからリアルタイムにCSVを取得できる前提になります。
- 「本日の生産目標数」のカウント値について、今回は仮で連続した稼働回数の合計値を使用しております。実際の運用時の生産数は、生産管理システムや装置より取得したカウンター値をご使用ください。
詳細な方法を載せるととても長くなるので、今回は簡単にコードと流れを以下に紹介します。
1. SeaglleViewerからCSVを取得する
CSVは以下の場所からダウンロードできます。

CSVの中身はこのような構成になっています。

各要素についてはNE-GW001A_EnOceanゲートウェイ取扱説明書に記載があったので、以下にまとめました。
列 | 要素名 | 説明 |
---|---|---|
A | DATE | 年月日、時間 |
B | ID | シグナルウォッチャーのID |
C | FUNCTION | Data:データ(変化点) HeartBeat:死活監視 |
D | RSSI | 受信信号強度 |
E | BATTERY | 3:正常 2:電池交換時期が近付いています 1:電池交換してください |
F | STATE1 | CH1の発光状態 0:消灯 1:点灯 3:低速点滅 7:高速点滅 8:点灯中に瞬時消灯 9:消灯中に瞬時点灯 |
G | STATE2 | CH2の発光状態 |
H | STATE3 | CH3の発光状態 |
I | STATE4 | CH4の発光状態 |

SeaglleViewerでは設定した表示優先度が高いものがガントチャートに表示されますが、CSVにすると優先度が低いものも取得できます。
2. PowerBIにデータを取り込み、前処理をする
「データを取得」→「テキスト/CSV」でPowerBIでCSVファイルを読み込み、「データの変換」をクリックする、と以下のようになります。

今回のダッシュボードでは、高速点灯/消灯、瞬間点灯/消灯は区別せず、点灯/消灯として扱います。
そのままのCSVではダッシュボードの製作が難しいので、表示しやすいようにデータを整えます。
- 今回シグナルウォッチャー1つ分のデータを想定しているので、IDの列は削除。
- FUNCTION、BATTERY、RSSI、STATE4は不要なので削除。
- CH1(赤)を停止、CH2(緑)を準備、CH3(青)を稼働として、列名を変更。
- 0の時は消灯、1以上の時は点灯の2値をとる。
- 一つ後の行の値と比較し、各CHの開始タイミングを取得する。
- 状態を設定する。
以下のクエリを実行すると同様の結果が得られます。(CSVを読み込むとクエリステップ「変更された型」まで作成されるので、以降の処理を紹介します。)
let
ソース = Your CSV File,
昇格されたヘッダー = Your CSV File Read,
変更された型 = Your CSV File Read,
-- ↑ここまで自動作成される --
削除された列 = Table.RemoveColumns(変更された型,{"ID", "FUNCTION", "RSSI", "BATTERY", "STATE4"}),
#"名前が変更された列 " = Table.RenameColumns(削除された列,{{"STATE1", "赤_停止"}, {"STATE2", "緑_準備"}, {"STATE3", "青_稼働"}}),
追加されたインデックス = Table.AddIndexColumn(#"名前が変更された列 ", "インデックス", 0, 1, Int64.Type),
赤_停止2値化追加 = Table.AddColumn(追加されたインデックス, "赤_停止(2値化)", each Number.Sign([赤_停止]), Int64.Type),
緑_準備2値化追加 = Table.AddColumn(赤_停止2値化追加, "緑_準備(2値化)", each if [#"赤_停止(2値化)"] = 0 then Number.Sign([緑_準備]) else 0),
青_稼働2値化追加 = Table.AddColumn(緑_準備2値化追加, "青_稼働(2値化)", each if [#"赤_停止(2値化)"] = 0 and [#"緑_準備(2値化)"] = 0 then Number.Sign([青_稼働]) else 0),
赤_1つ前の値追加 = Table.AddColumn(青_稼働2値化追加, "赤_1つ前の値", each try 青_稼働2値化追加{[インデックス]-1}[#"赤_停止(2値化)"] otherwise 0),
緑_1つ前の値追加 = Table.AddColumn(赤_1つ前の値追加, "緑_1つ前の値", each try 青_稼働2値化追加{[インデックス]-1}[#"緑_準備(2値化)"] otherwise 0),
青_1つ前の値追加 = Table.AddColumn(緑_1つ前の値追加, "青_1つ前の値", each try 青_稼働2値化追加{[インデックス]-1}[#"青_稼働(2値化)"] otherwise 0),
赤_立ち上がりパルス追加 = Table.AddColumn(青_1つ前の値追加, "赤_立ち上がりパルス", each [#"赤_停止(2値化)"] - [赤_1つ前の値]),
緑_立ち上がりパルス追加 = Table.AddColumn(赤_立ち上がりパルス追加, "緑_立ち上がりパルス", each [#"緑_準備(2値化)"] - [緑_1つ前の値]),
青_立ち上がりパルス追加 = Table.AddColumn(緑_立ち上がりパルス追加, "青_立ち上がりパルス", each [#"青_稼働(2値化)"] - [青_1つ前の値]),
状態追加 = Table.AddColumn(青_立ち上がりパルス追加, "状態(回数用)", each if [赤_立ち上がりパルス]=1 then "停止" else if [緑_立ち上がりパルス]=1 then "準備" else if [青_立ち上がりパルス]=1 then "稼働" else null)
in
状態追加

3. グラフ表示用のクエリを作成する
稼働/準備/停止の回数や状態、生産目標等を表示するためのクエリを作成します。
- 「メイン」クエリを「参照」でコピーする。
- 不要な列を削除し、見やすくする。
- 「状態」列のnullを省く。
以下のクエリを実行すると同様の結果が得られます。
let
ソース = メイン,
削除された列 = Table.RemoveColumns(ソース,{"赤_停止(2値化)", "緑_準備(2値化)", "青_稼働(2値化)", "赤_1つ前の値", "緑_1つ前の値", "青_1つ前の値", "赤_立ち上がりパルス", "緑_立ち上がりパルス", "青_立ち上がりパルス", "赤_停止", "緑_準備", "青_稼働"}),
並べ替えられた列 = Table.ReorderColumns(削除された列,{"インデックス", "DATE", "状態(回数用)"}),
フィルターされた行 = Table.SelectRows(並べ替えられた列, each ([#"状態(回数用)"] <> null and [#"状態(回数用)"] <> ""))
in
フィルターされた行
稼働/準備/停止の時間を集計できるようなクエリを作成します。
- 「メイン」クエリを「参照」でコピーする。
- 不要な列を削除し、見やすくする。
- 「状態」列を、フィル機能(下方向)を使い、nullの部分も埋める。
- 「DATE」列について、一つ後の行の値と比較し、時間の差分取得する。
以下のクエリを実行すると同様の結果が得られます。
let
ソース = メイン,
並べ替えられた列 = Table.ReorderColumns(ソース,{"インデックス", "DATE", "赤_停止", "緑_準備", "青_稼働", "赤_停止(2値化)", "緑_準備(2値化)", "青_稼働(2値化)", "赤_1つ前の値", "緑_1つ前の値", "青_1つ前の値", "赤_立ち上がりパルス", "緑_立ち上がりパルス", "青_立ち上がりパルス", "状態(回数用)"}),
削除された列 = Table.RemoveColumns(並べ替えられた列,{"赤_停止", "緑_準備", "青_稼働", "赤_停止(2値化)", "緑_準備(2値化)", "青_稼働(2値化)", "赤_1つ前の値", "緑_1つ前の値", "青_1つ前の値", "赤_立ち上がりパルス", "緑_立ち上がりパルス", "青_立ち上がりパルス"}),
下方向へコピー済み = Table.FillDown(削除された列,{"状態(回数用)"}),
追加されたカスタム = Table.AddColumn(下方向へコピー済み, "1つ前のDATE", each try #"下方向へコピー済み"{[インデックス]-1}[DATE] otherwise [DATE]),
追加されたカスタム1 = Table.AddColumn(追加されたカスタム, "経過時間", each [DATE] - [1つ前のDATE]),
変更された型 = Table.TransformColumnTypes(追加されたカスタム1,{{"経過時間", type duration}}),
並べ替えられた列1 = Table.ReorderColumns(変更された型,{"インデックス", "DATE", "1つ前のDATE", "経過時間", "状態(回数用)"})
in
並べ替えられた列1
そのままでは集計できないので、データ型を「時刻」に変更します。

4. データをグラフに当てはめて完成
グラフにデータをあてはめ、整形すると完成です。

おわりに
本記事ではPowerBIを使って、シグナルウォッチャーから得られたデータを可視化してみました。もしSeaglleViewerの表示とは別の表示をしたい場合は、ぜひ試してみてください
