【IoTで悩み事解決】オフィスフロアの解錠を自動でチャットにPostする仕組みを作ってみた

2017.12.22

まいどおおきに、大阪の市田です。
今日は、大阪オフィスで皆が困っている事をIoTで解決した内容についてご紹介したいと思います。

大阪オフィスの困りごと

オフィスの構造

前提として、大阪オフィスが入居しているフロアは一般的なオフィスビルと同じで、「入居ビルの扉」を開けてから、カードキー等で各オフィスのエントランスに入る仕組みになっています。
「入居ビルの扉」はビル固有のものなので鍵もビル固有のものです。カードキーは弊社が設置したものになります。こういう組み合わせはどこのオフィスも同じような形態だと思います。

01-entrance

困っていること

この前提を踏まえて、オフィスメンバーが困っていることを赤裸々に書いてみます。

まず、各メンバーが出社した時は「入居ビルの扉」を解錠する為、ビルの共同フロアに「入居ビルの鍵」を取りに行く必要があります。しかし朝は混雑することがあり、共同フロアからオフィスまで時間がかかることがあるので、他のメンバーも同じタイミングで鍵を取りに行ってしまいます。

つまり、「入居ビルの鍵が取り出されていることを知らずに、共同フロアへ取りに行ってしまう」という時間のムダが発生してしまいます。些細なことですが「自分が一番最初の出社だと思って鍵を取りに行ったら無かった」というのはそれなりにガッカリ感があります。

これを図で表すと以下のようなイメージです。

02-problem

IoTで解決してみた

地味にメンバーのMPを奪うこの問題をIoTで解決してみました。ポイントは以下です。

  • ビルの共用フロアにデバイスを置くことはNG
  • オフィスの解錠を自動で行えること(なるべく手間にならないようにすること)
  • とりあえず始業時の解錠だけ分かればOK
  • チャットはチャットワークを使う

解決方法

解錠そのものを知ることは物理的にもできない為、「出社時にオフィスの照明が付いたら、センサーで明るさを検知してチャットワークにメッセージをPostする」ということにしました。

イメージとしては下記のようになります。

03-resolve

今回は「Raspberry Pi 3」に照度センサー「AMS302T」を組み合わせてみました。ジャンパワイヤやブレッドボードは既に持っているものを利用します。

構成は下記のようにしました。プログラムの動作を視認するためにLEDを付けています。暗くなるとLEDが点灯して、明るいとLEDが消灯します。

04-fritzing

実際に組んでみたものが下記になります。

kaiten-led-off-all

チャットワークにpostするコード(python)

次はコードの用意です。今回はpythonでプログラムを作成します。チャットワークへのメッセージのpostは下記を参考にしています。

Pythonを使ってChatWorkに発言してみた

実際のコードosaka-start-chatwork.pyは下記のとおりです。

#coding: UTF-8

from __future__ import print_function, unicode_literals
import RPi.GPIO as GPIO
import time
import requests
import pprint

APIKEY = 'チャットワークのAPIキー'
ENDPOINT = 'https://api.chatwork.com/v2'
ROOMID = 'メッセージをpostしたい部屋のID'
post_message_url = '{}/rooms/{}/messages'.format(ENDPOINT, ROOMID)
headers = { 'X-ChatWorkToken': APIKEY }
params = { 'body': 'オフィス開いたよ。チャットワークのテストやで。' }

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.IN)

try:
    while True:
        if GPIO.input(24) == GPIO.LOW:
            GPIO.output(23, GPIO.HIGH)
            time.sleep(5)
            if GPIO.input(24) == GPIO.HIGH:
                resp = requests.post(post_message_url,headers=headers,params=params)
            else:
                GPIO.output(23, GPIO.HIGH)
        else:
            GPIO.output(23, GPIO.LOW)
        time.sleep(2)

except KeyboardInterrupt:
    pass

動作確認

それでは動作確認してみます。Raspberry Pi上で上記のスクリプトを起動します。

$ python osaka-start-chatwork.py

下記のようにセンサーを黒い袋などで覆います。暗くなったのでLEDが点灯してますね。

kaiten-led-on-up

次に黒い袋を外して明るくしてみます。

kaiten-led-off

指定していたチャットワークの部屋にメッセージがpostされました。

05-chatwork-post

slackにpostするコード(python)

今回は利用しませんが、slackの場合は、Incoming Webhooksを使えば簡単にできます。まず、Webhook URLを取得する為に下記のページにアクセスします。

https://slack.com/services/new/incoming-webhook

postしたいチャンネルを選択して「Add Incoming WebHooks integration」をクリックしてください。

11-webhooks

生成された「Webhook URL」を控えておきましょう。

12-webhookurl

次にWebHookでpostできるslackwebをRaspberry Piにインストールしておきます。

sudo pip install slackweb

これでslack側の準備は整いました。下記(osaka-start-slack.py)のようにWebhook URLを指定してメッセージをpostします。

#coding: UTF-8

from __future__ import print_function, unicode_literals
import RPi.GPIO as GPIO
import time
import slackweb

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.IN)

try:
    while True:
        if GPIO.input(24) == GPIO.LOW:
            GPIO.output(23, GPIO.HIGH)
            time.sleep(5)
            if GPIO.input(24) == GPIO.HIGH:
                slack = slackweb.Slack(url="https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxx")
                slack.notify(text="オフィス開いたよ。Slackのテストやで。")
            else:
                GPIO.output(23, GPIO.HIGH)
        else:
            GPIO.output(23, GPIO.LOW)
        time.sleep(2)

except KeyboardInterrupt:
    pass

このスクリプトを実行して、先程と同じようにセンサーの周りを暗くしたり明るくしたりしてみます。

$ python osaka-start-slack.py

明るくなったタイミングで、下記のようにslackにメッセージが投稿できていればOKです。

06-slack-post

課題

目的は達成できたように思いましたが、今回使ったセンサーでは「明るさの程度」を取得できないみたいなので、どの程度の明るさで明るいと判断するか分かりませんでした。
そのため、センサーの設置場所によっては朝日が入ってきたらメッセージを投稿してしまう可能性があります。改善策として、明るさを数値化できるセンサーに変えて改良しようと思います。

最後に

これでオフィスのメンバーが出社の度に鍵を取りに行かなくて済むので、業務効率が上がって売上も上がること間違いなしです(汗)
センサーを変えて改良できたら改めてご紹介したいと思います。

以上です。