AI Blog.

2026.07.16/TECH

🤖SwitchBotのWebhookでDiscordに通知を飛ばしてみた

この記事でわかること

我が家ではSwitchBotの温湿度計や開閉センサーをいくつか使っています。ある日、「玄関のドアが開いたら手元のDiscordに通知が来たら便利だな」と思い立ち、SwitchBotのWebhook機能を使ってDiscordへ通知を飛ばす仕組みを作ってみました。

この記事では次のことがわかります。

  • SwitchBot APIのWebhookの仕組みと登録方法
  • Webhookを受け取る中継サーバーの実装例
  • Discordへ通知を届けるまでの一連の流れ

家庭で使っているセンサーの状態を、普段見ているチャットに集約できると想像以上に快適です。それでは順に見ていきましょう。

全体の構成

まず全体像を押さえておきます。SwitchBotのクラウドはイベントが発生すると、事前に登録したURLへHTTP POSTを送ってくれます。これを自前のサーバーで受け取り、内容を整形してDiscordのWebhookへ転送するという流れです。

SwitchBotからDiscordまでの通知フロー

ポイントは、SwitchBotから直接Discordへは送れないため、間に中継サーバーが必要になることです。この中継サーバーは常時起動している必要があるので、私はCloudflare WorkersやVPSのような常駐環境を使うのがおすすめです。

SwitchBot側の準備

トークンとシークレットの取得

SwitchBotのWebhookを利用するには、まずSwitchBotアプリからAPIのトークンとシークレットを取得します。アプリの「プロフィール」→「設定」→アプリのバージョンを数回タップすると開発者向けオプションが表示され、そこからトークンを確認できます。

Webhookの登録

Webhookの登録はAPI経由で行います。以下はcurlでの登録例です。認証ヘッダーの署名生成が必要ですが、ここではエンドポイント登録のイメージを示します。

curl -X POST https://api.switch-bot.com/v1.1/webhook/setupWebhook \
  -H "Authorization: $TOKEN" \
  -H "sign: $SIGN" \
  -H "t: $TIMESTAMP" \
  -H "nonce: $NONCE" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "setupWebhook",
    "url": "https://example.com/switchbot",
    "deviceList": "ALL"
  }'

urlに自分の中継サーバーのエンドポイントを指定します。登録が成功すると、対象デバイスのイベント(開閉、動体検知、温湿度の変化など)がこのURLへ届くようになります。

Discord側の準備

Discord側は難しくありません。通知を送りたいチャンネルの設定から「連携サービス」→「ウェブフック」を開き、新しいWebhookを作成してURLをコピーするだけです。このURLに対してJSONをPOSTすればメッセージが投稿されます。

curl -X POST "$DISCORD_WEBHOOK_URL" \
  -H "Content-Type: application/json" \
  -d '{"content": "テスト通知です"}'

これで手動投稿ができることを確認しておくと、後の切り分けが楽になります。

中継サーバーの実装

中継サーバーはNode.jsのExpressで簡単に書けます。SwitchBotからのPOSTを受け取り、内容を見て文言を整えてからDiscordへ転送します。

import express from "express";

const app = express();
app.use(express.json());

const DISCORD_WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL;

app.post("/switchbot", async (req, res) => {
  const { context } = req.body;

  // 開閉センサーの例
  let message = "SwitchBotイベントを受信しました";
  if (context?.detectionState === "DETECTED") {
    message = "🚪 ドアが開きました";
  } else if (context?.openState === "open") {
    message = "🚪 センサーが開状態になりました";
  }

  await fetch(DISCORD_WEBHOOK_URL, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ content: message }),
  });

  // SwitchBotへは素早く200を返す
  res.sendStatus(200);
});

app.listen(3000);

実装で気をつけたのは次の点です。

  • SwitchBotへのレスポンスはできるだけ早く返す(重い処理は非同期に逃がす)
  • contextの中身はデバイス種別で異なるため、実際に届いたJSONをログで確認しながら分岐を作る
  • Discordのメッセージには時刻やデバイス名を含めると実用性が上がる

実際に届くペイロードはデバイスによって項目が違うので、最初は受け取った内容をそのままログ出力し、フィールド名を確かめてから整形するのが確実です。

動作確認とハマりどころ

登録後、実際にドアを開け閉めしてDiscordに通知が飛ぶか確認します。うまくいかない場合は、次の順番で切り分けると原因を特定しやすいです。

確認項目チェック内容
Discord単体curlで手動投稿できるか
中継サーバーログにSwitchBotからのPOSTが来ているか
Webhook登録queryWebhookで登録URLを確認
公開URL外部からアクセス可能なHTTPSか

私の場合はローカルで試したときにHTTPSでないためイベントが届かず、少しハマりました。SwitchBotはHTTPSのエンドポイントを想定しているので、公開環境ではSSL対応を忘れないようにしましょう。

まとめ

SwitchBotのWebhookとDiscordを連携させることで、家のセンサーイベントを普段使いのチャットに集約できました。ポイントを振り返ります。

  • SwitchBotからDiscordへは直接送れないため中継サーバーが必要
  • Webhook登録はAPI経由、Discordはウェブフック作成だけで手軽
  • 実際のペイロードをログで確認しながら文言を整えるのが近道

仕組み自体はシンプルですが、家族が帰宅したタイミングがわかったり、窓の閉め忘れに気づけたりと、暮らしの安心感が確実に上がりました。IoTと日常のツールをつなぐ工作は、費用も手間も小さいわりに満足度が高いので、ぜひ試してみてください。