# คู่มือนักพัฒนา & API

## 1. เริ่มใช้งาน

### 1.1 การเตรียมตัว

ขั้นตอนที่ 1 โปรดตรวจสอบว่าเกตเวย์เปิดใช้งานและทำงานอย่างถูกต้อง

ขั้นตอนที่ 2 ตรวจสอบให้แน่ใจว่าเกตเวย์และคอมพิวเตอร์เชื่อมต่อกับ LAN เดียวกัน จากนั้นป้อน URL ของ CUBE ในเบราว์เซอร์ของคุณ&#x20;

ประกาศ: หากคุณมีเกตเวย์หลายเครื่อง คุณสามารถรับที่อยู่ IP ที่สอดคล้องเพื่อเข้าถึงเกตเวย์ที่ระบุได้ด้วยสองวิธีด้านล่าง

1. เข้าสู่ระบบเราเตอร์ไร้สายของคุณและตรวจสอบที่อยู่ IP ของเกตเวย์ใน DHCP
2. CUBE สนับสนุนการค้นหาท้องถิ่นผ่าน mDNS

### 1.2 เริ่มต้นใช้งาน

* เรียกอินเทอร์เฟซ \[Access Token] และได้รับการตอบกลับข้อผิดพลาด แจ้งให้คลิก <**เสร็จสิ้น**>. หมายเหตุ: หลังจากกดแล้ว การเข้าถึงอินเทอร์เฟซจะมีผลไม่เกิน 5 นาที

```json
// คำขอ
curl --location --request GET 'http://<ip address>/open-api/V2/rest/bridge/access_token' --header 'Content-Type: application/json'

// การตอบกลับ
{
  "error": 401,
  "data": {},
  "message": "link button not pressed" 
}
```

* คลิก <**เสร็จสิ้น**> และเรียกอินเทอร์เฟซ \[Access Token] อีกครั้ง การตอบกลับสำเร็จ และได้รับโทเค็น

```json
// คำขอ
curl --location --request GET 'http://<ip address>/open-api/V2/rest/bridge/access_token' --header 'Content-Type: application/json'

// การตอบกลับ
{
  "error": 0,
  "data": {
    "token": "376310da-7adf-4521-b18c-5e0752cfff8d"
  },
  "message": "success"
}
```

* ยืนยันโทเค็น เรียกอินเทอร์เฟซ \[Get Device List] การตอบกลับสำเร็จ และได้รับรายการอุปกรณ์

```json
// คำขอ
curl --location --request GET 'http://<ip address>/open-api/V2/rest/devices' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer 376310da-7adf-4521-b18c-5e0752cfff8d'

// การตอบกลับ
{
  "error": 0,
  "data": {
    "device_list":  [
      {
        "serial_number": "ABCDEFGHIJK",
        "name": "device name",
        "manufacturer": "manufacturer name",
        "model": "model name",
        "firmware_version": "1.1.0",
        "display_category": "switch",
        "capabilities": [
          {
            "capability": "power",
            "permission": "readWrite"
          }
        ],
        "protocal": "zigbee",
        "state": {
          "power": {
            "powerState": "on"
          }
        },
        "tags": {
          "key": "value"
        },
        "online": true
      }
    ]
  }
  "message": "success"
}
```

* วิธีรับโทเค็นการเข้าถึง CUBE: หลังจากเรียกอินเทอร์เฟซ \[Access Token] หน้าคอนโซลเว็บ CUBE จะแสดงป๊อปอัปทั่วทั้งหน้าเพื่อให้ผู้ใช้ยืนยันการรับข้อมูลรับรองการเรียกอินเทอร์เฟซ
* หมายเหตุ: หากคุณเปิดหน้าคอนโซลเว็บ CUBE หลายหน้า ป๊อปอัปยืนยันจะปรากฏบนหลายหน้าพร้อมกัน และป๊อปอัปของหน้าคอนโซลเว็บอื่นจะปิดหลังจากคลิกยืนยันบนหนึ่งในหน้าคอนโซลเว็บ

## 2. แนวคิดหลัก

### 2.1 ที่อยู่ของอินเทอร์เฟซสำหรับนักพัฒนา

อินเทอร์เฟซ Web API ของเกตเวย์มีสองวิธีการเข้าถึง (ตาม IP หรือชื่อโดเมน) โดยปกติ root path จะเป็น /open-api/V2/rest/< specific function module >

// การเข้าถึงแบบ IP http\:///open-api/V2/rest/bridge

// การเข้าถึงแบบโดเมน http\:///open-api/V2/rest/bridge

### 2.2 หมวดหมู่การแสดงผลอุปกรณ์และความสามารถ

* \*\*หมวดหมู่การแสดงผลของอุปกรณ์ (DisplayCategory). \*\* หมวดหมู่การแสดงผลของอุปกรณ์ใช้ระบุประเภทเฉพาะของอุปกรณ์ เช่น สวิตช์ ปลั๊ก ไฟ เป็นต้น **ข้อมูลนี้จะกำหนดผลการแสดงผล UI ของอุปกรณ์ในเกตเวย์**.
* \*\*ความสามารถของอุปกรณ์. \*\* ความสามารถของอุปกรณ์ใช้บรรยายฟังก์ชันย่อยเฉพาะของอุปกรณ์ เช่น การควบคุมพลังงาน การควบคุมความสว่าง การควบคุมอุณหภูมิสี เป็นต้น **อุปกรณ์หนึ่งเครื่องสามารถรองรับความสามารถ 1 รายการหรือมากกว่า**.
  * **capability:** อธิบายชื่อความสามารถ ซึ่งต้องไม่ซ้ำทั่วโลกและเป็นชนิดสตริง คำภาษาอังกฤษหลายคำควรคั่นด้วยขีดกลาง ("-") ตัวอย่างเช่น: `"thermostat-target-setpoint"`.
  * **name:** อธิบายหมวดหมู่ภายใต้ความสามารถ ซึ่งเป็นชนิดสตริงเช่นกัน คำภาษาอังกฤษหลายคำควรคั่นด้วยขีดกลาง ("-") ตัวอย่างเช่น: `"auto-mode"`, `"manual-mode"`.
  * **permission:** อธิบายสิทธิ์ที่เกี่ยวข้องกับความสามารถ ประเภทเป็นสตริง จัดรูปแบบเป็นรหัสไบนารี 8421 ตัวอย่างได้แก่:
    * อุปกรณ์สามารถถูกควบคุมได้: `"1000"`
    * อุปกรณ์สามารถตั้งค่าได้: `"0010"`
    * อุปกรณ์สามารถถูกควบคุมและตั้งค่าได้: `"1010"`
    * อุปกรณ์สามารถถูกควบคุมและรายงานได้: `"1100"`

ความหมายของแต่ละบิต จากขวาไปซ้าย มีดังนี้: ⅰ. บิต 0: อนุญาตให้สืบค้นอุปกรณ์ ⅱ. บิต 1: อนุญาตให้ตั้งค่าอุปกรณ์ ⅲ. บิต 2: อนุญาตให้อุปกรณ์รายงานข้อมูล ⅳ. บิต 3: อนุญาตให้ควบคุมอุปกรณ์

```javascript
const permission = {
  "update": "1000",
  "updated": "0100",
  "configure": "0010",
  "query": "0001",  
  "update-updated": "1100",
  "update-query": "1001",
  "update-updated-configure": "1110",
  "updated-configure":"0110",
  "update-updated-query":"1101"
}
```

**settings:** อธิบารรายการการตั้งค่าสำหรับความสามารถ ซึ่งเป็นชนิดอ็อบเจ็กต์และรวมคำอธิบายของแต่ละรายการการตั้งค่า ⅰ. **key:** อธิบายชื่อรายการการตั้งค่า ซึ่งเป็นชนิดสตริง คำภาษาอังกฤษหลายคำควรแสดงในรูปแบบ camelCase ตัวอย่างเช่น: `"temperatureUnit"`. ⅱ. **value:** อธิบายเนื้อหาของรายการการตั้งค่า ข้อกำหนดเฉพาะระบุไว้ในตารางด้านล่าง

| คุณลักษณะ                       | ประเภท | ทางเลือก | คำอธิบาย                           |
| ------------------------------- | ------ | -------- | ---------------------------------- |
| permission                      | string | N        | อธิบายสิทธิ์สำหรับรายการการตั้งค่า |
| **ค่าที่เป็นไปได้ (ตัวเลือก):** |        |          |                                    |

* อนุญาตให้แก้ไขรายการการตั้งค่านี้: `"10"`
* อนุญาตให้ดูรายการการตั้งค่านี้: `"01"`
* อนุญาตทั้งการแก้ไขและการดูรายการการตั้งค่านี้: `"11"`

**คำอธิบายของบิต:**

1. **บิต 0:** อนุญาตให้ดูรายการการตั้งค่านี้
2. **บิต 1:** อนุญาตให้แก้ไขรายการการตั้งค่านี้ | | type | string | N | อธิบายชนิดข้อมูลของค่ารายการการตั้งค่า. **ค่าที่เป็นไปได้ (ตัวเลือก):**

* `"enum"`
* `"numeric"`
* `"object"`
* `"boolean"`
* `"string"`

**แนวทางเฉพาะตามประเภท:**

1. **เมื่อ `**type = enum**`:**
   * ฟิลด์ `value` (อธิบายค่าของรายการการตั้งค่า) เป็นภาคบังคับถ้า `permission` อนุญาตให้แก้ไข (`"10"` หรือ `"11"`).
   * ฟิลด์ `default` (อธิบายค่ามาตรฐานของรายการการตั้งค่า) และ `values` (อธิบายค่าที่เลือกได้สำหรับรายการการตั้งค่า) เป็นฟิลด์ที่เป็นทางเลือก
2. **เมื่อ `**type = numeric**`:**
   * ฟิลด์ `value` ฟิลด์เป็นภาคบังคับถ้า `permission` อนุญาตให้แก้ไข (`"10"` หรือ `"11"`).
   * ฟิลด์ต่อไปนี้เป็นทางเลือก:
     * `min` (อธิบายค่าต่ำสุดของรายการการตั้งค่า)
     * `max` (อธิบายค่าสูงสุดของรายการการตั้งค่า)
     * `step` (อธิบายค่าก้าวของรายการการตั้งค่า)
     * `precision` (อธิบายความละเอียด)
     * `unit` (อธิบายหน่วยของรายการการตั้งค่า)
     * `default` (อธิบายค่าดีฟอลต์)
3. **เมื่อ `**type = object**`:**
   * ฟิลด์ `value` ฟิลด์เป็นภาคบังคับถ้า `permission` อนุญาตให้แก้ไข (`"10"` หรือ `"11"`).
   * ฟิลด์ `default` ฟิลด์เป็นทางเลือก
4. **เมื่อ `**type = boolean**`:**
   * ฟิลด์ `value` ฟิลด์เป็นภาคบังคับถ้า `permission` อนุญาตให้แก้ไข (`"10"` หรือ `"11"`).
   * ฟิลด์ `default` ฟิลด์เป็นทางเลือก
5. **เมื่อ `**type = string**`:**
   * ฟิลด์ `value` ฟิลด์เป็นภาคบังคับถ้า `permission` อนุญาตให้แก้ไข (`"10"` หรือ `"11"`).
   * ฟิลด์ `default` ฟิลด์เป็นทางเลือก. |

```javascript
// type = enum
{
  "settings":{
    "temperatureUnit": {
      "type": "enum",
      "permission": "11", 
      "values": ["c", "f"], 
      "default": "c",
      "value": "f"
    }
  }
}
// type = numeric
{
  "settings": {
    "setpointRange": {
      "type": "numeric", 
      "permission": "01", 
      "min": 4, 
      "max": 35,
      "default": 20,
      "step": 0.5,
      "precision": 0.01
      "unit": "c"
    }
  }
}

// type = object
{
  "settings":{
    "weeklySchedule":{
      "type": "object",
      "permission": "11", 
      "value": {
        "maxEntryPerDay": 2, 
        "Monday": [
          {
            "startTimeInMinutes": 440, 
            "upperSetpoint": 36.5 
          },
          {
            "startTimeInMinutes": 900,
            "upperSetpoint": 26.5 
          }
        ]，
        "Tuesday": [...],
        "Wednesday": [...],
        "Thursday": [...],
        "Friday": [...],
        "Saturday": [...],
        "Sunday": [...],
      }
    }
  }
}
```

## 3. Web API

### ประเภทของข้อมูล

| ประเภท    | คำอธิบาย                                                                                                                                  |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| string    | ชนิดข้อมูลสตริง เข้ารหัสเป็น UTF8                                                                                                         |
| number    | ชนิดข้อมูลตัวเลข [รูปแบบทศนิยมคู่ความแม่นยำสองเท้า 64 บิต IEEE 754](https://en.wikipedia.org/wiki/Double-precision_floating-point_format) |
| int       | ชนิดข้อมูลจำนวนเต็ม                                                                                                                       |
| object    | ชนิดข้อมูลอ็อบเจ็กต์ อ็อบเจ็กต์ที่เป็นไปตาม JSON                                                                                          |
| string\[] | อาร์เรย์ของสตริง                                                                                                                          |
| int\[]    | อาร์เรย์ของจำนวนเต็ม                                                                                                                      |
| object\[] | อาร์เรย์ของอ็อบเจ็กต์                                                                                                                     |
| bool      | บูลีน                                                                                                                                     |
| date      | สตริงเวลา รูปแบบสตริงเป็น ISO (รูปแบบขยาย ISO 8601): YYYY-MM-DDTHH:mm:ss.sssZ เขตเวลาเป็น UTC เสมอ ซึ่งระบุด้วยคำต่อท้าย "Z"              |

### ผลการตอบกลับทั่วไป

| คุณลักษณะ                                                                      | ประเภท | ทางเลือก | คำอธิบาย                |
| ------------------------------------------------------------------------------ | ------ | -------- | ----------------------- |
| error                                                                          | int    | N        | รหัสข้อผิดพลาด:         |
| 0: สำเร็จ                                                                      |        |          |                         |
| 400: พารามิเตอร์ผิดพลาด                                                        |        |          |                         |
| 401: การตรวจสอบสิทธิ์ล้มเหลว                                                   |        |          |                         |
| 500: ข้อยกเว้นของเซิร์ฟเวอร์                                                   |        |          |                         |
| data                                                                           | object | N        | เนื้อหาข้อมูลการตอบกลับ |
| message                                                                        | string | N        | คำอธิบายการตอบกลับ:     |
| เมื่อ error เท่ากับ 0 เนื้อหาคือ success                                       |        |          |                         |
| เมื่อ error ไม่เท่ากับ 0 จะเป็นสตริงที่ไม่ว่าง และเนื้อหาคือคำอธิบายข้อผิดพลาด |        |          |                         |

**ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {
    "token": "376310da-7adf-4521-b18c-5e0752cfff8d"
  },
  "message": "success"
}
```

```json
{
  "error": 400,
  "data": {},
  "message": "invalid parameters"
}
```

### รายการทรัพยากร

| ประเภท         | คำอธิบาย                |
| -------------- | ----------------------- |
| เสียงที่รองรับ | - alert1 (เสียงเตือน 1) |

* alert2 (เสียงเตือน 2)
* alert3 (เสียงเตือน 3)
* alert4 (เสียงเตือน 4)
* alert5 (เสียงเตือน 5)
* doorbell1 (เสียงกริ่งประตู 1)
* doorbell2 (เสียงกริ่งประตู 2)
* doorbell3 (เสียงกริ่งประตู 3)
* doorbell4 (เสียงกริ่งประตู 4)
* doorbell5 (เสียงกริ่งประตู 5)
* alarm1 (เสียงสัญญาณเตือน 1)
* alarm2 (เสียงสัญญาณเตือน 2)
* alarm3 (เสียงสัญญาณเตือน 3)
* alarm4 (เสียงสัญญาณเตือน 4)
* alarm5 (เสียงสัญญาณเตือน 5) | | รองรับ deep | - bootComplete (ระบบบูตเสร็จสิ้น)
* networkConnected (เครือข่ายเชื่อมต่อ)
* networkDisconnected (เครือข่ายตัดการเชื่อมต่อ)
* systemShutdown (ระบบปิดเครื่อง) -deviceDiscovered (ค้นพบอุปกรณ์)
* system Armed (ระบบถูกตั้งให้ติดอาวุธ/เปิดใช้งาน)
* system Disarmed (ระบบยกเลิกการติดอาวุธ/ปิดการใช้งาน)
* factoryReset (รีเซ็ตอุปกรณ์) |

### 3.1 ฟังก์ชันของเกตเวย์

#### a. Access Token

อนุญาตให้ผู้ใช้เข้าถึงโทเค็น

* ประกาศ: โทเค็นจะถูกล้างหลังจากรีเซ็ตอุปกรณ์
* ประกาศ: หลังจากได้รับโทเค็น คุณต้องกดปุ่มอีกครั้งเพื่อรับโทเค็นใหม่อย่างสำเร็จ

:::tips

* **URL**：`/open-api/V2/rest/bridge/access_token`
* **Method**：`GET`
* **Header**：
  * Content-Type: application/json ::: Request Parameters:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**            |
| ------------- | ---------- | ------------ | ----------------------- |
| app\_name     | string     | Y            | คำอธิบายชื่อแอปพลิเคชัน |

การตอบกลับข้อมูลที่สำเร็จ:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                 |
| ------------- | ---------- | ------------ | ------------------------------------------------------------ |
| token         | string     | N            | โทเค็นการเข้าถึงอินเทอร์เฟซ มีอายุการใช้งานนาน โปรดบันทึกไว้ |
| app\_name     | string     | Y            | คำอธิบายชื่อแอปพลิเคชัน                                      |

:::tips **เงื่อนไข** : ผู้ใช้ทริกเกอร์ < command key > และเข้าถึงอินเทอร์เฟซนี้ภายในเวลาที่มีผล \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {
    "token": "376310da-7adf-4521-b18c-5e0752cfff8d"
  },
  "message": "success"
}
```

การตอบกลับข้อมูลเมื่อล้มเหลว：วัตถุว่าง :::tips **เงื่อนไข**：ผู้ใช้ยังไม่ได้ทริกเกอร์ < command key > หรือเวลาที่มีผลหมดอายุ \*\*Status Code: \*\* `200 OK` ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 401,
  "data": {},
  "message": "link button not pressed" 
}
```

#### b. รับสถานะของเกตเวย์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตรับสถานะของเกตเวย์ผ่านอินเทอร์เฟซนี้ :::tips

* **URL**：`/open-api/V2/rest/bridge/runtime`
* **Method**：`GET`
* **Header**：
  * Content-Type: application/json
  * Autorization: Bearer ::: Request Parameters: none Successful data response:

| **คุณลักษณะ**                                                       | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                 |
| ------------------------------------------------------------------- | ---------- | ------------ | ---------------------------- |
| ram\_used                                                           | int        | N            | ร้อยละการใช้งาน RAM \[0-100] |
| cpu\_used                                                           | int        | N            | ร้อยละการใช้งาน CPU \[0-100] |
| power\_up\_time                                                     | date       | N            | เวลาที่เปิดเครื่องล่าสุด     |
| cpu\_temp                                                           | int        | N            | อุณหภูมิ CPU:                |
| หน่วย: เซลเซียส                                                     |            |              |                              |
| cpu\_temp\_unit                                                     | string     | N            | หน่วยอุณหภูมิ CPU:           |
| ทางเลือก                                                            |            |              |                              |
| values:`'c'`, `'f'`                                                 |            |              |                              |
| sd\_card\_used                                                      | int        | Y            | การใช้งานการ์ด SD (ร้อยละ):  |
| ช่วง:`[0-100]` มีความละเอียดทศนิยมหนึ่งตำแหน่ง                      |            |              |                              |
| \*หมายเหตุ: หากไม่ได้ใส่การ์ด SD หรือไม่ได้ฟอร์แมต ค่าจะเป็นค่าว่าง |            |              |                              |

:::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {
    "ram_used": 40,
    "cpu_used": 30,
    "power_up_time": "2022-10-12T02:58:09.989Z",
    "cpu_temp": 51,
    "cpu_temp_unit": "c",
    "sd_card_used" : "12"
  },
  "message": "success"
}
```

#### c. การตั้งค่าเกตเวย์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตตั้งค่าเกตเวย์ผ่านอินเทอร์เฟซนี้ :::tips

* **URL**：`/open-api/V2/rest/bridge/config`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Autorization: Bearer ::: Request parameters:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**            |
| ------------- | ---------- | ------------ | ----------------------- |
| volume        | int        | Y            | ระดับเสียงระบบ \[0-100] |

การตอบกลับข้อมูลที่สำเร็จ: วัตถุว่าง {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### d. รับข้อมูลเกตเวย์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตรับข้อมูลเกตเวย์ผ่านอินเทอร์เฟซนี้ :::tips

* **URL**：`/open-api/V2/rest/bridge`
* **Method**：`GET`
* **Header**：
  * Content-Type: application/json ::: Request parameters:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**       |
| ------------- | ---------- | ------------ | ------------------ |
| ip            | string     | N            | ที่อยู่ IP         |
| mac           | string     | N            | ที่อยู่ MAC        |
| domain        | string     | Y            | โดเมนบริการเกตเวย์ |
| fw\_version   | string     | N            | เวอร์ชันเฟิร์มแวร์ |
| name          | string     | N            | ชื่ออุปกรณ์        |

การตอบกลับข้อมูลที่สำเร็จ: วัตถุว่าง {} :::tips **เงื่อนไข** : ไม่มี \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {
    "ip": "192.168.31.25",
    "mac": "00:0A:02:0B:03:0C",
    "domain": "ihost.local",
    "fw_version": "1.9.0",
    "name": "iHost"
  },
  "message": "success"
}
```

#### e. ปิดเสียงเกตเวย์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตปิดเสียงเกตเวย์ผ่านอินเทอร์เฟซนี้. :::tips

* **URL**：`/open-api/v2/rest/bridge/mute`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: Request Parameters: none Successful data response:empty Object {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### f. ยกเลิกการปิดเสียงเกตเวย์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตเปิดเสียงเกตเวย์ผ่านอินเทอร์เฟซนี้\
:::tips

* **URL**：`/open-api/v2/rest/bridge/unmute`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: Request Parameters: none Successful data response:empty Object {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### g. ยกเลิกสัญญาณเตือนของเกตเวย์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตปิดสถานะเสียงเตือนบนเกตเวย์ผ่านอินเทอร์เฟซนี้ :::tips

* **URL**：`/open-api/v2/rest/bridge/cancel_alarm`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: Request Parameters: none Successful data response:empty Object {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

### 3.2 ฟังก์ชันฮาร์ดแวร์

#### a. รีสตาร์ทเกตเวย์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตรีสตาร์ทเกตเวย์ผ่านอินเทอร์เฟซนี้ :::tips

* **URL**：`/open-api/V2/rest/hardware/reboot`
* **Method**：`POST`
* **Header**：
  * Content-Type: application/json
  * Autorization: Bearer ::: Request Parameters: none Successful data response: empty Object {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK :::

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### b. การควบคุมลำโพง

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตควบคุมลำโพงผ่านอินเทอร์เฟซนี้ :::tips

* **URL**：`/open-api/V2/rest/hardware/speaker`
* **Method**：`POST`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: Request parameters:

| **คุณลักษณะ** | **ประเภท**  | **ทางเลือก**                     | **คำอธิบาย**                                                           |
| ------------- | ----------- | -------------------------------- | ---------------------------------------------------------------------- |
| type          | string      | N                                | พารามิเตอร์ทางเลือก: 1.play\_sound (เล่นเสียง) 2.play\_beep (เล่นบี๊ป) |
| sound         | SoundObject | Y (N หาก type เป็น play\_sound.) | เสียง                                                                  |
| beep          | BeepObject  | Y (N หาก type เป็น play\_beep.)  | บี๊ป                                                                   |

SoundObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                   |
| ------------- | ---------- | ------------ | ---------------------------------------------------------------------------------------------- |
| name          | string     | N            | ชื่อเสียง ค่าที่รองรับสามารถตรวจสอบได้ใน \[Resource List - Supported sound]                    |
| volume        | int        | N            | ระดับเสียงของเสียง \[0-100]                                                                    |
| countdown     | int        | N            | ระยะเวลาที่ลำโพงจะเล่นเสียง และจะหยุดเล่นโดยอัตโนมัติเมื่อเวลา สิ้นสุด หน่วย: วินาที \[0,1799] |

BeepObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                               |
| ------------- | ---------- | ------------ | -------------------------------------------------------------------------- |
| name          | string     | N            | ชื่อ deep ค่าที่รองรับสามารถตรวจสอบได้ใน \[Resource List - Supported deep] |
| volume        | int        | N            | ระดับเสียง deep \[0-100]                                                   |

การตอบกลับข้อมูลที่สำเร็จ: วัตถุว่าง {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\* `200 OK` ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

### 3.3 ฟังก์ชันการจัดการอุปกรณ์

#### a. ประเภทอุปกรณ์ที่รองรับ

| **ประเภทอุปกรณ์**            | **ค่า**                      | iHost เวอร์ชัน |
| ---------------------------- | ---------------------------- | -------------- |
| ปลั๊ก                        | plug                         | ≥ 2.1.0        |
| สวิตช์                       | switch                       | ≥ 2.1.0        |
| ไฟ                           | light                        | ≥ 2.1.0        |
| ผ้าม่าน                      | curtain                      | ≥ 2.1.0        |
| เซ็นเซอร์ประตู/หน้าต่าง      | contactSensor                | ≥ 2.1.0        |
| เซ็นเซอร์การเคลื่อนไหว       | motionSensor                 | ≥ 2.1.0        |
| เซ็นเซอร์อุณหภูมิ            | temperatureSensor            | ≥ 2.1.0        |
| เซ็นเซอร์ความชื้น            | humiditySensor               | ≥ 2.1.0        |
| เซ็นเซอร์อุณหภูมิและความชื้น | temperatureAndHumiditySensor | ≥ 2.1.0        |
| ตัวตรวจจับการรั่วไหลของน้ำ   | waterLeakDetector            | ≥ 2.1.0        |
| ตัวตรวจจับควัน               | smokeDetector                | ≥ 2.1.0        |
| ปุ่มไร้สาย                   | button                       | ≥ 2.1.0        |
| กล้อง                        | camera                       | ≥ 2.1.0        |
| เซ็นเซอร์ทั่วไป              | sensor                       | ≥ 2.1.0        |
| เซ็นเซอร์ทั่วไป              | sensor                       | ≥ 2.1.0        |
| พัดลมพร้อมไฟ                 | fanLight                     | ≥ 2.1.0        |
| เครื่องปรับอากาศ             | airConditioner               | ≥ 2.1.0        |
| พัดลม                        | fan                          | ≥ 2.1.0        |
| เทอร์โมสตัท                  | thermostat                   | ≥ 2.1.0        |

#### ข. ความสามารถของอุปกรณ์ที่รองรับ

**สวิตช์ไฟ (power):**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "power", // ชื่อความสามารถ
    "permission": "1100",  // ihost ไม่รองรับการตั้งค่า soft start/stop ดังนั้นไม่มี field configure
  }
]
```

**แอตทริบิวต์สถานะ:**

```
{
  "powerState": "on", // ฟิลด์ powerState ระบุสถานะเปิด/ปิดไฟ จำเป็นต้องมี **ประเภท:** string. "on" หมายถึง เปิด, "off" หมายถึง ปิด, "toggle" หมายถึง สลับ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

**เปิด:**

```
{
  "power": {
    "powerState": "on"
  }
}
```

**ปิด:**

```
{
  "power": {
    "powerState": "off"
  }
}
```

**สวิตช์ช่อง (toggle):**

**ตัวอย่างการประกาศความสามารถ:**

ตัวอย่างคอมโพเนนต์เดี่ยว:

```
[
  {
    "capability": "toggle", // ชื่อความสามารถ
    "permission": "1100",  // สิทธิ์
    "name": "1", // ชื่อคอมโพเนนต์, **ประเภท:** String. ค่าเป็นทางเลือก: "1" (ช่อง 1), "2" (ช่อง 2), "3" (ช่อง 3), "4" (ช่อง 4), หรือค่าตัวอักษรพิมพ์ใหญ่/พิมพ์เล็กและตัวเลขอื่น ๆ
  }
]
```

ตัวอย่างหลายคอมโพเนนต์:

```
[
  {
    "capability": "toggle",
    "permission": "1100",
    "name": "1"
  },
  {
    "capability": "toggle",
    "permission": "1100",
    "name": "2"
  }
]
```

**แอตทริบิวต์สถานะ:**

```
{
  "toggleState": "on", // ฟิลด์ toggleState ระบุสถานะสวิตช์ของแอตทริบิวต์ {name} ของ {device_id} จำเป็นต้องมี **ประเภท:** String. "on" หมายถึง เปิด, "off" หมายถึง ปิด, "toggle" หมายถึง สลับ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

รูปแบบสวิตช์:

```
{
  [capability]: {
    [toggle-name]: {
      [toggleState]: [value]
    }
  }
}
คอมโพเนนต์ 1 เปิด, คอมโพเนนต์ 2 ปิด:
{
  "toggle": {
    "1": {
      "toggleState": "on"
    },
    "2": {
      "toggleState": "off"
    }
  }
}
```

**สวิตช์ช่องแบบหน่วงเวลา (toggle-inching):**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "toggle-inching", // ชื่อความสามารถ
    "permission": "0010",  // สิทธิ์
    "settings": {
      "toggleInchingSetting": {
        "permission": "11",
        "type": "object",
        "value": {
          "supported": {
            "1": { // ชื่อคอมโพเนนต์
              "enable": true, // ฟังก์ชัน inching เปิดใช้งานหรือไม่ **ประเภท:** Boolean. จำเป็นต้องมี
              "inchingSwitch": "off", // การตั้งค่าสวิตช์ inching **ประเภท:** String. จำเป็นต้องมี. "off" (ปิด), "on" (เปิด)
              "delay": 1000, // เวลาหน่วง inching เป็นมิลลิวินาที **ประเภท:** Integer. จำเป็นต้องมี
              "min_delay": 500, // เวลาหน่วงขั้นต่ำ
              "max_delay": 100000 // เวลาหน่วงสูงสุด
            },
            "2": { // ชื่อคอมโพเนนต์
              "enable": true, // ฟังก์ชัน inching เปิดใช้งานหรือไม่ **ประเภท:** Boolean. จำเป็นต้องมี
              "inchingSwitch": "off", // การตั้งค่าสวิตช์ inching **ประเภท:** String. จำเป็นต้องมี. "off" (ปิด), "on" (เปิด)
              "delay": 1000, // เวลาหน่วง inching เป็นมิลลิวินาที **ประเภท:** Integer. จำเป็นต้องมี
              "min_delay": 500, // เวลาหน่วงขั้นต่ำ
              "max_delay": 100000 // เวลาหน่วงสูงสุด
            },
            "3": { // ชื่อคอมโพเนนต์
              "enable": true, // ฟังก์ชัน inching เปิดใช้งานหรือไม่ **ประเภท:** Boolean. จำเป็นต้องมี
              "inchingSwitch": "off", // การตั้งค่าสวิตช์ inching **ประเภท:** String. จำเป็นต้องมี. "off" (ปิด), "on" (เปิด)
              "delay": 1000, // เวลาหน่วง inching เป็นมิลลิวินาที **ประเภท:** Integer. จำเป็นต้องมี
              "min_delay": 500, // เวลาหน่วงขั้นต่ำ
              "max_delay": 100000 // เวลาหน่วงสูงสุด
            },
            "4": { // ชื่อคอมโพเนนต์
              "enable": true, // ฟังก์ชัน inching เปิดใช้งานหรือไม่ **ประเภท:** Boolean. จำเป็นต้องมี
              "inchingSwitch": "off", // การตั้งค่าสวิตช์ inching **ประเภท:** String. จำเป็นต้องมี. "off" (ปิด), "on" (เปิด)
              "delay": 1000, // เวลาหน่วง inching เป็นมิลลิวินาที **ประเภท:** Integer. จำเป็นต้องมี
              "min_delay": 500, // เวลาหน่วงขั้นต่ำ
              "max_delay": 100000 // เวลาหน่วงสูงสุด
            }
          }
        }
      }
    }
  }
]
```

**แอตทริบิวต์สถานะ**

ไม่มี

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม)**

ไม่มี

**การปรับความสว่าง (brightness):**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "brightness", // ชื่อความสามารถ
  "permission": "1100"  // สิทธิ์
}
```

**แอตทริบิวต์สถานะ:**

```
{
  "brightness": 100, // ฟิลด์ brightness ระบุเปอร์เซ็นต์ความสว่าง เลือกใช้ระหว่าง brightness หรือ brightnessDelta **ประเภท:** Number. ช่วง: 0-100.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

ตั้งความสว่างเป็น 80% (0 มืดสุด และ 100 สว่างสุด)

```
json
คัดลอกโค้ด
{
  "brightness": {
    "brightness": 80
  }
}
```

**การปรับอุณหภูมิสี (color-temperature):**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "color-temperature", // ชื่อความสามารถ
  "permission": "1100"  // สิทธิ์
}
```

**แอตทริบิวต์สถานะ:**

```
{
  "colorTemperature": 100, // ฟิลด์ colorTemperature ระบุเปอร์เซ็นต์ของอุณหภูมิสี เลือกใช้ระหว่าง colorTemperature หรือ colorTemperatureDelta **ประเภท:** Number. ช่วง: 0-100. 0 หมายถึง แสงวอร์ม, 50 หมายถึง แสงกลาง, 100 หมายถึง แสงคูล
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

ปรับอุณหภูมิสีเป็น 50%:

```
json
 
{
  "color-temperature": {
    "colorTemperature": 50
  }
}
```

**การปรับสี (color-rgb):**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "color-rgb", // ชื่อความสามารถ
  "permission": "1100"  // สิทธิ์
}
```

**แอตทริบิวต์สถานะ:**

```
{
  "red": 255, // ฟิลด์ red แทนค่าสีแดงในระบบ RGB จำเป็นต้องมี **ประเภท:** Number. ช่วง: 0-255.
  "green": 0, // ฟิลด์ green แทนค่าสีเขียวในระบบ RGB จำเป็นต้องมี **ประเภท:** Number. ช่วง: 0-255.
  "blue": 255 // ฟิลด์ blue แทนค่าสีน้ำเงินในระบบ RGB จำเป็นต้องมี **ประเภท:** Number. ช่วง: 0-255.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

ตั้งค่าสีเป็นสีม่วง:

```
{
  "color-rgb": {
    "red": 255,
    "green": 0,
    "blue": 255
  }
}
```

**การปรับตามเปอร์เซ็นต์ (percentage):**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "percentage",
  "permission": "1100",
  "settings": { // ตัวเลือก
    "percentageRange": {
      "permission": "01",
      "type": "numeric",
      "min": 0,
      "max": 100,
      "step": 5
    }
  }
}
```

**แอตทริบิวต์สถานะ:**

```
{
  "percentage": 100, // ฟิลด์ percentage ระบุค่าร้อยละ เลือกใช้ระหว่าง percentage หรือ percentageDelta **ประเภท:** Number. ช่วง: 0-100.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

ปรับเป็น 40%:

```
{
  "percentage": {
    "percentage": 40
  }
}
```

**การควบคุมมอเตอร์ (motor-control):**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "motor-control",
  "permission": "1100"
}
```

**แอตทริบิวต์สถานะ:**

```
json
 
{
  "motorControl": "stop", // ฟิลด์ motorControl ระบุสถานะมอเตอร์ จำเป็นต้องมี **ประเภท:** String. ค่าที่เป็นไปได้: "open" (เปิด), "close" (ปิด), "stop" (หยุด), "lock" (ล็อก).
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

เปิดมอเตอร์:

```
{
  "motor-control": {
    "motorControl": "open"
  }
}
```

**การสลับทิศทางมอเตอร์ (motor-reverse):**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "motor-reverse",
  "permission": "1100"
}
```

**แอตทริบิวต์สถานะ:**

```
{
  "motorReverse": true, // ฟิลด์ motorReverse ระบุการตั้งค่าทิศทางมอเตอร์ จำเป็นต้องมี **ประเภท:** Boolean. true หมายถึง เดินหน้า, false หมายถึง ถอยหลัง
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

ตั้งมอเตอร์เป็นเดินหน้า:

```
{
  "motor-reverse": {
    "motorReverse": true
  }
}
```

**การปรับเทียบมอเตอร์ (motor-clb)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "motor-clb",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "motorClb": "calibration" // ฟิลด์ motorClb ระบุสถานะการปรับเทียบมอเตอร์ จำเป็นต้องมี **ประเภท:** String. "normal" หมายถึง โหมดปกติ (ปรับเทียบแล้ว), "calibration" หมายถึง กำลังปรับเทียบ
}
```

**โปรโตคอล (การรายงานสถานะ):**

รายงานสถานะมอเตอร์กำลังปรับเทียบ:

```
{
  "motor-clb": {
    "motorClb": "calibration"
  }
}
```

**สถานะการเปิดเครื่อง (startup)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "startup",
  "permission": "1100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "startup": "on" // สถานะพลังงานเมื่อเริ่มต้น **ประเภท:** String. จำเป็นต้องมี ค่าตัวเลือก: "on" (เปิด), "stay" (คงสภาพพลังงาน), "off" (ปิด), "toggle" (สลับสถานะพลังงาน)
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

ตั้งสถานะพลังงานให้เปิดตลอด:

```
{
  "startup": {
    "startup": "on"
  }
}
```

***

**การเปิดใช้งานการปลุก/ปลุกเตือน (identify)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "identify",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "identify": true // ระบุว่าอุปกรณ์รายงานผลการจดจำอย่างแข็งขันหรือถูกเปิดใช้งานหรือไม่
}
```

**โปรโตคอล (การรายงานสถานะและคำสั่งควบคุม):**

ตั้งเวลาการเปิดใช้งานการปลุก:

```
{
  "identify": {
    "countdown": 180 // ฟิลด์ countdown ระบุเวลาถอยหลัง จำเป็นต้องมี **ประเภท:** Number. หน่วย: วินาที
  }
}
```

รายงานสถานะการเปิดใช้งาน:

```
{
  "identify": {
    "identify": true // ระบุว่าอุปกรณ์รายงานผลการจดจำอย่างแข็งขันหรือถูกเปิดใช้งานหรือไม่
  }
}
```

**สวิตช์สถิติการใช้พลังงานแบบเรียลไทม์ (power-consumption)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "power-consumption",
  "permission": "1101",
  "settings": {
    "resolution": {
      "permission": "01",
      "type": "numeric",
      "value": 3600
    },
    "timeZoneOffset": {
      "permission": "01",
      "type": "numeric",
      "min": -12,
      "max": 14,
      "value": 0
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

เริ่ม/หยุด สถิติเรียลไทม์:

```
{
  "rlSummarize": true, // เริ่ม/หยุด สถิติเรียลไทม์ **ประเภท:** Boolean. จำเป็นต้องมี
  "timeRange": { // ช่วงเวลาที่สรุป จำเป็นต้องมี
    "start": "2020-07-05T08:00:00Z", // เวลาเริ่มต้นของสถิติการใช้พลังงาน **ประเภท:** String. จำเป็นต้องมี
    "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุดของสถิติการใช้พลังงาน **ประเภท:** String. จำเป็นต้องมี
  }
}
```

การสอบถามการใช้พลังงานตามช่วงเวลา:

```
{
  "type": "summarize", // ประเภทของสถิติ **ประเภท:** String. จำเป็นต้องมี ค่าตัวเลือก: "rlSummarize" (สรุปแบบเรียลไทม์), "summarize" (สรุปปัจจุบัน)
  "timeRange": { // ช่วงเวลาที่สรุป จำเป็นต้องมีถ้า type เป็น "summarize"
    "start": "2020-07-05T08:00:00Z", // เวลาเริ่มต้นของสถิติการใช้พลังงาน **ประเภท:** String. จำเป็นต้องมี
    "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุดของสถิติการใช้พลังงาน **ประเภท:** String. เป็นทางเลือก หากละไว้ หมายถึง เวลาปัจจุบัน
  }
}
```

ตอบกลับด้วยผลสถิติภายในช่วงเวลา:

```
json
 
{
  "type": "summarize", // ประเภทของสถิติ **ประเภท:** String. จำเป็นต้องมี ค่าตัวเลือก: "rlSummarize" (สรุปแบบเรียลไทม์), "summarize" (สรุปปัจจุบัน)
  "rlSummarize": 50.0, // รวมการใช้พลังงาน **ประเภท:** Number. หน่วย: 0.01 kWh. เป็นทางเลือก
  "electricityIntervals": [ // บันทึกสถิติหลายรายการ แบ่งตาม configuration.resolution. เป็นทางเลือก จะไม่มีเมื่อ type เป็น "rlSummarize"
    {
      "usage": 26.5, // การใช้พลังงาน **ประเภท:** Number. หน่วย: 0.01 kWh. จำเป็นต้องมี
      "start": "2020-07-05T08:00:00Z", // เวลาเริ่มต้น **ประเภท:** Date. จำเป็นต้องมี
      "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุด **ประเภท:** Date. จำเป็นต้องมี หากช่วงระหว่าง end และ start น้อยกว่า resolution รายงานทั้งหมดถือว่าไม่ถูกต้อง
    },
    {
      "usage": 26.5, // การใช้พลังงาน **ประเภท:** Number. หน่วย: 0.01 kWh. จำเป็นต้องมี
      "start": "2020-07-05T09:00:00Z", // เวลาเริ่มต้น **ประเภท:** Date. จำเป็นต้องมี
      "end": "2020-07-05T10:00:00Z" // เวลาสิ้นสุด **ประเภท:** Date. จำเป็นต้องมี หากช่วงระหว่าง end และ start น้อยกว่า resolution รายงานทั้งหมดถือว่าไม่ถูกต้อง
    }
  ]
}
```

**โปรโตคอล (การรายงานสถานะและคำสั่งควบคุม):**

เริ่มสถิติเรียลไทม์:

```
json
 
{
  "power-consumption": {
    "powerConsumption": {
      "rlSummarize": true,
      "timeRange": {
        "start": "2020-07-05T08:00:00Z",
        "end": ""
      }
    }
  }
}
```

หยุดสถิติเรียลไทม์:

```
json
 
{
  "power-consumption": {
    "powerConsumption": {
      "rlSummarize": false,
      "timeRange": {
        "start": "2020-07-05T08:00:00Z",
        "end": "2020-07-05T09:00:00Z"
      }
    }
  }
}
```

รับการใช้พลังงานย้อนหลัง:

```
json
 
{
  "power-consumption": {
    "type": "summarize",
    "timeRange": {
      "start": "2020-07-05T08:00:00Z",
      "end": "2020-07-05T09:00:00Z"
    }
  }
}
```

รับการใช้พลังงานแบบเรียลไทม์:

```
json
 
{
  "power-consumption": {
    "powerConsumption": {
      "type": "rlSummarize"
    }
  }
}
```

**การตรวจจับโหมดอุณหภูมิและความชื้น (thermostat-mode-detect)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "thermostat-mode-detect",
  "permission": "0110",
  "name": "temperature", // ประเภทการตรวจจับการควบคุมอุณหภูมิ **ประเภท:** String. จำเป็นต้องมี ค่าตัวเลือก: "humidity" (ตรวจจับความชื้น), "temperature" (ตรวจจับอุณหภูมิ)
  "settings": {
    "setpointRange": {
      "permission": "11",
      "type": "object",
      "value": {
        "supported": [ // การตั้งค่าการตรวจจับที่รองรับ จำเป็นต้องมี
          {
            "name": "lowerSetpoint", // ค่าการตรวจจับควรสูงกว่าจุดตั้งค่านี้ ต้องมีอย่างน้อย lowerSetpoint หรือ upperSetpoint
            "value": { // ช่วงการตรวจจับ เป็นทางเลือก กำหนดถ้ามีเงื่อนไขที่ตั้งไว้ล่วงหน้า
              "value": 68.0, // ค่าอุณหภูมิ **ประเภท:** Number. จำเป็นต้องมี
              "scale": "f" // หน่วยอุณหภูมิ จำเป็นเมื่อ name=temperature ค่าตัวเลือก: "c" (เซลเซียส), "f" (ฟาเรนไฮต์)
            }
          },
          {
            "name": "upperSetpoint", // ค่าการตรวจจับควรต่ำกว่าจุดตั้งค่านี้ ต้องมีอย่างน้อย lowerSetpoint หรือ upperSetpoint
            "value": { // ช่วงการตรวจจับ เป็นทางเลือก กำหนดถ้ามีเงื่อนไขที่ตั้งไว้ล่วงหน้า
              "value": 68.0, // ค่าอุณหภูมิ **ประเภท:** Number. จำเป็นต้องมี
              "scale": "f" // หน่วยอุณหภูมิ จำเป็นเมื่อ name=temperature ค่าตัวเลือก: "c" (เซลเซียส), "f" (ฟาเรนไฮต์)
            }
          }
        ]
      }
    },
    "supportedModes": {
      "type": "enum",
      "permission": "01",
      "values": [
        "COMFORT",
        "COLD",
        "HOT"
      ]
    }
  }
}

{
  "capability": "thermostat-mode-detect",
  "permission": "0110",
  "name": "humidity", // ประเภทการตรวจจับการควบคุมอุณหภูมิ **ประเภท:** String. จำเป็นต้องมี ค่าตัวเลือก: "humidity" (ตรวจจับความชื้น), "temperature" (ตรวจจับอุณหภูมิ)
  "settings": {
    "setpointRange": {
      "permission": "11",
      "type": "object",
      "value": {
        "supported": [ // การตั้งค่าการตรวจจับที่รองรับ จำเป็นต้องมี
          {
            "name": "lowerSetpoint", // ค่าการตรวจจับควรสูงกว่าจุดตั้งค่านี้ ต้องมีอย่างน้อย lowerSetpoint หรือ upperSetpoint
            "value": { // ช่วงการตรวจจับ เป็นทางเลือก กำหนดถ้ามีเงื่อนไขที่ตั้งไว้ล่วงหน้า
              "value": 68.0, // ค่าเปอร์เซ็นต์ความชื้น **ประเภท:** Number. จำเป็นต้องมี
            }
          },
          {
            "name": "upperSetpoint", // ค่าการตรวจจับควรต่ำกว่าจุดตั้งค่านี้ ต้องมีอย่างน้อย lowerSetpoint หรือ upperSetpoint
            "value": { // ช่วงการตรวจจับ เป็นทางเลือก กำหนดถ้ามีเงื่อนไขที่ตั้งไว้ล่วงหน้า
              "value": 68.0, // ค่าเปอร์เซ็นต์ความชื้น **ประเภท:** Number. จำเป็นต้องมี
            }
          }
        ]
      }
    },
    "supportedModes": {
      "type": "enum",
      "permission": "01",
      "values": [
        "COMFORT",
        "COLD",
        "HOT"
      ]
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "mode": "COMFORT" // รหัสโหมด เป็นทางเลือก ค่าที่รองรับ: "COMFORT" (โหมดสบาย), "COLD" (โหมดเย็น), "HOT" (โหมดร้อน), "DRY" (โหมดแห้ง), "WET" (โหมดชื้น)
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

รูปแบบ:

```
{
    [capability] :{
        [mode name] :{
            "mode": [value]
        }
    }
}
```

ตัวอย่าง:

```
{
  "thermostat-mode-detect": {
    "humidity": {
      "mode": "COMFORT"
    }
  }
}
```

**โหมดเทอร์โมสตัท (thermostat-mode)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "thermostat",
  "permission": "1100",
  "name": "thermostat-mode",
  "settings": {
    "supportedModes": {
      "type": "enum",
      "permission": "01",
      "values": [
        "MANUAL",
        "AUTO",
        "ECO"
      ]
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "thermostatMode": "MANUAL" // โหมดการทำงานของเทอร์โมสตัท **ประเภท:** String. ค่าตัวเลือก: "MANUAL", "AUTO", "ECO"
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
   "thermostat": {
    "thermostat-mode": {
      "thermostatMode": "MANUAL"
    }
  }
}
```

**สถานะการฟื้นฟูแบบปรับตัวของเทอร์โมสตัท (thermostat/adaptive-recovery-status)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "thermostat",
  "permission": "0100",
  "name": "adaptive-recovery-status" // สถานะการฟื้นฟูแบบปรับตัวของเทอร์โมสตัท
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "adaptiveRecoveryStatus": "HEATING" // สถานะการฟื้นฟูแบบปรับตัวของเทอร์โมสตัท **ประเภท:** String. ค่าตัวเลือก: "HEATING", "INACTIVE".
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "thermostat": {
    "adaptive-recovery-status": {
      "adaptiveRecoveryStatus": "HEATING"
    }
  }
}
```

**การตั้งค่าอุณหภูมิเป้าหมายโหมดเทอร์โมสตัท (thermostat-target-setpoint)**

**ตัวอย่างการประกาศความสามารถ:**

```
[[
  {
    "capability": "thermostat-target-setpoint",
    "name": "manual-mode",
    "permission": "1110",
    "settings": {
      "temperatureUnit":{
        "type": "enum",
        "permission": "11",
        "value": "c",
        "values": [
          "c",
          "f"
        ]
      },
      "temperatureRange":{
        "type": "numeric",
        "permission": "01",
        "min": 4,
        "max": 35,
        "step": 0.5
      }
    }
  },
  {
    "capability": "thermostat-target-setpoint",
    "name": "eco-mode",
    "permission": "1110",
    "settings": {
      "temperatureUnit":{
        "type": "enum",
        "permission": "11",
        "value": "c",
        "values": [
          "c",
          "f"
        ]
      },
      "temperatureRange":{
        "type": "numeric",
        "permission": "01",
        "min": 4,
        "max": 35,
        "step": 0.5
      }
    }
  },
  {
    "capability": "thermostat-target-setpoint",
    "name": "auto-mode",
    "permission": "0110",
    "settings": {
      "temperatureUnit":{
        "type": "enum",
        "permission": "11",
        "value": "c",
        "values": [
          "c",
          "f"
        ]
      },
      "temperatureRange":{
        "type": "numeric",
        "permission": "01",
        "min": 4,
        "max": 35,
        "step": 0.5
      },
      "weeklySchedule":{
        "type": "object",
        "permission": "11",
        "value": {
          "maxEntryPerDay": 2,
          "Monday": [
          {
            "startTimeInMinutes": 440, // เวลาเริ่มต้นเป็นนาที **ประเภท:** int. เช่น 7:20 AM = 440 นาที
            "upperSetpoint": 36.5, // อุณหภูมิเป้าหมายสูงสุด **ประเภท:** number
            "lowerSetpoint": 20 // อุณหภูมิเป้าหมายต่ำสุด **ประเภท:** number
          },
          {
            "startTimeInMinutes": 900, // เวลาเริ่มต้นเป็นนาที เช่น 3:00 PM = 900 นาที
            "upperSetpoint": 26.5, // อุณหภูมิเป้าหมายสูงสุด **ประเภท:** number
            "lowerSetpoint": 21 // อุณหภูมิเป้าหมายต่ำสุด **ประเภท:** number
          }
        ],
          "Tuesday": [...
          ],
          "Wednesday": [...
          ],
          "Thursday": [...
          ],
          "Friday": [...
          ],
          "Saturday": [...
          ],
          "Sunday": [...
          ],
        }
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "targetSetpoint": 30 // อุณหภูมิเข้าถึงเป้าหมายสำหรับโหมดที่ระบุ **ประเภท:** number ในหน่วยที่กำหนดโดย temperatureUnit
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "thermostat-target-setpoint": {
    "manual-mode": {
        "targetSetpoint": 30 
    },
    "auto-mode": {
        "targetSetpoint": 30 
    }
  }
}
```

**การตรวจจับเซนเซอร์ (detect)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "detect",
  "permission": "0110",
  "settings": { // ตัวเลือก
    "detectInterval": {
      "permission": "11",
      "type": "numeric",
      "value": 300
    },
    "detectSensitivity": {
      "permission": "11",
      "type": "numeric",
      "value": 1000
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "detected": true // ผลการตรวจจับ **ประเภท:** Boolean. `true` หมายถึง ตรวจพบ, `false` หมายถึง ไม่พบ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
    "detect": {
        "detected": true
    }
}
```

**การตรวจจับอุณหภูมิ (temperature)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "temperature",
  "permission": "0110",
  "settings": { // ตัวเลือก
    "temperatureCalibration": { // การปรับเทียบอุณหภูมิเป็นทางเลือก
      "type": "numeric",
      "permission": "11",
      "min": -7, // ค่าต่ำสุด
      "max": 7, // ค่าสูงสุด
      "step": 0.2, // ขั้นตอนการปรับอุณหภูมิ หน่วยเดียวกับ temperatureUnit
      "value": 5.2 // ค่าการปรับเทียบอุณหภูมิปัจจุบัน **ประเภท:** number
    },
    "temperatureUnit": { // หน่วยอุณหภูมิเพิ่มเติมเป็นทางเลือก
      "type": "enum",
      "permission": "11",
      "value": "c",
      "values": [
        "c",
        "f"
      ]
    },
    "temperatureRange": { // ช่วงการตรวจจับอุณหภูมิเป็นทางเลือก
      "type": "numeric",
      "permission": "01",
      "min": -40,
      "max": 80
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
json
คัดลอกโค้ด
{
  "temperature": 26.5 // อุณหภูมิปัจจุบัน **ประเภท:** Number เป็นเซลเซียส
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "temperature": {
    "temperature": 20
  }
}
```

**การตรวจจับความชื้น (humidity)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "humidity",
  "permission": "0100",
  "settings": { // ช่วงการตรวจจับความชื้นเป็นทางเลือก
    "humidityRange": {
      "type": "numeric",
      "permission": "01",
      "min": 0,
      "max": 100
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "humidity": 50 // ความชื้นสัมพัทธ์ปัจจุบัน (เปอร์เซ็นต์) **ประเภท:** Number ช่วง 0-100
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
    "humidity": {
        "humidity": 20
    }
}
```

**การตรวจจับแบตเตอรี่ (battery)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "battery",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "battery": 95 // เปอร์เซ็นต์แบตเตอรี่ที่เหลือ **ประเภท:** Number ช่วง -1 ถึง 100. หมายเหตุ: -1 หมายถึง ระดับแบตเตอรี่ไม่ทราบ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "battery": {
    "battery": 40
  }
}
```

**การตรวจจับปุ่มเดี่ยว (press)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "press",
  "permission": "1100",
  "settings": { // ตัวเลือก
    "actions": { // การกระทำของปุ่ม เป็นทางเลือก
      "type": "enum",
      "permission": "01",
      "values": [ // การกระทำปุ่มเป็นทางเลือก ค่าปริยายคือ "singlePress", "doublePress", "longPress" การกำหนดค่าใหม่จะแทนที่ค่าเริ่มต้น
      ]
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "press": "singlePress" // ประเภทการกดปุ่ม **ประเภท:** String. ค่ามาตรฐาน: "singlePress" (กดครั้งเดียวหรือกดสั้น), "doublePress" (กดสองครั้ง), "longPress" (กดยาว)
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "press": {
    "press": "singlePress"
  }
}
```

**การตรวจจับปุ่มหลายปุ่ม (multi-press)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "multi-press",
  "permission": "0100",
  "name": "1", // ชื่อของแอตทริบิวต์ multi-press **ประเภท:** String. อนุญาตเฉพาะอักษรและตัวเลข
  "settings": { // ตัวเลือก
    "actions": { // การกระทำของปุ่ม เป็นทางเลือก
      "type": "enum",
      "permission": "01",
      "values": [ // การกระทำปุ่มเป็นทางเลือก ค่าปริยายคือ "singlePress", "doublePress", "longPress" การกำหนดค่าใหม่จะแทนที่ค่าเริ่มต้น
      ]
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "press": "singlePress" // ประเภทการกดปุ่ม **ประเภท:** String. ค่ามาตรฐาน: "singlePress" (กดครั้งเดียวหรือกดสั้น), "doublePress" (กดสองครั้ง), "longPress" (กดยาว)
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
    [capability] :{
        [multi-press-name]：{
            press:[value]
        }
    }
}

ตัวอย่าง:
{
  "multi-press": {
    "1": {
      "press": "singlePress"
    },
    "2": {
      "press": "doublePress"
    }
  }
}
```

**การตรวจจับความแรงสัญญาณ (rssi)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "rssi",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "rssi": -65 // ความแรงสัญญาณไร้สาย (Received Signal Strength Indicator) **ประเภท:** Number หน่วย dBm ค่าลบเป็นจำนวนเต็ม
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "rssi": {
    "rssi": -65
  }
}
```

**การตรวจจับการแกะ (tamper-alert)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "tamper-alert",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "tamper": "clear" // สถานะการแกะ **ประเภท:** String. ค่าที่เป็นไปได้: "clear" (ไม่ถูกแกะ), "detected" (ถูกแกะ)
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "tamper-alert": {
    "tamper": "clear" // สถานะการแกะ **ประเภท:** String. ค่าที่เป็นไปได้: "clear" (ไม่ถูกแกะ), "detected" (ถูกแกะ)
  }
}
```

**การตรวจจับระดับแสง (illumination-level)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "illumination-level",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "level": "brighter" // ระดับความสว่าง **ประเภท:** String. ค่าที่เป็นไปได้: "brighter" (สว่างขึ้น), "darker" (มืดลง)
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "illumination-level": {
    "level": "brighter"
  }
}
```

**การตรวจจับแรงดันไฟฟ้า (voltage)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "voltage",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "voltage": 50 // ค่าความดันไฟฟ้าปัจจุบัน ในหน่วย 0.01V **ประเภท:** Number ค่าที่ไม่เป็นลบ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "voltage": {
    "voltage": 50
  }
}
```

**การตรวจจับกระแสไฟฟ้า (electric-current)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "electric-current",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "electric-current": 50 // ค่ากระแสปัจจุบัน ในหน่วย 0.01A **ประเภท:** Number ค่าจำนวนเต็มไม่เป็นลบ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "electric-current": {
    "electric-current": 50
  }
}
```

**การตรวจจับกำลังไฟฟ้า (electric-power)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "electric-power",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "electric-power": 50 // ค่ากำลังปัจจุบัน ในหน่วย 0.01W **ประเภท:** Number ค่าจำนวนเต็มไม่เป็นลบ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "electric-power": {
    "electric-power": 50
  }
}
```

**การตรวจจับข้อผิดพลาด (fault)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "fault",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "fault": "none" // สถานะข้อผิดพลาด **ประเภท:** String. ค่าที่เป็นไปได้: "none" (ไม่มีข้อผิดพลาด), "detected" (ตรวจพบข้อผิดพลาด)
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "fault": {
    "fault": "none"
  }
}
```

**ตัวตัดเกณฑ์ (threshold-breaker)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "threshold-breaker",
  "permission": "0010",
  "settings": {
    "supportedSetting": {
      "type": "object",
      "permission": "11",
      "value": {
        "supported": [
          {
            "name": "lowerPower", // ตัวตัดเกณฑ์พลังงานต่ำ
            "value": {
              "value": 50, // ค่าการตรวจจับพลังงาน ในหน่วย 0.01W **ประเภท:** Integer ช่วง: >=0
              "min_range": 10, // ค่าการตรวจจับพลังงานขั้นต่ำ ในหน่วย 0.01W **ประเภท:** Integer ช่วง: >=0
              "max_range": 3500 // ค่าการตรวจจับพลังงานสูงสุด ในหน่วย 0.01W **ประเภท:** Integer ช่วง: >=0
            }
          },
          {
            "name": "upperPower", // ตัวตัดเกณฑ์พลังงานสูง
            "value": {
              "value": 50, // ค่าการตรวจจับพลังงาน ในหน่วย 0.01W **ประเภท:** Integer ช่วง: >=0
              "min_range": 10, // ค่าการตรวจจับพลังงานขั้นต่ำ ในหน่วย 0.01W **ประเภท:** Integer ช่วง: >=0
              "max_range": 3500 // ค่าการตรวจจับพลังงานสูงสุด ในหน่วย 0.01W **ประเภท:** Integer ช่วง: >=0
            }
          },
          {
            "name": "lowerElectricCurrent", // ตัวตัดเกณฑ์กระแสต่ำ
            "value": {
              "value": 50, // ค่าการตรวจจับกระแส ในหน่วย 0.01A **ประเภท:** Integer ช่วง: >=0
              "min_range": 10, // ค่าการตรวจจับกระแสขั้นต่ำ ในหน่วย 0.01A **ประเภท:** Integer ช่วง: >=0
              "max_range": 1500 // ค่าการตรวจจับกระแสสูงสุด ในหน่วย 0.01A **ประเภท:** Integer ช่วง: >=0
            }
          },
          {
            "name": "upperElectricCurrent", // ตัวตัดเกณฑ์กระแสสูง
            "value": {
              "value": 50, // ค่าการตรวจจับกระแส ในหน่วย 0.01A **ประเภท:** Integer ช่วง: >=0
              "min_range": 10, // ค่าการตรวจจับกระแสขั้นต่ำ ในหน่วย 0.01A **ประเภท:** Integer ช่วง: >=0
              "max_range": 1500 // ค่าการตรวจจับกระแสสูงสุด ในหน่วย 0.01A **ประเภท:** Integer ช่วง: >=0
            }
          },
          {
            "name": "lowerVoltage", // ตัวตัดเกณฑ์แรงดันต่ำ
            "value": {
              "value": 50, // ค่าการตรวจจับแรงดัน ในหน่วย 0.01V **ประเภท:** Integer ช่วง: >=0
              "min_range": 10, // ค่าการตรวจจับแรงดันขั้นต่ำ ในหน่วย 0.01V **ประเภท:** Integer ช่วง: >=0
              "max_range": 24000 // ค่าการตรวจจับแรงดันสูงสุด ในหน่วย 0.01V **ประเภท:** Integer ช่วง: >=0
            }
          },
          {
            "name": "upperVoltage", // ตัวตัดเกณฑ์แรงดันสูง
            "value": {
              "value": 50, // ค่าการตรวจจับแรงดัน ในหน่วย 0.01V **ประเภท:** Integer ช่วง: >=0
              "min_range": 10, // ค่าการตรวจจับแรงดันขั้นต่ำ ในหน่วย 0.01V **ประเภท:** Integer ช่วง: >=0
              "max_range": 24000 // ค่าการตรวจจับแรงดันสูงสุด ในหน่วย 0.01V **ประเภท:** Integer ช่วง: >=0
            }
          }
        ]
      }
    }
  }
}
```

**แอตทริบิวต์ (สถานะ)**

* ไม่มี

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม)**

* ไม่มี

**ฟังก์ชัน Inch (inching)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "inching",
  "permission": "0010",
  "settings": {
    "inchingEnable": { // การตั้งค่าเปิดใช้งานฟังก์ชัน inch
      "permission": "11",
      "type": "boolean",
      "value": false
    },
    "inchingSwitch": { // การตั้งค่าการกระทำ inch
      "type": "enum",
      "permission": "11",
      "value": "on",
      "values": ["on", "off"]
    },
    "inchingDelay": { // การตั้งค่าเวลาหน่วง inch
      "type": "numeric",
      "permission": "11",
      "min": 500,
      "max": 100000,
      "value": 1000,
      "unit": "ms"
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

* ไม่มี

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

* ไม่มี

**สตรีมกล้อง (camera-stream)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "camera-stream",
  "permission": "0010",
  "settings": {
    "streamSetting": {
      "type": "object",
      "permission": "11",
      "value": {
        "username": "String", // บัญชีเข้าถึง **ประเภท:** String. จำเป็นต้องมี
        "password": "String", // รหัสผ่านเข้าถึง **ประเภท:** String. จำเป็นต้องมี
        "streamUrl": "rtsp://<username>:<password>@<hostname>:<port>/streaming/channel01", // URL สตรีม **ประเภท:** String. จำเป็นต้องมี
        "videoCodec": "", // ตัวเข้ารหัสวิดีโอ **ประเภท:** String. จำเป็นต้องมี พารามิเตอร์เสริมต้องกำหนด
        "resolution": { // ความละเอียดวิดีโอ จำเป็นต้องมี
          "width": 1080, // ความกว้าง **ประเภท:** Number. จำเป็นต้องมี
          "height": 720 // ความสูง **ประเภท:** Number. จำเป็นต้องมี
        },
        "keyFrameInterval": 5, // ช่วงคีย์เฟรม **ประเภท:** String. จำเป็นต้องมี
        "audioCodec": "G711", // ตัวเข้ารหัสเสียง **ประเภท:** String. จำเป็นต้องมี พารามิเตอร์เสริมต้องกำหนด
        "samplingRate": 50, // อัตราสุ่มเสียง หน่วย Hz **ประเภท:** Number. จำเป็นต้องมี พารามิเตอร์เสริมต้องกำหนด
        "dataRate": 50 // บิตเรต **ประเภท:** Number. จำเป็นต้องมี หน่วย: kb/s
      }
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

* ไม่มี

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

* ไม่มี

**การควบคุมโหมด (mode)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "mode",
    "name": "fanLevel",
    "permission": "1100",
    "settings": {
      "supportedValues": {
        "type": "enum",
        "permission": "01",
        "values": ["low", "medium", "high"] // ค่าจำลองโหมดที่กำหนดเอง ค่าที่กำหนดจะแทนที่ค่าเริ่มต้น
      }
    }
  },
  {
    "capability": "mode",
    "name": "thermostatMode",
    "permission": "1100",
    "settings": {
      "supportedValues": {
        "type": "enum",
        "permission": "01",
        "values": ["auto", "manual"] // ค่าจำลองโหมดที่กำหนดเอง ค่าที่กำหนดจะแทนที่ค่าเริ่มต้น
      }
    }
  },
  {
    "capability": "mode",
    "name": "airConditionerMode",
    "permission": "1100",
    "settings": {
      "supportedValues": {
        "type": "enum",
        "permission": "01",
        "values": ["cool", "heat", "auto", "fan", "dry"] // ค่าจำลองโหมดที่กำหนดเอง ค่าที่กำหนดจะแทนที่ค่าเริ่มต้น
      }
    }
  },
  {
    "capability": "mode",
    "name": "fanMode",
    "permission": "1100",
    "settings": {
      "supportedValues": {
        "type": "enum",
        "permission": "01",
        "values": ["normal", "sleep", "child"] // ค่าจำลองโหมดที่กำหนดเอง ค่าที่กำหนดจะแทนที่ค่าเริ่มต้น
      }
    }
  },
  {
    "capability": "mode",
    "name": "horizontalAngle",
    "permission": "1100",
    "settings": {
      "supportedValues": {
        "type": "enum",
        "permission": "01",
        "values": ["30", "60", "90", "120", "180", "360"] // ค่าจำลองโหมดที่กำหนดเอง ค่าที่กำหนดจะแทนที่ค่าเริ่มต้น
      }
    }
  },
  {
    "capability": "mode",
    "name": "verticalAngle",
    "permission": "1100",
    "settings": {
      "supportedValues": {
        "type": "enum",
        "permission": "01",
        "values": ["30", "60", "90", "120", "180", "360"] // ค่าจำลองโหมดที่กำหนดเอง ค่าที่กำหนดจะแทนที่ค่าเริ่มต้น
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "modeValue": "low" // ค่าของโหมด **ประเภท:** String. จำเป็นต้องมี อ้างอิงโหมดที่ตั้งไว้ล่วงหน้าที่รองรับ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "mode": {
    "fanLevel": {
      "modeValue": "low"
    }
  }
}
```

**การตรวจจับก๊าซคาร์บอนไดออกไซด์ (co2)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "co2",
  "permission": "0100",
  "settings": {
    "co2Range": {
      "type": "numeric",
      "permission": "01",
      "min": 400,
      "max": 10000
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "co2": 111 // ความเข้มข้นของก๊าซคาร์บอนไดออกไซด์ **ประเภท:** Integer. หน่วย: ppm.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "co2": {
    "co2": 500
  }
}
```

**การตรวจจับแสง (illumination)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "illumination",
  "permission": "0100",
  "settings": {
    "illuminationRange": {
      "type": "numeric",
      "permission": "01",
      "min": 0,
      "max": 160000
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "illumination": 11 // ระดับแสง **ประเภท:** Integer. หน่วย: lux.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "illumination": {
    "illumination": 50
  }
}
```

**การตรวจจับควัน (smoke)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "smoke",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "smoke": true // ผลการตรวจจับ **ประเภท:** Boolean. `true` หมายถึง ตรวจพบ, `false` หมายถึง ไม่พบ
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "smoke": {
    "smoke": true
  }
}
```

**การตรวจจับการเปิด/ปิดแม่เหล็กประตู (contact)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "contact",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "contact": true // ผลการตรวจจับ **ประเภท:** Boolean. `true` หมายถึงตรวจพบ, `false` หมายถึงไม่พบ.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "contact": {
    "contact": true
  }
}
```

**การตรวจจับการเคลื่อนไหว (motion)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "motion",
  "permission": "0110",
  "settings": {
    "motionInterval": {
      "type": "numeric",
      "permission": "11",
      "value": 300
    },
    "motionSensitivity": {
      "type": "numeric",
      "permission": "11",
      "value": 1000
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "motion": true // ผลการตรวจจับ **ประเภท:** Boolean. `true` หมายถึงตรวจพบ, `false` หมายถึงไม่พบ.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "motion": {
    "motion": true
  }
}
```

**การตรวจจับการรั่วไหลของน้ำ (water-leak)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "water-leak",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "waterLeak": true // ฟิลด์ `waterLeak` ระบุผลการตรวจจับปัจจุบัน **ประเภท:** Boolean. `true` หมายถึงตรวจพบ, `false` หมายถึงไม่พบ.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "water-leak": {
    "waterLeak": true
  }
}
```

**สวิตช์ตรวจจับหน้าต่าง (window-detection)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "window-detection",
  "permission": "1100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "powerState": "on" // ฟิลด์ `powerState` ระบุสถานะพลังงาน **ประเภท:** String. `on` หมายถึงเปิด, `off` หมายถึงปิด.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "window-detection": {
    "powerState": "on"
  }
}
```

**สวิตช์ล็อกสำหรับเด็ก (child-lock)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "child-lock",
  "permission": "1100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "powerState": "on" // ฟิลด์ `powerState` ระบุสถานะพลังงาน **ประเภท:** String. `on` หมายถึงเปิด, `off` หมายถึงปิด.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "child-lock": {
    "powerState": "on"
  }
}
```

**สวิตช์ป้องกันการเป่าตรง (anti-direct-blow)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "anti-direct-blow",
  "permission": "1100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "powerState": "on" // ฟิลด์ `powerState` ระบุสถานะพลังงาน **ประเภท:** String. `on` หมายถึงเปิด, `off` หมายถึงปิด.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "anti-direct-blow": {
    "powerState": "on"
  }
}
```

**สวิตช์สวิงแนวนอน (horizontal-swing)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "horizontal-swing",
  "permission": "1100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "powerState": "on" // ฟิลด์ `powerState` ระบุสถานะพลังงาน **ประเภท:** String. `on` หมายถึงเปิด, `off` หมายถึงปิด.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "horizontal-swing": {
    "powerState": "on"
  }
}
```

**สวิตช์สวิงแนวตั้ง (vertical-swing)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "vertical-swing",
  "permission": "1100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "powerState": "on" // ฟิลด์ `powerState` ระบุสถานะพลังงาน **ประเภท:** String. `on` หมายถึงเปิด, `off` หมายถึงปิด.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "vertical-swing": {
    "powerState": "on"
  }
}
```

**สวิตช์โหมดประหยัดพลังงาน (eco)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "eco",
  "permission": "1100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "powerState": "on" // ฟิลด์ `powerState` ระบุสถานะพลังงาน **ประเภท:** String. `on` หมายถึงเปิด, `off` หมายถึงปิด.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "eco": {
    "powerState": "on"
  }
}
```

**สลับการเริ่มต้น (toggle-startup)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "toggle-startup",
  "permission": "1100",
  "name": "1" // ฟิลด์ `name` ระบุชื่อแอตทริบิวต์สำหรับ `toggle-startup`. **ประเภท:** String. อนุญาตตัวอักษรและตัวเลขเท่านั้น.
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "startup": "on" // **ประเภท:** String. ตัวเลือก: `on` (เปิด), `stay` (คงสถานะ), `off` (ปิด).
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "toggle-startup": {
    "1": {
      "startup": "on"
    },
    "2": {
      "startup": "off"
    }
  }
}
```

**ตรวจจับการถือค้าง (detect-hold)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "detect-hold",
  "permission": "0100",
  "settings": {
    "detectHoldEnable": { // การตั้งค่าเปิดใช้งานตรวจจับการถือค้าง
      "permission": "01",
      "type": "boolean",
      "value": false
    },
    "detectHoldSwitch": { // การตั้งค่าการกระทำตรวจจับการถือค้าง
      "type": "enum",
      "permission": "01",
      "value": "on",
      "values": ["on", "off"]
    },
    "detectHoldTime": { // การตั้งค่าเวลาการถือค้างในการตรวจจับ
      "type": "numeric",
      "permission": "01",
      "min": 1,
      "max": 359,
      "value": 5,
      "unit": "minute"
    }
  }
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "detectHold": "on" // ฟิลด์ `detectHold` ระบุสถานะการถือค้างการตรวจจับ **ประเภท:** String. `on` หมายถึงเปิดการถือค้าง, `off` หมายถึงปิดการถือค้าง.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "detect-hold": {
    "detectHold": "on"
  }
}
```

**สลับระบุ/กระตุ้น (toggle-identify)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "toggle-identify",
  "permission": "1100", // หมายเหตุ: ความสามารถนี้ไม่ได้ใช้สำหรับการรายงานในเวอร์ชันปัจจุบัน (V1.13.7) บน ihost.
  "name": "1" // ชื่อคอมโพเนนต์. **ประเภท:** String. ค่าตัวเลือก: "1" (ช่อง 1), "2" (ช่อง 2), "3" (ช่อง 3), "4" (ช่อง 4).
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "identify": true, // ระบุว่าอุปกรณ์ได้รายงานการระบุหรือตื่นตัวโดยแอ็กทีฟแล้ว.
  "countdown": 180 // ฟิลด์ `countdown` ระบุระยะเวลาการกระตุ้น **ประเภท:** Number. หน่วย: วินาที.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "toggle-identify": {
    "1": {
      "countdown": 180 // กระตุ้นอุปกรณ์เป็นเวลา 180 วินาที.
    }
  }
}

// อุปกรณ์รายงานการกระตุ้นตัวเอง
{
  "toggle-identify": {
    "1": {
      "identify": true
    }
  }
}
```

**สลับการตรวจจับแรงดันไฟฟ้า (toggle-voltage)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "toggle-voltage",
  "permission": "1100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "voltage": 230 // ฟิลด์ `voltage` ระบุแรงดันที่ตรวจจับ **ประเภท:** Number. หน่วย: โวลต์.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "toggle-voltage": {
    "voltage": 230
  }
}
```

**การตรวจจับกระแสไฟฟ้าย่อย (toggle-electric-current)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "toggle-electric-current",
    "permission": "0100",
    "name": "1" // ชื่อคอมโพเนนต์. **ประเภท:** String. ค่าตัวเลือก: "1" (ช่อง 1), "2" (ช่อง 2), "3" (ช่อง 3), "4" (ช่อง 4).
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "electricCurrent": 50 // ฟิลด์ `electricCurrent` แสดงค่าสมรรถนะของกระแสไฟฟ้า **หน่วย:** 0.01 A. **ประเภท:** Integer. ค่าต้องมากกว่าหรือเท่ากับ 0.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "toggle-electric-current": {
    "1": {
      "electricCurrent": 50
    }
  }
}
```

**การตรวจจับกำลังไฟฟ้าย่อย (toggle-electric-power)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "toggle-electric-power",
    "permission": "0100",
    "name": "1" // ชื่อคอมโพเนนต์. **ประเภท:** String. ค่าตัวเลือก: "1" (ช่อง 1), "2" (ช่อง 2), "3" (ช่อง 3), "4" (ช่อง 4).
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "electricPower": 50, // ฟิลด์ `electricPower` แสดงค่ากำลังปัจจุบัน **หน่วย:** 0.01 W. **ประเภท:** Integer. ค่าต้องมากกว่าหรือเท่ากับ 0.
  "reactivePower": 50, // ฟิลด์ `reactivePower` แสดงค่ากำลังปฏิกิริยาปัจจุบัน **หน่วย:** 0.01 W. **ประเภท:** Integer. เป็นค่าเพิ่มเติมได้.
  "activePower": 50, // ฟิลด์ `activePower` แสดงค่ากำลังใช้งานปัจจุบัน **หน่วย:** 0.01 W. **ประเภท:** Integer. เป็นค่าเพิ่มเติมได้.
  "apparentPower": 50 // ฟิลด์ `apparentPower` แสดงค่ากำลังปรากฏปัจจุบัน **หน่วย:** 0.01 W. **ประเภท:** Integer. เป็นค่าเพิ่มเติมได้.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "toggle-electric-power": {
    "1": {
      "electricPower": 50,
      "reactivePower": 50,
      "activePower": 50,
      "apparentPower": 50
    }
  }
}
```

**สถิติการใช้พลังงานย่อย (toggle-power-consumption)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "toggle-power-consumption",
    "permission": "1101",
    "name": "1", // ชื่อคอมโพเนนต์. **ประเภท:** String. ค่าตัวเลือก: "1" (ช่อง 1), "2" (ช่อง 2), "3" (ช่อง 3), "4" (ช่อง 4).
    "settings": {
      "resolution": {
        "permission": "01",
        "type": "numeric",
        "value": 3600
      },
      "timeZoneOffset": {
        "permission": "01",
        "type": "numeric",
        "min": -12,
        "max": 14,
        "value": 0
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

เริ่ม/หยุด สถิติเรียลไทม์:

```
{
  "rlSummarize": true, // เริ่มหรือหยุดการสถิติเรียลไทม์ **ประเภท:** Boolean. จำเป็นต้องมี.
  "timeRange": { // ช่วงเวลาสรุปข้อมูล. จำเป็นต้องมี.
    "start": "2020-07-05T08:00:00Z", // เวลาจุดเริ่มต้นของการใช้พลังงาน. **ประเภท:** String. จำเป็นต้องมี.
    "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุดของการใช้พลังงาน. **ประเภท:** String. จำเป็นต้องมี.
  }
}
```

การสอบถามการใช้พลังงานตามช่วงเวลา:

```
{
  "type": "summarize", // ประเภทการสรุป **ประเภท:** String. จำเป็นต้องมี. ตัวเลือก: "rlSummarize" (สรุปเรียลไทม์), "summarize" (สรุปปัจจุบัน).
  "timeRange": { // ช่วงเวลาสรุปข้อมูล, จำเป็นเมื่อ type เป็น "summarize".
    "start": "2020-07-05T08:00:00Z", // เวลาจุดเริ่มต้นของการใช้พลังงาน. **ประเภท:** String. จำเป็นต้องมี.
    "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุดของการใช้พลังงาน. **ประเภท:** String. ตัวเลือก. หากไม่ระบุ จะใช้เวลาปัจจุบันเป็นค่าเริ่มต้น.
  }
}
```

การตอบกลับสำหรับการใช้พลังงานภายในช่วงเวลา:

```
{
  "type": "summarize", // ประเภทการสรุป **ประเภท:** String. จำเป็นต้องมี.
  "rlSummarize": 50.0, // ยอดรวมการใช้พลังงาน **หน่วย:** 0.01 kWh. **ประเภท:** Number. เป็นค่าตัวเลือก.
  "electricityIntervals": [ // แบ่งตาม `configuration.resolution` เป็นหลายระเบียน. เป็นค่าตัวเลือก. จะไม่มีเมื่อ type เป็น "rlSummarize".
    {
      "usage": 26.5, // การใช้พลังงาน **หน่วย:** 0.01 kWh. **ประเภท:** Number. จำเป็นต้องมี.
      "start": "2020-07-05T08:00:00Z", // เวลาจุดเริ่มต้น. **ประเภท:** String. จำเป็นต้องมี.
      "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุด. **ประเภท:** String. จำเป็นต้องมี. ระเบียนที่มีช่วงเวลาสั้นกว่าความละเอียดถือว่าไม่ถูกต้อง.
    },
    {
      "usage": 26.5, // การใช้พลังงาน **หน่วย:** 0.01 kWh. **ประเภท:** Number. จำเป็นต้องมี.
      "start": "2020-07-05T09:00:00Z", // เวลาจุดเริ่มต้น. **ประเภท:** String. จำเป็นต้องมี.
      "end": "2020-07-05T10:00:00Z" // เวลาสิ้นสุด. **ประเภท:** String. จำเป็นต้องมี. ระเบียนที่มีช่วงเวลาสั้นกว่าความละเอียดถือว่าไม่ถูกต้อง.
    }
  ]
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

เริ่มสถิติเรียลไทม์:

```
{
  "toggle-power-consumption": {
    "1": {
      "rlSummarize": true,
      "timeRange": {
        "start": "2020-07-05T08:00:00Z",
        "end": ""
      }
    }
  }
}
```

หยุดสถิติเรียลไทม์:

```
{
  "toggle-power-consumption": {
    "1": {
      "rlSummarize": false,
      "timeRange": {
        "start": "2020-07-05T08:00:00Z",
        "end": "2020-07-05T09:00:00Z"
      }
    }
  }
}
```

รับการใช้พลังงานย้อนหลัง:

```
{
  "toggle-power-consumption": {
    "1": {
      "type": "summarize",
      "timeRange": {
        "start": "2020-07-05T08:00:00Z",
        "end": "2020-07-05T09:00:00Z"
      }
    }
  }
}
```

รับการใช้พลังงานแบบเรียลไทม์:

```
{
  "toggle-power-consumption": {
    "1": {
      "type": "rlSummarize"
    }
  }
}
```

**ตัวชี้วัดคุณภาพลิงก์ (lqi)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "lqi",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "lqi": 60 // ฟิลด์ `lqi` แสดงตัวชี้วัดคุณภาพลิงก์ **ประเภท:** Number. ช่วงค่า: 0 ถึง 255.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "lqi": {
    "lqi": 60
  }
}
```

**การกำหนดค่าฟังก์ชัน (configuration)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "configuration",
    "permission": "1100"
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "deviceConfiguration": { // การกำหนดค่าฟังก์ชันที่เกี่ยวข้องกับอุปกรณ์
    "defaultResolution": 300, // ความละเอียดเริ่มต้นสำหรับการอ่านข้อมูลความชุ่มชื้น **ประเภท:** Integer. **หน่วย:** วินาที. จำเป็นต้องมี.
    "maxResolution": 86400, // ความละเอียดสูงสุดสำหรับการอ่านข้อมูลความชุ่มชื้น **ประเภท:** Integer. **หน่วย:** วินาที. จำเป็นต้องมี.
    "minResolution": 60 // ความละเอียดต่ำสุดสำหรับการอ่านข้อมูลความชุ่มชื้น **ประเภท:** Integer. **หน่วย:** วินาที. จำเป็นต้องมี.
  }
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "configuration": {
    "deviceConfiguration": { // การกำหนดค่าฟังก์ชันที่เกี่ยวข้องกับอุปกรณ์
      "defaultResolution": 300, // ความละเอียดเริ่มต้นสำหรับการอ่านข้อมูลความชุ่มชื้น **ประเภท:** Integer. **หน่วย:** วินาที. จำเป็นต้องมี.
      "maxResolution": 86400, // ความละเอียดสูงสุดสำหรับการอ่านข้อมูลความชุ่มชื้น **ประเภท:** Integer. **หน่วย:** วินาที. จำเป็นต้องมี.
      "minResolution": 60 // ความละเอียดต่ำสุดสำหรับการอ่านข้อมูลความชุ่มชื้น **ประเภท:** Integer. **หน่วย:** วินาที. จำเป็นต้องมี.
    }
  }
}
```

**ระบบ (system)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "system",
    "permission": "1000"
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "restart": true // คำสั่งรีสตาร์ทอุปกรณ์ **ประเภท:** Boolean. จำเป็นต้องมี. ค่าต้องเป็น `true`.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "system": { // การกำหนดค่าที่เกี่ยวข้องกับความสามารถ. เป็นค่าตัวเลือก.
    "restart": true
  }
}
```

**ความชื้น (moisture)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "moisture",
    "permission": "0100"
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "moisture": 55.5 // ฟิลด์ `moisture` แสดงค่าร้อยละความชุ่มชื้น **ประเภท:** Number. จำเป็นต้องมี. ช่วง: 0 ถึง 100.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "moisture": {
    "moisture": 55.5
  }
}
```

**ความกดอากาศ (barometric-pressure)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "barometric-pressure",
    "permission": "0100",
    "settings": {
      "barometricPressureRange": {
        "type": "numeric",
        "permission": "01",
        "min": 540, // ค่าต่ำสุด. **ประเภท:** Integer. จำเป็นต้องมี. ต้องน้อยกว่า `max`.
        "max": 1100 // ค่าสูงสุด. **ประเภท:** Integer. จำเป็นต้องมี. ต้องมากกว่า `min`.
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "barometricPressure": 50 // ค่าความกดอากาศ. **ประเภท:** Integer. จำเป็นต้องมี. **หน่วย:** hPa.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "barometric-pressure": {
    "barometricPressure": 50
  }
}
```

**ความเร็วลม (wind-speed)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "wind-speed",
    "permission": "0100",
    "settings": {
      "windSpeedRange": {
        "type": "numeric",
        "permission": "01",
        "min": 0, // ค่าต่ำสุด. **ประเภท:** Number. จำเป็นต้องมี. ต้องน้อยกว่า `max`.
        "max": 50 // ค่าสูงสุด. **ประเภท:** Number. จำเป็นต้องมี. ต้องมากกว่า `min`.
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "windSpeed": 50 // ค่าความเร็วลม. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** m/s (เมตรต่อวินาที).
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "wind-speed": {
    "windSpeed": 50
  }
}
```

**ทิศทางลม (wind-direction)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "wind-direction",
    "permission": "0100"
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "windDirection": 10 // ทิศทางลม. **ประเภท:** Integer. จำเป็นต้องมี. **หน่วย:** องศา. ช่วง: 0 ถึง 360 องศา (ตามเข็มนาฬิกา).
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "wind-direction": {
    "windDirection": 10
  }
}
```

**ปริมาณฝน (rainfall)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "rainfall",
    "permission": "0100",
    "settings": {
      "rainfallRange": {
        "type": "numeric",
        "permission": "01",
        "min": 0, // ค่าต่ำสุด. **ประเภท:** Number. จำเป็นต้องมี. ต้องน้อยกว่า `max`.
        "max": 450 // ค่าสูงสุด. **ประเภท:** Number. จำเป็นต้องมี. ต้องมากกว่า `min`.
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "rainfall": 11.11 // ค่าปริมาณฝน. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** mm/h (มิลลิเมตรต่อชั่วโมง).
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "rainfall": {
    "rainfall": 11.11
  }
}
```

**ดัชนีอัลตราไวโอเลต (ultraviolet-index)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "ultraviolet-index",
    "permission": "0100",
    "settings": {
      "ultravioletIndexRange": {
        "type": "numeric",
        "permission": "01",
        "min": 0, // ค่าต่ำสุด. **ประเภท:** Number. จำเป็นต้องมี. ต้องน้อยกว่า `max`.
        "max": 16 // ค่าสูงสุด. **ประเภท:** Number. จำเป็นต้องมี. ต้องมากกว่า `min`.
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "ultravioletIndex": 11.1 // ดัชนีอัลตราไวโอเลต. **ประเภท:** Number. จำเป็นต้องมี.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "ultraviolet-index": {
    "ultravioletIndex": 11.1
  }
}
```

**ค่าการนำไฟฟ้าไฟฟ้า (electrical-conductivity)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "electrical-conductivity",
    "permission": "0100",
    "settings": {
      "electricalConductivityRange": {
        "type": "numeric",
        "permission": "01",
        "min": 0, // ค่าต่ำสุด. **ประเภท:** Number. จำเป็นต้องมี. ต้องน้อยกว่า `max`.
        "max": 23 // ค่าสูงสุด. **ประเภท:** Number. จำเป็นต้องมี. ต้องมากกว่า `min`.
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "electricalConductivity": 11.11 // ค่าการนำไฟฟ้า. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** dS/m.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "electrical-conductivity": {
    "electricalConductivity": 11.11
  }
}
```

**กำลังส่งสัญญาณ (transmit-power)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "transmit-power",
    "permission": "1100"
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "transmitPower": 9 // ค่ากำลังส่งของอุปกรณ์. **ประเภท:** Integer. จำเป็นต้องมี. **หน่วย:** dBm.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "transmit-power": {
    "transmitPower": 9
  }
}
```

**การตรวจจับ PM2.5 (pm25)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "pm25",
    "permission": "0100"
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "pm25": 10 // ความเข้มข้น PM2.5 ในอากาศ. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** µg/m³.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "pm25": {
    "pm25": 10
  }
}
```

**ดัชนี VOC (voc-index)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "voc-index",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "vocIndex": 10 // ดัชนี VOC แสดงระดับมลพิษก๊าซที่เป็นอันตราย. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** µg/m³.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "voc-index": {
    "vocIndex": 10
  }
}
```

**การตรวจจับก๊าซธรรมชาติ (gas)**

**ตัวอย่างการประกาศความสามารถ:**

```
{
  "capability": "gas",
  "permission": "0100"
}
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "gas": true // ระบุว่าพบการรั่วไหลของก๊าซธรรมชาติหรือไม่. **ประเภท:** Boolean. จำเป็นต้องมี.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "gas": {
    "gas": true
  }
}
```

**สถานะการทำงานของการชลประทาน (irrigation/work-status)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "irrigation",
    "permission": "0101",
    "name": "work-status",
    "settings": {
      "volumeUnit": {
        "type": "enum",
        "permission": "01",
        "values": ["L"],
        "value": "L"
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "realTimeVolume": 20, // ปริมาตรการชลประทานแบบเรียลไทม์. **ประเภท:** Number. เป็นค่าตัวเลือก. **หน่วย:** L.
  "start": "2020-07-05T08:00:00Z", // เวลาเริ่มต้นการชลประทาน. **ประเภท:** Date. เป็นค่าตัวเลือก.
  "end": "2020-07-05T09:00:00Z", // เวลาสิ้นสุดการชลประทาน. **ประเภท:** Date. เป็นค่าตัวเลือก.
  "dailyVolume": 20 // ปริมาตรการชลประทานต่อวัน. **ประเภท:** Number. เป็นค่าตัวเลือก. **หน่วย:** L.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

การรายงานสถานะการทำงาน:

```
{
  "irrigation": {
    "work-status": {
      "realTimeVolume": 20,
      "start": "2020-07-05T08:00:00Z",
      "end": "2020-07-05T09:00:00Z",
      "dailyVolume": 20
    }  
  }
}
```

การสืบค้นสถานะการทำงาน:

```
{
  "irrigation": {
    "type": "oneDay", // ประเภทการรวมข้อมูล. **ประเภท:** String. จำเป็นต้องมี. ตัวเลือก: "oneDay", "30Days", "180Days".
    "timeRange": { // ช่วงเวลาสำหรับการรวมข้อมูล. **ประเภท:** Object. จำเป็นต้องมี.
      "start": "2020-07-05T08:00:00Z", // เวลาเริ่มต้นสำหรับการรวมข้อมูลการชลประทาน. **ประเภท:** String. จำเป็นต้องมี.
      "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุดสำหรับการรวมข้อมูลการชลประทาน. **ประเภท:** String. เป็นค่าตัวเลือก. หากละไว้ จะใช้เวลาปัจจุบัน.
    }
  }
}
```

ผลการสืบค้นสถานะการทำงาน:

```
{
  "irrigation": {
    "type": "oneDay", // ประเภทการรวมข้อมูล. **ประเภท:** String. จำเป็นต้องมี.
    "irrigationIntervals": [
      {
        "volume": 6500, // ปริมาตรการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** L.
        "duration": 30, // ระยะเวลาการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** นาที.
        "start": "2020-07-05T08:00:00Z", // เวลาจุดเริ่มต้น. **ประเภท:** String. จำเป็นต้องมี.
        "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุด. **ประเภท:** String. จำเป็นต้องมี.
      },
      {
        "volume": 6500, // ปริมาตรการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** L.
        "duration": 30, // ระยะเวลาการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี. **หน่วย:** นาที.
        "start": "2020-07-05T08:00:00Z", // เวลาจุดเริ่มต้น. **ประเภท:** String. จำเป็นต้องมี.
        "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุด. **ประเภท:** String. จำเป็นต้องมี.
      }
    ]
  }
}
```

**โหมดการทำงานการชลประทาน (irrigation/work-mode)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "irrigation",
    "permission": "0100",
    "name": "work-mode",
    "settings": {
      "supportedModes": {
        "type": "enum",
        "permission": "01",
        "values": [
          "MANUAL", // โหมดแมนนวล
          "TIMER", // การตั้งเวลาหนึ่งครั้ง
          "CYCLE-TIMER", // การตั้งเวลาซ้ำ
          "VOLUME", // ปริมาตรครั้งเดียว
          "CYCLE-VOLUME" // ปริมาตรซ้ำ
        ]
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

```
{
  "workMode": "MANUAL" // โหมดการทำงานการชลประทาน. **ประเภท:** String. เป็นค่าตัวเลือก. ค่าควรมาจาก `settings.supportedModes`.
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

```
{
  "irrigation": {
    "work-mode": "MANUAL"
  }
}
```

**ตัวควบคุมการชลประทานอัตโนมัติ (irrigation/auto-controller)**

**ตัวอย่างการประกาศความสามารถ:**

```
[
  {
    "capability": "irrigation",
    "permission": "1100",
    "name": "auto-controller",
    "settings": {
      "volumeRange": { // ช่วงปริมาตร
        "type": "enum",
        "permission": "01",
        "min": 0,
        "max": 6500,
        "unit": "L"
      },
      "timeRange": { // ช่วงเวลา
        "type": "enum",
        "permission": "01",
        "min": 1,
        "max": 86400,
        "unit": "second"
      },
      "cycleCountRange": { // ช่วงจำนวนรอบ
        "type": "enum",
        "permission": "01",
        "min": 1,
        "max": 100,
        "step": 1
      }
    }
  }
]
```

**แอตทริบิวต์ (สถานะ):**

การตั้งเวลาแบบครั้งเดียวหรือแบบซ้ำ:

```
{
  "type": "time", // โหมดการชลประทาน. **ประเภท:** String. จำเป็นต้องมี. ตัวเลือก: "volume", "time".
  "action": {
    "perDuration": 60, // ระยะเวลาต่อรอบการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี.
    "intervalDuration": 20, // ระยะเวลาช่วงพักระหว่างรอบการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี.
    "count": 3 // จำนวนรอบการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี.
  }
}
```

การตั้งค่าปริมาตรแบบครั้งเดียวหรือแบบซ้ำ:

```
{
  "type": "volume", // โหมดการชลประทาน. **ประเภท:** String. จำเป็นต้องมี. ตัวเลือก: "volume", "time".
  "action": {
    "perConsumedVolume": 60, // ปริมาตรที่ใช้ต่อรอบการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี.
    "intervalDuration": 20, // ระยะเวลาช่วงพักระหว่างรอบการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี.
    "count": 3 // จำนวนรอบการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี.
  }
}
```

**โปรโตคอล (คำสั่งสอบสถานะและควบคุม):**

การตั้งเวลาแบบครั้งเดียวหรือแบบซ้ำ:

```
{
  "irrigation": {
    "auto-controller": {
      "type": "time", // โหมดการชลประทาน. **ประเภท:** String. จำเป็นต้องมี.
      "action": {
        "perDuration": 60, // ระยะเวลาต่อรอบการชลประทาน. **ประเภท:** Number. จำเป็นต้องมี.
        "intervalDuration": 20, // ระยะเวลาช่วงพักระหว่างรอบ. **ประเภท:** Number. จำเป็นต้องมี.
        "count": 3 // จำนวนรอบ. **ประเภท:** Number. จำเป็นต้องมี.
      }
    }
  }
}
```

การตั้งค่าปริมาตรแบบครั้งเดียวหรือแบบซ้ำ:

```
{
  "irrigation": {
    "auto-controller": {
      "type": "volume", // โหมดการชลประทาน. **ประเภท:** String. จำเป็นต้องมี.
      "action": {
        "perConsumedVolume": 60, // ปริมาตรที่ใช้ต่อรอบ. **ประเภท:** Number. จำเป็นต้องมี.
        "intervalDuration": 20, // ระยะเวลาช่วงพักระหว่างรอบ. **ประเภท:** Number. จำเป็นต้องมี.
        "count": 3 // จำนวนรอบ. **ประเภท:** Number. จำเป็นต้องมี.
      }
    }
  }
}
```

**โหมดตั้งค่าล่วงหน้าที่รองรับ**

| \*\*ชื่อโหมด \*\*                                   | \*\*ค่าตัวเลือก \*\* |
| --------------------------------------------------- | -------------------- |
| fanLevel (ระดับพัดลม)                               | "low"                |
| "medium"                                            |                      |
| "high"                                              |                      |
| thermostatMode (โหมดเทอร์โมสตัท)                    | "auto"               |
| "manual"                                            |                      |
| airConditionerMode >= 1.11.0 (โหมดเครื่องปรับอากาศ) | "cool"               |
| "heat"                                              |                      |
| "auto"                                              |                      |
| "fan"                                               |                      |
| "dry"                                               |                      |
| fanMode >= 1.11.0 (โหมดพัดลม)                       | "normal"             |
| "sleep"                                             |                      |
| "child"                                             |                      |
| horizontalAngle >= 1.11.0 (มุมแนวนอน)               | "30"                 |
| "60"                                                |                      |
| "90"                                                |                      |
| "120"                                               |                      |
| "180"                                               |                      |
| "360"                                               |                      |
| verticalAngle >= 1.11.0 (มุมแนวตั้ง)                | "30"                 |
| "60"                                                |                      |
| "90"                                                |                      |
| "120"                                               |                      |
| "180"                                               |                      |
| "360"                                               |                      |

#### ค. คำอธิบายแท็ก

* คีย์พิเศษ toggle ใช้เพื่อกำหนดชื่อของซับคอมโพเนนต์ toggle.

```
{
    "toggle": {
        '1': 'ช่อง1',
        '2': 'ช่อง2',
        '3': 'ช่อง3',
        '4': 'ช่อง4',
    },
}
```

* คีย์พิเศษ temperature\_unit ใช้เพื่อกำหนดหน่วยอุณหภูมิ.

```
{
    "temperature_unit":'c' // c-เซลเซียส; f-ฟาเรนไฮต์
}
```

#### ง. รหัสข้อผิดพลาดพิเศษและคำอธิบาย

| **รหัสข้อผิดพลาด** | **คำอธิบาย**                                           | iHost เวอร์ชัน |
| ------------------ | ------------------------------------------------------ | -------------- |
| 110000             | ซับอุปกรณ์/กลุ่มที่ตรงกับ id ไม่มีอยู่                 | ≥2.1.0         |
| 110001             | เกตเวย์อยู่ในสถานะกำลังค้นหาอุปกรณ์ zigbee             | ≥2.1.0         |
| 110002             | อุปกรณ์ในกลุ่มไม่มีความสามารถร่วมกัน                   | ≥2.1.0         |
| 110003             | จำนวนอุปกรณ์ไม่ถูกต้อง                                 | ≥2.1.0         |
| 110004             | จำนวนกลุ่มไม่ถูกต้อง                                   | ≥2.1.0         |
| 110005             | อุปกรณ์ออฟไลน์                                         | ≥2.1.0         |
| 110006             | อัปเดตสถานะอุปกรณ์ล้มเหลว                              | ≥2.1.0         |
| 110007             | อัปเดตสถานะกลุ่มล้มเหลว                                | ≥2.1.0         |
| 110008             | ถึงจำนวนกลุ่มสูงสุดแล้ว สร้างได้สูงสุด 50 กลุ่ม        | ≥2.1.0         |
| 110009             | ที่อยู่ IP ของอุปกรณ์กล้องไม่ถูกต้อง                   | ≥2.1.0         |
| 110010             | ข้อผิดพลาดการอนุญาตการเข้าถึงอุปกรณ์กล้อง              | ≥2.1.0         |
| 110011             | ที่อยู่สตรีมของอุปกรณ์กล้องผิด                         | ≥2.1.0         |
| 110012             | การเข้ารหัสวิดีโอของอุปกรณ์กล้องไม่รองรับ              | ≥2.1.0         |
| 110013             | อุปกรณ์มีอยู่แล้ว                                      | ≥2.1.0         |
| 110014             | กล้องไม่รองรับการทำงานแบบออฟไลน์                       | ≥2.1.0         |
| 110015             | รหัสผ่านบัญชีไม่ตรงกับรหัสผ่านบัญชีในที่อยู่สตรีม RTSP | ≥2.1.0         |
| 110016             | เกตเวย์อยู่ในสถานะกำลังค้นหากล้อง onvif                | ≥2.1.0         |
| 110017             | เพิ่มจำนวนกล้องเกินขีดจำกัดสูงสุด                      | ≥2.1.0         |
| 110018             | เส้นทางของกล้อง ESP ผิด                                | ≥2.1.0         |
| 110019             | เข้าถึงที่อยู่บริการของอุปกรณ์บุคคลที่สามล้มเหลว       | ≥2.1.0         |

#### จ. ค้นหาซับอุปกรณ์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตเปิดหรือปิดการค้นหาซับอุปกรณ์ของเกตเวย์ผ่านอินเทอร์เฟซนี้

* 💡หมายเหตุ: ขณะนี้รองรับการค้นหาซับอุปกรณ์ Zigbee เท่านั้น.
* 💡หมายเหตุ: ซับอุปกรณ์ Zigbee จะถูกเพิ่มโดยอัตโนมัติหลังการค้นหา ไม่จำเป็นต้องใช้หน้า "เพิ่มซับอุปกรณ์ด้วยตนเอง" :::tips
* **URL**：/open-api/V2/rest/devices/discovery
* **Method**: PUT
* **Header**：
  * Content-Type: application/json
  * Autorization: Bearer ::: Request parameters:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                           |
| ------------- | ---------- | ------------ | -------------------------------------- |
| เปิดใช้งาน    | boolean    | N            | true (เริ่มจับคู่); false (หยุดจับคู่) |
| type          | string     | N            | ประเภทการค้นหา: Zigbee                 |

การตอบกลับข้อมูลที่สำเร็จ: วัตถุว่าง {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\* `200 OK` ::: **ตัวอย่างการตอบกลับ**:

```
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### ฉ. เพิ่มซับอุปกรณ์ด้วยตนเอง

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตเพิ่ม **เดี่ยว** ซับอุปกรณ์ผ่านอินเทอร์เฟซนี้.

* หมายเหตุ: ขณะนี้รองรับเฉพาะกล้อง RTSP และกล้อง ESP32 เท่านั้น :::tips
* **URL**：/open-api/V2/rest/devices
* **Method**：POST
* **Header**：
  * Content-Type: application/json
  * Autorization: Bearer ::: Request parameters:

| **คุณลักษณะ**     | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**                                                                                         |
| ----------------- | ------------------- | ------------ | ---------------------------------------------------------------------------------------------------- |
| name              | string              | N            | ชื่อซับอุปกรณ์                                                                                       |
| display\_category | string              | N            | ประเภทอุปกรณ์. รองรับเฉพาะกล้องเท่านั้น。                                                             |
| capabilities      | CapabilityObject\[] | N            | รายการความสามารถ. เมื่อ display\_category = camera, capabilities จะรวมเฉพาะความสามารถ camera-stream. |
| protocal          | string              | N            | โปรโตคอลอุปกรณ์. RTSP; ESP32-CAM                                                                     |
| manufacturer      | string              | N            | ผู้ผลิต.                                                                                             |
| model             | string              | N            | รุ่นอุปกรณ์                                                                                          |
| firmware\_version | string              | N            | เวอร์ชันเฟิร์มแวร์ของอุปกรณ์                                                                         |

CapabilityObject

| **คุณลักษณะ** | **ประเภท**                      | **ทางเลือก** | **คำอธิบาย**                                         |
| ------------- | ------------------------------- | ------------ | ---------------------------------------------------- |
| capability    | string                          | N            | ชื่อความสามารถ. รองรับเฉพาะ "camera-stream" เท่านั้น |
| permission    | string                          | N            | สิทธิ์ของอุปกรณ์. รองรับเฉพาะการอ่านเท่านั้น.        |
| configuration | CameraStreamConfigurationObject | Y            | การกำหนดค่าสตรีมของกล้อง.                            |

SettingsObject

| **คุณลักษณะ** | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**           |
| ------------- | ------------------- | ------------ | ---------------------- |
| streamSetting | StreamSettingObject | N            | การกำหนดค่าบริการสตรีม |

StreamSettingObject

| **คุณลักษณะ** | **ประเภท**               | **ทางเลือก** | **คำอธิบาย**                                  |
| ------------- | ------------------------ | ------------ | --------------------------------------------- |
| type          | string                   | N            | การกำหนดค่าบริการสตรีม                        |
| permission    | string                   | N            | สิทธิความสามารถ. รองรับเฉพาะ "11" (แก้ไขได้). |
| value         | StreamSettingValueObject | N            | ค่าการกำหนดค่าเฉพาะ                           |

StreamSettingValueObject

| **คุณลักษณะ**                                                                                                                       | **ประเภท** | **ทางเลือก** | **คำอธิบาย**        |
| ----------------------------------------------------------------------------------------------------------------------------------- | ---------- | ------------ | ------------------- |
| stream\_url                                                                                                                         | string     | N            | รูปแบบ URL ของสตรีม |
| รูปแบบ:`<schema>://<hostname>:<port>/<username>:<password>@<service_path>`                                                          |            |              |                     |
| ตัวอย่าง:`rtsp://admin:123456@192.168.10.115:554/streaming/channel01`                                                               |            |              |                     |
| ตัวเลือก Schema:                                                                                                                    |            |              |                     |
| `rtsp` (Real-Time Streaming Protocol)                                                                                               |            |              |                     |
| `http` (Hypertext Transfer Protocol) — สำหรับอุปกรณ์ ESP32-CAM                                                                      |            |              |                     |
| \*หมายเหตุ: บางกล้องอาจไม่ต้องการชื่อผู้ใช้หรือรหัสผ่าน ในกรณีดังกล่าว สามารถละเว้น `<username>` และ `<password>` ฟิลด์จาก URL ได้. |            |              |                     |

การตอบกลับข้อมูลที่สำเร็จ:

| **คุณลักษณะ**  | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                  |
| -------------- | ---------- | ------------ | ----------------------------- |
| serial\_number | string     | N            | หมายเลขซีเรียลเฉพาะของอุปกรณ์ |

:::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```
{
  "error": 0,
  "data": {
    "serial_number": "serial_number"
  },
  "message": "success"
}
```

การตอบกลับข้อมูลล้มเหลว: Object ว่าง :::tips **เงื่อนไข**：

1. การเข้าถึงที่อยู่สตรีมของกล้องผิด (รูปแบบผิด, การอนุญาตล้มเหลว, ข้อยกเว้นเครือข่าย ฯลฯ)
2. อุปกรณ์มีอยู่แล้ว
3. หากอุปกรณ์เดียวเพิ่มล้มเหลว จะคืนค่าทั้งหมดว่าเพิ่มอุปกรณ์ล้มเหลว.

**รหัสสถานะ**: 200 OK **รหัสข้อผิดพลาด**： ● 110009 ที่อยู่ IP ของกล้องผิด ● 110010 การอนุญาตการเข้าถึงกล้องผิด ● 110011 ที่อยู่สตรีมของกล้องผิด ● 110012 การเข้ารหัสวิดีโอของกล้องไม่รองรับ ● 110013 อุปกรณ์มีอยู่แล้ว ::: **ตัวอย่างการตอบกลับ**:

```
{
  "error": 110009,
  "data": {},
  "message": "ไม่สามารถเข้าถึง IP ของกล้องได้" 
}
```

#### ฌ. ดึงรายการซับอุปกรณ์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตดึงรายการซับอุปกรณ์ของเกตเวย์ผ่านอินเทอร์เฟซนี้. :::tips

* **URL**：/open-api/V2/rest/devices
* **Method**: GET
* **Header**：
  * Content-Type: application/json
  * Autorization: Bearer ::: Request Parameters: none Successful data response:

| **คุณลักษณะ** | **ประเภท**              | **ทางเลือก** | **คำอธิบาย**  |
| ------------- | ----------------------- | ------------ | ------------- |
| device\_list  | ResponseDeviceObject\[] | N            | รายการอุปกรณ์ |

ResponseDeviceObject

| **คุณลักษณะ**         | **ประเภท**          | **ทางเลือก**                                       | **คำอธิบาย**                                                                                                                                                             |
| --------------------- | ------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| serial\_number        | string              | N                                                  | หมายเลขซีเรียลเฉพาะของอุปกรณ์                                                                                                                                            |
| third\_serial\_number | string              | "N" เมื่อเชื่อมต่ออุปกรณ์บุคคลที่สาม, มิฉะนั้น "Y" | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม                                                                                                                                 |
| service\_address      | string              | "N" เมื่อเชื่อมต่ออุปกรณ์บุคคลที่สาม, มิฉะนั้น "Y" | ที่อยู่บริการของบุคคลที่สาม                                                                                                                                              |
| name                  | string              | N                                                  | ชื่ออุปกรณ์ หากไม่ได้เปลี่ยนชื่อ จะถูกแสดงโดยส่วนหน้าตามกฎการแสดงผลเริ่มต้น.                                                                                             |
| manufacturer          | string              | N                                                  | ผู้ผลิต                                                                                                                                                                  |
| model                 | string              | N                                                  | รุ่นอุปกรณ์                                                                                                                                                              |
| firmware\_version     | string              | N                                                  | เวอร์ชันเฟิร์มแวร์. อาจเป็นสตริงว่างได้.                                                                                                                                 |
| hostname              | string              | Y                                                  | ชื่อโฮสต์ของอุปกรณ์                                                                                                                                                      |
| mac\_address          | string              | Y                                                  | ที่อยู่ MAC ของอุปกรณ์                                                                                                                                                   |
| app\_name             | string              | Y                                                  | ชื่อของแอปที่เป็นเจ้าของ หากเติม app\_name เมื่อขอรับใบรับรองอินเทอร์เฟซเปิด ทุกอุปกรณ์ที่เชื่อมต่อผ่านใบรับรองนั้นจะถูกเขียนลงในฟิลด์นี้ทั้งหมด.                        |
| display\_category     | string              | N                                                  | หมวดหมู่อุปกรณ์                                                                                                                                                          |
| capabilities          | CapabilityObject\[] | N                                                  | ความสามารถของอุปกรณ์                                                                                                                                                     |
| protocol              | string              | "N" เมื่อเชื่อมต่ออุปกรณ์บุคคลที่สาม, มิฉะนั้น "Y" | โปรโตคอลอุปกรณ์: zigbee, onvif, rtsp, esp32-cam                                                                                                                          |
| สถานะ                 | object              | Y                                                  | วัตถุสถานะอุปกรณ์ สำหรับตัวอย่างสถานะของความสามารถที่แตกต่างกัน โปรดตรวจสอบ 【Support Device Capabilities】                                                                |
| ป้ายกำกับ             | object              | Y                                                  | คู่คีย์-ค่าในรูปแบบ JSON ข้อมูลอุปกรณ์แบบกำหนดเอง ฟังก์ชันมีดังนี้:- ใช้เพื่อเก็บช่องของอุปกรณ์- ใช้เพื่อเก็บหน่วยอุณหภูมิ- ข้อมูลกำหนดเองสำหรับอุปกรณ์บุคคลที่สามอื่น ๆ |
| ออนไลน์               | boolean             | N                                                  | สถานะออนไลน์: True หมายถึงออนไลน์ False หมายถึงออฟไลน์                                                                                                                   |
| ซับเน็ต               | boolean             | Y                                                  | ว่าอยู่ในซับเน็ตเดียวกับเกตเวย์หรือไม่                                                                                                                                   |

CapabilityObject 💡หมายเหตุ: โปรดตรวจสอบตัวอย่างความสามารถของอุปกรณ์ที่รองรับใน \[Supported Device Capabilities].

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                             |
| ------------- | ---------- | ------------ | -------------------------------------------------------------------------------------------------------- |
| capability    | string     | N            | ชื่อความสามารถ สำหรับรายละเอียด ตรวจสอบ \[Supported Device Capabilities]                                 |
| permission    | string     | N            | สิทธิ์ความสามารถ ค่าที่เป็นไปได้คือ "read" (อ่านได้), "write" (เขียนได้), "readWrite" (อ่านและเขียนได้). |
| configuration | object     | Y            | ข้อมูลการกำหนดค่าความสามารถ ขณะนี้ใช้สำหรับ camera-stream โปรดตรวจสอบ \[Supported Device Capabilities]   |
| name          | string     | Y            | ฟิลด์ชื่อใน toggle หมายเลขซับ-ช่องที่ใช้ระบุอุปกรณ์หลายช่อง ตัวอย่างเช่น หาก name เป็น 1 หมายถึงช่อง 1   |

:::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```
{
  "error": 0,
  "data":{
    "device_list":  [
      {
        "serial_number": "ABCDEFGHIJK",
        "name": "อุปกรณ์ของฉัน",
        "manufacturer": "SONOFF",
        "model": "BASICZBR3",
        "firmware_version": "1.1.0",
        "display_category": "switch",
        "capabilities": [
          {
            "capability": "power",
            "permission": "readWrite"
          },
          {
            "capability": "rssi",
            "permission": "read"
          }
        ],
        "protocal": "zigbee",
        "state": {
          "power": {
            "powerState": "on"
          }
        },
        "tags": {
          "key": "value"
        },
        "online": true
      }
    ],
  }
  "message": "success"
}
```

#### h. อัปเดตข้อมูลหรือสถานะอุปกรณ์ที่ระบุ

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตแก้ไขข้อมูลพื้นฐานของซับ-อุปกรณ์และออกคำสั่งควบคุมผ่านอินเทอร์เฟซนี้ได้ :::tips

* **URL**：/open-api/V2/rest/devices/{serial\_number}
* **Method**：PUT
* **Header**：
  * Content-Type: application/json
  * Autorization: Bearer ::: Request parameters:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                               |
| ------------- | ---------- | ------------ | ---------------------------------------------------------------------------------------------------------- |
| name          | string     | Y            | ชื่ออุปกรณ์                                                                                                |
| ป้ายกำกับ     | object     | Y            | คู่คีย์-ค่าในรูปแบบ JSON ข้อมูลอุปกรณ์แบบกำหนดเอง                                                          |
| สถานะ         | object     | Y            | วัตถุสถานะอุปกรณ์ สำหรับตัวอย่างสถานะของความสามารถที่แตกต่างกัน โปรดตรวจสอบ \[Support Device Capabilities] |
| configuration | object     | Y            | ข้อมูลการกำหนดค่าความสามารถ ขณะนี้สามารถแก้ไขได้เฉพาะความสามารถ camera\_stream เท่านั้น                    |

การตอบกลับข้อมูลที่สำเร็จ: :::tips **เงื่อนไข**: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และการตรวจสอบตัวตนของผู้ใช้ผ่านแล้ว \*\*รหัสสถานะ: \*\*200 OK **รหัสข้อผิดพลาด**:

* 110000 ซับ-อุปกรณ์/กลุ่มที่สอดคล้องกับ id ไม่มีอยู่ ::: **ตัวอย่างการตอบกลับ**:

```
{
  "error": 0,
  "data":{
    "serial_number": "ABCDEFGHIJK",
    "third_serial_number": "third_serial_number",
    "name": "我的设备",
    "manufacturer": "SONOFF",
    "model": "BASICZBR3",
    "firmware_version": "1.1.0",
    "display_category": "switch",
    "capabilities": [
      {
        "capability": "power",
        "permission": "1100"
      },
      {
        "capability": "rssi",
        "permission": "0100"
      }
    ],
    "protocal": "zigbee",
    "state": {
      "power": {
        "powerState": "on"
      }
    },
    "tags": {
      "key": "value"
    },
    "online": true
  },
  "message": "success"
}
```

#### i. ลบซับ-อุปกรณ์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตลบซับ-อุปกรณ์ผ่านอินเทอร์เฟซนี้ได้ :::tips

* **URL**：/open-api/V2/rest/devices/{serial\_number}
* **Method**：DELETE
* **Header**：
  * Content-Type: application/json
  * การอนุญาต: Bearer ::: พารามิเตอร์คำขอ:

| **คุณลักษณะ** | **ประเภท**           | **ทางเลือก** | **คำอธิบาย**                                                                                                                    |
| ------------- | -------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------- |
| name          | string               | Y            | ชื่ออุปกรณ์                                                                                                                     |
| ป้ายกำกับ     | object               | Y            | คู่คีย์-ค่าในรูปแบบ JSON ใช้เพื่อเก็บชื่อช่องอุปกรณ์และข้อมูลอื่น ๆ ของซับ-อุปกรณ์                                              |
| สถานะ         | object               | Y            | เปลี่ยนสถานะอุปกรณ์; สำหรับรายละเอียดโปรโตคอลเฉพาะ ให้ดู "Supported Device Capabilities."                                       |
| capabilities  | CapabilityObject \[] | Y            | ข้อมูลการกำหนดค่าความสามารถ; ความสามารถทั้งหมดที่รองรับการตั้งค่าการกำหนดค่าสามารถแก้ไขได้ โปรดทราบว่าไม่สามารถเปลี่ยนสิทธิ์ได้ |

การตอบกลับข้อมูลที่สำเร็จ: :::tips **เงื่อนไข**: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และการตรวจสอบตัวตนของผู้ใช้ผ่านแล้ว \*\*รหัสสถานะ: \*\*200 OK **รหัสข้อผิดพลาด:**

* 110000: ซับ-อุปกรณ์/กลุ่มที่สอดคล้องกับ ID ไม่มีอยู่
* 110006: การอัปเดตสถานะอุปกรณ์ล้มเหลว
* 110019: การเข้าถึงที่อยู่บริการอุปกรณ์บุคคลที่สามล้มเหลว
* 110024: การอัปเดตการกำหนดค่าอุปกรณ์ล้มเหลว ::: **ตัวอย่างการตอบกลับ**:

```
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

```javascript
import axios from 'axios';

const serial_number = 'serial_number';
const access_token = 'access_token';

(async function main() {
  // เปิดอุปกรณ์
  await axios({
    url: `http://<domain name or ip address>/open-api/v2/rest/devices/${serial_number}`,
    method: 'PUT',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${access_token}`
    },
    data: {
      state: {
        power: {
          powerState: 'on'
        }
      }
    }
  });
})()
```

#### j. ลบซับ-อุปกรณ์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตลบซับ-อุปกรณ์ผ่านอินเทอร์เฟซนี้ได้\
:::tips

* **URL**：`/open-api/v2/rest/devices/{serial_number}`
* **Method**：`DELETE`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี การตอบกลับข้อมูลที่สำเร็จ: :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### k. สืบค้นสถานะอุปกรณ์

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตสืบค้นสถานะอุปกรณ์ผ่านอินเทอร์เฟซนี้ได้\
:::tips

* **URL**：`/open-api/v2/rest/devices/:serial_number/query-state/{capability}`
* **Method**：POST
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: Request parameters:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                             |
| ------------- | ---------- | ------------ | ---------------------------------------------------------------------------------------- |
| query\_state  | object     | N            | สืบค้นสถานะอุปกรณ์; สำหรับรายละเอียดโปรโตคอลเฉพาะ ให้ดู "Supported Device Capabilities." |

```javascript
import axios from 'axios';

const serial_number = 'serial_number';
const access_token = 'access_token';

(async function main() {
  // เปิดอุปกรณ์
  await axios({
    url: `http://<domain name or ip address>/open-api/v2/rest/devices/${serial_number}/query-state/power-consumption`,
    method: 'PUT',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${access_token}`
    },
    data: {
      "query_state":{
        "power-consumption":{
          "type": "summarize", // ประเภทของสถิติ จำเป็นต้องระบุ
          "timeRange": { // ช่วงเวลาสำหรับการสรุป จำเป็นเมื่อ type="summarize"
            "start": "2020-07-05T08:00:00Z", // เวลาเริ่มต้นสำหรับสถิติการใช้พลังงาน
            "end": "2020-07-05T09:00:00Z" // เวลาสิ้นสุดสำหรับสถิติการใช้พลังงาน; หากละไว้ จะใช้เวลาในปัจจุบันเป็นค่าเริ่มต้น
          }
        }
      }
    });
})()
```

การตอบกลับข้อมูลที่สำเร็จ: :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

### 3.4 การจัดการความปลอดภัย

#### a. รับรายการความปลอดภัย

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตแก้ไขการตั้งค่าเกตเวย์ผ่านอินเทอร์เฟซนี้ได้ :::tips

* **URL**：`/open-api/v2/rest/security`
* **Method**：`GET`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี การตอบกลับข้อมูลที่สำเร็จ:

| **คุณลักษณะ**  | **ประเภท**                | **ทางเลือก** | **คำอธิบาย**            |
| -------------- | ------------------------- | ------------ | ----------------------- |
| security\_list | ResponseSecurityObject\[] | N            | รายการอุปกรณ์ที่ตอบกลับ |

ResponseDeviceObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**      |
| ------------- | ---------- | ------------ | ----------------- |
| sid           | int        | N            | รหัสความปลอดภัย   |
| name          | string     | N            | ชื่อความปลอดภัย   |
| เปิดใช้งาน    | bool       | N            | เปิดใช้งานหรือไม่ |

* true เปิดใช้งาน
* false ปิดใช้งาน |

:::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {
    "security_list":[
      {
        "sid": 1,
        "name": "โหมดบ้าน",
        "enable": true
      }
    ]
  },
  "message": "success"
}
```

#### b. เปิดใช้งานโหมดความปลอดภัยที่ระบุ

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตเปิดใช้งานโหมดความปลอดภัยที่ระบุผ่านอินเทอร์เฟซนี้ได้\
:::tips

* **URL**：`/open-api/v2/rest/security/{security_id}/enable`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี การตอบกลับข้อมูลที่สำเร็จ: วัตถุว่าง {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### c. ปิดใช้งานโหมดความปลอดภัยที่ระบุ

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตปิดใช้งานโหมดความปลอดภัยที่ระบุผ่านอินเทอร์เฟซนี้ได้\
:::tips

* **URL**：`/open-api/v2/rest/security/{security_id}/disable`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี การตอบกลับข้อมูลที่สำเร็จ: วัตถุว่าง {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### d. เปิดการตั้งค่าความปลอดภัยด้วยคลิกเดียว

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตเปิดโหมดการตั้งค่าความปลอดภัยด้วยคลิกเดียวผ่านอินเทอร์เฟซนี้ได้\
:::tips

* **URL**：`/open-api/v2/rest/security/enable`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี การตอบกลับข้อมูลที่สำเร็จ: วัตถุว่าง {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

#### e. ปิดความปลอดภัย

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตปิดความปลอดภัยผ่านอินเทอร์เฟซนี้ได้\
:::tips

* **URL**：`/open-api/v2/rest/security/disable`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี การตอบกลับข้อมูลที่สำเร็จ: วัตถุว่าง {} :::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\*200 OK ::: **ตัวอย่างการตอบกลับ**:

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

## 4. การเข้าถึงอุปกรณ์บุคคลที่สาม

### 4.1 คำแนะนำการเข้าถึง

#### การเข้าถึงอุปกรณ์

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2Fg39SAJlx8k3kQ1NVFPVo%2Fimage.png?alt=media&#x26;token=83139d82-f24e-4e7c-9e75-5062e004b050" alt=""><figcaption></figcaption></figure>

#### การเข้าถึงเกตเวย์บุคคลที่สาม

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2FaZyatnl9w26YKRwSW8Xd%2Fimage.png?alt=media&#x26;token=8b595f5e-37a0-42cd-8cd6-35f92fe6a7be" alt=""><figcaption></figcaption></figure>

#### ขั้นตอนการเข้าถึง

1. กำหนดการจัดหมวดหมู่ของอุปกรณ์ในเกตเวย์ รายละเอียดโปรดตรวจสอบ \[Supported Device Type].
2. กำหนดความสามารถที่อุปกรณ์สามารถเข้าถึงได้ รายละเอียดโปรดตรวจสอบ \[Supported Device Capabilities].
3. ร้องขออินเทอร์เฟซ \[Discovery Request] เพื่อเพิ่มอุปกรณ์ไปยังเกตเวย์
   1. *ข้อควรระวัง: คุณต้องให้ที่อยู่บริการสำหรับรับคำสั่งที่เกตเวย์ออก ซึ่งใช้ในการรับคำสั่งควบคุมอุปกรณ์ที่เกตเวย์ออก*.
4. หากสถานะของอุปกรณ์บุคคลที่สามเปลี่ยนแปลง คุณต้องเรียกใช้อินเทอร์เฟซ \[Device States Change Report] เพื่อส่งสถานะล่าสุดกลับไปยังเกตเวย์
5. หลังจากเพิ่มแล้ว อุปกรณ์บุคคลที่สามจะปรากฏในรายการอุปกรณ์ โดยมีฟังก์ชันส่วนใหญ่ของเกตเวย์ (อุปกรณ์อื่นที่ไม่ใช่บุคคลที่สาม) สามารถใช้อินเทอร์เฟซเปิดที่เกี่ยวข้องกับอุปกรณ์ได้ตามปกติ

* เลือกหมวดหมู่อุปกรณ์ที่เหมาะสม การจัดหมวดหมู่จะส่งผลต่อผลลัพธ์การแสดง UI สุดท้ายหลังจากเชื่อมต่ออุปกรณ์กับเกตเวย์
* เลือกความสามารถของอุปกรณ์ที่ถูกต้อง รายการความสามารถจะกำหนดสถานะของโปรโตคอลสถานะอุปกรณ์

#### กระบวนการโปรแกรม

**a. การเข้าถึงอุปกรณ์**

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2FrwPAhV6PWyBrb8NyzcTw%2Fimage.png?alt=media&#x26;token=035de399-91a4-4525-a475-097823197c3b" alt=""><figcaption></figcaption></figure>

**b. การเข้าถึงเกตเวย์บุคคลที่สาม**

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2FwEPrDBpBKGBOAtL7KbI9%2Fimage.png?alt=media&#x26;token=1b170644-f9cc-47b3-91b8-6a3710f6afa1" alt=""><figcaption></figcaption></figure>

### 4.2 ตัวอย่างการเข้าถึง

#### สวิตช์, ปลั๊ก

**ซิงค์อุปกรณ์บุคคลที่สาม**

```
// คำขอ
URL：/open-api/v2/rest/thirdparty/event
Method：POST
Header：
  Content-Type: application/json
  การอนุญาต: Bearer  <token>
Body:
{
  "event": {
    "header": {
      "name": "DiscoveryRequest",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "2"
    },
    "payload": {
      "endpoints": [
        {
          "third_serial_number": "third_serial_number_1",
          "name": "ปลั๊กของฉัน",
          "display_category": "plug",
          "capabilities": [
            {
              "capability": "power",
              "permission": "1100"
            }
          ],
          "state": {
            "power": {
              "powerState": "on"
            }
          },
          "tags": {
            "key": "value"
          },
          "manufacturer": "manufacturer name",
          "model": "model name",
          "firmware_version": "เวอร์ชันเฟิร์มแวร์",
          "service_address": "http://192.168.31.14/webhook"
      	}
      ]
    }
  }
}
```

```
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {
    "endpoints": [
      {
        "third_serial_number": "third_serial_number",
        "serial_number": "serial number"
      }
    ]
  }
}
```

**รายงานสถานะอุปกรณ์**

```
URL：/open-api/V2/rest/thirdparty/event
Method：POST
Header：
  Content-Type: application/json
  การอนุญาต: Bearer  <token>
Body:

{
  "event": {
    "header": {
      "name": "DeviceStatesChangeReport",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "endpoint": {
      "serial_number": "serial_number"
    },
    "payload": {
       "state": {
        "power": {
          "powerState": "on"
        }
      }
    }
  }
}
```

```
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {}
}
```

**รายงานออฟไลน์/ออนไลน์**

```
{
  "event": {
    "header": {
      "name": "DeviceStatesChangeReport",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "endpoint": {
      "serial_number": "serial_number"
    },
    "payload": {
       "online": true
    }
  }
}
```

```
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {}
}
```

**รับคำสั่งเกี่ยวกับการควบคุมอุปกรณ์จากเกตเวย์**

```
URL：<service address>
Method：POST
Header：
  Content-Type: application/json
B

{
  "directive": {
    "header": {
      "name": "UpdateDeviceStates",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "endpoint": {
      "third_serial_number": "third_serial_number",
      "serial_number": "serial_number"
    },
    "payload": {
       "state": : {
         "power": {
           "powerState": "on"
         }
       }
    }
  }
}
```

```
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {}
}
```

**สืบค้นอุปกรณ์**

```
URL：/open-api/V2/rest/devices
Method：GET
Header：
  Content-Type: application/json
  การอนุญาต: Bearer  <token>
Body: ไม่มี
```

```
{
  "error": 0,
  "data": {
    "device_list": [
      {
        "serial_number": "serial number",
        "third_serial_number": "third_serial_number",
        "name": "ปลั๊กของฉัน",
        "manufacturer": "manufacturer name",
        "model": "model name",
        "firmware_version": "เวอร์ชันเฟิร์มแวร์",
        "display_category": "plug",
        "capabilities": [
          {
            "capability": "power",
            "permission": "readWrite"
          }
        ],
        "state": {
          "power": {
            "powerState": "on"
          }
        },
        "tags": {
          "key": "value"
        },
        "online": true
      }
    ]
  },
  "message": "success"
}
```

### 4.3 Web API

#### อินเทอร์เฟซเกตเวย์คำขอของบุคคลที่สาม

**รูปแบบคำขอ**

อนุญาตให้ผู้ใช้ที่ได้รับอนุญาตส่งคำขอเหตุการณ์ไปยังเกตเวย์ผ่านอินเทอร์เฟซนี้ได้ :::tips

* **URL**：/open-api/V2/rest/thirdparty/event
* **Method**：POST
* **Header**：
  * Content-Type: application/json
  * Autorization: Bearer ::: Request parameters:

| **คุณลักษณะ** | **ประเภท**  | **ทางเลือก** | **คำอธิบาย**                |
| ------------- | ----------- | ------------ | --------------------------- |
| event         | EventObject | N            | โครงสร้างวัตถุเหตุการณ์คำขอ |

EventObject

| **คุณลักษณะ** | **ประเภท**     | **ทางเลือก** | **คำอธิบาย**                                                                 |
| ------------- | -------------- | ------------ | ---------------------------------------------------------------------------- |
| header        | HeaderObject   | N            | โครงสร้างเฮดเดอร์คำขอ                                                        |
| endpoint      | EndpointObject | Y            | โครงสร้าง endpoint ของคำขอ หมายเหตุ: ฟิลด์นี้ว่างเมื่อซิงค์รายการอุปกรณ์ใหม่ |
| payload       | PayloadObject  | N            | โครงสร้างเพย์โหลดคำขอ                                                        |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                                                                                                     |
| ------------- | ---------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| name          | string     | N            | ชื่อคำขอ พารามิเตอร์ที่เลือกได้: DiscoveryRequest: ซิงค์อุปกรณ์ใหม่ DeviceStatesChangeReport: รายงานการอัปเดตสถานะอุปกรณ์ DeviceOnlineChangeReport: รายงานสถานะออนไลน์ของอุปกรณ์ |
| message\_id   | string     | N            | รหัสข้อความคำขอ, UUID\_V4                                                                                                                                                        |
| version       | string     | N            | หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดค่าเป็น 1                                                                                                                               |

EndpointObject

| **คุณลักษณะ**         | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                          |
| --------------------- | ---------- | ------------ | ----------------------------------------------------------------------------------------------------- |
| serial\_number        | string     | N            | หมายเลขซีเรียลเฉพาะของอุปกรณ์                                                                         |
| third\_serial\_number | string     | N            | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม                                                              |
| ป้ายกำกับ             | object     | Y            | คู่คีย์-ค่าในรูปแบบ JSON ข้อมูลอุปกรณ์แบบกำหนดเอง \[Device Management Function] - \[Tags Description] |

PayloadObject ตามค่า header.name ที่ต่างกันจะมีโครงสร้างคำขอที่แตกต่างกัน

**รูปแบบการตอบกลับ**

:::tips \*\*รหัสสถานะ: \*\*200 OK **พารามิเตอร์การตอบกลับ:** :::

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**                      |
| ------------- | ------------- | ------------ | --------------------------------- |
| header        | HeaderObject  | N            | ข้อมูลโครงสร้างเฮดเดอร์การตอบกลับ |
| payload       | PayloadObject | N            | ข้อมูลโครงสร้างเพย์โหลดการตอบกลับ |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                                                                                    |
| ------------- | ---------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| name          | string     | N            | ชื่อเฮดเดอร์การตอบกลับ พารามิเตอร์ที่เลือกได้: Response: การตอบกลับที่สำเร็จ ErrorResponse: การตอบกลับข้อผิดพลาด                                                |
| message\_id   | string     | N            | รหัสข้อความเฮดเดอร์การตอบกลับ, UUID\_V4 นำ message\_id ของเฮดเดอร์ข้อความคำขอใส่ที่นี่ \*หากพารามิเตอร์คำขอไม่มี message\_id ฟิลด์นี้จะเป็นสตริงว่างเมื่อคืนค่า |
| version       | string     | N            | - หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดเป็น 1.                                                                                                              |

> การตอบกลับที่สำเร็จ--PayloadObject ：

ขึ้นอยู่กับประเภทคำขอ โครงสร้างการตอบกลับจะแตกต่างกัน สำหรับรายละเอียด โปรดดูเอกสารคำแนะนำคำขอเฉพาะ

> การตอบกลับล้มเหลว--PayloadObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**      |
| ------------- | ---------- | ------------ | ----------------- |
| type          | string     | N            | ประเภทข้อผิดพลาด: |

* INVALID\_PARAMETERS: พารามิเตอร์ผิดพลาด
* AUTH\_FAILURE: ข้อผิดพลาดการอนุมัติ
* INTERNAL\_ERROR: ข้อผิดพลาดบริการภายใน | | description | string | N | คำอธิบายข้อผิดพลาด |

**DiscoveryRequest ซิงค์รายการอุปกรณ์ใหม่**

* หมายเหตุ: หลังจากอุปกรณ์ถูกซิงค์ไปยังเกตเวย์ จะออนไลน์โดยค่าเริ่มต้น คือ online=true การเปลี่ยนแปลงสถานะออนไลน์ในภายหลังขึ้นอยู่กับการซิงค์กับบุคคลที่สามผ่านอินเทอร์เฟซ DeviceOnlineChangeReport เท่านั้น

**พารามิเตอร์คำขอ:** EndpointObject\*\*：\*\*ไม่มี PayloadObject：

| **คุณลักษณะ** | **ประเภท**        | **ทางเลือก** | **คำอธิบาย**  |
| ------------- | ----------------- | ------------ | ------------- |
| endpoints     | EndpointObject\[] | N            | รายการอุปกรณ์ |

EndpointObject:

| **คุณลักษณะ**         | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**                                                                                                                                |
| --------------------- | ------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| third\_serial\_number | string              | N            | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม                                                                                                    |
| name                  | string              | N            | ชื่ออุปกรณ์                                                                                                                                 |
| display\_category     | string              | N            | ประเภทอุปกรณ์ ดูรายละเอียดได้ใน \[Supported Device Type] \*อุปกรณ์บุคคลที่สามยังไม่รองรับการเพิ่มกล้องในขณะนี้                              |
| capabilities          | CapabilityObject\[] | N            | รายการความสามารถ                                                                                                                            |
| สถานะ                 | object              | N            | ข้อมูลสถานะเริ่มต้น                                                                                                                         |
| manufacturer          | string              | N            | ผู้ผลิต                                                                                                                                     |
| model                 | string              | N            | รุ่นอุปกรณ์                                                                                                                                 |
| ป้ายกำกับ             | object              | Y            | คู่คีย์-ค่าในรูปแบบ JSON ข้อมูลอุปกรณ์แบบกำหนดเอง: ใช้เพื่อเก็บช่องของอุปกรณ์ ใช้เพื่อเก็บหน่วยอุณหภูมิ ข้อมูลกำหนดเองอื่น ๆ ของบุคคลที่สาม |
| firmware\_version     | string              | N            | เวอร์ชันเฟิร์มแวร์                                                                                                                          |
| service\_address      | string              | N            | ที่อยู่บริการ เช่น <http://192.168.31.14/service_address>                                                                                   |

ตัวอย่างคำขอ :

```
{
  "event": {
    "header": {
      "name": "DiscoveryRequest",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "payload": {
      "endpoints": [
        {
          "third_serial_number": "third_serial_number_1",
          "name": "ปลั๊กของฉัน",
          "display_category": "plug",
          "capabilities": [
            {
              "capability": "power",
              "permission" "readWrite"
            }
          ],
          "state": {
            "power": {
              "powerState": "on"
            }
          },
          "tags": {
            "key": "value"
          },
          "manufacturer": "manufacturer name",
          "model": "model name",
          "firmware_version": "เวอร์ชันเฟิร์มแวร์",
          "service_address": "http://192.168.31.14/service_address"
        }
      ]
    }
  }
}
```

**พารามิเตอร์การตอบกลับ:** PayloadObject：

| **คุณลักษณะ** | **ประเภท**        | **ทางเลือก** | **คำอธิบาย**  |
| ------------- | ----------------- | ------------ | ------------- |
| endpoints     | EndpointObject\[] | N            | รายการอุปกรณ์ |

EndpointObject:

| **คุณลักษณะ**         | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                             |
| --------------------- | ---------- | ------------ | ---------------------------------------- |
| serial\_number        | string     | N            | หมายเลขซีเรียลเฉพาะของอุปกรณ์            |
| third\_serial\_number | string     | N            | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม |

ตัวอย่างการตอบกลับที่ถูกต้อง:

```
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {
    "endpoints": [
      {
        "serial_number": "serial number",
        "third_serial_number": "third_serial_number"
      }
    ]
  }
}
```

ตัวอย่างการตอบกลับข้อผิดพลาด:

```
{
  "header": {
    "name": "ErrorResponse",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {
    "type": "INVALID_PARAMETERS",
    "description": "webhook cannot be empty" 
  }
}
```

**DeviceStatesChangeReport รายงานการเปลี่ยนแปลงสถานะอุปกรณ์**

* หมายเหตุ: การรายงานสถานะซ้ำอาจทำให้ฉากที่เกี่ยวข้องถูกทริกเกอร์ผิดพลาด

**พารามิเตอร์คำขอ:** PayloadObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                    |
| ------------- | ---------- | ------------ | --------------------------------------------------------------- |
| สถานะ         | object     | N            | สถานะอุปกรณ์ ดู \[Supported device cabilities] สำหรับรายละเอียด |

ตัวอย่างคำขอ :

```
{
  "event": {
    "header": {
      "name": "DeviceStatesChangeReport",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "2"
    },
    "endpoint": {
      "serial_number": "serial_number",
      "third_serial_number": "third_serial_number",
    },
    "payload": {
       "state": {
        "power": {
          "powerState": "on"
        }
      }
    }
  }
}
```

**พารามิเตอร์การตอบกลับ:** PayloadObject: วัตถุว่าง ตัวอย่างการตอบกลับที่สำเร็จ:

```
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {}
}
```

**DeviceOnlineChangeReport รายงานสถานะออนไลน์ของอุปกรณ์**

* หมายเหตุ: การรายงานสถานะซ้ำอาจทำให้ฉากที่เกี่ยวข้องถูกทริกเกอร์ผิดพลาด

**พารามิเตอร์คำขอ:** PayloadObject：

| **คุณลักษณะ**  | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                         |
| -------------- | ---------- | ------------ | ------------------------------------ |
| ออนไลน์        | boolean    | N            | สถานะออนไลน์ของอุปกรณ์ true: ออนไลน์ |
| false: ออฟไลน์ |            |              |                                      |

ตัวอย่างคำขอ :

```
{
  "event": {
    "header": {
      "name": "DeviceOnlineChangeReport",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "2"
    },
    "endpoint": {
      "serial_number": "serial_number",
      "third_serial_number": "third_serial_number"
    },
    "payload": {
       "online": true
    }
  }
}
```

**พารามิเตอร์การตอบกลับ:** PayloadObject: วัตถุว่าง ตัวอย่างการตอบกลับที่สำเร็จ:

```
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {}
}
```

**DeviceInformationUpdatedReport รายงานการอัปเดตข้อมูลอุปกรณ์**

* หมายเหตุ: การอัปเดตอาจส่งผลต่อฉากหรือฟังก์ชันความปลอดภัยที่มีอยู่

**พารามิเตอร์คำขอ:** PayloadObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย** |
| ------------- | ---------- | ------------ | ------------ |
| capabilities  |            |              |              |

\| CapabilityObject\[]

\| N

\| รายการความสามารถ รายละเอียดสามารถดูได้ในส่วนความสามารถของอุปกรณ์ที่รองรับ \*\*หมายเหตุ: \*\*พารามิเตอร์นี้จะอัปเดตเฉพาะ `value` ของ `การตั้งค่า` คีย์ ภายใน `CapabilityObject`, และอนุญาตให้อัปเดตได้ก็ต่อเมื่อ `permission` สำหรับ `การตั้งค่า` คีย์ เป็น `11` หรือ `01`. สำหรับคำจำกัดความโครงสร้างเฉพาะของ `การตั้งค่า` ใน `CapabilityObject`โปรดดูคำอธิบายโดยละเอียดในส่วน 2.3 หมวดหมู่อุปกรณ์ที่แสดง & ความสามารถของอุปกรณ์ | | tags

\| object

\| Y

\| คู่คีย์-ค่าในรูปแบบ JSON ข้อมูลอุปกรณ์แบบกำหนดเอง.

* สามารถใช้เพื่อเก็บช่องของอุปกรณ์
* สามารถใช้เพื่อเก็บหน่วยอุณหภูมิ
* ข้อมูลกำหนดเองอื่น ๆ ของบุคคลที่สาม |

ตัวอย่างคำขอ :

```json
{
  "event": {
    "header": {
      "name": "DeviceInformationUpdatedReport",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "2"
    },
    "endpoint": {
      "serial_number": "serial_number",
      "third_serial_number": "third_serial_number"
    },
    "payload": {
      "capabilities": [
        {
          "capability": "detect",
          "permission": "0110",
          "settings":{
            "detectInterval":{
              "permission": "11",
              "type": "numeric",
              "value": 300,
            },
            "detectSensitivity":{
              "permission": "11",
              "type": "numeric",
              "value": 1000,
            }
          }
        }
      ]
    }
  }
}
```

**พารามิเตอร์การตอบกลับ:** PayloadObject: วัตถุว่าง ตัวอย่างการตอบกลับที่สำเร็จ:

```json
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "2"
  },
  "payload": {}
}
```

#### เกตเวย์ส่งอินเทอร์เฟซคำสั่งผ่านที่อยู่บริการของอุปกรณ์

* หมายเหตุ:

1. ฝ่ายที่สามจำเป็นต้องตอบกลับคำขอของเกตเวย์ภายใน 3 วินาที มิฉะนั้นเกตเวย์จะตัดสินว่าเวลาการประมวลผลคำสั่งหมดเวลา
2. หากบริการของบุคคลที่สามออฟไลน์ เกตเวย์จะตั้งค่าสถานะอุปกรณ์เป็นออฟไลน์ และบริการบุคคลที่สามจำเป็นต้องรายงานสถานะอุปกรณ์ (DeviceStatesChangeReport) หรือสถานะออนไลน์ (DeviceOnlineChangeReport) ก่อนจะกลับมาออนไลน์ได้

**รูปแบบคำขอ**

เกตเวย์ส่งคำสั่งไปยังบุคคลที่สามผ่านอินเทอร์เฟซที่อยู่บริการของอุปกรณ์ :::tips

* **URL**：
* **Method**：POST
* **Header**：
  * Content-Type: application/json ::: Request parameters:

| **คุณลักษณะ** | **ประเภท**      | **ทางเลือก** | **คำอธิบาย**               |
| ------------- | --------------- | ------------ | -------------------------- |
| directive     | DirectiveObject | N            | ข้อมูลโครงสร้างวัตถุคำสั่ง |

DirectiveObject

| **คุณลักษณะ** | **ประเภท**     | **ทางเลือก** | **คำอธิบาย**                     |
| ------------- | -------------- | ------------ | -------------------------------- |
| header        | HeaderObject   | N            | โครงสร้างเฮดเดอร์คำขอ            |
| endpoint      | EndpointObject | N            | ข้อมูลโครงสร้าง endpoint ของคำขอ |
| payload       | PayloadObject  | N            | โครงสร้างเพย์โหลดคำขอ            |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                            |
| ------------- | ---------- | ------------ | ----------------------------------------------------------------------- |
| name          | string     | N            | ชื่อคำขอ พารามิเตอร์ที่เลือกได้: UpdateDeviceStates: อัปเดตสถานะอุปกรณ์ |
| message\_id   | string     | N            | รหัสข้อความคำขอ, UUID\_V4                                               |
| version       | string     | N            | หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดเป็น 1.                        |

EndpointObject

| **คุณลักษณะ**         | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                          |
| --------------------- | ---------- | ------------ | ----------------------------------------------------------------------------------------------------- |
| serial\_number        | string     | N            | หมายเลขซีเรียลเฉพาะของอุปกรณ์                                                                         |
| third\_serial\_number | string     | N            | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม                                                              |
| ป้ายกำกับ             | object     | N            | คู่คีย์-ค่าในรูปแบบ JSON ข้อมูลอุปกรณ์แบบกำหนดเอง \[Device Management Function] - \[Tags Description] |

PayloadObject: ตามค่า `header.name`, จะมีโครงสร้างคำขอเฉพาะสำหรับแต่ละค่า

ตัวอย่างคำขอ :

```
{
  "directive": {
    "header": {
      "name": "UpdateDeviceStates",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "endpoint": {
      "serial_number": "serial_number",
      "third_serial_number": "third_serial_number",
      "tags": {}
    },
    "payload": {
      "state": {
        "power": {
          "powerState": "on"
        }
      }
    }
  }
}
```

**รูปแบบการตอบกลับ**

:::tips \*\*HTTP รหัสสถานะ: \*\*200 OK **คุณสมบัติการตอบกลับ HTTP：** :::

| **คุณลักษณะ** | **ประเภท**  | **ทางเลือก** | **คำอธิบาย**                       |
| ------------- | ----------- | ------------ | ---------------------------------- |
| event         | EventObject | N            | ข้อมูลโครงสร้างเหตุการณ์การตอบกลับ |

EventObject

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**          |
| ------------- | ------------- | ------------ | --------------------- |
| header        | HeaderObject  | N            | โครงสร้างเฮดเดอร์คำขอ |
| payload       | PayloadObject | N            | โครงสร้างเพย์โหลดคำขอ |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                                                                   |
| ------------- | ---------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| name          | string     | N            | ชื่อเฮดเดอร์การตอบกลับ พารามิเตอร์ที่เลือกได้: UpdateDeviceStatesResponse: การตอบกลับการอัปเดตสถานะอุปกรณ์ ErrorResponse: การตอบกลับข้อผิดพลาด |
| message\_id   | string     | N            | รหัสข้อความเฮดเดอร์การตอบกลับ, UUID\_V4 นำ message\_id ของเฮดเดอร์ข้อความคำขอใส่ที่นี่                                                         |
| version       | string     | N            | หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดเป็น 1.                                                                                               |

> การตอบกลับที่สำเร็จ--PayloadObject：

ขึ้นอยู่กับประเภทคำขอ โครงสร้างการตอบกลับจะแตกต่างกัน สำหรับรายละเอียด โปรดดูเอกสารคำแนะนำคำขอเฉพาะ

> การตอบกลับล้มเหลว--PayloadObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**          |
| ------------- | ---------- | ------------ | --------------------- |
| type          | string     | N            | **ประเภทข้อผิดพลาด**: |

* **ENDPOINT\_UNREACHABLE**: อุปกรณ์ไม่สามารถเข้าถึงได้หรือออฟไลน์
* **ENDPOINT\_LOW\_POWER**: อุปกรณ์อยู่ในโหมดพลังงานต่ำและไม่สามารถควบคุมได้
* **INVALID\_DIRECTIVE**: คำสั่งผิดปกติจากเกตเวย์
* **NO\_SUCH\_ENDPOINT**: อุปกรณ์ไม่มีอยู่
* **NOT\_SUPPORTED\_IN\_CURRENT\_MODE**: โหมดปัจจุบันไม่รองรับการดำเนินการนี้
* **INTERNAL\_ERROR**: ข้อผิดพลาดบริการภายใน
* **REMOTE\_KEY\_CODE\_NOT\_LEARNED**: รหัสปุ่มรีโมทยังไม่ได้เรียนรู้ |

:::tips **เงื่อนไข**: พารามิเตอร์คำขอถูกต้องตามกฎหมาย \*\*รหัสสถานะ: \*\*200 OK **พารามิเตอร์การตอบกลับ:** :::

```
{
  "event": {
    "header": {
      "name": "UpdateDeviceStatesResponse",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "payload": {}
  }
}
```

```
{
  "event": {
    "header": {
      "name": "ErrorResponse",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "payload": {
      "type": "ENDPOINT_UNREACHABLE"
    }
  }
}
```

**UpdateDeviceStates**

**พารามิเตอร์คำขอ:** PayloadObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                     |
| ------------- | ---------- | ------------ | ---------------------------------------------------------------- |
| สถานะ         | object     | N            | สถานะอุปกรณ์ ดู \[Supported device cabilities] สำหรับรายละเอียด. |

ตัวอย่างคำขอ :

```
{
  "directive": {
    "header": {
      "name": "UpdateDeviceStates",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "endpoint": {
      "serial_number": "serial_number"
    },
    "payload": {
       "state": : {
         "power": {
           "powerState": "on"
         }
       }
    }
  }
}
```

**พารามิเตอร์การตอบกลับ:** PayloadObject：วัตถุว่าง ตัวอย่างการตอบกลับที่สำเร็จ

```
{
  "header": {
    "name": "Response",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {}
}
```

**QueryDeviceStates**

**พารามิเตอร์คำขอ:** PayloadObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                     |
| ------------- | ---------- | ------------ | ---------------------------------------------------------------- |
| สถานะ         | object     | N            | สถานะอุปกรณ์ ดู \[Supported device cabilities] สำหรับรายละเอียด. |

ตัวอย่างคำขอ :

```json
{
  "directive": {
    "header": {
      "name": "QueryDeviceStates",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "2"
    },
    "endpoint": {
      "serial_number": "serial_number",
      "third_serial_number": "third_serial_number"
    },
    "payload": {
      "state": {
        "power-consumption": {
          "timeRange": {
            "start": "2020-07-05T08:00:00Z", // เวลาเริ่มต้นสำหรับสถิติการใช้พลังงาน จำเป็นต้องระบุ.
            "end": "2020-07-05T09:00:00Z"   // เวลาสิ้นสุดสำหรับสถิติการใช้พลังงาน จำเป็นต้องระบุ.
          }
        }
      }
    }
  }
}
```

**พารามิเตอร์การตอบกลับ:** PayloadObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                     |
| ------------- | ---------- | ------------ | ---------------------------------------------------------------- |
| สถานะ         | object     | N            | สถานะอุปกรณ์ ดู \[Supported device cabilities] สำหรับรายละเอียด. |

**ตัวอย่างการตอบกลับ:**

```json
{
  "event": {
    "header": {
      "name": "Response",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "2"
    },
    "payload": {
      "state": {
        "power-consumption": {
          "electricityIntervals": [ // แบ่งเป็นหลายระเบียนตามการตั้งค่า resolution
            {
              "usage": 26.5, // ค่าการใช้พลังงาน จำเป็นต้องระบุ ประเภท: number.
              "start": "2020-07-05T08:00:00Z", // เวลาเริ่มต้น จำเป็นต้องระบุ ประเภท: date.
              "end": "2020-07-05T09:00:00Z"    // เวลาสิ้นสุด จำเป็นต้องระบุ ประเภท: date. หากช่วงระหว่าง end และ start น้อยกว่า resolution ระเบียนทั้งหมดที่รายงานถือว่าไม่ถูกต้อง.
            },
            {
              "usage": 26.5, // ค่าการใช้พลังงาน จำเป็นต้องระบุ ประเภท: number.
              "start": "2020-07-05T09:00:00Z", // เวลาเริ่มต้น จำเป็นต้องระบุ ประเภท: date.
              "end": "2020-07-05T10:00:00Z"    // เวลาสิ้นสุด จำเป็นต้องระบุ ประเภท: date. หากช่วงระหว่าง end และ start น้อยกว่า resolution ระเบียนทั้งหมดที่รายงานถือว่าไม่ถูกต้อง.
            }
          ]
        }
      }
    }
  }
}
```

**ConfigureDeviceCapabilities**

**พารามิเตอร์คำขอ:** PayloadObject：

| **คุณลักษณะ** | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**                                                                                                                                        |
| ------------- | ------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| capabilities  | CapabilityObject\[] | N            | รายการความสามารถ รายละเอียดดูส่วนความสามารถของอุปกรณ์ที่รองรับ โปรดทราบว่า ฟิลด์ permission ไม่สามารถเปลี่ยนแปลงได้ ให้ส่งค่าที่เหมือนกันเมื่อซิงค์ |

ตัวอย่างคำขอ :

```json
{
  "directive": {
    "header": {
      "name": "ConfigureDeviceCapabilities",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "2"
    },
    "endpoint": {
      "serial_number": "serial_number"
    },
    "payload": {
      "capabilities": [
        {
          "capability": "thermostat-mode-detect",
          "permission": "0110",
          "name": "temperature", // ประเภทการตรวจจับการควบคุมอุณหภูมิ จำเป็นต้องระบุ ค่าที่เลือกได้: humidity (การตรวจจับความชื้น), temperature (การตรวจจับอุณหภูมิ)
          "settings": {
            "setpointRange": {
              "permission": "11",
              "type": "object",
              "value": {
                "supported": [ // การตั้งค่าการตรวจจับที่รองรับ จำเป็นต้องระบุ.
                  {
                    "name": "lowerSetpoint", // ค่าต่ำสุดที่การตรวจจับควรรักษา ต้องระบุอย่างใดอย่างหนึ่งระหว่าง lowerSetpoint หรือ upperSetpoint.
                    "value": { // ช่วงการตรวจจับ ทางเลือก กรอกหากมีเงื่อนไขที่ตั้งไว้ล่วงหน้า.
                      "value": 68.0, // ค่าอุณหภูมิหรือความชื้น จำเป็นต้องระบุ.
                      "scale": "f" // หน่วยอุณหภูมิ จำเป็นหาก name=temperature ตัวเลือก: c (องศาเซลเซียส), f (ฟาเรนไฮต์)
                    }
                  },
                  {
                    "name": "upperSetpoint", // ค่าสูงสุดที่การตรวจจับควรรักษา ต้องระบุอย่างใดอย่างหนึ่งระหว่าง lowerSetpoint หรือ upperSetpoint.
                    "value": { // ช่วงการตรวจจับ ทางเลือก กรอกหากมีเงื่อนไขที่ตั้งไว้ล่วงหน้า.
                      "value": 68.0, // ค่าอุณหภูมิหรือความชื้น จำเป็นต้องระบุ.
                      "scale": "f" // หน่วยอุณหภูมิ จำเป็นหาก name=temperature ตัวเลือก: c (องศาเซลเซียส), f (ฟาเรนไฮต์)
                    }
                  }
                ]
              }
            },
            "supportedModes": {
              "type": "enum",
              "permission": "01",
              "values": [
                "COMFORT",
                "COLD",
                "HOT"
              ]
            }
          }
        }
      ]
    }
  }
}
```

**พารามิเตอร์การตอบกลับ:** PayloadObject：วัตถุว่าง ตัวอย่างการตอบกลับที่สำเร็จ

```json
{
  "event": {
    "header": {
      "name": "Response",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "2"
    },
    "payload": {}
  }
}
```

## 5. เหตุการณ์ที่ส่งจากเซิร์ฟเวอร์

> คำอธิบายอินเทอร์เฟซ MDN EventSource：<https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events>

### 5.1 คำสั่ง

เกตเวย์รองรับการผลักข้อความไปยังไคลเอนต์โดยใช้ SSE (Server-sent events) ไคลเอนต์สามารถเฝ้าดูข้อความ SSE หลังจากได้รับข้อมูลรับรองการเข้าถึง และสามารถแยกวิเคราะห์เนื้อหาของข้อความที่ถูกผลักตามโปรโตคอลการแจ้งเหตุการณ์ของอินเทอร์เฟซการพัฒนาได้เมื่อได้รับข้อความจากเกตเวย์ ควรสังเกตว่าเกตเวย์ปัจจุบันใช้โปรโตคอล HTTP1.1 ดังนั้น SSE บนฝั่งเบราว์เซอร์จะมีข้อจำกัดการเชื่อมต่อสูงสุดไม่เกิน 6 การเชื่อมต่อ (คำแนะนำเฉพาะสามารถดูได้ในคำอธิบายอินเทอร์เฟซ MDN EventSource.)

### 5.2 รูปแบบทั่วไป

:::tips

* **URL**：/open-api/V2/sse/bridge
* **Method**：`GET` ::: พารามิเตอร์คำขอ:

| ชื่อ          | ประเภท | ทางเลือก | คำอธิบาย     |
| ------------- | ------ | -------- | ------------ |
| access\_token | string | N        | Access Token |

หมายเหตุ: เมื่อขอการเชื่อมต่อ SSE เกตเวย์จะตรวจสอบ access\_token และจะคืนข้อผิดพลาดการตรวจสอบสิทธิ์หากไม่ถูกต้อง { "error": 401, "data": {}, "message": "invalid access\_token"}

> \## ตัวอย่าง: ชื่อโมดูล: device เวอร์ชัน: 1,v2,v3 ประเภทข้อความ: addDevice

ตัวอย่าง:

```javascript
const evtSource = new EventSource("http://<domain name or ip address>/open-api/v2/sse/bridge?access_token=xxxxxx");

evtSource.addEventListener('device#v2#addDevice',function (event) {
  try {
    const data = JSON.parse(event.data);
    console.log('data', data);
  } catch (error) {
    console.error(`parse error`,error);
  }
}
```

### 5.3 โมดูลอุปกรณ์

#### a. เหตุการณ์เพิ่มอุปกรณ์

:::tips ชื่อโมดูล：device เวอร์ชัน：v2 ประเภทข้อความ：addDevice event.data พารามิเตอร์： :::

| ชื่อ    | ประเภท                                                               | ทางเลือก | คำอธิบาย      |
| ------- | -------------------------------------------------------------------- | -------- | ------------- |
| payload | ResponseDeviceObjectObject - อินเทอร์เฟซเหมือนกับการรับรายการอุปกรณ์ | N        | ข้อมูลอุปกรณ์ |

ตัวอย่าง:

```json
// event.data
{
  "payload": {
    "serial_number": "ABCDEFGHIJK",
    "third_serial_number": "third_serial_number",
    "name": "Mydevice",
    "manufacturer": "SONOFF",
    "model": "BASICZBR3",
    "firmware_version": "1.1.0",
    "display_category": "switch",
    "capabilities": [
      {
        "capability": "power",
        "permission": "1100"
      },
      {
        "capability": "rssi",
        "permission": "0100"
      }
    ],
    "protocal": "zigbee",
    "state": {
      "power": {
        "powerState": "on"
      }
    },
    "tags": {
      "key": "value"
    },
    "online": true
  }
}
```

#### b. เหตุการณ์อัปเดตสถานะอุปกรณ์

:::tips ชื่อโมดูล：device เวอร์ชัน：v2 ประเภทข้อความ：updateDeviceState event.data พารามิเตอร์： :::

| ชื่อ     | ประเภท                                 | ทางเลือก | คำอธิบาย           |
| -------- | -------------------------------------- | -------- | ------------------ |
| endpoint | EndpointObject                         | N        | ข้อมูลอุปกรณ์      |
| payload  | object。 โครงสร้างเหมือนกับสถานะอุปกรณ์ | N        | ข้อมูลสถานะอุปกรณ์ |

EndpointObject:

| พารามิเตอร์           | ประเภท | ทางเลือก | คำอธิบาย                                                                                                   |
| --------------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------- |
| serial\_number        | string | N        | หมายเลขซีเรียลเฉพาะของอุปกรณ์                                                                              |
| third\_serial\_number | string | Y        | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม สำหรับอุปกรณ์ที่เชื่อมต่อผ่านอินเทอร์เฟซเปิด ฟิลด์นี้เป็นข้อกำหนด |

ตัวอย่าง:

```json
// event.data
{
  "endpoint": {
    "serial_number": "serial_number",
    "third_serial_number": "third_serial_number"
  },
  "payload": {
    "power": {
      "powerState": "on"
    },
    "brightness": {
      "brightness": 100
    }
  }
}
```

#### c. เหตุการณ์อัปเดตข้อมูลอุปกรณ์

:::tips ชื่อโมดูล：device เวอร์ชัน：v2 ประเภทข้อความ：updateDeviceInfo event.data พารามิเตอร์： :::

| ชื่อ     | ประเภท             | ทางเลือก | คำอธิบาย                       |
| -------- | ------------------ | -------- | ------------------------------ |
| endpoint | EndpointObject     | N        | ข้อมูลอุปกรณ์                  |
| payload  | DeviceChangeObject | N        | ข้อมูลการเปลี่ยนแปลงของอุปกรณ์ |

EndpointObject:

| คุณลักษณะ             | ประเภท | ทางเลือก | คำอธิบาย                                                                                                   |
| --------------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------- |
| serial\_number        | string | N        | หมายเลขซีเรียลเฉพาะของอุปกรณ์                                                                              |
| third\_serial\_number | string | Y        | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม สำหรับอุปกรณ์ที่เชื่อมต่อผ่านอินเทอร์เฟซเปิด ฟิลด์นี้เป็นข้อกำหนด |

DeviceChangeObject

| ชื่อ         | ประเภท               | ทางเลือก | คำอธิบาย                                                                                            |
| ------------ | -------------------- | -------- | --------------------------------------------------------------------------------------------------- |
| name         | string               | N        | ชื่ออุปกรณ์                                                                                         |
| capabilities | CapabilityObject \[] | Y        | รายการความสามารถของอุปกรณ์                                                                          |
| ป้ายกำกับ    | object               | Y        | **ป้ายกำกับ**`object` \| เป็นค่าว่างได้ \| คู่คีย์-ค่าในรูปแบบ JSON สำหรับข้อมูลอุปกรณ์แบบกำหนดเอง. |

* สามารถใช้เพื่อเก็บช่องของอุปกรณ์.
* สามารถใช้เพื่อเก็บหน่วยอุณหภูมิ.
* สำหรับข้อมูลกำหนดเองอื่น ๆ ของบุคคลที่สาม. |

ตัวอย่าง:

```json
// event.data
{
  "endpoint": {
    "serial_number": "serial_number",
    "third_serial_number": "third_serial_number"
  },
  "payload": {
    "name": "device name",
    "capabilities": [
      {
        "capability": "thermostat-mode-detect",
        "permission": "0110",
        "name": "temperature", // ประเภทการตรวจจับการควบคุมอุณหภูมิ จำเป็นต้องระบุ ค่าที่เลือกได้: humidity (การตรวจจับความชื้น), temperature (การตรวจจับอุณหภูมิ)
        "settings": {
          "setpointRange": {
            "permission": "11",
            "type": "object",
            "value": {
              "supported": [ // การตั้งค่าการตรวจจับที่รองรับ จำเป็นต้องระบุ.
                {
                  "name": "lowerSetpoint", // ค่าต่ำสุดที่การตรวจจับควรรักษา ต้องระบุอย่างใดอย่างหนึ่งระหว่าง lowerSetpoint หรือ upperSetpoint.
                  "value": { // ช่วงการตรวจจับ ทางเลือก กรอกหากมีเงื่อนไขที่ตั้งไว้ล่วงหน้า.
                    "value": 68.0, // ค่าอุณหภูมิหรือความชื้น จำเป็นต้องระบุ.
                    "scale": "f" // หน่วยอุณหภูมิ จำเป็นหาก name=temperature ตัวเลือก: c (องศาเซลเซียส), f (ฟาเรนไฮต์)
                  }
                },
                {
                  "name": "upperSetpoint", // ค่าสูงสุดที่การตรวจจับควรรักษา ต้องระบุอย่างใดอย่างหนึ่งระหว่าง lowerSetpoint หรือ upperSetpoint.
                  "value": { // ช่วงการตรวจจับ ทางเลือก กรอกหากมีเงื่อนไขที่ตั้งไว้ล่วงหน้า.
                    "value": 68.0, // ค่าอุณหภูมิหรือความชื้น จำเป็นต้องระบุ.
                    "scale": "f" // หน่วยอุณหภูมิ จำเป็นหาก name=temperature ตัวเลือก: c (องศาเซลเซียส), f (ฟาเรนไฮต์)
                  }
                }
              ]
            }
          },
          "supportedModes": {
            "type": "enum",
            "permission": "01",
            "values": [
              "COMFORT",
              "COLD",
              "HOT"
            ]
          }
        }
      }
    ]
  }
}
```

#### d. เหตุการณ์ลบอุปกรณ์

:::tips ชื่อโมดูล：device เวอร์ชัน：v2 ประเภทข้อความ：deleteDevice event.data พารามิเตอร์： :::

| \*\* ชื่อ \*\* | \*\* ประเภท \*\* | \*\* ตัวเลือกได้\*\* | \*\* คำอธิบาย \*\* |
| -------------- | ---------------- | -------------------- | ------------------ |
| endpoint       | EndpointObject   | N                    | ข้อมูลอุปกรณ์      |

EndpointObject:

| คุณลักษณะ             | ประเภท | ทางเลือก | คำอธิบาย                                                                                                   |
| --------------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------- |
| serial\_number        | string | N        | หมายเลขซีเรียลเฉพาะของอุปกรณ์                                                                              |
| third\_serial\_number | string | Y        | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม สำหรับอุปกรณ์ที่เชื่อมต่อผ่านอินเทอร์เฟซเปิด ฟิลด์นี้เป็นข้อกำหนด |

ตัวอย่าง:

```json
// event.data
{
  "endpoint": {
    "serial_number": "serial_number",
    "third_serial_number": "third_serial_number"
  }
}
```

#### e. เหตุการณ์อัปเดตออนไลน์อุปกรณ์

:::tips ชื่อโมดูล：device เวอร์ชัน：v2 ประเภทข้อความ：updateDeviceOnline event.data พารามิเตอร์： :::

| ชื่อ     | ประเภท             | ทางเลือก | คำอธิบาย                       |
| -------- | ------------------ | -------- | ------------------------------ |
| endpoint | EndpointObject     | N        | ข้อมูลอุปกรณ์                  |
| payload  | DeviceChangeObject | N        | ข้อมูลการเปลี่ยนแปลงของอุปกรณ์ |

EndpointObject:

| คุณลักษณะ             | ประเภท | ทางเลือก | คำอธิบาย                                                                                                   |
| --------------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------- |
| serial\_number        | string | N        | หมายเลขซีเรียลเฉพาะของอุปกรณ์                                                                              |
| third\_serial\_number | string | Y        | หมายเลขซีเรียลเฉพาะของอุปกรณ์บุคคลที่สาม สำหรับอุปกรณ์ที่เชื่อมต่อผ่านอินเทอร์เฟซเปิด ฟิลด์นี้เป็นข้อกำหนด |

DeviceChangeObject

| ชื่อ    | ประเภท  | ทางเลือก | คำอธิบาย               |
| ------- | ------- | -------- | ---------------------- |
| ออนไลน์ | boolean | N        | สถานะออนไลน์ของอุปกรณ์ |

ตัวอย่าง:

```json
// event.data
{
  "endpoint": {
    "serial_number": "serial_number",
    "third_serial_number": "third_serial_number"
  },
  "payload": {
    "online": false
  }
}
```

### 5.4 โมดูลเกตเวย์

#### a. เหตุการณ์อัปเดตสถานะความปลอดภัย

:::tips ชื่อโมดูล：device เวอร์ชัน：v2 ประเภทข้อความ：updateDeviceOnline event.data พารามิเตอร์： :::

| **คุณลักษณะ** | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**  |
| ------------- | ------------------- | ------------ | ------------- |
| payload       | SecurityStateObject | N            | ข้อมูลอุปกรณ์ |

SecurityStateObject

| **คุณลักษณะ**    | **ประเภท** | **ทางเลือก** | **คำอธิบาย** |
| ---------------- | ---------- | ------------ | ------------ |
| สถานะสัญญาณเตือน | string     | N            |              |

* `การติดตั้งระบบ (arming)` | ติดอาวุธ
* `การยกเลิกการติดตั้ง (disarming)` | ปลดอาวุธ |

ตัวอย่าง:

```json
// event.data
{
  "payload": {
    "alarm_state": "alarming"
  }
}
```

### 5.5 โมดูลความปลอดภัย

#### a. เหตุการณ์อัปเดตสถานะการติดอาวุธ

:::tips ชื่อโมดูล：device เวอร์ชัน：v2 ประเภทข้อความ：updateDeviceOnline event.data พารามิเตอร์： :::

| **คุณลักษณะ** | **ประเภท**     | **ทางเลือก** | **คำอธิบาย**                |
| ------------- | -------------- | ------------ | --------------------------- |
| payload       | ArmStateObject | N            | ข้อมูลการติดและยกเลิกการติด |

ArmStateObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย** |
| ------------- | ---------- | ------------ | ------------ |
| arm\_state    | string     | N            |              |

* `การติดตั้งระบบ (arming)` | ติดอาวุธ
* `การยกเลิกการติดตั้ง (disarming)` | ปลดอาวุธ | | detail | DetailObject | N | รายละเอียดการติด/ยกเลิกการติด |

DetailObject：

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**        |
| ------------- | ---------- | ------------ | ------------------- |
| sid           | int        | N            | ไอดีโหมดความปลอดภัย |
| name          | string     | N            | ชื่อความปลอดภัย     |

ตัวอย่าง

```json
// event.data
{
  "payload": {
    "arm_state": "arming",
    "detail": {
      "sid": 1,
      "name": "Home Mode"
    }
  }
}
```

## 6. TTS (**ฟังก์ชันเครื่องยนต์แปลงข้อความเป็นเสียง (Text-to-Speech)**

### 6.1 คำแนะนำ

#### บทบาทหลัก

* ผู้ให้บริการบริการ TTS: ผู้ให้บริการเครื่องยนต์บริการ TTS มีหน้าที่ลงทะเบียนเครื่องยนต์ TTS บนเกตเวย์และให้บริการ TTS
* เซิร์ฟเวอร์เกตเวย์：iHost
* ไคลเอนต์ Gateway Open API

#### 6.1.1 การลงทะเบียนบริการเครื่องยนต์ TTS

1. 【ผู้ให้บริการบริการ TTS】เรียกอินเทอร์เฟซเพื่อลงทะเบียนเครื่องยนต์ TTS บนเกตเวย์
2. 【เซิร์ฟเวอร์เกตเวย์】หลังจากการลงทะเบียนสำเร็จ เกตเวย์จะเก็บข้อมูลพื้นฐานของเครื่องยนต์ TTS (รวมถึงที่อยู่เซิร์ฟเวอร์ server\_address และการสื่อสารต่อไประหว่างเกตเวย์กับผู้ให้บริการบริการ TTS จะดำเนินการผ่านที่อยู่ server\_address) และจัดสรร ID บริการเครื่องยนต์ TTS ภายในเกตเวย์

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2FFbcZQSx9tkiFsPhFd5Bs%2Fimage.png?alt=media&#x26;token=503d3700-3236-4a96-86c4-42f59aa5ebc8" alt=""><figcaption></figcaption></figure>

#### 6.1.2 รับรายการเสียงที่สังเคราะห์แล้ว

1. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการบริการเครื่องยนต์ TTS ที่ลงทะเบียน คุณสามารถรับรายการเครื่องยนต์ TTS ที่ลงทะเบียนปัจจุบัน (รวมถึง ID ของเครื่องยนต์ TTS ที่เกตเวย์จัดสรร)
2. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการเสียงของเครื่องยนต์ TTS ที่ระบุ เกตเวย์จะส่งคำสั่งรายการเสียงแบบซิงโครไนซ์ไปยังผู้ให้บริการ TTS ที่ระบุและส่งคืนผลลัพธ์

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2Fdc7XkFrVPJSM4qelABE0%2Fimage.png?alt=media&#x26;token=58f3edf7-29bf-4709-888a-4bd52e908e0f" alt=""><figcaption></figcaption></figure>

#### 6.1.3 การสังเคราะห์เสียงโดยระบุเครื่องยนต์เสียง

1. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการบริการเครื่องยนต์ TTS ที่ลงทะเบียน คุณสามารถรับรายการเครื่องยนต์ TTS ที่ลงทะเบียนปัจจุบัน (รวมถึง ID ของเครื่องยนต์ TTS ที่เกตเวย์จัดสรร)
2. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการเสียงของเครื่องยนต์ TTS ที่ระบุ เกตเวย์จะส่งคำสั่งรายการเสียงแบบซิงโครไนซ์ไปยังผู้ให้บริการ TTS ที่ระบุและส่งคืนผลลัพธ์

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2FUj8BveNMWDcBvMj8pcW1%2Fimage.png?alt=media&#x26;token=6ba23a8d-1bc6-4c72-8267-d359fcff6678" alt=""><figcaption></figcaption></figure>

#### 6.1.4 สังเคราะห์เสียงและเล่นคำพูด TTS

1. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการบริการเครื่องยนต์ TTS ที่ลงทะเบียน คุณสามารถรับรายการเครื่องยนต์ TTS ที่ลงทะเบียนปัจจุบัน (รวมถึง ID ของเครื่องยนต์ TTS ที่เกตเวย์จัดสรร)
2. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการเสียงของเครื่องยนต์ TTS ที่ระบุ เกตเวย์จะส่งคำสั่งรายการเสียงแบบซิงโครไนซ์ไปยังผู้ให้บริการ TTS ที่ระบุและส่งคืนผลลัพธ์ (รวมถึงที่อยู่ไฟล์เสียง TTS)
3. 【ไคลเอนต์ Gateway Open API】บันทึกที่อยู่ไฟล์เสียง TTS จากผลลัพธ์ที่ส่งคืนในขั้นตอนก่อนหน้า เรียกอินเทอร์เฟซเล่นไฟล์เสียง และเล่นผ่านเกตเวย์

### 6.2 โมดูลเครื่องยนต์ TTS

#### 6.2.1 ความสามารถที่เปิดโดยเกตเวย์

**a. ดึงรายการบริการเครื่องยนต์ TTS ที่ลงทะเบียน**

:::tips

* **URL**：`/open-api/V2/rest/tts/engines`
* **Method**：`GET`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี ข้อมูลการตอบกลับที่ถูกต้อง:

| **คุณลักษณะ** | **ประเภท**       | **ทางเลือก** | **คำอธิบาย**                       |
| ------------- | ---------------- | ------------ | ---------------------------------- |
| engines       | EngineObject \[] | N            | รายการเครื่องยนต์ TTS ที่ลงทะเบียน |

โครงสร้าง EngineObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                   |
| ------------- | ---------- | ------------ | ------------------------------ |
| id            | string     | N            | รหัสเครื่องยนต์ที่เกตเวย์กำหนด |
| name          | string     | N            | ชื่อของบริการเครื่องยนต์ TTS   |

:::tips เงื่อนไข: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ \*\*รหัสสถานะ: \*\*`200 OK` **ตัวอย่างการตอบกลับ:**： :::

```json
{
  "error": 0,
  "data": {
    "engines": [
      {
        "id": "engine id",
        "name": "engine name"
      }
    ]
  },
  "message": "success"
}
```

**b. ดึงรายการเสียงของเครื่องยนต์ TTS ที่ระบุ**

:::tips

* **URL**：`/open-api/V2/rest/tts/engine/{id}/audio-list`
* **Method**：`GET`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี ข้อมูลการตอบกลับที่ถูกต้อง:

| **คุณลักษณะ** | **ประเภท**      | **ทางเลือก** | **คำอธิบาย** |
| ------------- | --------------- | ------------ | ------------ |
| audio\_list   | AudioObject \[] | N            | รายการเสียง  |

โครงสร้าง AudioObject

| **คุณลักษณะ**                                            | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                   |
| -------------------------------------------------------- | ---------- | ------------ | ------------------------------ |
| url                                                      | string     | N            | URL ของไฟล์เสียง ตัวอย่างเช่น: |
| <https://dl.espressif.cn/dl/audio/gs-16b-2c-44100hz.mp3> |            |              |                                |
| label                                                    | string     | Y            | ป้ายกำกับไฟล์เสียง             |

:::tips เงื่อนไข: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ \*\*รหัสสถานะ: \*\*`200 OK` \*\*รหัสข้อผิดพลาด: \*\*

* 190000 เครื่องยนต์ทำงานผิดปกติ

**ตัวอย่างการตอบกลับ:**： :::

```json
{
  "error": 0,
  "data": {
    "audio_list": [
      {
        "url": "tts audio address", // for example: https://dl.espressif.cn/dl/audio/gs-16b-2c-44100hz.mp3
        "label": "tts audio label"
      }
    ]
  },
  "message": "success"
}
```

**c. ดำเนินการสังเคราะห์เสียงโดยใช้เครื่องยนต์ TTS ที่ระบุ**

:::tips

* **URL**：`/open-api/V2/rest/tts/engine/{id}/synthesize`
* **Method**：`POST`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                                                                                                                                                                                                                     |
| ------------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| text          | string     | N            | ข้อความที่ใช้เพื่อสังเคราะห์เสียง                                                                                                                                                                                                                                                                |
| label         | string     | Y            | ป้ายกำกับไฟล์เสียง                                                                                                                                                                                                                                                                               |
| language      | string     | Y            | ฟิลด์โปร่งใส ตัวเลือกโค้ดภาษาสำหรับคำขอสังเคราะห์เสียง รายการโค้ดภาษาที่รองรับอย่างละเอียดจะถูกระบุโดยผู้ให้บริการเครื่องยนต์เสียง TTS โปรดทราบว่าบริการเครื่องยนต์ TTS ต้องรองรับภาษาปริยายสำหรับการสังเคราะห์เสียง ซึ่งหมายความว่าหากไม่ได้ส่งภาษามา เครื่องยนต์จะใช้ภาษาปริยายในการสังเคราะห์ |
| options       | object     | Y            | ฟิลด์โปร่งใส ใช้เพื่อส่งพารามิเตอร์การกำหนดค่าที่จำเป็นสำหรับการสังเคราะห์ไปยังบริการเครื่องยนต์เสียง TTS                                                                                                                                                                                        |

ข้อมูลการตอบกลับที่ถูกต้อง:

| **คุณลักษณะ** | **ประเภท**  | **ทางเลือก** | **คำอธิบาย** |
| ------------- | ----------- | ------------ | ------------ |
| audio         | AudioObject | N            | รายการเสียง  |

โครงสร้าง AudioObject

| **คุณลักษณะ**                                            | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                   |
| -------------------------------------------------------- | ---------- | ------------ | ------------------------------ |
| url                                                      | string     | N            | URL ของไฟล์เสียง ตัวอย่างเช่น: |
| <https://dl.espressif.cn/dl/audio/gs-16b-2c-44100hz.mp3> |            |              |                                |
| label                                                    | string     | Y            | ป้ายกำกับไฟล์เสียง             |

:::tips เงื่อนไข: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ \*\*รหัสสถานะ: \*\*`200 OK` \*\*รหัสข้อผิดพลาด: \*\*

* 190000 เครื่องยนต์ทำงานผิดปกติ

**ตัวอย่างการตอบกลับ:**： :::

```json
{
  "error": 0,
  "data": {
    "audio": {
        "url": "tts audio address" // for example, https://dl.espressif.cn/dl/audio/gs-16b-2c-44100hz.mp3
        "label": "tts audio label"
    }
  },
  "message": "success"
}
```

#### 6.2.2 การสื่อสารระหว่างเกตเวย์และบริการ TTS

**a. การลงทะเบียนบริการเครื่องยนต์ TTS**

> ส่งคำขอไปยังเกตเวย์โดยผู้ให้บริการบริการ TTS

:::tips

* **URL**：`/open-api/V2/rest/thirdparty/event`
* **Method**：`POST`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ:

| **คุณลักษณะ** | **ประเภท**  | **ทางเลือก** | **คำอธิบาย**                      |
| ------------- | ----------- | ------------ | --------------------------------- |
| event         | EventObject | N            | ข้อมูลโครงสร้างวัตถุเหตุการณ์คำขอ |

EventObject

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**          |
| ------------- | ------------- | ------------ | --------------------- |
| header        | HeaderObject  | N            | โครงสร้างเฮดเดอร์คำขอ |
| payload       | PayloadObject | N            | โครงสร้างเพย์โหลดคำขอ |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                  |
| ------------- | ---------- | ------------ | ----------------------------- |
| name          | string     | N            | ชื่อคำขอ พารามิเตอร์ไม่บังคับ |

* RegisterTTSEngine | | message\_id | string | N | รหัสข้อความคำขอ, UUID\_V4 | | version | string | N | หมายเลขเวอร์ชันของโปรโตคอลคำขอ ปัจจุบันกำหนดที่ 1 |

PayloadObject

| **คุณลักษณะ**    | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                          |
| ---------------- | ---------- | ------------ | ------------------------------------- |
| service\_address | string     | N            | ที่อยู่บริการ ตัวอย่างเช่น, http\:/// |
| name             | string     | N            | ชื่อบริการ                            |

ตัวอย่างคำขอ:

```json
{
  "event": {
    "header": {
      "name": "RegisterTTSEngine",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "payload": {
        "service_address": "service_address",
        "name": "tts service name"
    }
  }
}
```

\*\*พารามิเตอร์การตอบสนองที่ถูกต้อง: \*\*

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**          |
| ------------- | ------------- | ------------ | --------------------- |
| header        | HeaderObject  | N            | โครงสร้างเฮดเดอร์คำขอ |
| payload       | PayloadObject | N            | โครงสร้างเพย์โหลดคำขอ |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                |
| ------------- | ---------- | ------------ | ------------------------------------------- |
| name          | string     | N            | ชื่อส่วนหัวการตอบกลับ พารามิเตอร์ไม่บังคับ: |

* การตอบกลับ (การตอบกลับที่ประสบความสำเร็จ)
* ErrorResponse (การตอบกลับข้อผิดพลาด) | | message\_id | string | N | รหัสข้อความส่วนหัวการตอบกลับ, UUID\_V4 ข้อความคำขอที่เข้ามาที่นี่: header.message\_id | | version | string | N | หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดที่ 1 |

PayloadObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                   |
| ------------- | ---------- | ------------ | ------------------------------ |
| engine\_id    | string     | N            | รหัสเครื่องยนต์ที่เกตเวย์กำหนด |

:::tips เงื่อนไข: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ \*\*รหัสสถานะ: \*\*`200 OK` **ตัวอย่างการตอบกลับ:**： ::: ตัวอย่างการตอบกลับที่ถูกต้อง:：

```json
{
    "header": {
      "name": "Response",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "payload": {
      "engine_id": "engine id"
    }
  }
```

\*\*พารามิเตอร์การตอบสนองที่ผิดปกติ: \*\*

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**     |
| ------------- | ---------- | ------------ | ---------------- |
| type          | string     | N            | ประเภทข้อผิดพลาด |

* INVALID\_PARAMETERS (ข้อผิดพลาดพารามิเตอร์)
* AUTH\_FAILURE (การตรวจสอบสิทธิ์ล้มเหลว)
* INTERNAL\_ERROR (ข้อผิดพลาดภายในบริการ) | | description | string | N | คำอธิบายข้อผิดพลาด |

ตัวอย่างการตอบกลับข้อผิดพลาด:：

```json
{
  "header": {
    "name": "ErrorResponse",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {
    "type": "INVALID_PARAMETERS",
    "description": "service_address cannot be empty" 
  }
}
```

**b. คำสั่งซิงโครไนซ์รายการเสียง**

> ส่งคำสั่งไปยังผู้ให้บริการ TTS โดยเกตเวย์

:::tips

* **URL**：`<service address>`
* **Method**：`POST`
* **Header**：
  * Content-Type: application/json ::: Request Parameters:

| **คุณลักษณะ** | **ประเภท**      | **ทางเลือก** | **คำอธิบาย**               |
| ------------- | --------------- | ------------ | -------------------------- |
| directive     | DirectiveObject | N            | ข้อมูลโครงสร้างวัตถุคำสั่ง |

DirectiveObject

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**          |
| ------------- | ------------- | ------------ | --------------------- |
| header        | HeaderObject  | N            | โครงสร้างเฮดเดอร์คำขอ |
| payload       | PayloadObject | N            | โครงสร้างเพย์โหลดคำขอ |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                   |
| ------------- | ---------- | ------------ | ------------------------------ |
| name          | string     | N            | ชื่อคำขอ พารามิเตอร์ไม่บังคับ: |

* SyncTTSAudioList | | message\_id | string | N | รหัสข้อความคำขอ, UUID\_V4 | | version | string | N | หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดที่ 1 |

ตัวอย่างคำขอ:

```json
{
  "directive": {
    "header": {
      "name": "SyncTTSAudioList",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "payload": {}
  }
}
```

\*\*พารามิเตอร์การตอบสนองที่ถูกต้อง: \*\*

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**          |
| ------------- | ------------- | ------------ | --------------------- |
| header        | HeaderObject  | N            | โครงสร้างเฮดเดอร์คำขอ |
| payload       | PayloadObject | N            | โครงสร้างเพย์โหลดคำขอ |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                |
| ------------- | ---------- | ------------ | ------------------------------------------- |
| name          | string     | N            | ชื่อส่วนหัวการตอบกลับ พารามิเตอร์ไม่บังคับ: |

* การตอบกลับ (การตอบกลับที่ประสบความสำเร็จ)
* ErrorResponse (การตอบกลับข้อผิดพลาด) | | message\_id | string | N | รหัสข้อความส่วนหัวการตอบกลับ, UUID\_V4 ข้อความคำขอที่เข้ามาที่นี่: header.message\_id | | version | string | N | หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดที่ 1 |

PayloadObject:

| **คุณลักษณะ** | **ประเภท**      | **ทางเลือก** | **คำอธิบาย**    |
| ------------- | --------------- | ------------ | --------------- |
| audio\_list   | AudioObject \[] | N            | รายการเสียง TTS |

โครงสร้าง AudioObject

| **คุณลักษณะ**                                            | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                   |
| -------------------------------------------------------- | ---------- | ------------ | ------------------------------ |
| url                                                      | string     | N            | URL ของไฟล์เสียง ตัวอย่างเช่น: |
| <https://dl.espressif.cn/dl/audio/gs-16b-2c-44100hz.mp3> |            |              |                                |
| label                                                    | string     | Y            | ป้ายกำกับไฟล์เสียง             |

:::tips เงื่อนไข: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ \*\*รหัสสถานะ: \*\*`200 OK` **ตัวอย่างการตอบกลับ:**： ::: ตัวอย่างการตอบกลับที่ถูกต้อง:：

```json
{
    "header": {
      "name": "Response",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "payload": {
      "audio_list": [
        {
            "url": "tts audio url",
            "label": "tts audio label"
        }
      ]
    }
}
```

\*\*พารามิเตอร์การตอบสนองที่ผิดปกติ: \*\*

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**     |
| ------------- | ---------- | ------------ | ---------------- |
| type          | string     | N            | ประเภทข้อผิดพลาด |

* INVALID\_PARAMETERS (ข้อผิดพลาดพารามิเตอร์)
* AUTH\_FAILURE (การตรวจสอบสิทธิ์ล้มเหลว)
* INTERNAL\_ERROR (ข้อผิดพลาดภายในบริการ) | | description | string | N | คำอธิบายข้อผิดพลาด |

ตัวอย่างการตอบกลับข้อผิดพลาด:：

```json
{
  "header": {
    "name": "ErrorResponse",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {
    "type": "INVALID_PARAMETERS",
    "description": "service_address cannot be empty" 
  }
}
```

**c. คำสั่งสังเคราะห์เสียง**

> ส่งคำสั่งไปยังผู้ให้บริการ TTS โดยเกตเวย์

:::tips

* **URL**：`<service address>`
* **Method**：`POST`
* **Header**：
  * Content-Type: application/json ::: Request Parameters:

| **คุณลักษณะ** | **ประเภท**      | **ทางเลือก** | **คำอธิบาย**               |
| ------------- | --------------- | ------------ | -------------------------- |
| directive     | DirectiveObject | N            | ข้อมูลโครงสร้างวัตถุคำสั่ง |

DirectiveObject

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**          |
| ------------- | ------------- | ------------ | --------------------- |
| header        | HeaderObject  | N            | โครงสร้างเฮดเดอร์คำขอ |
| payload       | PayloadObject | N            | โครงสร้างเพย์โหลดคำขอ |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                   |
| ------------- | ---------- | ------------ | ------------------------------ |
| name          | string     | N            | ชื่อคำขอ พารามิเตอร์ไม่บังคับ: |

* SynthesizeSpeech | | message\_id | string | N | รหัสข้อความคำขอ: UUID\_V4 | | version | string | N | หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดที่ 1 |

PayloadObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                                                                                                                                                                                                                                                                     |
| ------------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| text          | string     | N            | ข้อความที่ใช้เพื่อสังเคราะห์เสียง                                                                                                                                                                                                                                                                |
| label         | string     | Y            | ป้ายกำกับไฟล์เสียง                                                                                                                                                                                                                                                                               |
| language      | string     | Y            | ฟิลด์โปร่งใส ตัวเลือกโค้ดภาษาสำหรับคำขอสังเคราะห์เสียง รายการโค้ดภาษาที่รองรับอย่างละเอียดจะถูกระบุโดยผู้ให้บริการเครื่องยนต์เสียง TTS โปรดทราบว่าบริการเครื่องยนต์ TTS ต้องรองรับภาษาปริยายสำหรับการสังเคราะห์เสียง ซึ่งหมายความว่าหากไม่ได้ส่งภาษามา เครื่องยนต์จะใช้ภาษาปริยายในการสังเคราะห์ |
| options       | object     | Y            | ฟิลด์โปร่งใส ใช้เพื่อส่งพารามิเตอร์การกำหนดค่าที่จำเป็นสำหรับการสังเคราะห์ไปยังบริการเครื่องยนต์เสียง TTS                                                                                                                                                                                        |

ตัวอย่างคำขอ:

```json
{
    "directive": {
        "header": {
            "name": "SynthesizeSpeech",
            "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
            "version": "1"
        },
        "payload": {
            "text": "Input text to synthesize.",
            "label": "tts audio label"
        }
    }
}
```

\*\*พารามิเตอร์การตอบสนองที่ถูกต้อง: \*\*

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**          |
| ------------- | ------------- | ------------ | --------------------- |
| header        | HeaderObject  | N            | โครงสร้างเฮดเดอร์คำขอ |
| payload       | PayloadObject | N            | โครงสร้างเพย์โหลดคำขอ |

HeaderObject

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                |
| ------------- | ---------- | ------------ | ------------------------------------------- |
| name          | string     | N            | ชื่อส่วนหัวการตอบกลับ พารามิเตอร์ไม่บังคับ: |

* การตอบกลับ (การตอบกลับที่ประสบความสำเร็จ)
* ErrorResponse (การตอบกลับข้อผิดพลาด) | | message\_id | string | N | รหัสข้อความส่วนหัวการตอบกลับ, UUID\_V4 ข้อความคำขอที่เข้ามาที่นี่: header.message\_id | | version | string | N | หมายเลขเวอร์ชันโปรโตคอลคำขอ ปัจจุบันกำหนดที่ 1 |

PayloadObject

| **คุณลักษณะ** | **ประเภท**  | **ทางเลือก** | **คำอธิบาย** |
| ------------- | ----------- | ------------ | ------------ |
| audio         | AudioObject | N            | เสียง TTS    |

โครงสร้าง AudioObject

| **คุณลักษณะ**                                            | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                   |
| -------------------------------------------------------- | ---------- | ------------ | ------------------------------ |
| url                                                      | string     | N            | URL ของไฟล์เสียง ตัวอย่างเช่น: |
| <https://dl.espressif.cn/dl/audio/gs-16b-2c-44100hz.mp3> |            |              |                                |
| label                                                    | string     | Y            | ป้ายกำกับไฟล์เสียง             |

:::tips เงื่อนไข: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ \*\*รหัสสถานะ: \*\*`200 OK` **ตัวอย่างการตอบกลับ:**： ::: ตัวอย่างการตอบกลับที่ถูกต้อง:：

```json
{
    "header": {
      "name": "Response",
      "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
      "version": "1"
    },
    "payload": {
      "audio": {
        "url": "tts audio url",
        "label": "tts audio label"
      }
    }
}
```

\*\*พารามิเตอร์การตอบสนองที่ผิดปกติ: \*\*

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**     |
| ------------- | ---------- | ------------ | ---------------- |
| type          | string     | N            | ประเภทข้อผิดพลาด |

* INVALID\_PARAMETERS (ข้อผิดพลาดพารามิเตอร์)
* AUTH\_FAILURE (การตรวจสอบสิทธิ์ล้มเหลว)
* INTERNAL\_ERROR (ข้อผิดพลาดภายในบริการ) | | description | string | N | คำอธิบายข้อผิดพลาด |

ตัวอย่างการตอบกลับข้อผิดพลาด:：

```json
{
  "header": {
    "name": "ErrorResponse",
    "message_id": "ตัวระบุที่ไม่ซ้ำกัน ควรเป็น UUID เวอร์ชัน 4",
    "version": "1"
  },
  "payload": {
    "type": "INVALID_PARAMETERS",
    "description": "service_address cannot be empty" 
  }
}
```

## 7. โมดูลมัลติมีเดีย

### 7.1 เล่นไฟล์เสียง

:::tips

* **URL**：`/open-api/V2/rest/media/audio-player`
* **Method**：`POST`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**         |
| ------------- | ---------- | ------------ | -------------------- |
| audio\_url    | string     | N            | ที่อยู่ URL ของเสียง |

ข้อมูลการตอบกลับที่ถูกต้อง: :::tips เงื่อนไข: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ \*\*รหัสสถานะ: \*\*`200 OK` **ตัวอย่างการตอบกลับ:**： :::

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

## 8. การ์ด UI ที่กำหนดเอง

การ์ด UI ที่กำหนดเองช่วยให้คุณแสดงเนื้อหาใดก็ได้ภายในการ์ด เนื้อหานี้อาจเป็นหน้าเว็บ รูปภาพ หรือบริการใดๆ ที่มี UI คุณเพียงแค่ให้ URL ของเนื้อหาที่ต้องการแสดง การ์ด UI จะปรับความกว้างและความสูงโดยอัตโนมัติ และเนื้อหาจะถูกแสดงผลโดยใช้ iFrame

### 8.1 คำแนะนำ

#### บทบาทหลัก

* **ผู้ให้บริการ UI**: ผู้ให้บริการที่รับผิดชอบการสร้างการ์ด UI ที่กำหนดเองบนเกตเวย์
* **เซิร์ฟเวอร์เกตเวย์**: เซิร์ฟเวอร์เกตเวย์ (iHost)
* **ไคลเอนต์ Gateway Open API**: ไคลเอนต์ Open API สำหรับเกตเวย์

#### 8.1.1 การสร้างการ์ด UI ที่กำหนดเอง

* **\[ผู้ให้บริการ UI]**: เรียก API เพื่อสร้างการ์ด UI ที่กำหนดเองบนเกตเวย์
* **\[เซิร์ฟเวอร์เกตเวย์]**: เมื่อการลงทะเบียนสำเร็จ เกตเวย์จะเก็บข้อมูลพื้นฐานของการ์ด UI (รวมถึงการกำหนดค่าขนาดและ URL ทรัพยากรของการ์ด) และมอบหมาย ID การ์ด UI ภายในเกตเวย์

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2FBt2FrX78UIyKBkwhUqm8%2Fimage.png?alt=media&#x26;token=cc5844e7-662b-45cf-912a-de419ac13efe" alt=""><figcaption></figcaption></figure>

#### 8.1.2 การดึงรายการการ์ด UI

* **\[ผู้ให้บริการ UI]**: เรียก API เพื่อนำรายการการ์ด UI
* **\[เซิร์ฟเวอร์เกตเวย์]**: ส่งคืนรายการการ์ด UI ที่เก็บไว้บนเกตเวย์ รวมถึงการ์ด UI ที่กำหนดเองที่ไม่ได้สร้างโดยผู้เรียก

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2F7a1myMdJ8j33N03L4KBi%2Fimage.png?alt=media&#x26;token=9c7c1ba3-8d28-43f3-a145-05eaeb762691" alt=""><figcaption></figcaption></figure>

#### 8.1.3 การแก้ไขการกำหนดค่าของการ์ด UI ที่ระบุ

* **\[ผู้ให้บริการ UI]**: เรียก API เพื่อแก้ไขการกำหนดค่าของการ์ด UI ที่ระบุ เช่น การกำหนดค่าขนาดและ URL ทรัพยากร
* **\[เซิร์ฟเวอร์เกตเวย์]**: เมื่อแก้ไขสำเร็จ เกตเวย์จะเก็บข้อมูลการ์ด UI ที่อัปเดต รวมถึงการกำหนดค่าขนาดใหม่และ URL ทรัพยากร

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2FSub47oZd5irq2dDhLhrf%2Fimage.png?alt=media&#x26;token=c9080c5e-1b49-4b00-ab31-bf2337b49d35" alt=""><figcaption></figcaption></figure>

#### 8.1.4 การลบการ์ด UI ที่กำหนดเอง

1. **\[ผู้ให้บริการ UI]**: เรียก API เพื่อลบการ์ด UI ที่กำหนดเองที่ระบุ
2. **\[เซิร์ฟเวอร์เกตเวย์]**: เกตเวย์จะลบข้อมูลที่เกี่ยวข้องทั้งหมดของการ์ด UI ที่ระบุ

<figure><img src="https://2689310717-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCnF8kmk9yw3yiy2mRerq%2Fuploads%2FNAX4WVWWxGUwzz33BzHq%2Fimage.png?alt=media&#x26;token=05cacc3e-be1b-44c9-a009-ab83d860bcce" alt=""><figcaption></figcaption></figure>

### 8.2 โมดูลการ์ด UI ที่กำหนดเอง

#### 8.2.1 การสร้างการ์ด UI ที่กำหนดเอง

> ผู้ให้บริการ UI ส่งคำขอไปยังเกตเวย์เพื่อสร้างการ์ด UI ที่กำหนดเอง

:::tips

* **URL**：`/open-api/v2/rest/ui/cards`
* **Method**：`POST`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ:

| **คุณลักษณะ**  | **ประเภท**         | **ทางเลือก** | **คำอธิบาย**                                                   |
| -------------- | ------------------ | ------------ | -------------------------------------------------------------- |
| label          | string             | Y            | ป้ายการ์ด: ใช้เพื่ออธิบายการ์ด เป็นชื่อเล่นของการ์ด            |
| cast\_settings | CastSettingsObject | Y            | การตั้งค่าการ์ด Cast: การตั้งค่าการกำหนดค่าสำหรับการ์ดแบบ cast |
| web\_settings  | WebSettingsObject  | N            | การตั้งค่าการ์ดเว็บ: การตั้งค่าการกำหนดค่าสำหรับการ์ดเว็บ      |

CastSettingsObject:

| **คุณลักษณะ** | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**                                                     |
| ------------- | ------------------- | ------------ | ---------------------------------------------------------------- |
| dimensions    | DimensionObject \[] | N            | การกำหนดค่าขนาด: ต้องรวมการกำหนดค่าอย่างน้อยหนึ่งรายการ          |
| default       | string              | N            | สเปคปริยาย: สเปคขนาดปริยายใช้ได้ พารามิเตอร์ที่เป็นตัวเลือก: 2x2 |

WebSettingsObject:

| **คุณลักษณะ**     | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**                                            |
| ----------------- | ------------------- | ------------ | ------------------------------------------------------- |
| dimensions        | DimensionObject \[] | N            | การกำหนดค่าขนาด: ต้องรวมการกำหนดค่าอย่างน้อยหนึ่งรายการ |
| drawer\_component | DrawerObject        | Y            | การตั้งค่าการแสดงส่วนประกอบลิ้นชัก                      |
| default           | string              | N            | สเปคปริยาย:                                             |

* 1x1
* 2x1 |

DimensionObject:

| **คุณลักษณะ**                              | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                      |
| ------------------------------------------ | ---------- | ------------ | ------------------------------------------------- |
| src                                        | string     | N            | URL ทรัพยากร: ตัวอย่างเช่น: <http://example.html> |
| size                                       | string     | N            | สเปคขนาด:                                         |
| พารามิเตอร์ตัวเลือกของ CastSettingsObject: |            |              |                                                   |

* 2×2

พารามิเตอร์ตัวเลือกของ WebSettingsObject:

* 1x1
* 2x1 |

DrawerObject:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                      |
| ------------- | ---------- | ------------ | ------------------------------------------------- |
| src           | string     | N            | URL ทรัพยากร: ตัวอย่างเช่น: <http://example.html> |

การตอบกลับข้อมูลที่สำเร็จ:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**            |
| ------------- | ---------- | ------------ | ----------------------- |
| id            | string     | N            | ID เอกลักษณ์ของการ์ด UI |

:::tips **เงื่อนไข** : พารามิเตอร์คำขอถูกต้อง และการตรวจสอบตัวตนของผู้ใช้ผ่าน \*\*Status Code: \*\* `200 OK` ::: 请求示例：

```json
{
  "label": "ewelink cube card",
  "cast_settings": {
    "dimensions": [
      {
        "src": "https://ewelink.cc/ewelink-cube/",
        "size": "2×2"
      }
    ],
    "default": "2×2"
  },
  "web_settings": {
    "dimensions": [
      {
        "src": "https://ewelink.cc/ewelink-cube/",
        "size": "2×1"
      },
      {
        "src": "https://ewelink.cc/ewelink-cube/",
        "size": "1×1"
      }
    ],
    "drawer_component": {
      "src": "https://ewelink.cc/ewelink-cube/"
    },
    "default": "2×1"
  }
}
```

ตัวอย่างการตอบกลับ:

```json
{
  "error": 0,
  "data": {
    "id": "72cc5a4a-f486-4287-857f-b482d7818b16"
  },
  "message": "success"
}
```

#### 8.2.2 ดึงรายการการ์ด UI

:::tips

* **URL**：`/open-api/v2/rest/ui/cards`
* **Method**：`GET`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี พารามิเตอร์การตอบกลับ:

| **คุณลักษณะ** | **ประเภท**    | **ทางเลือก** | **คำอธิบาย**   |
| ------------- | ------------- | ------------ | -------------- |
| data          | CardObject\[] | N            | รายการการ์ด UI |

วัตถุ CardObjec:

| **คุณลักษณะ**  | **ประเภท**         | **ทางเลือก** | **คำอธิบาย**                                                       |
| -------------- | ------------------ | ------------ | ------------------------------------------------------------------ |
| id             | string             | N            | รหัสการ์ด: ตัวระบุเอกลักษณ์ของการ์ด                                |
| label          | string             | Y            | ป้ายการ์ด: ใช้เพื่ออธิบายการ์ด ทำหน้าที่เป็นนามแฝงหรือชื่อของการ์ด |
| cast\_settings | CastSettingsObject | Y            | ป้ายการ์ด: ใช้เพื่ออธิบายการ์ด เป็นชื่อเล่นของการ์ด                |
| web\_settings  | WebSettingsObject  | N            | การตั้งค่าการ์ด Cast: การตั้งค่าการกำหนดค่าสำหรับการ์ดแบบ cast     |
| app\_name      | string             | Y            | การตั้งค่าการ์ดเว็บ: การตั้งค่าการกำหนดค่าสำหรับการ์ดเว็บ          |

CastSettingsObject:

| **คุณลักษณะ**            | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**                                            |
| ------------------------ | ------------------- | ------------ | ------------------------------------------------------- |
| dimensions               | DimensionObject \[] | N            | การกำหนดค่าขนาด: ต้องรวมการกำหนดค่าอย่างน้อยหนึ่งรายการ |
| default                  | string              | N            | สเปคปริยาย:                                             |
| พารามิเตอร์ตัวเลือก: 2x2 |                     |              |                                                         |
| used                     | string              | N            | สเปคปัจจุบัน:                                           |
| พารามิเตอร์ตัวเลือก: 2x2 |                     |              |                                                         |

WebSettingsObject:

| **คุณลักษณะ**        | **ประเภท**          | **ทางเลือก** | **คำอธิบาย**                                            |
| -------------------- | ------------------- | ------------ | ------------------------------------------------------- |
| dimensions           | DimensionObject \[] | N            | การกำหนดค่าขนาด: ต้องรวมการกำหนดค่าอย่างน้อยหนึ่งรายการ |
| drawer\_component    | DrawerObject        | Y            | การตั้งค่าการแสดงส่วนประกอบลิ้นชัก                      |
| default              | string              | N            | สเปคปริยาย:                                             |
| พารามิเตอร์ตัวเลือก: |                     |              |                                                         |

* 1x1
* 2x1 | | used | string | N | สเปคปัจจุบัน: พารามิเตอร์ตัวเลือก:
* 1x1
* 2x1 |

DimensionObject:

| **คุณลักษณะ**        | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                      |
| -------------------- | ---------- | ------------ | ------------------------------------------------- |
| src                  | string     | N            | URL ทรัพยากร: ตัวอย่างเช่น: <http://example.html> |
| size                 | string     | N            | สเปคขนาด:                                         |
| พารามิเตอร์ตัวเลือก: |            |              |                                                   |

* 1x1
* 2x1

**ข้อสังเกต**: ปัจจุบัน การ์ด cast รองรับเฉพาะสเปค 2x2 เท่านั้น สเปค 2x2 จะมีผล |

DrawerObject:

| **คุณลักษณะ** | **ประเภท** | **ทางเลือก** | **คำอธิบาย**                                      |
| ------------- | ---------- | ------------ | ------------------------------------------------- |
| src           | string     | N            | URL ทรัพยากร: ตัวอย่างเช่น: <http://example.html> |

ตัวอย่างการตอบกลับ:

```json
{
  "error": 0,
  "data": [
    {
      "id": "72cc5a4a-f486-4287-857f-b482d7818b16",
      "label": "ewelink cube card",
      "cast_settings": {
        "dimensions": [
          {
            "src": "https://ewelink.cc/ewelink-cube/",
            "size": "2×2"
          }
        ],
        "default": "2×2",
        "used": "2×2"
      },
      "web_settings": {
        "dimensions": [
          {
            "src": "https://ewelink.cc/ewelink-cube/",
            "size": "2×1"
          },
          {
            "src": "https://ewelink.cc/ewelink-cube/",
            "size": "1×1"
          }
        ],
        "drawer_component": {
          "src": "https://ewelink.cc/ewelink-cube/"
        },
        "default": "2×1",
        "used": "2×1"
      },
      "appName": "ewelink-cube"
    }
  ],
  "message": "success"
}
```

#### 8.2.3 แก้ไขการกำหนดค่าของการ์ด UI ที่ระบุ

> ผู้ใช้ที่ได้รับอนุญาตได้รับอนุญาตให้แก้ไขการกำหนดค่าของการ์ด UI ที่มีอยู่ผ่านอินเทอร์เฟซนี้ ผู้ให้บริการการ์ดที่กำหนดเองสามารถแก้ไขการ์ด UI ได้เฉพาะการ์ดที่พวกเขาสร้างเท่านั้น

:::tips

* **URL**：`/open-api/v2/rest/ui/cards/{id}`
* **Method**：`PUT`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ:

| **คุณลักษณะ**  | **ประเภท**         | **ทางเลือก** | **คำอธิบาย**                             |
| -------------- | ------------------ | ------------ | ---------------------------------------- |
| label          | string             | Y            | ใช้เพื่ออธิบายการ์ด เป็นชื่อเล่นของการ์ด |
| cast\_settings | CastSettingsObject | Y            | การตั้งค่าการ์ด Cast                     |
| web\_settings  | WebSettingsObject  | Y            | การตั้งค่าการ์ดเว็บ                      |

CastSettingsObject:

| **คุณลักษณะ**        | **ประเภท** | **ทางเลือก**                                                                                      | **คำอธิบาย**  |
| -------------------- | ---------- | ------------------------------------------------------------------------------------------------- | ------------- |
| used                 | string     | Y, อย่างใดอย่างหนึ่ง `used` หรือ `src` ต้องมีการระบุ แต่ต้องมีอย่างน้อยหนึ่งในพารามิเตอร์เหล่านี้ | สเปคปัจจุบัน: |
| พารามิเตอร์ตัวเลือก: |            |                                                                                                   |               |

* 2x2

\| | src | string | Y, อย่างใดอย่างหนึ่ง `used` หรือ `src` ต้องมีการระบุ แต่ต้องมีอย่างน้อยหนึ่งในพารามิเตอร์เหล่านี้ | URL ทรัพยากร: <http://example.html> |

WebSettingsObject:

| **คุณลักษณะ**        | **ประเภท** | **ทางเลือก**                                                                                      | **คำอธิบาย**  |
| -------------------- | ---------- | ------------------------------------------------------------------------------------------------- | ------------- |
| used                 | string     | Y, อย่างใดอย่างหนึ่ง `used` หรือ `src` ต้องมีการระบุ แต่ต้องมีอย่างน้อยหนึ่งในพารามิเตอร์เหล่านี้ | สเปคปัจจุบัน: |
| พารามิเตอร์ตัวเลือก: |            |                                                                                                   |               |

* 1x1
* 2x1 | | src | string | Y, อย่างใดอย่างหนึ่ง `used` หรือ `src` ต้องมีการระบุ แต่ต้องมีอย่างน้อยหนึ่งในพารามิเตอร์เหล่านี้ | URL ทรัพยากร: <http://example.html> |

การตอบกลับข้อมูลที่สำเร็จ: :::tips **เงื่อนไข**: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ การ์ด UI ที่กำลังแก้ไขต้องถูกสร้างโดยผู้ให้บริการการ์ด UI ที่กำหนดเองที่เรียกอินเทอร์เฟซนี้ \*\*รหัสสถานะ: \*\* `200 OK` **รหัสข้อผิดพลาด:**

* **406**: ไม่มีสิทธิ์เข้าถึงทรัพยากรนี้ ::: \*\*ตัวอย่างการตอบกลับ: \*\*

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```

\*\*ตัวอย่างคำขอ: \*\*

```json
{
  "cast_settings": {
    "used": "2×2"
  },
  "web_settings": {
    "used": "1×1"
  }
}
```

#### 8.2.4 ลบการ์ด UI ที่กำหนดเอง

> ผู้ใช้ที่ได้รับอนุญาตได้รับอนุญาตให้ลบการ์ด UI ที่มีอยู่โดยใช้อินเทอร์เฟซนี้ ผู้ให้บริการการ์ดที่กำหนดเองสามารถลบการ์ด UI ได้เฉพาะการ์ดที่พวกเขาสร้างเท่านั้น

:::tips

* **URL**：`/open-api/v2/rest/ui/cards/{id}`
* **Method**：`DELETE`
* **Header**：
  * Content-Type: application/json
  * Authorization: Bearer ::: พารามิเตอร์คำขอ: ไม่มี ข้อมูลการตอบกลับที่สำเร็จ: :::tips **เงื่อนไข**: พารามิเตอร์คำขอถูกต้องตามกฎหมาย และผ่านการตรวจสอบตัวตนของผู้ใช้ การ์ด UI ที่กำลังแก้ไขต้องถูกสร้างโดยผู้ให้บริการการ์ด UI ที่กำหนดเองที่เรียกอินเทอร์เฟซนี้ \*\*รหัสสถานะ: \*\* `200 OK` **รหัสข้อผิดพลาด:**
* **406**: ไม่มีสิทธิ์เข้าถึงทรัพยากรนี้. ::: \*\*ตัวอย่างการตอบกลับ: \*\*

```json
{
  "error": 0,
  "data": {},
  "message": "success"
}
```
