diff --git a/app.py b/app.py index 3c25f8f..e60f9d1 100644 --- a/app.py +++ b/app.py @@ -30,7 +30,9 @@ pio.templates["plotly_light"].layout['yaxis']['zerolinecolor'] = 'lightgray' ELM = { 'name': 'tempplot', - 'filename': './data/20260420213656.txt', + 'filedir': './data', + # 'filename': './data/20260420213656.txt', + 'filename': None, 'label_file_fmt': 'File: {filename}', 'label_data_len_fmt': 'Data points: {num:,} (rendered) / {numa:,} (total)', 'label_data_temp_fmt': 'Temperature = [{min:.1f}, {max:.1f}] K', @@ -94,79 +96,83 @@ async def pick_file() -> None: ELM['label_file'].set_text(ELM['label_file_fmt'].format(filename=os.path.basename(filename))) def get_data(filename=ELM['filename']): - data = np.genfromtxt(fname=filename, skip_header=1) + data = None + if filename is not None and os.path.isfile(filename): + data = np.genfromtxt(fname=filename, skip_header=1) - if len(data) > 0 and len(data[0]) > 6: - names = ['time', 'ts', 'ta', 'tb', 'tc', 'td', 'hp', 'hl'] - else: - names = ['time', 'ts', 'ta', 'tb', 'hp', 'hl'] + if len(data) > 0 and len(data[0]) > 6: + names = ['time', 'ts', 'ta', 'tb', 'tc', 'td', 'hp', 'hl'] + else: + names = ['time', 'ts', 'ta', 'tb', 'hp', 'hl'] - data = np.genfromtxt( - fname=filename, dtype=None, skip_header=1, converters={ - 0: lambda x: datetime.datetime.strptime(x, '%Y%m%d%H%M%S')}, - names=names, encoding='utf-8' - ) + data = np.genfromtxt( + fname=filename, dtype=None, skip_header=1, converters={ + 0: lambda x: datetime.datetime.strptime(x, '%Y%m%d%H%M%S')}, + names=names, encoding='utf-8' + ) return data def update_data(): - if not app.storage.user['timer'] or time.time() - ELM['update_last'] > ELM['update_timeout']: + if not app.storage.user['timer'] \ + or time.time() - ELM['update_last'] > ELM['update_timeout']: ELM['update_busy'] = True filename=ELM['filename'] data_all = get_data(filename) data = data_all - # time_range = ELM['number_time_range'].value - time_range = app.storage.user['time_range'] - if time_range is not None and time_range > 0: - # delta = datetime.datetime.now() - data['time'] - delta = data['time'][-1] - data['time'] - data = data[np.where(delta <= datetime.timedelta(hours=time_range))] - print(datetime.datetime.now(), filename, data_all.shape, data.shape) - ELM['label_data_len'].set_text(ELM['label_data_len_fmt'].format( - num=len(data), numa=len(data_all))) - - if len(data) > 0: - if len(data[0]) > 6: - ELM['label_data_temp'].set_text(ELM['label_data_temp_fmt'].format( - min=np.min([data['ts'], data['ta'], data['tb'], data['tc'], data['td']]), - max=np.max([data['ts'], data['ta'], data['tb'], data['tc'], data['td']]))) - else: - ELM['label_data_temp'].set_text(ELM['label_data_temp_fmt'].format( - min=np.min([data['ts'], data['ta'], data['tb']]), - max=np.max([data['ts'], data['ta'], data['tb']]))) - ELM['label_data_heat'].set_text(ELM['label_data_heat_fmt'].format( - min=np.min(data['hp']), max=np.max(data['hp']))) + if data is not None: + # time_range = ELM['number_time_range'].value + time_range = app.storage.user['time_range'] + if time_range is not None and time_range > 0: + # delta = datetime.datetime.now() - data['time'] + delta = data['time'][-1] - data['time'] + data = data[np.where(delta <= datetime.timedelta(hours=time_range))] + print(datetime.datetime.now(), filename, data_all.shape, data.shape) + ELM['label_data_len'].set_text(ELM['label_data_len_fmt'].format( + num=len(data), numa=len(data_all))) - ELM['fig'].data = [] - ELM['plot'].visible = False - ELM['plot'].update() + if len(data) > 0: + if len(data[0]) > 6: + ELM['label_data_temp'].set_text(ELM['label_data_temp_fmt'].format( + min=np.min([data['ts'], data['ta'], data['tb'], data['tc'], data['td']]), + max=np.max([data['ts'], data['ta'], data['tb'], data['tc'], data['td']]))) + else: + ELM['label_data_temp'].set_text(ELM['label_data_temp_fmt'].format( + min=np.min([data['ts'], data['ta'], data['tb']]), + max=np.max([data['ts'], data['ta'], data['tb']]))) + ELM['label_data_heat'].set_text(ELM['label_data_heat_fmt'].format( + min=np.min(data['hp']), max=np.max(data['hp']))) - # mode='lines+markers' too heavy - ELM['fig'].add_trace(pgo.Scatter( - **np2pgo(data['time'], data['ts'], 'Setp'), mode='lines', legendgroup=None)) - ELM['fig'].add_trace(pgo.Scatter( - **np2pgo(data['time'], data['ta'], 'Temp A'), mode='lines', legendgroup=None)) - ELM['fig'].add_trace(pgo.Scatter( - **np2pgo(data['time'], data['tb'], 'Temp B'), mode='lines', legendgroup=None)) - if len(data) > 0 and len(data[0]) > 6: + ELM['fig'].data = [] + ELM['plot'].visible = False + ELM['plot'].update() + + # mode='lines+markers' too heavy ELM['fig'].add_trace(pgo.Scatter( - **np2pgo(data['time'], data['tc'], 'Temp C'), mode='lines', legendgroup=None)) + **np2pgo(data['time'], data['ts'], 'Setp'), mode='lines', legendgroup=None)) ELM['fig'].add_trace(pgo.Scatter( - **np2pgo(data['time'], data['td'], 'Temp D'), mode='lines', legendgroup=None)) + **np2pgo(data['time'], data['ta'], 'Temp A'), mode='lines', legendgroup=None)) + ELM['fig'].add_trace(pgo.Scatter( + **np2pgo(data['time'], data['tb'], 'Temp B'), mode='lines', legendgroup=None)) + if len(data) > 0 and len(data[0]) > 6: + ELM['fig'].add_trace(pgo.Scatter( + **np2pgo(data['time'], data['tc'], 'Temp C'), mode='lines', legendgroup=None)) + ELM['fig'].add_trace(pgo.Scatter( + **np2pgo(data['time'], data['td'], 'Temp D'), mode='lines', legendgroup=None)) - ELM['fig'].add_trace(pgo.Scatter( - **np2pgo(data['time'], data['hp'], 'Heat'), mode='lines', - legendgroup=None), row=2, col=1) + ELM['fig'].add_trace(pgo.Scatter( + **np2pgo(data['time'], data['hp'], 'Heat'), mode='lines', + legendgroup=None), row=2, col=1) - ELM['plot'].visible = True - ELM['plot'].update() + ELM['plot'].visible = True + ELM['plot'].update() - ELM['update_last'] = time.time() + ELM['update_last'] = time.time() - ELM['label_update_last'].set_text( - ELM['label_update_last_fmt'].format( - last=datetime.datetime.fromtimestamp( - ELM['update_last']).strftime("%Y-%m-%dT%H:%M:%S.%f"))) + ELM['label_update_last'].set_text( + ELM['label_update_last_fmt'].format( + last=datetime.datetime.fromtimestamp( + ELM['update_last']).strftime("%Y-%m-%dT%H:%M:%S.%f"))) def update_fig(): ELM['fig'].update_yaxes( @@ -221,8 +227,10 @@ def index(): ).bind_value(app.storage.user, 'dark_mode').props('icon="dark_mode"') with ui.row(): - ELM['label_file'] = ui.label( - ELM['label_file_fmt'].format(filename=os.path.basename(ELM['filename']))) + filename = None + if ELM['filename'] is not None: + filename = os.path.basename(ELM['filename']) + ELM['label_file'] = ui.label(ELM['label_file_fmt'].format(filename=filename)) ELM['label_data_len'] = ui.label(ELM['label_data_len_fmt'].format(num=0, numa=0)) ELM['label_data_temp'] = ui.label(ELM['label_data_temp_fmt'].format(min=0, max=0)) ELM['label_data_heat'] = ui.label(ELM['label_data_heat_fmt'].format(min=0, max=0))