From 30e2e37bf192f8ee5b4b72bb252dc1cd5194f27e Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 11:47:54 -0400 Subject: [PATCH 01/10] add cap bank relay attributes --- .../wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx index 5194b0d96..9b0c86547 100644 --- a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx +++ b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx @@ -27,6 +27,7 @@ import { Application, OpenXDA } from '@gpa-gemstone/application-typings'; import BusAttributes from '../AssetAttribute/Bus'; import BreakerAttributes from '../AssetAttribute/Breaker'; import CapBankAttributes from '../AssetAttribute/CapBank'; +import CapBankRelayAttributes from '../AssetAttribute/CapBankRelay'; import LineAttributes from '../AssetAttribute/Line'; import TransformerAttributes from '../AssetAttribute/Transformer'; import { useNavigate } from 'react-router-dom'; @@ -335,6 +336,8 @@ const MeterAssetWindow = (props: IProps) => { return ; else if (activeAsset.AssetType == 'Bus') return ; + else if (activeAsset.AssetType == 'CapacitorBankRelay') + return else if (activeAsset.AssetType == 'CapacitorBank') return ; else if (activeAsset.AssetType == 'Line') From b0bc3c93fe90009c6ee946c6838c805e34513d10 Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 12:07:10 -0400 Subject: [PATCH 02/10] fix adding DER asset --- .../OpenXDA/Assets/OpenXDAAssetController.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs index fabcc4c32..5e53feef1 100644 --- a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs +++ b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs @@ -478,6 +478,12 @@ public int PostNewAsset(JObject record) CreateTransformerFromJToken(transformer, asset); new TableOperations(connection).AddNewRecord(transformer); } + else if (assetType == "DER") + { + DER der = new DER(); + CreateDERFromJToken(der, asset); + new TableOperations(connection).AddNewRecord(der); + } else { Asset newAsset = new Asset(); @@ -968,6 +974,15 @@ private void CreateTransformerFromJToken(Transformer transformer, JToken record) transformer.Tap = record["Tap"].ToObject(); transformer.Spare = record["Spare"].ToObject(); } + private void CreateDERFromJToken(DER der, JToken record) + { + der.VoltageKV = record["VoltageKV"].ToObject(); + der.AssetKey = record["AssetKey"].ToString(); + der.Description = record["Description"].ToString(); + der.AssetName = record["AssetName"].ToString(); + der.FullRatedOutputCurrent = record["FullRatedOutputCurrent"].ToObject(); + der.VoltageLevel = record["VoltageLevel"].ToString(); + } ////Need to Override the external DB Function to return the list for all Assets //public override IHttpActionResult GetExtendedDataBases() From edbc3a50cc5b8b0ef89fdc23a76e89240e98822f Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 12:21:10 -0400 Subject: [PATCH 03/10] remove line segment values from newly-posted to meter line asset --- .../Controllers/OpenXDA/Assets/OpenXDAAssetController.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs index 5e53feef1..4fc69044c 100644 --- a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs +++ b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs @@ -382,12 +382,7 @@ public int PostNewAsset(JObject record) AssetKey = asset["AssetKey"].ToString() + "LineSegment", Description = asset["Description"].ToString(), AssetName = asset["AssetName"].ToString(), - AssetTypeID = assetTypeID, - R0 = asset["Segment"]["R0"].ToObject(), - X0 = asset["Segment"]["X0"].ToObject(), - R1 = asset["Segment"]["R1"].ToObject(), - X1 = asset["Segment"]["X1"].ToObject(), - Length = asset["Segment"]["Length"].ToObject(), + AssetTypeID = assetTypeID }; lineSegment.AssetTypeID = connection.ExecuteScalar("SELECT ID FROM AssetType WHERE Name = 'LineSegment'"); From 1335b39b1e3779828718f7b10e314c99720567e5 Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 12:35:45 -0400 Subject: [PATCH 04/10] fix add breaker to meter --- .../wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx index b754d1a5b..5974ed74d 100644 --- a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx +++ b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx @@ -200,6 +200,7 @@ export namespace AssetAttributes { record.TripTime = null; record.PickupTime = null; record.TripCoilCondition = null; + record.AirGapResistor = false; return record; } else if (type == 'Bus') { @@ -320,7 +321,7 @@ export namespace AssetAttributes { errors.push('A valid Pickup Time Limit is required.') if ((asset as OpenXDA.Types.Breaker).TripCoilCondition == null || !AssetAttributes.isRealNumber((asset as OpenXDA.Types.Breaker).TripCoilCondition)) errors.push('A valid Trip Coil Condition Limit is required.') - + } if (type == 'CapacitorBankRelay') { From 5dc2a7bba0ed53a10270f04aace0f587c0458e34 Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 12:43:49 -0400 Subject: [PATCH 05/10] fix add capbank --- .../Controllers/OpenXDA/Assets/OpenXDAAssetController.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs index 4fc69044c..e682c10e2 100644 --- a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs +++ b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs @@ -914,6 +914,7 @@ private void CreateCapBankFromJToken(CapBank capBank, JToken record) capBank.PosReactanceTol = record["PosReactanceTol"].ToObject(); capBank.Nparalell = record["Nparalell"].ToObject(); capBank.Nseries = record["Nseries"].ToObject(); + /** capBank.NSeriesGroup = record["NSeriesGroup"].ToObject(); capBank.NParalellGroup = record["NParalellGroup"].ToObject(); capBank.Fused = record["Fused"].ToObject(); @@ -924,10 +925,12 @@ private void CreateCapBankFromJToken(CapBank capBank, JToken record) capBank.LVKV = record["LVKV"].ToObject(); capBank.LVNegReactanceTol = record["LVNegReactanceTol"].ToObject(); capBank.LVPosReactanceTol = record["LVPosReactanceTol"].ToObject(); + */ capBank.LowerXFRRatio = record["LowerXFRRatio"].ToObject(); capBank.Nshorted = record["Nshorted"].ToObject(); capBank.BlownFuses = record["BlownFuses"].ToObject(); capBank.BlownGroups = record["BlownGroups"].ToObject(); + /** capBank.ShortedGroups = record["ShortedGroups"].ToObject(); capBank.NLowerGroups = record["NLowerGroups"].ToObject(); @@ -936,6 +939,7 @@ private void CreateCapBankFromJToken(CapBank capBank, JToken record) capBank.Sh = record["Sh"].ToObject(); capBank.Rv = record["Rv"].ToObject(); capBank.Rh = record["Rh"].ToObject(); + */ capBank.Compensated = record["Compensated"].ToObject(); } From 659925699b8553ca57fd68cd55ffad16381fb469 Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 12:54:13 -0400 Subject: [PATCH 06/10] fix add transformer --- .../Controllers/OpenXDA/Assets/OpenXDAAssetController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs index e682c10e2..d9b2ce83d 100644 --- a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs +++ b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs @@ -966,10 +966,10 @@ private void CreateTransformerFromJToken(Transformer transformer, JToken record) transformer.ThermalRating = record["ThermalRating"].ToObject(); transformer.PrimaryVoltageKV = record["PrimaryVoltageKV"].ToObject(); transformer.SecondaryVoltageKV = record["SecondaryVoltageKV"].ToObject(); - transformer.TertiaryVoltageKV = record["TertiaryVoltageKV"].ToObject(); + // transformer.TertiaryVoltageKV = record["TertiaryVoltageKV"].ToObject(); transformer.PrimaryWinding = record["PrimaryWinding"].ToObject(); transformer.SecondaryWinding = record["SecondaryWinding"].ToObject(); - transformer.TertiaryWinding = record["TertiaryWinding"].ToObject(); + // transformer.TertiaryWinding = record["TertiaryWinding"].ToObject(); transformer.Tap = record["Tap"].ToObject(); transformer.Spare = record["Spare"].ToObject(); } From 5b0ce1b7b9c3b34c2ca4d6752327d1cb74ae943a Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 13:03:15 -0400 Subject: [PATCH 07/10] allow tertiary fields to be set in postNewAsset --- .../Controllers/OpenXDA/Assets/OpenXDAAssetController.cs | 4 ++-- .../wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs index d9b2ce83d..2d1d4af16 100644 --- a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs +++ b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs @@ -966,10 +966,10 @@ private void CreateTransformerFromJToken(Transformer transformer, JToken record) transformer.ThermalRating = record["ThermalRating"].ToObject(); transformer.PrimaryVoltageKV = record["PrimaryVoltageKV"].ToObject(); transformer.SecondaryVoltageKV = record["SecondaryVoltageKV"].ToObject(); - // transformer.TertiaryVoltageKV = record["TertiaryVoltageKV"].ToObject(); + transformer.TertiaryVoltageKV = record.Value("TertiaryVoltageKV") ?? 0; transformer.PrimaryWinding = record["PrimaryWinding"].ToObject(); transformer.SecondaryWinding = record["SecondaryWinding"].ToObject(); - // transformer.TertiaryWinding = record["TertiaryWinding"].ToObject(); + transformer.TertiaryWinding = record.Value("TertiaryWinding") ?? 0; transformer.Tap = record["Tap"].ToObject(); transformer.Spare = record["Spare"].ToObject(); } diff --git a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx index 5974ed74d..9ca067ce7 100644 --- a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx +++ b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx @@ -257,6 +257,8 @@ export namespace AssetAttributes { record.ThermalRating = null; record.PrimaryVoltageKV = null; record.SecondaryVoltageKV = null; + record.TertiaryVoltageKV = null; + record.TertiaryWinding = null; record.Tap = null; return record } From ee011f0d818888e45f0d5849dfd27dff29631229 Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 13:10:24 -0400 Subject: [PATCH 08/10] use defaults for add new capbanks --- .../OpenXDA/Assets/OpenXDAAssetController.cs | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs index 2d1d4af16..7386549ba 100644 --- a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs +++ b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs @@ -914,32 +914,29 @@ private void CreateCapBankFromJToken(CapBank capBank, JToken record) capBank.PosReactanceTol = record["PosReactanceTol"].ToObject(); capBank.Nparalell = record["Nparalell"].ToObject(); capBank.Nseries = record["Nseries"].ToObject(); - /** - capBank.NSeriesGroup = record["NSeriesGroup"].ToObject(); - capBank.NParalellGroup = record["NParalellGroup"].ToObject(); - capBank.Fused = record["Fused"].ToObject(); - capBank.VTratioBus = record["VTratioBus"].ToObject(); - capBank.NumberLVCaps = record["NumberLVCaps"].ToObject(); - capBank.NumberLVUnits = record["NumberLVUnits"].ToObject(); - capBank.LVKVAr = record["LVKVAr"].ToObject(); - capBank.LVKV = record["LVKV"].ToObject(); - capBank.LVNegReactanceTol = record["LVNegReactanceTol"].ToObject(); - capBank.LVPosReactanceTol = record["LVPosReactanceTol"].ToObject(); - */ + capBank.NSeriesGroup = record.Value("NSeriesGroup") ?? 0; + capBank.NParalellGroup = record.Value("NParalellGroup") ?? 0; + capBank.Fused = record.Value("Fused") ?? true; + capBank.VTratioBus = record.Value("VTratioBus") ?? 0; + capBank.NumberLVCaps = record.Value("NumberLVCaps") ?? 0; + capBank.NumberLVUnits = record.Value("NumberLVUnits") ?? 0; + capBank.LVKVAr = record.Value("LVKVAr") ?? 0; + capBank.LVKV = record.Value("LVKV") ?? 0; + capBank.LVNegReactanceTol = record.Value("LVNegReactanceTol") ?? 0; + capBank.LVPosReactanceTol = record.Value("LVPosReactanceTol") ?? 0; + capBank.LowerXFRRatio = record["LowerXFRRatio"].ToObject(); capBank.Nshorted = record["Nshorted"].ToObject(); capBank.BlownFuses = record["BlownFuses"].ToObject(); capBank.BlownGroups = record["BlownGroups"].ToObject(); - /** - capBank.ShortedGroups = record["ShortedGroups"].ToObject(); - capBank.NLowerGroups = record["NLowerGroups"].ToObject(); - - capBank.RelayPTRatioPrimary = record["RelayPTRatioPrimary"].ToObject(); - capBank.RelayPTRatioSecondary = record["RelayPTRatioSecondary"].ToObject(); - capBank.Sh = record["Sh"].ToObject(); - capBank.Rv = record["Rv"].ToObject(); - capBank.Rh = record["Rh"].ToObject(); - */ + capBank.ShortedGroups = record.Value("ShortedGroups") ?? 0; + capBank.NLowerGroups = record.Value("NLowerGroups") ?? 0; + + capBank.RelayPTRatioPrimary = record.Value("RelayPTRatioPrimary") ?? 0; + capBank.RelayPTRatioSecondary = record.Value("RelayPTRatioSecondary") ?? 0; + capBank.Sh = record.Value("Sh") ?? 0; + capBank.Rv = record.Value("Rv") ?? 0; + capBank.Rh = record.Value("Rh") ?? 0; capBank.Compensated = record["Compensated"].ToObject(); } From afa9d3f61ebc86950544524b32070f1372a90d89 Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Mon, 13 Jul 2026 13:40:59 -0400 Subject: [PATCH 09/10] use defaults rather than axing line segment values --- .../Controllers/OpenXDA/Assets/OpenXDAAssetController.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs index 7386549ba..dad6eee29 100644 --- a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs +++ b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs @@ -382,7 +382,12 @@ public int PostNewAsset(JObject record) AssetKey = asset["AssetKey"].ToString() + "LineSegment", Description = asset["Description"].ToString(), AssetName = asset["AssetName"].ToString(), - AssetTypeID = assetTypeID + AssetTypeID = assetTypeID, + R0 = asset["Detail"].Value("R0") ?? 0, + X0 = asset["Detail"].Value("X0") ?? 0, + R1 = asset["Detail"].Value("R1") ?? 0, + X1 = asset["Detail"].Value("X1") ?? 0, + Length = asset["Detail"].Value("Length") ?? 0 }; lineSegment.AssetTypeID = connection.ExecuteScalar("SELECT ID FROM AssetType WHERE Name = 'LineSegment'"); From 73ac70d585ee4cec977d8ac125d5c29774b1175b Mon Sep 17 00:00:00 2001 From: natalie beatty Date: Fri, 17 Jul 2026 10:17:17 -0400 Subject: [PATCH 10/10] cleanup --- .../OpenXDA/Assets/OpenXDAAssetController.cs | 10 +++++----- .../Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx | 1 - .../Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs index dad6eee29..019ae00e5 100644 --- a/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs +++ b/Source/Applications/SystemCenter/Controllers/OpenXDA/Assets/OpenXDAAssetController.cs @@ -383,11 +383,11 @@ public int PostNewAsset(JObject record) Description = asset["Description"].ToString(), AssetName = asset["AssetName"].ToString(), AssetTypeID = assetTypeID, - R0 = asset["Detail"].Value("R0") ?? 0, - X0 = asset["Detail"].Value("X0") ?? 0, - R1 = asset["Detail"].Value("R1") ?? 0, - X1 = asset["Detail"].Value("X1") ?? 0, - Length = asset["Detail"].Value("Length") ?? 0 + R0 = asset["Detail"]?.Value("R0") ?? 0, + X0 = asset["Detail"]?.Value("X0") ?? 0, + R1 = asset["Detail"]?.Value("R1") ?? 0, + X1 = asset["Detail"]?.Value("X1") ?? 0, + Length = asset["Detail"]?.Value("Length") ?? 0 }; lineSegment.AssetTypeID = connection.ExecuteScalar("SELECT ID FROM AssetType WHERE Name = 'LineSegment'"); diff --git a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx index 9ca067ce7..d3b392bf2 100644 --- a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx +++ b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/AssetAttribute/Asset.tsx @@ -323,7 +323,6 @@ export namespace AssetAttributes { errors.push('A valid Pickup Time Limit is required.') if ((asset as OpenXDA.Types.Breaker).TripCoilCondition == null || !AssetAttributes.isRealNumber((asset as OpenXDA.Types.Breaker).TripCoilCondition)) errors.push('A valid Trip Coil Condition Limit is required.') - } if (type == 'CapacitorBankRelay') { diff --git a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx index 9b0c86547..60c0cd0f7 100644 --- a/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx +++ b/Source/Applications/SystemCenter/wwwroot/Scripts/TSX/SystemCenter/Meter/MeterAsset.tsx @@ -337,7 +337,7 @@ const MeterAssetWindow = (props: IProps) => { else if (activeAsset.AssetType == 'Bus') return ; else if (activeAsset.AssetType == 'CapacitorBankRelay') - return + return else if (activeAsset.AssetType == 'CapacitorBank') return ; else if (activeAsset.AssetType == 'Line')