Exemplo n.º 1
0
        public static async Task Process(Event @event)
        {
            if (@event.OnHold)
            {
                return;
            }

            string title;
            string message;

            string  thingId;
            Gateway gateway;
            long    locationId;

            IEnumerable <Measure> measures;

            long recentMeasuresSum, oldMeasuresSum, olderMeasuresSum, delta;

            switch (@event.EventType)
            {
            case Models.EventType.Threshold:
                thingId    = "EMSfIIoT:" + @event.Variable.Split(":").First();
                gateway    = BoschIoTSuiteApiConnector.gateways.Where(gateway => gateway.thingId.Equals(thingId)).First();
                locationId = gateway.attributes.configuration.devices.Where(device => device.deviceId.Equals(@event.Variable)).First().locationId;

                MeasuresApiConnector.GetDeviceLastMeasures(locationId, out measures);
                recentMeasuresSum = measures.Sum(measure => measure.Value);

                MeasuresApiConnector.GetDeviceLastMeasures(locationId, out measures, 1);
                oldMeasuresSum = measures.Sum(measure => measure.Value);

                delta = recentMeasuresSum - oldMeasuresSum;

                title = "Device threshold";

                switch (@event.EventValueType)
                {
                case EventValueType.EqualTo:
                    if (delta == @event.EventValue)
                    {
                        message = $"Your device {@event.Variable} read equaled the defined threshold {@event.EventValue}";
                        break;
                    }
                    else
                    {
                        return;
                    }

                case EventValueType.GreaterThan:
                    if (delta > @event.EventValue)
                    {
                        message = $"Your device {@event.Variable} read surpassed the defined threshold {@event.EventValue}";
                        break;
                    }
                    else
                    {
                        return;
                    }

                case EventValueType.GreaterThanOrEqualTo:
                    if (delta >= @event.EventValue)
                    {
                        message = $"Your device {@event.Variable} read surpassed or equaled the defined threshold {@event.EventValue}";
                        break;
                    }
                    else
                    {
                        return;
                    }

                case EventValueType.LessThan:
                    if (delta < @event.EventValue)
                    {
                        message = $"Your device {@event.Variable} read falled behind the defined threshold {@event.EventValue}";
                        break;
                    }
                    else
                    {
                        return;
                    }

                case EventValueType.LessThanOrEqualTo:
                    if (delta <= @event.EventValue)
                    {
                        message = $"Your device {@event.Variable} read falled behind or equaled the defined threshold {@event.EventValue}";
                        break;
                    }
                    else
                    {
                        return;
                    }

                case EventValueType.NotEqualTo:
                    if (delta != @event.EventValue)
                    {
                        message = $"Your device {@event.Variable} read differed the the defined threshold {@event.EventValue}";
                        break;
                    }
                    else
                    {
                        return;
                    }

                default:
                    return;
                }
                break;

            case Models.EventType.Inactive:
                gateway    = BoschIoTSuiteApiConnector.gateways.Where(gateway => gateway.thingId.Equals(@event.Variable)).First();
                locationId = gateway.attributes.configuration.devices.First().locationId;

                MeasuresApiConnector.GetDeviceLastMeasures(locationId, out var lastRead);
                DateTime lastMeasureDate = lastRead.First().TimeStamp;

                if (lastMeasureDate.AddMinutes(@event.EventValue) < DateTime.UtcNow)
                {
                    message = $"Your gateway {@event.Variable} last communication was {Math.Floor(DateTime.UtcNow.Subtract(lastMeasureDate).TotalMinutes)} minutes ago";
                    title   = "Gateway inactive";
                    break;
                }
                else
                {
                    return;
                }

            case Models.EventType.Algorithm:
                thingId    = "EMSfIIoT:" + @event.Variable.Split(":").First();
                gateway    = BoschIoTSuiteApiConnector.gateways.Where(gateway => gateway.thingId.Equals(thingId)).First();
                locationId = gateway.attributes.configuration.devices.Where(device => device.deviceId.Equals(@event.Variable)).First().locationId;

                double percentage;
                double multiplier;
                string timeSpan;

                switch (@event.EventFrequency)
                {
                case EventFrequency.Every15Minutes:
                    multiplier = 1 / 4.0;
                    timeSpan   = "15 minutes";
                    break;

                case EventFrequency.Every30Minutes:
                    multiplier = 1 / 2.0;
                    timeSpan   = "30 minutes";
                    break;

                case EventFrequency.EveryHour:
                    multiplier = 1;
                    timeSpan   = "hour";
                    break;

                case EventFrequency.Every6Hours:
                    multiplier = 6;
                    timeSpan   = "6 hours";
                    break;

                case EventFrequency.EveryDay:
                    multiplier = 24;
                    timeSpan   = "day";
                    break;

                case EventFrequency.EveryWeek:
                    multiplier = 24 * 7;
                    timeSpan   = "week";
                    break;

                default:
                    return;
                }

                MeasuresApiConnector.GetDeviceLastMeasures(locationId, out measures);
                recentMeasuresSum = measures.Sum(measure => measure.Value);

                MeasuresApiConnector.GetDeviceMeasures(locationId, out measures, Convert.ToInt32(multiplier * 60));

                MeasuresApiConnector.GetDeviceLastMeasures(locationId, out measures, measures.Count());
                oldMeasuresSum = measures.Sum(measure => measure.Value);

                MeasuresApiConnector.GetDeviceMeasures(locationId, out measures, Convert.ToInt32(2 * multiplier * 60));

                MeasuresApiConnector.GetDeviceLastMeasures(locationId, out measures, measures.Count());
                olderMeasuresSum = measures.Sum(measure => measure.Value);

                if (oldMeasuresSum != olderMeasuresSum)
                {
                    percentage = Convert.ToDouble(recentMeasuresSum - oldMeasuresSum) / Convert.ToDouble(oldMeasuresSum - olderMeasuresSum);
                }
                else
                {
                    percentage = double.PositiveInfinity;
                }

                if (Math.Abs(percentage) > @event.EventValue)
                {
                    message = $"Your device {@event.Variable} read from the last {timeSpan} differed the previous one more than the defined threshold of {@event.EventValue}%. Difference was {percentage}%.";
                }
                else
                {
                    return;
                }

                title = "Device threshold";

                break;

            default:
                return;
            }
            await SendNotificationToUser("APINotification", title, message, @event);


            await _events.PutEventOnHold(@event.Id);
        }