目次
- なぜこのシステムを作ったのか
- 使用するツール・環境
- MACアドレスについて
- ソースコード
- Raspberry pi のプログラム自動実行設定
- 使用してみた結果
- 最後に
1. なぜこのシステムを作ったのか
出社時の打刻ってめんどくさくないですか?が発端でした。
打刻忘れなどによる、訂正など、とても時間がかかり、非生産的です。
それらの問題を解決するべく、Wifiによる打刻システムを簡易的に作成しました。
毎時5分起きに、プログラムが作動し、社員さんが持つスマホやPCがWifiに繋がったデバイスを検知し、出勤記録をエクセルに記入します。あらかじめ、社員さんのMACアドレスは控えておくことが必要条件です。
2. 使用するツール・環境
今回はRaspberry pi を使って実装しました。
理由として、小型コンピュータで、常に動作させられ、プログラムの自動実行等、汎用性が高いからです。
言語はpythonで、仮想環境を用いて行いました。
3. MACアドレスについて
社員のデバイスのMACアドレスを入手しておく必要がありますが、もし、iphoneのMACアドレスを取得する場合、注意する点があります。iOS14からデフォルトでオンになった「MACアドレスのランダム化」により、使うWifiによってMACアドレスが変わってしまいます。そのため、社内で繋がるように設定しているWifiのMACアドレスを取得するようにしましょう。
4. ソースコードの解説等
import requests
import subprocess
import sys
import openpyxl
import datetime
employee_1_a = 'a1:47:74:3e:6e:6a'
employee_1_b = 'da:67:66:7b:23:d7'
employee_2_a = '69:93:c6:28:78:ff'
employee_2_b = '6b:a4:eb:2b:8b:15'
#LINE Notifyの送信部分
def send_line_notify(notification_message):
line_notify_token = ''
line_notify_api = 'https://notify-api.line.me/api/notify'
headers = {'Authorization': f'Bearer {line_notify_token}'}
data = {'message': f'message: {notification_message}'}
requests.post(line_notify_api, headers = headers, data = data)
#MACアドレスの取得
def check_mac():
res = subprocess.run(["arp", "-a"], stdout=subprocess.PIPE)
sys.stdout.buffer.write(res.stdout)
return res
def main():
dt_now = datetime.datetime.now()
mac_address = str(check_mac())
book = openpyxl.load_workbook('qiita/出勤簿.xlsx')
sheet = book['出勤簿']
#従業員1のチェック
if employee_1_a or employee_1_b in mac_address:
send_line_notify('社員1の出勤を記録しました。')
sheet.cell(row=dt_now.day + 1, column = 1).value = str(dt_now) + ' 出勤'
book.save('qiita/出勤簿.xlsx')
#従業員2のチェック
if employee_2_a or employee_2_b in mac_address:
send_line_notify('社員2の出勤を記録しました。')
sheet.cell(row=dt_now.day + 1, column = 2).value = str(dt_now) + ' 出勤'
book.save('qiita/出勤簿.xlsx')
if __name__ == "__main__":
main()
5. Raspberry pi のプログラム自動実行設定・方法
上記のプログラムを定期実行してくれるように設定行います。
$ sudo crontab -e
上記のようにcrontabを開きます。
*/5 * * * * /usr/bin/python3 /home/qiita/times_tamping.py
この記述で、5分置きに定期実行をすることができます。
6. 使用してみた結果
実際に半月ほど稼働させてみました。
上記は、MACアドレスを検知し、社員2の出勤が記録されている様子です。
上記は、実際にシステムが出勤を9時に検知し、エクセルに記録している様子です。
想像以上に、検知の感度が良く、正しく記録できていました。
7. 最後に
記事を読んでくださり、ありがとうございました。
DBに接続したり、フロントに反映させたりすると、もっと面白くなると思いました!
いいなと思ったら、いいねをお願いします!