Dysonの空気清浄機

# はじめに
ダイソン空気清浄機は、MQTTで情報取得と制御ができます。
情報取得と制御のMQTTパラメータの一覧をまとめておきます。

# MQTTシーケンス図
ダイソン空気清浄機の現在の情報は、以下のシーケンス図の(a), (b)で取得できます。
電源のON/OFFなどの制御は、以下の図の(c)で実現できます。
それぞれMQTTのメッセージですが、以下で簡単に内容を記載します。
<img width="700" alt="DysonMQTT.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/b20b78b3-965d-454a-86b6-6ec25d190a99.png">

# ダイソンの空気清浄機からの情報取得

ダイソンの空気清浄機の情報取得は、上記図(a),(b)のように以下の順番でMQTTのメッセージを送信します。それぞれ説明します。
1. CONNECT送信
2. SUBSCRIBE送信
3. PUBLISH送信
4. PUBLISH受信　(情報受信)

### 1. 接続 (CONNECT)
MQTTのCONNECTに必要なパラメータは、以下です。
MQTTポート番号は、`1883`。
MQTTバージョンは、`4 (3.1.1を示している)`。

MQTTのユーザ名とパスワードは、「製品SSID」と「製品Wi-Fiパスワード」から生成できます。具体的には、「[pythonでDyson扇風機の操作 やってみた]
(https://qiita.com/ko-p/items/86d1e7807cccda96633d)」等を見てください。

### 2. 参加 (SUBSCRIBE)
トピックに参加することで、
現在の情報を取得することができます。MQTTのメッセージは、`SUBSCRIBE`を送信します。
情報取得のために参加するMQTTトピックは、`<ProductType>/<Username>/status/current`です。`ProductType`は製品ごとの番号です。具体的には、この記事の最後に載せています。`Username`は、上記の接続(CONNECT)で使ったユーザ名になります。

### 3. 情報取得要求の送信 (PUBLISH)
ダイソンの空気清浄機から情報をすぐに取得する場合は、以下のメッセージを送信します。、MQTTトピックは、`<ProductType>/<Username>/command`です。情報取得要求のメッセージは、２つの種類があります、以下がメッセージ例です。

#### 現在の情報取得 (REQUEST-CURRENT-STATE)
```
Message: {"msg": "REQUEST-CURRENT-STATE", "time": "2020-08-24T07:27:08Z"}
```

#### 現在の環境情報取得 (REQUEST-PRODUCT-ENVIRONMENT-CURRENT-SENSOR-DATA)
```
Message: {"time":"2020-09-17T01:11:30Z","msg":"REQUEST-PRODUCT-ENVIRONMENT-CURRENT-SENSOR-DATA","mode-reason":"LAPP"}
```

### 4. 情報取得応答の受信 (PUBLISH)
ダイソンの空気清浄機から、MQTTトピック`<ProductType>/<Username>/status/current`に対して、現在の機器の状況が送信されます。メッセージは、以下の３つの種類があります。

#### 情報取得パラメーター (CURRENT-STATE/STATE-CHANGE)

JSONタグ: product-state

| JSONタグ | 意味 | 値 |
|:-:|:-:|---|
|ffoc| ディフューズドモード<br>フォーカスモード | OFF/ON<br>OFF:ディフューズドモードあり<br>ON:ディフューズドモードなし<br>反対なので注意  |
|filf|　フィルタ寿命(時間) | 0000 - 4300 | 
|fmod|　ファンモード | OFF/ FAN / AUTO <br> OFF: 電源OFF<br> FAN: 電源ON|
|fnsp|　風量 |0001 - 0010 / AUTO  |
|fnst|　ファン状態 |OFF/FAN <br> 暖房ONの場合はこの値はOFF|
|hmax| 暖房の設定温度(K) | (温度(C)+273)×10 | 
|hmod| 暖房 | OFF/HEAT | 
|hsta|　? |  |
|nmod|　ナイトモード |OFF/ON |
|oson|　首振り |OFF/ON |
|qtar|　空気の質 (Air Quality ) |0001(BETTER)<br>0003(HIGH)<br>0004(NORMAL)| 
|rhtm|　スタンバイモード | OFF/ON |
|ercd|　? |  |
|wacd|　? |  |
|tilt|　? |  |

##### ダイソンからのメッセージ例

```
{"msg":"CURRENT-STATE","time":"2020-09-02T23:10:09.000Z","mode-reason":"LAPP","state-reason":"MODE","dial":"OFF","rssi":"-66","product-state":{"fmod":"OFF","fnst":"OFF","fnsp":"0003","qtar":"0003","oson":"OFF","rhtm":"ON","filf":"1467","ercd":"NONE","nmod":"OFF","wacd":"NONE","hmod":"OFF","hmax":"2932","hsta":"OFF","ffoc":"ON","tilt":"OK"},"scheduler":{"srsc":"691a","dstv":"0000","tzid":"0001"}}
```

```
{"msg":"STATE-CHANGE","time":"2020-09-02T23:10:10.000Z","mode-reason":"","state-reason":"MODE","product-state":{"fmod":["OFF","FAN"],"fnst":["OFF","FAN"],"fnsp":["0003","0003"],"qtar":["0003","0003"],"oson":["OFF","OFF"],"rhtm":["ON","ON"],"filf":["1467","1467"],"ercd":["NONE","NONE"],"nmod":["OFF","OFF"],"wacd":["NONE","NONE"],"hmod":["OFF","OFF"],"hmax":["2932","2932"],"hsta":["OFF","OFF"],"ffoc":["ON","ON"],"tilt":["OK","OK"]},"scheduler":{"srsc":"691a","dstv":"0000","tzid":"0001"}}
```


#### 情報取得パラメーター (ENVIRONMENTAL-CURRENT-SENSOR-DATA)

JSONタグ: data

| JSONタグ | 意味 |値 | 
|:-:|:-:|---|
|hact| 湿度 (%) | 0000 - 0100 |
|pact|	ダスト|	0000 - 0009 |
|sltm|	スリープタイマー |OFF/ 1 - 9999 |
|tact| 温度 (K) | 0000 - 5000 | 
|vact|	VOC(揮発性有機化合物)|	0001 - 0009

##### ダイソンからのメッセージ例
```
{"msg":"ENVIRONMENTAL-CURRENT-SENSOR-DATA","time":"2020-09-02T23:10:15.001Z","data":{"tact":"3004","hact":"0076","pact":"0001","vact":"INIT","sltm":"OFF"}}
```

# ダイソンの空気清浄機の制御

制御のために参加するMQTTトピックは、`<ProductType>/<Username>/command`です。`ProductType`は製品ごとの番号です。具体的には、パラメータ(プロダクトタイプ)です。`Username`は、上記の接続(CONNECT)で使ったユーザ名になります。以下は、MQTT PUBLISHのメッセージ例です。

#### 扇風機の制御 (STATE-SET)
```
{"msg":"STATE-SET","time":"2020-08-21T13:01:23.000Z","data":{"oson":"ON","fmod":"FAN"}}
```

STATE-SETメッセージ内のJSONタグの意味は、以下になります。

##### 制御パラメータ

| JSONタグ | 意味 |値 | 搭載機器 |
|:-:|:-:|:-:|:-:|
| fmod | ファンモード |OFF/FAN/AUTO | 基本|
| fnsp | 風量 | 0001 - 0010 | 基本|
| oson | 首振り|ON/OFF      | 基本|
| nmod | ナイトモード|ON/OFF      | 基本|
| sltm | スリープタイマー(分) | OFF/[分]|基本|
| rstf | フィルタリセット |   RSTF |基本|
| ffoc | ディフューズドモード<br>送風方向 | OFF/ON |風向|
| rhtm | スタンバイモード<br>情報メニュー表示 | OFF/ON |情報表示| 
| hmax | 暖房の設定温度(K) | (温度(C)+273)×10 |暖房|
| hmod | 暖房 | OFF/HEAT |暖房|
| ? | 加湿自動モード | ? |加湿|
| ? | 加湿設定湿度 | ? (30%〜70%) |加湿|



# 製品ごとのプロダクトタイプ番号と機能リスト
製品型番ごとの`プロダクトタイプ`と制御可能な機能リストを以下の表に示す。

|プロダクトタイプ | 型番 | 製造番号<br>(上位3桁) | 製品 | 基本 | 風向 | 情報表示 | 暖房 | 加湿 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|276|RB02| ZX7 | Dyson 360 Heurist ロボット掃除機 |×|×|×|×|×|
|358|PH01| |加湿空気清浄機 |○|○|○|×|○|
|　　|MF01| |加湿機(Wi-Fiなし) |○|×|×|×|○|
|   |HP00|TJ2<br>MV2 |空気清浄機能付ファンヒーター(Wi-Fiなし) |○|×|×|○|×|
|   |HP01| |空気清浄機能付ファンヒーター(Wi-Fiなし) |○|×|×|○|×|
|   |HP02| |空気清浄機能付ファンヒーター |○|○|×|○|×|
|455|HP03|G5V(-IS)<br>PE4(-IB)<br>SX2(-IB)<br>PE5(-WS)<br>SX3(-WS) |空気清浄機能付ファンヒーター<br>(IS: アイアン/シルバー, IB: アイアン/ブルー, WS: ホワイト/シルバー) |○|○|×|○|×|
|527|HP04|ZZ1(-WS)<br>E4H(-WS)<br>ZZ2(-IB)<br>E4J(-IB) |空気清浄機能付ファンヒーター<br>(WS: ホワイト/シルバー, IB: アイアン/ブルー) |○|○|○|○|×|
|   |DP01||空気清浄機能付テーブルファン |○|×|×|×|×|
|469|DP03|SU2|空気清浄機能付テーブルファン|○|×|×|×|×|
|520|DP04| |空気清浄テーブルファン |○|○|○|×|×|
|   |TP00||空気清浄機能付ファン(Wi-Fiなし) |○|×|×|×|×|
|438(?)   |TP02||空気清浄機能付タワーファン |○|×|×|×|×|
|475|TP03|SR1(-WS)<br>NK4(-WS)<br>SR2(-IB)<br>NK5(-IB) |空気清浄機能付タワーファン<br>(WS: ホワイト/シルバー, IB: アイアン/ブルー) |○|×|×|×|×|
|   |TP04|VS1(-WS)<br>E4E(-WS)|空気清浄タワーファン<br>(WS: ホワイト) |○|○|○|×|×|

# 参考文献
- [pythonでDyson扇風機の操作 やってみた](https://qiita.com/ko-p/items/86d1e7807cccda96633d)
- https://github.com/CharlesBlonde/libpurecoollink
- https://github.com/shadowwa/Dyson-MQTT2RRD