初めてのアプリを作る
このガイドでは、エッジデバイスからデータを収集しリアルタイムダッシュボードに表示するIronFlockアプリの典型的なワークフローを紹介します。最後にはデータモデル、エッジロジック、ユーザー向け設定フォーム、ライブチャートが完成し、すべてがプロジェクトデータベースを通じて接続されます。
1. データモデルの設計
.ironflock/data-template.yml ファイルから始めます。テーブルは2つのカテゴリで考えます:
- エンティティテーブル — 現在の状態を追跡します(デバイス、マシン、接続)。変更のたびに行が追加され、
maintainLatestFlagForがエンティティを識別するカラムを宣言することで、必要なときにエンティティごとの最新の行を読み出せます。 - 時系列テーブル — 時間の経過に伴う測定値を収集します(センサー値、メトリクス)。各行はタイムスタンプ付きの新しいデータポイントです。
data:
tables:
# エンティティテーブル:デバイスごとに1行、最新状態を常にクエリ可能
- tablename: devices
maintainLatestFlagFor: ['device_key']
columns:
- id: tsp
dataType: timestamp
- id: device_key
dataType: string
- id: status
dataType: string
- id: device_name
dataType: string
- id: deleted
dataType: boolean
# エンティティテーブル:ユーザー設定のModbusサーバー
- tablename: modbus_servers
maintainLatestFlagFor: ['server_id']
columns:
- id: tsp
dataType: timestamp
- id: server_id
dataType: string
- id: host
dataType: string
- id: port
dataType: numeric
- id: deleted
dataType: boolean
# 時系列テーブル:接続されたハードウェアからの定期的な測定値
- tablename: readings
columns:
- id: tsp
dataType: timestamp
- id: server_id
dataType: string
- id: metric
dataType: string
- id: value
dataType: numeric2. テスト環境のセットアップ
アプリをテストするには、少なくとも1台のオンラインデバイスがあるプロジェクトに開発環境が必要です:
- アプリ詳細ページの Develop をクリックしてCloud IDEを開きます。
- アクセス可能な任意のプロジェクトからオンラインデバイスを選択します。
- サイドパネルの Create Backend をクリックして、プロジェクトのデータベースに開発環境を作成します。
これにより、data-template.yml で定義したテーブルがプロジェクトのデータベース内に作成されます。プロジェクトのFleet Databaseビューで確認できます。
Cloud IDEはファイルエクスプローラー、エディター、ターミナル、デバイスへのビルドとデプロイのためのEdge Developmentパネルを備えた完全なVS Code環境を提供します。
3. エッジコードの記述
DockerコンテナはデバイスAus上で実行され、IronFlock SDKを使用してプロジェクトデータベースとやり取りします。
起動時にデバイスを登録する
エッジコンポーネントが起動したら、devices エンティティテーブルに行を追加して、デバイスがオンラインであることをダッシュボードに通知します:
Python
import asyncio
from ironflock import IronFlock
async def main():
# このデバイスをオンラインとして登録
await flock.append_to_table("devices", {
"device_key": os.environ.get('DEVICE_KEY'),
"tsp": now,
"status": "online",
"device_name": os.environ.get('DEVICE_NAME'),
"deleted": False
})
# ... 残りのロジック
flock = IronFlock(mainFunc=main)
flock.run()devices は maintainLatestFlagFor: ['device_key'] を使用しているため、このデバイスの前のステータス行は自動的に置き換えられます。latest フィルタを有効にしたウィジェットは常に現在の状態を表示します。
ユーザー設定に反応する
ユーザーはボード上のフォームからModbusサーバーを追加できます(ステップ4参照)。エッジコードは modbus_servers テーブルをサブスクライブし、新しいエントリに対応します:
Python
async def main():
# ... デバイス登録 ...
# 既存のModbusサーバーを読み込む
existing = await flock.getHistory("modbus_servers", {
"limit": 1000,
"filterAnd": [
# "latest": True は server_id ごとの最新の行のみを返す
{"latest": True},
{"column": "deleted", "operator": "IS", "value": None}
]
})
for server in existing:
create_modbus_connection(server)
# リアルタイムで新しいサーバーに反応
def on_server_change(*args, **kwargs):
server = args[0] if args else kwargs
if server.get("deleted"):
delete_modbus_connection(server["server_id"])
else:
create_modbus_connection(server)
await flock.subscribe_to_table("modbus_servers", on_server_change)時系列データの収集
Modbus接続が確立されたら、定期的にポーリングして測定値を readings テーブルに書き込みます:
Python
async def modbus_poll_loop(server_id, client):
while True:
values = client.read_registers()
for metric, value in values.items():
await flock.publish_to_table("readings", {
"server_id": server_id,
"metric": metric,
"value": value
})
await asyncio.sleep(5)4. ボードの構築
Board Editorを開き、Data Backendテーブルに接続するウィジェットを追加します。
デバイスステータスの表示
devices テーブルに接続した Table ウィジェットを追加します。ウィジェットのフィルタ設定で latest トグルをオンにして、各デバイスの現在の状態が常に表示されるようにします。デバイスがオンラインまたはオフラインになると、テーブルは自動的に更新されます。
ユーザーにModbusサーバーを設定させる
modbus_servers テーブルに接続した Form ウィジェットを追加します。host と port のフィールドを設定します。ユーザーがフォームに入力して送信すると、modbus_servers テーブルに新しい行が自動的に挿入されます — フォーム送信を処理するバックエンドコードは不要です。
エッジコードが subscribeToTable(ステップ3参照)を通じて新しい行を検出し、Modbus接続を確立します。
時系列データの可視化
readings テーブルに接続した Line Chart ウィジェットを追加します。tsp をX軸に、value をY軸にマッピングします。デバイスから新しい測定値が届くとチャートはリアルタイムで更新されます — ポーリングや手動更新は不要です。
全体の仕組み
┌─────────────────────────────────────────────────────────┐
│ Board(ダッシュボード) │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ Table │ │ Form │ │ Line Chart │ │
│ │ devices │ │ modbus_servers │ │ readings │ │
│ └────┬─────┘ └──────┬───────┘ └────────┬──────────┘ │
│ │ │ │ │
└───────┼───────────────┼───────────────────┼──────────────┘
│ │ │
┌────▼───────────────▼───────────────────▼────┐
│ プロジェクトデータベース │
│ devices │ modbus_servers │ readings │
└────▲───────────────▲───────────────────▲────┘
│ │ │
┌────┴───────────────┴───────────────────┴────┐
│ エッジコード(デバイス上) │
│ デバイス登録 → 設定読込 → データ収集 │
└──────────────────────────────────────────────┘プロジェクトデータベースが唯一の真実の情報源です。エッジコードがそこに書き込み、ボードがリアルタイムで読み取り、フォームを通じたユーザーアクションが書き戻します。エッジコードはそれらの変更をサブスクライブしてループを完成させることができます — カスタムAPIエンドポイントは不要です。
ヒント
- エンティティテーブルから始めましょう。 時系列収集を追加する前に、デバイス登録とステータステーブルを動作させましょう。
maintainLatestFlagForを使いましょう。 現在の状態をクエリする必要があるテーブルに使用します。履歴を追加しながら、追加コードなしでエンティティごとの最新行を読み出せます — ウィジェットの latest トグル、またはSDKフィルタの{"latest": true}を使います。- エンティティテーブルに
deletedカラムを追加しましょう。 ユーザーがフォームで管理するテーブルでは、履歴を保持しながらソフトデリートが可能になります。 - 確認が必要な書き込みには
appendToTableを使用 します(例:初期デバイス登録)。高頻度テレメトリにはファイア・アンド・フォーゲットが許容されるpublishToTableを使用します。 - 時系列テーブルはシンプルに保ちましょう。 タイムスタンプ、ソースの識別子、測定値のみ。集計にはTransformテーブルを使用します。
次のステップ
ハードウェアがWebベースのHMIや設定インターフェースを公開している場合、EmbedウィジェットとデバイストンネルでIronFlockボードに直接埋め込むことができます。詳細は外部HMIの埋め込みをご覧ください。