Ejemplo n.º 1
0
        /// <summary>
        /// Due to some performance issues with version of EBO prior to 2.0, we will limit the amount of points that can be consumed out of EBO versions
        /// prior to 2.0 to 100. No limit for point count in version 2.0 and above.
        /// </summary>
        private bool EvaluatePerformanceImpact(List <Signal> signals)
        {
            try
            {
                // We save this right away so we can execute this setup processor from the value push processor if it is not running
                Cache.AddOrUpdateItem(this.ConfigurationId, "SetupProcessorConfigurationId", this.CacheTenantId, 0);
                var response   = ManagedEwsClient.GetWebServiceInformation(EboEwsSettings);
                var eboVersion = new Version(response.GetWebServiceInformationSystem.Version);
                if (eboVersion.Major > 1)
                {
                    _signalsToUse = signals;
                }
                else
                {
                    if (signals.Count > 100)
                    {
                        Prompts.Add(new Prompt
                        {
                            Severity = PromptSeverity.MayContinue,
                            Message  = $"Due to performance concerns, only 100 points out of {signals.Count} can be consumed when using EBO versions prior to 2.0. Please update your EBO to version 2.0 or greater to get the full functionality of the EBO IoT Edge Smart Connector Extension."
                        });
                    }

                    _signalsToUse = signals.Take(100).ToList();
                }
                return(true);
            }
            catch (Exception ex)
            {
                Logger.LogError(LogCategory.Processor, this.Name, ex.ToString());
                return(false);
            }
        }
Ejemplo n.º 2
0
        private void GetAndUpdateInitialPropertiesForSignals(List <Signal> signals)
        {
            var newSignals = new List <Signal>();

            Logger.LogTrace(LogCategory.Processor, this.Name, $"Getting units for all signals.. {signals.Count} total.");
            // Get list of signals that have not been previously discovered
            var newSignalsLeftToAdd = signals.Where(a => !Signals.Select(b => b.EwsId).Contains(a.EwsId)).ToList();

            Logger.LogTrace(LogCategory.Processor, this.Name, $"Found, {newSignalsLeftToAdd.Count} total to add.");
            while (newSignalsLeftToAdd.Any())
            {
                Logger.LogTrace(LogCategory.Processor, this.Name, $"Found, {newSignalsLeftToAdd.Count} left to add.");
                if (IsCancellationRequested)
                {
                    return;
                }
                try
                {
                    var response         = ManagedEwsClient.GetItems(EboEwsSettings, newSignalsLeftToAdd.Take(100).Select(a => a.EwsId).ToArray());
                    var successfulValues = response.GetItemsItems.ValueItems?.ToList();
                    AddSuccessfulSignalsToCache(signals, successfulValues, newSignals);

                    // The below code is a workaround for EBO timing out on GetItems for many values, and returning either an INVALID_ID or TIMEOUT error when the values are in fact valid. We need to make sure we discover as many as possible, so let's loop until we do.
                    // We will do this as long as at least 1 value from the request was successful.
                    while (successfulValues != null && successfulValues.Any() && response.GetItemsErrorResults != null && response.GetItemsErrorResults.Any(a => a.Message == "INVALID_ID" || a.Message == "TIMEOUT"))
                    {
                        response         = ManagedEwsClient.GetItems(EboEwsSettings, response.GetItemsErrorResults.Where(a => a.Message == "INVALID_ID" || a.Message == "TIMEOUT").Select(a => a.Id).ToArray());
                        successfulValues = response.GetItemsItems.ValueItems?.ToList();
                        AddSuccessfulSignalsToCache(signals, successfulValues, newSignals);
                    }

                    var valuesToRetry = UpdateInvalidEwsIdsForRetry(signals, response);

                    response         = ManagedEwsClient.GetItems(EboEwsSettings, valuesToRetry.Select(a => a.EwsId).ToArray());
                    successfulValues = response.GetItemsItems.ValueItems?.ToList();
                    AddSuccessfulSignalsToCache(signals, successfulValues, newSignals);

                    foreach (var value in response.GetItemsErrorResults.ToList())
                    {
                        Prompts.Add(new Prompt {
                            Message = $"Error getting value, this value will not be pushed: {value.Id} - {value.Message}", Severity = PromptSeverity.MayNotContinue
                        });
                    }
                }
                catch (Exception ex)
                {
                    Logger.LogError(LogCategory.Processor, this.Name, ex.ToString());
                    Prompts.Add(ex.ToPrompt());
                    // We will let it continue and see if everything else fails... Maybe some will work..
                }

                newSignalsLeftToAdd = newSignalsLeftToAdd.Skip(100).ToList();
            }

            signals.AddRange(newSignals);
            Signals = signals;

            SeedProcessorValues(signals);
        }
        private void GetAndUpdateInitialPropertiesForSignals(List <Signal> signals)
        {
            var newSignals = new List <Signal>();

            Logger.LogTrace(LogCategory.Processor, this.Name, "Getting units for all signals..");
            while (signals.Any())
            {
                if (IsCancellationRequested)
                {
                    return;
                }
                try
                {
                    var response         = ManagedEwsClient.GetItems(EboEwsSettings, signals.Take(500).Select(a => a.EwsId).ToArray());
                    var successfulValues = response.GetItemsItems.ValueItems.ToList();

                    foreach (var value in successfulValues)
                    {
                        var deviceSignal = signals.FirstOrDefault(a => a.EwsId == value.Id);
                        if (deviceSignal == null)
                        {
                            Logger.LogInfo(LogCategory.Processor, this.Name, $"Returned value does not exist in the list known signals..");
                        }
                        else
                        {
                            Enum.TryParse(value.Type, true, out EwsValueTypeEnum type);
                            Enum.TryParse(value.Writeable, true, out EwsValueWriteableEnum writeable);
                            Enum.TryParse(value.Forceable, true, out EwsValueForceableEnum forceable);
                            deviceSignal.Type      = type;
                            deviceSignal.Unit      = value.Unit;
                            deviceSignal.Writeable = writeable;
                            deviceSignal.Forceable = forceable;
                            newSignals.Add(deviceSignal);
                        }
                    }

                    foreach (var value in response.GetItemsErrorResults.ToList())
                    {
                        Prompts.Add(new Prompt {
                            Message = $"Error getting value, this value will not be pushed: {value.Id} - {value.Message}", Severity = PromptSeverity.MayNotContinue
                        });
                    }
                }
                catch (Exception ex)
                {
                    Logger.LogError(LogCategory.Processor, this.Name, ex.ToString());
                    Prompts.Add(ex.ToPrompt());
                    // We will let it continue and see if everything else fails... Maybe some will work..
                }

                signals = signals.Skip(500).ToList();
            }

            Signals = newSignals;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Due to some performance issues with version of EBO prior to 2.0, we will limit the amount of points that can be consumed out of EBO versions
        /// prior to 2.0 to 100. No limit for point count in version 2.0 and above.
        /// </summary>
        private void EvaluatePerformanceImpact(List <Signal> signals)
        {
            var eboVersion = new Version(ManagedEwsClient.GetWebServiceInformation(EboEwsSettings).GetWebServiceInformationSystem.Version);

            if (eboVersion.Major > 1)
            {
                Signals = signals;
            }
            else
            {
                if (signals.Count > 100)
                {
                    Prompts.Add(new Prompt
                    {
                        Severity = PromptSeverity.MayContinue,
                        Message  = $"Due to performance concerns, only 100 points out of {signals.Count} can be consumed when using EBO versions prior to 2.0. Please update your EBO to version 2.0 or greater to get the full functionality of the EBO IoT Edge Smart Connector Extension."
                    });
                }

                Signals = signals.Take(100).ToList();
            }
        }