IoTでセンサーデータを収集して可視化する仕組みを構築

こんにちは。ビーグルソフトの真鍋です。

中小企業の現場業務において、作業環境の状態をリアルタイムで把握することは、生産性の向上や品質改善、事故防止に直結します。しかしながら、IoTやデータ分析といったキーワードが並ぶ中で、「何から始めればよいのか分からない」という声が多く聞かれます。

一方で、現場での暗黙知を形式知に変える最初の一歩として、センサーデータは非常に有効です。設置すれば自動的にデータを取得できるため、課題形成から仮説確認において時間を有効に活用できます。

これまでの経験からも、IoT機器を導入することによる効果を確認したいことや、短期間で何かわかることがないかなど、現場改善のために必要な情報を見てみたいということはよくあることです。こういうことをフットワークよく試してみましょうかといえるような仕組みがあればと思ったので早速作ってみました。

今回は私たちにとってもPoCであるため、極力コストを掛けないで、できることを探しながら、フットワークよく対応できることを目的に構築しています。

(いろいろと書いていますが、やはり何かのデータが集まり、グラフになり時系列の出来事と関連付けるということはとてもわくわくするものです。今まで見えなかったものが見えるようになると、楽しいと感じることが多いのではないでしょうか。)


ダッシュボード

ダッシュボードは2つあります。1つはサマリーとして現在の状況を概観するための画面です。ここは、統計データをだしつつ、直近のデータをグラフ化するなどの対応をしています。

もうひとつが、詳細画面になります。各センサーの計測種類毎に時系列にデータを確認することができます。また、それぞれの計測種類毎のデータは全データ出力ができるのでExcel等で集計することもできます。

できることについて

今回作った仕組みは、GenbaScopeといいますが、センサーで取得した現場の環境データを可視化し、過去データの確認やCSVでのエクスポートも可能なダッシュボードシステムです。特徴は以下の通りです。

  • 1分ごとにセンサーデータを収集・蓄積
  • センサーデータはすべて組織ごとに分離管理
  • Streamlitによる軽量かつ直感的なUI
  • FlaskによるAPI設計で柔軟な拡張が可能

ChatGPTへ要件や実装内容を伝えて、コードの生成を依頼し、私は動かしてみて調整等を行いました。そのため、ほとんどの実装はChatGPTが生成したコードを採用しています。

技術スタックについて

ダッシュボードはStreamlitを採用しました。

Streamlit • A faster way to build and share data apps

採用した理由は、集めたデータをグラフに出すことが簡単だからです。認証部分などは工夫が必要ですが、とりあえずPandasのDataFrameにデータを設定すればグラフになるので扱いやすいです。

次に、APIと管理画面はFlaskを採用しました。

Welcome to Flask — Flask Documentation (3.1.x)

Flaskは軽量なアプリケーションサーバーで、JinjaやFlaskAdmin等のプラグインを追加することで比較的容易に必要な機能を実装できます。これまでも利用したことがあったため採用しました。

ORMはFlask-SQLAlchemyで、flask-migrationを採用してDBのテーブルへのアクセスや管理を行っています。

データベースは、当初はPoCだしSQLiteでいいかなと思ったのですが、データの更新頻度を増やすこと考えPostgreSQLを採用しました。SQLiteとPostgreSQLには大きな違いがありますが、導入コストはあまり変わらないという感想です。

センサーデータの収集について

センサーデータの収集は、1分間に1回HTTPリクエストをFlaskAPIへPOSTする仕組みにしています。

これは、中長期的には課題があります。センサー台数が増加したときやセンサーの種類によりデータ量が増加する場合などは、対応が必要です。しかし、現状ではこれで十分なので今後対応を検討しようと思います。

具体的にはセンサーからのデータ送信はMQTTによるものが望ましいなと思っています。HTTPだとヘッダーが大きくデータ量が多くなりますよね。ただ、今はこれで十分なのでしばらくはこれで進めようと思います。


システム構成概要

現行の本番環境は以下のような構成となっています。

  • サーバー: さくらVPS(Ubuntu 24.04)
  • バックエンド: Flask + Gunicorn
  • フロントエンド: Streamlit
  • データベース: PostgreSQL(ローカル接続)
  • リバースプロキシ: Nginx + Let’s Encrypt(HTTPS対応)
  • 自動バックアップ: Dropboxへのcron転送(Nginxログや設定ファイル等)

かなり費用を抑えるための構成になっています。10年ぶりくらいにさくらのVPSでサーバーを立てました。1台のサーバーにWebサーバー、アプリケーションサーバー、データベースサーバーが同居する構成にしています。

懸念事項

懸念事項がたくさんあります。例えば、データはどんどん増加するので、ストレージのことを考えてもデータベースは分けたいなと思います。また、ステージング環境もほしい。
踏み台サーバーもほしいし、アプリケーションサーバーを2台構成にしたいとか思うところはあります。

しかし、これはPoCなので最小構成で行けるところまで行ってみます。

CIについてはGitHubActionを利用して、mainブランチにマージされるとデプロイが実行されるように構成しています。ここだけは、抑えておきたかったところでした。

バックアップ

バックアップはS3に上げようか迷ったのですが、ここも費用を抑えることを考えてDropboxへアップロードすることにしました。今のところ、Dropboxにバックアップをとることで問題ないレベルなのでいったんはよしとしました。


IoTデバイスからのデータ送信

現場にはM5Stack + ENV IIIセンサーを設置し、以下の仕様でデータを送信しています。

  • データ送信周期: 1分ごと
  • 通信方式: HTTP POST(APIキーによる認証付き)

アプリケーションサーバーや可視化よりこちらの方が難しかったです。久しぶりにあまり書いたことがないC++でM5Stackが動作するように設定しました。とはいえ、サンプルコードが豊富なので、デバイス周りのことではまらなければ実現したいことは概ね実現できそうです。


今後の展望

GenbaScopeは、中小企業診断士として支援するときに活用できるツールとして育てていこうと思っています。開発者として欲しい(作りたい)機能と、現場で本当に必要な機能にはギャップがあります。ギャップがあることを認識して自分が作りたいものではなく、作るべきものを作っていきたいと思います。

そのためにも、今は実現したいことがスムーズに実現できる状態を維持していきたいと考えています。今のところ、このくらいがちょうどよいかなと。


まとめ

「GenbaScope」は、現場のデータを収集・可視化し、現場の“気づき”を支援するための汎用プラットフォームです。安価なIoTデバイスとシンプルな設計により、どの現場でもすぐに始められる設計を目指しました。
現場の変化を捉え、データに基づいた判断ができる環境を整えることは、デジタル化・DXの第一歩として非常に有効です。

今後もこの仕組みをベースに、多くの現場課題の解決に取り組んでいきます。