🍒
IoT序章:ラズパイとSlack連携させてみた
動機
前回の記事でIoTに興味がわいた筆者は、センサーで特定の犬か何かの動きを感知した時にSlackに通知がくれば楽しいかな?と考えました。
今回はそのファーストステップとして、目標は「ラズパイ上でボタンを押した時に、Slackに通知を送る」として進めていきます。
前回記事では、ラズパイのインストール方法やネットワーク接続等も解説しましたので、参考にしてみてください。
準備したもの
- 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接続
詳細手順は、前回記事のこちらの段落を参考にしてみてください。
今回は前回の設定は済んだ想定で、下記の手順を進めました。
- ラズパイへmicroSDカードを挿入
- ラズパイとPCをUSBケーブルで結び、ラズパイのランプが点灯したことを確認
- コマンドプロンプトを開き、
ssh [ユーザー名]@[ホスト名].local
を実行し(私は、ssh pi@raspberrypi.localを実行しました)、OSインストールの際に設定したパスワードを入力 - ssh接続できたことを確認
② ボタンを押下し、ライト点灯
こちらのURLにある、サンプルコードを実行し、ボタンを押すとライトが点灯するようにします。
下記では、手順、コード解説、について段落を分けて解説します。
手順
-
cd /var/shared
を実行し、PCとラズパイの共有フォルダへ移動(前回記事をご参照ください) -
wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_7/button_led.py
を実行し、サンプルコードを読み込む -
こちらのURL内にある、Hardware Setupを参考に配置をしていきます。
※ こちらより引用
実際に配置したのがこちらになります。 -
python button_led.py
を実行 - スイッチを押してライトが点灯すれば成功です!
(ライトがつかなければ、ライトやスイッチなど配置が正しいかチェックしてみてください)
コード解説
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へメッセージを送信していきます。
こちらの公式ドキュメントを参考に進めていきます。
- こちらのURLからSlackワークスペースにSlackアプリを追加
- From scratchを選択
- Name app & choose workspaceの欄を埋め、Create Appをクリック
- 左の欄のIncoming Webhookを選択し、ActivateをONにする
- 左の欄のInstall Appを選択し、メッセージを通知したいチャンネルを選択し「許可する」を押下
- Incoming Webhook または Install App にて、Webhook URLが生成されているのを確認しコピー
- 下記コードを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
-
python button_led.py
を実行 - メッセージが送信されたら成功です!
感想
今回は、ボタンを押下するとSlackへメッセージが送信されるという、比較的簡単な操作でしたが、基本的な流れを抑えられてよかったです。これで何か実用的なIoT開発ができたら嬉しいです♪
Discussion