// Description: Main JavaScript file for the web application. // arrays and stuff const sensorData = {}; let liveGraphs = []; let nodeArray = []; let nodeDict = {}; let graphArray = []; // letiables let intervalDelay = 5000; let amountOfNodes = 3; const socket = new WebSocket("ws://145.92.8.114/ws"); function openConnection() { // Open connection socket.addEventListener("open", (event) => { console.log("Connected to the WebSocket server"); }); // Error handling socket.addEventListener('error', (event) => { console.error('WebSocket error:', event); // Attempt to reconnect setTimeout(openConnection, 1000); // Retry after 1 second }); // Message handling socket.addEventListener("message", (event) => { try { const jsonData = JSON.parse(event.data); // Use the parsed JSON data as needed handleIncomingData(jsonData); } catch (error) { console.error("Error parsing JSON:", error); } }); // Close handling socket.addEventListener('close', (event) => { console.log('Connection closed'); // Attempt to reconnect setTimeout(openConnection, 1000); // Retry after 1 second }); console.log("Connected to the WebSocket server"); } openConnection(); async function handleIncomingData(data) { if (!data.node || !data.Temp || !data.Humi || !data.eCO2 || !data.TVOC) { console.error('Invalid data received:', data); return; } await nodeAdressHandler(data.node, Object.keys(data).filter(key => key !== 'node')); let nodeName = nodeDict[data.node].name; let temperature = data.Temp; let humidity = data.Humi; let CO2 = data.eCO2; let TVOC = data.TVOC; // Update the gauges with the new data if (sensorData[data.node]) { sensorData[data.node].updateGauge(1, temperature); sensorData[data.node].updateGauge(2, humidity); sensorData[data.node].updateGauge(3, CO2); sensorData[data.node].updateGauge(4, TVOC); sensorData[data.node].graph.updateGraph(temperature, humidity, CO2, TVOC); } else { console.error('No sensor data for node:', nodeName); } } async function nodeAdressHandler(node, dataTypes) { let nodeInfo = await getNodeInfo(node); if (!nodeInfo) { console.error('No node info found for node:', node); return; } let nodeName = nodeInfo.name; let nodeLocation = nodeInfo.location; if (!nodeArray.includes(node)) { nodeArray.push(node); nodeDict[node] = {name: nodeName, location: nodeLocation}; let maxGaugeValues = dataTypes.map(dataType => { switch (dataType) { case 'Temp': return 50; case 'Humi': return 100; case 'eCO2': return 3000; case 'TVOC': return 2200; default: return 100; } }); let gaugeGroup = new GaugeGroup(nodeName, nodeLocation, dataTypes.length, maxGaugeValues, dataTypes); sensorData[node] = gaugeGroup; gaugeGroup.graph = new liveGraph(nodeName); sensorData[node] = gaugeGroup; gaugeGroup.graph.makeGraph(); sensorData[node] = gaugeGroup; } } function getNodeInfo(node){ return fetch("http://145.92.8.114/getNodeInfo?macAdress=" + node) .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(data => { if (data.length == 0) { throw new Error('No data returned for node: ' + node); } return { name: data[0].Name, location: data[0].Location // Assuming the server returns a Location property }; }) } // create a function to enable and disable the graph using .disabled using the id of the graph function toggleGraph(nodeId) { let graph = document.querySelector('#liveGraph' + nodeId); if (graph) { if (graph.classList.contains('disabled')) { graph.classList.remove('disabled'); } else { graph.classList.add('disabled'); } } else { console.error('No element found with id: liveGraph' + nodeId); } }