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(); }
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)); }
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(); }