private static async Task PostSamples( TraceWriter log, IAsyncCollector <string> asyncCollector, MTConnectStreamsType sampleResult) { var samples = default(IEnumerable <SampleRecord>); if (sampleResult.Streams == null) { samples = new List <SampleRecord>(); } else { var nonEmptySamples = sampleResult.Streams.Where( s => s.ComponentStream != null && s.ComponentStream.All(cs => cs.Samples != null && cs.Samples.Any())).ToList(); samples = nonEmptySamples.SelectMany( s => s.ComponentStream.SelectMany( cs => cs.Samples.Select( sample => new SampleRecord() { HourWindow = new DateTime( sample.timestamp.Year, sample.timestamp.Month, sample.timestamp.Day, sample.timestamp.Hour, 0, 0), Id = Guid.NewGuid().ToString(), DeviceName = s?.name, DeviceId = s?.uuid, Component = cs?.component, ComponentName = cs?.name, ComponentId = cs?.uuid, SampleDataItemId = sample?.dataItemId, SampleTimestamp = sample?.timestamp, SampleName = sample?.name, SampleSequence = sample?.sequence, SampleSubtype = sample?.subType, SampleDuration = sample?.duration, SampleDurationSpecified = sample?.durationSpecified, SampleRate = sample?.sampleRate, SampleStatistic = sample?.statistic, SampleValue = sample?.Value }))).ToList(); } log.Info($"{samples.Count()} samples found."); foreach (var sample in samples) { var flatSample = JsonConvert.SerializeObject(sample); await asyncCollector.AddAsync(flatSample); } }
private static async Task PostEvents( TraceWriter log, IAsyncCollector <string> asyncEventCollector, MTConnectStreamsType sampleResult) { var events = default(IEnumerable <EventRecord>); if (sampleResult.Streams == null) { events = new List <EventRecord>(); } else { var nonEmptyEvents = sampleResult.Streams.Where( s => s.ComponentStream != null && s.ComponentStream.All(cs => cs.Events != null && cs.Events.Any())) .ToList(); events = nonEmptyEvents.SelectMany( s => s.ComponentStream.SelectMany( cs => cs.Events.Select( e => new EventRecord() { HourWindow = new DateTime( e.timestamp.Year, e.timestamp.Month, e.timestamp.Day, e.timestamp.Hour, 0, 0), Id = Guid.NewGuid().ToString(), DeviceName = s?.name, DeviceId = s?.uuid, Component = cs?.component, ComponentName = cs?.name, ComponentId = cs?.uuid, EventDataItemId = e?.dataItemId, EventTimestamp = e?.timestamp, EventName = e?.name, EventSequence = e?.sequence, EventSubtype = e?.subType, EventValue = e?.Value }))).ToList(); } log.Info($"{events.Count()} events found."); foreach (var eventRecord in events) { var flatEvent = JsonConvert.SerializeObject(eventRecord); await asyncEventCollector.AddAsync(flatEvent); } }
public Analysis(String pathToXML) { Log.Write("Running MTConnect Analysis"); // Read and deserialize the MTConnect Data XmlSerializer serializer = new XmlSerializer(typeof(MTConnectStreamsType)); Stream reader = new FileStream(pathToXML, FileMode.Open); MTConnectStreamsType data = (MTConnectStreamsType)serializer.Deserialize(reader); Log.Write("MT Connect Data Read into MTConnectStreamsType"); Log.Write("Creation Time " + data.Header.creationTime); // TODO use other device streams DeviceStreamType deviceStream = data.Streams.First(); // Turns out these paths are useless- no sample information :( /* * List<ComponentStreamType> paths = deviceStream.ComponentStream.Where((cs) => cs.component == "Path").ToList(); * Log.Write("Paths detected: " + paths.Count); * foreach (ComponentStreamType path in paths){ * List<SampleType> a = path.Samples.ToList(); * Log.Write("Loaded path"); * } */ reader.Close(); // Switching to manual mode... XDocument xd = XDocument.Load(pathToXML); List <XElement> sequenceElements = xd.XPathSelectElements("//*[@sequence]").OrderBy((elm) => { return(Int32.Parse(elm.Attribute("sequence").Value)); }).ToList(); int unknownElements = 0; int parseErrors = 0; int i = 0; foreach (XElement elm in sequenceElements) { try { int seq = Int32.Parse(elm.Attribute("sequence").Value); //Log.Write("SEQ" + seq + " : " + elm.Name); if (elm.Name.LocalName.Equals("PathPosition")) { timeline.Add(new PathPosition(elm)); } else { // Log.Write("[" + seq + "] Unregistered Event: " + elm.Name.LocalName); unknownElements++; } }catch (Exception e) { parseErrors++; Log.Write("[" + elm.Attribute("sequence").Value + "] Parse Error " + e); } } Log.Write("XML Parsing Complete"); Log.Write("[" + timeline.Count((e) => e.name == "PathPosition") + "] PathPositions"); Log.Write("[" + unknownElements + "] Unregistered Events (" + (1 - ((float)unknownElements) / sequenceElements.Count) * 100 + "% Coverage)"); Log.Write("[" + parseErrors + "] Parse Errors "); }