本文へジャンプ

[RaspberryPi PaSoRi Slack] 社内ICカードでツケ払いシステム作ってみた 〜 『Suzuki Pay』開発記

Posted by kenta sugiyama

オフィスグリコなど社内で軽食などが買えるサービスがありますが、弊社ではスタッフが趣味で(勝手に)やっているドリンクサービスがあります。
通称『Suzuki商店』 。スズキさんがやっているのでこのネーミングです(そのまま)。

販売はドリンクのみですが1日に3,4回利用するヘビーユーザーがいる人気店。
システム的には商品取ったら100円払う、という巷のものと同様ですが毎度小銭を持っていくのが面倒だ、という声があったりなかったり。。
そこで、制作会社らしくシステムを構築しよう、と社内プロジェクトが発足しました。

理想的にはSuicaなどの電子マネーで決済まで行ってしまうことですが、実際に決済まで行ってしまうと、手数料を取られてしまうようなので断念。
そこで利用状況を記録し都度支払うのではなく、「週単位の合計金額をSlackに通知、支払う」という ツケ払いシステム『Suzuki Pay』 の構築がスタートしました。

機能要件!!

  • ICカードからユーザーを判定
  • 1週間ごとにユーザー単位で合計金額を計算したJSONを生成、更新
  • データをもとに金額を各ユーザーにSlackで通知する
  • 管理人が代金を受け取った際のチェック機能
  • チェック時に支払い完了をSlackに通知

環境準備!!

ICカードリーダーはUSB接続のものが手元にあったのでそれを使用、としてもUSB出力ができるメインの筐体が必要。
Arduinoなどでもいけるかもしれなかったですが、予てから触ってみたいと思っていた『Raspberry Pi(3 B+)』で、ストレージに使うmicroSDとともにAmazonでポチポチ。
Raspbianをインストールしてひとまず起動するように設定、手のひらサイズの中にWi-Fiモジュールまで入ったほぼPCが構築できるとかすごい時代になったものです。

さて、本格的な開発環境準備ですがいろいろ記事など読んでみるとそういったアプリケーションはPythonで開発する模様(今更w)。
Pythonは未経験ですが、普段コード書いている人間なので、まあなんとかなるでしょうという謎の自信。w
Raspberry Piには2系がデフォルトで入っているみたいなのですが、予備知識がないところでわざわざ古い方で始めることもないでしょう、という感じでPython3をインストール

Raspberry Pi側でやるのは読み込んだICカードで個人を識別してAPIに渡してレスポンスを受け取るところまで。
API開発含め以降はPHPだったりいつものweb開発なので、Raspberry Pi側さえできてしまえば終わったようなものです(言い過ぎ)。
エディタは普段は使ってないですが Visual Studio Codeがあるようなのでそれを使用しました。

カードリーダーのモジュールもインストールしてDEMOでICカードが読み取れることを確認、ひとまず順調順調。

開発!!

Raspberry Pi

最終的には LED Matrix 付けたり、専用の 3.5インチ小型モニター 付けたりでいろいろありましたが(後述)、最低限の機能としてはシンプル(全員分のカードIDから検索、非同期通信)なのでそれほど時間はかかりませんでした。
むしろインデントとかPythonならではのお作法に戸惑いましたw

開発中はこんな感じ。

開発中の様子

Web

Web側は慣れ親しんだ言語での開発なのですが、やることは結構あります。

  • 管理画面表示
  • 表示に使うデータ(JSON)の読み書きAPI
  • 金額通知API
  • 支払いチェックAPI
  • 各API使用時の非同期処理
  • etc ...

SlackのAPIとかはアプリケーション登録など普段あまり使わないのでアプリ設定とかの内容が半信半疑ですがw、ひとまず動いているので良しとしましょう。
@hogehogeのユーザー名でもメッセージ送ることできますが、なぜか送れる人と送れない人がいるのでSlackで生成された乱数のIDを使う方が確実というのは勉強になりました。

ユーザー名は変更できてしまうので、それ使っちゃそもそもダメでしょというのもありますが。。
各種非同期処理も使い勝手求めると当初より細々と仕様が増えていきました。

トラブル!?

先ほど後述と書いていたいろいろですが、それは小型モニターを取り付けているときに起きました。
よく読んでなかったのが悪いといえばそれまでですが、微妙に型番違いのドライバをインストールしてしまったところRaspberry Pi自体が起動しなくなりました。。!!
いろいろ調べてみましたが、セーフモードでも起動せずもうフォーマットするしかない?という行きついてしまいました。。普段の開発環境と違ってGitとかでバックアップ取っていなかったのでできれば避けたい。。

というところで、普段は GUI 起動ですが CUI で起動するようにBoot Optionsを変更できるということ、、さっそく試したところで、、起動した!!(ひたすら黒い画面ですがw)
ソースコードのみFTPとかで退避してフォーマットしてしまおうかとも思いましたが、一縷の望みをかけて正しい型番のドライバをインストールし直してみる。。

恐る恐るBoot Optionsをもとに戻して起動。。ちゃんと起動した!!
胸をなでおろしましたが、バックアップはどんな時でも大事ですね、、気を付けましょう。

さて、モニターのドライバを入れたことでタッチディスプレイとして使えたり、ディスプレイ解像度もいろいろ変更できるのですが、ドライバ入れるとGPIOポートを占有してしまうようで(単純にディスプレイ表示するだけならHDMI接続するだけで良い)、別のGPIOポート使用するものが使えない、という別の問題にぶち当たりました。。

今回の場合は電子工作で使うようなLED Matrixでしたが、シリアルポートの割り当てがおかしくなってしまい、LED Matrixが認識しない。。モニターのドライバを入れなければ使える。。謎です。

LED MatrixはID識別、API通信の完了時に電光掲示板的に『〇〇さん、まいどあり!!』というテキスト流して遊びたかっただけですが、普段使わないディスプレイのタッチ機能で、どっちを取るといえば当然前者ということでドライバなしで使用することにしました。

実運用開始!!

実運用の様子

開発中いろいろありましたが、テストも終わって(テスト中にも機能追加したりもしましたがw)、ケースも作って冷蔵庫脇に設置。全社で実運用開始しています。

運用開始してからまだ日は浅いですが、お金のチャージ機能が欲しいという要望が上がってきていて近日アップデート予定、、です。

Recent Entries
MD EVENT REPORT
What's Hot?