このトピックでは、デバイス通信に TSL モデルを使用する際のよくある質問 (FAQ) とその解決策について説明します。
TSL モデル機能の追加
TSL モデルのプロパティ、イベント、サービスは、デバイスが属するプロダクトで追加および設定する必要があります。TSL モデルは、以下の方法で定義できます。
-
CreateThingModel API を呼び出して、指定したプロダクトに TSL モデル機能を追加します。
-
IoT Platform コンソールで TSL モデル機能を追加します。詳細については、「単一の TSL モデルの追加」および「TSL モデルの一括追加」をご参照ください。
一括インポート時の TSL 検証失敗
症状
IoT Platform コンソールでプロダクトの TSL モデルをインポートする際、[TSL モデルのインポート] ダイアログボックスで 2 種類の検証失敗が発生する可能性があります。1 つは、即座に表示されるエラーメッセージ "The file content is not in a valid JSON format" で、もう 1 つは、詳細なエラー情報を取得するための [ダウンロードして表示] リンクが付いた検証例外です。
ソリューション
以下のソリューションは、2 種類の検証失敗に対応しています:
-
TSL モデルファイルを確認し、JSON 形式のエラーを修正してから、ファイルを再アップロードします。
-
[ダウンロードして表示] をクリックして、errors.txt ファイルを取得します。このファイルを使用して問題を特定し、解決します。
errors.txt ファイルの詳細については、以下の例をご参照ください。
TSL モデルファイルのサンプル:
{ "schema":"https://iotx-tsl.oss-ap-southeast-1.aliyuncs.com/schema.json", "profile":{ "productKey":"a1Jk***" }, "services":[], "properties": 1, "events": [], "functionBlockId": "module-test", "functionBlockName": "Custom Module 1" }ダウンロードした errors.txt ファイル:
[ { "path": [ "properties" ], "property": "instance.properties", "message": "is not of a type(s) array", "schema": { "type": "array", "items": { "$ref": "#/definitions/propertyDefinition" } }, "instance": 1, "name": "type", "argument": [ "array" ], "stack": "instance.properties is not of a type(s) array" }, { "path": [ "functionBlockId" ], "property": "instance.functionBlockId", "message": "does not match pattern \"^[_a-zA-Z0-9]{1,30}$\"", "schema": { "type": "string", "pattern": "^[_a-zA-Z0-9]{1,30}$" }, "instance": "module-test", "name": "pattern", "argument": "^[_a-zA-Z0-9]{1,30}$", "stack": "instance.functionBlockId does not match pattern \"^[_a-zA-Z0-9]{1,30}$\"" } ]パラメーター
説明
path
検証エラーの原因となった要素へのパスです。この例では、2 つのエラーが見つかりました:
// properties パラメーターが正しく設定されていません。配列ではありません。 "path": [ "properties" ] // functionBlockId の値にハイフンが含まれていますが、これは無効です。 "path": [ "functionBlockId" ]property
パスで指定された、ルールに違反している特定のオブジェクトです。
たとえば、
"path": ["functionBlockId" ]のプロパティはinstance.functionBlockIdです。message
具体的なエラーメッセージです。
たとえば、
"path": ["functionBlockId" ]の場合、プロパティのエラーメッセージはdoes not match pattern \"^[_a-zA-Z0-9]{1,30}$\"です。schema
検証ルールの名前と内容です。
たとえば、
"path": ["functionBlockId" ]の場合、ルールはtypeとpatternです。ルールの定義に関する詳細については、「JSON Schema」をご参照ください。
instance
検証対象の特定のオブジェクトです。
たとえば、
"path": ["functionBlockId" ]の場合、TSL モデルファイル内の"functionBlockId": "module-test"の内容が検証されます。name
検証に失敗したルールの名前です。
たとえば、
"path": ["functionBlockId" ]の場合、オブジェクトmodule-testはpatternルールに準拠していません。argument
違反したルールの定義です。
たとえば、
"path": ["functionBlockId" ]の場合、満たされなかったpatternルールは^[_a-zA-Z0-9]{1,30}$として定義されています。stack
property フィールドと message フィールドを組み合わせた完全なエラーメッセージです。
詳細については、「jsonschema ドキュメント」をご参照ください。
データ報告方法の違い
機能的な違い
|
機能 |
違い |
|
プロパティの報告 |
デバイスのプロパティデータのスナップショットを報告します。タイムスタンプはオプションです:
|
|
履歴データの報告 |
同じ時点での異なるプロパティの値を報告します。この機能は時間ベースです。タイムスタンプは必須です。 1 回のデータ報告には、複数の時点のデータを含めることができます。 |
|
プロパティの一括報告 |
異なる時点での 1 つ以上のプロパティの値を報告します。この機能はプロパティベースです。タイムスタンプは必須です。 1 回のデータ報告には、複数の時点における複数のプロパティのデータを含めることができます。 |
プロパティデータ、履歴データ、またはプロパティの一括データが IoT Platform に報告されると、プラットフォームはタイムスタンプに基づいて履歴データレコードを生成します。
通信トピックとデータ形式の違い
トピックとデータ形式は、各方法で異なります。詳細については、「デバイスによるプロパティの報告」、「履歴 TSL モデルデータの報告」、および「デバイスによるプロパティの一括報告」をご参照ください。
例
この例では、温度データを報告するデバイスを使用します。
-
プロパティの報告:
-
デバイスは、次の表に示すように、タイムスタンプ付きのスナップショットデータを左から右へ順番に報告します。
13:00
14:00
15:00
15:10
60
70
80
90
-
次に、デバイスは別のスナップショット値 100 を報告します。データは、タイムスタンプが含まれているかどうかに基づいて、異なる方法で更新されます:
-
タイムスタンプなし:時刻はデフォルトで現在の時刻 (例:15:30) に設定されます。この場合、IoT Platform コンソールに表示されるスナップショット値は 15:30 時点の 100 であり、履歴データリストの最新のエントリも 15:30 時点の 100 になります。
-
タイムスタンプあり:タイムスタンプが 15:00 の場合、15:00 のデータは 100 に更新されます。IoT Platform コンソールに表示されるスナップショット値は 15:00 時点の 100 になりますが、履歴データリストの最新のエントリは 15:10 時点の 90 のままです。
-
-
-
履歴データの報告:
-
デバイスは、次の履歴データを同時に報告します。
13:00
14:00
15:00
15:10
60
70
80
90
-
次に、デバイスは次の履歴データを同時に報告します。
13:10
14:10
100
200
この場合、IoT Platform コンソールに表示されるスナップショット値は、どちらの値が最後にデータベースに書き込まれたかに応じて、13:10 時点の 100 または 14:10 時点の 200 のいずれかになります。履歴データリストの最新のエントリは 15:10 時点の 90 のままです。
-
カスタムトピック使用時の TSL データ未更新
デバイスの TSL モデルデータは、TSL モデル通信トピックを使用して報告する必要があります。詳細については、「トピックのカテゴリと通信」をご参照ください。
TSL モデルデータの取得
デバイスの TSL モデルデータは、以下の方法で取得できます。
-
サーバー側サブスクリプション:IoT Platform のサーバー側サブスクリプション機能を使用して、[デバイスアップストリーム通知] メッセージをサブスクライブします。その後、IoT Platform は、サブスクリプション設定に基づいて、プロダクト内のすべてのデバイスからサーバーにこれらのメッセージを転送します。サーバー側サブスクリプションでは、以下の 2 つの方法がサポートされています。
-
AMQP サーバー側サブスクリプション:AMQP SDK を使用して、IoT Platform によって転送されたデバイスメッセージを受信します。
-
Simple Message Queue (旧称:MNS) サーバー側サブスクリプション:Simple Message Queue (formerly MNS) SDK を使用して、IoT Platform が Simple Message Queue (formerly MNS) に転送するデバイスメッセージを受信します。
-
-
データ転送:ルールエンジンのデータ転送機能を使用して、指定したデバイスデータを Simple Message Queue (formerly MNS)、ApsaraDB for RDS、Tablestore、Function Compute、Time Series Database (TSDB)、Lindorm、DataHub、Message Queue for Apache RocketMQ などの他のクラウドサービスに転送するルールを作成します。詳細については、「データ転送 (レガシー)」および「データ転送 (新規)」をご参照ください。
-
クラウド API:
API
説明
指定したデバイスのすべてのプロパティスナップショットを照会します。
指定したデバイスが報告した元のプロパティスナップショットを照会します。これには、TSL モデルの検証に合格したかどうかに関係なく、すべてのプロパティが含まれます。
指定したデバイスが報告した元のプロパティレコードを照会します。これには、TSL モデルの検証に合格したかどうかに関係なく、すべてのプロパティが含まれます。
指定したデバイスが報告した元のイベントレコードを照会します。これには、TSL モデルの検証に合格したかどうかに関係なく、すべてのイベントが含まれます。
指定したデバイスからの元のサービスコールレコードを照会します。これには、TSL モデルの検証に合格したかどうかに関係なく、すべてのサービスが含まれます。
指定したデバイスの期待プロパティ値を照会します。
指定した時間範囲内で、指定したデバイスの単一プロパティのデータを照会します。
指定した時間範囲内で、指定したデバイスの複数プロパティのデータを照会します。
指定したデバイスのイベントレコードを照会します。
指定したデバイスのサービスコールレコードを照会します。
コンソールにおける TSL モデルデータの非表示
デバイスが TSL モデルデータを報告すると、IoT Platform は定義された TSL モデルと設定されたデータ検証方法に基づいてデータを検証します。検証に失敗した、または検証がスキップされたデータは、IoT Platform コンソール のデバイスの [デバイス詳細] ページの [TSL モデルデータ] タブには表示されません。詳細については、「TSL モデルデータの検証」をご参照ください。
データ検証方法は、プロダクトの作成時に設定する必要があります。詳細については、「プロダクトの作成」をご参照ください。
コマンド実行後の TSL データステータス未更新
この問題をトラブルシューティングするには、以下の点を確認します:
-
デバイス側:デバイスが IoT Platform に正しく接続されていることを確認します。デバイスの接続方法については、「デバイス SDK のダウンロード」をご参照ください。
重要IoT Platform からのコマンドの成功は、「set」リクエストがクラウドから送信されたことを確認するだけであり、デバイスでの実行を保証するものではありません。プロパティが正常に設定されたと判断されるには、デバイスが新しい値を適用し、その値をプラットフォームに報告する必要があります。
デバイスエミュレーターまたは MQTT.fx ツールを使用してオンラインデバイスをシミュレートし、オンラインデバッグ機能を使用してデバイスの通信機能をデバッグできます。詳細については、以下をご参照ください。
-
IoT Platform クラウド側:
-
値を [set] したり、[期待値] を設定したりするプロパティに 読み取り/書き込み アクセス権があることを確認します。
-
TSL モデルメッセージが正しく解析されていることを確認します。
TSL モデルメッセージが正しく解析された場合にのみ、データが TSL モデルの実行状態に表示されます。詳細については、「TSL モデル」および「TSL モデルメッセージの解析」をご参照ください。
IoT Platform コンソール にログインします。インスタンスで、[メンテナンス] > [デバイスログ] > [クラウド実行ログ] ページに移動してログを表示し、デバイスがメッセージを正常に受信したかどうかを確認します。詳細については、「クラウド実行ログ」をご参照ください。
-
コンソールにおける温度データの非表示
TSL モデルのプロパティが定義されていない場合や、報告されたデータの形式が正しくない場合、TSL モデルデータは表示されません。
データが正しく表示されるようにするには、次の手順に従います。
-
デバイスが属するプロダクトに対して、Temperature という名前の TSL モデルプロパティを定義します。詳細については、「TSL モデル機能の追加」をご参照ください。
-
デバイスは、正しい TSL モデル通信トピックとデータ形式を使用してプロパティデータを報告する必要があります。デバイス側の開発に関する詳細については、「デバイス接続」をご参照ください。
-
プロダクトの作成時にデータ形式として [ICA 標準データ形式 (Alink JSON)] を選択した場合、デバイスはトピック
/sys/${productKey}/${deviceName}/thing/event/property/postを使用し、次の形式でデータを報告する必要があります。{ "id": "123", "version": "1.0", "sys":{ "ack":0 }, "params": { "temperature": { "value": 35, "time": 1524448722000 } }, "method": "thing.event.property.post" }フィールドの詳細については、「デバイスによるプロパティの報告」をご参照ください。
-
プロダクトの作成時にデータ形式として [パススルー/カスタム] を選択した場合、TSL モデルメッセージを解析するためのスクリプトを設定する必要があります。
デバイスは、トピック
/sys/${productKey}/${deviceName}/thing/model/up_rawを使用して、16 進数形式でデータを送信する必要があります。詳細については、「デバイスによるプロパティの報告」および「TSL モデルメッセージの解析」をご参照ください。
-
TSL モデル機能の迅速なインポート
はい。IoT Platform では、以下の方法で TSL モデル機能の一括追加が可能です:
-
TSL モデルの一括追加:IoT Platform コンソールでは、別のプロダクトから TSL モデル機能の一括コピー、または TSL ファイルのインポートができます。
-
CreateThingModel API:サーバー側 SDK を使用してこのクラウド API を呼び出し、ThingModelJson パラメーターを使用して TSL モデル機能を追加します。ThingModelJson データ形式の詳細については、「ThingModelJson データ形式」をご参照ください。