"""
"""
import os
import numpy as np
import datetime
try:
from nicegui import app, ui, events, Client
except ModuleNotFoundError as e:
print('Module `nicegui` not found.')
exit(1)
try:
import plotly.graph_objects as pgo
import plotly.io as pio
import plotly as ply
import plotly.subplots
except ModuleNotFoundError as e:
print('Module `plotly` not found.')
exit(1)
NAME = 'tempplot'
FILENAME = './data/20260420213656.txt'
fig = None
plot = None
label_file = None
label_file_fmt = 'tempplot: {filename}'
# label_file_fmt = 'tempplot: {os.path.basename(filename)}'
def main_cli():
import argparse
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawTextHelpFormatter,
prefix_chars='-',
add_help=False,
)
parser.add_argument(
'--host', type=str, default='', help='default 127.0.0.1')
parser.add_argument(
'--port', type=str, default='8085', help='default 8080')
parser.add_argument(
'-v', '--verbose', action='store_true', help='Verbose output')
parser.add_argument(
'-D', '--debug', action='store_true', help=argparse.SUPPRESS)
parser.add_argument(
'-h', '--help', action='store_true', help='Show this help message and exit')
args = parser.parse_args()
if args.debug:
DEBUG = True
print(f'[DEBUG] args: {args}')
print(f'[DEBUG] __file__: {__file__}')
print(f'[DEBUG] cwd: {os.getcwd()}')
print(f'[DEBUG] host: {args.host}')
print(f'[DEBUG] port: {args.port}')
if args.help:
parser.print_help()
exit(0)
return args
def np2pgo(x, y, label=None):
res = {'x': x, 'y': y}
if label is not None:
res.update({'name': label})
return res
# def str2date(x):
# return datetime.datetime.strptime(x.decode('utf-8'), '%Y%m%d%H%M%S')
import local_file_picker
async def pick_file() -> None:
result = await local_file_picker.local_file_picker('./data', multiple=False)
# ui.notify(f'You chose {result}')
filename = result[-1]
update_data(filename)
label_file.set_text(label_file_fmt.format(filename=os.path.basename(filename)))
def get_data(filename=FILENAME):
print(f"filename: {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']
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'
)
print(data.shape)
print(data['time'])
#data[:, 0] = np.array(data[:, 0], dtype='datetime64')
#print(data.time)
return data
def update_data(filename=FILENAME):
data = get_data(filename)
fig.data = []
plot.visible = False
plot.update()
fig.add_trace(pgo.Scatter(**np2pgo(data['time'], data['ts'], 'Setp')))
fig.add_trace(pgo.Scatter(**np2pgo(data['time'], data['ta'], 'Temp A')))
fig.add_trace(pgo.Scatter(**np2pgo(data['time'], data['tb'], 'Temp B')))
if len(data) > 0 and len(data[0]) > 6:
fig.add_trace(pgo.Scatter(**np2pgo(data['time'], data['tc'], 'Temp C')))
fig.add_trace(pgo.Scatter(**np2pgo(data['time'], data['td'], 'Temp D')))
fig.add_trace(pgo.Scatter(**np2pgo(data['time'], data['hp'], 'Heat')),
row=2, col=1)
plot.visible = True
plot.update()
@ui.page('/')
def index():
global fig, plot, label_file
# data = get_data()
#
fig = ply.subplots.make_subplots(rows=2, cols=1)
#
ui.context.client.content.classes('h-[100vh]')
ui.add_head_html('''
''')
dark_mode = ui.dark_mode().bind_value(app.storage.user, 'dark_mode')
#ui.button('Dark', on_click=dark.enable)
#ui.button('Light', on_click=dark.disable)
ui.switch(
'Dark mode', on_change=lambda: fig.update_layout(template='plotly_dark' if dark_mode.value else 'plotly_white')
).bind_value(app.storage.user, 'dark_mode').props('icon="dark_mode"')
print(dark_mode.value)
ui.colors(primary='#4888c4')
ui.button('Choose file', on_click=pick_file, icon='folder')
label_file = ui.label(label_file_fmt.format(filename=os.path.basename(FILENAME)))
# range_t = ui.range(
# min=data['time'][0].timestamp(), max=data['time'][-1].timestamp(),
# # on_change=lambda e: fig.update_xaxes(
# # range=[str(datetime.datetime.fromtimestamp(e.value["min"])),
# # str(datetime.datetime.fromtimestamp(e.value["max"]))]),
# )
# ui.label().bind_text_from(
# range_t, 'value',
# backward=lambda v: (
# f'min: {datetime.datetime.fromtimestamp(v["min"])}\n\
# max: {datetime.datetime.fromtimestamp(v["max"])}'),
# ).style('white-space: pre-wrap')
pio.templates.default = 'plotly_dark'
# fig = pgo.Figure()
fig.update_layout(
height=600,
#template='plotly_white'
template='plotly_dark' if dark_mode.value else 'plotly_white',
)
plot = ui.plotly(fig).classes('w-full')
update_data()
# print(fig.full_figure_for_development().layout.xaxis.range)
# ('2026-04-20 21:36:56', '2026-04-21 10:40:53')
# print(fig.full_figure_for_development().layout.xaxis.range[0])
# print(type(fig.full_figure_for_development().layout.xaxis.range[0]))
def main_gui(args):
ui.run(
host=args.host, port=int(args.port), title=NAME,
#dark=True,
native=False,
show=False, storage_secret='tempview')
def main(args):
return 0
if __name__ in {'__main__', '__mp_main__'}:
args = main_cli()
main_gui(args)