diff --git a/we_collector.py b/we_collector.py index e69de29..0440dee 100644 --- a/we_collector.py +++ b/we_collector.py @@ -0,0 +1,120 @@ +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._date_last = None + self._file_timestamp = None + self._vehicle_data_last = None + self._f_mgr = FolderMgr() + self.create_session() + + 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['username'], 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): + self._record_id = 0 + self._record_list = [] + self._vehicle_data_last = {} + + def request(self): + _date = get_date() + timestamp = create_timestamp() + # Reset on start up or day change + if date_has_changed(self._date_last, _date): + self._date_last = _date + self.init() + self._file_timestamp = create_timestamp(with_ms=False).replace(':', '-').replace('.', '-') + + try: + print(f"{timestamp}: Retrieve vehicle data for {self._user['nickname']}") + + # 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), 'nickname': self._user['nickname']}, '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['vin']}", _date) + filename = f"{self._user['vin']}_{self._user['nickname']}_{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]): + start = time.time() + + # Request service + for wc in wc_list: + wc.request() + + # 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) + request_loop(wc_list)