Daikin APPのエアコンをHomebridge経由でHomekitから操作する

はじめに

ダイキンスマートアプリ対応のエアコンをHomekitから操作する方法を記載する。

以前は「http://”IPアドレス”/airco/get_model_info」などでhttpから直接確認できたが、ファームアップデートや最近の機種ではこの方法が使えない場合がある。ダイキン公式がサポートしている方法はダイキンスマートアプリ(以下、Daikin APP)、Alexa、Google Homeの3つしかない。そこで、Daikin APPの操作をHomekitで利用できるようにする。

本記事は2023年モデルのAシリーズ(AN223AAS)のエアコンで動作確認を実施する。うるさらなど、加湿機能は別のコマンドのため、所有しているエアコンで正しく動作するかは以下に記載する手順で確認する必要がある。

全体の流れ

  1. Daikin APPで操作した通信をmitmproxyでパケットキャプチャ
  2. キャプチャしたパケットをPostmanでPOSTしてレスポンスを取得
  3. レスポンスの内容を解析
  4. 操作用にPOSTするプログラムを作成(今回はPython)
  5. Homebridge Cmd4をインストール、設定
  6. Cmd4用のプログラムを作成
  7. 動作テスト

前提条件

  • ダイキンのエアコンにWi-FI機能があり、スマートフォンのDaikin APPにエアコンが登録されていること
  • Daikin APPのエアコンの詳細からMACアドレスを確認し、エアコンを固定IPアドレスとしていること(Wi-FIルータの設定またはDHCPサーバーで設定する)
  • Homebridge UIがセットアップ済みであること(当方はRaspberry Piで稼働)
  • Homebridgeを稼働しているサーバーでPython3が実行できること

Daikin APPで操作した通信をmitmproxyでパケットキャプチャ

mitmproxyをインストールする。Macの場合は以下のコマンドを入力する。

$ brew install mitmproxy

インストールが完了したら以下のコマンドでmitmproxyを起動する。※9999はポート番号なので、好きな数字を入力する。

$ mitmproxy -p 9999

mitmproxyを起動した機器とスマートフォンを同じネットワークに接続し、mitmproxyを起動した機器のプライベートIPアドレスを確認し、スマートフォンにプロキシー設定をする。

  • iPhone:「設定」→「Wi-Fi」→「接続中のWi-Fi名」→最下部のHTTPプロキシ「プロキシを構成」→「手動」
  • Andoroid:「設定」→「ネットワークとインターネット」→「インターネット」→「接続中のWi-Fi名」→右上の「鉛筆マーク」→「詳細設定」→「プロキシ」→「手動」
サーバ(プロキシのホスト名):192.168.*.***(mitmproxyを起動した機器のプライベートIPアドレス)
ポート:9999(先程設定したポート番号)
認証:オフ
  1. mitmproxyの証明書をインストールするため、スマートフォンのブラウザで「http://mitm.it」にアクセス
  2. 対象のOSを選択し、プロファイルをインストール
  3. iPhone:「設定」→「一般」→「情報」→最下部の「証明書信頼設定」→mitmproxyを「オン」
  4. Daikin APPを起動

アプリを起動すると「HTTP POST 192.168.*.*** /diiot/multireq」が表示されることが分かる。それを選択するとPOSTしているJSONが確認できる。「w」を入力し「./test1.txt」でファイルを保存することができる。

アプリで冷房などの操作をすると「HTTPS PUT api.daikinsmartdb.jp /dsiot/multireq」が表示される。同様にPUTしているJSONを確認し、test2.txtとして保存する。

上記2つのPOST/PUTを行うことで情報の取得と操作をすることができることが分かった。

キャプチャしたパケットをPostmanでPOSTしてレスポンスを取得

mitmproxyから得られたログでも解析はできるが、実際に値を変えてPOSTして確認をしたいので、ここではPostmanを使用してレスポンスのJSONを解析する。

  1. Postmanから対象機器(ここではMac)のアプリをダウンロードして起動する。
  2. POSTを選択して、URLに「http://192.168.*.***/dsiot/multireq」を入力する(*はエアコンのIPアドレス)。
  3. URL欄の下の「Body」を選択し、「raw」を選択する。
  4. rawの2つ右側の「Text」を「JSON」に変更し、テキストボックスにtest1.txtのPOSTしたJSONの内容を入力する。(当方のtest1.txtは下記が記載されていた。)
{
    "requests":[
        {
            "op":2,
            "to":"/dsiot/edge/adr_0100.dgc_status?filter=pv"
        }
    ]
}

入力できたら「Send」で送信すると、返ってきたレスポンスが下にJSONで表示される。レスポンスをVisual Studio Codeなど適当なテキストエディタに貼り付けて保存し、後述の解析で使用する。

レスポンスの内容を解析

先程のリクエストでエアコンの情報が取得できたのでレスポンスを解析する。全情報の解析はできていないため、最低限必要な情報だけ以下に記述する。

e_A002:p_01:現在の運転状態(00:停止中、01:運転中)

{
    "pn": "e_A002",
    "pt": 1,
    "pch": [
        {
            "pn": "p_01",
            "pt": 2,
            "pv": "00"
        }
    ]
},

e_A00B:p_01:現在の温度(16進数)
e_A00B:p_02:現在の湿度(16進数)

{
    "pn": "e_A00B",
    "pt": 1,
    "pch": [
        {
            "pn": "p_01",
            "pt": 3,
            "pv": "19"
        },
        {
            "pn": "p_02",
            "pt": 3,
            "pv": "32"
        }
    ]
},

上記より、情報の記載箇所は判明した。

次に、操作を行うための情報を解析する。test2.txtのPUTしている情報は以下である。

{
    "requests": [
        {
            "op": 3,
            "to": "/dsiot/edges/*******/adr_0100.dgc_status",
            "pc": {
                "pn": "dgc_status",
                "pch": [
                    {
                        "pn": "e_1002",
                        "pch": [
                            {
                                "pn": "e_A002",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "00"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3003",
                                "pch": [
                                    {
                                        "pn": "p_2D",
                                        "pv": "02"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3001",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "0200"
                                    },
                                    〜中略〜
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

上記JSONをPostmanを使用してエアコンのIPアドレスにPUTしたが、アクセス権限がなくエラーとなった。

ダイキンサーバーを使用せずプライベートIPで指定する場合はPOSTしか受け付けていないため、PostmanのPUTをPOSTに変更する。

また、”to”: “/dsiot/edges/数字/adr_0100.dgc_status”,のうち、「edges/数字/」を「edge/」に書き換えて

「”to”: “/dsiot/edge/adr_0100.dgc_status”,」と記載することで、エアコンの操作ができるようになった。

以下に当方で解析したPOSTするJSONと意味を記載する。※加湿などの機能がある場合は検証できていないので、上記の手順で解析して、適宜、POSTするJSONを作成すること。

共通

OP:制御(2:参照系、3:制御系)
e_A002:p_01:操作後の運転状態(00:停止状態、01:運転状態)
e_3003:p_2D:制御内容(00:運転開始、01:停止、02:設定変更)
e_3001:p_01:運転モード(0000:送風、0100:暖房、0200:冷房、0300:自動、0500:除湿)

冷房

e_3001:
p_02:冷房の設定温度(3A(16)->58(10)->58/2->29(deg))
p_03:暖房の設定温度(32(16)->50(10)->50/2->25(deg))
p_05:冷房の風向上下(000000:OFF、100000:自動、0F0000:スイング、140000:サーキュレーションON(風向上下OFF)、010000:1段目(上)、020000:2段目、030000:3段目、040000:4段目、050000:5段目、060000:6段目(下))
p_06:冷房の風向左右(000000:OFF、0F0000:スイング)
p_09:冷房の風量(0A00:自動、0B00:静か、0300:風量1、0400:風量2、0500:風量3、0600:風量4、0700:風量5)
p_0B:冷房の湿度(p_0Cが01の場合)(00:OFF、0A:50%、0B:55%、0C:60%)
p_0C:冷房の湿度(00:OFF、06:連続、01:ON(p_0Bが必要))
{
    "requests": [
        {
            "op": 3,
            "to": "/dsiot/edge/adr_0100.dgc_status",
            "pc": {
                "pn": "dgc_status",
                "pch": [
                    {
                        "pn": "e_1002",
                        "pch": [
                            {
                                "pn": "e_A002",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "00"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3003",
                                "pch": [
                                    {
                                        "pn": "p_2D",
                                        "pv": "02"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3001",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "0200"
                                    },
                                    {
                                        "pn": "p_02",
                                        "pv": "3A"
                                    },
                                    {
                                        "pn": "p_05",
                                        "pv": "100000"
                                    },
                                    {
                                        "pn": "p_06",
                                        "pv": "0F0000"
                                    },
                                    {
                                        "pn": "p_09",
                                        "pv": "0A00"
                                    },
                                    {
                                        "pn": "p_0B",
                                        "pv": "0C"
                                    },
                                    {
                                        "pn": "p_0C",
                                        "pv": "01"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

暖房

e_3001:
p_03:暖房の設定温度(32(16)->50(10)->50/2->25(deg))
p_07:暖房の風向上下(000000:OFF、100000:自動、0F0000:スイング、140000:サーキュレーションON(風向上下OFF)、010000:1段目(上)、020000:2段目、030000:3段目、040000:4段目、050000:5段目、060000:6段目(下))
p_08:暖房の風向左右(000000:OFF、0F0000:スイング)
p_0A:暖房の風量(0A00:自動、0B00:静か、0300:風量1、0400:風量2、0500:風量3、0600:風量4、0700:風量5)
{
    "requests": [
        {
            "op": 3,
            "to": "/dsiot/edge/adr_0100.dgc_status",
            "pc": {
                "pn": "dgc_status",
                "pch": [
                    {
                        "pn": "e_1002",
                        "pch": [
                            {
                                "pn": "e_A002",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "00"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3003",
                                "pch": [
                                    {
                                        "pn": "p_2D",
                                        "pv": "02"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3001",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "0100"
                                    },
                                    {
                                        "pn": "p_03",
                                        "pv": "32"
                                    },
                                    {
                                        "pn": "p_07",
                                        "pv": "100000"
                                    },
                                    {
                                        "pn": "p_08",
                                        "pv": "0F0000"
                                    },
                                    {
                                        "pn": "p_0A",
                                        "pv": "0A00"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

自動

e_3001:
p_1F:自動の設定温度(00:+-0、01:+0.5〜0A:+5、FF:-0.5〜F6:-5(deg))
p_20:自動の風向上下(000000:OFF、100000:自動、0F0000:スイング、140000:サーキュレーションON(風向上下OFF)、010000:1段目(上)、020000:2段目、030000:3段目、040000:4段目、050000:5段目、060000:6段目(下))
p_21:自動の風向左右(000000:OFF、0F0000:スイング)
p_26:自動の風量(0A00:自動、0B00:静か、0300:風量1、0400:風量2、0500:風量3、0600:風量4、0700:風量5)
{
    "requests": [
        {
            "op": 3,
            "to": "/dsiot/edge/adr_0100.dgc_status",
            "pc": {
                "pn": "dgc_status",
                "pch": [
                    {
                        "pn": "e_1002",
                        "pch": [
                            {
                                "pn": "e_A002",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "00"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3003",
                                "pch": [
                                    {
                                        "pn": "p_2D",
                                        "pv": "02"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3001",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "0300"
                                    },
                                    {
                                        "pn": "p_1F",
                                        "pv": "00"
                                    },
                                    {
                                        "pn": "p_20",
                                        "pv": "100000"
                                    },
                                    {
                                        "pn": "p_21",
                                        "pv": "0F0000"
                                    },
                                    {
                                        "pn": "p_26",
                                        "pv": "0A00"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

送風

e_3001:
p_24:送風の風向上下(000000:OFF、0F0000:スイング、140000:サーキュレーションON(風向上下OFF)、010000:1段目(上)、020000:2段目、030000:3段目、040000:4段目、050000:5段目、060000:6段目(下))
p_25:送風の風向左右(000000:OFF、0F0000:スイング)
p_28:送風の風量(0A00:自動、0B00:静か、0300:風量1、0400:風量2、0500:風量3、0600:風量4、0700:風量5)
{
    "requests": [
        {
            "op": 3,
            "to": "/dsiot/edge/adr_0100.dgc_status",
            "pc": {
                "pn": "dgc_status",
                "pch": [
                    {
                        "pn": "e_1002",
                        "pch": [
                            {
                                "pn": "e_A002",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "00"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3003",
                                "pch": [
                                    {
                                        "pn": "p_2D",
                                        "pv": "02"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3001",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "0000"
                                    },
                                    {
                                        "pn": "p_24",
                                        "pv": "0F0000"
                                    },
                                    {
                                        "pn": "p_25",
                                        "pv": "0F0000"
                                    },
                                    {
                                        "pn": "p_28",
                                        "pv": "0A00"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

除湿

e_3001:
p_22:除湿の風向上下(000000:OFF、100000:自動、0F0000:スイング、140000:サーキュレーションON(風向上下OFF)、010000:1段目(上)、020000:2段目、030000:3段目、040000:4段目、050000:5段目、060000:6段目(下))
p_23:自動の風向左右(000000:OFF、0F0000:スイング)
p_27:自動の風量(0A00:自動、0B00:静か、0300:風量1、0400:風量2、0500:風量3、0600:風量4、0700:風量5)
p_30:除湿の湿度(p_31が01の場合)(00:OFF、0A:50%、0B:55%、0C:60%)
p_31:除湿の湿度(00:OFF、06:連続、01:ON(p_30が必要))
{
    "requests": [
        {
            "op": 3,
            "to": "/dsiot/edge/adr_0100.dgc_status",
            "pc": {
                "pn": "dgc_status",
                "pch": [
                    {
                        "pn": "e_1002",
                        "pch": [
                            {
                                "pn": "e_A002",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "00"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3003",
                                "pch": [
                                    {
                                        "pn": "p_2D",
                                        "pv": "02"
                                    }
                                ]
                            },
                            {
                                "pn": "e_3001",
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "0500"
                                    },
                                    {
                                        "pn": "p_22",
                                        "pv": "100000"
                                    },
                                    {
                                        "pn": "p_23",
                                        "pv": "0F0000"
                                    },
                                    {
                                        "pn": "p_27",
                                        "pv": "0A00"
                                    },
                                    {
                                        "pn": "p_30",
                                        "pv": "0A"
                                    },
                                    {
                                        "pn": "p_31",
                                        "pv": "01"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

操作用にPOSTするプログラムを作成

Postmanを使用して上記JSONをPOSTすることで実際に操作できるようになったので、Pythonを用いてPOSTするプログラムを作成する。

import requests
import json

#エアコンのIPアドレスを指定
url = "http://192.168.*.***/dsiot/multireq"

#冷房の場合
param = {"requests": [{"op": 3,"to": "/dsiot/edge/adr_0100.dgc_status","pc": {"pn": "dgc_status","pch": [{"pn": "e_1002","pch": [{"pn": "e_A002","pch": [{"pn": "p_01","pv": "00"}]},{"pn": "e_3003","pch": [{"pn": "p_2D","pv": "02"}]},{"pn": "e_3001","pch": [{"pn": "p_01","pv": "0200"},{"pn": "p_02","pv": "3A"},{"pn": "p_05","pv": "100000"},{"pn": "p_06","pv": "0F0000"},{"pn": "p_09","pv": "0A00"},{"pn": "p_0B","pv": "0C"},{"pn": "p_0C","pv": "01"}]}]}]}}]}

r = requests.post(url, param)

paramには先程解析した制御するJSONを指定する。

プログラムを実行し、冷房で運転することを確認する。

Homebridge Cmd4をインストール、設定

Homekitからエアコンを操作できるようにするため、HomebridgeにCmd4を追加する。

  1. Homebridge UIにログインし、プラグインで「Cmd4」を検索する。
  2. 「Homebridge Cmd4」をインストールする。
  3. 「設定」の「JSON Config」に以下を追加する。
{
    "platform": "Cmd4",
    "name": "Cmd4",
    "timeout": 10000,
    "interval": 1000,
    "queueTypes": [
        {
            "queue": "A",
            "queueType": "Sequential"
        }
    ],
    "accessories": [
        {
            "type": "HeaterCooler",
            "displayName": "エアコン1",
            "name": "エアコン1",
            "active": 0,
            "currentHeaterCoolerState": 0,
            "targetHeaterCoolerState": 2,
            "currentTemperature": 25,
            "rotationSpeed": 100,
            "coolingThresholdTemperature": 27,
            "heatingThresholdTemperature": 20,
            "temperatureDisplayUnits": "CELSIUS",
            "manufacturer": "Daikin",
            "model": "AN223AAS-W",
            "stateChangeResponseTime": 1,
            "queue": "A",
            "polling": [
                {
                    "characteristic": "active"
                },
                {
                    "characteristic": "targetHeaterCoolerState"
                },
                {
                    "characteristic": "coolingThresholdTemperature"
                },
                {
                    "characteristic": "heatingThresholdTemperature"
                },
                {
                    "characteristic": "currentHeaterCoolerState"
                },
                {
                    "characteristic": "currentTemperature"
                }
            ],
            "state_cmd": "python3 /home/homebridge/daikin.py"
        },
        {
            "type": "HumiditySensor",
            "displayName": "エアコン1",
            "name": "エアコン1湿度",
            "currentRelativeHumidity": 1,
            "statusActive": "TRUE",
            "statusFault": "NO_FAULT",
            "statusTampered": "NOT_TAMPERED",
            "statusLowBattery": "BATTERY_LEVEL_NORMAL",
            "manufacturer": "Daikin",
            "model": "AN223AAS-W",
            "stateChangeResponseTime": 3,
            "queue": "A",
            "polling": [
                {
                    "characteristic": "currentRelativeHumidity"
                }
            ],
            "state_cmd": "python3 /home/homebridge/daikin.py"
        }
    ]
}

Cmd4のエアコンには湿度センサーがないため、湿度センサーのアクセサリとして別に追加している。
state_cmdのパスは、次章で作成するPythonファイルの格納先のパスを指定すること。

詳細はCmd4のリファレンスを参照頂きたいが、characteristicで指定した項目を順にポーリングする。

ポーリング時のコマンド

$ python3 daikin.py Get エアコン1 currentTemperature

エアコン操作時のコマンド

$ python3 daikin.py Set エアコン1 Active 1
  • 第1引数:ポーリング時はGet、操作時はSet
  • 第2引数:displayName(エアコンが2台ある場合は、Cmd4のJSON Configにエアコン2を追加する)
  • 第3引数:characteristic(currentTemperatureは現在の温度、Activeは動作状態)
  • 第4引数:Set時の操作内容を数字で指定。以下にcharacteristicごとの数値を記載する。
    ※Getの場合は現在の状況の数値が戻り値となる(currentTemperatureの場合は温度を戻り値とする)
Active:エアコンの稼働状況(0:オフ、1:オン)
TargetHeaterCoolerState:運転状態(0:自動、1:冷房、2:暖房)
CoolingThresholdTemperature:冷房の温度設定(10進数で温度を指定)
HeatingThresholdTemperature:暖房の温度設定(10進数で温度を指定)
CurrentHeaterCoolerState:現在の運転状態(0:停止中、1:アイドル、2:暖房、3:冷房)
CurrentTemperature:現在の温度(10進数で温度を指定)
CurrentRelativeHumidity:現在の湿度(10進数で湿度を指定)

Cmd4用のプログラムを作成

Cmd4から呼び出されるPythonのプログラムを作成する。

import requests
import json
import sys

args = sys.argv

#対象機器の判定
if args[2] == "エアコン1":
    url = "http://192.168.*.***/dsiot/multireq"
elif args[2] == "エアコン2":
    url = "http://192.168.*.***/dsiot/multireq"
else:
    exit(1)

#エアコンの状態を取得
param_stat = '{"requests":[{"op":2, "to":"/dsiot/edge/adr_0100.dgc_status?filter=pv"}]}'
r = requests.post(url, param_stat)
data = r.json()

#エアコンのデータを取得する
temp = int(json.dumps(data["responses"][0]["pc"]["pch"][2]["pch"][5]["pch"][0]["pv"]).strip('"'), 16) #温度
hum = int(json.dumps(data["responses"][0]["pc"]["pch"][2]["pch"][5]["pch"][1]["pv"]).strip('"'), 16) #湿度
e_A002 = json.dumps(data["responses"][0]["pc"]["pch"][2]["pch"][3]["pch"][0]["pv"])
e_3003 = '"02"' #設定変更
p = {} #数値を変えやすいように、e_3001の「p_**」を辞書登録
for i in range(24):
    key = json.dumps(data["responses"][0]["pc"]["pch"][2]["pch"][14]["pch"][i]["pn"]).strip('"')
    val = json.dumps(data["responses"][0]["pc"]["pch"][2]["pch"][14]["pch"][i]["pv"])
    p[key] = val

#ポーリング(現在の運転状態)
if args[1] == "Get":
    #エアコン
    if args[3] == "CurrentHeaterCoolerState":
        if e_A002[2] == "0": #停止状態のとき
            print(0)
        elif  p["p_01"] == '"0100"': #暖房で稼働
            print(2)
        elif  p["p_01"] == '"0200"': #冷房で稼働
            print(3)
        else: #停止、暖房、冷房以外のとき
            print("1")
    elif args[3] == "CurrentTemperature": #現在の温度
        print(temp)
    elif args[3] == "Active": #現在の稼働状況
        print(e_A002[2])
    elif args[3] == "TargetHeaterCoolerState":
        if p["p_01"] == '"0300"': #自動
            print(0)
        elif  p["p_01"] == '"0100"': #暖房
            print(1)
        elif  p["p_01"] == '"0200"': #冷房
            print(2)
    elif args[3] == "CoolingThresholdTemperature":
        if p["p_01"] == '"0300"': #自動の場合
            temp_a = int(p["p_1F"].strip('"'),16) #指定された温度を10進数にする
            if temp_a < 0x80: #は+温度で設定されている場合
                print(temp + temp_a * 0.5)
            else: ##は-温度で設定されている場合
                print(temp + (temp_a - 0x100) * 0.5)
        else: #自動以外の場合は16進数の温度を10進数にする
            print(int(p["p_02"].strip('"'), 16)/2)
    elif args[3] == "HeatingThresholdTemperature":
        if p["p_01"] == '"0300"':
            temp_a = int(p["p_1F"].strip('"'),16)
            if temp_a < 0x80:
                print(temp + temp_a * 0.5)
            else:
                print(temp + (temp_a - 0x100) * 0.5)
        else:
            print(int(p["p_03"].strip('"'), 16)/2)
    #湿度
    elif args[3] == "CurrentRelativeHumidity":
        print(hum)
    exit(0)

#コントロール処理
if args[1] == "Set":
    #開始停止処理
    if args[3] == "Active":
        #運転開始
        if args[4] == "1":
            if e_A002 == '"00"': #現在停止中の場合
                e_A002 = '"01"'
                e_3003 = '"00"'
            else: #現在稼働中の場合は処理しない
                exit(0)
        #停止処理
        elif args[4] == "0":
            if e_A002 == '"01"': #現在稼働中の場合
                    e_A002 = '"00"'
                    e_3003 = '"01"'
            else: #現在停止中の場合は処理しない
                exit(0)

    #運転状態変更
    elif args[3] == "TargetHeaterCoolerState":
        if args[4] == "0":    #自動
            p["p_01"] = '"0300"'
        elif args[4] == "1":    #暖房
            p["p_01"] = '"0100"'
        elif args[4] == "2":    #冷房
            p["p_01"] = '"0200"'
    #冷房温度変更
    elif args[3] == "CoolingThresholdTemperature":
        if p["p_01"] == '"0300"': #自動の場合、指定された温度を+-の温度(16進数)に変換する
            p["p_1F"] = "{:03x}".format(0x100 + int((float(args[4]) - temp)*2))
            p["p_1F"] = '"' + p["p_1F"][-2:] + '"'
        else: #自動以外の場合は指定された温度を16進数に変換する。
            p["p_02"] = '"'+'{:02x}'.format(int(float(args[4])*2))+'"'
    elif args[3] == "HeatingThresholdTemperature":
        if p["p_01"] == '"0300"': #自動の場合、指定された温度を+-の温度(16進数)に変換する
            p["p_1F"] = "{:03x}".format(0xff +1 + int((float(args[4]) - temp)*2))
            p["p_1F"] = '"' + p["p_1F"][-2:] + '"'
        else: #自動以外の場合は指定された温度を16進数に変換する。
            p["p_03"] = '"'+'{:02x}'.format(int(float(args[4])*2))+'"'
    else: #指定さたcharacteristicが存在しない場合、異常終了
        exit(1)

    #運転モード
    if p["p_01"] == '"0000"':    #送風
        param = '{"requests": [{"op": 3,"to": "/dsiot/edge/adr_0100.dgc_status","pc": {"pn": "dgc_status","pch": [{"pn": "e_1002","pch": [{"pn": "e_A002","pch": [{"pn": "p_01","pv": '+e_A002+'}]},{"pn": "e_3003","pch": [{"pn": "p_2D","pv": '+e_3003+'}]},{"pn": "e_3001","pch": [{"pn": "p_01","pv": '+p["p_01"]+'},{"pn": "p_24","pv": '+p["p_24"]+'},{"pn": "p_25","pv": '+p["p_25"]+'},{"pn": "p_28","pv": '+p["p_28"]+'}]}]}]}}]}'
    elif p["p_01"] == '"0100"':    #暖房
        param = '{"requests": [{"op": 3,"to": "/dsiot/edge/adr_0100.dgc_status","pc": {"pn": "dgc_status","pch": [{"pn": "e_1002","pch": [{"pn": "e_A002","pch": [{"pn": "p_01","pv": '+e_A002+'}]},{"pn": "e_3003","pch": [{"pn": "p_2D","pv": '+e_3003+'}]},{"pn": "e_3001","pch": [{"pn": "p_01","pv": '+p["p_01"]+'},{"pn": "p_03","pv": '+p["p_03"]+'},{"pn": "p_07","pv": '+p["p_07"]+'},{"pn": "p_08","pv": '+p["p_08"]+'},{"pn": "p_0A","pv": '+p["p_0A"]+'}]}]}]}}]}'
    elif p["p_01"] == '"0200"':    #冷房
        param = '{"requests": [{"op": 3,"to": "/dsiot/edge/adr_0100.dgc_status","pc": {"pn": "dgc_status","pch": [{"pn": "e_1002","pch": [{"pn": "e_A002","pch": [{"pn": "p_01","pv": '+e_A002+'}]},{"pn": "e_3003","pch": [{"pn": "p_2D","pv": '+e_3003+'}]},{"pn": "e_3001","pch": [{"pn": "p_01","pv": '+p["p_01"]+'},{"pn": "p_02","pv": '+p["p_02"]+'},{"pn": "p_05","pv": '+p["p_05"]+'},{"pn": "p_06","pv": '+p["p_06"]+'},{"pn": "p_09","pv": '+p["p_09"]+'},{"pn": "p_0B","pv": '+p["p_0B"]+'},{"pn": "p_0C","pv": '+p["p_0C"]+'}]}]}]}}]}'
    elif p["p_01"] == '"0300"':    #自動
        param = '{"requests": [{"op": 3,"to": "/dsiot/edge/adr_0100.dgc_status","pc": {"pn": "dgc_status","pch": [{"pn": "e_1002","pch": [{"pn": "e_A002","pch": [{"pn": "p_01","pv": '+e_A002+'}]},{"pn": "e_3003","pch": [{"pn": "p_2D","pv": '+e_3003+'}]},{"pn": "e_3001","pch": [{"pn": "p_01","pv": '+p["p_01"]+'},{"pn": "p_1F","pv": '+p["p_1F"]+'},{"pn": "p_20","pv": '+p["p_20"]+'},{"pn": "p_21","pv": '+p["p_21"]+'},{"pn": "p_26","pv": '+p["p_26"]+'}]}]}]}}]}'
    elif p["p_01"] == '"0500"':    #除湿
        param = '{"requests": [{"op": 3,"to": "/dsiot/edge/adr_0100.dgc_status","pc": {"pn": "dgc_status","pch": [{"pn": "e_1002","pch": [{"pn": "e_A002","pch": [{"pn": "p_01","pv": '+e_A002+'}]},{"pn": "e_3003","pch": [{"pn": "p_2D","pv": '+e_3003+'}]},{"pn": "e_3001","pch": [{"pn": "p_01","pv": '+p["p_01"]+'},{"pn": "p_22","pv": '+p["p_22"]+'},{"pn": "p_23","pv": '+p["p_23"]+'},{"pn": "p_27","pv": '+p["p_27"]+'},{"pn": "p_30","pv": '+p["p_30"]+'},{"pn": "p_31","pv": '+p["p_31"]+'}]}]}]}}]}'
    else:
        exit(1)

    r = requests.post(url, param)
    exit(0)

exit(1)

動作テスト

上記プログラムで動くかを先程のコマンドで確認する。ActiveをCoolingThresholdTemperatureやTargetHeaterCoolerStateなどで指定して動けば問題ない。第4引数はcharacteristicに合わせて変更すること。

$ python3 daikin.py Set エアコン1 Active 1

指定した温度や運転状態に変更されたかは、Daikin APPから確認可能である。

プログラムの健全性確認が終わったら、実際にHomekitからエアコンを操作し、正常に動作するかを確認する。