private void SyncMeterFacility(string address, MetersToDataPush meter) { // ensure remote and local line impedance matches MeterFacility local = DataContext.Table <MeterFacility>().QueryRecordWhere("MeterID = {0}", meter.LocalXDAMeterID); MeterFacility remote = WebAPIHub.GetRecordsWhere(address, "MeterFacility", $"MeterID = {meter.RemoteXDAMeterID}").Select(x => (MeterFacility)x).FirstOrDefault(); // if there is a local record but not a remote record if (local != null && remote == null) { JObject record = new JObject(); record.Add("MeterID", meter.RemoteXDAMeterID); record.Add("FacilityID", local.FacilityID); WebAPIHub.CreateRecord(address, "MeterFacility", record); } }
private void AddMeterLine(string address, MetersToDataPush meter, LinesToDataPush selectedLine) { List <MeterLine> remoteMeterLines = WebAPIHub.GetRecordsWhere(address, "MeterLine", $"MeterID = {meter.RemoteXDAMeterID} AND LineID = {selectedLine.RemoteXDALineID}").Select(x => (MeterLine)x).ToList(); // if MeterLine association has not been previously made, make it if (!remoteMeterLines.Any()) { MeterLine record = new MeterLine() { MeterID = meter.RemoteXDAMeterID, LineID = selectedLine.RemoteXDALineID, LineName = selectedLine.RemoteXDAAssetKey.ToString() }; WebAPIHub.CreateRecord(address, "MeterLine", JObject.FromObject(record)); } }
public void SyncMeterConfigurationForInstance(string clientId, int instanceId, int meterId) { RemoteXDAInstance instance = DataContext.Table <RemoteXDAInstance>().QueryRecordWhere("ID = {0}", instanceId); MetersToDataPush meterToDataPush = DataContext.Table <MetersToDataPush>().QueryRecordWhere("ID = {0}", meterId); Meter localMeterRecord = DataContext.Table <Meter>().QueryRecordWhere("ID = {0}", meterToDataPush.LocalXDAMeterID); // get MeterLine table IEnumerable <MeterLine> localMeterLines = DataContext.Table <MeterLine>().QueryRecordsWhere("MeterID = {0}", localMeterRecord.ID); int progressTotal = localMeterLines.Count() + 2; int progressCount = 0; int remoteMeterLocationId = SyncMeterLocations(instance.Address, meterToDataPush, localMeterRecord); int meterGroupId = AddMeterGroup(instance.Address); OnUpdateProgressForMeter(clientId, localMeterRecord.AssetKey, (int)(100 * (progressCount) / progressTotal)); // if meter doesnt exist remotely add it AddMeter(instance.Address, meterToDataPush, localMeterRecord, remoteMeterLocationId); OnUpdateProgressForMeter(clientId, localMeterRecord.AssetKey, (int)(100 * (++progressCount) / progressTotal)); AddMeterMeterGroup(instance.Address, meterGroupId, meterToDataPush.RemoteXDAMeterID); OnUpdateProgressForMeter(clientId, localMeterRecord.AssetKey, (int)(100 * (++progressCount) / progressTotal)); // if there is a line for the meter ensure that its data has been uploaded remotely foreach (MeterLine meterLine in localMeterLines) { LinesToDataPush selectedLine = AddLine(instance.Address, meterLine, meterToDataPush.Obsfucate); // if MeterLine association has not been previously made, make it AddMeterLine(instance.Address, meterToDataPush, selectedLine); // ensure remote and local line impedance matches SyncLineImpedances(instance.Address, selectedLine); // add line to meterlocationline table int meterLocationLineID = SyncMeterLocationLines(instance.Address, selectedLine.RemoteXDALineID, remoteMeterLocationId); // ensure remote and local Source Impedance records match for the current meter line location SyncSourceImpedance(instance.Address, meterLocationLineID); // Sync Channel and channel dependant data SyncChannel(instance.Address, meterToDataPush, selectedLine); OnUpdateProgressForMeter(clientId, localMeterRecord.AssetKey, (int)(100 * (++progressCount) / progressTotal)); } }
private int SyncMeterLocations(string address, MetersToDataPush meterToDataPush, Meter localMeterRecord) { List <MeterLocation> remoteMeterLocations = WebAPIHub.GetRecords(address, "MeterLocation", "all").Select(x => (MeterLocation)x).ToList(); if (meterToDataPush.Obsfucate) { // if the company meter location does not exist, create it if (!remoteMeterLocations.Where(x => x.AssetKey == WebAPIHub.CompanyName).Any()) { MeterLocation record = new MeterLocation() { AssetKey = WebAPIHub.CompanyName, Name = WebAPIHub.CompanyName, Alias = WebAPIHub.CompanyName, ShortName = "", Description = "", Latitude = 0.0F, Longitude = 0.0F }; return(WebAPIHub.CreateRecord(address, "MeterLocation", JObject.FromObject(record))); } else { return(remoteMeterLocations.Where(x => x.AssetKey == WebAPIHub.CompanyName).First().ID); } } else { MeterLocation meterLocation = DataContext.Table <MeterLocation>().QueryRecordWhere("ID = {0}", localMeterRecord.MeterLocationID); if (!remoteMeterLocations.Where(x => x.AssetKey == meterLocation.AssetKey).Any()) { return(WebAPIHub.CreateRecord(address, "MeterLocation", JObject.FromObject(meterLocation))); } else { return(remoteMeterLocations.Where(x => x.AssetKey == meterLocation.AssetKey).First().ID); } } }
private void SyncMeterAlarmSummary(string address, MetersToDataPush meter) { // ensure remote and local line impedance matches IEnumerable <MeterAlarmSummary> local = DataContext.Table <MeterAlarmSummary>().QueryRecordsWhere("MeterID = {0}", meter.LocalXDAMeterID); List <MeterAlarmSummary> remote = WebAPIHub.GetRecordsWhere(address, "MeterAlarmSummary", $"MeterID = {meter.RemoteXDAMeterID}").Select(x => (MeterAlarmSummary)x).ToList(); // if there is a local record but not a remote record foreach (MeterAlarmSummary summary in local) { if (!remote.Where(x => x.Date == summary.Date).Any()) { JObject record = new JObject(); record.Add("MeterID", meter.RemoteXDAMeterID); record.Add("AlarmTypeID", summary.AlarmTypeID); record.Add("Date", summary.Date); record.Add("AlarmPoints", summary.AlarmPoints); WebAPIHub.CreateRecord(address, "MeterAlarmSummary", record); } } }
private void SyncChannel(string address, MetersToDataPush meter, LinesToDataPush line) { // ensure remote and local line impedance matches IEnumerable <ChannelDetail> local = DataContext.Table <ChannelDetail>().QueryRecordsWhere("MeterID = {0} AND LineID = {1}", meter.LocalXDAMeterID, line.LocalXDALineID); List <ChannelDetail> remote = WebAPIHub.GetChannels(address, $"MeterID = {meter.RemoteXDAMeterID} AND LineID = {line.RemoteXDALineID}").ToList(); // if there is a local record but not a remote record foreach (ChannelDetail summary in local) { if (!remote.Where(x => x.MeasurementType == summary.MeasurementType && x.MeasurementCharacteristic == summary.MeasurementCharacteristic && x.Phase == summary.Phase && x.Name == summary.Name).Any()) { JObject record = new JObject(); record.Add("MeterID", meter.RemoteXDAMeterID); record.Add("LineID", line.RemoteXDALineID); record.Add("MeasurementType", summary.MeasurementType); record.Add("MeasurementCharacteristic", summary.MeasurementCharacteristic); record.Add("Phase", summary.Phase); record.Add("Name", summary.Name); record.Add("SamplesPerHour", summary.SamplesPerHour); record.Add("PerUnitValue", summary.PerUnitValue); record.Add("HarmonicGroup", summary.HarmonicGroup); record.Add("Description", summary.Description); record.Add("Enabled", summary.Enabled); int remoteChannelId = WebAPIHub.CreateChannel(address, record); SyncSeries(address, summary.ID, remoteChannelId); //SyncAlarmLogs(address, summary.ID, remoteChannelId); //SyncAlarmRangeLimit(address, summary.ID, remoteChannelId); //SyncBreakerChannel(address, summary.ID, remoteChannelId); //SyncChannelAlarmSummary(address, summary.ID, remoteChannelId); //SyncChannelDataQualitySummary(address, summary.ID, remoteChannelId); //SyncDailyTrendingSummary(address, summary.ID, remoteChannelId); //SyncDailyQualityRangeLimit(address, summary.ID, remoteChannelId); } } }
private void AddMeter(string address, MetersToDataPush meter, Meter localMeterRecord, int remoteMeterLocationId) { List <Meter> remoteMeters = WebAPIHub.GetRecords(address, "Meter", "all").Select(x => (Meter)x).ToList(); // if meter doesnt exist remotely create the meter record if (!remoteMeters.Where(x => x.AssetKey.Equals(meter.RemoteXDAAssetKey.ToString())).Any()) { if (meter.Obsfucate) { Meter record = new Meter() { AssetKey = meter.RemoteXDAAssetKey.ToString(), MeterLocationID = remoteMeterLocationId, Name = meter.RemoteXDAName, Alias = meter.RemoteXDAName, ShortName = "", Make = localMeterRecord.Make, Model = localMeterRecord.Model, Description = localMeterRecord.Description, TimeZone = localMeterRecord.TimeZone }; meter.RemoteXDAMeterID = WebAPIHub.CreateRecord(address, "Meter", JObject.FromObject(record)); } else { localMeterRecord.MeterLocationID = remoteMeterLocationId; meter.RemoteXDAMeterID = WebAPIHub.CreateRecord(address, "Meter", JObject.FromObject(localMeterRecord)); } DataContext.Table <MetersToDataPush>().UpdateRecord(meter); } else { meter.RemoteXDAMeterID = remoteMeters.Where(x => x.AssetKey.Equals(meter.RemoteXDAAssetKey.ToString())).First().ID; } }
public void SyncMeterFilesForInstance(string clientId, int instanceId, int meterId, DateTime?startTime = null, DateTime?endTime = null) { RemoteXDAInstance instance = DataContext.Table <RemoteXDAInstance>().QueryRecordWhere("ID = {0}", instanceId); MetersToDataPush meterToDataPush = DataContext.Table <MetersToDataPush>().QueryRecordWhere("ID = {0}", meterId); IEnumerable <FileGroup> localFileGroups = DataContext.Table <FileGroup>().QueryRecordsWhere("ID IN (SELECT FileGroupID From Event WHERE MeterID = {0})", meterToDataPush.LocalXDAMeterID); int progressTotal = (localFileGroups.Count() > 0 ? localFileGroups.Count() : 1); int progressCount = 0; OnUpdateProgressForMeter(clientId, meterToDataPush.LocalXDAAssetKey, (int)(100 * (progressCount) / progressTotal)); foreach (FileGroup fileGroup in localFileGroups) { FileGroupLocalToRemote fileGroupLocalToRemote = DataContext.Table <FileGroupLocalToRemote>().QueryRecordWhere("LocalFileGroupID = {0}", fileGroup.ID); if (fileGroupLocalToRemote == null) { FileGroup fg = new FileGroup() { ProcessingEndTime = fileGroup.ProcessingEndTime, ProcessingStartTime = fileGroup.ProcessingStartTime, DataEndTime = fileGroup.DataEndTime, DataStartTime = fileGroup.DataStartTime, Error = fileGroup.Error, FileHash = fileGroup.FileHash }; int remoteFileGroupId = WebAPIHub.CreateRecord(instance.Address, "FileGroup", JObject.FromObject(fg)); fileGroupLocalToRemote = new FileGroupLocalToRemote() { LocalFileGroupID = fileGroup.ID, RemoteFileGroupID = remoteFileGroupId }; DataContext.Table <FileGroupLocalToRemote>().AddNewRecord(fileGroupLocalToRemote); } IEnumerable <DataFile> localDataFiles = DataContext.Table <DataFile>().QueryRecordsWhere("FileGroupID = {0}", fileGroupLocalToRemote.LocalFileGroupID); IEnumerable <DataFile> remoteDataFiles = WebAPIHub.GetRecordsWhere(instance.Address, "DataFile", $"FileGroupID = {fileGroupLocalToRemote.RemoteFileGroupID}").Select(x => (DataFile)x); bool process = false; foreach (DataFile localDataFile in localDataFiles) { int remoteDataFileId; if (!remoteDataFiles.Where(x => x.FilePath == localDataFile.FilePath).Any()) { DataFile df = new DataFile() { CreationTime = localDataFile.CreationTime, FileGroupID = fileGroupLocalToRemote.RemoteFileGroupID, FilePath = localDataFile.FilePath, FilePathHash = localDataFile.FilePathHash, FileSize = localDataFile.FileSize, LastAccessTime = localDataFile.LastAccessTime, LastWriteTime = localDataFile.LastWriteTime }; remoteDataFileId = WebAPIHub.CreateRecord(instance.Address, "DataFile", JObject.FromObject(df)); process = true; } else { remoteDataFileId = remoteDataFiles.Where(x => x.FilePath == localDataFile.FilePath).First().ID; } FileBlob remoteFileBlob = (FileBlob)WebAPIHub.GetRecordsWhere(instance.Address, "FileBlob", $"DataFileID = {remoteDataFileId}").FirstOrDefault(); if (remoteFileBlob == null) { FileBlob localFileBlob = DataContext.Table <FileBlob>().QueryRecordWhere("DataFileID = {0}", localDataFile.ID); try { if (localFileBlob == null) { localFileBlob = new FileBlob() { DataFileID = localDataFile.ID, Blob = File.ReadAllBytes(localDataFile.FilePath) }; DataContext.Table <FileBlob>().AddNewRecord(localFileBlob); } } catch (Exception ex) { OnLogExceptionMessage(ex.ToString()); process = false; } localFileBlob.DataFileID = remoteDataFileId; WebAPIHub.CreateRecord(instance.Address, "FileBlob", JObject.FromObject(new FileBlob() { DataFileID = remoteDataFileId, Blob = localFileBlob.Blob })); } } if (process) { Dictionary <string, int> dictionary = new Dictionary <string, int>(); dictionary.Add("FileGroupID", fileGroupLocalToRemote.RemoteFileGroupID); dictionary.Add("MeterID", meterToDataPush.RemoteXDAMeterID); WebAPIHub.ProcessFileGroup(instance.Address, JObject.FromObject(dictionary)); } OnUpdateProgressForMeter(clientId, meterToDataPush.LocalXDAAssetKey, (int)(100 * (++progressCount) / progressTotal)); } }