feature: PevMode: react on status codes

This commit is contained in:
uhi22 2023-05-15 19:45:11 +02:00
parent 7cfb7ead46
commit ee41f39055

View file

@ -268,14 +268,20 @@ class fsmPev():
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("SessionSetupRes")>0): if (strConverterResult.find("SessionSetupRes")>0):
# todo: check the request content, and fill response parameters # todo: check the request content, and fill response parameters
strResponseCode = "na"
try: try:
y = json.loads(strConverterResult) y = json.loads(strConverterResult)
strSessionId = y["header.SessionID"] strSessionId = y["header.SessionID"]
strResponseCode = y["ResponseCode"]
self.addToTrace("Checkpoint506: The Evse decided for SessionId " + strSessionId) self.addToTrace("Checkpoint506: The Evse decided for SessionId " + strSessionId)
self.publishStatus("Session established") self.publishStatus("Session established")
self.sessionId = strSessionId self.sessionId = strSessionId
except: except:
self.addToTrace("ERROR: Could not decode the sessionID") self.addToTrace("ERROR: Could not decode the sessionID")
if (strResponseCode!="OK_NewSessionEstablished"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
self.addToTrace("Will send ServiceDiscoveryReq") self.addToTrace("Will send ServiceDiscoveryReq")
msg = addV2GTPHeader(self.exiEncode("EDB_"+self.sessionId)) # EDB for Encode, Din, ServiceDiscoveryRequest msg = addV2GTPHeader(self.exiEncode("EDB_"+self.sessionId)) # EDB for Encode, Din, ServiceDiscoveryRequest
self.addToTrace("responding " + prettyHexMessage(msg)) self.addToTrace("responding " + prettyHexMessage(msg))
@ -292,7 +298,16 @@ class fsmPev():
strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("ServiceDiscoveryRes")>0): if (strConverterResult.find("ServiceDiscoveryRes")>0):
# todo: check the request content, and fill response parameters strResponseCode = "na"
try:
y = json.loads(strConverterResult)
strResponseCode = y["ResponseCode"]
except:
self.addToTrace("ERROR: Could not decode the ServiceDiscoveryResponse")
if (strResponseCode!="OK"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
self.publishStatus("ServDisc done") self.publishStatus("ServDisc done")
self.addToTrace("Will send ServicePaymentSelectionReq") self.addToTrace("Will send ServicePaymentSelectionReq")
msg = addV2GTPHeader(self.exiEncode("EDC_"+self.sessionId)) # EDC for Encode, Din, ServicePaymentSelection msg = addV2GTPHeader(self.exiEncode("EDC_"+self.sessionId)) # EDC for Encode, Din, ServicePaymentSelection
@ -311,6 +326,16 @@ class fsmPev():
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("ServicePaymentSelectionRes")>0): if (strConverterResult.find("ServicePaymentSelectionRes")>0):
# todo: check the request content, and fill response parameters # todo: check the request content, and fill response parameters
strResponseCode = "na"
try:
y = json.loads(strConverterResult)
strResponseCode = y["ResponseCode"]
except:
self.addToTrace("ERROR: Could not decode the ServicePaymentSelectionResponse")
if (strResponseCode!="OK"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
self.publishStatus("ServPaySel done") self.publishStatus("ServPaySel done")
self.addToTrace("Checkpoint530: Will send ContractAuthenticationReq") self.addToTrace("Checkpoint530: Will send ContractAuthenticationReq")
msg = addV2GTPHeader(self.exiEncode("EDL_"+self.sessionId)) # EDL for Encode, Din, ContractAuthenticationReq. msg = addV2GTPHeader(self.exiEncode("EDL_"+self.sessionId)) # EDL for Encode, Din, ContractAuthenticationReq.
@ -334,6 +359,16 @@ class fsmPev():
# In normal case, we can have two results here: either the Authentication is needed (the user # In normal case, we can have two results here: either the Authentication is needed (the user
# needs to authorize by RFID card or app, or something like this. # needs to authorize by RFID card or app, or something like this.
# Or, the authorization is finished. This is shown by EVSEProcessing=Finished. # Or, the authorization is finished. This is shown by EVSEProcessing=Finished.
strResponseCode = "na"
try:
y = json.loads(strConverterResult)
strResponseCode = y["ResponseCode"]
except:
self.addToTrace("ERROR: Could not decode the ContractAuthenticationResponse")
if (strResponseCode!="OK"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
if (strConverterResult.find('"EVSEProcessing": "Finished"')>0): if (strConverterResult.find('"EVSEProcessing": "Finished"')>0):
self.publishStatus("Auth finished") self.publishStatus("Auth finished")
self.addToTrace("Checkpoint538: Auth is Finished. Will send ChargeParameterDiscoveryReq") self.addToTrace("Checkpoint538: Auth is Finished. Will send ChargeParameterDiscoveryReq")
@ -369,6 +404,16 @@ class fsmPev():
strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("ChargeParameterDiscoveryRes")>0): if (strConverterResult.find("ChargeParameterDiscoveryRes")>0):
strResponseCode = "na"
try:
y = json.loads(strConverterResult)
strResponseCode = y["ResponseCode"]
except:
self.addToTrace("ERROR: Could not decode the ChargeParameterDiscoveryResponse")
if (strResponseCode!="OK"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
# We can have two cases here: # We can have two cases here:
# (A) The charger needs more time to show the charge parameters. # (A) The charger needs more time to show the charge parameters.
# (B) The charger finished to tell the charge parameters. # (B) The charger finished to tell the charge parameters.
@ -415,6 +460,7 @@ class fsmPev():
strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("CableCheckRes")>0): if (strConverterResult.find("CableCheckRes")>0):
strResponseCode = "na"
try: try:
y = json.loads(strConverterResult) y = json.loads(strConverterResult)
strResponseCode = y["ResponseCode"] strResponseCode = y["ResponseCode"]
@ -422,7 +468,10 @@ class fsmPev():
self.addToTrace("The CableCheck result is " + strResponseCode + " " + strEVSEProcessing) self.addToTrace("The CableCheck result is " + strResponseCode + " " + strEVSEProcessing)
except: except:
self.addToTrace("ERROR: Could not decode the CableCheckRes") self.addToTrace("ERROR: Could not decode the CableCheckRes")
# todo: check the request content, and fill response parameters if (strResponseCode!="OK"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
# We have two cases here: # We have two cases here:
# 1) The charger says "cable check is finished and cable ok", by setting ResponseCode=OK and EVSEProcessing=Finished. # 1) The charger says "cable check is finished and cable ok", by setting ResponseCode=OK and EVSEProcessing=Finished.
# 2) Else: The charger says "need more time or cable not ok". In this case, we just run into timeout and start from the beginning. # 2) Else: The charger says "need more time or cable not ok". In this case, we just run into timeout and start from the beginning.
@ -465,9 +514,11 @@ class fsmPev():
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("PreChargeRes")>0): if (strConverterResult.find("PreChargeRes")>0):
u = 0 # a default voltage of 0V in case we cannot convert the actual value u = 0 # a default voltage of 0V in case we cannot convert the actual value
strResponseCode = "na"
strEVSEStatusCode = "0" # default in case the decoding does not work strEVSEStatusCode = "0" # default in case the decoding does not work
try: try:
y = json.loads(strConverterResult) y = json.loads(strConverterResult)
strResponseCode = y["ResponseCode"]
strEVSEPresentVoltageValue = y["EVSEPresentVoltage.Value"] strEVSEPresentVoltageValue = y["EVSEPresentVoltage.Value"]
strEVSEPresentVoltageMultiplier = y["EVSEPresentVoltage.Multiplier"] strEVSEPresentVoltageMultiplier = y["EVSEPresentVoltage.Multiplier"]
u = combineValueAndMultiplier(strEVSEPresentVoltageValue, strEVSEPresentVoltageMultiplier) u = combineValueAndMultiplier(strEVSEPresentVoltageValue, strEVSEPresentVoltageMultiplier)
@ -476,6 +527,10 @@ class fsmPev():
except: except:
self.addToTrace("ERROR: Could not decode the PreChargeResponse") self.addToTrace("ERROR: Could not decode the PreChargeResponse")
self.addToTrace("PreChargeResponse received.") self.addToTrace("PreChargeResponse received.")
if (strResponseCode!="OK"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
if (self.isErrorEvseStatusCode(strEVSEStatusCode)): if (self.isErrorEvseStatusCode(strEVSEStatusCode)):
self.enterState(stateUnrecoverableError) self.enterState(stateUnrecoverableError)
return return
@ -542,6 +597,16 @@ class fsmPev():
strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("PowerDeliveryRes")>0): if (strConverterResult.find("PowerDeliveryRes")>0):
strResponseCode = "na"
try:
y = json.loads(strConverterResult)
strResponseCode = y["ResponseCode"]
except:
self.addToTrace("ERROR: Could not decode the PowerDeliveryResponse")
if (strResponseCode!="OK"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
if (self.wasPowerDeliveryRequestedOn): if (self.wasPowerDeliveryRequestedOn):
self.publishStatus("PwrDelvy ON success") self.publishStatus("PwrDelvy ON success")
self.addToTrace("Checkpoint700: Starting the charging loop with CurrentDemandReq") self.addToTrace("Checkpoint700: Starting the charging loop with CurrentDemandReq")
@ -571,10 +636,12 @@ class fsmPev():
strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("CurrentDemandRes")>0): if (strConverterResult.find("CurrentDemandRes")>0):
strResponseCode = "na"
u = 0 # a default voltage of 0V in case we cannot convert the actual value u = 0 # a default voltage of 0V in case we cannot convert the actual value
strEVSEStatusCode = "0" # default in case the decoding does not work strEVSEStatusCode = "0" # default in case the decoding does not work
try: try:
y = json.loads(strConverterResult) y = json.loads(strConverterResult)
strResponseCode = y["ResponseCode"]
strEVSEPresentVoltageValue = y["EVSEPresentVoltage.Value"] strEVSEPresentVoltageValue = y["EVSEPresentVoltage.Value"]
strEVSEPresentVoltageMultiplier = y["EVSEPresentVoltage.Multiplier"] strEVSEPresentVoltageMultiplier = y["EVSEPresentVoltage.Multiplier"]
u = combineValueAndMultiplier(strEVSEPresentVoltageValue, strEVSEPresentVoltageMultiplier) u = combineValueAndMultiplier(strEVSEPresentVoltageValue, strEVSEPresentVoltageMultiplier)
@ -582,6 +649,10 @@ class fsmPev():
strEVSEStatusCode = y["DC_EVSEStatus.EVSEStatusCode"] strEVSEStatusCode = y["DC_EVSEStatus.EVSEStatusCode"]
except: except:
self.addToTrace("ERROR: Could not decode the PreChargeResponse") self.addToTrace("ERROR: Could not decode the PreChargeResponse")
if (strResponseCode!="OK"):
self.addToTrace("Wrong response code. Aborting.")
self.enterState(stateUnrecoverableError)
return
if (self.isErrorEvseStatusCode(strEVSEStatusCode)): if (self.isErrorEvseStatusCode(strEVSEStatusCode)):
self.enterState(stateUnrecoverableError) self.enterState(stateUnrecoverableError)
return return
@ -627,6 +698,7 @@ class fsmPev():
strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("WeldingDetectionRes")>0): if (strConverterResult.find("WeldingDetectionRes")>0):
strResponseCode = "na"
# todo: add real welding detection here, run in welding detection loop until finished. # todo: add real welding detection here, run in welding detection loop until finished.
self.publishStatus("WldingDet done") self.publishStatus("WldingDet done")
self.addToTrace("Sending SessionStopReq") self.addToTrace("Sending SessionStopReq")
@ -645,9 +717,9 @@ class fsmPev():
strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN strConverterResult = self.exiDecode(exidata, "DD") # Decode DIN
self.addToTrace(strConverterResult) self.addToTrace(strConverterResult)
if (strConverterResult.find("SessionStopRes")>0): if (strConverterResult.find("SessionStopRes")>0):
strResponseCode = "na"
# req -508 # req -508
# Todo: close the TCP connection here. # Unlocking of the connector in the next state.
# Todo: Unlock the connector lock.
self.publishStatus("Stopped normally") self.publishStatus("Stopped normally")
self.addToTrace("Charging is finished") self.addToTrace("Charging is finished")
self.enterState(stateChargingFinished) self.enterState(stateChargingFinished)