🍒

IoT序章:ラズパイとSlack連携させてみた

2022/09/15に公開

動機

前回の記事でIoTに興味がわいた筆者は、センサーで特定の犬か何かの動きを感知した時にSlackに通知がくれば楽しいかな?と考えました。

今回はそのファーストステップとして、目標は「ラズパイ上でボタンを押した時に、Slackに通知を送る」として進めていきます。

前回記事では、ラズパイのインストール方法やネットワーク接続等も解説しましたので、参考にしてみてください。
https://zenn.dev/fujii0112/articles/8a8070cb714997

準備したもの

  • Raspberry Pi Starter Kit(Raspberry Pi Zeroが入っています)
  • Windows 10 Pro
  • microSDカード 16GB
  • カードリーダー(microSDカードをPCで読み込むため)
  • USBケーブル(USB A to USB microB)

大まかな流れ

ラズパイをネットワーク接続&PCからssh接続

サンプルコードを用い、ボタンを押下するとライトが点灯するようにする

少しコードを修正し、ボタンを押下するとSlackへメッセージが送信されるようにする

① ラズパイをネットワーク接続&PCからssh接続

詳細手順は、前回記事のこちらの段落を参考にしてみてください。

今回は前回の設定は済んだ想定で、下記の手順を進めました。

  1. ラズパイへmicroSDカードを挿入
  2. ラズパイとPCをUSBケーブルで結び、ラズパイのランプが点灯したことを確認
  3. コマンドプロンプトを開き、ssh [ユーザー名]@[ホスト名].localを実行し(私は、ssh pi@raspberrypi.localを実行しました)、OSインストールの際に設定したパスワードを入力
  4. ssh接続できたことを確認

② ボタンを押下し、ライト点灯

こちらのURLにある、サンプルコードを実行し、ボタンを押すとライトが点灯するようにします。

下記では、手順、コード解説、について段落を分けて解説します。

手順

  1. cd /var/shared を実行し、PCとラズパイの共有フォルダへ移動(前回記事をご参照ください)
  2. wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_7/button_led.py を実行し、サンプルコードを読み込む
  3. こちらのURL内にある、Hardware Setupを参考に配置をしていきます。
    こちらより引用
    実際に配置したのがこちらになります。
  4. python button_led.pyを実行
  5. スイッチを押してライトが点灯すれば成功です!
    (ライトがつかなければ、ライトやスイッチなど配置が正しいかチェックしてみてください)

コード解説

button_led.py
#!/usr/bin/python
###########################################################################
#Filename      :button_led.py
#Description   :button control led
#Author        :alan
#Website       :www.osoyoo.com
#Update        :2017/06/27
############################################################################

import RPi.GPIO as GPIO
import time

# set BCM_GPIO 17(GPIO0) as button pin
ButtonPin = 17
# set BCM_GPIO 18(GPIO1) as LED pin
LedPin = 18

# set led status to True(OFF)
led_status = True

# print message at the begining ---custom function
def print_message():
    print ('|**********************************|')
    print ('|           Button control LED     |')
    print ('|  ------------------------------  |')
    print ('|        LED Connect to GPIO1      |')
    print ('|       Button Connect to GPIO0    |')
    print ('|  ------------------------------  |')
    print ('|                                  |')
    print ('|                            OSOYOO|')
    print ('|**********************************|\n')
    print ('Program is running...')
    print ('Please press Ctrl+C to end the program...')
    pass

# setup function for some setup---custom function
def setup():
    GPIO.setwarnings(False)
    # set the gpio modes to BCM numbering
    GPIO.setmode(GPIO.BCM)
    # set all LedPin's mode to output,and initial level to HIGH(3.3V)
    # LEDライト側の配線へ3.3Vの電圧を出力
    # これによりLEDライトの+-極どちら側も電圧が3.3Vとなり、電流が流れないのでLEDライトは点灯しない
    GPIO.setup(LedPin,GPIO.OUT,initial=GPIO.HIGH)
    # set ButtonPin's mode to input,and pull up to high(3.3v)
    # プルアップ抵抗を有効化=配線に入力が無い場合(OFF状態)、“Hi” レベルの電圧をかけ、“Low” レベルに接続(ON状態:電位0Vの接地と接続 )する操作をすれば配線は0Vにする
    # スイッチを押すとButtonPinは“Low” レベルに接続する(GDNに接続)
    GPIO.setup(ButtonPin,GPIO.IN,pull_up_down = GPIO.PUD_UP)
    # set up a falling detect on ButtonPin,and callback function to ButtonLed
    # ButtonPinにて、立ち下がりエッジ(電圧が低くなる)を検知した場合、ButtonLedを呼び出す
    # スイッチを押すとButtonPinの電圧は3.3Vから0Vへと変化するため、ButtonLedが呼び出される
    GPIO.add_event_detect(ButtonPin,GPIO.FALLING,callback = ButtonLed)
    pass

# define a callback function for button callback
def ButtonLed(ev=None):
    global led_status
    # Switch led status(on-->off; off-->on)
    led_status = not led_status
    # GPIO.output(LedPin, true) -> LedPinをHigh -> LEDライトOFF(LEDライトの+-極どちら側も電圧が3.3Vとなるため)
    # GPIO.output(LedPin, false) ->LedPinをLow -> LEDライトON(LEDライトの+-極にて電圧差が生じるため)
    GPIO.output(LedPin, led_status)
    if led_status:
        print('|*************|')
        print('|  LED OFF... |')
        print('|*************|')
        print('\n')
    else:
        print('|*************|')
        print('|  ...LED ON  |')
        print('|*************|')
        print('\n')

# Define a main function for main process
def main():
    # Print messages
    print_message()
    while True:
        # Don't do anything.
        time.sleep(1)

# Define a destroy function for clean up everything after
# the script finished 
def destroy():
    # Turn off LED
    GPIO.output(LedPin, GPIO.HIGH)
    # Release resource
    GPIO.cleanup()
    pass

# If run this script directly, do:
if __name__ == '__main__':
    setup()
    try:
        main()
    # When 'Ctrl+C' is pressed, the child program 
    # destroy() will be  executed.
    except KeyboardInterrupt:
        destroy()

③ ボタンを押下し、Slackへメッセージ送信

webhookを用い、生成したwebhook urlに対してリクエストを投げ、Slackへメッセージを送信していきます。

こちらの公式ドキュメントを参考に進めていきます。

  1. こちらのURLからSlackワークスペースにSlackアプリを追加
  2. From scratchを選択
  3. Name app & choose workspaceの欄を埋め、Create Appをクリック
  4. 左の欄のIncoming Webhookを選択し、ActivateをONにする
  5. 左の欄のInstall Appを選択し、メッセージを通知したいチャンネルを選択し「許可する」を押下
  6. Incoming Webhook または Install App にて、Webhook URLが生成されているのを確認しコピー
  7. 下記コードをbutton_led.pyに追加
button_led.py
import requests
import json

# InsecureRequestWarningを非表示にする設定
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)

# ButtonLedは既にある関数
def ButtonLed(ev=None):
    global led_status
    # Switch led status(on-->off; off-->on)
    led_status = not led_status
    GPIO.output(LedPin, led_status)
    if led_status:
        print('|*************|')
        print('|  LED OFF... |')
        print('|*************|')
        print('\n')
    else:
	# 追加
        sendMessage()
        print('|*************|')
        print('|  ...LED ON  |')
        print('|*************|')
        print('\n')

def sendMessage():
    webhook_url = "コピーしたWebhook URLをいれてください" 

    # python で 「curl -X POST -H 'Content-type: application/json' --data '{"text":"犬はとても可愛いです"}'」のコマンドと同等の処理を実行する 
    data = { "text": "犬はとても可愛いです" } 
    headers = {'content-type': 'application/json'}
 
    response = requests.post(webhook_url, data=json.dumps(data), headers=headers, verify=False)
    print(response.text)
    pass
  1. python button_led.pyを実行
  2. メッセージが送信されたら成功です!

感想

今回は、ボタンを押下するとSlackへメッセージが送信されるという、比較的簡単な操作でしたが、基本的な流れを抑えられてよかったです。これで何か実用的なIoT開発ができたら嬉しいです♪

Discussion