public ActionResult <AddValueResponse> Post(AddValue request) { AddValueResponse ret = new AddValueResponse(); GXUpdateArgs arg; if (request.Items != null) { DateTime now = DateTime.Now; foreach (GXValue it in request.Items) { if (it.Read == DateTime.MinValue) { it.Read = now; } GXAttribute value = new GXAttribute(); value.Id = it.AttributeId; value.Value = it.Value; value.Read = it.Read; arg = GXUpdateArgs.Update <GXAttribute>(value, q => new { q.Value, q.Read }); host.Connection.Update(arg); } host.Connection.Insert(GXInsertArgs.InsertRange(request.Items)); host.SetChange(TargetType.Value, 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); } } } }