ラズパイ?何それ?レベルのハードウェア未経験大学生がオフィスに人がいるか把握するシステムを作った

# はじめに
こんにちは。僕は現在、名古屋で大学生をしながらIT企業でインターン生として働いています。

そんな僕ですが、普段過ごしていると、既定の出社日以外の日にも出社して作業がしたいと思うわけです。
大学で講義を受けた後に、会社に行く。
そんな日は、18時頃に出社し、社員さんがいなくなる(オフィスが閉まる)まで作業をするわけです。
そう、僕のインターン先では、社員さんがオフィスの鍵を持っており、社員さんがいれば、休日であってもオフィスが空いています。

# ある日
19時くらいに大学が終わり、オフィスに向かおうと思いました。
「まぁ誰か人がいるだろう」と思い込んでいました。
オフィスに到着すると、、、

**閉まってるぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅ**

その日は、たまたま社員さんが全員帰っていました。

こりゃ困った...(社員さんに遅くまで残ってくださいとも言えないし、最後の社員さんが退社したタイミングで知らせてもらうのも申し訳ないし...)

# 本題
てなわけで、オフィスに人がいるのか把握するシステムを作ろうと考えました。
そこで、どうしようか悩んでいたところ、`Raspberry Pi`や `Arduino`が使えることを知りました。
それらに`照度センサー`を搭載させ、オフィスの照度を検知することで、人がいるのかどうかを把握できるのでは。と考えました。

# ハードウェア何もわからない。完全に理解したい。
恥ずかしいことに、`Raspberry Pi`や `Arduino`について本当に無知でしたので、たくさん調べました。
知人にハードウェアに詳しい高専出身の方([GANGAN](gangan_nikki)さん)がいたので、twitterのDMでめちゃくちゃ聞いたりも。

(こんな感じ/公開承諾済)
<img width="578" alt="スクリーンショット 2019-12-31 12.38.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/215ec132-ddbd-3d0d-0b52-1e96ad787d12.png">
(GANGANさんのブログは[こちら](https://gangannikki.hatenadiary.jp/))

そして、、

[Raspberry Pi Zero WH](https://www.switch-science.com/catalog/3646/?gclid=CjwKCAiA3abwBRBqEiwAKwICA5CCJgfeovCYDEK3oXFVhl9hso62JA-3iYHto7KK-bbIUvlGd_gWWRoCPZEQAvD_BwE)と[WH用の明るさセンサ拡張基板](https://bit-trade-one.co.jp/product/module/adrszlx/)を使うことが決まりました。(決め手: 安い)

上記2点は、ネットで購入しました。
変換ケーブルは、せっかくなので名古屋の秋葉原(大須)に行って買ってきました。

(こんな感じ)
<img width="714" alt="スクリーンショット 2019-12-31 13.12.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/ec8bb313-a71b-ab24-0fad-c78679c10ccc.png">
<img width="715" alt="スクリーンショット 2019-12-31 13.12.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/e329ced8-1d02-344b-7b37-f8df6b0efc14.png">
<img width="708" alt="スクリーンショット 2019-12-31 13.12.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/e7e9abfe-3ab8-bab0-8ff0-19d789b2697e.png">

(写真撮るの忘れたのですが、ストレージ4GBも買いました。)

# 環境構築
ラズパイをディスプレイやキーボードと繋ぎ、完全に理解したい。
そんな思いで、いろんなサイトを参考にしながら、試行錯誤しました。

そして、ついに、、
<img width="1221" alt="スクリーンショット 2019-12-31 13.16.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/07204efb-7016-73eb-51b1-108b0cd92178.png">

**キタァァ！！！すげぇぇぇぇぇぇぇぇぇぇ！！！**

ラズパイがパソコンになりました！！

参考: 
[Raspberry Pi Zero WHにOSインストールして起動するまで](https://technology-memo.net/2018/12/24/startup-raspberrypi-zero/)
[Raspberry Pi Zero WHにRaspbian OSを導入する](https://toripiyo.hatenablog.com/entry/2018/05/05/122758)


-------------------
また、何度もディスプレイやキーボードに繋いでいるとダルいので、`sshによるリモートアクセス`を行いました。
今後は自分のPC上からラズパイに接続することにしました。

参考:
[Raspberry Pi へのリモート接続](https://qiita.com/b-wind/items/d33f759ace01658bb09e)

# 実装
## アーキテクチャ
照度を検知して、その数値を何らかの形で自分に知らせたい訳ですが、、
`LINE API`か`SLACK API`を使おうと考えました。

そこで、このようなアーキテクチャになりました。
<img width="994" alt="スクリーンショット 2019-12-31 13.32.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/ef4d952f-e790-3803-a5d0-dc109e49dded.png">

シンプルですね。

## 照度を検知する

今回購入した[ゼロワンシリーズ](https://bit-trade-one.co.jp/product/module/zeroone01top/)ですが、とても便利で、照度を検知するための[サンプルコード](https://github.com/bit-trade-one/RasPi-Zero-One-Series)が公開されていました。

上記サンプルコード参考に、

```python:
#!/usr/bin/env python3
# coding: utf-8

import smbus

bus = smbus.SMBus(1)
bus.write_byte_data(0x13, 0x80, 0xFF)
bus.write_byte_data(0x13, 0x82, 0x00)
bus.write_byte_data(0x13, 0x84, 0x9D)
data = bus.read_i2c_block_data(0x13, 0x85, 4)

luminance = data[0] * 256 + data[1]
proximity = data[2] * 256 + data[3]
```
とすると、照度(luminance)が検知できました。

おおよそですが、

電気がついている時、`luminance:3000`
電気がついてない時、`luminance: 5`

くらいの感じでした。また、日光による誤検知を防ぐため、陽の当たらない場所にラズパイを設置しました。


## slackと連携する

新たにチャンネルを作り、そこにBotが照度をメッセージとして送信するような仕組みを考えます。
[こちら](https://api.slack.com/messaging/webhooks)を参考に、webhook URLを取得しました。
あとは、指定の形式でpostリクエストするだけです。

## 完成したプログラム

休日は、10時以降
平日は、17時以降 にslackへmessageを送ります。

```python
#!/usr/bin/env python3
# coding: utf-8

import smbus
import time
import requests, json
import datetime
import jpholiday
WEB_HOOK_URL = "****"
message = u'defalut'

bus = smbus.SMBus(1)
bus.write_byte_data(0x13, 0x80, 0xFF)
bus.write_byte_data(0x13, 0x82, 0x00)
bus.write_byte_data(0x13, 0x84, 0x9D)
time.sleep(0.8)
data = bus.read_i2c_block_data(0x13, 0x85, 4)

luminance = data[0] * 256 + data[1]
proximity = data[2] * 256 + data[3]


today = datetime.date.today()
today_str = str(today).replace('-', '')
current_hour = datetime.datetime.now().hour

def isBizDay(DATE):
 Date = datetime.date(int(DATE[0:4]), int(DATE[4:6]), int(DATE[6:8]))
 if Date.weekday() >= 5 or jpholiday.is_holiday(Date):
  return 0
 else:		
  return 1

def sendMessage():
 if luminance >= 800:
  message = u'現在、オフィスに人がいます！早く帰りましょう！'	
 else:
  message = u'現在、オフィスに人はいません。'

 requests.post(WEB_HOOK_URL, data = json.dumps({
 'text': u'照度は、'+str(luminance)+u'です！'+message,  #通知内容
 'username': u'Bakira-Tech-Python-Bot',  #ユーザー名
 'icon_emoji': u':smile_cat:',  #アイコン
 'link_names': 1,  #名前をリンク化
 }))


if isBizDay(today_str) == 1:
 print("平日です")		
 if current_hour > 17:
  sendMessage()
else: 	
 print("休日です")		
 if current_hour > 10:
  sendMessage()
```

こんな感じ↓でメッセージの送信ができました。

<img width="534" alt="スクリーンショット 2019-12-31 20.02.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/47cbc19b-a90d-4f5c-c671-12d9dbe5df38.png">

# プログラムの定期実行

pythonファイルにread権限を与え、crontabコマンドより、定期実行を実現します。


30分に1回、該当pythonファイルを実行させるように設定しました。

```
*/30 * * * * /home/pi/luminance.py
```

参考:
[Raspberry Pi3B でPythonをcronする。](https://qiita.com/noimi/items/a98985bb84d93b6819c3)
[RaspberryPiでプログラムを定期的に実行する](http://sebarabara.com/raspbian_cron/)



# おわりに
これで、せっかくオフィスまで行ったのに空いてなかったなんてことはもうない!!
ラズパイ?何それ?レベルでしたが、何とか実装することができて大変満足です。
終わってみれば、とても簡単な実装のみで実現することができました。
今回に留まらず、ラズパイを使ってもっと多くの身近な課題を解決していけたらいいなと思います。
いやぁ便利 !!ラズパイ最高 !!

企業の方は、働き方改革が叫ばれるこの時代に是非、導入してみてはいかがでしょうか。笑


以上です。
_____
参考:
[raspberry pi zeroで温度・湿度・気圧を測定する](https://qiita.com/_saki_kawa_/items/7961c82b150a01920d72)
[curlで「Couldn't resolve host」エラーが出た場合の対処](https://qiita.com/bz0/items/7d4bac34c6cdada59b94)