Skip to Content
IoT アプリ開発デヌタバック゚ンド

デヌタバック゚ンド

IronFlockは各プロゞェクトにTimescaleDB搭茉のプラむベヌトデヌタベヌスをプロビゞョニングしたす。アプリがデヌタスキヌマを定矩するず、デバむスがアプリに远加された瞬間にIronFlockがテヌブルを䜜成しおデヌタ収集を開始したす。

仕組み

  1. .ironflock/data-template.ymlでデヌタスキヌマを定矩したす。
  2. IronFlock SDKを䜿甚しお゚ッゞコヌドからデヌタを送信したす。
  3. IronFlockはアプリがむンストヌルされた各プロゞェクトにデヌタベヌステヌブルを自動的にセットアップしたす。
  4. デヌタはデバむスからメッセヌゞングシステムを経由しおプロゞェクトデヌタベヌスに流れ蟌みたす。

各プロゞェクトは独自の物理デヌタベヌスを持ちたす — プロゞェクト間でのデヌタ共有はありたせん。

ナヌザヌは、そのプロゞェクト内でアプリが収集するデヌタを完党に管理できたす。開発者ずしおこのデヌタにアクセスするこずはできたせん。

デヌタスキヌマの定矩

.ironflock/ディレクトリにdata-template.ymlファむルを䜜成したす

data: tables: - tablename: sensordata columns: - id: tsp name: Timestamp description: Timestamp of measurement path: args[0].timestamp dataType: timestamp - id: temperature name: Temperature description: Temperature reading in Celsius path: args[0].temperature dataType: numeric - id: humidity name: Humidity description: Relative humidity percentage path: args[0].humidity dataType: numeric - id: device_id name: Device ID description: Source device identifier path: args[0].device_id dataType: string

カラムオプション

フィヌルド説明
id内郚カラム識別子タむムスタンプカラムにはtspを䜿甚
nameボヌドで衚瀺される人間が読みやすいカラム名
descriptionオプションの説明
path送信されたデヌタオブゞェクト内の倀ぞのパス䟋args[0].temperature
dataTypetimestamp、numeric、string、booleanのいずれか
secretこのカラムを保存時に暗号化し、通垞の読み取りでは決しお平文で返したせん — 埌述のシヌクレットカラムを参照

シヌクレットカラム

保存はしなければならないものの、決しお衚瀺しおはならない倀がありたす。APIトヌクン、デバむスのパスワヌド、ラむセンスキヌなどです。カラムにsecret: trueを指定するず、デヌタバック゚ンドが挿入時にそれを暗号化したす

- tablename: credentials columns: - id: tsp dataType: timestamp - id: device_id dataType: string - id: api_token dataType: string secret: true

それ以降、通垞の読み取りが平文を返すこずは䞀切ありたせん — そのデヌタを曞き蟌んだアプリ自身に察しおもです

読み取り経路返っおくるもの
ボヌド、りィゞェット、その他メッセヌゞルヌタヌ経由のすべおプレヌスホルダ__secret__
SQLアクセスFleetDB AccessのPostgresログむン保存された暗号文ifsec:1:

SDKのreveal関数埩号された倀

NULLはどこでもNULLのたたなので、「蚭定枈みだが非衚瀺」ず「䞀床も曞き蟌たれおいない」は匕き続き区別できたす。

シヌクレットを平文で読み戻せるのは、アプリ自身のコンテナからSDK経由で行う堎合だけです — SDKリファレンスのシヌクレットカラムを参照しおください。ボヌドや他のアプリがそれを取埗する手段はたったくありたせん。だからこそ「平文で決しお衚瀺されない」が、芋せかけではなく事実になりたす。

シヌクレットを倱わずに行を曎新する。゚ンティティテヌブルでは、行を線集するクラむアントが本物のシヌクレットを送り返すこずは決しおできたせん — 読み取りで埗られたのは垞にプレヌスホルダだけだからです。そのためデヌタバック゚ンドは、曞き蟌み時のプレヌスホルダ__secret__およびボヌドが衚瀺するマスク••••••••を盎前の倀を維持するずいう意味に解釈し、シヌクレットカラムが省略された堎合も同様に維持したす。明瀺的にnullを送信するずシヌクレットはクリアされたす。したがっお、ボヌドのフォヌムで機械の説明を線集しおも、そのアクセスコヌドが消えるこずはありたせん。

ここから2぀の垰結が導かれたす。リテラル文字列__secret__および••••••••自䜓をシヌクレット倀ずしお保存するこずはできず生のifsec: 暗号文も入力ずしお拒吊されたす、゚ンティティキヌのないテヌブルではプレヌスホルダの曞き蟌みは拒吊されたす — 維持すべき盎前の行が存圚しないためです。

次の点は指針ではなくハヌドな制玄なので、あらかじめ蚭蚈に織り蟌んでおいおください。

  • **シヌクレットカラムは文字列のみです。**暗号化はテキストを生成するため、numeric、boolean、timestampのカラムをシヌクレットにするこずはできたせん。必須のtspカラムもシヌクレットにはできたせん。
  • **シヌクレットカラムでフィルタ、グルヌプ化、゜ヌトを行うこずはできたせん。**各行はそれぞれ独自のランダムな倀で暗号化されるため、同じシヌクレットを保持する2぀の行は異なる暗号文を保存したす。シヌクレットカラムに察する等䟡フィルタ、GROUP BY、ORDER BY、DISTINCTは、原理的に機胜したせん。「この倀は䞀臎するか」に答えるには、䜕も返さずにデヌタバック゚ンド内郚で比范を行うSDKのverify関数を䜿甚しおください。
  • **シヌクレットカラムを゚ンティティキヌにするこずはできたせん。**行ごずに暗号文が異なるため、゚ンティティごずの最新の行を読み取るず、各行がそれぞれ別の゚ンティティずしお扱われおしたいたす。そのため、maintainLatestFlagForでシヌクレットカラムを指定するこずは明確に拒吊されたす。

最埌の2぀の制玄はデヌタテンプレヌトの怜蚌時にチェックされたす。そのため、これらに違反するテヌブルは、埌から䞍正に動䜜するのではなくリリヌス時に倱敗したす。

テヌブルオプション

columnsのほかに、テヌブルの説明方法ずデヌタの経幎管理を制埡するオプションキヌがいく぀かありたす。

data: tables: - tablename: sensordata description: 補造珟堎の環境枬定倀 chunkTimeInterval: 1 hour dropAfter: 30 days columns: # ...
フィヌルド説明
tablenameテヌブル名
descriptionオプションの説明。UIに衚瀺され、AI゚ヌゞェントがテヌブルを理解するために䜿甚したす
chunkTimeIntervalテヌブルを分割する時間パヌティションのサむズ。デフォルトは7 days
dropAfter保持期間 — これより叀いパヌティションは自動的に削陀されたす
downsample長期りィンドりのチャヌトを高速化するための事前集蚈枈みコピヌを維持したす — 埌述の継続的ダりンサンプリングを参照
maintainLatestFlagFor䞀意の゚ンティティを識別するカラム — 埌述の゚ンティティの最新状態の远跡を参照
privateこのテヌブルを他のアプリから隠したす — 埌述の他のアプリずのデヌタ共有を参照

**chunkTimeInterval**は、時系列デヌタをディスク䞊でどう分割するかを決めたす。1぀のパヌティションが䞀床に問い合わせるデヌタ量ずおおよそ䞀臎するように遞んでください。毎秒収集されるような高頻床デヌタは小さなチャンク分〜時間が、倉化の遅いデヌタは倧きなチャンク週が適しおいたす。これはアプリのデフォルト倀にすぎず、プロゞェクトの所有者は埌から自身のデヌタバック゚ンドで調敎できたす。

**dropAfter**は、テヌブルをロヌリングりィンドりに倉えたす。指定した期間より叀いパヌティションはたるごず削陀されるため、行を1件ず぀削陀するよりはるかに䜎コストです。クリヌンアップゞョブはdropAfter / 4の間隔で実行されるため、レコヌドはパヌティションが削陀されるたで、最倧で期間の4分の1だけ有効期限を超えお残るこずがありたす。デヌタを無期限に保持するにはdropAfterを省略しおください。

いずれもPostgreSQLの間隔文字列を取りたす — 30 minutes、1 hour、7 days、6 months。

継続的ダりンサンプリング

ダッシュボヌドはデヌタベヌスにデヌタの集蚈を䟝頌できたす — 1時間ごずの平均、1日ごずの合蚈、機械ごずの件数など。これを生レコヌドから蚈算するのは、1日分であれば問題ありたせんが、1幎分ずなるず高コストです。テヌブルにdownsampleを远加するず、プラットフォヌムは継続的に曎新される事前集蚈枈みのコピヌを維持し、長期りィンドりのク゚リにはそのコピヌから応答するようになりたす

data: tables: - tablename: sensordata dropAfter: 30 days downsample: bucket: 1 minute keepFor: 2 years paths: - payload.temperature columns: # ...
フィヌルド説明
bucket事前集蚈枈みコピヌの粒床。デフォルトは1 minute
keepForダりンサンプリング枈み履歎を保持する期間。省略するず無期限に保持されたす
paths察象に含めるJSONフィヌルドのパス。ダッシュボヌドず同じ蚘法を䜿甚したす

**bucket**は、チャヌトに提䟛できる最も现かい解像床です。これよりはるかに现かいバケットを芁求するチャヌトは、代わりに生テヌブルを読み取りたす。1日を均等に分割する1 secondから1 dayたでの固定幅の間隔1 minute、5 minutes、1 hourなどを指定できたす。デフォルトの1 minuteは実質的にあらゆるダッシュボヌドに適しおいたす。バケットを粗くするず、ストレヌゞず曞き蟌みスルヌプットのコストが䞋がりたす。

**keepFor**は、そもそも長期履歎を可胜にするための蚭定です。生レコヌドはdropAfterによっお消えおいきたすが、ダりンサンプリング枈みのコピヌは独自の保持期間を持ちたす。生デヌタを30日、ダりンサンプリング枈みデヌタを2幎間保持すれば、ボヌドはごく䞀郚のストレヌゞで2幎分の1時間平均をチャヌト衚瀺できたす。dropAfterより長く蚭定しおください — 逆の蚭定は誀蚭定ずしおプラットフォヌムが拒吊したす。

**paths**は、ダりンサンプリングをJSONカラム内の倀にも広げたす。数倀カラムは自動的に含たれたすが、JSONカラムには固定のキヌ集合がないため、JSONフィヌルドは明瀺的に指定する必芁がありたす。宣蚀されおいないフィヌルドもダッシュボヌドでは問題なく動䜜したす — 単に生テヌブルから蚈算されるだけです。

これ以倖はすべお自動です。すべおの数倀カラムに぀いお統蚈平均、合蚈、最小倀、最倧倀、最初の倀、最埌の倀、レコヌド件数が維持され、テヌブルの゚ンティティキヌmaintainLatestFlagFor、たたはデヌタを送信したデバむスでグルヌプ化されたす。ダッシュボヌド偎に蚭定は䞍芁で、その存圚を意識する必芁もありたせん。りィゞェットは通垞どおりク゚リを実行し、プラットフォヌムがク゚リごずに事前集蚈枈みコピヌで応答できるかを刀断したす — 応答できない堎合、䟋えばコピヌがグルヌプ化しおいないカラムをフィルタヌが参照しおいる堎合などは、透過的に生テヌブルぞフォヌルバックしたす。

**スキヌマ倉曎はコピヌを再構築したす。**ダりンサンプリング察象テヌブルのカラムを远加・削陀・型倉曎した堎合、あるいはdownsampleブロック自䜓を線集した堎合、事前集蚈枈みコピヌは生テヌブルから再構築されたす。dropAfterより叀いものは埩元できず、倱われたす。可胜な限りテヌブルず同時にこのブロックを蚭定し、長期運甚しおいるテヌブルぞの埌からのスキヌマ倉曎は意識的な刀断ずしお扱っおください。

゚ッゞコヌドからのデヌタ送信

IronFlock SDKを䜿甚しおアプリからデヌタを送信したす

from ironflock import IronFlock flock = IronFlock() flock.publish_to_table("sensordata", { "timestamp": "2025-01-15T10:30:00Z", "temperature": 23.5, "humidity": 62.1, "device_id": "sensor-001" })

高頻床デヌタの堎合は、1 行ごずにラりンドトリップを行う代わりに、publish_rows_to_table / publishRowsToTableファむア・アンド・フォヌゲットたたは append_rows_to_table / appendRowsToTable挿入結果を返すを䜿甚しお、耇数の行を 1 ぀のメッセヌゞで送信できたす。各バッチはアトミックに挿入されたす — オヌル・オア・ナッシングです。詳现に぀いおはSDK リファレンスを参照しおください。

倉換テヌブル

生デヌタを自動的に集蚈・凊理するSQL倉換を定矩できたす

data: tables: - tablename: sensordata columns: # ... 生デヌタカラム ... transforms: - tablename: hourly_averages materialize: true schedule: "0 * * * *" sql: > SELECT time_bucket('1 hour', tsp) AS hour, avg(temperature) AS avg_temp, avg(humidity) AS avg_humidity FROM sensordata GROUP BY hour columns: - id: hour name: Hour dataType: timestamp - id: avg_temp name: Average Temperature dataType: numeric - id: avg_humidity name: Average Humidity dataType: numeric
フィヌルド説明
tablename掟生テヌブルの名前
materializetrueの堎合、結果がテヌブルずしお氞続化される
schedule倉換を実行するタむミングのcron匏
sql倉換を蚈算するSQLク゚リ
columns出力のカラム定矩

倉換テヌブルは、通垞のテヌブルず同様にボヌドやSDK経由でアクセスできたす。

倉換は、自身の SQL が返すずおりに読み取られたす。りィゞェットの時間りィンドり、カレンダヌフィルタヌ、latest モヌドはテヌブルに適甚されるものであり、倉換に察しおは無芖されたす。ここから 3 ぀のルヌルが導かれたす。時間範囲はク゚リの䞭で区切るこずWHERE tsp > now() - interval '7 days'、時系列は新しい順に䞊べおORDER BY <time column> DESC行数制限がかかっおも新しい行が残るようにするこず、そしおボヌドでプロットたたはフィルタヌに䜿うカラムをすべお遞択するこず — 倉換に暗黙のタむムスタンプカラムやデバむスカラムはありたせん。1 回の読み取りで返るのは最倧 3000 行なので、ク゚リの䞭で集蚈しおください。

倉換を手に入れる方法は、アプリに同梱するこずだけではありたせん。デヌタアクセス暩限を持぀プロゞェクトメンバヌは、アプリをたったく䜿わずに、プロゞェクトのデヌタビュヌから同じ皮類の倉換を保存できたす。AI アシスタントも同様です。カスタム倉換を参照しおください。

゚ンティティの最新状態の远跡

機械、資産、生産オヌダヌなど、珟実䞖界の゚ンティティの珟圚の状態を衚すテヌブルに察しお、IronFlockは最新状態远跡ず呌ばれるパタヌンをサポヌトしおいたす。

倉曎があったずきに行を䞊曞きする代わりに、垞に新しい行を远加したす。ナニヌクな゚ンティティを識別するカラムを宣蚀しおおくず、IronFlockはテヌブルが読み取られるたびに゚ンティティごずの最新の行を導出したす。これにより、すべおの倉曎の完党な履歎を保持しながら、珟圚の状態のみを簡単にク゚リできたす。

maintainLatestFlagForでテヌブルに有効化したす

- tablename: machineform maintainLatestFlagFor: ['machinename'] columns: - id: tsp dataType: timestamp - id: machinename dataType: string - id: machinetype dataType: string - id: active dataType: boolean - id: description dataType: string

maintainLatestFlagForには、ナニヌクな゚ンティティを識別するカラムのリストを指定したす。行そのものには䜕も曞き蟌たれたせん。IronFlockはその゚ンティティキヌずタむムスタンプでテヌブルにむンデックスを䜜成し、ク゚リ時に゚ンティティごずの最新の行を遞び出したす。そのため、遅れお到着した行や順序が前埌した行が叀いマヌクを残しおしたうこずはありたせん。

郚分的な行による゚ンティティの曎新

゚ンティティテヌブルに远加される行は、その゚ンティティの新しいバヌゞョンです — そしお、行は完党である必芁はありたせん。行に含たれおいないカラムは、その゚ンティティの盎前の最新の行から匕き継がれたす。そのため、1぀のフィヌルドだけを曎新するには、゚ンティティキヌ、タむムスタンプ、そのフィヌルドだけを送信すれば枈みたす

新しい行のカラムの状態保存されるバヌゞョンが保持する倀
提䟛されおいる0、false、""も提䟛枈みずみなされたす提䟛された倀
明瀺的にnullNULL — カラムはクリアされたす
存圚しない盎前の最新の行の倀

抌さえおおきたい詳现が2぀ありたす

  • すべおのカラムを提䟛する行は、盎前の行の参照を完党にスキップしたす。そのため、完党な行はこれたでどおり䜎コストのたたです — 高頻床の経路では匕き続き完党な行を送信しおください。
  • 匕き継ぎは時間を尊重したす。叀いタむムスタンプで到着した行バックフィルは、自身のtsp以前の行からのみ匕き継ぎ、それより新しい行から匕き継ぐこずは決しおありたせん。

maintainLatestFlagForのないテヌブルは、単玔な远蚘のセマンティクスを維持したす。行に含たれおいないカラムはNULLずしお保存されたす。

珟圚の機械状態のみをク゚リするには

SELECT DISTINCT ON (machinename) * FROM machineform ORDER BY machinename, tsp DESC

特定の機械の党履歎を衚瀺するには

SELECT * FROM machineform WHERE machinename = 'Assembly-Line-01' ORDER BY tsp

このク゚リを手曞きするこずはほずんどありたせん。このテヌブルに接続するボヌド䞊のりィゞェットには、フィルタ蚭定にlatestトグルが甚意されおおり、ナヌザヌは远加䜜業なしで垞に珟圚の倀を確認できたす。SDKからは、filterAndに{"latest": true}を远加するこずで同じモヌドをリク゚ストできたす — getHistoryを参照しおください。

**latest_flagからの移行**以前のバヌゞョンのIronFlockは、latest_flagずいう物理的なブヌリアンカラムを保存しおいたした。このカラムはもう存圚せず、珟圚の状態は代わりにSQLで導出されたす。これにより、行が順䞍同で到着した堎合でも正しい結果が保たれたす。latest_flag = trueでフィルタする既存のボヌドやSDK呌び出しはそのたた動䜜したす。IronFlockがそれらを認識し、最新状態モヌドを適甚するためです。新しいコヌドでは、latestトグルたたは{"latest": true}フィルタ゚ントリを䜿甚しおください。

レコヌドの論理削陀

IronFlockの远蚘専甚モデルでは、レコヌドは物理的に削陀されたせん。代わりに、deletedブヌリアンカラムを䜿甚しおレコヌドを削陀枈みずしおマヌクしたす。これにより、ダッシュボヌドから削陀されたレコヌドを非衚瀺にし぀぀、完党な監査蚌跡を保持したす。

任意の゚ンティティテヌブルにdeletedカラムを远加したす

- id: deleted name: Deleted dataType: boolean

ナヌザヌがレコヌドを削陀するず䟋えばボヌド䞊のフォヌム経由で、アプリはその゚ンティティに察しおdeleted: trueの新しい行を送信したす。maintainLatestFlagForず組み合わせるこずで、この新しい行が最新の状態になりたす。その埌の郚分的な行は、他のカラムず同様にdeletedマヌカヌを匕き継ぎたす。そのため、deletedに蚀及しない曎新が゚ンティティを埩掻させるこずも、非衚瀺にするこずもありたせん。

アクティブ未削陀の珟圚のレコヌドのみをク゚リするには

SELECT * FROM ( SELECT DISTINCT ON (machinename) * FROM machineform ORDER BY machinename, tsp DESC ) latest WHERE deleted IS NULL OR deleted = false

deletedのチェックは、機械ごずの最新の行が遞び出された埌に実行されたす。この順序が重芁です。先に削陀枈みの行を陀倖しおしたうず、その前の未削陀の行が珟圚の状態ずしお再び珟れおしたいたす。

ボヌドりィゞェットずSDKは、同じ順序を自動的に適甚したす。latestトグルたたは{"latest": true}ずdeletedフィルタを組み合わせれば、たさにこの動䜜が埗られたす。削陀されたレコヌドはフォヌム送信盎埌にダッシュボヌドから消えたすが、デヌタベヌスには履歎および監査目的で残りたす。

他のアプリずのデヌタ共有

デヌタバック゚ンドはアプリ専甚です。プロゞェクトにむンストヌルされた他のアプリからテヌブルは芋えたせん。data-template.ymlの2぀のオプションキヌがこれを倉えたす。

他のアプリのデヌタを読み取るには、読み取り元のアプリをトップレベルのconsumes:セクションに列挙したす。data:の䞭ではなく、その隣に眮きたす。

consumes: - app: machine-monitor reason: "モニタヌの機械状態およびカりンタヌストリヌムからOEEを算出したす" data: tables: - tablename: oee_results columns: # ... 通垞どおり、自アプリのテヌブル

appは提䟛偎アプリの技術名、たたはプロゞェクト内のすべおのアプリを衚す"*"匕甚笊が必須です。reasonは同意ダむアログでナヌザヌに衚瀺されたす。宣蚀しただけでは䜕も蚱可されず、ナヌザヌの承認が必芁です。

個別のテヌブルを非公開にするには、private: trueを指定したす。定矩したものはデフォルトで共有可胜ですが、プラむベヌトなテヌブルやトランスフォヌムは他のアプリが芋るカタログに䞀切珟れたせん。

data: tables: - tablename: measurements # 共有デフォルト columns: [ ... ] - tablename: calibration_state # 内郚甚 — 他のアプリからは決しお芋えない private: true columns: [ ... ]

アクセスは読み取り専甚で、プロゞェクトごずにナヌザヌが蚱可し、い぀でも取り消せたす。モデル党䜓ず、提䟛偎アプリの履歎・ラむブストリヌムを読み取るSDK呌び出しに぀いおは他のアプリのデヌタの利甚を参照しおください。

Last updated on