public IHttpActionResult Get()
        {
            // set windings
            ((TransformerNodeViewModel)testNodes[2]).FirstWinding = new NodeViewModel {
                Id = "3", DMSType = "TRANSFORMERWINDING"
            };
            ((TransformerNodeViewModel)testNodes[2]).SecondWinding = new NodeViewModel {
                Id = "5", DMSType = "TRANSFORMERWINDING"
            };

            ((TransformerNodeViewModel)testNodes[5]).FirstWinding = new NodeViewModel {
                Id = "8", DMSType = "TRANSFORMERWINDING"
            };
            ((TransformerNodeViewModel)testNodes[5]).SecondWinding = new NodeViewModel {
                Id = "10", DMSType = "TRANSFORMERWINDING"
            };

            OmsGraphViewModel graph = new OmsGraphViewModel
            {
                Nodes     = testNodes,
                Relations = testRelations
            };

            return(Ok(graph));
        }
Пример #2
0
        public static OmsGraphViewModel RemoveNodes(this OmsGraphViewModel graph, IEnumerable <NodeViewModel> nodes)
        {
            foreach (var node in nodes)
            {
                graph.Nodes.Remove(node);
            }

            return(graph);
        }
Пример #3
0
        public static OmsGraphViewModel RemoveRelations(this OmsGraphViewModel graph, IEnumerable <RelationViewModel> relations)
        {
            foreach (var relation in relations)
            {
                graph.Relations.Remove(relation);
            }

            return(graph);
        }
Пример #4
0
        public OmsGraphViewModel Map(UIModel topologyModel)
        {
            OmsGraphViewModel graph = new OmsGraphViewModel();

            // map nodes
            foreach (KeyValuePair <long, UINode> keyValue in topologyModel.Nodes)
            {
                NodeViewModel graphNode = new NodeViewModel
                {
                    Id             = keyValue.Value.Id.ToString(),
                    Name           = keyValue.Value.Name,
                    Description    = keyValue.Value.Description,
                    Mrid           = keyValue.Value.Mrid,
                    IsActive       = keyValue.Value.IsActive,
                    DMSType        = keyValue.Value.DMSType,
                    IsRemote       = keyValue.Value.IsRemote,
                    NoReclosing    = keyValue.Value.NoReclosing,
                    NominalVoltage = keyValue.Value.NominalVoltage.ToString(),
                    Measurements   = new List <MeasurementViewModel>()
                };

                foreach (var measurement in keyValue.Value.Measurements)
                {
                    graphNode.Measurements.Add(new MeasurementViewModel()
                    {
                        Id        = measurement.Gid.ToString(),
                        Type      = measurement.Type,
                        Value     = measurement.Value,
                        AlarmType = AlarmType.NO_ALARM
                    });
                }

                graph.Nodes.Add(
                    graphNode.DMSType == PowerTransformerDmsTypeName
                    ? graphNode.ToTransformerNode()
                    : graphNode
                    );
            }

            // map relations
            foreach (KeyValuePair <long, HashSet <long> > keyValue in topologyModel.Relations)
            {
                foreach (long targetNodeId in keyValue.Value)
                {
                    RelationViewModel graphRelation = new RelationViewModel
                    {
                        SourceNodeId = keyValue.Key.ToString(),
                        TargetNodeId = targetNodeId.ToString(),
                        IsActive     = topologyModel.Nodes[keyValue.Key].IsActive || topologyModel.Nodes[targetNodeId].IsActive
                    };

                    graph.Relations.Add(graphRelation);
                }
            }

            return(graph.SquashTransformerWindings());
        }
        /// <summary>
        /// Maps the input topology object to a graph object and dispatches it
        /// to a Graph Hub endpoint
        /// </summary>
        /// <param name="message"></param>
        public void Notify(IPublishableMessage message)
        {
            if (message is TopologyForUIMessage topologyMessage)
            {
                OmsGraphViewModel graph = _mapper.Map(topologyMessage.UIModel);

                _dispatcher.Connect();
                try
                {
                    _dispatcher.NotifyGraphUpdate(graph.Nodes, graph.Relations);
                }
                catch (Exception)
                {
                    // retry ?
                }
            }
        }
        public async Task NotifyGraphUpdate(List <NodeViewModel> nodes, List <RelationViewModel> relations)
        {
            try
            {
                Logger.LogDebug($"{baseLogString} NotifyGraphUpdate => nodes count: {nodes.Count}, relations count: {relations.Count}");

                var omsGraphData = new OmsGraphViewModel {
                    Nodes = nodes, Relations = relations
                };
                var jsonOutput = JsonConvert.SerializeObject(omsGraphData);
                await this.connection.InvokeAsync("NotifyGraphUpdate", jsonOutput);

                Logger.LogDebug($"{baseLogString} NotifyGraphUpdate => json output sent to graph hub: {jsonOutput}");
            }
            catch (Exception e)
            {
                Logger.LogError($"{baseLogString} NotifyGraphUpdate => Exception: {e.Message}", e);
            }
        }
Пример #7
0
        public static OmsGraphViewModel ResolveWindings(
            this OmsGraphViewModel graph,
            IEnumerable <RelationViewModel> firstWindingRelations,
            IEnumerable <RelationViewModel> secondWindingRelations)
        {
            foreach (var firstWindingRelation in firstWindingRelations)
            {
                NodeViewModel firstWinding
                    = graph
                      .Nodes
                      .First(x => x.Id.Equals(firstWindingRelation.SourceNodeId));

                TransformerNodeViewModel transformer
                    = graph
                      .Nodes
                      .First(x => x.Id.Equals(firstWindingRelation.TargetNodeId))
                      as TransformerNodeViewModel;

                transformer.AddFirstWinding(firstWinding);
            }

            foreach (var secondWindingRelation in secondWindingRelations)
            {
                NodeViewModel secondWinding
                    = graph
                      .Nodes
                      .First(x => x.Id.Equals(secondWindingRelation.TargetNodeId));

                TransformerNodeViewModel transformer
                    = graph
                      .Nodes
                      .First(x => x.Id.Equals(secondWindingRelation.SourceNodeId))
                      as TransformerNodeViewModel;

                transformer.AddSecondWinding(secondWinding);
            }

            return(graph);
        }
Пример #8
0
        public void GivenTopology_WhenSquashWindings_ShouldSquash()
        {
            OmsGraphViewModel graph = new OmsGraphViewModel();

            graph.Nodes     = initialNodes;
            graph.Relations = initialRelations;

            OmsGraphViewModel resultGraph = graph.SquashTransformerWindings();

            Assert.NotNull(resultGraph);
            Assert.Equal(resultNodes.Count, resultGraph.Nodes.Count);
            Assert.Equal(resultRelations.Count, resultGraph.Relations.Count);

            Assert.Equal(
                ((TransformerNodeViewModel)resultNodes[2]).FirstWinding,
                ((TransformerNodeViewModel)resultGraph.Nodes[2]).FirstWinding
                );

            Assert.Equal(
                ((TransformerNodeViewModel)resultNodes[5]).FirstWinding,
                ((TransformerNodeViewModel)resultGraph.Nodes[5]).FirstWinding
                );
        }
Пример #9
0
        public async Task <IHttpActionResult> Get()
        {
            OmsGraphViewModel graph = await _mediator.Send <OmsGraphViewModel>(new GetTopologyQuery());

            return(Ok(graph));
        }
Пример #10
0
        public static OmsGraphViewModel SquashTransformerWindings(this OmsGraphViewModel graph)
        {
            IEnumerable <TransformerNodeViewModel> transformerNodes
                = graph
                  .Nodes
                  .Where(x => x.DMSType.Equals(PowerTransformerDmsTypeName))
                  ?.Select(n => n as TransformerNodeViewModel)
                  ?.ToList();

            IEnumerable <NodeViewModel> windingNodes
                = graph
                  .Nodes
                  .Where(x => x.DMSType.Equals(TransformerWindingDmsTypeName))
                  ?.ToList();

            IEnumerable <RelationViewModel> firstWindingRelations
                = graph
                  .Relations
                  .Where(x => windingNodes.Any(w => w.Id.Equals(x.SourceNodeId)))
                  .Where(x => transformerNodes.Any(t => t.Id.Equals(x.TargetNodeId)))
                  ?.ToList();

            IEnumerable <RelationViewModel> secondWindingRelations
                = graph
                  .Relations
                  .Where(x => windingNodes.Any(w => w.Id.Equals(x.TargetNodeId)))
                  .Where(x => transformerNodes.Any(t => t.Id.Equals(x.SourceNodeId)))
                  ?.ToList();

            IEnumerable <RelationViewModel> firstWindingSourceRelations
                = graph
                  .Relations
                  .Where(x => firstWindingRelations.Any(f => f.SourceNodeId.Equals(x.TargetNodeId)))
                  ?.Select(x =>
                           new RelationViewModel
            {
                SourceNodeId = x.SourceNodeId,
                TargetNodeId = firstWindingRelations
                               ?.First(f => f.SourceNodeId.Equals(x.TargetNodeId))
                               ?.TargetNodeId,
                IsActive = x.IsActive
            }
                           )
                  ?.ToList();

            IEnumerable <RelationViewModel> secondWindingTargetRelations
                = graph
                  .Relations
                  .Where(x => secondWindingRelations.Any(f => f.TargetNodeId.Equals(x.SourceNodeId)))
                  ?.Select(x =>
                           new RelationViewModel
            {
                TargetNodeId = x.TargetNodeId,
                SourceNodeId = secondWindingRelations
                               ?.First(f => f.TargetNodeId.Equals(x.SourceNodeId))
                               ?.SourceNodeId,
                IsActive = x.IsActive
            }
                           )
                  ?.ToList();

            IEnumerable <RelationViewModel> windingRelationsForDelete
                = graph
                  .Relations
                  .Where(x => windingNodes
                         .Any(w =>
                              x.SourceNodeId.Equals(w.Id) ||
                              x.TargetNodeId.Equals(w.Id))
                         )
                  .ToList();

            graph.ResolveWindings(firstWindingRelations, secondWindingRelations);

            graph.RemoveNodes(windingNodes);

            graph.RemoveRelations(firstWindingRelations);
            graph.RemoveRelations(secondWindingRelations);
            graph.RemoveRelations(windingRelationsForDelete);

            graph.AddRelations(firstWindingSourceRelations);
            graph.AddRelations(secondWindingTargetRelations);

            return(graph);
        }
Пример #11
0
        public async Task Notify(IPublishableMessage message, string publisherName)
        {
            if (message is ActiveOutageMessage activeOutage)
            {
                Logger.LogInformation($"{baseLogString} Notify => ActiveOutageMessageReceived. OutageId: 0x{activeOutage.OutageId:x16} ElementId: 0x{activeOutage.OutageElementGid}");
                var outageDispatcher = new OutageHubDispatcher(_outageMapper);
                outageDispatcher.Connect();

                try
                {
                    await outageDispatcher.NotifyActiveOutageUpdate(activeOutage);
                }
                catch (Exception e)
                {
                    string errorMessage = $"{baseLogString} Notify => exception {e.Message}";
                    Logger.LogError(errorMessage, e);
                }
            }
            else if (message is ArchivedOutageMessage archivedOutage)
            {
                var outageDispatcher = new OutageHubDispatcher(_outageMapper);
                outageDispatcher.Connect();

                try
                {
                    await outageDispatcher.NotifyArchiveOutageUpdate(archivedOutage);
                }
                catch (Exception e)
                {
                    string errorMessage = $"{baseLogString} Notify => exception {e.Message}";
                    Logger.LogError(errorMessage, e);
                }
            }
            else if (message is TopologyForUIMessage topologyMessage)
            {
                OmsGraphViewModel graph = _graphMapper.Map(topologyMessage.UIModel);

                var graphDispatcher = new GraphHubDispatcher();
                graphDispatcher.Connect();

                try
                {
                    await graphDispatcher.NotifyGraphUpdate(graph.Nodes, graph.Relations);
                }
                catch (Exception e)
                {
                    string errorMessage = $"{baseLogString} Notify => exception {e.Message}";
                    Logger.LogError(errorMessage, e);
                }
            }
            else if (message is MultipleAnalogValueSCADAMessage analogValuesMessage)
            {
                Dictionary <long, AnalogModbusData> analogModbusData = new Dictionary <long, AnalogModbusData>(analogValuesMessage.Data);

                var scadaDispatcher = new ScadaHubDispatcher();
                scadaDispatcher.Connect();

                try
                {
                    await scadaDispatcher.NotifyScadaDataUpdate(analogModbusData);
                }
                catch (Exception e)
                {
                    string errorMessage = $"{baseLogString} Notify => exception {e.Message}";
                    Logger.LogError(errorMessage, e);
                }
            }
        }