add file exist logic

This commit is contained in:
Daniel Weschke
2026-04-27 15:43:10 +02:00
parent 1b46f2cf6c
commit f3a4d814ba

122
app.py
View File

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