はじめに
こんにちは。僕は現在、名古屋で大学生をしながらIT企業でインターン生として働いています。
そんな僕ですが、普段過ごしていると、既定の出社日以外の日にも出社して作業がしたいと思うわけです。
大学で講義を受けた後に、会社に行く。
そんな日は、18時頃に出社し、社員さんがいなくなる(オフィスが閉まる)まで作業をするわけです。
そう、僕のインターン先では、社員さんがオフィスの鍵を持っており、社員さんがいれば、休日であってもオフィスが空いています。
ある日
19時くらいに大学が終わり、オフィスに向かおうと思いました。
「まぁ誰か人がいるだろう」と思い込んでいました。
オフィスに到着すると、、、
閉まってるぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅ
その日は、たまたま社員さんが全員帰っていました。
こりゃ困った...(社員さんに遅くまで残ってくださいとも言えないし、最後の社員さんが退社したタイミングで知らせてもらうのも申し訳ないし...)
本題
てなわけで、オフィスに人がいるのか把握するシステムを作ろうと考えました。
そこで、どうしようか悩んでいたところ、Raspberry Pi
や Arduino
が使えることを知りました。
それらに照度センサー
を搭載させ、オフィスの照度を検知することで、人がいるのかどうかを把握できるのでは。と考えました。
ハードウェア何もわからない。完全に理解したい。
恥ずかしいことに、Raspberry Pi
や Arduino
について本当に無知でしたので、たくさん調べました。
知人にハードウェアに詳しい高専出身の方(GANGANさん)がいたので、twitterのDMでめちゃくちゃ聞いたりも。
(こんな感じ/公開承諾済)
(GANGANさんのブログはこちら)
そして、、
Raspberry Pi Zero WHとWH用の明るさセンサ拡張基板を使うことが決まりました。(決め手: 安い)
上記2点は、ネットで購入しました。
変換ケーブルは、せっかくなので名古屋の秋葉原(大須)に行って買ってきました。
(写真撮るの忘れたのですが、ストレージ4GBも買いました。)
環境構築
ラズパイをディスプレイやキーボードと繋ぎ、完全に理解したい。
そんな思いで、いろんなサイトを参考にしながら、試行錯誤しました。
キタァァ!!!すげぇぇぇぇぇぇぇぇぇぇ!!!
ラズパイがパソコンになりました!!
参考:
Raspberry Pi Zero WHにOSインストールして起動するまで
Raspberry Pi Zero WHにRaspbian OSを導入する
また、何度もディスプレイやキーボードに繋いでいるとダルいので、sshによるリモートアクセス
を行いました。
今後は自分のPC上からラズパイに接続することにしました。
実装
アーキテクチャ
照度を検知して、その数値を何らかの形で自分に知らせたい訳ですが、、
LINE API
かSLACK API
を使おうと考えました。
シンプルですね。
照度を検知する
今回購入したゼロワンシリーズですが、とても便利で、照度を検知するためのサンプルコードが公開されていました。
上記サンプルコード参考に、
#!/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が照度をメッセージとして送信するような仕組みを考えます。
こちらを参考に、webhook URLを取得しました。
あとは、指定の形式でpostリクエストするだけです。
完成したプログラム
休日は、10時以降
平日は、17時以降 にslackへmessageを送ります。
#!/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()
こんな感じ↓でメッセージの送信ができました。
プログラムの定期実行
pythonファイルにread権限を与え、crontabコマンドより、定期実行を実現します。
30分に1回、該当pythonファイルを実行させるように設定しました。
*/30 * * * * /home/pi/luminance.py
参考:
Raspberry Pi3B でPythonをcronする。
RaspberryPiでプログラムを定期的に実行する
おわりに
これで、せっかくオフィスまで行ったのに空いてなかったなんてことはもうない!!
ラズパイ?何それ?レベルでしたが、何とか実装することができて大変満足です。
終わってみれば、とても簡単な実装のみで実現することができました。
今回に留まらず、ラズパイを使ってもっと多くの身近な課題を解決していけたらいいなと思います。
いやぁ便利 !!ラズパイ最高 !!
企業の方は、働き方改革が叫ばれるこの時代に是非、導入してみてはいかがでしょうか。笑
以上です。
参考:
raspberry pi zeroで温度・湿度・気圧を測定する
curlで「Couldn't resolve host」エラーが出た場合の対処