# オブジェクトモデル（TSL）説明

Thing Specification Language（TSL）とは、エンド側とサーバー間の設定のために提供される記述ファイルであり、エンド側でサポートされている設定項目と設定項目に応じた制約を記述するために使用されます。

## 概要

SenseLinkプラットフォームはTSLを定義するためにデバイスをサポートします。デバイスの実際の設定（プロパティ、ステータス）から成るデータモデルによって、クラウドを介したデバイス管理が円滑化されます。

| 関数型   | 説明                                                                                                                               |
| ----- | -------------------------------------------------------------------------------------------------------------------------------- |
| プロパティ | <p>パラメーターの命名、パラメーターの型、制御型、</p><p>製品の各機能のチェックルールなどを含みます。</p><p>デバイスやSenselinkプラットフォームにトリガーされることにより変更します。</p>                      |
| ステータス | <p>デバイスの周辺機器の状態です。</p><p>プラットフォームは書き込みを行わずに読み込みだけを行い、</p><p>ドアマグネットの状態、サーマルイメージングシステムの接続状態、Bluetoothロックバッテリーなど、最新の状態のみを保持します</p> |

## TSL

TSLとは、**デバイスが最初にSenseLinkにアクセスする際に**デバイスからレポートされるJSON形式のファイルであり、バックエンドに保存されます。Webでデバイスの詳細を表示すると、デバイスに対応するTSLとTSLの値がWebで動的に読み込まれます。これにより、バックエンドのサービスを更新することなく、クラウド上のリモート設定機能とデバイスのローカル機能の一貫性を確保することができます。

### TSLの使用フロー

1. アプリにTSLを追加し、[TSLのデータ構造](#tslnodta) に従って作成します。&#x20;
2. 必要な言語パッケージを作成します。形式については、[TSLの国際化](#tslno) を参照してください。&#x20;
3. 開発が完了したら、デバイス上でプロパティやイベントをレポートし、プロパティを設定してクラウド上のサービスを呼び出してインターフェースの呼び出しステップ[更新プロセス](#purosesu)を表示することができます。
4. デバイスからレポートされた属性、イベント、および完了済サービスの呼び出しデータは、データ照合の通過後、SenseLinkコンソール内の対応するデバイスの**デバイス詳細**ページの**デバイス設定**タブに表示されます。

### TSLの構造

TSLはトップレベルに「engineVersion」「modelVersion」「deviceType」を持つjsonファイルです。「properties」と関連する「status」をも含みます。

```javascript
{
  "engineVersion": "0.0.1",//エンジンのバージョン
  "modelVersion": "0.0.1", //モデルのバージョン
  "deviceType": "sps", // デバイスのタイプ
  "properties": [/*... */], // 機能の設定項目
  "status": [/*...*/]// デバイスの周辺機器の状態
}
```

### プロパティ

プロパティは、それぞれが複数の設定項目を持ついくつかのモジュールで構成されています。`fields`要素とも呼ばれる各設定項目はそれぞれの設定項目を説明し、機能を定義します。

```javascript
{
  "properties": [{
    "name": "group-name",
    "fields": [{ // 設定項目集
      "key": { // 設定項目の名前の記述
        "name": "product_customer", // 名前
        "desc": "vendor-customer" // 名前を記述するために使用され、実用的な目的はありません
      },
      "value": {} // 設定項目の任意の値の記述
      ]
   }]
}
```

フィールドはキーと値で構成されています。キーは設定項目の名前を示し、値は設定項目の任意の値、スタイル、ステータスを含む定義です。一部のフィールドの説明は以下の通りです。その他の設定については、\[TSL data structure]\(#TSLdata structure)をご参照ください。

**type**：必須、設定項目の値の型（int、float、string、boolean、その他）を示しています

**ranges**：任意、typeがintやfloatなどの場合に、`min`：最小値、`max`：最大値、`default`：デフォルト値を含む値の区間を示します。

**ui**：任意、デフォルトはtext、Web／デバイスの入力制御スタイルを示すために使用されます。

`ui`に設定可能な値の一覧：

| uiに設定可能な値 | 説明           |
| --------- | ------------ |
| number    | ナンバーピッカー     |
| select    | ドロップダウンボックス  |
| checkbox  | 複数選択ボックス     |
| radio     | ラジオボタン       |
| date      | タイムピッカー      |
| text      | 1行のテキスト入力    |
| textarea  | 複数行のテキスト入力   |
| image     | 画像のアップロードと表示 |

**options**：任意で、Valueが枯渇し得る場合（wiegand32、wiegand34、およびwiegand2602など）、一般的に`ui`の`select`で使用されます。

### ステータス

デバイスの周辺機器の状態を意味します。プラットフォームは書き込みは行わずに読み込みのみを行い、最新の状態のみを保持します。JSONファイルには、名前に対応する `name`、`enable`、および `options`、表示の有無、および任意の値が含まれます。詳細については、[TSLのデータ構造](#tslnodta)をご参照ください。

## TSLの国際化

デバイス／Web上のシステム内の全てのTSLのデバイスタイプ、属性、およびステータスの表示名を定義し、言語ごとに別々に保存します。TSLの国際化は、TSLの値と名前をクラウドコンソール向けに分かりやすく説明し、操作の難易度を下げることを目的としています。各言語パッケージはJSON形式のファイルで構成され、対応するキーはTSLの対応する部分の翻訳です。

| フィールド       | 説明                                                                                    |
| ----------- | ------------------------------------------------------------------------------------- |
| deviceTypes | デバイスタイプのセット。例：`"deviceType":"spse"`                                                   |
| groups      | <p>TSLのカテゴリー化名、プロパティ内の名前の翻訳。<br>例：<code>properties[{"name":"general",...}]</code></p> |
| fields      | 設定項目名、プロパティ内のフィールドの全ての「name」フィールド                                                     |
| values      | 設定に対応する値、ステータス内の値を含むTSL内の全ての値                                                         |
| status      | デバイスの周辺機器の状態の表示名、ステータス内の「name」フィールド                                                   |
| common      | <p>共通の翻訳。<br>例：<code>"modelVersion":"Device model version"</code></p>                 |

データ構造の詳細については、[言語パッケージのデータ構造](#pakkjinodta)をご参照ください

## 付録

### 更新プロセス

![](https://3031054647-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXBAZFEwxEmGi4d-g03%2F-MZLxl8NenAzxh3FELB6%2F-MZLyW8My19tQjqfQBEz%2Fimage.png?alt=media\&token=ee3abe2b-52a4-4636-8180-15ffec1a7cc0)

### 言語パッケージのデータ構造

言語パッケージのデータ構造例は、以下の通りです。

```javascript
{
  "versionInfo": {
    "version": "0.0.1",
    "log": "",
    "updated": "2020-04-21 12:00:00"
  },
  "common": {
    "modelVersion": "Device model version"
  },
  "deviceTypes": {
    "sps": "SensePass"
  },
  "groups": {
    "general": "General Settings"
  },
  "fields": {
    "identify_mode": "identify_mode"
  },
  "values": {
    "enable": "Enable",
    "disable": "Disable"
  },
  "status": {
    "door_status": "Magnetism Status"
  }
}
```

### TSLのデータ構造

TSL の JSON フィールドの構造例は、以下の通りです：

```javascript
{
  "engineVersion": "0.0.1",//エンジンのバージョン
  "modelVersion": "0.0.1", //モデルのバージョン
  "deviceType": "sps",
  "properties": [{
    "name": "features",
    "fields": [{
      "key": {
        "name": "identify_mode",
        "desc": "Enabled State"
      },
      "value": {
        "required": true, // 必須であるか否か。設定されていない場合、デフォルトは任意です。
        "type": "int", //データのタイプ、numeric、boolean、または string を設定する必要があります。
        "editable": true, // 編集可能であるか否か。設定されていない場合、デフォルトは編集不可です。
        /*
        ** UI のコンポーネントは次のタイプから設定する必要があります
        *** ナンバーピッカー：number
        *** ドロップダウンボックス：select
        *** 複数選択ボックス：checkbox
        *** ラジオボタン：radio
        *** タイムピッカー：date
        *** 1行のテキスト入力：text
        *** 複数行のテキスト入力：textarea
        *** 画像のアップロードと表示：image
        *** デフォルトは text です。
        */
        "ui": "select",
        "ranges": [{
          "min": 1,
          "max": 2,
          "enable": "{open_way}==2", //js expression string または boolean 値です。設定されていない場合はデフォルトで有効です。中括弧内のフィールドは差し替えられる値を示しています（open_wayの値が2の場合、式は"2==2"と解析されます）。
          "default": 1.5
        },{
          "min": 3,
          "max": 4,
          "enable": "{open_way}==3",//js expression stringまたはBoolean値です。設定されていない場合はデフォルトで有効です。
          "default": 3.5
        }],
        "step": 0.5,//値のみに対するステップのサイズです。
        "precision": 1,//精密さ。小数位の正確な数、非負整数を示し、数値に対してのみ有効であり、任意です。
        "mult": true, //複数選択か否か、任意。設定されていない場合、引渡されるパラメーターはデフォルトで単一値です。複数値はドロップダウンと複数選択ボックスに対してのみ有効です。
        "enable": "{open_way}==1", // js expression stringまたはboolean値であり、任意です。リンケージ制御によるフィールドの表示・非表示を示します。enableプロパティが設定されていない場合はデフォルトで有効です。
        "size": 20, // 文字列の長さ、任意です。stringとimage base64に対してのみ有効です。
        "timeFormat": "yyyy-MM-dd HH:mm:ss", //uiがdateの場合、日付形式を設定する必要があります。hhは12時間を意味し、HHは24時間を意味します。
        "options": [{
          "value": 0,
          "name": "off",
          "enable": "{open_way}==2", // js expression stringまたはboolean値です。trueを返し、これは選択された値が候補項目で使用可能であることを意味します。enableプロパティが設定されていない場合はデフォルトで有効です。
        }, {
          "value": 1,
          "name": "on", // js expression stringまたはboolean値です。trueを返し、これは選択された値が候補項目で使用可能であることを意味します。enableプロパティが設定されていない場合はデフォルトで有効です。
          "enable": "{open_way}==3"
        }],
        //watch: ステータスのlisten状態であることを意味します。
        /*
        ** 以下の例は、現在のフィールドの値がuse_modeに関連していることを意味します。
        ** use_modeが変更されると、現在のフィールドの値は式が実行された後の値になります "{use_mode}==2?1.5:{use_mode}==1?2:{recognition_distance}"
        */
        "watch":{
          "use_mode": "{use_mode}==2?1.5:{use_mode}==1?2:{recognition_distance}"
        }
      },
    }]
  }],
  "status": [{
    "name": "wifi",
    "enable": true, // js expression stringまたはboolean値です。このフィールドの表示条件を制御します。enableプロパティが設定されていない場合はデフォルトで有効です。
    "options": [{
      "value": 0,
      "name": "off",
      "enable": "{open_way}==2", // js expression stringまたはboolean値です。trueを返し、これは選択された値が候補項目で使用可能であることを意味します。enableプロパティが設定されていない場合はデフォルトで有効です。
    },{
      "value": 1,
      "name": "on",
      "enable": "{open_way}==1", // js expression stringまたはboolean値です。trueを返し、これは選択された値が候補項目で使用可能であることを意味します。enableプロパティが設定されていない場合はデフォルトで有効です。
    }],
  }]
}
```
