0時に寝て7時に起きて8時過ぎまでだらだらしてた。オフィスのエアコンの効き具合がよくなくて昼間暑くてやる気にならなかった。

先日 ifttt で tapo p105 の制御 を行った。これが動くということはなんらかのクラウドの api 経由で tapo p105 を制御できている。次の記事をみながらやってみようと試してみた。結論から言ってクラウドの api 経由ではできなかった。

アクセストークンを取得する。terminalUUID は適当に生成すればよい。

$ curl -s -X POST -H "Content-Type: application/json" -d '{"method": "login", "params": {"appType": "iphone", "cloudUserName": "xxx@example.com", "cloudPassword": "***", "terminalUUID": "bf63e1d0-d5dc-4636-abf1-7eeada585935"}}' https://wap.tplinkcloud.com/ | jq .
{
  "error_code": 0,
  "result": {
    "accountId": "142785160",
    "regTime": "2023-06-11 04:59:43",
    "countryCode": "JP",
    "riskDetected": 0,
    "email": "xxx@example.com",
    "token": "***-***"
  }
}

ここで取得したアクセストークンを使ってデバイスの一覧を取得する。

$ curl -s -X POST -H "Content-Type: application/json" -d '{"method": "getDeviceList"}' https://wap.tplinkcloud.com/?token=***-*** | jq .
{
  "error_code": 0,
  "result": {
    "deviceList": [
      {
        "deviceType": "SMART.TAPOPLUG",
        "role": 0,
        "fwVer": "1.3.6 Build 20230308 Rel. 52591",
        "appServerUrl": "https://aps1-wap.tplinkcloud.com",
        "deviceRegion": "ap-southeast-1",
        "deviceId": "802241DA5175CF114E567DE8D72A3094210CB12D",
        "deviceName": "P105",
        "deviceHwVer": "1.0.0",
        "alias": "U21hcnQgUGx1ZyAoS2F6YW1vcmkgT2ZmaWNlKQ==",
        "deviceMac": "482254AC1D25",
        "oemId": "495AC9D888EB711C42A28BECF62071CF",
        "deviceModel": "P105",
        "hwId": "58070BD9D8ECC915CD3D6F20A2172712",
        "fwId": "1D18AD293A25ABDE41405B20C6F98816",
        "isSameRegion": true,
        "status": 0
      }
    ]
  }
}

ここまでは従来のスマートプラグと同様に動く。ここから先の手順は従来の hs105 と tapo p105 では手順が異なるみたい。passthrough というメソッドを呼び出してみてもエラーが返ってくる。

$ curl -s -X POST -H "Content-Type: application/json" -d '{"method":"passthrough", "params": {"deviceId": "802241DA5175CF114E567DE8D72A3094210CB12D", "requestData": "{\"system\":{\"get_sysinfo\":null},\"emeter\":{\"get_realtime\":null}}"}}' https://wap.tplinkcloud.com/?token=***-*** | jq .
{
  "error_code": -20571,
  "msg": "Device is offline"
}

どうやら tapo シリーズはスマートプラグ自体が web api のエンドポイントを提供していて、ローカルからデバイスの web api を呼び出して制御できるらしい。例えば、次の記事でその手順が書いてあって、同様のやり方で実装した野生のライブラリもたくさんみつかる。

うちのシェアオフィスのネットワークはローカルの ip アドレスへの通信をすべて拒否しているようなのでこのやり方はうちのオフィスでは検証できない。しかし、tp-link 社のスマホアプリと ifttt の webhook 経由で p105 の制御ができているため、おそらくローカルのエンドポイントに接続する以外の別の手段があるのだと推測する。それをインターネット上で数時間探してみたものの、発見できなかった。この前 interop の展示で聞いた話しだと ifttt は非公開 api を使ってインテグレーションを実装しているという話しだったけど、どうやってクラウド経由で通信しているのだろう?と不思議に思った。