def get_30p_data(self, dttm_from=date.today() - timedelta(1), dttm_to=date.today()): res = {'prm_num': self.prmnum, 'prm_name': self.prmname, 'ctrl_tm': {}, } # Запрос исторических данных телеметрии в базе d_list = pcs_source._hist_data('hist_' + self.ms_accronim.lower(), self.prmnum, dttm_from, dttm_to) if len(d_list) == 0: return res # > # Берем первый замер, переносим в буфер buf_t, buf_v = d_list.pop(0) # Находим первую метку времени получасовки и инициализируем накопитель нулем buf_30t = round_tm_30_up(buf_t) res['ctrl_tm'][buf_30t] = 0 for item in d_list: if item.dt > buf_30t: # Если перешагнули получасовку res['ctrl_tm'][buf_30t] += delta_e(buf_v, buf_t, buf_30t) * 2 buf_t = buf_30t buf_30t = round_tm_30_up(item.dt) res['ctrl_tm'][buf_30t] = 0 else: # Если не перешагнули получасовку res['ctrl_tm'][buf_30t] += delta_e(buf_v, buf_t, item.dt) * 2 buf_t, buf_v = item # Запрос получасовок в базе данных АИИС КУЭ askue_dict = askue_source._30p_data(self.enh_addr, dttm_from, dttm_to + timedelta(minutes=15)) for key, val in res['ctrl_tm'].items(): askue_val = askue_dict.get(key, None) if askue_val: res['ctrl_tm'][key] = '{}</br>-----</br>{}'.format(round(val), round(askue_val)) else: res['ctrl_tm'][key] = '{}</br>-----</br>{}'.format(round(val), '-') return res
def get_30p_data(self, dttm_from=date.today() - timedelta(1), dttm_to=date.today()): res = { 'prm_num': self.prmnum, 'prm_name': self.prmname, 'ctrl_tm': {}, } # Запрос исторических данных телеметрии в базе d_list = pcs_source._hist_data('hist_' + self.ms_accronim.lower(), self.prmnum, dttm_from, dttm_to) if len(d_list) == 0: return res # > # Берем первый замер, переносим в буфер buf_t, buf_v = d_list.pop(0) # Находим первую метку времени получасовки и инициализируем накопитель нулем buf_30t = round_tm_30_up(buf_t) res['ctrl_tm'][buf_30t] = 0 for item in d_list: if item.dt > buf_30t: # Если перешагнули получасовку res['ctrl_tm'][buf_30t] += delta_e(buf_v, buf_t, buf_30t) * 2 buf_t = buf_30t buf_30t = round_tm_30_up(item.dt) res['ctrl_tm'][buf_30t] = 0 else: # Если не перешагнули получасовку res['ctrl_tm'][buf_30t] += delta_e(buf_v, buf_t, item.dt) * 2 buf_t, buf_v = item # Запрос получасовок в базе данных АИИС КУЭ askue_dict = askue_source._30p_data(self.enh_addr, dttm_from, dttm_to + timedelta(minutes=15)) for key, val in res['ctrl_tm'].items(): askue_val = askue_dict.get(key, None) if askue_val: res['ctrl_tm'][key] = '{}</br>-----</br>{}'.format( round(val), round(askue_val)) else: res['ctrl_tm'][key] = '{}</br>-----</br>{}'.format( round(val), '-') return res
def prepare(self, dtfrom_str, dtto_str): """ Prepare content of Report """ # Calculate time_row dtfrom = datetime.strptime(dtfrom_str, "%d.%m.%Y %H:%M") dtto = datetime.strptime(dtto_str, "%d.%m.%Y %H:%M") res = { 'rtitles': [], 'content': [], } if dtfrom > dtto: return res if self.rtype == 'hs': # Округление до часа dttemp = datetime(dtfrom.year, dtfrom.month, dtfrom.day, dtfrom.hour) if dttemp == dtfrom: res['rtitles'].append(dttemp) # Заполнение заголовков while dttemp <= dtto: dttemp += timedelta(hours=1) if dttemp <= dtto: res['rtitles'].append(dttemp) for band in self.bands.all(): prm = Param.objects.get(pk=band.param_num) hist_data = prm.get_slice_data(dtfrom, dtto) hrow = [] for tm in res['rtitles']: tv = hist_data['ctrl_tm'].get(tm, '-') if tv != '-': tv = tv.v hrow.append(tv) res['content'].append([band.name, ] + hrow) elif self.rtype == 'ahh': dttemp = round_tm_30_up(dtfrom) # Заполнение заголовков res['rtitles'].append(dttemp) while dttemp <= dtto: dttemp += timedelta(minutes=30) res['rtitles'].append(dttemp) for band in self.bands.all(): prm = Param.objects.get(pk=band.param_num) # Интервал берем заведомо больший, чтобы учесть ведущие и завершающие дельты hist_data = prm.get_30p_data(dtfrom - timedelta(minutes=30), dtto + timedelta(minutes=30)) hrow = [] for tm in res['rtitles']: tv = hist_data['ctrl_tm'].get(tm, '-') hrow.append(tv) res['content'].append([band.name, ] + hrow) return res