WLED/usermods/pixels_dice_tray/mqtt_client/mqtt_plotter.py

70 wiersze
1.7 KiB
Python

import argparse
from http import server
import os
from pathlib import Path
import socketserver
import pandas as pd
import plotly.express as px
# python -m http.server 8000 --directory /tmp/
def main():
parser = argparse.ArgumentParser(
description="Generate an html plot of rolls captured by mqtt_logger.py")
parser.add_argument("input_file", type=Path, help="Log file to plot")
parser.add_argument(
"-s",
"--start-server",
action="store_true",
help="After generating the plot, run a webserver pointing to it",
)
parser.add_argument(
"-o",
"--output-dir",
type=Path,
default=Path(__file__).absolute().parent / "logs",
help="Directory to log to",
)
args = parser.parse_args()
df = pd.read_csv(
args.input_file, names=["timestamp", "die", "label", "state", "roll"]
)
df_filt = df[df["state"] == 1]
time = (df_filt["timestamp"] - df_filt["timestamp"].min()) / 60 / 60
fig = px.bar(
df_filt,
x=time,
y="roll",
color="label",
labels={
"x": "Game Time (min)",
},
title=f"Roll Report: {args.input_file.name}",
)
output_path = args.output_dir / (args.input_file.stem + ".html")
fig.write_html(output_path)
if args.start_server:
PORT = 8000
os.chdir(args.output_dir)
try:
with socketserver.TCPServer(
("", PORT), server.SimpleHTTPRequestHandler
) as httpd:
print(
f"Serving HTTP on http://0.0.0.0:{PORT}/{output_path.name}")
httpd.serve_forever()
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main()