function group_name({ name }) { return ( {name} ); } function table_header() { return ( Name LED Power Power Draw ); } function table_row({ row_data }) { return ( {/* Name */} {row_data.device_name} {/* LED */} {/* Power */} { row_data.power_control && && } {/* Power Draw */} ); } function create_table(group, device_data) { return (
); } export default async function MyApp() { const response = await fetch( "/devices", { method: "GET" } ); let json = JSON.parse(await response.json()); for (const [group_name, devices] of Object.entries(json)) { let device_infos = []; for (let i = 0; i < devices.length; i++) { let device_id = devices[i][0]; let device_descriptor; if (devices[i][1] == null) { device_descriptor = device_id } else { device_descriptor = devices[i][1]; } // get plug status const device_status_response = await fetch( "/plug_state/" + device_id, { method: "GET" } ); let device_state = JSON.parse(await device_status_response.json()); let device_info = { device_id: device_id, device_descriptor: device_descriptor, led_state: device_state["led"], power_state: device_state["power"], power_control: devices[i][2] && device_state["power_draw"] < 15, power_draw: device_state["power_draw"], }; device_infos.push(device_info); } document.getElementById("main").appendChild(create_table(group_name, device_infos)); } } async function change_name(device_id) { let device_name = document.getElementById("name_" + device_id); if (device_name.readOnly) { device_name.readOnly = false; device_name.focus(); } else { device_name.readOnly = true; await change_device_name(device_id, device_name.value); } } async function change_plug_state(plug, module, state) { const response = await fetch( "/plug/" + plug + "/" + module + "_" + state, { method: "POST" } ); if (response.ok) { const device_status_response = await fetch( "/plug_state/" + plug, { method: "GET" } ); let device_state = JSON.parse(await device_status_response.json()); document.getElementById(module + "_" + plug).innerHTML = device_state[module]; } } async function led_on(plug) { await change_plug_state(plug, "led", "on") } async function led_off(plug) { await change_plug_state(plug, "led", "off") } async function power_on(plug) { await change_plug_state(plug, "power", "on") } async function power_off(plug) { // get plug status const device_status_response = await fetch( "/plug_state/" + device_id, { method: "GET" } ); let device_state = JSON.parse(await device_status_response.json()); if (device_state["power_draw"] < 15) { await change_plug_state(plug, "power", "off") } } async function change_device_name(plug, name) { const response = await fetch( "/device_name/" + plug + "/" + name, { method: "POST" } ); if (!response.ok) { console.error(response.body); } } async function render_graph(plug, name) { // remove old graph, if present let old = document.getElementById("chart"); if (old !== null) { old.remove(); } // get start date let start_text = document.getElementById("start").value; let start_date = parseInt(new Date(start_text).getTime() / 1000).toFixed(0); // get end date1 let end_text = document.getElementById("end").value; let end_date = parseInt(new Date(end_text).getTime() / 1000).toFixed(0); // create new chart div let chart = document.createElement('canvas'); chart.id = "chart"; const response = await fetch( "/plug_data/" + plug + "/" + start_date + "/" + end_date + "/" + "hourly", { method: "GET" } ); const j = await response.json(); const data = JSON.parse(j); let y = []; let x = []; for (let i = 0; i < data.length; i++) { let [time, watts] = data[i]; x.push(new Date(time * 1000)); y.push(watts); } const chart_data = { labels: x, datasets: [{ label: name, data: y, fill: false, borderColor: 'rgb(75, 192, 192)', tension: 0.1 }] }; new Chart(chart, { type: 'line', data: chart_data, options: { scales: { y: { beginAtZero: true }, x: { type: 'time', time: { displayFormats: { } } } }, locale: 'de-DE' } }); document.getElementById("graph").appendChild(chart); }