Beispiel #1
0
        private async void AskPersistDeviceMetric(object state)
        {
            IOptionsSnapshot <CoreOptions> coreOptions =
                this.serviceProvider.GetRequiredService <IOptionsSnapshot <CoreOptions> >();
            IOptionsSnapshot <DeviceOptions> deviceOptions =
                this.serviceProvider.GetRequiredService <IOptionsSnapshot <DeviceOptions> >();

            using BjdireContext db = this.serviceProvider.GetRequiredService <BjdireContext>();

            foreach (DeviceOptionsEntry d in deviceOptions.Value.Devices)
            {
                try
                {
                    byte[] id = d.ComputeIdBinary();
                    if (this.plcManager.PlcDictionary.TryGetValue(ByteString.CopyFrom(id), out PlcClient client))
                    {
                        this.logger.LogInformation("Ask metric for {0}({1})", d.Id, d.Name);

                        GrpcMetric metric = await client
                                            .GetMetricAsync(
                            new GetMetricRequest(),
                            DateTime.UtcNow.AddMilliseconds(
                                coreOptions.Value.DefaultReadTimeoutMillis))
                                            .ConfigureAwait(false);

                        var m = new ModelMetric
                        {
                            DeviceId = BitConverter.ToString(id),
                        };
                        metric.AssignTo(m);

                        db.Metrics.Add(m);
                    }
                    else
                    {
                        this.logger.LogWarning(
                            "Failed to ask metric for {0}({1}), currently offline.",
                            d.Id,
                            d.Name);
                    }
                }
                catch (RpcException e)
                {
                    this.logger.LogWarning(e, "Failed to ask metric for {0}({1})", d.Id, d.Name);
                }
            }

            db.SaveChanges();
        }
Beispiel #2
0
        public override Task <ListAlarmChangesResponse> ListAlarmChanges(
            ListAlarmChangesRequest request,
            ServerCallContext context)
        {
            string id = BitConverter.ToString(request.DeviceId.ToByteArray());

            DateTimeOffset endDateTime;

            if (string.IsNullOrEmpty(request.PageToken))
            {
                endDateTime = request.EndTime?.ToDateTimeOffset() ?? DateTimeOffset.UtcNow;
            }
            else
            {
                endDateTime = DateTimeOffset.Parse(request.PageToken, CultureInfo.InvariantCulture);
            }

            endDateTime = endDateTime.ToUniversalTime();
            DateTimeOffset?startDateTime = request.StartTime?.ToDateTimeOffset().ToUniversalTime();

            var response = new ListAlarmChangesResponse();

            using (BjdireContext db = this.serviceProvider.GetRequiredService <BjdireContext>())
            {
                var alarmChanges = (from m in db.AlarmChanges
                                    where m.DeviceId == id &&
                                    (startDateTime == null || startDateTime <= m.Timestamp) &&
                                    m.Timestamp <= endDateTime
                                    orderby m.Timestamp descending
                                    select m)
                                   .Take(request.PageSize)
                                   .ToList();
                response.AlarmChanges.AddRange(alarmChanges.Select(alarmChange =>
                {
                    var m = new GrpcAlarmChange();
                    m.AssignFrom(alarmChange);
                    return(m);
                }));

                if (alarmChanges.Count == request.PageSize && alarmChanges.Last().Timestamp > startDateTime)
                {
                    response.NextPageToken = alarmChanges.Last().Timestamp
                                             .ToUniversalTime()
                                             .ToString(CultureInfo.InvariantCulture);
                }
            }

            return(Task.FromResult(response));
        }
Beispiel #3
0
        private async void AskPersistDeviceAlarm(object state)
        {
            IOptionsSnapshot <CoreOptions> coreOptions =
                this.serviceProvider.GetRequiredService <IOptionsSnapshot <CoreOptions> >();
            IOptionsSnapshot <DeviceOptions> deviceOptions =
                this.serviceProvider.GetRequiredService <IOptionsSnapshot <DeviceOptions> >();

            using BjdireContext db = this.serviceProvider.GetRequiredService <BjdireContext>();

            foreach (DeviceOptionsEntry d in deviceOptions.Value.Devices)
            {
                try
                {
                    byte[] id       = d.ComputeIdBinary();
                    string deviceId = BitConverter.ToString(id);
                    if (this.plcManager.PlcDictionary.TryGetValue(ByteString.CopyFrom(id), out PlcClient client))
                    {
                        this.logger.LogInformation("Ask alarm for {0}({1})", d.Id, d.Name);

                        GrpcAlarm alarm = await client
                                          .GetAlarmAsync(
                            new GetAlarmRequest(),
                            DateTime.UtcNow.AddMilliseconds(
                                coreOptions.Value.DefaultReadTimeoutMillis))
                                          .ConfigureAwait(false);

                        var m = new ModelAlarm
                        {
                            DeviceId = deviceId,
                        };
                        alarm.AssignTo(m);

                        ModelAlarm lastKnownAlarmInfo = (
                            from mm in db.Alarms
                            where mm.DeviceId == deviceId
                            orderby mm.Timestamp descending
                            select mm)
                                                        .FirstOrDefault();

                        if (lastKnownAlarmInfo == null)
                        {
                            lastKnownAlarmInfo = new ModelAlarm();
                        }

                        db.AlarmChanges.AddRange(ComputeAlarmChanges(deviceId, lastKnownAlarmInfo, m));

                        db.Alarms.Add(m);
                    }
                    else
                    {
                        this.logger.LogWarning(
                            "Failed to ask alarm for {0}({1}), currently offline.",
                            d.Id,
                            d.Name);
                    }
                }
                catch (RpcException e)
                {
                    this.logger.LogWarning(e, "Failed to ask alarm for {0}({1})", d.Id, d.Name);
                }
            }

            db.SaveChanges();
        }