前回の続きです。
仕様としては以下です。
・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)