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

  • URLをコピーしました!

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

今回はシグナルウォッチャーから取得できるデータのみでPowerBIを作成します。

目次

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

ダッシュボードの例
  • 「現在の装置の様子」と「本日の生産目標数」は、SeaglleViewerからリアルタイムにCSVを取得できる前提になります。
  • 「本日の生産目標数」のカウント値について、今回は仮で連続した稼働回数の合計値を使用しております。実際の運用時の生産数は、生産管理システムや装置より取得したカウンター値をご使用ください。

詳細な方法を載せるととても長くなるので、今回は簡単にコードと流れを以下に紹介します。

CSVは以下の場所からダウンロードできます。

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

各要素についてはNE-GW001A_EnOceanゲートウェイ取扱説明書に記載があったので、以下にまとめました。

要素名説明
ADATE年月日、時間
BIDシグナルウォッチャーのID
CFUNCTIONData:データ(変化点)
HeartBeat:死活監視
DRSSI受信信号強度
EBATTERY3:正常
2:電池交換時期が近付いています
1:電池交換してください
FSTATE1CH1の発光状態
0:消灯
1:点灯
3:低速点滅
7:高速点滅
8:点灯中に瞬時消灯
9:消灯中に瞬時点灯
GSTATE2CH2の発光状態
HSTATE3CH3の発光状態
ISTATE4CH4の発光状態

SeaglleViewerでは設定した表示優先度が高いものがガントチャートに表示されますが、CSVにすると優先度が低いものも取得できます。

STEP
PowerBIでCSVを読み込む

「データを取得」→「テキスト/CSV」でPowerBIでCSVファイルを読み込み、「データの変換」をクリックする、と以下のようになります。

STEP
データの前処理をする

今回のダッシュボードでは、高速点灯/消灯、瞬間点灯/消灯は区別せず、点灯/消灯として扱います。

そのままのCSVではダッシュボードの製作が難しいので、表示しやすいようにデータを整えます。

  1.  今回シグナルウォッチャー1つ分のデータを想定しているので、IDの列は削除。
  2.  FUNCTION、BATTERY、RSSI、STATE4は不要なので削除。
  3.  CH1(赤)を停止、CH2(緑)を準備、CH3(青)を稼働として、列名を変更。
  4.  0の時は消灯、1以上の時は点灯の2値をとる。
  5.  一つ後の行の値と比較し、各CHの開始タイミングを取得する。
  6.  状態を設定する。

以下のクエリを実行すると同様の結果が得られます。(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
    状態追加
STEP
回数計算用のクエリを作成する

稼働/準備/停止の回数や状態、生産目標等を表示するためのクエリを作成します。

  1.  「メイン」クエリを「参照」でコピーする。
  2.  不要な列を削除し、見やすくする。
  3.  「状態」列のnullを省く。

以下のクエリを実行すると同様の結果が得られます。

let
    ソース = メイン,
    削除された列 = Table.RemoveColumns(ソース,{"赤_停止(2値化)", "緑_準備(2値化)", "青_稼働(2値化)", "赤_1つ前の値", "緑_1つ前の値", "青_1つ前の値", "赤_立ち上がりパルス", "緑_立ち上がりパルス", "青_立ち上がりパルス", "赤_停止", "緑_準備", "青_稼働"}),
    並べ替えられた列 = Table.ReorderColumns(削除された列,{"インデックス", "DATE", "状態(回数用)"}),
    フィルターされた行 = Table.SelectRows(並べ替えられた列, each ([#"状態(回数用)"] <> null and [#"状態(回数用)"] <> ""))
in
    フィルターされた行
STEP
時間計算用のクエリを作成する

稼働/準備/停止の時間を集計できるようなクエリを作成します。

  1.  「メイン」クエリを「参照」でコピーする。
  2.  不要な列を削除し、見やすくする。
  3.  「状態」列を、フィル機能(下方向)を使い、nullの部分も埋める。
  4.  「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
STEP
適用して保存し、経過時間列のデータ型を変更する

そのままでは集計できないので、データ型を「時刻」に変更します。

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

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

この記事をシェアする
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段はAI・データ分析に関する業務を行なっています。
【資格】G検定2022 #3、AZ-900
【テスト】JDLA Generative AI TEST 2023 #2 合格

MELSOFT MaiLab、AzureOpenAIService、Azure、PowerBI 他

目次