着席時間を自動計測するIoTシステムの作り方【Mesh/RaspberryPi】

  • 2021.04.20
  • IoT
着席時間を自動計測するIoTシステムの作り方【Mesh/RaspberryPi】
えびかずき
えびかずき

こんにちは、えびかずきです。

今回は着席時間を自動計測するIoTシステムの作り方を紹介していきたいと思います。

こんな人におすすめ:
・デスクの着席時間を自動で測りたい
・Pythonやラズパイを使ったIoTを勉強したい

完成品がこちらです。

左は椅子に設置したセンサー。右は公開したWebページの画面です。

開発のきっかけ

少し前のことですが、

小説家の村上春樹は仕事をする気がしてもしなくても毎日必ず2時間は机に座ることにしてる、という事を知りました。

これってわりと物書きにとっては大事なことですよね。

いろんなところでさんざん言われてることだけど、継続ってとても大事。

これにならって、私も毎日机に2時間座る日課を試してみることにしました。

でも待てよ。

ならばデスクに座った時間を計測してくれるIoTシステムが必要だ。

ということで、着席時間を自動計測するIoTシステム作成することにしました。

下の写真は、完成したシステムの様子です。

着席時間の計測IoTシステム

Linuxマスコットのタックス君をモチーフにして制作しました。

タックス君がセンサーを背負って監視しているというイメージです。

かわいいですね。

人感センサーで座った時間を計測して、そのデータが常にWeb公開される仕組みになっています。

それでは、くわしい作り方をみていきましょう!

開発環境

サーバー:
RaspberryPi 3B
 OS:Raspbian
 Python:3.7.3
 ライブラリ:Flask

温度センサ:
MESH人感センサ/sony


 Webhook:IFTTT

仕組み

全体的な仕組みは下の図に示すとおりです。

椅子に取り付けた人感センサーが、検出したデータをIFTTTでラズパイサーバーに送ります。

そして取得したデータをサーバーで処理して、FlaskでWeb公開するという仕組みです。

わりと単純ですね。

Meshレシピ

メッシュレシピは下図の通りです。

大きくふたつのコネクションから形成されています。

上側のコネクションは人感センサが30秒おきに人間をイスに座っているかどうかを確認して、IFTTTでサーバーにPOSTメソッドでHTTPリクエストを送るように設定しています。

下側のコネクションはリセット用のコネクションで、毎日0時になったら、IFTTTでサーバーにPOSTメソッドでresetのテキスト付きでHTTPリクエストを送るように設定しています。

MeshとIFTTTの連携のやり方は過去記事にまとめていますので、

わからない方はこちらを参考にしてください。

ソースコード

ここではソースコードの詳細について説明します。

Githubにもアップしてますので、自由に使ってください。

基本的にはPythonのFlaskフレームワークを使って、Webサーバーを立てていきます。

Webサーバーの公開はngrokを使っています。

ngrokを使うと、AWSとかHEROKUとか外部のクラウドサービスを使わずに、自分のPCをHTTPで公開できます。

今回はラズパイに立てたFlaskサーバーを公開しました。

URLは申し訳ないですけど非公開です。あくまで個人用に作ったので。

ngrokの使い方は過去記事をご覧ください。

今回のディレクトリ構造は以下のとおり。

tux.py
desk_get.py
desk.json
static
  ∟tux.jpg
templates
  ∟tux.html
desk_archive

ソースコードの説明は、コードの中にコメントアウトで記載しましたので、そちらを参考にしてください。

まずは、メインプログラムのtux.pyです。

# tux.py

import json
import requests
from flask import Flask, render_template, request
from desk_get import desk_result
import datetime as dt

app = Flask(__name__)

 # MESH人感センサからデータ受取り
 # POSTリクエストが来た時の処理をdesk()として記述する。
@app.route("/desk", methods=['POST'])
def desk():
    post = request.data.decode()
    # もしpostの内容がresetだった場合は、jsonファイルに蓄積された今日のデータをArchiveに保存。
   # そして新たに次の一時蓄積用のjsonファイルを作成。
    if post=="reset":
        data = desk_result()*2
        archive = {"time_min":data}
        today = dt.date.today()
        yesterday = today-dt.timedelta(days=1)
        file = open("desk_archive/"+yesterday.strftime("%Y%m%d")+".json" , "w")
        json.dump(archive , file)

        file = open("desk.json", "w")
        json.dump({"desk":0} , file)

    # postに何も入ってない場合は、jsonファイルの中のデータに1を足す。
    else:
        data = desk_result()
        update = {"desk":data+1}
        file = open("desk.json", "w")
        json.dump(update , file)
    return str(data)

# データの確認
# getメソッドでサーバーにアクセスがあった場合の処理。
# httpファイルをレスポンスとして返す。
@app.route("/desk", methods=['GET'])
def desk_get():
    data = desk_result()
    data = str(data//2)
    return render_template("tux.html",data=data)

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000)

つづいて、サブプログラムのdesk_get.py

ここには、jsonファイルに書き込まれたデータを読む関数が入っています。

# desk_get.py
 
import json

# jsonファイルの内容を取得するだけの関数。
# jsonファイルには今日の着席データが蓄積されている。
def desk_result():
    file = open("desk.json", "r")
    json_dict = json.load(file)
    result = json_dict["desk"]
    return result

if __name__ == '__main__':
    desk_result()

最後に、計測時間をWeb公開する用のHTMLです。

# tux.html

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
  <h2>今日の作業時間は{{ data }}minだよ</h2>
  <br>
  <img src= "/static/tux.jpg" alt="tux"/>
  </body>
</html>

まとめ

今回は、着席時間を自動計測するIoTシステムの作り方について説明しました。

ラズパイをサーバーにして、センサーからの情報を処理することで、今回のシステムを作成することができました。

センサーを使ったIoTシステム作りにも慣れてきて、ある程度自由に作りたいものが作れるようになってきました。

また何か面白いものができたら紹介しますね。

ではまた次回の記事でお会いしましょう!

IoTカテゴリの最新記事