From dde49cc598def3f179c8db0ec15d4281cb0af3aa Mon Sep 17 00:00:00 2001 From: Jay Johnson <133936386+dersecure@users.noreply.github.com> Date: Thu, 14 Nov 2024 23:14:40 -0700 Subject: [PATCH] SunSpec Workgroup Model Updates (#251) * adding standards list * remove duplicates * cleanup * PF clarification * schema update to include standards array * SOC clarification * DA point comment * updated curve pt comments * watt-var clarification for load points * Reference voltage values for 702 points * CLA bot update * CLA fix * switching to comments * moving comments to detail because of workbook annotations * update detail fields * updated detailed description automation script * typo * xml cleanup * remove the unsupported XML format * establishing unique names for all models * Revert "xml cleanup" This reverts commit 7ddc6926b4d247da0e961b730936caaaaaae70c5. * Leaving XML data for those that still use it * merge revert for manifest.py --- .clabot | 2 +- .gitignore | 2 + json/model_1.json | 40 ++++-- json/model_101.json | 2 +- json/model_102.json | 2 +- json/model_103.json | 2 +- json/model_111.json | 2 +- json/model_112.json | 2 +- json/model_113.json | 2 +- json/model_124.json | 2 +- json/model_201.json | 4 +- json/model_202.json | 2 +- json/model_203.json | 2 +- json/model_204.json | 2 +- json/model_211.json | 2 +- json/model_212.json | 2 +- json/model_213.json | 2 +- json/model_214.json | 2 +- json/model_220.json | 2 +- json/model_401.json | 4 +- json/model_402.json | 4 +- json/model_403.json | 4 +- json/model_404.json | 4 +- json/model_501.json | 2 +- json/model_701.json | 250 +++++++++++++++++++++++---------- json/model_702.json | 217 ++++++++++++++++++++-------- json/model_703.json | 59 ++++++-- json/model_704.json | 189 ++++++++++++++++++------- json/model_705.json | 114 +++++++++++---- json/model_706.json | 91 +++++++++--- json/model_707.json | 85 ++++++++--- json/model_708.json | 85 ++++++++--- json/model_709.json | 85 ++++++++--- json/model_710.json | 85 ++++++++--- json/model_711.json | 87 +++++++++--- json/model_712.json | 86 +++++++++--- json/model_713.json | 34 +++-- json/schema.json | 7 +- smdx/manifest.py | 10 +- utils/add_sunspec_comments.py | 128 +++++++++++++++++ utils/add_sunspec_detail.py | 117 +++++++++++++++ utils/add_sunspec_standards.py | 140 ++++++++++++++++++ 42 files changed, 1561 insertions(+), 404 deletions(-) create mode 100644 utils/add_sunspec_comments.py create mode 100644 utils/add_sunspec_detail.py create mode 100644 utils/add_sunspec_standards.py diff --git a/.clabot b/.clabot index 790ba74..3b2e5b5 100644 --- a/.clabot +++ b/.clabot @@ -1,3 +1,3 @@ { - "contributors": ["bobfox","shelcrow"] + "contributors": ["bobfox","shelcrow","dersecure"] } diff --git a/.gitignore b/.gitignore index b9d6bd9..bb3266a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,8 @@ local.properties .settings/ .loadpath +.idea/ + # External tool builders .externalToolBuilders/ diff --git a/json/model_1.json b/json/model_1.json index 9818b41..8fde521 100644 --- a/json/model_1.json +++ b/json/model_1.json @@ -12,7 +12,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 1 + "value": 1, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Model length", @@ -21,7 +24,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Well known value registered with SunSpec for compliance", @@ -30,7 +36,10 @@ "name": "Mn", "size": 16, "static": "S", - "type": "string" + "type": "string", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Manufacturer specific value (32 chars)", @@ -39,7 +48,10 @@ "name": "Md", "size": 16, "static": "S", - "type": "string" + "type": "string", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Manufacturer specific value (16 chars)", @@ -47,7 +59,8 @@ "name": "Opt", "size": 8, "static": "S", - "type": "string" + "type": "string", + "standards": [] }, { "desc": "Manufacturer specific value (16 chars)", @@ -55,7 +68,10 @@ "name": "Vr", "size": 8, "static": "S", - "type": "string" + "type": "string", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Manufacturer specific value (32 chars)", @@ -64,22 +80,28 @@ "name": "SN", "size": 16, "static": "S", - "type": "string" + "type": "string", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", "desc": "Modbus device address", + "detail": "This point is mandatory for all SunSpec RTU devices and, for those devices, they must support values from 1-247.", "label": "Device Address", "name": "DA", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "desc": "Force even alignment", "name": "Pad", "size": 1, "static": "S", - "type": "pad" + "type": "pad", + "standards": [] } ], "type": "group" diff --git a/json/model_101.json b/json/model_101.json index 22574d4..9f261d4 100644 --- a/json/model_101.json +++ b/json/model_101.json @@ -2,7 +2,7 @@ "group": { "desc": "Include this model for single phase inverter monitoring", "label": "Inverter (Single Phase)", - "name": "inverter", + "name": "inverter_single_phase", "points": [ { "desc": "Model identifier", diff --git a/json/model_102.json b/json/model_102.json index cb9e21b..fede455 100644 --- a/json/model_102.json +++ b/json/model_102.json @@ -2,7 +2,7 @@ "group": { "desc": "Include this model for split phase inverter monitoring", "label": "Inverter (Split-Phase)", - "name": "inverter", + "name": "inverter_split_phase", "points": [ { "desc": "Model identifier", diff --git a/json/model_103.json b/json/model_103.json index 124f117..6c68a86 100644 --- a/json/model_103.json +++ b/json/model_103.json @@ -2,7 +2,7 @@ "group": { "desc": "Include this model for three phase inverter monitoring", "label": "Inverter (Three Phase)", - "name": "inverter", + "name": "inverter_three_phase", "points": [ { "desc": "Model identifier", diff --git a/json/model_111.json b/json/model_111.json index 8deb37e..274996d 100644 --- a/json/model_111.json +++ b/json/model_111.json @@ -2,7 +2,7 @@ "group": { "desc": "Include this model for single phase inverter monitoring using float values", "label": "Inverter (Single Phase) FLOAT", - "name": "inverter", + "name": "inverter_single_phase_float", "points": [ { "desc": "Model identifier", diff --git a/json/model_112.json b/json/model_112.json index 0901d24..04f835d 100644 --- a/json/model_112.json +++ b/json/model_112.json @@ -2,7 +2,7 @@ "group": { "desc": "Include this model for split phase inverter monitoring using float values", "label": "Inverter (Split Phase) FLOAT", - "name": "inverter", + "name": "inverter_split_phase_float", "points": [ { "desc": "Model identifier", diff --git a/json/model_113.json b/json/model_113.json index c1660ea..8665d3a 100644 --- a/json/model_113.json +++ b/json/model_113.json @@ -2,7 +2,7 @@ "group": { "desc": "Include this model for three phase inverter monitoring using float values", "label": "Inverter (Three Phase) FLOAT", - "name": "inverter", + "name": "inverter_three_phase_float", "points": [ { "desc": "Model identifier", diff --git a/json/model_124.json b/json/model_124.json index a3c051a..9a6a13b 100644 --- a/json/model_124.json +++ b/json/model_124.json @@ -2,7 +2,7 @@ "group": { "desc": "Basic Storage Controls ", "label": "Storage", - "name": "storage", + "name": "storage_basic", "points": [ { "desc": "Model identifier", diff --git a/json/model_201.json b/json/model_201.json index d26f55b..883d09a 100644 --- a/json/model_201.json +++ b/json/model_201.json @@ -1,8 +1,8 @@ { "group": { "desc": "Include this model for single phase (AN or AB) metering", - "label": "Meter (Single Phase)single phase (AN or AB) meter", - "name": "ac_meter", + "label": "Meter (Single Phase) single phase (AN or AB) meter", + "name": "ac_meter_an_or_ab", "points": [ { "desc": "Model identifier", diff --git a/json/model_202.json b/json/model_202.json index 8a35f09..537fbf1 100644 --- a/json/model_202.json +++ b/json/model_202.json @@ -1,7 +1,7 @@ { "group": { "label": "split single phase (ABN) meter", - "name": "ac_meter", + "name": "ac_meter_abn", "points": [ { "desc": "Model identifier", diff --git a/json/model_203.json b/json/model_203.json index 59089c9..d3b9cb2 100644 --- a/json/model_203.json +++ b/json/model_203.json @@ -1,7 +1,7 @@ { "group": { "label": "wye-connect three phase (abcn) meter", - "name": "ac_meter", + "name": "ac_meter_abcn", "points": [ { "desc": "Model identifier", diff --git a/json/model_204.json b/json/model_204.json index 6716b1a..b2b07e4 100644 --- a/json/model_204.json +++ b/json/model_204.json @@ -1,7 +1,7 @@ { "group": { "label": "delta-connect three phase (abc) meter", - "name": "ac_meter", + "name": "ac_meter_abc", "points": [ { "desc": "Model identifier", diff --git a/json/model_211.json b/json/model_211.json index 5dc9db7..7335469 100644 --- a/json/model_211.json +++ b/json/model_211.json @@ -1,7 +1,7 @@ { "group": { "label": "single phase (AN or AB) meter", - "name": "ac_meter", + "name": "ac_meter_an_or_ab_float", "points": [ { "desc": "Model identifier", diff --git a/json/model_212.json b/json/model_212.json index 000dc43..6a2c9d7 100644 --- a/json/model_212.json +++ b/json/model_212.json @@ -1,7 +1,7 @@ { "group": { "label": "split single phase (ABN) meter", - "name": "ac_meter", + "name": "ac_meter_abn_float", "points": [ { "desc": "Model identifier", diff --git a/json/model_213.json b/json/model_213.json index d5b8f70..2d1930b 100644 --- a/json/model_213.json +++ b/json/model_213.json @@ -1,7 +1,7 @@ { "group": { "label": "wye-connect three phase (abcn) meter", - "name": "ac_meter", + "name": "ac_meter_abcn_float", "points": [ { "desc": "Model identifier", diff --git a/json/model_214.json b/json/model_214.json index 9271cdc..244f93e 100644 --- a/json/model_214.json +++ b/json/model_214.json @@ -1,7 +1,7 @@ { "group": { "label": "delta-connect three phase (abc) meter", - "name": "ac_meter", + "name": "ac_meter_abc_float", "points": [ { "desc": "Model identifier", diff --git a/json/model_220.json b/json/model_220.json index 2dc3233..b49d1a3 100644 --- a/json/model_220.json +++ b/json/model_220.json @@ -17,7 +17,7 @@ } ], "label": "Secure AC Meter Selected Readings", - "name": "ac_meter", + "name": "ac_meter_secure", "points": [ { "desc": "Model identifier", diff --git a/json/model_401.json b/json/model_401.json index aa4c052..348b716 100644 --- a/json/model_401.json +++ b/json/model_401.json @@ -1,6 +1,8 @@ { "group": { "desc": "A basic string combiner", + "label": "String Combiner (Current)", + "name": "string_combiner_current", "groups": [ { "count": 0, @@ -130,8 +132,6 @@ "type": "group" } ], - "label": "String Combiner (Current)", - "name": "string_combiner", "points": [ { "desc": "Model identifier", diff --git a/json/model_402.json b/json/model_402.json index 543dcbc..b3768b5 100644 --- a/json/model_402.json +++ b/json/model_402.json @@ -1,6 +1,8 @@ { "group": { "desc": "An advanced string combiner", + "label": "String Combiner (Advanced)", + "name": "string_combiner_advanced", "groups": [ { "count": 0, @@ -171,8 +173,6 @@ "type": "group" } ], - "label": "String Combiner (Advanced)", - "name": "string_combiner", "points": [ { "desc": "Model identifier", diff --git a/json/model_403.json b/json/model_403.json index 40cd475..d5a9336 100644 --- a/json/model_403.json +++ b/json/model_403.json @@ -1,6 +1,8 @@ { "group": { "desc": "A basic string combiner model", + "label": "String Combiner (Current)", + "name": "string_combiner_current_input", "groups": [ { "count": 0, @@ -130,8 +132,6 @@ "type": "group" } ], - "label": "String Combiner (Current)", - "name": "string_combiner", "points": [ { "desc": "Model identifier", diff --git a/json/model_404.json b/json/model_404.json index ccdeb3c..cd922af 100644 --- a/json/model_404.json +++ b/json/model_404.json @@ -1,6 +1,8 @@ { "group": { "desc": "An advanced string combiner including voltage and energy measurements", + "label": "String Combiner (Advanced)", + "name": "string_combiner_advanced_inputs", "groups": [ { "count": 0, @@ -172,8 +174,6 @@ "type": "group" } ], - "label": "String Combiner (Advanced)", - "name": "string_combiner", "points": [ { "desc": "Model identifier", diff --git a/json/model_501.json b/json/model_501.json index 900027a..7dea809 100644 --- a/json/model_501.json +++ b/json/model_501.json @@ -2,7 +2,7 @@ "group": { "desc": "A solar module model supporting DC-DC converter", "label": "Solar Module", - "name": "solar_module", + "name": "solar_module_float", "points": [ { "desc": "Model identifier", diff --git a/json/model_701.json b/json/model_701.json index bc2239d..7f64116 100644 --- a/json/model_701.json +++ b/json/model_701.json @@ -12,7 +12,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 701 + "value": 701, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER AC measurement model length.", @@ -22,7 +25,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 153 + "value": 153, + "standards": [ + "IEEE 1547-2018" + ] }, { "comments": [ @@ -50,7 +56,8 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "comments": [ @@ -72,7 +79,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "comments": [ @@ -116,7 +126,8 @@ "value": 7 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "comments": [ @@ -140,7 +151,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "comments": [ @@ -238,7 +252,10 @@ "value": 16 } ], - "type": "bitfield32" + "type": "bitfield32", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Current operational characteristics of the DER.", @@ -265,11 +282,12 @@ "value": 2 } ], - "type": "bitfield32" + "type": "bitfield32", + "standards": [] }, { "comments": [ - "Summary" + "Scale Factors" ], "desc": "Total active power. Active power is positive for DER generation and negative for absorption.", "label": "Active Power", @@ -277,7 +295,10 @@ "sf": "W_SF", "size": 1, "type": "int16", - "units": "W" + "units": "W", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Total apparent power.", @@ -286,7 +307,8 @@ "sf": "VA_SF", "size": 1, "type": "int16", - "units": "VA" + "units": "VA", + "standards": [] }, { "desc": "Total reactive power.", @@ -295,7 +317,10 @@ "sf": "Var_SF", "size": 1, "type": "int16", - "units": "Var" + "units": "Var", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Power factor. The sign of power factor should be the sign of active power.", @@ -303,7 +328,8 @@ "name": "PF", "sf": "PF_SF", "size": 1, - "type": "int16" + "type": "int16", + "standards": [] }, { "desc": "Total AC current.", @@ -312,7 +338,8 @@ "sf": "A_SF", "size": 1, "type": "int16", - "units": "A" + "units": "A", + "standards": [] }, { "desc": "Line to line AC voltage as an average of active phases.", @@ -321,7 +348,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Line to neutral AC voltage as an average of active phases.", @@ -330,7 +360,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "AC frequency.", @@ -339,7 +372,10 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Total active energy injected (Quadrants 1 & 4).", @@ -348,7 +384,8 @@ "sf": "TotWh_SF", "size": 4, "type": "uint64", - "units": "Wh" + "units": "Wh", + "standards": [] }, { "desc": "Total active energy absorbed (Quadrants 2 & 3).", @@ -357,7 +394,8 @@ "sf": "TotWh_SF", "size": 4, "type": "uint64", - "units": "Wh" + "units": "Wh", + "standards": [] }, { "desc": "Total reactive energy injected (Quadrants 1 & 2).", @@ -366,7 +404,8 @@ "sf": "TotVarh_SF", "size": 4, "type": "uint64", - "units": "Varh" + "units": "Varh", + "standards": [] }, { "desc": "Total reactive energy absorbed (Quadrants 3 & 4).", @@ -375,7 +414,8 @@ "sf": "TotVarh_SF", "size": 4, "type": "uint64", - "units": "Varh" + "units": "Varh", + "standards": [] }, { "comments": [ @@ -387,7 +427,8 @@ "sf": "Tmp_SF", "size": 1, "type": "int16", - "units": "C" + "units": "C", + "standards": [] }, { "desc": "Cabinet temperature.", @@ -396,7 +437,8 @@ "sf": "Tmp_SF", "size": 1, "type": "int16", - "units": "C" + "units": "C", + "standards": [] }, { "desc": "Heat sink temperature.", @@ -405,7 +447,8 @@ "sf": "Tmp_SF", "size": 1, "type": "int16", - "units": "C" + "units": "C", + "standards": [] }, { "desc": "Transformer temperature.", @@ -414,7 +457,8 @@ "sf": "Tmp_SF", "size": 1, "type": "int16", - "units": "C" + "units": "C", + "standards": [] }, { "desc": "IGBT/MOSFET temperature.", @@ -423,7 +467,8 @@ "sf": "Tmp_SF", "size": 1, "type": "int16", - "units": "C" + "units": "C", + "standards": [] }, { "desc": "Other temperature.", @@ -432,7 +477,8 @@ "sf": "Tmp_SF", "size": 1, "type": "int16", - "units": "C" + "units": "C", + "standards": [] }, { "comments": [ @@ -444,7 +490,8 @@ "sf": "W_SF", "size": 1, "type": "int16", - "units": "W" + "units": "W", + "standards": [] }, { "desc": "Apparent power L1.", @@ -453,7 +500,8 @@ "sf": "VA_SF", "size": 1, "type": "int16", - "units": "VA" + "units": "VA", + "standards": [] }, { "desc": "Reactive power L1.", @@ -462,7 +510,8 @@ "sf": "Var_SF", "size": 1, "type": "int16", - "units": "Var" + "units": "Var", + "standards": [] }, { "desc": "Power factor phase L1.", @@ -470,7 +519,8 @@ "name": "PFL1", "sf": "PF_SF", "size": 1, - "type": "int16" + "type": "int16", + "standards": [] }, { "desc": "Current phase L1.", @@ -479,7 +529,8 @@ "sf": "A_SF", "size": 1, "type": "int16", - "units": "A" + "units": "A", + "standards": [] }, { "desc": "Phase voltage L1-L2.", @@ -488,7 +539,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Phase voltage L1-N.", @@ -497,7 +551,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Total active energy injected L1.", @@ -506,7 +563,8 @@ "sf": "TotWh_SF", "size": 4, "type": "uint64", - "units": "Wh" + "units": "Wh", + "standards": [] }, { "desc": "Total active energy absorbed L1.", @@ -515,7 +573,8 @@ "sf": "TotWh_SF", "size": 4, "type": "uint64", - "units": "Wh" + "units": "Wh", + "standards": [] }, { "desc": "Total reactive energy injected L1.", @@ -524,7 +583,8 @@ "sf": "TotVarh_SF", "size": 4, "type": "uint64", - "units": "Varh" + "units": "Varh", + "standards": [] }, { "desc": "Total reactive energy absorbed L1.", @@ -533,7 +593,8 @@ "sf": "TotVarh_SF", "size": 4, "type": "uint64", - "units": "Varh" + "units": "Varh", + "standards": [] }, { "comments": [ @@ -545,7 +606,8 @@ "sf": "W_SF", "size": 1, "type": "int16", - "units": "W" + "units": "W", + "standards": [] }, { "desc": "Apparent power L2.", @@ -554,7 +616,8 @@ "sf": "VA_SF", "size": 1, "type": "int16", - "units": "VA" + "units": "VA", + "standards": [] }, { "desc": "Reactive power L2.", @@ -563,7 +626,8 @@ "sf": "Var_SF", "size": 1, "type": "int16", - "units": "Var" + "units": "Var", + "standards": [] }, { "desc": "Power factor L2.", @@ -571,7 +635,8 @@ "name": "PFL2", "sf": "PF_SF", "size": 1, - "type": "int16" + "type": "int16", + "standards": [] }, { "desc": "Current L2.", @@ -580,7 +645,8 @@ "sf": "A_SF", "size": 1, "type": "int16", - "units": "A" + "units": "A", + "standards": [] }, { "desc": "Phase voltage L2-L3.", @@ -589,7 +655,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Phase voltage L2-N.", @@ -598,7 +667,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Total active energy injected L2.", @@ -607,7 +679,8 @@ "sf": "TotWh_SF", "size": 4, "type": "uint64", - "units": "Wh" + "units": "Wh", + "standards": [] }, { "desc": "Total active energy absorbed L2.", @@ -616,7 +689,8 @@ "sf": "TotWh_SF", "size": 4, "type": "uint64", - "units": "Wh" + "units": "Wh", + "standards": [] }, { "desc": "Total reactive energy injected L2.", @@ -625,7 +699,8 @@ "sf": "TotVarh_SF", "size": 4, "type": "uint64", - "units": "Varh" + "units": "Varh", + "standards": [] }, { "desc": "Total reactive energy absorbed L2.", @@ -634,7 +709,8 @@ "sf": "TotVarh_SF", "size": 4, "type": "uint64", - "units": "Varh" + "units": "Varh", + "standards": [] }, { "comments": [ @@ -646,7 +722,8 @@ "sf": "W_SF", "size": 1, "type": "int16", - "units": "W" + "units": "W", + "standards": [] }, { "desc": "Apparent power L3.", @@ -655,7 +732,8 @@ "sf": "VA_SF", "size": 1, "type": "int16", - "units": "VA" + "units": "VA", + "standards": [] }, { "desc": "Reactive power L3.", @@ -664,7 +742,8 @@ "sf": "Var_SF", "size": 1, "type": "int16", - "units": "Var" + "units": "Var", + "standards": [] }, { "desc": "Power factor L3.", @@ -672,7 +751,8 @@ "name": "PFL3", "sf": "PF_SF", "size": 1, - "type": "int16" + "type": "int16", + "standards": [] }, { "desc": "Current L3.", @@ -681,7 +761,8 @@ "sf": "A_SF", "size": 1, "type": "int16", - "units": "A" + "units": "A", + "standards": [] }, { "desc": "Phase voltage L3-L1.", @@ -690,7 +771,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Phase voltage L3-N.", @@ -699,7 +783,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Total active energy injected L3.", @@ -708,7 +795,8 @@ "sf": "TotWh_SF", "size": 4, "type": "uint64", - "units": "Wh" + "units": "Wh", + "standards": [] }, { "desc": "Total active energy absorbed L3.", @@ -717,7 +805,8 @@ "sf": "TotWh_SF", "size": 4, "type": "uint64", - "units": "Wh" + "units": "Wh", + "standards": [] }, { "desc": "Total reactive energy injected L3.", @@ -726,7 +815,8 @@ "sf": "TotVarh_SF", "size": 4, "type": "uint64", - "units": "Varh" + "units": "Varh", + "standards": [] }, { "desc": "Total reactive energy absorbed L3.", @@ -735,7 +825,8 @@ "sf": "TotVarh_SF", "size": 4, "type": "uint64", - "units": "Varh" + "units": "Varh", + "standards": [] }, { "comments": [ @@ -746,7 +837,8 @@ "name": "ThrotPct", "size": 1, "type": "uint16", - "units": "Pct" + "units": "Pct", + "standards": [] }, { "desc": "Active throttling source.", @@ -815,7 +907,8 @@ "value": 14 } ], - "type": "bitfield32" + "type": "bitfield32", + "standards": [] }, { "comments": [ @@ -826,7 +919,8 @@ "name": "A_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Voltage scale factor.", @@ -834,7 +928,8 @@ "name": "V_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Frequency scale factor.", @@ -842,7 +937,8 @@ "name": "Hz_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Active power scale factor.", @@ -850,7 +946,8 @@ "name": "W_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Power factor scale factor.", @@ -858,7 +955,8 @@ "name": "PF_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Apparent power scale factor.", @@ -866,7 +964,8 @@ "name": "VA_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Reactive power scale factor.", @@ -874,7 +973,8 @@ "name": "Var_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Active energy scale factor.", @@ -882,7 +982,8 @@ "name": "TotWh_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Reactive energy scale factor.", @@ -890,7 +991,8 @@ "name": "TotVarh_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Temperature scale factor.", @@ -898,7 +1000,8 @@ "name": "Tmp_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "comments": [ @@ -908,7 +1011,8 @@ "label": "Manufacturer Alarm Info", "name": "MnAlrmInfo", "size": 32, - "type": "string" + "type": "string", + "standards": [] } ], "type": "group" diff --git a/json/model_702.json b/json/model_702.json index cb5c6e9..747e0a3 100644 --- a/json/model_702.json +++ b/json/model_702.json @@ -12,7 +12,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 702 + "value": 702, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER capacity model length.", @@ -22,7 +25,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 50 + "value": 50, + "standards": [ + "IEEE 1547-2018" + ] }, { "comments": [ @@ -35,7 +41,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "W" + "units": "W", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Active power rating at specified over-excited power factor in watts.", @@ -45,7 +54,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "W" + "units": "W", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Specified over-excited power factor.", @@ -54,7 +66,10 @@ "sf": "PF_SF", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Active power rating at specified under-excited power factor in watts.", @@ -64,7 +79,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "W" + "units": "W", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Specified under-excited power factor.", @@ -73,7 +91,10 @@ "sf": "PF_SF", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Maximum apparent power rating in voltamperes.", @@ -83,7 +104,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "VA" + "units": "VA", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Maximum injected reactive power rating in vars.", @@ -93,7 +117,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "Var" + "units": "Var", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Maximum absorbed reactive power rating in vars.", @@ -103,7 +130,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "Var" + "units": "Var", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Maximum active power charge rate in watts.", @@ -113,7 +143,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "W" + "units": "W", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Maximum active power discharge rate in watts.", @@ -123,7 +156,8 @@ "size": 1, "static": "S", "type": "uint16", - "units": "W" + "units": "W", + "standards": [] }, { "desc": "Maximum apparent power charge rate in voltamperes.", @@ -133,7 +167,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "VA" + "units": "VA", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Maximum apparent power discharge rate in voltamperes.", @@ -143,7 +180,8 @@ "size": 1, "static": "S", "type": "uint16", - "units": "VA" + "units": "VA", + "standards": [] }, { "desc": "AC voltage nominal rating.", @@ -153,7 +191,11 @@ "size": 1, "static": "S", "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Voltages are LN for single phase DER (e.g. 120 V nominal), LL for split phase DER (e.g. 240 V nominal), and LL for three phase DER (e.g., 480 V nominal)." }, { "desc": "AC voltage maximum rating.", @@ -163,7 +205,11 @@ "size": 1, "static": "S", "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Voltages are LN for single phase DER (e.g. 120 V nominal), LL for split phase DER (e.g. 240 V nominal), and LL for three phase DER (e.g., 480 V nominal)." }, { "desc": "AC voltage minimum rating.", @@ -173,7 +219,11 @@ "size": 1, "static": "S", "type": "uint16", - "units": "V" + "units": "V", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Voltages are LN for single phase DER (e.g. 120 V nominal), LL for split phase DER (e.g. 240 V nominal), and LL for three phase DER (e.g., 480 V nominal)." }, { "desc": "AC current maximum rating in amps.", @@ -183,25 +233,30 @@ "size": 1, "static": "S", "type": "uint16", - "units": "A" + "units": "A", + "standards": [] }, { - "desc": "Power factor over-excited rating.", - "label": "PF Over-Excited Rating", + "desc": "Unused. Please use WOvrExtRtgPF.", + "detail": "This point is duplicative of WOvrExtRtgPF.", + "label": "PF Over-Excited Rating (Unused)", "name": "PFOvrExtRtg", "sf": "PF_SF", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [] }, { - "desc": "Power factor under-excited rating.", - "label": "PF Under-Excited Rating", + "desc": "Unused. Please use WUndExtRtgPF.", + "detail": "This point is duplicative of WUndExtRtgPF.", + "label": "PF Under-Excited Rating (Unused)", "name": "PFUndExtRtg", "sf": "PF_SF", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [] }, { "desc": "Reactive susceptance that remains connected to the Area EPS in the cease to energize and trip state.", @@ -211,7 +266,10 @@ "size": 1, "static": "S", "type": "uint16", - "units": "S" + "units": "S", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Normal operating performance category as specified in IEEE 1547-2018.", @@ -231,7 +289,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Abnormal operating performance category as specified in IEEE 1547-2018.", @@ -256,7 +317,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Supported control mode functions.", @@ -336,7 +400,10 @@ "value": 13 } ], - "type": "bitfield32" + "type": "bitfield32", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Intentional island categories.", @@ -366,7 +433,8 @@ "value": 3 } ], - "type": "bitfield16" + "type": "bitfield16", + "standards": [] }, { "access": "RW", @@ -379,7 +447,8 @@ "sf": "W_SF", "size": 1, "type": "uint16", - "units": "W" + "units": "W", + "standards": [] }, { "access": "RW", @@ -389,7 +458,8 @@ "sf": "W_SF", "size": 1, "type": "uint16", - "units": "W" + "units": "W", + "standards": [] }, { "access": "RW", @@ -398,7 +468,8 @@ "name": "WOvrExtPF", "sf": "PF_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "access": "RW", @@ -408,7 +479,8 @@ "sf": "W_SF", "size": 1, "type": "uint16", - "units": "W" + "units": "W", + "standards": [] }, { "access": "RW", @@ -417,7 +489,8 @@ "name": "WUndExtPF", "sf": "PF_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "access": "RW", @@ -427,7 +500,8 @@ "sf": "VA_SF", "size": 1, "type": "uint16", - "units": "VA" + "units": "VA", + "standards": [] }, { "access": "RW", @@ -437,7 +511,8 @@ "sf": "Var_SF", "size": 1, "type": "uint16", - "units": "Var" + "units": "Var", + "standards": [] }, { "access": "RW", @@ -447,7 +522,8 @@ "sf": "Var_SF", "size": 1, "type": "uint16", - "units": "Var" + "units": "Var", + "standards": [] }, { "access": "RW", @@ -457,7 +533,8 @@ "sf": "W_SF", "size": 1, "type": "uint16", - "units": "W" + "units": "W", + "standards": [] }, { "access": "RW", @@ -467,7 +544,8 @@ "sf": "W_SF", "size": 1, "type": "uint16", - "units": "W" + "units": "W", + "standards": [] }, { "access": "RW", @@ -477,7 +555,8 @@ "sf": "VA_SF", "size": 1, "type": "uint16", - "units": "VA" + "units": "VA", + "standards": [] }, { "access": "RW", @@ -487,7 +566,8 @@ "sf": "VA_SF", "size": 1, "type": "uint16", - "units": "VA" + "units": "VA", + "standards": [] }, { "access": "RW", @@ -497,7 +577,9 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [], + "detail": "Voltages are LN for single phase DER (e.g. 120 V nominal), LL for split phase DER (e.g. 240 V nominal), and LL for three phase DER (e.g., 480 V nominal)." }, { "access": "RW", @@ -507,7 +589,9 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [], + "detail": "Voltages are LN for single phase DER (e.g. 120 V nominal), LL for split phase DER (e.g. 240 V nominal), and LL for three phase DER (e.g., 480 V nominal)." }, { "access": "RW", @@ -517,7 +601,9 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "V" + "units": "V", + "standards": [], + "detail": "Voltages are LN for single phase DER (e.g. 120 V nominal), LL for split phase DER (e.g. 240 V nominal), and LL for three phase DER (e.g., 480 V nominal)." }, { "access": "RW", @@ -527,25 +613,30 @@ "sf": "A_SF", "size": 1, "type": "uint16", - "units": "A" + "units": "A", + "standards": [] }, { "access": "RW", - "desc": "Power factor over-excited setting.", - "label": "PF Over-Excited Setting", + "desc": "Unused. Please use WOvrExtPF.", + "detail": "This point is duplicative of WOvrExtPF.", + "label": "PF Over-Excited Setting (Unused)", "name": "PFOvrExt", "sf": "PF_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "access": "RW", - "desc": "Power factor under-excited setting.", - "label": "PF Under-Excited Setting", + "desc": "Unused. Please use WUndExtPF.", + "detail": "This point is duplicative of WUndExtPF.", + "label": "PF Under-Excited Setting (Unused)", "name": "PFUndExt", "sf": "PF_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "access": "RW", @@ -575,7 +666,8 @@ "value": 3 } ], - "type": "bitfield16" + "type": "bitfield16", + "standards": [] }, { "comments": [ @@ -586,7 +678,8 @@ "name": "W_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Power factor scale factor.", @@ -594,7 +687,8 @@ "name": "PF_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Apparent power scale factor.", @@ -602,7 +696,8 @@ "name": "VA_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Reactive power scale factor.", @@ -610,7 +705,8 @@ "name": "Var_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Voltage scale factor.", @@ -618,7 +714,8 @@ "name": "V_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Current scale factor.", @@ -626,7 +723,8 @@ "name": "A_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Susceptance scale factor.", @@ -634,7 +732,8 @@ "name": "S_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] } ], "type": "group" diff --git a/json/model_703.json b/json/model_703.json index 706cc46..fda125d 100644 --- a/json/model_703.json +++ b/json/model_703.json @@ -12,7 +12,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 703 + "value": 703, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Enter service model length.", @@ -22,7 +25,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 17 + "value": 17, + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -40,7 +46,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -50,7 +59,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "Pct" + "units": "Pct", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -60,7 +72,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "Pct" + "units": "Pct", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -70,7 +85,10 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -80,7 +98,10 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -89,7 +110,10 @@ "name": "ESDlyTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -98,7 +122,8 @@ "name": "ESRndTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -107,7 +132,8 @@ "name": "ESRmpTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Enter service delay time remaining in seconds.", @@ -115,7 +141,8 @@ "name": "ESDlyRemTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Voltage percentage scale factor.", @@ -123,7 +150,10 @@ "name": "V_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Frequency scale factor.", @@ -131,7 +161,10 @@ "name": "Hz_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_704.json b/json/model_704.json index 2d8015d..b5a7107 100644 --- a/json/model_704.json +++ b/json/model_704.json @@ -17,7 +17,10 @@ "name": "PF", "sf": "PF_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -39,7 +42,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "sync" @@ -56,7 +62,8 @@ "name": "PF", "sf": "PF_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "access": "RW", @@ -78,7 +85,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] } ], "type": "sync" @@ -95,7 +103,8 @@ "name": "PF", "sf": "PF_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "access": "RW", @@ -117,7 +126,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] } ], "type": "sync" @@ -134,7 +144,8 @@ "name": "PF", "sf": "PF_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "access": "RW", @@ -156,7 +167,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] } ], "type": "sync" @@ -173,7 +185,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 704 + "value": 704, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER AC controls model length.", @@ -183,7 +198,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 65 + "value": 65, + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -208,7 +226,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -230,7 +251,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -239,7 +261,8 @@ "name": "PFWInjRvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Power factor reversion time remaining when injecting active power.", @@ -247,7 +270,8 @@ "name": "PFWInjRvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -272,7 +296,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -294,7 +319,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -303,7 +329,8 @@ "name": "PFWAbsRvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Power factor reversion time remaining when absorbing active power.", @@ -311,7 +338,8 @@ "name": "PFWAbsRvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -336,7 +364,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -346,7 +377,10 @@ "sf": "WMaxLimPct_SF", "size": 1, "type": "uint16", - "units": "Pct" + "units": "Pct", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -356,7 +390,8 @@ "sf": "WMaxLimPct_SF", "size": 1, "type": "uint16", - "units": "Pct" + "units": "Pct", + "standards": [] }, { "access": "RW", @@ -378,7 +413,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -387,7 +423,8 @@ "name": "WMaxLimPctRvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Limit maximum active power percent reversion time remaining.", @@ -395,7 +432,8 @@ "name": "WMaxLimPctRvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -420,7 +458,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -442,7 +481,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -452,7 +492,8 @@ "sf": "WSet_SF", "size": 2, "type": "int32", - "units": "W" + "units": "W", + "standards": [] }, { "access": "RW", @@ -462,7 +503,8 @@ "sf": "WSet_SF", "size": 2, "type": "int32", - "units": "W" + "units": "W", + "standards": [] }, { "access": "RW", @@ -472,7 +514,8 @@ "sf": "WSetPct_SF", "size": 1, "type": "int16", - "units": "Pct" + "units": "Pct", + "standards": [] }, { "access": "RW", @@ -482,7 +525,8 @@ "sf": "WSetPct_SF", "size": 1, "type": "int16", - "units": "Pct" + "units": "Pct", + "standards": [] }, { "access": "RW", @@ -504,7 +548,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -513,7 +558,8 @@ "name": "WSetRvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Set active power reversion time remaining.", @@ -521,7 +567,8 @@ "name": "WSetRvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -546,7 +593,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -586,7 +636,10 @@ "value": 4 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -614,7 +667,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -624,7 +680,8 @@ "sf": "VarSet_SF", "size": 2, "type": "int32", - "units": "Var" + "units": "Var", + "standards": [] }, { "access": "RW", @@ -634,7 +691,8 @@ "sf": "VarSet_SF", "size": 2, "type": "int32", - "units": "Var" + "units": "Var", + "standards": [] }, { "access": "RW", @@ -644,7 +702,10 @@ "sf": "VarSetPct_SF", "size": 1, "type": "int16", - "units": "Pct" + "units": "Pct", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -654,7 +715,8 @@ "sf": "VarSetPct_SF", "size": 1, "type": "int16", - "units": "Pct" + "units": "Pct", + "standards": [] }, { "access": "RW", @@ -676,7 +738,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -685,7 +748,8 @@ "name": "VarSetRvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Set reactive power reversion time remaining.", @@ -693,7 +757,8 @@ "name": "VarSetRvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -705,7 +770,8 @@ "name": "WRmp", "size": 1, "type": "uint16", - "units": "%Max/Sec" + "units": "%Max/Sec", + "standards": [] }, { "access": "RW", @@ -727,7 +793,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "access": "RW", @@ -736,7 +803,8 @@ "name": "VarRmp", "size": 1, "type": "uint16", - "units": "%Max/Sec" + "units": "%Max/Sec", + "standards": [] }, { "access": "RW", @@ -758,7 +826,8 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "comments": [ @@ -769,7 +838,10 @@ "name": "PF_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Limit maximum power scale factor.", @@ -777,7 +849,10 @@ "name": "WMaxLimPct_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Active power scale factor.", @@ -785,7 +860,8 @@ "name": "WSet_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Active power pct scale factor.", @@ -793,7 +869,8 @@ "name": "WSetPct_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Reactive power scale factor.", @@ -801,7 +878,8 @@ "name": "VarSet_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Reactive power pct scale factor.", @@ -809,10 +887,13 @@ "name": "VarSetPct_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" }, "id": 704 -} +} \ No newline at end of file diff --git a/json/model_705.json b/json/model_705.json index 754914c..2a035c2 100644 --- a/json/model_705.json +++ b/json/model_705.json @@ -26,7 +26,11 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." }, { "access": "RW", @@ -36,7 +40,11 @@ "sf": "DeptRef_SF", "size": 1, "type": "int16", - "units": "DeptRef" + "units": "DeptRef", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." } ], "type": "group" @@ -52,7 +60,10 @@ "mandatory": "M", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -83,7 +94,10 @@ "value": 3 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -111,7 +125,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -121,7 +138,10 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Autonomous vref value as a percentage of nominal voltage.", @@ -130,7 +150,8 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [] }, { "access": "RW", @@ -152,7 +173,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -161,7 +185,10 @@ "name": "VRefAutoTms", "size": 1, "type": "uint16", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -171,7 +198,10 @@ "sf": "RspTms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Curve read-write access.", @@ -194,7 +224,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -211,7 +244,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 705 + "value": 705, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER Volt-Var model length.", @@ -220,7 +256,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -243,7 +282,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -252,7 +294,10 @@ "mandatory": "M", "name": "AdptCrvReq", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Result of last adopt curve operation.", @@ -280,7 +325,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of curve points supported.", @@ -289,7 +337,10 @@ "name": "NPt", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of stored curves supported.", @@ -298,7 +349,10 @@ "name": "NCrv", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -307,7 +361,8 @@ "name": "RvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Reversion time remaining in seconds.", @@ -315,7 +370,8 @@ "name": "RvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -323,7 +379,8 @@ "label": "Reversion Curve", "name": "RvrtCrv", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "desc": "Scale factor for curve voltage points.", @@ -332,7 +389,10 @@ "name": "V_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve var points.", @@ -341,7 +401,10 @@ "name": "DeptRef_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Open loop response time scale factor.", @@ -350,7 +413,10 @@ "name": "RspTms_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_706.json b/json/model_706.json index 4763fde..8a011d4 100644 --- a/json/model_706.json +++ b/json/model_706.json @@ -26,7 +26,11 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." }, { "access": "RW", @@ -36,7 +40,11 @@ "sf": "DeptRef_SF", "size": 1, "type": "int16", - "units": "DeptRef" + "units": "DeptRef", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." } ], "type": "group" @@ -52,7 +60,10 @@ "mandatory": "M", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -71,7 +82,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -81,7 +95,10 @@ "sf": "RspTms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Curve read-write access.", @@ -104,7 +121,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -121,7 +141,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 706 + "value": 706, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER Volt-Watt model length.", @@ -130,7 +153,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -153,7 +179,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -162,7 +191,10 @@ "mandatory": "M", "name": "AdptCrvReq", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Result of last adopt curve operation.", @@ -190,7 +222,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of curve points supported.", @@ -199,7 +234,10 @@ "name": "NPt", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of stored curves supported.", @@ -208,7 +246,10 @@ "name": "NCrv", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -217,7 +258,8 @@ "name": "RvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Reversion time remaining in seconds.", @@ -225,7 +267,8 @@ "name": "RvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -233,7 +276,8 @@ "label": "Reversion Curve", "name": "RvrtCrv", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "desc": "Scale factor for curve voltage points.", @@ -242,7 +286,10 @@ "name": "V_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve watt points.", @@ -251,7 +298,10 @@ "name": "DeptRef_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Open loop response time scale factor.", @@ -260,7 +310,10 @@ "name": "RspTms_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_707.json b/json/model_707.json index 9887a15..cb354e3 100644 --- a/json/model_707.json +++ b/json/model_707.json @@ -29,7 +29,11 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." }, { "access": "RW", @@ -39,7 +43,11 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." } ], "type": "group" @@ -54,7 +62,10 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -76,7 +87,8 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [] }, { "access": "RW", @@ -86,7 +98,8 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] } ], "type": "group" @@ -101,7 +114,8 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] } ], "type": "group" @@ -123,7 +137,8 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [] }, { "access": "RW", @@ -133,7 +148,8 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] } ], "type": "group" @@ -148,7 +164,8 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] } ], "type": "group" @@ -178,7 +195,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -195,7 +215,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 707 + "value": 707, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER low voltage trip model length.", @@ -204,7 +227,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -227,7 +253,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -236,7 +265,10 @@ "mandatory": "M", "name": "AdptCrvReq", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Result of last adopt curve operation.", @@ -264,7 +296,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of curve points supported.", @@ -273,7 +308,10 @@ "name": "NPt", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of stored curves supported.", @@ -282,7 +320,10 @@ "name": "NCrvSet", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve voltage points.", @@ -291,7 +332,10 @@ "name": "V_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve time points.", @@ -300,7 +344,10 @@ "name": "Tms_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_708.json b/json/model_708.json index 0bf9e4c..a651392 100644 --- a/json/model_708.json +++ b/json/model_708.json @@ -29,7 +29,11 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." }, { "access": "RW", @@ -39,7 +43,11 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." } ], "type": "group" @@ -54,7 +62,10 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -76,7 +87,8 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [] }, { "access": "RW", @@ -86,7 +98,8 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] } ], "type": "group" @@ -101,7 +114,8 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] } ], "type": "group" @@ -123,7 +137,8 @@ "sf": "V_SF", "size": 1, "type": "uint16", - "units": "VNomPct" + "units": "VNomPct", + "standards": [] }, { "access": "RW", @@ -133,7 +148,8 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] } ], "type": "group" @@ -148,7 +164,8 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] } ], "type": "group" @@ -178,7 +195,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -195,7 +215,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 708 + "value": 708, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER high voltage trip model length.", @@ -204,7 +227,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -227,7 +253,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -236,7 +265,10 @@ "mandatory": "M", "name": "AdptCrvReq", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Result of last adopt curve operation.", @@ -264,7 +296,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of curve points supported.", @@ -273,7 +308,10 @@ "name": "NPt", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of stored curves supported.", @@ -282,7 +320,10 @@ "name": "NCrvSet", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve voltage points.", @@ -291,7 +332,10 @@ "name": "V_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve time points.", @@ -300,7 +344,10 @@ "name": "Tms_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_709.json b/json/model_709.json index f9cbd1d..27974db 100644 --- a/json/model_709.json +++ b/json/model_709.json @@ -29,7 +29,11 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." }, { "access": "RW", @@ -39,7 +43,11 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." } ], "type": "group" @@ -54,7 +62,10 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -76,7 +87,8 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [] }, { "access": "RW", @@ -86,7 +98,8 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] } ], "type": "group" @@ -101,7 +114,8 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] } ], "type": "group" @@ -123,7 +137,8 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [] }, { "access": "RW", @@ -133,7 +148,8 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] } ], "type": "group" @@ -148,7 +164,8 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] } ], "type": "group" @@ -178,7 +195,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -195,7 +215,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 709 + "value": 709, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER low frequency trip model length.", @@ -204,7 +227,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -227,7 +253,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -236,7 +265,10 @@ "mandatory": "M", "name": "AdptCrvReq", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Result of last adopt curve operation.", @@ -264,7 +296,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of curve points supported.", @@ -273,7 +308,10 @@ "name": "NPt", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of stored curves supported.", @@ -282,7 +320,10 @@ "name": "NCrvSet", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve frequency points.", @@ -291,7 +332,10 @@ "name": "Hz_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve time points.", @@ -300,7 +344,10 @@ "name": "Tms_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_710.json b/json/model_710.json index 2ba9f41..60e3cdf 100644 --- a/json/model_710.json +++ b/json/model_710.json @@ -29,7 +29,11 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." }, { "access": "RW", @@ -39,7 +43,11 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." } ], "type": "group" @@ -54,7 +62,10 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -76,7 +87,8 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [] }, { "access": "RW", @@ -86,7 +98,8 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] } ], "type": "group" @@ -101,7 +114,8 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] } ], "type": "group" @@ -123,7 +137,8 @@ "sf": "Hz_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [] }, { "access": "RW", @@ -133,7 +148,8 @@ "sf": "Tms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] } ], "type": "group" @@ -148,7 +164,8 @@ "label": "Number Of Active Points", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] } ], "type": "group" @@ -178,7 +195,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -195,7 +215,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 710 + "value": 710, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER high frequency trip model length.", @@ -204,7 +227,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -227,7 +253,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -236,7 +265,10 @@ "mandatory": "M", "name": "AdptCrvReq", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Result of last adopt curve operation.", @@ -264,7 +296,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of curve points supported.", @@ -273,7 +308,10 @@ "name": "NPt", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of stored curves supported.", @@ -282,7 +320,10 @@ "name": "NCrvSet", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve frequency points.", @@ -291,7 +332,10 @@ "name": "Hz_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve time points.", @@ -300,7 +344,10 @@ "name": "Tms_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_711.json b/json/model_711.json index dc7f247..27131cd 100644 --- a/json/model_711.json +++ b/json/model_711.json @@ -20,7 +20,10 @@ "sf": "Db_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -31,7 +34,10 @@ "sf": "Db_SF", "size": 2, "type": "uint32", - "units": "Hz" + "units": "Hz", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -41,7 +47,10 @@ "name": "KOf", "sf": "K_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -51,7 +60,10 @@ "name": "KUf", "sf": "K_SF", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -62,7 +74,10 @@ "sf": "RspTms_SF", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -71,7 +86,8 @@ "name": "PMin", "size": 1, "type": "int16", - "units": "Pct" + "units": "Pct", + "standards": [] }, { "desc": "Control read-write access.", @@ -94,7 +110,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -111,7 +130,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 711 + "value": 711, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER Frequency Droop model length.", @@ -120,7 +142,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -143,7 +168,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -152,7 +180,10 @@ "mandatory": "M", "name": "AdptCtlReq", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Result of last set active control operation.", @@ -180,7 +211,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of stored controls supported.", @@ -189,7 +223,10 @@ "name": "NCtl", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -198,7 +235,8 @@ "name": "RvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Reversion time remaining in seconds.", @@ -206,7 +244,8 @@ "name": "RvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -214,7 +253,8 @@ "label": "Reversion Control", "name": "RvrtCtl", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "desc": "Deadband scale factor.", @@ -223,7 +263,10 @@ "name": "Db_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Frequency change scale factor.", @@ -232,7 +275,10 @@ "name": "K_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Open loop response time scale factor.", @@ -241,7 +287,10 @@ "name": "RspTms_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_712.json b/json/model_712.json index 94be79e..977a6bf 100644 --- a/json/model_712.json +++ b/json/model_712.json @@ -26,7 +26,11 @@ "sf": "W_SF", "size": 1, "type": "int16", - "units": "WMaxPct" + "units": "WMaxPct", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes. IEEE 1547 implementations must allow 0 values for all three load points." }, { "access": "RW", @@ -36,7 +40,11 @@ "sf": "DeptRef_SF", "size": 1, "type": "int16", - "units": "VarPct" + "units": "VarPct", + "standards": [ + "IEEE 1547-2018" + ], + "detail": "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes. IEEE 1547 implementations must allow 0 values for all three load points" } ], "type": "group" @@ -52,7 +60,10 @@ "mandatory": "M", "name": "ActPt", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -83,7 +94,10 @@ "value": 3 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -105,7 +119,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Curve read-write access.", @@ -128,7 +145,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" @@ -145,7 +165,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 712 + "value": 712, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER Watt-Var model length.", @@ -154,7 +177,10 @@ "name": "L", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -177,7 +203,10 @@ "value": 1 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -187,7 +216,10 @@ "name": "AdptCrvReq", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Result of last set active curve operation.", @@ -216,7 +248,10 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of curve points supported.", @@ -225,7 +260,10 @@ "name": "NPt", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Number of stored curves supported.", @@ -234,7 +272,10 @@ "name": "NCrv", "size": 1, "static": "S", - "type": "uint16" + "type": "uint16", + "standards": [ + "IEEE 1547-2018" + ] }, { "access": "RW", @@ -243,7 +284,8 @@ "name": "RvrtTms", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "desc": "Reversion time remaining in seconds.", @@ -251,7 +293,8 @@ "name": "RvrtRem", "size": 2, "type": "uint32", - "units": "Secs" + "units": "Secs", + "standards": [] }, { "access": "RW", @@ -259,7 +302,8 @@ "label": "Reversion Curve", "name": "RvrtCrv", "size": 1, - "type": "uint16" + "type": "uint16", + "standards": [] }, { "desc": "Scale factor for curve active power points.", @@ -268,7 +312,10 @@ "name": "W_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Scale factor for curve var points.", @@ -277,7 +324,10 @@ "name": "DeptRef_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [ + "IEEE 1547-2018" + ] } ], "type": "group" diff --git a/json/model_713.json b/json/model_713.json index c635010..6bda241 100644 --- a/json/model_713.json +++ b/json/model_713.json @@ -12,7 +12,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 713 + "value": 713, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "DER storage capacity model length.", @@ -22,7 +25,10 @@ "size": 1, "static": "S", "type": "uint16", - "value": 7 + "value": 7, + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "Energy rating of the DER storage.", @@ -31,7 +37,8 @@ "sf": "WH_SF", "size": 1, "type": "uint16", - "units": "WH" + "units": "WH", + "standards": [] }, { "desc": "Energy available of the DER storage (WHAvail = WHRtg * SoC * SoH)", @@ -40,16 +47,21 @@ "sf": "WH_SF", "size": 1, "type": "uint16", - "units": "WH" + "units": "WH", + "standards": [] }, { "desc": "State of charge of the DER storage.", + "detail": "SOC shall be fixed to 0% for DER without storage capabilities.", "label": "State of Charge", "name": "SoC", "sf": "Pct_SF", "size": 1, "type": "uint16", - "units": "Pct" + "units": "Pct", + "standards": [ + "IEEE 1547-2018" + ] }, { "desc": "State of health of the DER storage.", @@ -58,7 +70,8 @@ "sf": "Pct_SF", "size": 1, "type": "uint16", - "units": "Pct" + "units": "Pct", + "standards": [] }, { "desc": "Storage status.", @@ -85,7 +98,8 @@ "value": 2 } ], - "type": "enum16" + "type": "enum16", + "standards": [] }, { "desc": "Scale factor for energy capacity.", @@ -93,7 +107,8 @@ "name": "WH_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] }, { "desc": "Scale factor for percentage.", @@ -101,7 +116,8 @@ "name": "Pct_SF", "size": 1, "static": "S", - "type": "sunssf" + "type": "sunssf", + "standards": [] } ], "type": "group" diff --git a/json/schema.json b/json/schema.json index f54d934..ccf62a9 100644 --- a/json/schema.json +++ b/json/schema.json @@ -30,7 +30,6 @@ "type": "string" } } - }, "definitions": { "group": { @@ -147,6 +146,12 @@ "items": { "$ref": "#/definitions/symbol" } + }, + "standards": { + "type": "array", + "items": { + "type": "string" + } } } }, diff --git a/smdx/manifest.py b/smdx/manifest.py index f2e380e..331e33d 100644 --- a/smdx/manifest.py +++ b/smdx/manifest.py @@ -17,10 +17,11 @@ manifest_files = ['CHANGELOG', 'smdx.xsd'] -""" Simple XML pretty print support function -""" def xml_indent(elem, level=0): + """ + Simple XML pretty print support function + """ i = "\n" + level*" " if len(elem): if not elem.text or not elem.text.strip(): @@ -35,14 +36,17 @@ def xml_indent(elem, level=0): if level and (not elem.tail or not elem.tail.strip()): elem.tail = i + class ManifestError(Exception): pass + class File(object): def __init__(self, name=None, md5=None): self.name = name self.md5 = md5 + class Manifest(object): def __init__(self, path='.', filename=None): self.path = path @@ -163,8 +167,8 @@ def from_xml(self, element=None, filename=None): if name and md5: self.files[name] = md5 -if __name__ == "__main__": +if __name__ == "__main__": path = os.path.dirname(os.path.realpath(__file__)) a = Manifest(path) diff --git a/utils/add_sunspec_comments.py b/utils/add_sunspec_comments.py new file mode 100644 index 0000000..bef0692 --- /dev/null +++ b/utils/add_sunspec_comments.py @@ -0,0 +1,128 @@ +""" +This script updates the SunSpec Models with new comments + +Comments are used to annotate the SunSpec Models with groupings or other information. +These appear at gray rows in the SunSpec Excel sheets. +""" +import json +import os + + +# COMMENT = "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." +# COMMENT_POINTS = { +# 705: ['Crv.Pt.V', 'Crv.Pt.Var'], +# 706: ['Crv.Pt.V', 'Crv.Pt.W'], +# 707: ['Crv.MustTrip.Pt.V', 'Crv.MustTrip.Pt.Tms'], +# 708: ['Crv.MustTrip.Pt.V', 'Crv.MustTrip.Pt.Tms'], +# 709: ['Crv.MustTrip.Pt.Hz', 'Crv.MustTrip.Pt.Tms'], +# 710: ['Crv.MustTrip.Pt.Hz', 'Crv.MustTrip.Pt.Tms'], +# 712: ['Crv.Pt.W', 'Crv.Pt.Var'], +# } + +COMMENT = ("Voltages are LN for single phase DER (e.g. 120 V nominal), LL for split phase DER " + "(e.g. 240 V nominal), and LL for three phase DER (e.g., 480 V nominal).") +COMMENT_POINTS = { + 702: ['VNomRtg', 'VMaxRtg', 'VMinRtg', 'VNom', 'VMax', 'VMin'], +} + + +def group_parser(group, name, tabs=0, print_groups=False): + """ + Parse the group and return a dictionary of the fields + + :param group: the group to parse + :param name: the name of the group + :param tabs: the number of tabs to print + :param print_groups: whether to print the groups + + :return: a dictionary of the fields + """ + + if 'name' in group and print_groups: + if name != '': + print('\t' * tabs + '%s.%s (Group):' % (name, group['name'])) + else: + print('\t' * tabs + '%s (Group):' % (group['name'])) + + if 'points' in group: + if name != '': + pt_name = '%s.%s' % (name, group['name']) + point_parser(group['points'], pt_name, tabs + 1) + else: # add ID and model name to the point name + pt_name = '%s.%s' % (group['points'][0]['value'], group['name']) + point_parser(group['points'], pt_name, tabs + 1) + + if 'groups' in group: + for g in group['groups']: # list of groups + if name != '': + gp_name = '%s.%s' % (name, group['name']) + group_parser(g, gp_name, tabs + 1) + else: # add ID and model name to the group name + gp_name = '%s.%s' % (group['points'][0]['value'], group['name']) + group_parser(g, gp_name, tabs + 1) + + return group + + +def point_parser(points, name, tabs=0): + """ + Parse the points and return a dictionary of the fields + + :param points: the points to parse + :param name: the name string + :param tabs: the number of tabs to print + :return: a dictionary of the fields + """ + + for point in points: + mandatory = False + model = name.split('.')[0] # get model number + for pt in COMMENT_POINTS.get(int(model), []): + if pt == '.'.join(name.split('.')[2:] + [point['name']]): + mandatory = True + break + if mandatory: + if point.get('comments') is None: + point['comments'] = [COMMENT] + elif COMMENT not in point['comments']: + point['comments'].append(COMMENT) + else: + # check for duplicates and remove them + point['comments'] = list(set(point['comments'])) + print('\t' * tabs + '%s.%s (+)' % (name, point['name'])) + else: + # if COMMENT in point['comments']: + # point['standards'].remove(COMMENT) + print('\t' * tabs + '%s.%s (-)' % (name, point['name'])) + + return points + + +def main(): + """ + Scan json files and add new fields to the dataset + + :return: None + """ + json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'json') + for model, pts in COMMENT_POINTS.items(): + file = 'model_%s.json' % model + with open(os.path.join(json_path, file), 'r') as f: + data = json.load(f) + + print('Parsing ID %s' % data['id']) + + if 'points' in data: + point_parser(data['points'], '') + + if 'group' in data: + group_parser(data['group'], '') + + # write the new data back to the file + with open(os.path.join(json_path, file), 'w') as f: + json.dump(data, f, indent=4) + + +if __name__ == '__main__': + main() + diff --git a/utils/add_sunspec_detail.py b/utils/add_sunspec_detail.py new file mode 100644 index 0000000..8cdf2cf --- /dev/null +++ b/utils/add_sunspec_detail.py @@ -0,0 +1,117 @@ +""" +This script updates the SunSpec Models with new Detailed Descriptions +""" +import json +import os + + +# COMMENT = "Internal curve conformance checks should be conducted when AdptCrvReq is set to 1, not on point writes." +# COMMENT_POINTS = { +# 705: ['Crv.Pt.V', 'Crv.Pt.Var'], +# 706: ['Crv.Pt.V', 'Crv.Pt.W'], +# 707: ['Crv.MustTrip.Pt.V', 'Crv.MustTrip.Pt.Tms'], +# 708: ['Crv.MustTrip.Pt.V', 'Crv.MustTrip.Pt.Tms'], +# 709: ['Crv.MustTrip.Pt.Hz', 'Crv.MustTrip.Pt.Tms'], +# 710: ['Crv.MustTrip.Pt.Hz', 'Crv.MustTrip.Pt.Tms'], +# 712: ['Crv.Pt.W', 'Crv.Pt.Var'], +# } + +COMMENT = ("Voltages are LN for single phase DER (e.g. 120 V nominal), LL for split phase DER " + "(e.g. 240 V nominal), and LL for three phase DER (e.g., 480 V nominal).") +COMMENT_POINTS = { + 702: ['VNomRtg', 'VMaxRtg', 'VMinRtg', 'VNom', 'VMax', 'VMin'], +} + + +def group_parser(group, name, tabs=0, print_groups=False): + """ + Parse the group and return a dictionary of the fields + + :param group: the group to parse + :param name: the name of the group + :param tabs: the number of tabs to print + :param print_groups: whether to print the groups + + :return: a dictionary of the fields + """ + + if 'name' in group and print_groups: + if name != '': + print('\t' * tabs + '%s.%s (Group):' % (name, group['name'])) + else: + print('\t' * tabs + '%s (Group):' % (group['name'])) + + if 'points' in group: + if name != '': + pt_name = '%s.%s' % (name, group['name']) + point_parser(group['points'], pt_name, tabs + 1) + else: # add ID and model name to the point name + pt_name = '%s.%s' % (group['points'][0]['value'], group['name']) + point_parser(group['points'], pt_name, tabs + 1) + + if 'groups' in group: + for g in group['groups']: # list of groups + if name != '': + gp_name = '%s.%s' % (name, group['name']) + group_parser(g, gp_name, tabs + 1) + else: # add ID and model name to the group name + gp_name = '%s.%s' % (group['points'][0]['value'], group['name']) + group_parser(g, gp_name, tabs + 1) + + return group + + +def point_parser(points, name, tabs=0): + """ + Parse the points and return a dictionary of the fields + + :param points: the points to parse + :param name: the name string + :param tabs: the number of tabs to print + :return: a dictionary of the fields + """ + + for point in points: + mandatory = False # flag to update point data + model = name.split('.')[0] # get model number + for pt in COMMENT_POINTS.get(int(model), []): + if pt == '.'.join(name.split('.')[2:] + [point['name']]): + mandatory = True + break + if mandatory: + point['detail'] = COMMENT + print('\t' * tabs + '%s.%s (+)' % (name, point['name'])) + else: + print('\t' * tabs + '%s.%s (-)' % (name, point['name'])) + + return points + + +def main(): + """ + Scan json files and add new fields to the dataset + + :return: None + """ + json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'json') + for model, pts in COMMENT_POINTS.items(): + file = 'model_%s.json' % model + with open(os.path.join(json_path, file), 'r') as f: + data = json.load(f) + + print('Parsing ID %s' % data['id']) + + if 'points' in data: + point_parser(data['points'], '') + + if 'group' in data: + group_parser(data['group'], '') + + # write the new data back to the file + with open(os.path.join(json_path, file), 'w') as f: + json.dump(data, f, indent=4) + + +if __name__ == '__main__': + main() + diff --git a/utils/add_sunspec_standards.py b/utils/add_sunspec_standards.py new file mode 100644 index 0000000..8806678 --- /dev/null +++ b/utils/add_sunspec_standards.py @@ -0,0 +1,140 @@ +""" +This script updates the SunSpec Models with new standards +""" +import json +import os + + +STD_NAME = 'IEEE 1547-2018' +MANDATORY_1547_POINTS = { # ID and L are added by default + 1: ['Mn', 'Md', 'SN', 'Vr'], + 701: ['W', 'Var', 'Hz', 'St', 'ConnSt', 'Alrm', 'LLV', 'LNV', 'VL1L2', 'VL1', 'VL2L3', 'VL2', 'VL3L1', 'VL3'], + 702: ['WMaxRtg', 'WOvrExtRtg', 'WOvrExtRtgPF', 'WUndExtRtg', 'WUndExtRtgPF', 'VAMaxRtg', 'NorOpCatRtg', + 'AbnOpCatRtg', 'VarMaxInjRtg', 'VarMaxAbsRtg', 'WChaRteMaxRtg', 'VAChaRteMaxRtg', 'VNomRtg', 'VMaxRtg', + 'VMinRtg', 'CtrlModes', 'ReactSusceptRtg'], + 703: ['ES', 'ESVHi', 'ESVLo', 'ESHzHi', 'ESHzLo', 'ESDlyTms', 'ESRmpRem', 'V_SF', 'Hz_SF'], + 704: ['PFWInjEna', 'PF_SF', 'PFWInj.PF', 'PFWInj.Ext', 'VarSetEna', 'VarSetMod', 'VarSetPri', 'VarSetPct', + 'VarSetPct_SF', 'WMaxLimPctEna', 'WMaxLimPct', 'WMaxLimPct_SF'], + 705: ['Ena', 'AdptCrvReq', 'AdptCrvRslt', 'NPt', 'NCrv', 'V_SF', 'DeptRef_SF', 'RspTms_SF', 'Crv.ActPt', + 'Crv.DeptRef', 'Crv.Pri', 'Crv.VRef', 'Crv.VRefAutoEna', 'Crv.VRefAutoTms', 'Crv.RspTms', 'Crv.ReadOnly', + 'Crv.Pt.V', 'Crv.Pt.Var'], + 706: ['Ena', 'RspTms', 'AdptCrvReq', 'AdptCrvRslt', 'NPt', 'NCrv', 'V_SF', 'DeptRef_SF', 'RspTms_SF', + 'Crv.ActPt', 'Crv.DeptRef', 'Crv.RspTms', 'Crv.ReadOnly', 'Crv.Pt.V', 'Crv.Pt.W'], + 707: ['Ena', 'AdptCrvReq', 'AdptCrvRslt', 'NPt', 'NCrvSet', 'V_SF', 'Tms_SF', 'Crv.ReadOnly', 'Crv.MustTrip.ActPt', + 'Crv.MustTrip.Pt.V', 'Crv.MustTrip.Pt.Tms'], + 708: ['Ena', 'AdptCrvReq', 'AdptCrvRslt', 'NPt', 'NCrvSet', 'V_SF', 'Tms_SF', 'Crv.ReadOnly', 'Crv.MustTrip.ActPt', + 'Crv.MustTrip.Pt.V', 'Crv.MustTrip.Pt.Tms'], + 709: ['Ena', 'AdptCrvReq', 'AdptCrvRslt', 'NPt', 'NCrvSet', 'Hz_SF', 'Tms_SF', 'Crv.ReadOnly', 'Crv.MustTrip.ActPt', + 'Crv.MustTrip.Pt.Hz', 'Crv.MustTrip.Pt.Tms'], + 710: ['Ena', 'AdptCrvReq', 'AdptCrvRslt', 'NPt', 'NCrvSet', 'Hz_SF', 'Tms_SF', 'Crv.ReadOnly', 'Crv.MustTrip.ActPt', + 'Crv.MustTrip.Pt.Hz', 'Crv.MustTrip.Pt.Tms'], + 711: ['Ena', 'AdptCtlReq', 'AdptCtlRslt', 'NCtl', 'Db_SF', 'K_SF', 'RspTms_SF', 'Ctl.ReadOnly', + 'Ctl.DbOf', 'Ctl.DbUf', 'Ctl.KOf', 'Ctl.KUf', 'Ctl.RspTms'], + 712: ['Ena', 'AdptCrvReq', 'AdptCrvRslt', 'NPt', 'NCrv', 'W_SF', 'DeptRef_SF', 'Crv.ActPt', 'Crv.DeptRef', + 'Crv.Pri', 'Crv.ReadOnly', 'Crv.Pt.W', 'Crv.Pt.Var'], + 713: ['SoC'], +} + + +def group_parser(group, name, tabs=0, print_groups=False): + """ + Parse the group and return a dictionary of the fields + + :param group: the group to parse + :param name: the name of the group + :param tabs: the number of tabs to print + :param print_groups: whether to print the groups + + :return: a dictionary of the fields + """ + + if 'name' in group and print_groups: + if name != '': + print('\t' * tabs + '%s.%s (Group):' % (name, group['name'])) + else: + print('\t' * tabs + '%s (Group):' % (group['name'])) + + if 'points' in group: + if name != '': + pt_name = '%s.%s' % (name, group['name']) + point_parser(group['points'], pt_name, tabs + 1) + else: # add ID and model name to the point name + pt_name = '%s.%s' % (group['points'][0]['value'], group['name']) + point_parser(group['points'], pt_name, tabs + 1) + + if 'groups' in group: + for g in group['groups']: # list of groups + if name != '': + gp_name = '%s.%s' % (name, group['name']) + group_parser(g, gp_name, tabs + 1) + else: # add ID and model name to the group name + gp_name = '%s.%s' % (group['points'][0]['value'], group['name']) + group_parser(g, gp_name, tabs + 1) + + return group + + +def point_parser(points, name, tabs=0): + """ + Parse the points and return a dictionary of the fields + + :param points: the points to parse + :param name: the name string + :param tabs: the number of tabs to print + :return: a dictionary of the fields + """ + + for point in points: + mandatory = False + model = name.split('.')[0] # get model number + for pt in MANDATORY_1547_POINTS.get(int(model), []): + if pt == '.'.join(name.split('.')[2:] + [point['name']]): + mandatory = True + break + if point['name'] == 'ID' or point['name'] == 'L' or mandatory: + if point.get('standards') is None: + point['standards'] = [STD_NAME] + elif STD_NAME not in point['standards']: + point['standards'].append(STD_NAME) + else: + # check for duplicates and remove them + point['standards'] = list(set(point['standards'])) + print('\t' * tabs + '%s.%s (+)' % (name, point['name'])) + else: + if point.get('standards') is None: + point['standards'] = [] + elif STD_NAME in point['standards']: + point['standards'].remove(STD_NAME) + print('\t' * tabs + '%s.%s (-)' % (name, point['name'])) + + return points + + +def main(): + """ + Scan json files and add new fields to the dataset + + :return: None + """ + json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'json') + for model, pts in MANDATORY_1547_POINTS.items(): + file = 'model_%s.json' % model + with open(os.path.join(json_path, file), 'r') as f: + data = json.load(f) + + print('Parsing ID %s' % data['id']) + + if 'points' in data: + point_parser(data['points'], '') + + if 'group' in data: + group_parser(data['group'], '') + + # write the new data back to the file + with open(os.path.join(json_path, file), 'w') as f: + json.dump(data, f, indent=4) + + +if __name__ == '__main__': + main() +