completed basic recording functionality
This commit is contained in:
177
tools/cfg_util/record/pdf.py
Normal file
177
tools/cfg_util/record/pdf.py
Normal file
@@ -0,0 +1,177 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Dict
|
||||
from data import MinerData
|
||||
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.ticker import MultipleLocator
|
||||
from matplotlib.dates import DateFormatter
|
||||
import numpy as np
|
||||
from reportlab.lib import colors
|
||||
from reportlab.lib.pagesizes import letter, inch
|
||||
from reportlab.lib.styles import (
|
||||
ParagraphStyle,
|
||||
TA_CENTER, # noqa - not declared in __all__
|
||||
)
|
||||
from reportlab.lib.utils import ImageReader
|
||||
from reportlab.platypus import (
|
||||
SimpleDocTemplate,
|
||||
KeepInFrame,
|
||||
Table,
|
||||
Image,
|
||||
Paragraph,
|
||||
TableStyle,
|
||||
PageBreak,
|
||||
Spacer,
|
||||
)
|
||||
from io import BytesIO
|
||||
from svglib.svglib import svg2rlg
|
||||
|
||||
|
||||
async def generate_pdf(data: Dict[str, List[MinerData]], file_loc):
|
||||
doc = SimpleDocTemplate(
|
||||
file_loc,
|
||||
pagesize=letter,
|
||||
topMargin=0.25 * inch,
|
||||
leftMargin=1 * inch,
|
||||
rightMargin=1 * inch,
|
||||
bottomMargin=1 * inch,
|
||||
title=f"Recorded Data",
|
||||
)
|
||||
|
||||
elements = []
|
||||
i = 0
|
||||
for item in data.keys():
|
||||
i += 1
|
||||
if not i == 1:
|
||||
elements.append(PageBreak())
|
||||
page_elem = await generate_page(data[item])
|
||||
for elem in page_elem:
|
||||
elements.append(elem)
|
||||
|
||||
doc.build(
|
||||
elements,
|
||||
)
|
||||
|
||||
|
||||
async def generate_page(data):
|
||||
title_style = ParagraphStyle(
|
||||
"Title",
|
||||
alignment=TA_CENTER,
|
||||
fontSize=25,
|
||||
spaceAfter=40,
|
||||
spaceBefore=150,
|
||||
fontName="Helvetica-Bold",
|
||||
)
|
||||
|
||||
hr_graph = create_hr_graph(data)
|
||||
fan_graph = create_fans_graph(data)
|
||||
temp_graph = create_temp_graph(data)
|
||||
title = Paragraph(data[0].ip, style=title_style)
|
||||
|
||||
elements = [
|
||||
title,
|
||||
await hr_graph,
|
||||
Spacer(0, 40),
|
||||
await temp_graph,
|
||||
Spacer(0, 40),
|
||||
await fan_graph,
|
||||
]
|
||||
return elements
|
||||
|
||||
|
||||
async def create_hr_graph(data):
|
||||
fig, ax = plt.subplots(figsize=(6, 2))
|
||||
xpoints = []
|
||||
ypoints = []
|
||||
for item in data:
|
||||
xpoints.append(item.datetime)
|
||||
ypoints.append(item.hashrate)
|
||||
for label in ax.get_xticklabels() + ax.get_yticklabels():
|
||||
label.set_fontsize(6)
|
||||
ax.plot(xpoints, ypoints)
|
||||
ax.set_ylim(0, max(ypoints) * 1.4)
|
||||
date_form = DateFormatter("%H:%M:%S")
|
||||
ax.xaxis.set_major_formatter(date_form)
|
||||
ax.yaxis.set_major_formatter("{x:1.1f} TH/s")
|
||||
ax.set_title("Hashrate", fontsize=15)
|
||||
ax.yaxis.set_major_locator(MultipleLocator(5))
|
||||
ax.yaxis.set_minor_locator(MultipleLocator(1))
|
||||
|
||||
imgdata = BytesIO()
|
||||
fig.savefig(imgdata, format="svg")
|
||||
imgdata.seek(0) # rewind the data
|
||||
drawing = svg2rlg(imgdata)
|
||||
imgdata.close()
|
||||
plt.close("all")
|
||||
|
||||
hr_graph = KeepInFrame(375, 375, [Image(drawing)], hAlign="CENTER")
|
||||
|
||||
return hr_graph
|
||||
|
||||
|
||||
async def create_fans_graph(data):
|
||||
fig, ax = plt.subplots(figsize=(6, 2))
|
||||
xpoints = []
|
||||
ypoints_f1 = []
|
||||
ypoints_f2 = []
|
||||
ypoints_f3 = []
|
||||
ypoints_f4 = []
|
||||
for item in data:
|
||||
xpoints.append(item.datetime)
|
||||
ypoints_f1.append(item.fan_1)
|
||||
ypoints_f2.append(item.fan_2)
|
||||
ypoints_f3.append(item.fan_3)
|
||||
ypoints_f4.append(item.fan_4)
|
||||
for label in ax.get_xticklabels() + ax.get_yticklabels():
|
||||
label.set_fontsize(6)
|
||||
for ypoints in [ypoints_f1, ypoints_f2, ypoints_f3, ypoints_f4]:
|
||||
if not ypoints == [-1 for x in range(len(ypoints))]:
|
||||
ax.plot(xpoints, ypoints)
|
||||
ax.set_ylim(0, 10000)
|
||||
date_form = DateFormatter("%H:%M:%S")
|
||||
ax.xaxis.set_major_formatter(date_form)
|
||||
ax.yaxis.set_major_formatter("{x:1.0f} RPM")
|
||||
ax.set_title("Fans", fontsize=15)
|
||||
|
||||
imgdata = BytesIO()
|
||||
fig.savefig(imgdata, format="svg")
|
||||
imgdata.seek(0) # rewind the data
|
||||
drawing = svg2rlg(imgdata)
|
||||
imgdata.close()
|
||||
plt.close("all")
|
||||
|
||||
fans_graph = KeepInFrame(375, 375, [Image(drawing)], hAlign="CENTER")
|
||||
|
||||
return fans_graph
|
||||
|
||||
|
||||
async def create_temp_graph(data):
|
||||
fig, ax = plt.subplots(figsize=(6, 2))
|
||||
# plt.figure()
|
||||
xpoints = []
|
||||
ypoints = []
|
||||
for item in data:
|
||||
xpoints.append(item.datetime)
|
||||
ypoints.append(item.temperature_avg)
|
||||
for label in ax.get_xticklabels() + ax.get_yticklabels():
|
||||
label.set_fontsize(6)
|
||||
ax.plot(xpoints, ypoints)
|
||||
ax.set_ylim(0, 130)
|
||||
ax.yaxis.set_major_locator(MultipleLocator(20))
|
||||
ax.yaxis.set_minor_locator(MultipleLocator(5))
|
||||
date_form = DateFormatter("%H:%M:%S")
|
||||
ax.xaxis.set_major_formatter(date_form)
|
||||
ax.yaxis.set_major_formatter("{x:1.1f} C")
|
||||
ax.set_title("Temperature", fontsize=15)
|
||||
|
||||
imgdata = BytesIO()
|
||||
fig.savefig(imgdata, format="svg")
|
||||
imgdata.seek(0) # rewind the data
|
||||
drawing = svg2rlg(imgdata)
|
||||
imgdata.close()
|
||||
plt.close("all")
|
||||
|
||||
temp_graph = KeepInFrame(375, 375, [Image(drawing)], hAlign="CENTER")
|
||||
|
||||
return temp_graph
|
||||
Reference in New Issue
Block a user