見出し画像

車の走行距離を自動計測→メンテ時期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を生かすことができたのはこれが初めてで、できた時はすごく嬉しかったです!

バージョンアップして、より良いものにしていきたいと思います。

次は何作ろうかな〜
ここまで読んでいただいてありがとうございました!

いいなと思ったら応援しよう!

この記事が参加している募集