public Alarm GetLatestAlarmByType(string deviceId, Alarm.Type type, Alarm.Gravity?gravity)
        {
            IEnumerable <BsonDocument> pipeline = GetPipeline(deviceId, type, gravity);
            PipelineDefinition <Site, BsonDocument> pipelineDefinition = PipelineDefinition <Site, BsonDocument> .Create(pipeline);

            return(BsonIterator.Iterate(collection, pipelineDefinition, (BsonDocument e, Alarm item) => BsonSerializer.Deserialize <SingleBsonItem <Alarm> >(e).Item));
        }
        private IEnumerable <BsonDocument> GetPipeline(string deviceId, Alarm.Type type, Alarm.Gravity?gravity)
        {
            IList <BsonDocument> pipeline = new List <BsonDocument>();

            BsonDocument unwindDeviceStage = new BsonDocument("$unwind", "$Devices");

            pipeline.Add(unwindDeviceStage);

            BsonDocument projectDevicesStage = new BsonDocument("$project", new BsonDocument
            {
                { "_id", 0 },
                { "Device", "$Devices" }
            });

            pipeline.Add(projectDevicesStage);

            BsonDocument matchDeviceStage = new BsonDocument("$match", new BsonDocument("Device.Id", deviceId));

            pipeline.Add(matchDeviceStage);

            BsonDocument unwindAlarmsStage = new BsonDocument("$unwind", "$Device.Alarms");

            pipeline.Add(unwindAlarmsStage);

            BsonDocument projectAlarmsStage = new BsonDocument("$project", new BsonDocument
            {
                { "_id", 0 },
                { "Item", "$Device.Alarms" }
            });

            pipeline.Add(projectAlarmsStage);

            BsonDocument matchAlarmStage = new BsonDocument("$match", new BsonDocument
            {
                { "Item.IsActive", true },
                { "Item.AlarmType", type }
            });

            pipeline.Add(matchAlarmStage);

            if (gravity.HasValue)
            {
                BsonDocument matchGravityStage = new BsonDocument("$match", new BsonDocument
                {
                    { "Item.AlarmGravity", gravity.Value }
                });
                pipeline.Add(matchGravityStage);
            }

            return(pipeline);
        }
        private void CreateAlarm(string deviceId, string siteId, Alarm.Type alarmType, Alarm.AlarmSubtype subtype, Alarm.Gravity alarmGravity, string shortDescription, string description)
        {
            Alarm alarm = new Alarm()
            {
                Id               = $"{deviceId}-{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}",
                DeviceId         = deviceId,
                SiteId           = siteId,
                IsActive         = true,
                AlarmType        = alarmType,
                AlarmGravity     = alarmGravity,
                OccuredAt        = DateTime.UtcNow,
                ShortDescription = shortDescription,
                Description      = description,
                Subtype          = subtype
            };

            deviceRepository.AddAlarm(deviceId, alarm);
        }
        public Alarm CreateAlarm(string deviceId, string siteId, Alarm.Type alarmType, Alarm.Gravity alarmGravity, string shortDescription, string description, DateTime?start, DateTime?end)
        {
            Alarm alarm = new Alarm()
            {
                Id               = $"{deviceId}-alarm{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}",
                DeviceId         = deviceId,
                SiteId           = siteId,
                IsActive         = true,
                AlarmType        = alarmType,
                AlarmGravity     = alarmGravity,
                OccuredAt        = DateTime.UtcNow,
                ShortDescription = shortDescription,
                Description      = description,
                Start            = start,
                End              = end
            };

            deviceRepository.AddAlarm(deviceId, alarm);

            return(alarm);
        }