139 lines
4.6 KiB
Python
139 lines
4.6 KiB
Python
import os
|
|
import time
|
|
import json
|
|
import pprint
|
|
from wci import wci
|
|
from credentials import users
|
|
from folder_mgr.folder_mgr import get_date, date_has_changed, FolderMgr, create_timestamp
|
|
from jay_diff import jay_diff_full
|
|
|
|
INTERVAL = 1*60
|
|
|
|
domains = [
|
|
"access",
|
|
"charging",
|
|
"climatisation",
|
|
"climatisationTimers",
|
|
"fuelStatus",
|
|
"userCapabilities",
|
|
"vehicleLights",
|
|
"vehicleHealthInspection",
|
|
"oilLevel",
|
|
"measurements"
|
|
]
|
|
|
|
|
|
class WeCollector:
|
|
def __init__(self, user):
|
|
# Init collecting records
|
|
self._user = user
|
|
self._record_id = 0
|
|
self._wci = None
|
|
self._endpoint = None
|
|
self._record_list = None
|
|
self._vehicle_data_last = None
|
|
self._f_mgr = FolderMgr()
|
|
self.create_session()
|
|
self._file_timestamp = None
|
|
|
|
def create_session(self):
|
|
expired_token_for_test = 'eyJraWQiOiI0ODEyODgzZi05Y2FiLTQwMWMtYTI5OC0wZmEyMTA5Y2ViY2EiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxMDQyNmRjZC1mYzljLTRkODctODBmYy0yMDIyNzdmYzhkYzIiLCJhdWQiOiJhMjRmYmE2My0zNGIzLTRkNDMtYjE4MS05NDIxMTFlNmJkYThAYXBwc192dy1kaWxhYl9jb20iLCJzY3AiOiJvcGVuaWQgcHJvZmlsZSBiYWRnZSBjYXJzIGRlYWxlcnMgdmluIiwiYWF0IjoiaWRlbnRpdHlraXQiLCJpc3MiOiJodHRwczovL2lkZW50aXR5LnZ3Z3JvdXAuaW8iLCJqdHQiOiJhY2Nlc3NfdG9rZW4iLCJleHAiOjE3Mjg5ODQzMjAsImlhdCI6MTcyODk4MDcyMCwibGVlIjpbIlZPTEtTV0FHRU4iXSwianRpIjoiYWQ0MDhkMDEtYmQxMy00YWZkLWIyMWEtYmZiMTE5NTFhOGE3In0.r78z00BS0Je7mjUcukmrkuSiPO9F8me-bLs3ZZF6BokhPX8uqu_2j7I3Pu-8C1xwFBb-YDs6rr0iiVUeOeiKM4O-jOik8ny57sMKdYJ_FHZNo-GLMA_WPppNaGWkM8HojIxEW4mrO3Zqd9f_vDrTAYukG4WyULbxq_OH6c6yQdmEx4M1PGisVB0DI6DG0Dl4748BCJMA_TyNvKagQHZuRhT0ma7kj_GVSqlGGtW0erwPBwTHY_X_wDitngod2iUw9nRtli-HkJKqgER82jSu2k5b36ePglsRqx6k4ls8Tiz6ykgcjuuW4_zdsfUNuhBElVd1QwCzolQ4e7IzHbVaRZbub8tlisrHZMskGJmNJeAUv9xZMJ8o6YNyAz__WPvP6iubrCIixSKOThv-YLXa0cFkCPmoaLR9eeTy6sWFsFvslTdD-a0zrrdP8ais4g5Cxao6ph3NV1xCgkEldImI3n1hxeMLefe6sqfoZ6Ogz-EDVPBxS9qpazPWN6EQyyYLXQZA0s6p5hcrjVq7pD-5yXjeFhCrymzizaNm0JhVF_L36F3D5a3s8tnQ2kaMfdK6jdHQyauxL-8SHfAgk_py33XOcgGQkp4aOXN3pm7UhutQ8fAS9kMoquqikuxTAu-UlWAYRhDUaypab1F51f50eK84s1jpgWDAQ1aL7PIgwj8'
|
|
self._wci = wci.WeConnectId(self._user['email'], self._user['password'], expired_token_for_test)
|
|
vehicles = self._wci.get('/vehicles')['data']
|
|
print('list of vehicles:')
|
|
pprint.pprint(vehicles)
|
|
|
|
# Print vins
|
|
for vehicle in vehicles:
|
|
vin = vehicle['vin']
|
|
print(f'vin: {vin}')
|
|
|
|
# Create request url
|
|
endpoint = '/vehicles/' + self._user['vin'] + '/selectivestatus?jobs='
|
|
for domain in domains:
|
|
endpoint += domain + ','
|
|
self._endpoint = endpoint[:-1]
|
|
print(f'Endpoint: {self._endpoint}')
|
|
|
|
def init(self, file_timestamp):
|
|
self._record_id = 0
|
|
self._record_list = []
|
|
self._vehicle_data_last = {}
|
|
self._file_timestamp = file_timestamp
|
|
|
|
def request(self, _date, timestamp):
|
|
try:
|
|
print(f"{timestamp}: Retrieve vehicle data for {self._user['username']}")
|
|
|
|
# Create data difference
|
|
vehicle_data = self._wci.get(self._endpoint)
|
|
vehicle_data_diff = jay_diff_full(self._vehicle_data_last, vehicle_data)
|
|
self._vehicle_data_last = vehicle_data
|
|
|
|
# Put vehicle data difference onto record list
|
|
self._record_list.append({
|
|
'info': {'record_id': self._record_id,
|
|
'timestamp': timestamp, 'is_delta': (self._record_id > 0),
|
|
'username': self._user['username'],
|
|
'vin': self._user['vin']},
|
|
'data': vehicle_data_diff})
|
|
|
|
# Store record list
|
|
print(f"{timestamp}: Store record #{self._record_id:04d}")
|
|
folder = self._f_mgr.update(f"results/{self._user['username']}/{self._user['vin']}", _date)
|
|
filename = f"records_{self._file_timestamp}.json"
|
|
_path = os.path.join(folder, filename)
|
|
with open(_path, "w") as fp:
|
|
json.dump(self._record_list, fp, indent=4)
|
|
|
|
self._record_id += 1
|
|
|
|
except Exception as e:
|
|
print(f"Exception: {e}")
|
|
|
|
|
|
def request_loop(_wc_list: list[WeCollector]):
|
|
_date_last = None
|
|
_file_timestamp = None
|
|
|
|
while True:
|
|
start = time.time()
|
|
_date = get_date()
|
|
|
|
# Reset on start up or day change
|
|
if date_has_changed(_date_last, _date):
|
|
_date_last = _date
|
|
_file_timestamp = create_timestamp(with_ms=False).replace(':', '-').replace('.', '-')
|
|
|
|
# Request service
|
|
for wc in wc_list:
|
|
wc.init(_file_timestamp)
|
|
|
|
# Request service
|
|
_date = get_date()
|
|
timestamp = create_timestamp()
|
|
for wc in wc_list:
|
|
wc.request(_date, timestamp)
|
|
|
|
# wait until next loop
|
|
stop = time.time()
|
|
diff = stop - start
|
|
time_to_wait = INTERVAL - diff
|
|
if time_to_wait < 0:
|
|
time_to_wait = 0
|
|
time.sleep(time_to_wait)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
wc_list = []
|
|
for user in users:
|
|
wc_list.append(WeCollector(user))
|
|
|
|
print(wc_list)
|
|
try:
|
|
request_loop(wc_list)
|
|
except Exception as e:
|
|
print(f"Terminated with Exception {e}")
|
|
|
|
print(f"Terminated Normally")
|