> For the complete documentation index, see [llms.txt](https://cube.ewelink.cc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cube.ewelink.cc/english-th/resources/api.md).

# คู่มือสำหรับนักพัฒนาและ 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="/files/d19160a0f250971ac12872fd4c5f6bf16cc5a984" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/f4d6f55860769b137b4fd72f0df8b1d31e3c3394" 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="/files/d8990521c219d5cb06b7dbb218ae0ad716daf12b" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/bebe4a657d16e8a82b550bde601c566fc909a3e5" 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="/files/72f7003f085f996aa89f7554a19e765151d0f9c4" alt=""><figcaption></figcaption></figure>

#### 6.1.2 รับรายการเสียงที่สังเคราะห์แล้ว

1. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการบริการเครื่องยนต์ TTS ที่ลงทะเบียน คุณสามารถรับรายการเครื่องยนต์ TTS ที่ลงทะเบียนปัจจุบัน (รวมถึง ID ของเครื่องยนต์ TTS ที่เกตเวย์จัดสรร)
2. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการเสียงของเครื่องยนต์ TTS ที่ระบุ เกตเวย์จะส่งคำสั่งรายการเสียงแบบซิงโครไนซ์ไปยังผู้ให้บริการ TTS ที่ระบุและส่งคืนผลลัพธ์

<figure><img src="/files/47d9b3f0fd1e67aed915a43e4ae0acbcf7f2c62c" alt=""><figcaption></figcaption></figure>

#### 6.1.3 การสังเคราะห์เสียงโดยระบุเครื่องยนต์เสียง

1. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการบริการเครื่องยนต์ TTS ที่ลงทะเบียน คุณสามารถรับรายการเครื่องยนต์ TTS ที่ลงทะเบียนปัจจุบัน (รวมถึง ID ของเครื่องยนต์ TTS ที่เกตเวย์จัดสรร)
2. 【ไคลเอนต์ Gateway Open API】เรียกอินเทอร์เฟซเพื่อขอรับรายการเสียงของเครื่องยนต์ TTS ที่ระบุ เกตเวย์จะส่งคำสั่งรายการเสียงแบบซิงโครไนซ์ไปยังผู้ให้บริการ TTS ที่ระบุและส่งคืนผลลัพธ์

<figure><img src="/files/ee2f4c31262dbb922d509aabc3dc79b94afbde3a" 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="/files/bdbbdd45c0b9470b424b35997d1569d3045d6a4e" alt=""><figcaption></figcaption></figure>

#### 8.1.2 การดึงรายการการ์ด UI

* **\[ผู้ให้บริการ UI]**: เรียก API เพื่อนำรายการการ์ด UI
* **\[เซิร์ฟเวอร์เกตเวย์]**: ส่งคืนรายการการ์ด UI ที่เก็บไว้บนเกตเวย์ รวมถึงการ์ด UI ที่กำหนดเองที่ไม่ได้สร้างโดยผู้เรียก

<figure><img src="/files/e0781f189cd441b2130768608aca56de7ce367ae" alt=""><figcaption></figcaption></figure>

#### 8.1.3 การแก้ไขการกำหนดค่าของการ์ด UI ที่ระบุ

* **\[ผู้ให้บริการ UI]**: เรียก API เพื่อแก้ไขการกำหนดค่าของการ์ด UI ที่ระบุ เช่น การกำหนดค่าขนาดและ URL ทรัพยากร
* **\[เซิร์ฟเวอร์เกตเวย์]**: เมื่อแก้ไขสำเร็จ เกตเวย์จะเก็บข้อมูลการ์ด UI ที่อัปเดต รวมถึงการกำหนดค่าขนาดใหม่และ URL ทรัพยากร

<figure><img src="/files/c1282851b0b9dee6e56bf3884e6bdb95554d3673" alt=""><figcaption></figcaption></figure>

#### 8.1.4 การลบการ์ด UI ที่กำหนดเอง

1. **\[ผู้ให้บริการ UI]**: เรียก API เพื่อลบการ์ด UI ที่กำหนดเองที่ระบุ
2. **\[เซิร์ฟเวอร์เกตเวย์]**: เกตเวย์จะลบข้อมูลที่เกี่ยวข้องทั้งหมดของการ์ด UI ที่ระบุ

<figure><img src="/files/a4a0cf364a58041e7eb3ecf37ce03d7bf60b7f0b" 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"
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cube.ewelink.cc/english-th/resources/api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
