車の走行距離を自動計測→メンテ時期LINEで通知!
Hello World!
日々、授業に関する内容を別ブログでUPしてきましたが、(大してしてない)
今回は趣味の投稿をしてみます!
<きっかけ>
私は車が好きで、メンテナンスはできれば自分でやりたい派です。
でも、悩みがありまして、、
メンテ時期を覚えていられないんです、、
「前いつエンジンオイル変えたっけ?」的な。
また、趣味でPythonをいじっています。せっかくPyQで勉強したので、何かに応用できないかと考えていました。
そんな時に出会ったのが@hishiさんのこのページ。
https://qiita.com/hishi/items/8f77fd4655027fac7c7d
す、すげぇ、、。趣味の融合、楽しそう、、
そこで、Python➕iOSショートカットで、自分なりの走行距離レコーダーを作成してみました!
と言っても、先人たちの偉大なるレガシーに少し手を加えただけです。
以下が参照させていただいたページです。本当にありがとうございます。
放送大学愛知教育センター わくわくプログラミング教室
(=私のコードの骨子)
http://wakupro.sakura.ne.jp/archives/1142
@akeomeさんの、LINE notificationのページ
https://qiita.com/akeome/items/e1e0fecf2e754436afc8
<自分の走行距離レコーダーのいいところ>
・CarplayとiOSショートカットのおかげで自動で処理開始!
・途中経過を.csvに保存しているので、いつでも参照できる!
・LINEに通知が来るので気づきやすい!
・GPSの受信時間を編集できる。1秒間隔は結構正確だと思う(まだ検証中)
<Pythonの処理>
こういった実践的なものは初めて作りました。
0から独学で勉強したので、アドバイス等頂けると幸いです!
「こうしたらもっとシンプル」とか、お気軽にお願いします!
import location # このモジュールで、GPSを取得します。
from datetime import datetime
import threading
import time
import queue
import csv
from geopy.distance import geodesic
import numpy as np
import requests
# 使用リスト一覧
g_locs = []
ido = []
keido = []
distance = []
awasete = []
# スレッド動作する、GPS取得関数
def GPS(que,locs):
print('GPS thread has started.')
# 定期的なGPS取得スタート
location.start_updates()
while True:
#もし何か文字列を入力されたら、終了。
if not que.empty():
break
# 緯度&経度取得
loc = location.get_location()
lat = loc["latitude"] # 緯度
lng = loc["longitude"] # 経度
#各リストに格納
ido.append(lat)
keido.append(lng)
# 現在時刻取得
now = datetime.now()
print(now, lat, lng)
# 1秒待機
time.sleep(1)
# ループを抜けたら、定期的なGPS取得を終了。
location.stop_updates()
# キューのインスタンス生成
que = queue.Queue()
# スレッドでGPS関数開始
th1 = threading.Thread(target=GPS,args=(que,g_locs,))
th1.start()
# もしユーザーから文字列入力を受け取ったら、キューに送りスレッド終了。
while True:
inp = input()
que.put(inp)
if not inp == '':
break
th1.join
#リストから緯度経度iと次の緯度経度i+1取得
for i in range(len(ido)-1):
a = (ido[i], keido[i])
b = (ido[i+1], keido[i+1])
#距離に換算し、リストに格納
dis = geodesic(a, b).km
distance.append(dis)
#各点の距離を合計=走行距離
this_trip = sum(distance)
easy = round(this_trip)
print("You drove" + str(easy)+"km")
#走行距離を.csvに上書き保存
file = open('Moving_distance.csv', 'a')
file.write(str(easy)+"\n")
file.close()
#もう一回ファイルを開いて、これまでの走行距離を合計
with open("Moving_distance.csv", "r") as p:
k = str(p.read()).replace("\n", "")
awasete.append(int(k))
goukei = sum(awasete)
#合計が5000kmを超えたら通知して0にリセット
if goukei > 5000:
def main():
send_line_notify('5000km、エンジンオイル交換時期です')
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)
if __name__ == "__main__":
main()
file = open('Moving_distance.csv', 'w')
file.write(str(0))
file.close()
<iOSショートカットの処理>
Pythonistaの右上、スパナのマークから、”shortcuts” → “Pythonista URL”と進むと、パスを取得できる。
それをショートカットのオートメーションにある、Bluetoothをトリガーにしたものに入れる!自動で処理スタート!
ただ現状、処理を終わらせるためには目的地到着後、何らかの手動入力しないといけない。ググった情報によると、ショートカットが、Pythonistaの「引数を渡す」に対応してない?
これができたら、Bluetoothの接続解除をトリガーにして、何らかの引数を入力して、処理を自動で終わりにできるのに、、🥺
<今後こうしていきたい> ※お気軽に色々教えてください!
・エンジンオイルだけじゃなく、他のオイルやバッテリー等も管理したい。
→.csvじゃなくて.xlsxでsheetを分けて管理すべき?
・.csvに走行距離だけじゃなくて日時も入れたい。
→ k = str(p.read()).replace("\n", "")のところで書き込んだ日時も消す必要があるけど、消し方がわからない、、
・バックグラウンドでのGPS受信はどうやらできなそうなので、ケータイがスリープしない様にする工夫が必要。
・CarPlayの接続が切れたら自動で処理がストップできるようにしたら完璧。
→ これはどうしたらいいか見当もつかない。ヒント・アイディアお願いします!
・ラズパイで液晶もつけたりすればもっと夢が広がりそう、、、
<感想>
家族が寝静まった後、深夜に頑張って、1週間程度でできました!今までコードを書いても、「何の役に立つねんこれ・・」とか思ってました。
でも現実生活で、Pythonを生かすことができたのはこれが初めてで、できた時はすごく嬉しかったです!
バージョンアップして、より良いものにしていきたいと思います。
次は何作ろうかな〜
ここまで読んでいただいてありがとうございました!