ラズパイ+人感センサーで会議室利用状況をslackに送る

# その会議室、使ってますか
社内で会議室を押さえたが、出席者全員が在宅勤務で、使われていないのに予定が入ったままで会議室空き状況に問題がある。。。
そんな問題に直面したことはございませんか？
なのでセンサーで会議室の **リアルタイム利用状況** が見れたらいいなと言うことでそれっぽいものを作りました。
通知方法はslackに飛ばします。
複数配置の場合はslackにテーブル型で一覧表示しても良さそうですね・
![IMG_0210.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227793/a65ac1bf-8cc0-7e6e-5fdd-dba61f59abc2.jpeg)


# デバイス
## Rasberry Pi Zero WH
![スクリーンショット 2023-02-25 14.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227793/782acfce-7b58-f95a-b601-918ca0c59a12.png)
zeroシリーズで唯一GPIOが付いています。
他のシリーズや形は自分ではんだ付けしないといけないです。
半導体不足とか日本でラズパイの大きな小売業者が取り扱いを停止したこともあり全く出回っていない。。。
あまり使いたくはなかったが、ラクマで購入しました。

## 周辺機器
個別で買うよりも「ラズパイ　セット」などでAmazonで調べてセットで買った方が安いこともあります。
### 必須
・sdカード
　　64Gのものを購入したが、もっと小さくても問題ないです。
　　すでにお手持ちのものでも問題ないが、RaspberryPi OSを入れるにあたってデータが消えるので注意!
・usb2.0のotgケーブル
・microHDMIケーブルまたはアダプタ
・microb電源ケーブル
・usb hub
　　本体にはポートが1つしかないのでマウスとキーボードを使えません。
・[赤外線センサ](https://www.amazon.co.jp/gp/product/B081GYJ9CR/ref=ppx_yo_dt_b_search_asin_image?ie=UTF8&psc=1)
![スクリーンショット 2023-02-25 14.59.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227793/20f21768-938b-329c-06b4-3c424179574d.png)
・[ジャンパーワイヤー](https://www.amazon.co.jp/gp/product/B01A4DDUTA/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)
　　　ラズパイとセンサを繋げるためメス−メスのものを購入しました。
![スクリーンショット 2023-02-25 15.22.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227793/ed7cdc13-be66-2734-3a7c-320340f6f93c.png)



### あれば良い
・ケース
　　　基盤剥き出しはなるべく避けた方が良いです。
・ヒートシンク

# セットアップ
別pcでsdカードにラズパイ用のosを落として、それをラズパイに挿してインストールします。
ラズパイはhdmiケーブルやマウスなどをつなげたhubのケーブルなど、すべてのケーブルを繋げて、最後に電源ケーブルを刺すことをおすすめ!
これをしないと後でつなげたケーブル類を正しく識別してくれないことがあります。
詳しくは以下の記事を参考にしました。

https://qiita.com/tksnkym/items/31a237e27cbc51790cdd

今回はRaspberry Pi OSを使用しました。

# 組み立てて
![raspi_setup.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227793/6fbd147e-2ef1-49a8-aa4b-586528de2ea2.jpeg)
ワイヤー接続とGPIOピンの接続は、接続する機器に沿って接続してください。

人感センサー側
![スクリーンショット 2023-02-25 15.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227793/6956b113-da2a-541c-30d1-59ff8af932f5.png)

ラズパイ側　
![RaspberryPi-GPIO-name.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227793/47ba9203-e31f-6cab-2d4c-0f1ca0a5d003.jpeg)
[引用：sozorablog](https://sozorablog.com/motion-sensor/)

よって＋電源を５Vのピンに、GNDはGNDのピンに、高/低出力はGPIO18を使用しました。

# コードを書く
pythonで書きました。
完成品は[github](https://github.com/pingue-noots/conference_room_sensor/blob/main/conference_room_sensor.py)にも上げてます。
GPIO18ピンが反応した時にslackに通知を入れます。
posted_senseとposted_10mがslackに通知したかのフラグになっています。
簡単に解説すると10分間センサが感知しなかったらその旨をslackに通知し、感知したらslackに通知しますが、クールタイムを設けそれは連続しないようにしています。
```py
from datetime import datetime
import time
import RPi.GPIO as GPIO
import json
import urllib.request
import logging
from collections import OrderedDict
import pprint

# if sense
SLEEP = 20
# use this GPIO
GPIO_PIN = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)

def post_slack(flg, msg):
  if (flg == "sense"):
    message = msg + " に人を感知\n会議室は使用中です"
  elif (flg == "10m"):
    message = msg + " 10分間の人感知なし\n会議室は空室です"
  send_data = {
    "text": message,
  }
  send_text = json.dumps(send_data)
  request = urllib.request.Request(
    "YOUR API", 
    data=send_text.encode('utf-8'), 
    method="POST"
  )
  with urllib.request.urlopen(request) as response:
    response_body = response.read().decode('utf-8')

if __name__ == '__main__':
  try:
    start_timer = time.time()
    posted_sense = 0
    posted_10m = 0
    while True:
      if(GPIO.input(GPIO_PIN) == GPIO.HIGH and posted_sense == 0):
        sensing_date = datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        post_slack("sense" ,sensing_date)
        print("Sensing! POST request was sent to slack.")
        start_timer = time.time()
        posted_sense = 1
        posted_10m = 0
        time.sleep(SLEEP)
      # No sensing 10m
      elif (60 * 10 <= time.time() - start_timer and posted_10m == 0):
        sensing_date = datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        post_slack("10m", sensing_date)
        print("No sensing in 10m. POST request was sent to slack.")  
        posted_10m = 1
        posted_sense = 0
      else:
        print(time.time() - start_timer)
        time.sleep(5)

  except KeyboardInterrupt:
    print("suspending a process")

  finally:
    GPIO.cleanup()
    print("GPIO clean complete")
```

# 苦労したこと
**メモリ: 512 MB!!!!?????**
Raspberry Pi OS標準のブラウザは全く動きません。
標準のエディタは動きますが、おっそいです。
では、どう実装したか。
別PCでソースコードを書いてssh(scp)で転送しました。
書いては転送、ミスに気が付いたらまた書いて転送、、、
ラズパイ3, 4は2GB〜選べるのでそっちの方がおすすめです。
ただ、少し大きいのと、zero以上に出回っていないです。

# 拡張
aws iotに接続して色々マネージドサービスにつなげたら面白そうですね。
センサ以外にもカメラつけてAmazon Rekognitionで顔認証やデータの可視化など応用案はたくさん出てきそうです。

# ラズパイ以外の類似品
・[オブナイズ](https://obniz.com/ja/)
ラズパイzeroの定価と比べたらお高めですが、データ・開発環境をクラウドで提供してくれたりと非エンジニアでも簡単にセットアップ・構築できる製品です。