トイレ空き状況確認システムによる業務効率化のススメ

2017年12月17日

IoT Nodejs テクノロジー プログラミング

努めている会社がまだ、赤坂見附の一等地にあるビルの4Fと6Fに置かれていた時の話です。 赤坂見附という駅は、比較的どの路線からもアクセスが良く、会社のビルも駅近で従業員の満足度も高いんですね。 しかし、このビル各階にトイレが設置されているんですが、男性用個室は各階に1つずつしか存在しません。 男性従業員は日々、争奪戦に巻き込まれている事実も発覚しました。

問題を調査

会社内で男性従業員が使用できる個室は2箇所、男性従業員は50名以上いる状態。 単純計算で、仮に10分間個室を使った場合に、1日全員が使用すると
500分=8.3時間
2箇所存在するので、
8.3時間 ÷ 2箇所 = 4.15時間(1箇所あたり使用する時間)
順番通りに使用した場合は問題なさそうですが、今現在では、時間はかなり集中している事から、順番待ちが発生しているようです。

対策を考えてみた

会社ビル外のトイレを検討する。
・駅のトイレを利用してもいいが、5分近くかけて出向くのも気が引ける(急用の場合はアリかも) ・近所の会社のモノを借りる。(同じビルでは他社も同じ思いをしているに違いない。) ・別ビルのトイレを借りる。(セキュリティ問題などもあり、難しそう)
色々考えてみたが、中々いい案が浮かばないので、なんとか現状の環境で考えたい。

IoTで解決したい

今流行りのIoTを使ってトイレの扉が空いていることを確認できるだけで、わざわざ自席を離れてトイレに行って覗き込んで個室の使用を確認する手間が省けるため、全社員(男性分)のそういった作業を軽減することで会社全体での無駄作業を軽減することができますね。 色々なガジェットで考えられるのですが、王道の「Raspberry Pi」を使って進めたいと思います。 以下、設置までの手順を載せておきますので、同じことをやると結果がでますので、やってみてください。

Raspberry Piの構築

RaspberryPiのOSのインストールしてLAN構築するまでの設定は以下のページを参照 [RaspberryPi] 初期設定を高速で行う手順 ちなみに、今回使用したRaspberryPiはB+を利用しています。 ネットワークは会社のDMZ領域のwifiを利用(この環境構築はインフラに合わせて行ってください)

各種モジュールのインストール

## NodeJS $ sudo apt-get install nodejs ## npm $ sudo apt-get install npm ## npm-socket.io , fs , forever $ sudo npm install -g socket.io $ sudo npm install -g fs $ sudo npm install -g forever

表示用

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Toilet comfirmation</title> <meta name="viewport" content="width=device-width,initial-scale=1"> <script type="text/javascript" src="/socket.io/socket.io.js"></script> <script type="text/javascript"> var socket = io.connect(); socket.on('greeting', function(data, fn) { var answer = data.message; document.getElementById("message").innerHTML = answer; }); socket.emit('check',{value:"header"}); </script> <style type="text/css"> html,body{ margin:0; padding:0; border:0; } #message{ font-size:32px; font-weight:bold; text-align:center; } </style> </head> <body> <h1>6F-Toilet</h1> <div id="message"></div> <script> socket.emit('check',{value:"set"}); </script>

NodeJS処理用

var http = require('http'); var socketio = require("socket.io"); var fs = require('fs'); var server = http.createServer(function(req,res){ res.writeHead(200,{'Content-Type':'text/html'}); res.end(fs.readFileSync('/home/pi/www/toilet/index.html','utf-8')); }).listen(80); var io = socketio.listen(server); var valueCache = "-"; function checkSwitch(flg){ var valueLocal = fs.readFileSync('/sys/class/gpio/gpio3/value', 'ascii'); if(flg !== "start" && valueCache === valueLocal){return} //OFF if(valueLocal == 1){ io.sockets.emit("greeting",{message:"OFF"}); } //ON else{ io.sockets.emit("greeting",{message:"ON"}); } //cache valueCache = valueLocal; return valueLocal; } io.sockets.on('connection',function(socket){ socket.on("check",function(data,fn){ console.log("%%%"+data.value); checkSwitch("start"); }); }); console.log("Running..."); //round-check setInterval(checkSwitch,100);

外部モジュールの初期設定(OSの起動時に必要)

echo 3 > /sys/class/gpio/export echo "in" > /sys/class/gpio/gpio3/direction echo "high" > /sys/class/gpio/gpio3/direction

センサーのセット

今回は外部入力スイッチのON/OFFのみを判定してリアルタイムにwebSocketで更新するという方法なのですが、RaspberryPi-B+のGPIO連動を検討してGPIO3の箇所の接触を判定するようにします。 IoTで重要なのが電源の確保なのですが、幸い会社のトイレなので、電源が存在する為、そこからスイッチを伸ばして判定したいと思います。

稼働

NodeJSの実行は、デーモン化するため、foreverモジュールを利用 $ forever start app.js

ブラウザで表示

NodeJSで80番ポートを利用しているため、ブラウザでそのままアクセスできます。 http://RaspberryPiのローカルIPアドレス/ 上記の様な画面が出ればNodeJSの設定は成功です。 あとは、センサーの接触でOFF→ONに切り替われば、完了です。

センサーの保護

最後に気を使いたいのは、現地に設置されている機器の保護です。 配線はガムテープで固定化し、切断される脅威から守ります。 RaspberryPi本体も、空き箱を利用して、水やホコリから守ります。 これを作成した時に、
会議室の空き状態を確認したい 非常口の鍵を遠隔で開ける装置が欲しい ビーコンタイムカードとして使いたい
などという意見も出てきて非常に今後楽しみな環境構築でした。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。