def get_archive_pv_value( PV, label, start_time, end_time, scan_archives=True, limit=100000, interpolation='raw', archiver=None, ): '''get PV, PV-Label from archiver from start_time to end_time Return: pandas.DataFrame with keys as time-str, time-float, label-values ''' import pandas as pd import numpy as np import time if archiver is None: from channelarchiver import Archiver archiver = [ Archiver( 'http://xf11id-ca.nsls2.bnl.local/cgi-bin/ArchiveDataServer.cgi' ) ] #if scan_archives: #archiver.scan_archives() if label[:3] == 'Acc': arch = archiver[1] else: arch = archiver[0] data = arch.get(PV, start_time, end_time, scan_archives=scan_archives, limit=limit, interpolation=interpolation) td = np.array(data.times) v = np.array(data.values, dtype=float) td = make_wave_data(td, dtype='x') v = make_wave_data(v, dtype='y') tf = trans_td_to_tf(td) tv = np.array([td, tf, v]).T index = np.arange(len(tv)) data = tv df = pd.DataFrame(data, index=index, columns=['td', 'tf', label]) # print('seraching %s from: %s---to: %s' % (label, start_time, end_time)) print('Found results: from: %s to :%s with %s points.' % (df.td[0], df.td[len(df.td) - 1], len(df.td))) return df
def get_archive_pvlist_values(PVs, labels, start_time, end_time, limit=100000, interpolation='raw'): '''get PV-list, PV-Label-list from archiver from start_time to end_time, Return: a dict { label: pandas.DataFrame with keys as time-str, time-float, label-values } ''' from channelarchiver import Archiver archiver = Archiver( 'http://xf11id-ca.nsls2.bnl.local/cgi-bin/ArchiveDataServer.cgi') archiver_acc = Archiver( 'http://ca.cs.nsls2.local:8888/cgi-bin/ArchiveDataServer.cgi') #archiver.scan_archives() dict_tv = {} N = len(PVs) for i in range(N): PV = PVs[i] label = labels[i] if i == 0: scan_archives = True else: scan_archives = False scan_archives = True dict_tv[label] = get_archive_pv_value( PV, label, start_time, end_time, scan_archives=scan_archives, limit=limit, interpolation=interpolation, archiver=[archiver, archiver_acc]) return dict_tv
Based off of cafetch.py, written by Elena, with a few features removed to limit dependencies. Changelog: 2020-06-08 DG Ported to Python 3 and ObserverTools, takes a series of keys or just one. """ from channelarchiver import Archiver from argparse import ArgumentParser from astropy.time import Time import socket try: telemetry = Archiver('http://sdss-telemetry.apo.nmsu.edu/' 'telemetry/cgi/ArchiveDataServer.cgi') telemetry.scan_archives() except (socket.gaierror, ConnectionRefusedError): try: telemetry = Archiver('http://*****:*****@' 'sdss-gateway.apo.nmsu.edu') __version__ = '3.1.1'
def setUp(self): self.archiver = Archiver( 'https://xf23id-ca/cgi-bin/ArchiveDataServer.cgi') self.archiver.archiver = MockArchiver()
#!/usr/bin/env python3 # bernie Tue. 26 June '18 # playing around from channelarchiver import Archiver, codes, utils ss = 'http://sdss-telemetry.apo.nmsu.edu/telemetry/cgi/ArchiveDataServer.cgi' #ss='http://localhost:5080/telemetry/cgi/ArchiveDataServer.cgi' archiver = Archiver(ss) archiver.scan_archives() start = '2018-06-25 10:00:00' end = '2018-06-26 11:00:00' archiver.scan_archives() data1 = archiver.get('25m:boss:SP1B2LN2TempRead', start, end, interpolation='raw', scan_archives=False) data2 = archiver.get('25m:boss:SP1R0LN2TempRead', start, end, interpolation='raw', scan_archives=False) data3 = archiver.get('25m:boss:SP2B2LN2TempRead', start, end, interpolation='raw', scan_archives=False)
def setUp(self): self.archiver = Archiver('http://fake') self.archiver.archiver = MockArchiver()
class TestArchiver(unittest.TestCase): def setUp(self): self.archiver = Archiver('http://fake') self.archiver.archiver = MockArchiver() def test_scan_archives_all(self): self.archiver.scan_archives() archives_for_channel = self.archiver.archives_for_channel data = self.archiver.get('XF:23IDA-VA:0{DP:1-IP:1}P-I', '2013-08-11', '2013-08-12') print data self.assertTrue('EXAMPLE:DOUBLE_SCALAR{TD:1}' in archives_for_channel) self.assertTrue('EXAMPLE:INT_WAVEFORM' in archives_for_channel) self.assertTrue('EXAMPLE:ENUM_SCALAR' in archives_for_channel) self.assertEqual( archives_for_channel, { 'EXAMPLE:DOUBLE_SCALAR{TD:1}': [ ArchiveProperties( key=1001, start_time=datetime.datetime(2012, 7, 12, 21, 47, 23, 664000, tzinfo=utc), end_time=datetime.datetime(2012, 7, 13, 11, 18, 55, 671259, tzinfo=utc) ) ], 'EXAMPLE:INT_WAVEFORM': [ ArchiveProperties( key=1001, start_time=datetime.datetime(2012, 7, 12, 23, 14, 19, 129600, tzinfo=utc), end_time=datetime.datetime(2012, 7, 13, 8, 26, 18, 558211, tzinfo=utc) ) ], 'EXAMPLE:ENUM_SCALAR': [ ArchiveProperties( key=1008, start_time=datetime.datetime(2012, 7, 12, 22, 41, 10, 765676, tzinfo=utc), end_time=datetime.datetime(2012, 7, 13, 9, 20, 23, 623789, tzinfo=utc) ) ] } ) def test_scan_archives_one(self): self.archiver.scan_archives('EXAMPLE:DOUBLE_SCALAR{TD:1}') archives_for_channel = self.archiver.archives_for_channel.keys() self.assertTrue('EXAMPLE:DOUBLE_SCALAR{TD:1}' in archives_for_channel) self.assertFalse('EXAMPLE:INT_WAVEFORM' in archives_for_channel) self.assertFalse('EXAMPLE:ENUM_SCALAR' in archives_for_channel) def test_scan_archives_list(self): self.archiver.scan_archives(['EXAMPLE:DOUBLE_SCALAR{TD:1}', 'EXAMPLE:ENUM_SCALAR']) archives_for_channel = self.archiver.archives_for_channel.keys() self.assertTrue('EXAMPLE:DOUBLE_SCALAR{TD:1}' in archives_for_channel) self.assertFalse('EXAMPLE:INT_WAVEFORM' in archives_for_channel) self.assertTrue('EXAMPLE:ENUM_SCALAR' in archives_for_channel) def test_get_scalar(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) data = self.archiver.get(['EXAMPLE:DOUBLE_SCALAR{TD:1}'], start, end, interpolation=codes.interpolation.RAW) self.assertTrue(isinstance(data, list)) channel_data = data[0] self.assertEqual(channel_data.channel, 'EXAMPLE:DOUBLE_SCALAR{TD:1}') self.assertEqual(channel_data.data_type, codes.data_type.DOUBLE) self.assertEqual(channel_data.elements, 1) self.assertEqual(channel_data.values, [ 200.5, 199.9, 198.7, 196.1 ]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 12, 21, 47, 23, 664000, utc), datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc), datetime.datetime(2012, 7, 13, 11, 18, 55, 671259, utc) ]) self.assertEqual(channel_data.statuses, [0, 6, 6, 5]) self.assertEqual(channel_data.severities, [0, 1, 1, 2]) self.assertEqual(repr(channel_data.times[0].tzinfo), 'UTC()') def test_get_interpolation_string(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation='raw') self.assertEqual(channel_data.channel, 'EXAMPLE:DOUBLE_SCALAR{TD:1}') self.assertEqual(channel_data.values, [ 200.5, 199.9, 198.7, 196.1 ]) def test_get_scalar_str(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertTrue(isinstance(channel_data, ChannelData)) self.assertEqual(channel_data.channel, 'EXAMPLE:DOUBLE_SCALAR{TD:1}') self.assertEqual(channel_data.data_type, codes.data_type.DOUBLE) def test_get_scalar_in_tz(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW, tz=utils.UTC(11.5)) self.assertEqual(str(data.times[0].tzinfo), 'UTC+11:30') self.assertEqual(repr(data.times[0].tzinfo), 'UTC(+11.5)') def test_get_without_scan(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) self.assertRaises(exceptions.ChannelNotFound, self.archiver.get, ['EXAMPLE:DOUBLE_SCALAR{TD:1}'], start, end, interpolation=codes.interpolation.RAW, scan_archives=False) def test_get_with_restrictive_interval(self): start = datetime.datetime(2012, 7, 13, tzinfo=utc) end = datetime.datetime(2012, 7, 13, 10, tzinfo=utc) channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.values, [ 199.9, 198.7 ]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc) ]) def test_get_with_restrictive_interval_with_tzs(self): start = datetime.datetime(2012, 7, 13, 10, tzinfo=utils.UTC(10)) end = datetime.datetime(2012, 7, 13, 20, tzinfo=utils.UTC(10)) channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.values, [ 199.9, 198.7 ]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc) ]) self.assertEqual(repr(channel_data.times[0].tzinfo), 'UTC(+10)') def test_get_with_str_times(self): start = '2012-07-13 00:00:00Z' end = '2012-07-13 10:00:00Z' channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.values, [ 199.9, 198.7 ]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc) ]) def test_get_with_str_times_incl_tz(self): start = '2012-07-13 10:00:00+10:00' end = '2012-07-13 20:00:00+10:00' channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.values, [ 199.9, 198.7 ]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc) ]) self.assertEqual(repr(channel_data.times[0].tzinfo), 'UTC(+10)') def test_get_waveform(self): start = datetime.datetime(2012, 1, 1) end = datetime.datetime(2013, 1, 1) channel_data = self.archiver.get( 'EXAMPLE:INT_WAVEFORM', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.channel, 'EXAMPLE:INT_WAVEFORM') self.assertEqual(channel_data.data_type, codes.data_type.INT) self.assertEqual(channel_data.elements, 3) self.assertEqual(channel_data.values, [ [3, 5, 13], [2, 4, 11], [0, 7, 1] ]) def test_get_enum(self): start = datetime.datetime(2012, 1, 1) end = datetime.datetime(2013, 1, 1) channel_data = self.archiver.get( 'EXAMPLE:ENUM_SCALAR', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.channel, 'EXAMPLE:ENUM_SCALAR') self.assertEqual(channel_data.data_type, codes.data_type.ENUM) self.assertEqual(channel_data.values, [7, 1, 8]) def test_get_multiple(self): start = datetime.datetime(2012, 1, 1) end = datetime.datetime(2013, 1, 1) data = self.archiver.get( ['EXAMPLE:DOUBLE_SCALAR{TD:1}', 'EXAMPLE:INT_WAVEFORM', 'EXAMPLE:ENUM_SCALAR'], start, end, interpolation=codes.interpolation.RAW) self.assertTrue(isinstance(data, list)) self.assertEqual(data[0].channel, 'EXAMPLE:DOUBLE_SCALAR{TD:1}') self.assertEqual(data[1].channel, 'EXAMPLE:INT_WAVEFORM') self.assertEqual(data[2].channel, 'EXAMPLE:ENUM_SCALAR') self.assertEqual(data[0].values, [ 200.5, 199.9, 198.7, 196.1 ]) self.assertEqual(data[1].values, [[3, 5, 13], [2, 4, 11], [0, 7, 1]]) self.assertEqual(data[2].values, [7, 1, 8]) def test_get_with_wrong_number_of_keys(self): start = datetime.datetime(2012, 1, 1) end = datetime.datetime(2013, 1, 1) self.assertRaises(exceptions.ChannelKeyMismatch, self.archiver.get, [ 'EXAMPLE:DOUBLE_SCALAR{TD:1}' ], start, end, archive_keys=[1001, 1008], interpolation=codes.interpolation.RAW)
#!/usr/bin/env python3 # bernie Tue. 26 June '18 # just playing around: a script to retrieve arbitrarily defined intervals of APO process variables import datetime from channelarchiver import Archiver, codes, utils ss = 'http://sdss-telemetry.apo.nmsu.edu/telemetry/cgi/ArchiveDataServer.cgi' archiver = Archiver(ss) archiver.scan_archives() # DEFAULT INTERVAL IS PAST 24 HOURS BUT WE SHOULD BE ABLE TO OVERRIDE ON THE COMMAND-LINE: # start = str(datetime.datetime.utcnow() - datetime.timedelta(days=1)) # 1 day before current moment # end = str(datetime.datetime.utcnow()) # current moment # start='2018-10-10 01:00:00' # end='2018-10-10 12:00:00' periods = ([ '2017-10-01 00:00:00', '2017-10-01 12:19:33' ], \ [ '2017-10-02 00:00:00', '2017-10-02 11:43:34' ], \ [ '2017-10-08 00:00:00', '2017-10-08 12:14:30' ], \ [ '2017-10-09 00:00:00', '2017-10-09 12:23:45' ], \ [ '2017-10-10 00:00:00', '2017-10-10 12:40:04' ], \ [ '2017-10-11 00:00:00', '2017-10-11 12:56:26' ], \ [ '2017-10-12 00:00:00', '2017-10-12 12:30:08' ], \ [ '2017-10-13 00:00:00', '2017-10-13 11:07:09' ], \ [ '2017-10-14 00:00:00', '2017-10-14 12:32:42' ], \ [ '2017-10-15 00:00:00', '2017-10-15 12:47:11' ], \ [ '2017-10-16 00:00:00', '2017-10-16 12:43:37' ], \ [ '2017-10-17 00:00:00', '2017-10-17 12:20:21' ], \
def archiver(): archiver = Archiver("http://fake") archiver.archiver = MockArchiver() return archiver
class TestArchiver(unittest.TestCase): def setUp(self): self.archiver = Archiver('http://fake') self.archiver.archiver = MockArchiver() def test_scan_archives_all(self): self.archiver.scan_archives() archives_for_channel = self.archiver.archives_for_channel data = self.archiver.get('XF:23IDA-VA:0{DP:1-IP:1}P-I', '2013-08-11', '2013-08-12') print data self.assertTrue('EXAMPLE:DOUBLE_SCALAR{TD:1}' in archives_for_channel) self.assertTrue('EXAMPLE:INT_WAVEFORM' in archives_for_channel) self.assertTrue('EXAMPLE:ENUM_SCALAR' in archives_for_channel) self.assertEqual( archives_for_channel, { 'EXAMPLE:DOUBLE_SCALAR{TD:1}': [ ArchiveProperties( key=1001, start_time=datetime.datetime( 2012, 7, 12, 21, 47, 23, 664000, tzinfo=utc), end_time=datetime.datetime( 2012, 7, 13, 11, 18, 55, 671259, tzinfo=utc)) ], 'EXAMPLE:INT_WAVEFORM': [ ArchiveProperties( key=1001, start_time=datetime.datetime( 2012, 7, 12, 23, 14, 19, 129600, tzinfo=utc), end_time=datetime.datetime( 2012, 7, 13, 8, 26, 18, 558211, tzinfo=utc)) ], 'EXAMPLE:ENUM_SCALAR': [ ArchiveProperties( key=1008, start_time=datetime.datetime( 2012, 7, 12, 22, 41, 10, 765676, tzinfo=utc), end_time=datetime.datetime( 2012, 7, 13, 9, 20, 23, 623789, tzinfo=utc)) ] }) def test_scan_archives_one(self): self.archiver.scan_archives('EXAMPLE:DOUBLE_SCALAR{TD:1}') archives_for_channel = self.archiver.archives_for_channel.keys() self.assertTrue('EXAMPLE:DOUBLE_SCALAR{TD:1}' in archives_for_channel) self.assertFalse('EXAMPLE:INT_WAVEFORM' in archives_for_channel) self.assertFalse('EXAMPLE:ENUM_SCALAR' in archives_for_channel) def test_scan_archives_list(self): self.archiver.scan_archives( ['EXAMPLE:DOUBLE_SCALAR{TD:1}', 'EXAMPLE:ENUM_SCALAR']) archives_for_channel = self.archiver.archives_for_channel.keys() self.assertTrue('EXAMPLE:DOUBLE_SCALAR{TD:1}' in archives_for_channel) self.assertFalse('EXAMPLE:INT_WAVEFORM' in archives_for_channel) self.assertTrue('EXAMPLE:ENUM_SCALAR' in archives_for_channel) def test_get_scalar(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) data = self.archiver.get(['EXAMPLE:DOUBLE_SCALAR{TD:1}'], start, end, interpolation=codes.interpolation.RAW) self.assertTrue(isinstance(data, list)) channel_data = data[0] self.assertEqual(channel_data.channel, 'EXAMPLE:DOUBLE_SCALAR{TD:1}') self.assertEqual(channel_data.data_type, codes.data_type.DOUBLE) self.assertEqual(channel_data.elements, 1) self.assertEqual(channel_data.values, [200.5, 199.9, 198.7, 196.1]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 12, 21, 47, 23, 664000, utc), datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc), datetime.datetime(2012, 7, 13, 11, 18, 55, 671259, utc) ]) self.assertEqual(channel_data.statuses, [0, 6, 6, 5]) self.assertEqual(channel_data.severities, [0, 1, 1, 2]) self.assertEqual(repr(channel_data.times[0].tzinfo), 'UTC()') def test_get_interpolation_string(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation='raw') self.assertEqual(channel_data.channel, 'EXAMPLE:DOUBLE_SCALAR{TD:1}') self.assertEqual(channel_data.values, [200.5, 199.9, 198.7, 196.1]) def test_get_scalar_str(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertTrue(isinstance(channel_data, ChannelData)) self.assertEqual(channel_data.channel, 'EXAMPLE:DOUBLE_SCALAR{TD:1}') self.assertEqual(channel_data.data_type, codes.data_type.DOUBLE) def test_get_scalar_in_tz(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW, tz=utils.UTC(11.5)) self.assertEqual(str(data.times[0].tzinfo), 'UTC+11:30') self.assertEqual(repr(data.times[0].tzinfo), 'UTC(+11.5)') def test_get_without_scan(self): start = datetime.datetime(2012, 1, 1, tzinfo=utc) end = datetime.datetime(2013, 1, 1, tzinfo=utc) self.assertRaises(exceptions.ChannelNotFound, self.archiver.get, ['EXAMPLE:DOUBLE_SCALAR{TD:1}'], start, end, interpolation=codes.interpolation.RAW, scan_archives=False) def test_get_with_restrictive_interval(self): start = datetime.datetime(2012, 7, 13, tzinfo=utc) end = datetime.datetime(2012, 7, 13, 10, tzinfo=utc) channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.values, [199.9, 198.7]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc) ]) def test_get_with_restrictive_interval_with_tzs(self): start = datetime.datetime(2012, 7, 13, 10, tzinfo=utils.UTC(10)) end = datetime.datetime(2012, 7, 13, 20, tzinfo=utils.UTC(10)) channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.values, [199.9, 198.7]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc) ]) self.assertEqual(repr(channel_data.times[0].tzinfo), 'UTC(+10)') def test_get_with_str_times(self): start = '2012-07-13 00:00:00Z' end = '2012-07-13 10:00:00Z' channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.values, [199.9, 198.7]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc) ]) def test_get_with_str_times_incl_tz(self): start = '2012-07-13 10:00:00+10:00' end = '2012-07-13 20:00:00+10:00' channel_data = self.archiver.get('EXAMPLE:DOUBLE_SCALAR{TD:1}', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.values, [199.9, 198.7]) self.assertEqual(channel_data.times, [ datetime.datetime(2012, 7, 13, 2, 5, 1, 443589, utc), datetime.datetime(2012, 7, 13, 7, 19, 31, 806097, utc) ]) self.assertEqual(repr(channel_data.times[0].tzinfo), 'UTC(+10)') def test_get_waveform(self): start = datetime.datetime(2012, 1, 1) end = datetime.datetime(2013, 1, 1) channel_data = self.archiver.get('EXAMPLE:INT_WAVEFORM', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.channel, 'EXAMPLE:INT_WAVEFORM') self.assertEqual(channel_data.data_type, codes.data_type.INT) self.assertEqual(channel_data.elements, 3) self.assertEqual(channel_data.values, [[3, 5, 13], [2, 4, 11], [0, 7, 1]]) def test_get_enum(self): start = datetime.datetime(2012, 1, 1) end = datetime.datetime(2013, 1, 1) channel_data = self.archiver.get('EXAMPLE:ENUM_SCALAR', start, end, interpolation=codes.interpolation.RAW) self.assertEqual(channel_data.channel, 'EXAMPLE:ENUM_SCALAR') self.assertEqual(channel_data.data_type, codes.data_type.ENUM) self.assertEqual(channel_data.values, [7, 1, 8]) def test_get_multiple(self): start = datetime.datetime(2012, 1, 1) end = datetime.datetime(2013, 1, 1) data = self.archiver.get([ 'EXAMPLE:DOUBLE_SCALAR{TD:1}', 'EXAMPLE:INT_WAVEFORM', 'EXAMPLE:ENUM_SCALAR' ], start, end, interpolation=codes.interpolation.RAW) self.assertTrue(isinstance(data, list)) self.assertEqual(data[0].channel, 'EXAMPLE:DOUBLE_SCALAR{TD:1}') self.assertEqual(data[1].channel, 'EXAMPLE:INT_WAVEFORM') self.assertEqual(data[2].channel, 'EXAMPLE:ENUM_SCALAR') self.assertEqual(data[0].values, [200.5, 199.9, 198.7, 196.1]) self.assertEqual(data[1].values, [[3, 5, 13], [2, 4, 11], [0, 7, 1]]) self.assertEqual(data[2].values, [7, 1, 8]) def test_get_with_wrong_number_of_keys(self): start = datetime.datetime(2012, 1, 1) end = datetime.datetime(2013, 1, 1) self.assertRaises(exceptions.ChannelKeyMismatch, self.archiver.get, ['EXAMPLE:DOUBLE_SCALAR{TD:1}'], start, end, archive_keys=[1001, 1008], interpolation=codes.interpolation.RAW)
""" See this CA library https://github.com/RobbieClarken/channelarchiver """ from channelarchiver import Archiver, codes, utils import optparse import datetime from keydict import configKey parser = optparse.OptionParser() utc = utils.UTC() prefix = "test" ss = 'http://sdss-telemetry.apo.nmsu.edu/telemetry/cgi/ArchiveDataServer.cgi' archiver = Archiver(ss) def getMultiData(channel, startTime, endTime): """ getting multiple values - in progress, testing mode""" channels = [ "25m:guider:probe:exposureID", "25m:guider:probe:probeID", "25m:guider:probe:flags" ] archiver.scan_archives() data0, data1, data2 = archiver.get(channels, startTime, endTime) print("----------------------------------------------") print(" Data Time(UT) Value") print("----------------------------------------------") for i in range(len(data0.values)):
def get_archived_pv(pv, start_time, end_time, label=None, limit=None, make_wave=True, interpolation='raw'): '''Yugang May 15, 2017 Get a archived PV value Input: start time: str, e.g., '2017-04-11 09:00', end time: str, e.g., '2017-04-12 11:00' label: str, a meaningful label for the pv limit: integer, the limit data point make_wave: if True, make a 'square-wave like' data interpolation: 'raw', gives the raw archived data Return: a pandas.dataframe with column as datetime, float time, and value data An example: data = get_archived_pv('XF:11IDA-OP{Mono:DCM-Ax:Bragg}T-I', '2017-04-11 09:00', '2017-04-11 11:00') ''' from channelarchiver import Archiver archiver = Archiver( 'http://xf11id-ca.cs.nsls2.local/cgi-bin/ArchiveDataServer.cgi') import numpy as np import pandas as pd if label is None: label = pv #if pv[0][:2] == 'SR': # res = arget( pv,start=start_time, # end=end_time,count=limit, conf = 'middle') #else: print('Seraching PV: %s from: %s---to: %s' % (label, start_time, end_time)) res = archiver.get(pv, start_time, end_time, scan_archives=True, limit=limit, interpolation=interpolation) #print res key = pv v = np.array(res[key][0], dtype=float) k1 = res[key][1] N = len(k1) sec = np.array([k1[i][2] for i in range(N)]) nsec = np.array([k1[i][3] for i in range(N)]) tf = sec + nsec * 10**(-9) if make_wave: v = make_wave_data(v, dtype='y') tf = make_wave_data(tf, dtype='x') td = trans_tf_to_td(tf, dtype='array') NN = len(td) tv = np.array([td, tf.reshape(NN), v.reshape(NN)]).T index = np.arange(len(tv)) data = tv df = pd.DataFrame(data, index=index, columns=['td', 'tf', label[0]]) if make_wave: fnum = len(df.td) / 2 else: fnum = len(df.td) return df
#!/usr/bin/env python3 import argparse import time import datetime from channelarchiver import Archiver, codes, utils ss = 'http://sdss-telemetry.apo.nmsu.edu/telemetry/cgi/ArchiveDataServer.cgi' # ss='http://localhost:5080/telemetry/cgi/ArchiveDataServer.cgi' archiver = Archiver(ss) # TAI_UTC =34 TAI_UTC = 0 aSjd = 40587.3 bSjd = 86400.0 def curSjd(): # current mjd sjd = (time.time() + TAI_UTC) / bSjd + aSjd return int(sjd) def sjd_to_time(sjd): sjd1 = sjd tm = (sjd1 - aSjd) * bSjd - TAI_UTC return tm # time in seconds time.time() def getTimeStamps(sjd): startStamp = sjd_to_time(int(sjd + 0.3))
#!/usr/bin/env python3 import argparse import time import datetime from channelarchiver import Archiver ss = 'http://sdss-telemetry.apo.nmsu.edu/telemetry/cgi/ArchiveDataServer.cgi' # ss='http://localhost:5080/telemetry/cgi/ArchiveDataServer.cgi' archiver = Archiver(ss) # TAI_UTC =34; TAI_UTC = 0 aSjd = 40587.3 bSjd = 86400.0 def curSjd(): # current mjd sjd = (time.time() + TAI_UTC) / bSjd + aSjd return int(sjd) def sjd_to_time(sjd): sjd1 = sjd tm = (sjd1 - aSjd) * bSjd - TAI_UTC return tm # time in seconds time.time() def getTimeStamps(sjd): startStamp = sjd_to_time(int(sjd + 0.3))