【Mac miniではじめるPython IoT開発】Discord BotでSwitchBot Lockを遠隔操作する

ALL

こんにちは、Tech Samuraiです!
新しいM4 Mac miniを導入し、開発環境のセットアップも一段落しました。今回は、この常時稼働できるMac miniをサーバーに見立て、PythonとIoTデバイスを連携させた実用的なプロジェクトに挑戦します。

目標は、「Discordのチャットから、自宅のSwitchBot Lock(スマートキー)を遠隔で施錠・解錠・状態確認できるBot」の開発です。モダンなPython環境管理ツールRyeを使い、API連携からmacOSでの自動起動設定まで、その全手順を記録します。

【Amazon.co.jp限定】 SwitchBot スマートリモコン ハブミニ(Matter対応) Alexa - 温湿度センサー搭載 スイッチボット Hub Mini マター対応 スマートホーム 学習リモコン 赤外線家電を管理 節電·省エネ Echo Google Home Siri IFTTT SmartThings対応 Kataステッカー付き 熱中症対策
エアコン・テレビ・照明など、多くの赤外線リモコンに対応、あらゆる家電のリモコンを1つに集約してスマホで操作できます。

1. プロジェクトの全体像と開発環境

このBotは、Discordからのメッセージをトリガーに、SwitchBotのAPIを呼び出してスマートキーを操作します。

  • ハードウェア: Mac mini (M4), SwitchBot Hub Mini, SwitchBot Lock
  • ソフトウェア: Python (Rye管理), Git, Discord, SwitchBotアプリ

Ryeによるライブラリの準備

まず、Ryeで今回のプロジェクトに必要なライブラリをインストールします。

# discord.py は Botとの通信に必要
# requests は SwitchBot APIとの通信に必要
# python-dotenv は 機密情報を安全に管理するために必要
rye add discord.py requests python-dotenv

2. 認証情報の準備:3つの鍵を手に入れる

このプロジェクトでは、DiscordとSwitchBot、両方のサービスと認証を行うための「鍵」が必要になります。

2.1 Discord Botのトークン

まず、Discord Developer PortalでBotを作成し、その**Botトークン**を取得します。また、Botにメッセージを読み取る権限(Message Content Intent)を与えるのを忘れないようにしましょう。
詳しい手順は、以下の素晴らしい記事が非常に参考になります。

参考:【discord.py v2】Botの作り方からサーバーに導入するまで

2.2 SwitchBot APIのトークンとシークレット

次に、SwitchBotアプリからAPIを利用するための情報を取得します。

  1. SwitchBotアプリを開き、「プロフィール」→「設定」→「アプリバージョン」を10回タップします。
  2. 表示された「開発者向けオプション」から、**トークン**と**シークレットキー**を取得します。

2.3 SwitchBot LockのデバイスID

最後に、操作対象となるスマートキー固有のIDを調べます。これは、SwitchBot APIの「全デバイスリスト取得」エンドポイントを叩くことで確認できます。(詳しい方法は、後述するスクリプトのGitリポジトリ内にあるサンプルコードなどを参考にしてください)

2.4 機密情報の安全な管理 (.env)

取得した4つの重要な情報(DISCORD_TOKEN, SWITCHBOT_TOKEN, SWITCHBOT_SECRET, SWITCHBOT_LOCK_ID)は、.envというファイルに記述し、python-dotenvライブラリで安全に読み込みます。
【重要】 この.env`ファイルは、誤ってGitで公開しないように、必ず.gitignoreファイルに/.envと記述しておきましょう。


3. スマートキー操作Botの実装

準備が整ったので、いよいよPythonスクリプトを実装します。このスクリプトは、Discordからの!lock, !unlock, !statusといったコマンドを監視し、SwitchBot APIを介してスマートキーを操作します。

API通信部分は同期的(処理が終わるまで待つ)なrequestsライブラリを使っていますが、Bot全体の応答性を損なわないよう、asyncio.get_event_loop().run_in_executor()を使って、API呼び出し部分を非同期処理に組み込んでいます。

完成したスクリプトの全コードは、以下のGitHubリポジトリで公開しています。


4. Mac miniでのBot永続化(自動起動設定)

スクリプトが完成したら、Mac miniにログインするたびに自動で起動し、万が一終了しても自動で再起動するように「永続化」の設定を行います。これには、macOSの標準機能である**Launchd**を利用します。

  1. Launchd設定ファイル (.plist) の作成
    まず、~/Library/LaunchAgents/ディレクトリに、以下のような.plistファイルを作成します。(例: com.user.switchbot-discord.plist<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.user.switchbot-discord</string> <key>ProgramArguments</key> <array> <string>/Users/YOUR_MAC_USERNAME/.rye/shims/python</string> <string>/Volumes/KIOXIA_SSD/path/to/your/lock_bot.py</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>StandardOutPath</key> <string>/tmp/switchbot_bot.log</string> <key>StandardErrorPath</key> <string>/tmp/switchbot_bot.err</string> </dict> </plist> 【ポイント】
    ProgramArgumentsでは、Rye環境のPython実行ファイル(~/.rye/shims/python)を直接指定し、その後に実行したいスクリプトのフルパスを記述します。これにより、外部ストレージ上にあるスクリプトでも権限問題を回避して安定実行できます。
  2. サービスの登録と起動
    作成した設定ファイルを、以下のコマンドでシステムに登録します。 # サービスをシステムに登録 launchctl load ~/Library/LaunchAgents/com.user.switchbot-discord.plist # サービスを即時起動 launchctl start com.user.switchbot-discord

これで、Mac miniが起動している限り、あなたのBotは常にDiscordからの指令を待ち受けるようになります!


まとめ

今回は、Mac miniをサーバーとして、PythonとRye、そしてDiscordとSwitchBotのAPIを組み合わせた、実用的なIoT Botを開発しました。面倒なAPIの認証情報も、.envファイルと.gitignoreを組み合わせることで安全に管理できます。

そして、macOSの`Launchd`を使いこなすことで、自作のスクリプトを24時間365日稼働させる「サービス」として昇華させることができました。あなたのアイデアとPythonで、身の回りの生活をさらに便利にしていきましょう!

コメント

タイトルとURLをコピーしました