著者はGPTs作成のため、ChatGPT Plusに加入しました。
ChatGPTでSwitchBotを操作する。
ノーコードでSwitchBotに登録したデバイスを操作できるGPTを作りたいと思いました。そしてGPTが他の音声アシスタントよりもユーザーの意図を高度に解釈できるのか試すために作りました。
手順
以下のような手順になりました。
1.「OpenAPIスキーマ」を作成する。
2.「認証」にトークンを入力する。
3.「知識」にデバイスリストをアップロードする。
1. 「OpenAPIスキーマ」を作成する
ChatGPTにアクセスします。ブラウザからのみGPTsを作れるようです。(2024/08/20時点)
設定の「マイGPT」からGPTを作成し、「構成」の下にある「新しいアクションを作成する」を選択した先に、OpenAPIスキーマ入力ボックスがあります。
今回は、ActionsGPTにSwitchBotAPIのGitHubにアクセスして読んでもらい、OpenAPIスキーマを以下の通り作成してもらいました。問題なく動作しました。
SwitchBotAPIのv1.1にすれば、最新の製品に対応できますが、できるか試したかっただけなので、v1.0で作ってもらいました。
※以下のコードをコピペでもとりあえず動かす分には大丈夫でした。正直、下記のYamlで全てのデバイスに適切なパラメータを指定できるか不明です。まず、できるか試したいだけです。(2024/08/20 時点)
openapi: 3.1.0
info:
title: SwitchBot API
description: API for controlling SwitchBot devices such as bots, curtains, humidifiers, and more.
version: 1.0.0
servers:
- url: https://api.switch-bot.com/v1.0
description: Main production server
paths:
/devices:
get:
operationId: listDevices
summary: Retrieve a list of devices associated with the account.
responses:
"200":
description: A list of devices
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
example: 100
body:
type: object
properties:
deviceList:
type: array
items:
type: object
properties:
deviceId:
type: string
deviceName:
type: string
deviceType:
type: string
hubDeviceId:
type: string
message:
type: string
/devices/{deviceId}/status:
get:
operationId: getDeviceStatus
summary: Get the status of a specific device.
parameters:
- in: path
name: deviceId
required: true
schema:
type: string
description: The ID of the device to retrieve status for
responses:
'200':
description: Device status
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
example: 100
body:
type: object
properties:
deviceId:
type: string
deviceType:
type: string
hubDeviceId:
type: string
power:
type: string
humidity:
type: number
temperature:
type: number
message:
type: string
/devices/{deviceId}/commands:
post:
operationId: sendCommand
summary: Send a command to a specific device.
parameters:
- in: path
name: deviceId
required: true
schema:
type: string
description: The ID of the device to send the command to
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
command:
type: string
example: "turnOn"
parameter:
type: string
example: "default"
commandType:
type: string
example: "command"
responses:
'200':
description: Command response
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
example: 100
message:
type: string
2. 「認証」にトークンを入力する
認証に認証タイプをAPIキーにしてBearerにします。
SwitchBotアプリの開発者向けオプションで入手したトークンをAPIキーに入力して保存します。
トークンがわかるとデバイスを自由に操作できてしまうので、「認証」以外に入力しないように注意する。
トークンを入力して保存したあと、再度開くとまるで何も入力されていないように見えますが、保存されているらしく問題ありませんでした。(ここで戸惑った...)
3. 「知識」にデバイスリストをアップロードする。
「知識」は一つ戻った「構成」の項目にあります。
今回は「知識」に、Getリクエストで取得したデバイスリストをJSONファイルとしてアップロードしてみました。
これによって、GPTがいちいちデバイスリストを得るためにAPIリクエストする手間を省けると思います。もちろん、SwitchBotデバイスや赤外線リモコンを新たに登録したりして更新したのであれば、同時にJSONファイルも再アップロードする必要はありますが、頻繁に更新するものでもないので、これでいいと思っています。
※デバイス名はGPTが理解できるように「リビングの照明」といったように全て「部屋+デバイス」にしています。
動かしてみる
「リビングの窓」は実際に設置している開閉センサーから取得しており想定通りでした。気温と湿度はホームに3つ温湿度計があるので、きちんと3回リクエストしてから提示してくれました。数値も合ってました。
プライバシー設定で「常に許可」にするとGETリクエスト(窓の開閉状態、室内気温と湿度の取得)は確認を求められずに実行できますが、POSTリクエスト(リビングの電気をつけて)は「常に許可」にしていても、確認を求められるようですが、思った通りに機能しました。
画像にはないですが「リビングの電気をつけて」の後に「やっぱ戻して」と指示をすると電気を消してくれました。
やってみたことは以下で書きました。
ChatGPTにSwitchBotを操作してもらう
まとめ
やりたいことができて満足しました!
せっかくGPTがSwitchBotを操作したり、センサーからデータを取得できるようになったので、「室内温度と室外温度を比較してエアコンのオンオフを推測する」ようなロジックをGPTが考えて、実際に実践できるのか試してみたいです。
使用したサービス、参考
SwitchBot
SwitchBotAPI-v1.0-Github
ChatGPT-OpenAI
ありがとうございます。
記事に不備があれば、お手数ですが報告をお願いします。