private async Task <bool> SendCommands(IsolationAlgorithm algorithm, Dictionary <long, DiscreteCommandingType> commands, Dictionary <long, CommandedElement> commandedElements) { var algorithmBaseLogString = $"{baseLogString} [HeadBreakerGid: 0x{algorithm.HeadBreakerGid:X16}]"; if (!await lifecycleHelper.SendMultipleScadaCommandAsync(commands, commandedElements, CommandOriginType.ISOLATING_ALGORITHM_COMMAND)) { string message = $"{algorithmBaseLogString} StartIndividualAlgorithmCycle => Sending multiple command failed."; Logger.LogError(message); return(false); } commands.Keys.ToList().ForEach(async commandedElementGid => { var commandedElement = new CommandedElement() { ElementGid = commandedElementGid, CorrespondingHeadElementGid = algorithm.HeadBreakerGid, CommandingType = commands[commandedElementGid], }; await CommandedElements.SetAsync(commandedElementGid, commandedElement); await ElementsToBeIgnoredInReportPotentialOutage.SetAsync(commandedElementGid, DateTime.UtcNow); Logger.LogDebug($"{algorithmBaseLogString} SendCommands => Element 0x{commandedElementGid:X16} set to collection '{ReliableDictionaryNames.ElementsToBeIgnoredInReportPotentialOutage}' at {DateTime.UtcNow}."); }); await StartedIsolationAlgorithms.SetAsync(algorithm.HeadBreakerGid, algorithm); return(true); }
private async Task <bool> CheckPreconditions(long elementGid, CommandOriginType commandOriginType, List <long> affectedConsumersGids, IHistoryDBManagerContract historyDBManagerClient) { if (this.ignorableCommandOriginTypes.Contains(commandOriginType)) { Logger.LogDebug($"{baseLogString} CheckPreconditions => ignorable command origin type: {commandOriginType}"); return(false); } if (await ElementsToBeIgnoredInReportPotentialOutage.ContainsKeyAsync(elementGid)) { Logger.LogWarning($"{baseLogString} CheckPreconditions => ElementGid 0x{elementGid:X16} found in '{ReliableDictionaryNames.ElementsToBeIgnoredInReportPotentialOutage}'."); if ((await ElementsToBeIgnoredInReportPotentialOutage.TryRemoveAsync(elementGid)).HasValue) { Logger.LogDebug($"{baseLogString} CheckPreconditions => ElementGid 0x{elementGid:X16} removed form '{ReliableDictionaryNames.ElementsToBeIgnoredInReportPotentialOutage}'"); } return(false); } if (await OptimumIsolationPoints.ContainsKeyAsync(elementGid)) { Logger.LogWarning($"{baseLogString} CheckPreconditions => ElementGid 0x{elementGid:X16} found in '{ReliableDictionaryNames.OptimumIsolationPoints}'."); return(false); } if (affectedConsumersGids.Count == 0) { await OnZeroAffectedConsumersCase(elementGid, historyDBManagerClient); Logger.LogWarning($"{baseLogString} ReportPotentialOutage => There is no affected consumers => outage report is not valid. ElementGid: 0x{elementGid:X16}, CommandOriginType: {commandOriginType}"); return(false); } var outageModelAccessClient = OutageModelAccessClient.CreateClient(); var activeOutages = await outageModelAccessClient.GetAllActiveOutages(); if (activeOutages.Any(active => (active.OutageState == OutageState.CREATED && active.OutageElementGid == elementGid) || (active.OutageState != OutageState.CREATED && active.DefaultIsolationPoints.Any(point => point.EquipmentId == elementGid)))) { Logger.LogWarning($"{baseLogString} ReportPotentialOutage => duplicate... ElementGID: 0x{elementGid:X16}"); return(false); } return(true); }