この記事の内容

  • Raspberry Pi(ラズパイ)の物理ボタンを押すと、Microsoft Teamsにメッセージが届く仕組みを作ります
  • 必要なハードウェア(タクトスイッチ・ジャンパーワイヤー)の選び方を紹介します
  • pinout コマンドを使ったGPIOピンの確認方法を説明します
  • Pythonでボタン入力を検知するプログラムの書き方を解説します
  • TeamsのワークフローからWebhook URLを取得し、通知を送る方法を説明します

はじめに

「玄関の呼び出しボタンを押したら、TeamsのチームにチャットでGが入る仕組みをラズパイを使って作ってほしい」という質問リクエストをいただきました。以前の動画で「この情報とこの情報を組み合わせればできます」とお伝えしたものの、それだけでは難しいかもしれないと思い、実際に作ってみました。

今回はAzureは使いません。ラズパイ単体で実現できます。


必要なハードウェア

まず用意するものは以下の2点です。

  • タクトスイッチ(A接点ボタン):押すと回路が繋がる、シンプルなプッシュボタンです。「A接点ボタン」とは、押したときに回路が閉じるタイプのボタンを指します。
  • オス-メス ジャンパーワイヤー(ブレッドボード付き):ラズパイのGPIOピンとボタンを繋ぐための配線です。

タクトスイッチやジャンパーワイヤーは、類似品が多数販売されていますので、同等品でも問題ありません。

ブレッドボードは内部的に横の列が繋がっているため、ボタンの足を刺した列に赤・黒のジャンパーワイヤーを刺すだけで回路を組むことができます。


GPIOピンの確認方法

どのピンを使えばよいかは、SSHでラズパイにログインして以下のコマンドを実行すると確認できます。

pinout

このコマンドを実行すると、ラズパイのピン配置図が表示されます。今回はGPIO 1番ピンとグラウンドを使用します。ピン配置図を見ながら、上から7番目と6番目のピンにジャンパーワイヤーを接続します。


Pythonでボタン入力を検知する

プログラムの概要

ボタンが押されたときにPythonで検知するには、RPi.GPIO ライブラリを使います。以下はサンプルプログラムです。

import RPi.GPIO as GPIO
import time

BUTTON_PIN = 1  # 使用するGPIOピン番号

def button_callback(channel):
    print("Button was pushed!")

GPIO.setmode(GPIO.BCM)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=button_callback)

try:
    while True:
        time.sleep(0.1)
except KeyboardInterrupt:
    GPIO.cleanup()

ポイント解説

  • GPIO.setmode(GPIO.BCM) でBCMモードを指定します
  • GPIO.setup() でプルアップ設定を行います
  • GPIO.add_event_detect() でGPIOピンがグラウンドと繋がったことを検出し、コールバック関数を呼び出します
  • button_callback 関数がボタンを押したときに実行される処理です。この中にTeams通知のロジックを書きます

BUTTON_PIN には使用するGPIOピンの番号を入れてください(サンプルコードで12番と書かれている場合でも、自分のピン番号に変更が必要です)。


TeamsへのWebhook通知を追加する

TeamsのWorkflowでWebhook URLを取得する

TeamsチャンネルへメッセージをPOSTするには、Teamsのワークフロー機能からWebhook URLを取得します。

  1. 通知を送りたいTeamsチャンネルを開きます
  2. 「ワークフロー」 をクリックします
  3. 「Webhook要求を受信するとチャンネルに投稿する」 を選択します
  4. 接続・チャンネルの選択を行い、追加します
  5. 作成されたワークフローを開き、HTTPのPOST URL をコピーします

このURLがWebhookの受け口になります。

通知を送るPythonプログラム

button_callback 関数の中に、TeamsへPOSTするコードを追加します。

import RPi.GPIO as GPIO
import time
import requests
import json

BUTTON_PIN = 1
WEBHOOK_URL = "ここにTeamsのWebhook URLを貼り付ける"

def button_callback(channel):
    headers = {"Content-Type": "application/json"}
    payload = {
        "type": "message",
        "attachments": [
            {
                "contentType": "application/vnd.microsoft.card.adaptive",
                "content": {
                    "type": "AdaptiveCard",
                    "body": [
                        {
                            "type": "TextBlock",
                            "text": "ラズベリーパイからの通知:ボタンが押されました"
                        }
                    ]
                }
            }
        ]
    }
    response = requests.post(WEBHOOK_URL, headers=headers, data=json.dumps(payload))
    print("メッセージが送信されました")

GPIO.setmode(GPIO.BCM)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=button_callback)

try:
    while True:
        time.sleep(0.1)
except KeyboardInterrupt:
    GPIO.cleanup()
  • requests ライブラリでHTTP POSTを送信します
  • json ライブラリでメッセージをJSON形式に変換します
  • WEBHOOK_URL には先ほどコピーしたURLを貼り付けてください

プログラムの実行

python pushbutton.py

プログラムを起動してボタンを押すと、TeamsのチャンネルにメッセージがGが届きます。


動作確認

プログラムを起動してボタンを押すと、ターミナルに Button was pushed! と表示され、同時にTeamsチャンネルに通知が届きます。ボタンを押すたびにメッセージが送信されます。

メッセージの内容はワークフロー側やPythonのpayload部分を変更することでカスタマイズできます。「来客がありました」「受付にお客様がいらっしゃいました」といった文面にするのも簡単です。


まとめ

今回はRaspberry Piのタクトスイッチ(A接点ボタン)を使って、ボタンを押すとMicrosoft TeamsにWebhook経由でメッセージを送る仕組みを作りました。

  • ハードウェアはタクトスイッチとジャンパーワイヤーで用意できます
  • pinout コマンドでGPIOピン番号を確認できます
  • PythonとRPi.GPIOライブラリでボタン入力を検知できます
  • TeamsのワークフローからWebhook URLを取得し、requests ライブラリでPOSTするだけで通知が届きます

Azureを使わずともラズパイとPythonだけで実現できます。Pythonはできることの幅が広いので、通知先や内容をアレンジすることでさまざまな用途に応用できます。ぜひ試してみてください。