Bläddra i källkod

2023-02-09/ Jerry Wang
[OCPP 2.0.1][OCPP 1.6]

Action:
1. Build up VariableMonitoring related functions.
2. Add judgement logic for 'DL' and 'DZ' series.

File:
1. EVSE/Modularization/ocpp20/MessageHandler.c
--> Action 1,2
2. EVSE/Modularization/ocppfiles/MessageHandler.c
--> Action 2
3. EVSE/Projects/define.h
--> Action 1

Jerry Wang 2 år sedan
förälder
incheckning
2ad0880d57

+ 208 - 40
EVSE/Modularization/ocpp20/MessageHandler.c

@@ -3748,6 +3748,30 @@ void DB_variableLoadFromDb()
 //==============================
 // Variable Monitoring
 //==============================
+int variableMonitoringQuantity()
+{
+	uint32_t result = 0;
+	char sqlCmd[8192];
+	char zErrMsg[200];
+	int rows, cols;
+	char **resultData;
+
+	sprintf(sqlCmd, "select count(idx) as dataQuantity from ocpp20_variable_monitoring");
+	if( sqlite3_get_table(db, sqlCmd, &resultData, &rows, &cols, (char **)&zErrMsg) != SQLITE_OK)
+	{
+		DEBUG_WARN("SQL error: %s\n", zErrMsg);
+	}
+	else
+	{
+		if(rows >= 1)
+		{
+			result = atoi(resultData[1]);
+		}
+	}
+
+	return result;
+}
+
 int DB_variableMonitoringClear()
 {
 	int result = PASS;
@@ -3763,6 +3787,37 @@ int DB_variableMonitoringClear()
 	return result;
 }
 
+int VariableMonitoringReplace(uint8_t idx, struct SetMonitoringDataType *variableMonitoring)
+{
+	int result = PASS;
+	char sql[1024];
+	char *errMsg = 0;
+
+	sprintf(sql,"replace into ocpp20_variable_monitoring "
+				"(idx, id, txn, value, type, severity, component_name, component_instance, component_evse_id, component_evse_connectorId, variable_name, variable_instance) "
+				"VALUES('%d', '%d', '%d', '%.2f', '%s', '%d', '%s', '%s', '%d', '%d', '%s', '%s');  SELECT * from ocpp20_variable_monitoring;",
+				idx,
+				variableMonitoring->id,
+				variableMonitoring->transaction,
+				variableMonitoring->value,
+				variableMonitoring->type,
+				variableMonitoring->severity,
+				variableMonitoring->component.name,
+				variableMonitoring->component.instance,
+				variableMonitoring->component.evse.id,
+				variableMonitoring->component.evse.connectorId,
+				variableMonitoring->variable.name,
+				variableMonitoring->variable.instance
+				);
+	if (sqlite3_exec(db, sql, 0, 0, &errMsg) != SQLITE_OK)
+	{
+		result = FAIL;
+		DEBUG_WARN( "Insert meter value record error message: %s\n", errMsg);
+	}
+
+	return result;
+}
+
 int DB_cbVariableMonitoringSaveToDb(void *para, int columnCount, char **columnValue, char **columnName)
 {
    for(int i = 0; i<columnCount; i++)
@@ -3777,12 +3832,12 @@ int DB_variableMonitoringSaveToDb(struct SetMonitoringDataType *variableMonitori
 {
 	int result = FAIL;
 
-	char sql[4096];
+	char sql[1024];
 	char* errMsg = NULL;
 
 	sprintf(sql,"insert or replace into ocpp20_variable_monitoring "
-			"(id, transaction, value, type, severity, component_name, component_instance, component_evse_id, component_evse_connectorId, variable_name, variable_instance) "
-			"VALUES('%d', '%d', '%.2f', '%s', '%d', '%s', %s, '%d', '%d', '%s', '%s');  SELECT * from ocpp20_variable_monitoring;",
+			"(id, txn, value, type, severity, component_name, component_instance, component_evse_id, component_evse_connectorId, variable_name, variable_instance) "
+			"VALUES('%d', '%d', '%.2f', '%s', '%d', '%s', '%s', '%d', '%d', '%s', '%s');  SELECT * from ocpp20_variable_monitoring;",
 			variableMonitoring->id,
 			variableMonitoring->transaction,
 			variableMonitoring->value,
@@ -7399,7 +7454,9 @@ int ProcessShareMemory()
 	 	if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') &&
 	 	   ((ShmSysConfigAndInfo->SysConfig.ModelName[1]=='B') ||
 		    (ShmSysConfigAndInfo->SysConfig.ModelName[1]=='K') ||
-			(ShmSysConfigAndInfo->SysConfig.ModelName[1]=='O'))
+			(ShmSysConfigAndInfo->SysConfig.ModelName[1]=='O') ||
+			(ShmSysConfigAndInfo->SysConfig.ModelName[1]=='L') ||
+			(ShmSysConfigAndInfo->SysConfig.ModelName[1]=='Z'))
 		   ) // 'D' means DC
 		{
 			// DO series
@@ -14380,31 +14437,59 @@ int handleClearVariableMonitoringRequest(char *uuid, char *payload)
 {
 	mtrace();
 	int result = FAIL;
-	json_object *ClearVariableMonitorin;
+	int isSpecificIdfound = FALSE;
+	char sqlCmd[128];
+	char *errMsg = 0;
+	json_object *ClearVariableMonitoring;
 
 	DEBUG_INFO("handleClearVariableMonitoringRequest...\n");
-	ClearVariableMonitorin = json_tokener_parse(payload);
-	if(!is_error(ClearVariableMonitorin))
+	ClearVariableMonitoring = json_tokener_parse(payload);
+	if(!is_error(ClearVariableMonitoring))
 	{
 		// Required data
-		if(json_object_array_length(json_object_object_get(ClearVariableMonitorin, "id")) <= ARRAY_SIZE(ShmOCPP20Data->ClearVariableMonitoring.id))
+		if(json_object_array_length(json_object_object_get(ClearVariableMonitoring, "id")) <= ARRAY_SIZE(ShmOCPP20Data->ClearVariableMonitoring.id))
 		{
-			for(int idx=0;idx<json_object_array_length(json_object_object_get(ClearVariableMonitorin, "id"));idx++)
+			for(int idx=0;idx<json_object_array_length(json_object_object_get(ClearVariableMonitoring, "id"));idx++)
 			{
-				ShmOCPP20Data->ClearVariableMonitoring.id[idx] = json_object_get_int(json_object_array_get_idx(json_object_object_get(ClearVariableMonitorin, "id"), idx));
-
-				/*
-				 * TODO:
-				 * 	1. Check response
-				 */
+				ShmOCPP20Data->ClearVariableMonitoring.id[idx] = json_object_get_int(json_object_array_get_idx(json_object_object_get(ClearVariableMonitoring, "id"), idx));
 				ShmOCPP20Data->ClearVariableMonitoring.Response_clearMonitoringResult[idx].id = ShmOCPP20Data->ClearVariableMonitoring.id[idx];
-				strcpy((char*)ShmOCPP20Data->ClearVariableMonitoring.Response_clearMonitoringResult[idx].status, ClearMonitoringStatusEnumTypeStr[ClearMonitoringStatusEnumType_Accepted]);
+
+				isSpecificIdfound = FALSE;
+
+				for(uint8_t idx_vm=0;idx_vm<10;idx_vm++)
+				{
+					if(ShmOCPP20Data->MonitoringComponentVariable[idx_vm].id == ShmOCPP20Data->ClearVariableMonitoring.id[idx])
+					{
+						isSpecificIdfound = TRUE;
+						sprintf(sqlCmd, "delete from ocpp20_variable_monitoring where id=%d", ShmOCPP20Data->ClearVariableMonitoring.id[idx]);
+						if (sqlite3_exec(db, sqlCmd, 0, 0, &errMsg) != SQLITE_OK)
+						{
+							DEBUG_INFO("SQL error: %s\n",errMsg);
+						}
+					}
+				}
+
+				if(isSpecificIdfound == TRUE)
+				{
+					strcpy((char*)ShmOCPP20Data->ClearVariableMonitoring.Response_clearMonitoringResult[idx].status, ClearMonitoringStatusEnumTypeStr[ClearMonitoringStatusEnumType_Accepted]);
+				}
+				else
+				{
+					strcpy((char*)ShmOCPP20Data->ClearVariableMonitoring.Response_clearMonitoringResult[idx].status, ClearMonitoringStatusEnumTypeStr[ClearMonitoringStatusEnumType_NotFound]);
+				}
 			}
 
-			sendClearVariableMonitoringConfirmation(uuid, json_object_array_length(json_object_object_get(ClearVariableMonitorin, "id")));
+			system("/bin/fsync -d /dev/mtdblock13;/bin/sync &");
+			for(uint8_t idx_vm=0;idx_vm<10;idx_vm++)
+			{
+				memset(&ShmOCPP20Data->MonitoringComponentVariable, 0x00, sizeof(struct SetMonitoringDataType));
+			}
+			DB_variableMonitoringLoadFromDb();
+
+			sendClearVariableMonitoringConfirmation(uuid, json_object_array_length(json_object_object_get(ClearVariableMonitoring, "id")));
 		}
 	}
-	json_object_put(ClearVariableMonitorin);
+	json_object_put(ClearVariableMonitoring);
 
 	return result;
 }
@@ -14532,7 +14617,7 @@ void createFirmwareVersionByDataTransfer(void)
 			json_object_object_add(FirmwareDataTransfer, "Connector2FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
 		}
 
-		if((ShmSysConfigAndInfo->SysConfig.ModelName[1]!='B') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='K') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='O'))
+		if((ShmSysConfigAndInfo->SysConfig.ModelName[1]!='B') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='K') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='O') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='L') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='Z'))
 		{
 			// DS DM DW
 			json_object_object_add(FirmwareDataTransfer, "FanModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.FanModuleFwRev));
@@ -16136,7 +16221,7 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 						{
 							if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring]) == 0)
 							{
-								if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring])==0)
+								if(strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, "Threshold") != NULL)
 								{
 									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
 									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
@@ -16154,7 +16239,7 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 							}
 							else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring]) == 0)
 							{
-								if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring])==0)
+								if(strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, "Delta") != NULL)
 								{
 									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
 									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
@@ -16172,7 +16257,7 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 							}
 							else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring]) == 0)
 							{
-								if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring])==0)
+								if(strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, "Periodic") != NULL)
 								{
 									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
 									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
@@ -16223,7 +16308,7 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 					{
 						if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring]) == 0)
 						{
-							if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring])==0)
+							if(strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, "Threshold") != NULL)
 							{
 								for(int idx_cv=0; idx_cv < 10; idx_cv++)
 								{
@@ -16269,7 +16354,7 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 						}
 						else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring]) == 0)
 						{
-							if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring])==0)
+							if(strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, "Delta") != NULL)
 							{
 								for(int idx_cv=0; idx_cv < 10; idx_cv++)
 								{
@@ -16315,7 +16400,7 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 						}
 						else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring]) == 0)
 						{
-							if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring])==0)
+							if(strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, "Periodic") != NULL)
 							{
 								for(int idx_cv=0; idx_cv < 10; idx_cv++)
 								{
@@ -19218,21 +19303,37 @@ int handleSetMonitoringBaseRequest(char *uuid, char *payload)
 
 	DEBUG_INFO("handleSetMonitoringBaseRequest...\n");
 	SetMonitoringBase = json_tokener_parse(payload);
+	strcpy((char*)ShmOCPP20Data->SetMonitoringBase.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
 	if(!is_error(SetMonitoringBase))
 	{
 		memset(&ShmOCPP20Data->SetMonitoringBase, 0, sizeof(struct SetMonitoringBase_20));
 		memcpy(&ShmOCPP20Data->SetMonitoringBase.guid, uuid, ARRAY_SIZE(ShmOCPP20Data->SetMonitoringBase.guid));
 		// Required data
 		if(json_object_object_get(SetMonitoringBase, "monitoringBase") != NULL)
+		{
 			sprintf((char*)ShmOCPP20Data->SetMonitoringBase.monitoringBase, "%s",json_object_get_string(json_object_object_get(SetMonitoringBase, "monitoringBase")));
+			sprintf((char*)ShmOCPP20Data->MonitoringBase, "%s", (char*)ShmOCPP20Data->SetMonitoringBase.monitoringBase);
+
+			FILE *outfile;
+			outfile = fopen("/Storage/OCPP/MonitorSetting" , "w+");
+			if(outfile == NULL)
+			{
+				DEBUG_INFO("Error opening file");
+				strcpy((char*)ShmOCPP20Data->SetMonitoringLevel.Response_status, GenericStatusEnumTypeStr[GenericStatusEnumType_Rejected]);
+			}
+
+			fprintf(outfile,"{\"severity\":\"%d\",\"monitoringBase\":\"%s\"}\n", ShmOCPP20Data->MonitoringLevel, (char*)ShmOCPP20Data->MonitoringBase);
+			fclose(outfile);
+
+			system("/bin/fsync -d /dev/mtdblock13;/bin/sync &");
+		}
+		else
+			strcpy((char*)ShmOCPP20Data->SetMonitoringBase.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Rejected]);
 	}
 	json_object_put(SetMonitoringBase);
 
-	/*
-	 * TODO:
-	 * 	1. Configure monitor base and response
-	 */
-	strcpy((char*)ShmOCPP20Data->SetMonitoringBase.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
+
+
 	sendSetMonitoringBaseConfirmation(uuid);
 	return result;
 }
@@ -19245,21 +19346,35 @@ int handleSetMonitoringLevelRequest(char *uuid, char *payload)
 
 	DEBUG_INFO("handleSetMonitoringLevelRequest...\n");
 	SetMonitoringLevel = json_tokener_parse(payload);
+	strcpy((char*)ShmOCPP20Data->SetMonitoringLevel.Response_status, GenericStatusEnumTypeStr[GenericStatusEnumType_Accepted]);
 	if(!is_error(SetMonitoringLevel))
 	{
 		memset(&ShmOCPP20Data->SetMonitoringLevel, 0, sizeof(struct SetMonitoringLevel_20));
 		memcpy(&ShmOCPP20Data->SetMonitoringLevel.guid, uuid, ARRAY_SIZE(ShmOCPP20Data->SetMonitoringLevel.guid));
 		// Required data
 		if(json_object_object_get(SetMonitoringLevel, "severity") != NULL)
+		{
 			ShmOCPP20Data->SetMonitoringLevel.severity = json_object_get_int(json_object_object_get(SetMonitoringLevel, "severity"));
+			ShmOCPP20Data->MonitoringLevel = ShmOCPP20Data->SetMonitoringLevel.severity;
+
+			FILE *outfile;
+			outfile = fopen("/Storage/OCPP/MonitorSetting" , "w+");
+			if(outfile == NULL)
+			{
+				DEBUG_INFO("Error opening file");
+				strcpy((char*)ShmOCPP20Data->SetMonitoringLevel.Response_status, GenericStatusEnumTypeStr[GenericStatusEnumType_Rejected]);
+			}
+
+			fprintf(outfile,"{\"severity\":\"%d\",\"monitoringBase\":\"%s\"}\n", ShmOCPP20Data->MonitoringLevel, (char*)ShmOCPP20Data->MonitoringBase);
+			fclose(outfile);
+
+			system("/bin/fsync -d /dev/mtdblock13;/bin/sync &");
+		}
+		else
+			strcpy((char*)ShmOCPP20Data->SetMonitoringLevel.Response_status, GenericStatusEnumTypeStr[GenericStatusEnumType_Rejected]);
 	}
 	json_object_put(SetMonitoringLevel);
 
-	/*
-	 * TODO:
-	 * 	Configure monitor status and response
-	 */
-	strcpy((char*)ShmOCPP20Data->SetMonitoringLevel.Response_status, GenericStatusEnumTypeStr[GenericStatusEnumType_Accepted]);
 	sendSetMonitoringLevelConfirmation(uuid);
 
 	return result;
@@ -19552,6 +19667,7 @@ int handleSetVariableMonitoringRequest(char *uuid, char *payload)
 		for(int idx=0;idx<json_object_array_length(json_object_object_get(SetVariableMonitoring, "setMonitoringData"));idx++)
 		{
 			variableQuantity++;
+
 			if(json_object_object_get(json_object_array_get_idx(json_object_object_get(SetVariableMonitoring, "setMonitoringData"), idx), "id") != NULL)
 			{
 				ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx].id = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(SetVariableMonitoring, "setMonitoringData"), idx), "id"));
@@ -19628,11 +19744,51 @@ int handleSetVariableMonitoringRequest(char *uuid, char *payload)
 				memcpy(&ShmOCPP20Data->SetVariableMonitoring.Response_setMonitoringResult[idx].variable , &ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx].variable, sizeof(struct VariableType));
 			}
 
-			/*
-			 * TODO
-			 * Set Variables and save to DB
-			 */
-			strcpy((char*)ShmOCPP20Data->SetVariableMonitoring.Response_setMonitoringResult[idx].status, SetMonitoringStatusEnumTypeStr[SetMonitoringStatusEnumType_Accepted]);
+			uint8_t isDuplicate = FALSE;
+			for(uint8_t idx_vm=0;idx_vm<10;idx_vm++)
+			{
+				if((strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx_vm].component.name, (char*)ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx].component.name) != NULL) &&
+				   (strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx_vm].variable.name, (char*)ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx].variable.name) != NULL) &&
+				   (strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx_vm].type, (char*)ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx].type) != NULL) &&
+				   (ShmOCPP20Data->MonitoringComponentVariable[idx_vm].severity == ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx].severity))
+				{
+					isDuplicate = TRUE;
+					if(json_object_object_get(json_object_array_get_idx(json_object_object_get(SetVariableMonitoring, "setMonitoringData"), idx), "id") != NULL)
+					{
+						if(ShmOCPP20Data->MonitoringComponentVariable[idx_vm].id == ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx].id)
+						{
+							VariableMonitoringReplace((idx_vm+1), &ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx]);
+							strcpy((char*)ShmOCPP20Data->SetVariableMonitoring.Response_setMonitoringResult[idx].status, SetMonitoringStatusEnumTypeStr[SetMonitoringStatusEnumType_Accepted]);
+						}
+						else
+						{
+							strcpy((char*)ShmOCPP20Data->SetVariableMonitoring.Response_setMonitoringResult[idx].status, SetMonitoringStatusEnumTypeStr[SetMonitoringStatusEnumType_Duplicate]);
+						}
+					}
+					else
+					{
+						strcpy((char*)ShmOCPP20Data->SetVariableMonitoring.Response_setMonitoringResult[idx].status, SetMonitoringStatusEnumTypeStr[SetMonitoringStatusEnumType_Duplicate]);
+					}
+					break;
+				}
+				else
+				{
+					// Do nothing
+				}
+			}
+
+			if(isDuplicate == FALSE)
+			{
+				if(variableMonitoringQuantity() >= 10)
+				{
+					strcpy((char*)ShmOCPP20Data->SetVariableMonitoring.Response_setMonitoringResult[idx].status, SetMonitoringStatusEnumTypeStr[SetMonitoringStatusEnumType_Rejected]);
+				}
+				else
+				{
+					DB_variableMonitoringSaveToDb(&ShmOCPP20Data->SetVariableMonitoring.setMonitoringData[idx]);
+					strcpy((char*)ShmOCPP20Data->SetVariableMonitoring.Response_setMonitoringResult[idx].status, SetMonitoringStatusEnumTypeStr[SetMonitoringStatusEnumType_Accepted]);
+				}
+			}
 		}
 	}
 	json_object_put(SetVariableMonitoring);
@@ -21324,6 +21480,18 @@ int initialConfigurationTable(void)
 	DB_getNetworkProfileFromDb();
 	DB_variableMonitoringLoadFromDb();
 
+	for(uint8_t idx_vm=0;idx_vm<10;idx_vm++)
+	{
+		DEBUG_INFO("---------------------------------------------------------------------------------\n");
+		DEBUG_INFO("MonitoringComponentVariable[%d].id = %d\n", idx_vm, ShmOCPP20Data->MonitoringComponentVariable[idx_vm].id);
+		DEBUG_INFO("MonitoringComponentVariable[%d].value = %.2f\n", idx_vm, ShmOCPP20Data->MonitoringComponentVariable[idx_vm].value);
+		DEBUG_INFO("MonitoringComponentVariable[%d].type = %s\n", idx_vm, ShmOCPP20Data->MonitoringComponentVariable[idx_vm].type);
+		DEBUG_INFO("MonitoringComponentVariable[%d].severity = %d\n", idx_vm, ShmOCPP20Data->MonitoringComponentVariable[idx_vm].severity);
+		DEBUG_INFO("MonitoringComponentVariable[%d].component.name = %s\n", idx_vm, ShmOCPP20Data->MonitoringComponentVariable[idx_vm].component.name);
+		DEBUG_INFO("MonitoringComponentVariable[%d].variable.name = %s\n", idx_vm, ShmOCPP20Data->MonitoringComponentVariable[idx_vm].variable.name);
+		DEBUG_INFO("---------------------------------------------------------------------------------\n");
+	}
+
 	return 0;
 }
 

+ 3 - 2
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -4980,7 +4980,8 @@ int ProcessShareMemory()
 	 	   ((ShmSysConfigAndInfo->SysConfig.ModelName[1]=='B') ||
 		    (ShmSysConfigAndInfo->SysConfig.ModelName[1]=='K') ||
 			(ShmSysConfigAndInfo->SysConfig.ModelName[1]=='O') ||
-			(ShmSysConfigAndInfo->SysConfig.ModelName[1]=='L'))
+			(ShmSysConfigAndInfo->SysConfig.ModelName[1]=='L') ||
+			(ShmSysConfigAndInfo->SysConfig.ModelName[1]=='Z'))
 		   ) // 'D' means DC
 		{
 			// DO series
@@ -10960,7 +10961,7 @@ void createFirmwareVersionByDataTransfer(void)
 			json_object_object_add(FirmwareDataTransfer, "Connector2FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
 		}
 
-		if((ShmSysConfigAndInfo->SysConfig.ModelName[1]!='B') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='K') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='O'))
+		if((ShmSysConfigAndInfo->SysConfig.ModelName[1]!='B') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='K') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='O') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='L') && (ShmSysConfigAndInfo->SysConfig.ModelName[1]!='Z'))
 		{
 			// DS DM DW
 			json_object_object_add(FirmwareDataTransfer, "FanModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.FanModuleFwRev));

BIN
EVSE/Projects/AW-Regular/Images/root/Module_FactoryConfig


BIN
EVSE/Projects/AW-Regular/Images/root/Module_InternalComm


+ 2 - 0
EVSE/Projects/define.h

@@ -6376,6 +6376,8 @@ struct OCPP20Data
 	struct ReportDataType                   ControllerComponentVariable[CtrlrVariable_CNT];
 	struct SetMonitoringDataType            MonitoringComponentVariable[10];
 	struct NetworkConnectionProfile_20      NetworkConnectionProfile[10];
+	unsigned int                            MonitoringLevel;
+	unsigned char                           MonitoringBase[20];
 
 	union
 	{