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)
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)
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))