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 import argparse 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: 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 wc.init(_file_timestamp) # Request service _date = get_date() timestamp = create_timestamp() 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) def main() -> None: parser = argparse.ArgumentParser(prog="We Collect", description="Collects vehicle data") parser.add_argument("username", help="Username to collect data for (must exist in credentials.py)") parser.add_argument("--loop", help="Execute once or create event loop", type=bool, default=False) args = parser.parse_args() print(args) wc = None for user in users: if args.username in user['username']: wc = WeCollector(user) try: request_loop(wc) except Exception as e: print(f"Terminated with Exception {e}") print(f"Terminated Normally") if __name__ == '__main__': main()