Raspberry Pi で スマホを使った勤怠管理2

前回の続きです。

仕様としては以下です。
Felicaをスキャンした際に、スキャンした日時とIDをログに出力する

・ログファイルの形式はTSV(データをタブで区切る)

・ログファイルは日ごとに別のファイルに出力、ファイル名は「年月日.tsv」とする

・当アプリケーションはtsvファイルを出力するまでで、その集計は、別途Excelなどで行う

・日ごとのスキャンした最小時間、最大時間をそれぞれ勤務開始時間、勤務終了時間として扱う

・日ごとにスキャンログを出力するため、日を跨いでの勤怠管理は対象としない

 

出力したログ(TSV)を読み込んだりするのは、Excelに詳しい方にお任せします。

 

お仕事部屋の入口において、入退出ごとにスキャンする運用にすれば、「仕事部屋にいて、仕事をしていたであろう時間の集計」にも使えます。

逆に、「仕事部屋にいない、サボっているかもしれない」時間の集計にも使えます。
(部屋にいれば仕事しているとみなすのは古臭いですよね)

 

Pythonプログラミング

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import datetime
import os
from ctypes import *
from time import sleep

# 定数の定義
FELICA_POLLING_ANY = 0xffff
NONE_SCAN = '0000000000000000'
TSV_DIR = 'TSV'

# ライブラリの読込
libpafe = cdll.LoadLibrary("/usr/local/lib/libpafe.so")

def scan_felica():
    """
    felicaのスキャン
    """
    # 初期化
    libpafe.pasori_open.restype = c_void_p
    pasori = libpafe.pasori_open()
    libpafe.pasori_init(pasori)
    libpafe.felica_polling.restype = c_void_p
    idm = c_ulonglong()
    # 読込
    felica = libpafe.felica_polling(pasori, FELICA_POLLING_ANY, 0, 0)
    libpafe.felica_get_idm.restype = c_void_p
    libpafe.felica_get_idm(felica, byref(idm))
    # 16進表記で取得
    fericaData = "%016X" % idm.value
    # 後始末
    libpafe.free(felica)
    libpafe.pasori_close(pasori)
    # スキャン結果を返す
    return fericaData

# 継承した場合など、実行されないようにする(現状、意味は特にない)
if __name__ == "__main__":
    #TSV保存先フォルダの作成
    if os.path.exists(TSV_DIR) == False :
        os.mkdir(TSV_DIR)

    # 初期値を設定しておく
    felicaID_old = NONE_SCAN
    felicaID = NONE_SCAN

    while True:
        # felicaスキャンする
        felicaID = scan_felica()

        if felicaID == NONE_SCAN:
            # スキャンされていない
            if felicaID_old != NONE_SCAN:
                # カードを離した
                felicaID_old = NONE_SCAN
            else:
                # スキャンされていないのが続いている
                pass
        elif felicaID_old == felicaID:
            # 同じものがスキャンされ続けているので何もしない(カードを離してくれるのを待つ)
            pass
        else:
            # スキャンされた日時
            now = datetime.datetime.now()            
            # 日時とIDの表示(デバッグ用)
            scan_info = f'SCAN,{now.strftime("%Y/%m/%d %H:%M:%S")},{felicaID}'
            print(scan_info)

            # 日時とIDの出力ファイル名(ファイルは日ごとに増えていく)
            log_File = f'{TSV_DIR}/{now.strftime("%Y%m%d")}.tsv'
            # 出力内容
            tsv_line = f'{now.strftime("%Y/%m/%d %H:%M:%S")}\t{felicaID}'
            # 出力する
            with open(log_File, mode="a") as tsv_file:
                tsv_file.write(tsv_line + '\r\n')

            # スキャンされたIDの更新
            felicaID_old = felicaID
        
        sleep(1)