private async Task <DiscreteMeasurement> GetPopulatedDiscreteMeasurement(ResourceDescription rs)
        {
            string verboseMessage = $"{baseLogString} entering GetPopulatedDiscreteMeasurement method.";

            Logger.LogVerbose(verboseMessage);

            DiscreteMeasurement measurement = new DiscreteMeasurement();

            try
            {
                measurement.Id              = rs.Id;
                measurement.Address         = rs.GetProperty(ModelCode.MEASUREMENT_ADDRESS).AsString();
                measurement.IsInput         = rs.GetProperty(ModelCode.MEASUREMENT_ISINPUT).AsBool();
                measurement.CurrentOpen     = rs.GetProperty(ModelCode.DISCRETE_CURRENTOPEN).AsBool();
                measurement.MaxValue        = rs.GetProperty(ModelCode.DISCRETE_MAXVALUE).AsInt();
                measurement.MinValue        = rs.GetProperty(ModelCode.DISCRETE_MINVALUE).AsInt();
                measurement.NormalValue     = rs.GetProperty(ModelCode.DISCRETE_NORMALVALUE).AsInt();
                measurement.MeasurementType = (DiscreteMeasurementType)rs.GetProperty(ModelCode.DISCRETE_MEASUREMENTTYPE).AsEnum();

                var connection = await GetAllReferencedElements(rs);

                if (connection.Count < 0)
                {
                    Logger.LogError($"{baseLogString} GetPopulatedDiscreteMeasurement => Discrete measurement with GID {rs.Id:X16} is not connected to any element.");
                }
                else if (connection.Count > 1)
                {
                    Logger.LogWarning($"{baseLogString} GetPopulatedDiscreteMeasurement => Discrete measurement with GID {rs.Id:X16} is connected to more then one element.");
                    if (!await MeasurementToConnectedTerminalMap.ContainsKeyAsync(rs.Id))
                    {
                        await MeasurementToConnectedTerminalMap.SetAsync(rs.Id, connection.First());
                    }
                }
                else
                {
                    if (!await MeasurementToConnectedTerminalMap.ContainsKeyAsync(rs.Id))
                    {
                        await MeasurementToConnectedTerminalMap.SetAsync(rs.Id, connection.First());
                    }
                }
            }
            catch (Exception e)
            {
                Logger.LogError($"[NMSManager] Failed to populate discrete measurement with GID: {rs.Id:X16}." +
                                $"{Environment.NewLine} Exception message: {e.Message}" +
                                $"{Environment.NewLine} Stack trace: {e.StackTrace}");
            }
            return(measurement);
        }
        private DiscreteMeasurement GetPopulatedDiscreteMeasurement(ResourceDescription rs)
        {
            DiscreteMeasurement measurement = new DiscreteMeasurement();

            try
            {
                measurement.Id              = rs.Id;
                measurement.Address         = rs.GetProperty(ModelCode.MEASUREMENT_ADDRESS).AsString();
                measurement.IsInput         = rs.GetProperty(ModelCode.MEASUREMENT_ISINPUT).AsBool();
                measurement.CurrentOpen     = rs.GetProperty(ModelCode.DISCRETE_CURRENTOPEN).AsBool();
                measurement.MaxValue        = rs.GetProperty(ModelCode.DISCRETE_MAXVALUE).AsInt();
                measurement.MinValue        = rs.GetProperty(ModelCode.DISCRETE_MINVALUE).AsInt();
                measurement.NormalValue     = rs.GetProperty(ModelCode.DISCRETE_NORMALVALUE).AsInt();
                measurement.MeasurementType = (DiscreteMeasurementType)rs.GetProperty(ModelCode.DISCRETE_MEASUREMENTTYPE).AsEnum();

                var connection = GetAllReferencedElements(rs);
                if (connection.Count < 0)
                {
                    logger.LogWarn($"[NMSManager] Discrete measurement with GID: 0x{rs.Id:X16} is not connected to any element.");
                }
                else if (connection.Count > 1)
                {
                    logger.LogWarn($"[NMSManager] Discrete measurement with GID: 0x{rs.Id:X16} is connected to more then one element.");
                    MeasurementToConnectedTerminalMap.Add(rs.Id, connection.First());
                }
                else
                {
                    MeasurementToConnectedTerminalMap.Add(rs.Id, connection.First());
                }
            }
            catch (Exception ex)
            {
                logger.LogError($"[NMSManager] Failed to populate discrete measurement with GID: 0x{rs.Id:X16}. Exception message: {ex.Message}");
            }
            return(measurement);
        }
        public async Task <UIModel> ConvertTopologyToUIModel(TopologyModel topology)
        {
            string verboseMessage = $"{baseLogString} ConvertTopologyToUIModel method called.";

            Logger.LogVerbose(verboseMessage);

            if (topology == null)
            {
                string message = $"{baseLogString} ConvertTopologyToUIModel => Provider topology is null.";
                Logger.LogError(message);
                throw new Exception(message);
            }

            UIModel      uIModel = new UIModel();
            Stack <long> stack   = new Stack <long>();

            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => Calling GetReclosers method from model provider client.");
            var modelProviderClient = CeModelProviderClient.CreateClient();
            var reclosers           = await modelProviderClient.GetReclosers();

            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => GetReclosers method from model provider client has been called successfully.");

            uIModel.FirstNode = topology.FirstNode;
            stack.Push(topology.FirstNode);
            long nextElementGid;

            while (stack.Count > 0)
            {
                nextElementGid = stack.Pop();
                if (topology.GetElementByGid(nextElementGid, out ITopologyElement element))
                {
                    if (!reclosers.Contains(nextElementGid))
                    {
                        foreach (var child in element.SecondEnd)
                        {
                            long nextElement = child.Id;
                            if (ModelCodeHelper.ExtractTypeFromGlobalId(child.Id) == 0)
                            {
                                if (child is Field field && field.Members.Count > 0)
                                {
                                    nextElement = field.Members.First().Id;
                                }
                                else
                                {
                                    string message = $"{baseLogString} ConvertTopologyToUIModel => Error while getting field in Topology to UIModel convert. Element is not field or field is empty.";
                                    Logger.LogError(message);
                                    throw new Exception(message);
                                }
                            }

                            uIModel.AddRelation(element.Id, nextElement);
                            stack.Push(nextElement);
                        }
                    }

                    List <UIMeasurement> measurements = new List <UIMeasurement>();
                    foreach (var measurementGid in element.Measurements.Keys)
                    {
                        DMSType type = (DMSType)ModelCodeHelper.ExtractTypeFromGlobalId(measurementGid);

                        if (type == DMSType.ANALOG)
                        {
                            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => Calling GetAnalogMeasurement method from measurement provider client for measurement GID {measurementGid:X16}.");
                            var measurementProviderClient       = MeasurementProviderClient.CreateClient();
                            AnalogMeasurement analogMeasurement = await measurementProviderClient.GetAnalogMeasurement(measurementGid);

                            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => GetAnalogMeasurement method from measurement provider client has been called successfully.");

                            measurements.Add(new UIMeasurement()
                            {
                                Gid   = analogMeasurement.Id,
                                Type  = analogMeasurement.GetMeasurementType(),
                                Value = analogMeasurement.GetCurrentValue()
                            });
                        }
                        else if (type == DMSType.DISCRETE)
                        {
                            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => Calling GetDiscreteMeasurement method from measurement provider client for measurement GID {measurementGid:X16}.");
                            var measurementProviderClient           = MeasurementProviderClient.CreateClient();
                            DiscreteMeasurement discreteMeasurement = await measurementProviderClient.GetDiscreteMeasurement(measurementGid);

                            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => GetDiscreteMeasurement method from measurement provider client has been called successfully.");

                            measurements.Add(new UIMeasurement()
                            {
                                Gid   = discreteMeasurement.Id,
                                Type  = discreteMeasurement.GetMeasurementType(),
                                Value = discreteMeasurement.GetCurrentValue()
                            });
                        }
                    }


                    if (!uIModel.Nodes.ContainsKey(element.Id))
                    {
                        UINode newUINode = new UINode()
                        {
                            Id             = element.Id,
                            Name           = element.Name,
                            Mrid           = element.Mrid,
                            Description    = element.Description,
                            DMSType        = element.DmsType,
                            NominalVoltage = element.NominalVoltage,
                            Measurements   = measurements,
                            IsActive       = element.IsActive,
                            IsRemote       = element.IsRemote,
                            NoReclosing    = element.NoReclosing
                        };
                        uIModel.AddNode(newUINode);
                    }
                }
Example #4
0
 public Task AddDiscreteMeasurement(DiscreteMeasurement discreteMeasurement)
 {
     return(InvokeWithRetryAsync(client => client.Channel.AddDiscreteMeasurement(discreteMeasurement)));
 }