示例#1
0
文件: logdata.py 项目: jarvisms/pywws
 def fetch_logged(self, last_date, last_ptr):
     # offset last stored time by half logging interval
     last_stored = self.last_stored_time + timedelta(
         seconds=self.fixed_block['read_period'] * 30)
     if last_date <= last_stored:
         # nothing to do
         return
     # data_count includes record currently being updated every 48 seconds
     max_count = self.fixed_block['data_count'] - 1
     count = 0
     # initialise detection of data left after a station reboot
     saved_date = self.last_stored_time
     saved_ptr = self.last_stored_ptr
     self.last_stored_ptr = None
     duplicates = []
     while last_date > last_stored and count < max_count:
         data = self.ws.get_data(last_ptr)
         if last_ptr == saved_ptr:
             if any(data[key] != self.raw_data[saved_date][key]
                    for key in ('hum_in', 'temp_in', 'hum_out', 'temp_out',
                                'abs_pressure', 'wind_ave', 'wind_gust',
                                'wind_dir', 'rain', 'status')):
                 # pointer matches but data is different, so no duplicates
                 duplicates = None
                 saved_ptr = None
             else:
                 # potential duplicate data
                 duplicates.append(last_date)
                 saved_date = self.raw_data.before(saved_date)
                 saved_ptr = self.ws.dec_ptr(saved_ptr)
         if (data['delay'] is None or data['delay'] > max(
                 self.fixed_block['read_period'] * 2, 35)):
             logger.error('invalid data at %04x, %s', last_ptr,
                          last_date.isoformat(' '))
             last_date -= timedelta(minutes=self.fixed_block['read_period'])
         else:
             self.raw_data[last_date] = data
             count += 1
             last_date -= timedelta(minutes=data['delay'])
         last_ptr = self.ws.dec_ptr(last_ptr)
     if duplicates:
         for d in duplicates:
             del self.raw_data[d]
         count -= len(duplicates)
     last_date = self.raw_data.nearest(last_date) or datetime.max
     next_date = self.raw_data.after(last_date + SECOND)
     if next_date:
         gap = (next_date - last_date).seconds // 60
         gap -= self.fixed_block['read_period']
         if gap > 0:
             logger.critical("%d minutes gap in data detected", gap)
     logger.info("%d catchup records", count)
示例#2
0
 def fetch_logged(self, last_date, last_ptr):
     # offset last stored time by half logging interval
     last_stored = self.last_stored_time + timedelta(
         seconds=self.fixed_block['read_period'] * 30)
     if last_date <= last_stored:
         # nothing to do
         return
     # data_count includes record currently being updated every 48 seconds
     max_count = self.fixed_block['data_count'] - 1
     count = 0
     # initialise detection of data left after a station reboot
     saved_date = self.last_stored_time
     saved_ptr = self.last_stored_ptr
     self.last_stored_ptr = None
     duplicates = []
     while last_date > last_stored and count < max_count:
         data = self.ws.get_data(last_ptr)
         if last_ptr == saved_ptr:
             if any(data[key] != self.raw_data[saved_date][key] for key in (
                     'hum_in', 'temp_in', 'hum_out', 'temp_out',
                     'abs_pressure', 'wind_ave', 'wind_gust', 'wind_dir',
                     'rain', 'status')):
                 # pointer matches but data is different, so no duplicates
                 duplicates = None
                 saved_ptr = None
             else:
                 # potential duplicate data
                 duplicates.append(last_date)
                 saved_date = self.raw_data.before(saved_date)
                 saved_ptr = self.ws.dec_ptr(saved_ptr)
         if (data['delay'] is None or
                 data['delay'] > max(self.fixed_block['read_period'] * 2, 35)):
             logger.error('invalid data at %04x, %s',
                          last_ptr, last_date.isoformat(' '))
             last_date -= timedelta(minutes=self.fixed_block['read_period'])
         else:
             self.raw_data[last_date] = data
             count += 1
             last_date -= timedelta(minutes=data['delay'])
         last_ptr = self.ws.dec_ptr(last_ptr)
     if duplicates:
         for d in duplicates:
             del self.raw_data[d]
         count -= len(duplicates)
     last_date = self.raw_data.nearest(last_date)
     next_date = self.raw_data.after(last_date + SECOND)
     if next_date:
         gap = (next_date - last_date).seconds // 60
         gap -= self.fixed_block['read_period']
         if gap > 0:
             logger.critical("%d minutes gap in data detected", gap)
     logger.info("%d catchup records", count)
示例#3
0
 def check_fixed_block(self):
     self.fixed_block = self.ws.get_fixed_block(unbuffered=True)
     # check 'magic number'
     if (self.fixed_block['magic_0'], self.fixed_block['magic_1']) not in (
             (0x55, 0xAA),):
         logger.critical("Unrecognised 'magic number' %02x %02x",
                         self.fixed_block['magic_0'],
                         self.fixed_block['magic_1'])
     # store info from fixed block
     if not self.params.get('config', 'pressure offset'):
         self.params.set('config', 'pressure offset', '%g' % (
             self.fixed_block['rel_pressure']
                 - self.fixed_block['abs_pressure']))
     self.status.set('fixed', 'fixed block', pprint.pformat(self.fixed_block))
示例#4
0
 def check_fixed_block(self):
     self.fixed_block = self.ws.get_fixed_block(unbuffered=True)
     # check 'magic number'
     if (self.fixed_block['magic_0'], self.fixed_block['magic_1']) not in (
             (0x55, 0xAA),):
         logger.critical("Unrecognised 'magic number' %02x %02x",
                         self.fixed_block['magic_0'],
                         self.fixed_block['magic_1'])
     # store info from fixed block
     if not self.params.get('config', 'pressure offset'):
         self.params.set('config', 'pressure offset', '%g' % (
             self.fixed_block['rel_pressure']
                 - self.fixed_block['abs_pressure']))
     self.status.set('fixed', 'fixed block', pprint.pformat(self.fixed_block))