From b6207a18c79f03908bfbcd3b42e718c64293f4e6 Mon Sep 17 00:00:00 2001 From: BluemediaGER Date: Sun, 21 Apr 2024 20:17:37 +0200 Subject: [PATCH] Only persist MeterValues for ongoing transactions --- app/ocpp_proto/chargepoint.py | 79 ++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/app/ocpp_proto/chargepoint.py b/app/ocpp_proto/chargepoint.py index d41b857..b82a06d 100644 --- a/app/ocpp_proto/chargepoint.py +++ b/app/ocpp_proto/chargepoint.py @@ -180,47 +180,50 @@ class ChargePoint(cp): db.add(transaction) elif event_type == str(TransactionEventType.updated): transaction = db.get(DbTransaction, transaction_info["transaction_id"]) - if "meter_value" in kwargs.keys(): - for meter_value_entry in kwargs['meter_value']: - timestamp = datetime.fromisoformat(meter_value_entry['timestamp']) - for sampled_value in meter_value_entry['sampled_value']: - db_meter_value = DbMeterValue() - db_meter_value.transaction_id = transaction.id - db_meter_value.timestamp = timestamp - if "measurand" in sampled_value.keys(): - db_meter_value.measurand = Measurand(sampled_value['measurand']) - else: - db_meter_value.measurand = Measurand.ENERGY_ACTIVE_IMPORT_REGISTER - if "phase" in sampled_value.keys(): - db_meter_value.phase_type = PhaseType(sampled_value['phase']) - if "unit_of_measure" in sampled_value.keys(): - if "unit" in sampled_value['unit_of_measure']: - db_meter_value.unit = sampled_value['unit_of_measure']['unit'] - else: - db_meter_value.unit = "Wh" - db_meter_value.value = sampled_value['value'] - db.add(db_meter_value) - if "id_token" in kwargs.keys(): - if id_token_info.status == AuthorizationStatusType.accepted: - transaction.user_id = token_owner_id + if transaction != None: + if transaction.status == TransactionStatus.ONGOING: + if "meter_value" in kwargs.keys(): + for meter_value_entry in kwargs['meter_value']: + timestamp = datetime.fromisoformat(meter_value_entry['timestamp']) + for sampled_value in meter_value_entry['sampled_value']: + db_meter_value = DbMeterValue() + db_meter_value.transaction_id = transaction.id + db_meter_value.timestamp = timestamp + if "measurand" in sampled_value.keys(): + db_meter_value.measurand = Measurand(sampled_value['measurand']) + else: + db_meter_value.measurand = Measurand.ENERGY_ACTIVE_IMPORT_REGISTER + if "phase" in sampled_value.keys(): + db_meter_value.phase_type = PhaseType(sampled_value['phase']) + if "unit_of_measure" in sampled_value.keys(): + if "unit" in sampled_value['unit_of_measure']: + db_meter_value.unit = sampled_value['unit_of_measure']['unit'] + else: + db_meter_value.unit = "Wh" + db_meter_value.value = sampled_value['value'] + db.add(db_meter_value) + if "id_token" in kwargs.keys(): + if id_token_info.status == AuthorizationStatusType.accepted: + transaction.user_id = token_owner_id elif event_type == str(TransactionEventType.ended): transaction = db.get(DbTransaction, transaction_info["transaction_id"]) - transaction.status = TransactionStatus.ENDED - transaction.ended_at = datetime.fromisoformat(timestamp) - transaction.end_reason = TransactionEventTriggerReason(trigger_reason) - meter_end=0 - if "meter_value" in kwargs.keys(): - for meter_value_entry in kwargs['meter_value']: - for sampled_value in meter_value_entry['sampled_value']: - if "measurand" in sampled_value.keys(): - if sampled_value['measurand'] == str(Measurand.ENERGY_ACTIVE_IMPORT_REGISTER): + if transaction != None: + transaction.status = TransactionStatus.ENDED + transaction.ended_at = datetime.fromisoformat(timestamp) + transaction.end_reason = TransactionEventTriggerReason(trigger_reason) + meter_end=0 + if "meter_value" in kwargs.keys(): + for meter_value_entry in kwargs['meter_value']: + for sampled_value in meter_value_entry['sampled_value']: + if "measurand" in sampled_value.keys(): + if sampled_value['measurand'] == str(Measurand.ENERGY_ACTIVE_IMPORT_REGISTER): + meter_end = sampled_value['value'] + else: meter_end = sampled_value['value'] - else: - meter_end = sampled_value['value'] - transaction.meter_end = meter_end - if "id_token" in kwargs.keys(): - if id_token_info.status == AuthorizationStatusType.accepted: - transaction.user_id = token_owner_id + transaction.meter_end = meter_end + if "id_token" in kwargs.keys(): + if id_token_info.status == AuthorizationStatusType.accepted: + transaction.user_id = token_owner_id db.commit() if "id_token" in kwargs.keys():