public ActionResult <GetNextTaskResponse> Post(GetNextTask request) { GetNextTaskResponse ret = new GetNextTaskResponse(); lock (host) { GXSelectArgs arg = GXSelectArgs.Select <GXTask>(c => c.Id, q => q.Start == DateTime.MinValue); arg.Joins.AddInnerJoin <GXTask, GXObject>(a => a.Object, b => b.Id); arg.Joins.AddInnerJoin <GXObject, GXDevice>(a => a.DeviceId, b => b.Id); //Don't get meters that are mapped to other readers. arg.Joins.AddLeftJoin <GXDevice, GXDeviceToReader>(a => a.Id, b => b.DeviceId); if (request.DeviceId != 0) { arg.Where.And <GXDevice>(q => q.Id == request.DeviceId); } if (!request.Listener) { arg.Where.And <GXDevice>(q => q.Dynamic == false); } arg.OrderBy.Add <GXTask>(q => q.Id); GXSelectArgs onProgress = GXSelectArgs.Select <GXObject>(c => c.DeviceId, q => q.Removed == DateTime.MinValue); onProgress.Joins.AddInnerJoin <GXTask, GXObject>(a => a.Object, b => b.Id); onProgress.Where.And <GXTask>(q => q.Start != DateTime.MinValue && q.End == DateTime.MinValue); arg.Where.And <GXObject>(q => !GXSql.Exists <GXObject, GXDevice>(a => a.DeviceId, b => b.Id, onProgress)); GXTask task = host.Connection.SingleOrDefault <GXTask>(arg); if (task != null) { //Get task device ID and creation time. arg = GXSelectArgs.SelectAll <GXTask>(q => q.Id == task.Id); arg.Columns.Add <GXObject>(); arg.Joins.AddInnerJoin <GXTask, GXObject>(a => a.Object, b => b.Id); arg.Joins.AddInnerJoin <GXObject, GXDevice>(a => a.DeviceId, b => b.Id); task = host.Connection.SingleOrDefault <GXTask>(arg); //Get all tasks that are created at the same time for same meter. arg = GXSelectArgs.SelectAll <GXTask>(q => q.Generation == task.Generation); arg.Where.And <GXDevice>(q => q.Id == task.Object.DeviceId); arg.Where.And <GXObject>(q => q.Removed == DateTime.MinValue); arg.Columns.Add <GXObject>(); arg.Columns.Add <GXDevice>(); arg.Columns.Add <GXAttribute>(); arg.Joins.AddInnerJoin <GXTask, GXObject>(a => a.Object, b => b.Id); arg.Joins.AddInnerJoin <GXObject, GXDevice>(a => a.DeviceId, b => b.Id); arg.Joins.AddInnerJoin <GXObject, GXAttribute>(a => a.Id, b => b.ObjectId); ret.Tasks = host.Connection.Select <GXTask>(arg).ToArray(); DateTime now = DateTime.Now; foreach (GXTask it in ret.Tasks) { it.Start = now; host.Connection.Update(GXUpdateArgs.Update(it, q => q.Start)); } host.SetChange(TargetType.Tasks, DateTime.Now); } } return(ret); }
internal static void Read(ILogger _logger, System.Net.Http.HttpClient client, GXDLMSReader reader, GXTask task, IGXMedia net, GXDLMSObject obj) { AddValue v; System.Net.Http.HttpResponseMessage response; if (_logger != null) { _logger.LogInformation("Reading: " + obj.ToString()); } Console.WriteLine("Reading: " + obj.ToString()); object val; if (obj.ObjectType == ObjectType.ProfileGeneric && task.Index == 2 && GetReadTime(task.Object) != DateTime.MinValue && IsSortedByDateTime(task.Object)) { //Read profile generic using range. DateTime now = DateTime.Now; now = now.AddSeconds(-now.Second); now = now.AddMinutes(-now.Minute); now = now.AddHours(1); val = reader.ReadRowsByRange((GXDLMSProfileGeneric)obj, task.Object.Attributes[GetBufferIndex(task.Object)].Read, now); } else { val = reader.Read(obj, task.Index); } if (val is Enum) { //Enum values are saved as interger. val = Convert.ToString(Convert.ToInt32(val)); } else if (val is byte[]) { DataType dt = (DataType)task.Object.Attributes[GetBufferIndex(task.Object)].UIDataType; if (dt == DataType.String) { val = ASCIIEncoding.ASCII.GetString((byte[])val); } else if (dt == DataType.StringUTF8) { val = ASCIIEncoding.UTF8.GetString((byte[])val); } else { val = GXCommon.ToHex((byte[])val); } } else if (val is GXDateTime) { val = ((GXDateTime)val).ToFormatString(); } if (obj.ObjectType == ObjectType.ProfileGeneric && task.Index == 2) { //Make own value from each row. if (val != null) { UInt64 attributeId = task.Object.Attributes[GetBufferIndex(task.Object)].Id; List<GXValue> list = new List<GXValue>(); DateTime latest = task.Object.Attributes[GetBufferIndex(task.Object)].Read; DateTime first = latest; Boolean read = false; int period = -1; foreach (GXStructure row in (GXArray)val) { DateTime dt = DateTime.MinValue; task.Data = GXDLMSTranslator.ValueToXml(row); for (int pos = 0; pos != row.Count; ++pos) { if (row[pos] is byte[]) { row[pos] = GXDLMSClient.ChangeType((byte[])row[pos], DataType.DateTime); if (pos == 0) { dt = ((GXDateTime)row[pos]).Value.LocalDateTime; //If we have already read this row. if (dt <= first) { read = true; break; } if (dt > latest) { latest = dt; } } } //Some meters are returning null as date time to save bytes... if (pos == 0 && row[pos] == null) { if (period == -1) { period = GetCapturePeriod(task.Object); if (period == -1) { throw new Exception("Invalid capture period."); } } row[pos] = latest.AddMinutes(period); } } if (_logger != null) { _logger.LogInformation("Read: " + task.Data); } if (!read) { list.Add(new GXValue() { Read = dt, Value = task.Data, AttributeId = attributeId }); } } if (list.Count != 0) { v = new AddValue() { Items = list.ToArray() }; response = client.PostAsJsonAsync(Startup.ServerAddress + "/api/value/AddValue", v).Result; Helpers.CheckStatus(response); ListDevicesResponse r = response.Content.ReadAsAsync<ListDevicesResponse>().Result; } } } else { if (!(val is string)) { val = Convert.ToString(val); } task.Data = (string)val; if (_logger != null) { _logger.LogInformation("Read: " + (string)val); } int index = GetAttributeIndex(task.Object, task.Index); if (index != -1) { UInt64 attributeId = task.Object.Attributes[index].Id; v = new AddValue() { Items = new GXValue[] {new GXValue(){ AttributeId = attributeId, Read = DateTime.Now, Value = (string)val} } }; response = client.PostAsJsonAsync(Startup.ServerAddress + "/api/value/AddValue", v).Result; Helpers.CheckStatus(response); AddValueResponse r = response.Content.ReadAsAsync<AddValueResponse>().Result; } else { if (_logger != null) { _logger.LogInformation("Invalid task index: " + task.Index); } } } }
private async void DoWork(object state) { _logger.LogWarning("Timed Background Service is working."); try { DateTime now = DateTime.Now; ListSchedulesResponse list = null; using (System.Net.Http.HttpResponseMessage response = await Helpers.client.PostAsJsonAsync(Startup.ServerAddress + "/api/schedule/ListSchedules", new ListSchedules())) { Helpers.CheckStatus(response); list = await response.Content.ReadAsAsync <ListSchedulesResponse>(); } List <GXTask> tasks = new List <GXTask>(); foreach (GXSchedule it in list.Schedules) { GXDateTime dt = new GXDateTime(it.Start); if (it.ExecutionTime == DateTime.MinValue) { it.ExecutionTime = now; } if (Equals(dt, now)) { _logger.LogTrace("+"); foreach (GXObject obj in it.Objects) { foreach (GXAttribute a in obj.Attributes) { GXTask t = new GXTask() { Object = obj, TaskType = TaskType.Read, Index = a.Index }; tasks.Add(t); } } it.ExecutionTime = now; UpdateScheduleExecutionTime us = new UpdateScheduleExecutionTime(); us.Id = it.Id; us.Time = now; using (System.Net.Http.HttpResponseMessage response = await Helpers.client.PostAsJsonAsync(Startup.ServerAddress + "/api/schedule/UpdateScheduleExecutionTime", us)) { Helpers.CheckStatus(response); UpdateScheduleExecutionTime r = await response.Content.ReadAsAsync <UpdateScheduleExecutionTime>(); } } else if (now.Minute == 0) { Console.WriteLine(dt.ToFormatString()); Console.WriteLine(now.ToString()); } } if (tasks.Count != 0) { AddTask at = new AddTask(); at.Actions = tasks.ToArray(); using (System.Net.Http.HttpResponseMessage response = await Helpers.client.PostAsJsonAsync(Startup.ServerAddress + "/api/task/AddTask", at)) { Helpers.CheckStatus(response); } } } catch (Exception ex) { _logger.LogInformation(ex.Message); } }