3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GPTsにSwitchBotを操作してもらう

Last updated at Posted at 2024-08-20

著者はGPTs作成のため、ChatGPT Plusに加入しました。

ChatGPTでSwitchBotを操作する。

ノーコードでSwitchBotに登録したデバイスを操作できるGPTを作りたいと思いました。そしてGPTが他の音声アシスタントよりもユーザーの意図を高度に解釈できるのか試すために作りました。

手順

以下のような手順になりました。

1.「OpenAPIスキーマ」を作成する。
2.「認証」にトークンを入力する。
3.「知識」にデバイスリストをアップロードする。

1. 「OpenAPIスキーマ」を作成する

ChatGPTにアクセスします。ブラウザからのみGPTsを作れるようです。(2024/08/20時点)
設定の「マイGPT」からGPTを作成し、「構成」の下にある「新しいアクションを作成する」を選択した先に、OpenAPIスキーマ入力ボックスがあります。
ChatGPT-UI_1.png

今回は、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キーに入力して保存します。
ChatGPT-UI_2.png

トークンがわかるとデバイスを自由に操作できてしまうので、「認証」以外に入力しないように注意する。

トークンを入力して保存したあと、再度開くとまるで何も入力されていないように見えますが、保存されているらしく問題ありませんでした。(ここで戸惑った...)

3. 「知識」にデバイスリストをアップロードする。

「知識」は一つ戻った「構成」の項目にあります。
今回は「知識」に、Getリクエストで取得したデバイスリストをJSONファイルとしてアップロードしてみました。
これによって、GPTがいちいちデバイスリストを得るためにAPIリクエストする手間を省けると思います。もちろん、SwitchBotデバイスや赤外線リモコンを新たに登録したりして更新したのであれば、同時にJSONファイルも再アップロードする必要はありますが、頻繁に更新するものでもないので、これでいいと思っています。

※デバイス名はGPTが理解できるように「リビングの照明」といったように全て「部屋+デバイス」にしています。

動かしてみる

ChatGPT-UI_3.png
「リビングの窓」は実際に設置している開閉センサーから取得しており想定通りでした。気温と湿度はホームに3つ温湿度計があるので、きちんと3回リクエストしてから提示してくれました。数値も合ってました。

プライバシー設定で「常に許可」にするとGETリクエスト(窓の開閉状態、室内気温と湿度の取得)は確認を求められずに実行できますが、POSTリクエスト(リビングの電気をつけて)は「常に許可」にしていても、確認を求められるようですが、思った通りに機能しました。
ChatGPT-UI_4.png

画像にはないですが「リビングの電気をつけて」の後に「やっぱ戻して」と指示をすると電気を消してくれました。

やってみたことは以下で書きました。
ChatGPTにSwitchBotを操作してもらう

まとめ

やりたいことができて満足しました!
せっかくGPTがSwitchBotを操作したり、センサーからデータを取得できるようになったので、「室内温度と室外温度を比較してエアコンのオンオフを推測する」ようなロジックをGPTが考えて、実際に実践できるのか試してみたいです。

使用したサービス、参考

SwitchBot
SwitchBotAPI-v1.0-Github
ChatGPT-OpenAI

ありがとうございます。

記事に不備があれば、お手数ですが報告をお願いします。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?