会社の受付システムをPWAでサクッと作った話

[JX通信社 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/jxpress)、22日目担当のkain_jyです。

かなり前の話ですが、いまのオフィスに引っ越したときに作った、受付システムについて紹介します。

ちょうど社内に、古いiPadと、放置されてたRaspberry PI、ノベルティでもらったPCスピーカーがあったので、余り物を活用して何かできないかなと思ったのがきっかけです。

iOSのネイティブアプリを作ることも検討しましたが、引っ越しまで時間がなかったため、PWA（Progressive Web Apps）を使ってサクッと作ることにしました。

## 構成図

![Untitled Diagram (1).png](https://qiita-image-store.s3.amazonaws.com/0/1588/ca440e50-1013-8077-c318-37911c23f52c.png)

## Slackの設定

Slack APIの[Incoming Webhook URLを取得](https://api.slack.com/incoming-webhooks)しておきます。

## Raspberry PIの設定

Raspberry PIにスピーカーを繋ぎ、執務室に設置します。

また、iPadからのHTTP POSTを受け取るとチャイム音が流れるようにします。Raspberry PIにはあらかじめ[最新のRaspbian](https://www.raspberrypi.org/downloads/raspbian/)をインストールしておき、流したいチャイム音（ `/opt/reception/chime.mp3` ）を入れておきます。

```bash
# 必要なライブラリをインストール
$ sudo apt-get update
$ sudo apt-get install build-essential python3 python3-pip mpg321
$ sudo pip3 install flask uwsgi
```

```python:/opt/reception/app.py
from flask import Flask
from subprocess import Popen, PIPE

app = Flask(__name__)


@app.route('/call')
def call():
    proc = Popen(['mpg321', '/opt/reception/chime.mp3'], stdin=PIPE, stdout=PIPE)
    proc.communicate()

    return "OK"
```

```bash
# 起動
$ uwsgi --socket 0.0.0.0:5000 --protocol=http --wsgi-file /opt/reception/app.py
```

## 受付画面を作る

今回はVue.jsとElement.jsを利用して画面を作ってみました。ターゲットがiOSでService Workerを使わないため、 `manifest.json` は必要ありません。

```index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-title" content="PWA Reception">
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<body style="margin: 0; padding: 0;">
  <div id="app">
    <ul style="display: flex; flex-wrap: wrap; list-style: none; margin: 0; padding: 0;">
      <li v-for="m in members" style="width: 25%;">
        <el-card shadow="always" style="margin: 1rem" :body-style="{ padding: '0px' }">
          <img :src="m.avatar" style="width: 100%" alt="">
          <div style="padding: 1rem">
            {{ m.name }}
          </div>
          <div style="padding: 1rem">
            <el-button type="primary" style="width: 100%" @click="call(m)">呼び出し</el-button>
          </div>
        </el-card>
      </li>
    </ul>
  </div>
</body>
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: function() {
        return {
          // 実際には社員マスタを参照するようにします
          "members": [
            {"name": "山田太郎", "slack": "@taro", "avatar": "https://placekitten.com/300/200"},
            {"name": "山田二郎", "slack": "@jiro", "avatar": "https://placekitten.com/301/200"},
            {"name": "山田三郎", "slack": "@saburo", "avatar": "https://placekitten.com/302/200"},
            {"name": "山田四郎", "slack": "@shiro", "avatar": "https://placekitten.com/303/200"},
            {"name": "山田五郎", "slack": "@goro", "avatar": "https://placekitten.com/304/200"},
            {"name": "山田六郎", "slack": "@rokuro", "avatar": "https://placekitten.com/305/200"},
            {"name": "山田七郎", "slack": "@shichiro", "avatar": "https://placekitten.com/306/200"},
            {"name": "山田八郎", "slack": "@hachiro", "avatar": "https://placekitten.com/307/200"},
          ]
        }
      },
      methods: {
        call: function(m) {
          axios.post('<Raspberry PIのIPアドレス>/call');
          axios.post('<Slack Incoming Webhook URL>', {text: m.slack + " さんにお客様です。"});
        }
      }
    })
  </script>
</html>
```

## 受付画面をiPadにインストールする

最後に、iPadにPWAとして受付画面をインストールします。さきほど作った受付画面（`index.html`）をiPadのSafariで表示します。適当なWebサーバに載せるか、簡易Webサーバを立ち上げてiPadから見に行ってください。

会社では、社内で運用しているGitLab Pagesに、`index.html`を出力するようにしています。

Safariで表示した後、「ホーム画面に追加」を選択すると、ホーム画面上に新しいアイコンが作られます。これでインストールは完了です。

## 最後に

![IMG_1715.PNG](https://qiita-image-store.s3.amazonaws.com/0/1588/695f3425-0295-d9b7-6967-a5bee4e7f40b.png)

ホーム画面のアイコンから受付画面を開くと、このようにSafariのヘッダーやナビゲーションが表示されず、またオフラインでも画面を開けるようになります。

設置する際には、iOSの自動スリープを無効にし、アクセスガイドモードを使用してこのアプリ（PWA）しか利用できないようにしましょう。