|
@@ -1522,6 +1522,19 @@ int DB_Initial()
|
|
|
"variableCharacteristicsMinLimit real,"
|
|
|
"unique(componentName, componentInstance,variableName, variableInstance) on conflict replace);";
|
|
|
|
|
|
+ char *sqlVariableMonitoring = "create table if not exists ocpp20_variable_monitoring (idx integer primary key,"
|
|
|
+ "id integer ,"
|
|
|
+ "transaction text, "
|
|
|
+ "value text , "
|
|
|
+ "type text, "
|
|
|
+ "severity integer, "
|
|
|
+ "component_name text, "
|
|
|
+ "component_instance text,"
|
|
|
+ "component_evse_id integer, "
|
|
|
+ "component_evse_connectorId integer, "
|
|
|
+ "variable_name text, "
|
|
|
+ "variable_instance text);";
|
|
|
+
|
|
|
char *sqlBootType = "create table if not exists ocpp20_boot_type (idx integer primary key,"
|
|
|
"type text);";
|
|
|
|
|
@@ -1586,6 +1599,17 @@ int DB_Initial()
|
|
|
DEBUG_INFO( "Create OCPP 2.0 variable table successfully\n");
|
|
|
}
|
|
|
|
|
|
+ if (sqlite3_exec(db, sqlVariableMonitoring, 0, 0, &errMsg) != SQLITE_OK)
|
|
|
+ {
|
|
|
+ result = FAIL;
|
|
|
+ DEBUG_ERROR( "Create OCPP 2.0 variable monitoring table error message: %s\n", errMsg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO( "Create OCPP 2.0 variable monitoring table successfully\n");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
if (sqlite3_exec(db, sqlBootType, 0, 0, &errMsg) != SQLITE_OK)
|
|
|
{
|
|
|
result = FAIL;
|
|
@@ -1949,10 +1973,10 @@ int DB_updateSecurityEventType(SecurityEventEnumType reason)
|
|
|
int DB_variableClear()
|
|
|
{
|
|
|
int result = PASS;
|
|
|
- char * sqlcleanLocalList = "delete from ocpp20_variable";
|
|
|
+ char * sqlclearVariable = "delete from ocpp20_variable";
|
|
|
char *errMsg = 0;
|
|
|
|
|
|
- if (sqlite3_exec(db, sqlcleanLocalList, 0, 0, &errMsg) != SQLITE_OK)
|
|
|
+ if (sqlite3_exec(db, sqlclearVariable, 0, 0, &errMsg) != SQLITE_OK)
|
|
|
{
|
|
|
DEBUG_INFO("%s\n", errMsg);
|
|
|
result = FAIL;
|
|
@@ -3721,6 +3745,108 @@ void DB_variableLoadFromDb()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//==============================
|
|
|
+// Variable Monitoring
|
|
|
+//==============================
|
|
|
+int DB_variableMonitoringClear()
|
|
|
+{
|
|
|
+ int result = PASS;
|
|
|
+ char * sqlclearVariableMonitoring = "delete from ocpp20_variable_monitoring";
|
|
|
+ char *errMsg = 0;
|
|
|
+
|
|
|
+ if (sqlite3_exec(db, sqlclearVariableMonitoring, 0, 0, &errMsg) != SQLITE_OK)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("%s\n", errMsg);
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int DB_cbVariableMonitoringSaveToDb(void *para, int columnCount, char **columnValue, char **columnName)
|
|
|
+{
|
|
|
+ for(int i = 0; i<columnCount; i++)
|
|
|
+ {
|
|
|
+ // printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int DB_variableMonitoringSaveToDb(struct SetMonitoringDataType *variableMonitoring)
|
|
|
+{
|
|
|
+ int result = FAIL;
|
|
|
+
|
|
|
+ char sql[4096];
|
|
|
+ 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;",
|
|
|
+ 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
|
|
|
+ );
|
|
|
+
|
|
|
+ //* Execute SQL statement */
|
|
|
+ if(sqlite3_exec(db, sql, DB_cbVariableMonitoringSaveToDb, 0, &errMsg) != SQLITE_OK)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("SQL error: %s\n", errMsg);
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int DB_cbVariableMonitoringLoadFromDb(void *para, int columnCount, char **columnValue, char **columnName)
|
|
|
+{
|
|
|
+ for(int idx=0;idx<10;idx++)
|
|
|
+ {
|
|
|
+ if((strlen((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name) == 0) &&
|
|
|
+ (strlen((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name) == 0))
|
|
|
+ {
|
|
|
+ ShmOCPP20Data->MonitoringComponentVariable[idx].id = strlen(columnValue[1])>=0?atoi(columnValue[1]):-1;
|
|
|
+ ShmOCPP20Data->MonitoringComponentVariable[idx].transaction = strlen(columnValue[2])>=0?atoi(columnValue[2]):0;
|
|
|
+ ShmOCPP20Data->MonitoringComponentVariable[idx].value = strlen(columnValue[3])>=0?atof(columnValue[3]):0;
|
|
|
+ sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, "%s", columnValue[4]);
|
|
|
+ ShmOCPP20Data->MonitoringComponentVariable[idx].severity = strlen(columnValue[5])>0?atoi(columnValue[5]):9;
|
|
|
+ sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name, "%s", columnValue[6]);
|
|
|
+ sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.instance, "%s", columnValue[7]);
|
|
|
+ ShmOCPP20Data->MonitoringComponentVariable[idx].component.evse.id = strlen(columnValue[8])>0?atoi(columnValue[8]):-1;
|
|
|
+ ShmOCPP20Data->MonitoringComponentVariable[idx].component.evse.connectorId = strlen(columnValue[9])>0?atoi(columnValue[9]):-1;
|
|
|
+
|
|
|
+ sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name, "%s", columnValue[10]);
|
|
|
+ sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.instance, "%s", columnValue[11]);
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void DB_variableMonitoringLoadFromDb()
|
|
|
+{
|
|
|
+ char sql[512];
|
|
|
+ char* errMsg = NULL;
|
|
|
+
|
|
|
+ sprintf(sql,"select * from ocpp20_variable_monitoring order by idx;");
|
|
|
+
|
|
|
+ /* Execute SQL statement */
|
|
|
+ if(sqlite3_exec(db, sql, DB_cbVariableMonitoringLoadFromDb, 0, &errMsg) != SQLITE_OK )
|
|
|
+ {
|
|
|
+ DEBUG_INFO("SQL error: %s\n", errMsg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int DB_cbGetNetworkProfileFromDb(void *para, int columnCount, char **columnValue, char **columnName)
|
|
|
{
|
|
|
memset(&ShmOCPP20Data->NetworkConnectionProfile[0], 0x00, ARRAY_SIZE(ShmOCPP20Data->NetworkConnectionProfile));
|
|
@@ -15950,6 +16076,9 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
|
|
|
{
|
|
|
mtrace();
|
|
|
int result = FAIL;
|
|
|
+ uint8_t cntCriteria = 0;
|
|
|
+ int cntComponentVariable = 0;
|
|
|
+ uint8_t cntFoundMonitoringVariable = 0;
|
|
|
json_object *GetMonitoringReport;
|
|
|
|
|
|
DEBUG_INFO("handleGetMonitoringReportRequest...\n");
|
|
@@ -15967,14 +16096,19 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
|
|
|
// Optional data
|
|
|
if(json_object_object_get(GetMonitoringReport, "monitoringCriteria") != NULL)
|
|
|
{
|
|
|
- sprintf((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria, "%s", json_object_get_string(json_object_object_get(GetMonitoringReport, "monitoringCriteria")));
|
|
|
+ cntCriteria = json_object_array_length(json_object_object_get(GetMonitoringReport, "monitoringCriteria"));
|
|
|
+ for(int idx=0; idx<cntCriteria; idx++)
|
|
|
+ {
|
|
|
+ sprintf((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx], "%s", json_object_get_string(json_object_object_get(GetMonitoringReport, "monitoringCriteria")));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if(json_object_object_get(GetMonitoringReport, "componentVariable") != NULL)
|
|
|
{
|
|
|
- if(json_object_array_length(json_object_object_get(GetMonitoringReport, "componentVariable")) <= ARRAY_SIZE(ShmOCPP20Data->GetMonitoringReport.componentVariable))
|
|
|
+ cntComponentVariable = json_object_array_length(json_object_object_get(GetMonitoringReport, "componentVariable"));
|
|
|
+ if(cntComponentVariable <= ARRAY_SIZE(ShmOCPP20Data->GetMonitoringReport.componentVariable))
|
|
|
{
|
|
|
- for(int idx=0;idx<json_object_array_length(json_object_object_get(GetMonitoringReport, "componentVariable"));idx++)
|
|
|
+ for(int idx=0;idx<cntComponentVariable;idx++)
|
|
|
{
|
|
|
if(json_object_object_get(json_object_array_get_idx(json_object_object_get(GetMonitoringReport, "componentVariable"), idx), "component") != NULL)
|
|
|
{
|
|
@@ -16020,6 +16154,85 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
|
|
|
}
|
|
|
json_object_put(GetMonitoringReport);
|
|
|
|
|
|
+ strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_NotSupported]);
|
|
|
+
|
|
|
+ if(cntComponentVariable>0)
|
|
|
+ {
|
|
|
+ uint8_t cntTypeSupport = 0;
|
|
|
+ for(int idx_cv=0; idx_cv < cntComponentVariable; idx_cv++)
|
|
|
+ {
|
|
|
+ for(int idx=0; idx < 10; idx++)
|
|
|
+ {
|
|
|
+ if((strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name, (char*)ShmOCPP20Data->GetMonitoringReport.componentVariable[idx_cv].component.name)==0) &&
|
|
|
+ (strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name, (char*)ShmOCPP20Data->GetMonitoringReport.componentVariable[idx_cv].variable.name)==0))
|
|
|
+ {
|
|
|
+ cntTypeSupport = 0;
|
|
|
+ if(strlen((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[0]) > 0)
|
|
|
+ {
|
|
|
+ for(int idx_cri=0; idx_cri<cntCriteria; idx_cri++)
|
|
|
+ {
|
|
|
+ if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring]) == 0)
|
|
|
+ {
|
|
|
+ if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring])==0)
|
|
|
+ {
|
|
|
+ memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
|
|
|
+ memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
|
|
|
+
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
|
|
|
+ strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
|
|
|
+
|
|
|
+ cntTypeSupport++;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring]) == 0)
|
|
|
+ {
|
|
|
+ if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring])==0)
|
|
|
+ {
|
|
|
+ memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
|
|
|
+ memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
|
|
|
+
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
|
|
|
+ strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
|
|
|
+
|
|
|
+ cntTypeSupport++;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring]) == 0)
|
|
|
+ {
|
|
|
+ if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring])==0)
|
|
|
+ {
|
|
|
+ memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
|
|
|
+ memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
|
|
|
+
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
|
|
|
+ strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
|
|
|
+ ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
|
|
|
+
|
|
|
+ cntTypeSupport++;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ cntFoundMonitoringVariable++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
* TODO:
|
|
|
* 1. Response result
|
|
@@ -20934,6 +21147,7 @@ int initialConfigurationTable(void)
|
|
|
}
|
|
|
|
|
|
DB_getNetworkProfileFromDb();
|
|
|
+ //DB_variableMonitoringLoadFromDb();
|
|
|
|
|
|
return 0;
|
|
|
}
|