クラス構成
ここでは、Thing Interaction Framework で扱うオブジェクトのクラス構成を説明します。Thing Interaction Framework 上の概念や、SDK のクラス設計はこのモデルに沿って設計されています。
なお、以下の内容は明記がない限り、概念モデルを表しており、SDK でのクラス間の関連とは異なる場合があります。
Thing 関連のクラス構成
Thing に関連するクラスの構成を以下に示します。実装上、これらの概念は ThingIFAPI クラスの背後に隠れます。

- 制御対象の
ThingはTargetのサブクラスとして表現されます。現状、コマンドの送信先は Thing のみですが、将来はモバイルアプリやその他のデバイスにも拡張できるようにTargetの概念を導入しています。 - Thing のオーナーは、
Ownerとして表現され、そのサブクラスにUserを定義します。将来、管理者アカウントにも拡張できるようにOwnerを導入しています。 Targetは複数のSchemaを持つことができます。SDK の実装では、ThingIFAPIクラスのインスタンスを複数個生成し、ThingIFAPIごとにスキーマを定義する仕組みを用意しています。Targetは、トリガー、コマンド、ステートを扱うことができます。多重度は図示したとおりです。
コマンド関連のクラス構成
コマンドに関連するクラスの構成を以下に示します。

Commandは、アクションとコマンドの実行 に機能を示すように、内部に複数のActionとActionResultを持っています。- コマンドの送信先として、1 つの
Targetを識別します。前述のように、TargetはThingを抽象化したものです。SDK の実装上はクラス参照ではなく、ID としてTargetを持っています。
トリガー関連のクラス構成
トリガーに関連するクラスの構成を以下に示します。

Triggerは、トリガーによる自動実行 に示すトリガー実行で使用するクラスです。- コマンドの自動実行を行う場合は内部に
PredicateとCommandを持ちます。 - Server Code の自動実行を行う場合は
PredicateとServerCodeを持ちます。
CommandとServerCodeの両方の多重度が同時に 0 または 1 になることはありません。どちらか一方のみを使用します。- コマンドの自動実行を行う場合は内部に
Predicateは述語論理の「述語」に相当し、トリガーの実行条件の真偽を返す関数を表します。ステートとの条件比較で判断するStatePredicate、単発の時間条件に基づくScheduleOncePredicate、繰り返しの時間条件に基づくSchedulePredicateを想定しています。コマンドの自動実行を行う場合、
TriggerはCommandを持っていますが、これはコマンド実行の雛形に相当するものです。実行に使用されるコマンドは、このコマンドを雛形として新規に作成されます。
なお、Trigger 以下のクラスは、SDK の実装において以下のようなクラス構成を取っています。クラス名は Android のものです。iOS も基本的に同じですが、名前の表現が異なります。

Predicate、Command、ServerCodeの関係は概念モデルと同様です。PredicateとCommand、または、PredicateとServerCodeの組み合わせで使用します。Predicateは、サブクラスとしてStatePredicate、ScheduleOncePredicate、およびSchedulePredicateを持っています。- ステートとの条件比較を行う
StatePredicateは、内部にConditionとTriggersWhenを持っています。これは ステート条件 に示すように、ステートとの比較条件、および、それが満たされたときに実行するか、満たされなかったときに実行するかなどの実行条件です。TriggersWhenは実装上は enum のため、実際にはクラスの属性のように扱います。 - 単発の時間を指定する
ScheduleOncePredicateは、内部に属性scheduleAtを持っています。これは 時間条件(単発) に示すように、トリガーを一度だけ実行する時間条件です。 - 繰り返しの時間を指定する
SchedulePredicateは、内部に属性scheduleを持っています。これは 時間条件(繰り返し) に示すように、トリガーを繰り返し実行する時間条件です。 Conditionは式のツリー構造のルートとなるClauseを持っており、式の項をEquals、NotEqualsなどのClauseサブクラスで定義できます。AndとOrは、条件にする項を再帰によって表現できます。
実装方法については、アプリ開発ガイド(Android、iOS、JavaScript)をご覧ください。