@@ -255,7 +255,19 @@ void DeviceModelLoader::loadDeviceModel(const rapidjson::Document& device_model_
255255 }
256256
257257 // Add to list of variables
258- component.variables [var.name ] = std::move (var);
258+ const Variable& cvar = var;
259+ auto iter_var = component.variables .find (var.name );
260+ if (iter_var != component.variables .end ())
261+ {
262+
263+ iter_var->second [cvar.instance .value ()] = std::move (var);
264+ }
265+ else
266+ {
267+ std::map<std::string, Variable> vars;
268+ vars[cvar.instance .value ()] = std::move (var);
269+ component.variables [vars.begin ()->second .name ] = std::move (vars);
270+ }
259271 }
260272
261273 // Add to list of components
@@ -281,120 +293,124 @@ void DeviceModelLoader::saveDeviceModel(rapidjson::Document& device_model_doc)
281293
282294 // For each variable
283295 rapidjson::Value variables_json (rapidjson::kArrayType );
284- for (const auto & [_, var ] : component.variables )
296+ for (const auto & [_, vars ] : component.variables )
285297 {
286- rapidjson::Value var_json (rapidjson::kObjectType );
287-
288- // Name
289- var_json.AddMember (rapidjson::StringRef (" name" ), rapidjson::Value (var.name .c_str (), allocator).Move (), allocator);
290-
291- // EVSE id
292- if (var.evse .isSet ())
293- {
294- var_json.AddMember (rapidjson::StringRef (" evse" ), rapidjson::Value (var.evse .value ()).Move (), allocator);
295- }
296-
297- // Connector id
298- if (var.connector .isSet ())
298+ for (const auto & [_, var] : vars)
299299 {
300- var_json.AddMember (rapidjson::StringRef (" connector" ), rapidjson::Value (var.connector .value ()).Move (), allocator);
301- }
300+ rapidjson::Value var_json (rapidjson::kObjectType );
302301
303- // Instance
304- if (var.instance .isSet ())
305- {
306- var_json.AddMember (
307- rapidjson::StringRef (" instance" ), rapidjson::Value (var.instance .value ().c_str (), allocator).Move (), allocator);
308- }
309-
310- // Attributes
311- {
312- rapidjson::Value var_attributes_json (rapidjson::kObjectType );
313-
314- // Type
315- if (var.attributes .type .isSet ())
316- {
317- var_attributes_json.AddMember (
318- rapidjson::StringRef (" type" ),
319- rapidjson::Value (AttributeEnumTypeHelper.toString (var.attributes .type .value ()).c_str (), allocator).Move (),
320- allocator);
321- }
302+ // Name
303+ var_json.AddMember (rapidjson::StringRef (" name" ), rapidjson::Value (var.name .c_str (), allocator).Move (), allocator);
322304
323- // Mutability
324- if (var.attributes . mutability .isSet ())
305+ // EVSE id
306+ if (var.evse .isSet ())
325307 {
326- var_attributes_json.AddMember (
327- rapidjson::StringRef (" mutability" ),
328- rapidjson::Value (MutabilityEnumTypeHelper.toString (var.attributes .mutability .value ()).c_str (), allocator).Move (),
329- allocator);
308+ var_json.AddMember (rapidjson::StringRef (" evse" ), rapidjson::Value (var.evse .value ()).Move (), allocator);
330309 }
331310
332- // Persistent flag
333- if (var.attributes . persistent .isSet ())
311+ // Connector id
312+ if (var.connector .isSet ())
334313 {
335- var_attributes_json.AddMember (
336- rapidjson::StringRef (" persistent" ), rapidjson::Value (var.attributes .persistent .value ()).Move (), allocator);
314+ var_json.AddMember (rapidjson::StringRef (" connector" ), rapidjson::Value (var.connector .value ()).Move (), allocator);
337315 }
338316
339- // Constant flag
340- if (var.attributes . constant .isSet ())
317+ // Instance
318+ if (var.instance .isSet ())
341319 {
342- var_attributes_json .AddMember (
343- rapidjson::StringRef (" constant " ), rapidjson::Value (var.attributes . constant . value ()).Move (), allocator);
320+ var_json .AddMember (
321+ rapidjson::StringRef (" instance " ), rapidjson::Value (var.instance . value (). c_str (), allocator ).Move (), allocator);
344322 }
345323
346- var_json.AddMember (rapidjson::StringRef (" attributes" ), var_attributes_json.Move (), allocator);
347- }
348-
349- // Characteristics
350- {
351- rapidjson::Value var_chars_json (rapidjson::kObjectType );
352-
353- // Data type
354- var_chars_json.AddMember (
355- rapidjson::StringRef (" data_type" ),
356- rapidjson::Value (DataEnumTypeHelper.toString (var.characteristics .dataType ).c_str (), allocator).Move (),
357- allocator);
358-
359- // Unit
360- if (var.characteristics .unit .isSet ())
324+ // Attributes
361325 {
362- var_chars_json.AddMember (rapidjson::StringRef (" unit" ),
363- rapidjson::Value (var.characteristics .unit .value ().c_str (), allocator).Move (),
364- allocator);
326+ rapidjson::Value var_attributes_json (rapidjson::kObjectType );
327+
328+ // Type
329+ if (var.attributes .type .isSet ())
330+ {
331+ var_attributes_json.AddMember (
332+ rapidjson::StringRef (" type" ),
333+ rapidjson::Value (AttributeEnumTypeHelper.toString (var.attributes .type .value ()).c_str (), allocator).Move (),
334+ allocator);
335+ }
336+
337+ // Mutability
338+ if (var.attributes .mutability .isSet ())
339+ {
340+ var_attributes_json.AddMember (
341+ rapidjson::StringRef (" mutability" ),
342+ rapidjson::Value (MutabilityEnumTypeHelper.toString (var.attributes .mutability .value ()).c_str (), allocator)
343+ .Move (),
344+ allocator);
345+ }
346+
347+ // Persistent flag
348+ if (var.attributes .persistent .isSet ())
349+ {
350+ var_attributes_json.AddMember (
351+ rapidjson::StringRef (" persistent" ), rapidjson::Value (var.attributes .persistent .value ()).Move (), allocator);
352+ }
353+
354+ // Constant flag
355+ if (var.attributes .constant .isSet ())
356+ {
357+ var_attributes_json.AddMember (
358+ rapidjson::StringRef (" constant" ), rapidjson::Value (var.attributes .constant .value ()).Move (), allocator);
359+ }
360+
361+ var_json.AddMember (rapidjson::StringRef (" attributes" ), var_attributes_json.Move (), allocator);
365362 }
366363
367- // Min limit
368- if (var.characteristics .minLimit .isSet ())
364+ // Characteristics
369365 {
370- var_chars_json.AddMember (
371- rapidjson::StringRef (" min_limit" ), rapidjson::Value (var.characteristics .minLimit .value ()).Move (), allocator);
372- }
366+ rapidjson::Value var_chars_json (rapidjson::kObjectType );
373367
374- // Max limit
375- if (var.characteristics .maxLimit .isSet ())
376- {
368+ // Data type
377369 var_chars_json.AddMember (
378- rapidjson::StringRef (" max_limit" ), rapidjson::Value (var.characteristics .maxLimit .value ()).Move (), allocator);
379- }
370+ rapidjson::StringRef (" data_type" ),
371+ rapidjson::Value (DataEnumTypeHelper.toString (var.characteristics .dataType ).c_str (), allocator).Move (),
372+ allocator);
380373
381- // Values list
382- if (var.characteristics .valuesList .isSet ())
383- {
384- var_chars_json.AddMember (rapidjson::StringRef (" values_list" ),
385- rapidjson::Value (var.characteristics .valuesList .value ().c_str (), allocator).Move (),
374+ // Unit
375+ if (var.characteristics .unit .isSet ())
376+ {
377+ var_chars_json.AddMember (rapidjson::StringRef (" unit" ),
378+ rapidjson::Value (var.characteristics .unit .value ().c_str (), allocator).Move (),
379+ allocator);
380+ }
381+
382+ // Min limit
383+ if (var.characteristics .minLimit .isSet ())
384+ {
385+ var_chars_json.AddMember (
386+ rapidjson::StringRef (" min_limit" ), rapidjson::Value (var.characteristics .minLimit .value ()).Move (), allocator);
387+ }
388+
389+ // Max limit
390+ if (var.characteristics .maxLimit .isSet ())
391+ {
392+ var_chars_json.AddMember (
393+ rapidjson::StringRef (" max_limit" ), rapidjson::Value (var.characteristics .maxLimit .value ()).Move (), allocator);
394+ }
395+
396+ // Values list
397+ if (var.characteristics .valuesList .isSet ())
398+ {
399+ var_chars_json.AddMember (rapidjson::StringRef (" values_list" ),
400+ rapidjson::Value (var.characteristics .valuesList .value ().c_str (), allocator).Move (),
401+ allocator);
402+ }
403+
404+ // Supports monitoring flag
405+ var_chars_json.AddMember (rapidjson::StringRef (" supports_monitoring" ),
406+ rapidjson::Value (var.characteristics .supportsMonitoring ).Move (),
386407 allocator);
387- }
388408
389- // Supports monitoring flag
390- var_chars_json.AddMember (rapidjson::StringRef (" supports_monitoring" ),
391- rapidjson::Value (var.characteristics .supportsMonitoring ).Move (),
392- allocator);
409+ var_json.AddMember (rapidjson::StringRef (" characteristics" ), var_chars_json.Move (), allocator);
410+ }
393411
394- var_json. AddMember ( rapidjson::StringRef ( " characteristics " ), var_chars_json .Move (), allocator);
412+ variables_json. PushBack (var_json .Move (), allocator);
395413 }
396-
397- variables_json.PushBack (var_json.Move (), allocator);
398414 }
399415 component_json.AddMember (rapidjson::StringRef (" variables" ), variables_json.Move (), allocator);
400416
0 commit comments