Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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));
            }
        }
Exemplo n.º 3
0
        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));
            }
        }
Exemplo n.º 4
0
        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);
                }
            }
        }
Exemplo n.º 5
0
        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);
                }
            }
        }
Exemplo n.º 6
0
        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);
                }
            }
        }
Exemplo n.º 7
0
        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;
            }
        }
Exemplo n.º 8
0
        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));
            }
        }