def view_energy_graph(*, charger_id=None, date=None, **_):
"""
Render a page with a graph for a charger's session by date.
"""
import glob
from datetime import datetime
html = ['<link rel="stylesheet" href="/static/styles/charger_status.css">']
html.append('<h1>Charger Transaction Graph</h1>')
# Form for charger/date selector
graph_dir = gw.resource("work", "etron", "graphs")
charger_dirs = sorted(os.listdir(graph_dir)) if os.path.isdir(graph_dir) else []
txn_files = []
if charger_id:
cdir = os.path.join(graph_dir, charger_id)
if os.path.isdir(cdir):
txn_files = sorted(glob.glob(os.path.join(cdir, "*.json")))
html.append('<form method="get" action="/ocpp/csms/energy-graph" style="margin-bottom:2em;">')
html.append('<label>Charger: <select name="charger_id">')
html.append('<option value="">(choose)</option>')
for cid in charger_dirs:
sel = ' selected' if cid == charger_id else ''
html.append(f'<option value="{cid}"{sel}>{cid}</option>')
html.append('</select></label> ')
if txn_files:
html.append('<label>Transaction Date: <select name="date">')
html.append('<option value="">(choose)</option>')
for fn in txn_files:
# Filename: YYYY-MM-DD_<txn_id>.json
dt = os.path.basename(fn).split("_")[0]
sel = ' selected' if dt == date else ''
html.append(f'<option value="{dt}"{sel}>{dt}</option>')
html.append('</select></label> ')
html.append('<button type="submit">Show</button></form>')
# Load and render the graph if possible
graph_data = []
if charger_id and date:
base = os.path.join(graph_dir, charger_id)
match = glob.glob(os.path.join(base, f"{date}_*.json"))
if match:
with open(match[0]) as f:
graph_data = json.load(f)
# Graph placeholder: (replace with your JS plotting lib)
html.append('<div style="background:#222;border-radius:1em;padding:1.5em;min-height:320px;">')
if graph_data:
html.append('<h3>Session kWh Over Time</h3>')
html.append('<pre style="color:#fff;font-size:1.02em;">')
# Show simple table (replace with a chart)
html.append("Time | kWh\n---------------------|------\n")
for mv in graph_data:
ts = mv.get("timestampStr", "-")
kwh = "-"
for sv in mv.get("sampledValue", []):
if sv.get("measurand") == "Energy.Active.Import.Register":
kwh = sv.get("value")
html.append(f"{ts:21} | {kwh}\n")
html.append('</pre>')
else:
html.append("<em>No data available for this session.</em>")
html.append('</div>')
return "".join(html)