🐧
Raspberry Piとタクトスイッチで、とても簡単な入退室管理を作る
1. 何を作りたいか
最近は新型コロナウイルス感染拡大防止のために、部屋に入室できる人数が制限されることが出てきたかと思います。なので、例えば勤務時間がきっちり決まっていない職場などは、オフィスなどに入ったときにslackで入室状況を他者に伝えたりする必要が出てきます。けど、slackで「入室」とか「退室」とか打つのはめんどくさいし、こういうのを管理するためにいちいちブラウザを立ち上げるのも面倒。そこで、入り口のスイッチを押すだけでslackに誰が入室したかが分かるような仕組みを作りました。工夫次第でいろいろ出来ると思います。
2. 用意するもの
- Raspberry Pi
- タクトスイッチ(人数×2)
- インターネット環境(WiFiでも有線LANでもいい)
3. どうやって動かすか?
上の図は今回作るシステムの流れを示しています。入室した人は、ドアの近くにあるボタンを押します。押されたボタンの信号をGPIO(General Perpose Input Output)で読み取り、そのボタンの信号に応じてwebhookを用いて誰が入室したか、誰が退室したかをslackに通知します。
4. 作ったプログラム
コードはGithubで共有していますが、以下にも貼ります。
Akiraは任意の名前に変えてください。
main.pyと同じディレクトリにslackのincoming webhookのURLを書いたurlWebhook.txtが必要です。用意してください。
import RPi.GPIO as gpio
import time
import requests, json
pathURL = 'urlWebhook.txt'
with open(pathURL) as f:
WEB_HOOK_URL = f.read()
BUTTON1_PIN = 17
BUTTON2_PIN = 4
def main():
gpio.setmode(gpio.BCM)
gpio.setup(BUTTON1_PIN, gpio.IN)
gpio.setup(BUTTON2_PIN, gpio.IN)
gpio.add_event_detect(BUTTON1_PIN, gpio.FALLING, callback=inRoom, bouncetime=300)
gpio.add_event_detect(BUTTON2_PIN, gpio.FALLING, callback=outRoom, bouncetime=300)
try:
while(True):
time.sleep(1)
except KeyboardInterrupt:
print("Keyboard interrupt")
gpio.cleanup()
def inRoom(channel):
print("Button pushed is %s"%channel)
requests.post(WEB_HOOK_URL, data = json.dumps({
'text': u'Akira entered to LAB',
'username': u'roomIO',
'icon_emoji': u':penguin:',
'link_names': 1,
}))
def outRoom(channel):
print("Button pushed is %s"%channel)
requests.post(WEB_HOOK_URL, data = json.dumps({
'text': u'Akira left from LAB',
'username': u'roomIO',
'icon_emoji': u':penguin:',
'link_names': 1,
}))
if __name__ == "__main__":
main()
5. こんな感じで動く
6. 感想
作りながら「入り口近くのパソコンのキーボードで数字入れてwebhookたたけばよくない?つまりネイティブアプリケーションでよくない?」と途中で気づきましたが気合で作りました。
「ここまずいぜ!」「ちがうよ!」とか質問等ありましたら、遠慮なくご指摘ください。
7. Reference
7. Contact
Akira Kashihara <akira.kashihara [at] hotmail.com>
Discussion