# 關機自動防霉（內部清潔）觸發調查

調查目標：透過本地 CGI（`/dsiot/multireq`）關機時，能否像遙控器一樣觸發機器的「自動內部清潔 / 防霉乾燥」運轉。

測試機種 IP：`10.1.10.124`，模式測試以冷氣（`e_3001/p_01 = 0200`）為主。

## 協定背景

- 電源：`/dsiot/edge/adr_0100.dgc_status` 之 `e_1002/e_A002/p_01`，`01` = 開、`00` = 關。
- 操作類型旗標：`e_1002/e_3003/p_2D`，由官方 App 封包觀察到三種值：
  - `00` = 開機（power on）
  - `01` = 關機（power off）
  - `02` = 設定變更（調溫度／模式／風量）
- 運轉狀態指標（本次測試校準出來）：
  - `e_3003/p_02`：運轉旗標，運轉中 `01`、停止 `00`。
  - `e_3003/p_37`：風扇狀態，運轉中非零（冷氣時觀察到 `02`/`03`）、停止 `00`。
  - `e_3003/p_2A`、`p_2F` 亦隨運轉/停止變動，可作輔助判讀。
  - `last_ope/type`：CGI 關機後觀察到變為 `100`。

## 假設

原本 `setPowerStatus()` 不論開關，`p_2D` 一律送 `02`（SETTING），等於把「真正關機」標記成「改設定」。
假設改送 `p_2D = 01`（真正關機）後，機器會把它當成正常使用者關機，進而觸發關機後的防霉乾燥循環。

## 實測

| 測試 | 關機前狀態 | 送出 `p_2D` | 關機後 `p_01` | 關機後 `p_02` / `p_37` | 防霉是否啟動 |
|------|-----------|------------|--------------|----------------------|------------|
| A（舊行為）| 已運轉一段時間 | `02`（SETTING）| `00` | `00` / `00` | 否 |
| B（短開即關）| 開機僅 6 秒 | `01`（OFF）| `00` | `00` / `00` | 否（運轉太短，本就不應觸發）|
| C（有效條件）| **連續冷氣運轉約 16 分鐘**累積冷凝水 | `01`（OFF）| `00` | `00` / `00` | **否** |

測試 C 是有效條件下的關鍵測試：機器確實運轉夠久、確實關閉，但關機後運轉指標全部歸零，風扇未續轉，**防霉未啟動**。

## 重要事實（使用者提供）

- **官方 App 透過網路關機，同樣無法觸發防霉**。
- 此限制**明載於產品說明手冊**。

官方 App 走的是相同的 dsiot 協定，它都做不到，佐證了：關機後的防霉乾燥**並未開放給網路 API**，而是綁在紅外線遙控器 / 機器本機停機邏輯上。

## 目前結論

- `p_2D` 送對值（`01`）**無法**觸發關機後防霉；這不是參數送錯的問題。
- 任何透過網路（`e_A002/p_01 = 00`）的關機，不論 `p_2D` 帶什麼值，機器一律不跑防霉，屬韌體設計限制。
- `p_2D = 01` 在語意上仍比 `02` 正確（關機本來就不是設定變更），但對防霉無實質效果。

## 防霉運轉中狀態抓取（遙控器關機觸發）

由遙控器手動關機、防霉實際運轉時，抓取完整狀態，與「CGI 關機未防霉」基準比對。

防霉運轉中的關鍵欄位：

| 欄位 | CGI 關機（無防霉）| 遙控器關機（防霉中）| 性質 |
|------|------------------|---------------------|------|
| `e_A002/p_01` 電源 | `00` | `00` | 兩者皆關 |
| `e_3003/p_02` 運轉旗標 | `00` | `00` | 防霉不被表現為「運轉」|
| `e_3003/p_37` 風扇旗標 | `00` | `00` | 同上 |
| `e_3001/p_01` 模式 | `0200` | `0200` | 未變 |
| `last_ope/type` | `100` | `1` | **唯一關鍵差異** |
| `e_A006/p_13` 操作記錄碼 | `07` | `0A` | 唯讀 log（`pt=3`）|

附帶觀察：

- 防霉運轉時室外機 `adr_0200`（`e_2008`/`e_2009`/`e_A005` 等）遙測明顯隨時間變動，代表機器物理上確實在跑防霉；但 `adr_0100` 狀態樹完全不把它表現成運轉狀態（電源 `0`、運轉旗標 `0`、模式不變）。
- 防霉運轉時**未設定任何可寫入（`pt=2`）的旗標**。所有用來區分有無防霉的欄位皆為唯讀狀態/記錄欄位。

`last_ope/type` 語意：

- `1` = 紅外線遙控器
- `100` = 網路（官方 App / CGI）

此值由機器**依命令來源**自行標記，網路端一律為 `100`，無法偽裝成 `1`。

## 最終結論

- 防霉的觸發**綁定在命令來源（IR 遙控器）**，在韌體層級就把網路命令排除。
- 防霉運轉狀態中**不存在可由 CGI 寫入、用來觸發防霉的命令參數**——區分欄位全為唯讀。
- 因此「CGI 關機自動觸發防霉」**無法達成**，與官方 App 的限制、手冊載明的限制一致。
- `p_2D` 改送 `01` 對防霉無效（但語意上仍較 `02` 正確）。

## 仍可探索的方向（未驗證）

本次觸發的是「**自動**內部清潔（關機後自動跑）」，其來源判斷無法繞過。
若機種／官方 App 另有「**手動啟動內部清潔**」按鈕（與關機無關的獨立功能），該動作可能對應一個可寫入的命令參數。要釐清需另外抓取「手動按下內部清潔」當下送出的封包，本次自動防霉的狀態並不會揭露它。
