diff --git a/ApfelBruno/Node/Create node.bru b/ApfelBruno/Node/Create node.bru index 531735c..7df692b 100644 --- a/ApfelBruno/Node/Create node.bru +++ b/ApfelBruno/Node/Create node.bru @@ -17,6 +17,6 @@ body:json { "coord_lo":2, "battery_minimum":3, "battery_maximum":4, - "group":"20abe318-7238-4f63-908f-a484955ee3bc" + "group":"54eccfb5-1d5a-4cad-a1a2-468eca68ffd6" } } diff --git a/web/src/components/ListViewElement.vue b/web/src/components/ListViewElement.vue index 91d163d..04aa173 100644 --- a/web/src/components/ListViewElement.vue +++ b/web/src/components/ListViewElement.vue @@ -18,11 +18,11 @@ <div class="d-flex flex-column"> <div class="d-flex align-items-center mb-2"> <span class="mr-2">Coordinates:</span> - <span>La: {{ node.coordla }}, Long: {{ node.coordlong }}</span> + <span>La: {{ node.coord_la }}, Long: {{ node.coord_lo }}</span> </div> <div class="d-flex align-items-center mb-2"> <span class="mr-2">Temperature:</span> - <span>{{ sensorData?.temperature }}°C</span> + <span>{{ sensorData?.temperature !== undefined ? sensorData.temperature : 'NaN' }}°C</span> </div> <div class="d-flex align-items-center mb-2"> <span class="mr-2">Battery Voltage:</span> @@ -30,9 +30,9 @@ </div> <div class="d-flex align-items-center mb-2"> <span class="mr-2">Runtime:</span> - <span>{{ sensorData?.uptime }} hours</span> - </div> + <span>{{ sensorData?.uptime ? (sensorData.uptime / 3600).toFixed(2) + ' hours' : 'N/A' }}</span> </div> + </div> </v-expansion-panel-text> </v-expansion-panel> </v-expansion-panels> @@ -62,24 +62,10 @@ watch([searching, visibleIds], ([searching, visibleIds]) => { onMounted(async () => { try { const { data } = await axios.get<SensorData>( - `http://localhost:8080/api/v1/data?nodeId=${props.node.id}` + `http://localhost:8080/api/v1/data?id=${props.node.id}` ); sensorData.value = data; } catch (error) { console.error("Error fetching sensor data:", error); } }); - -</script> - -<style scoped> -.values { - display: flex; - align-items: center; -} - -.v-text-field { - max-width: 200px; - width: 100%; -} -</style> diff --git a/web/src/components/TableCategory.vue b/web/src/components/TableCategory.vue index d596d6c..800284f 100644 --- a/web/src/components/TableCategory.vue +++ b/web/src/components/TableCategory.vue @@ -14,25 +14,25 @@ </thead> <tbody> <tr v-for="(node, index) in tableData" :key="index"> - <td>{{ node.name }}</td> + <td>{{ node.id }}</td> <td> - <span :class="node.sensorData.voltage ? 'status-online' : 'status-offline'"> - {{ node.sensorData.voltage ? 'ONLINE' : 'OFFLINE' }} + <span :class="node.sensorData.voltage !== 'N/A' ? 'status-online' : 'status-offline'"> + {{ node.sensorData.voltage !== 'N/A' ? 'ONLINE' : 'OFFLINE' }} </span> </td> <td contenteditable="true" - @blur="validateAndUpdateLatLng(node, 'coordla', $event)" - >{{ node.coordla }}</td> + @blur="validateAndUpdateLatLng(node, 'coord_la', $event)" + >{{ node.coord_la }}</td> <td contenteditable="true" - @blur="validateAndUpdateLatLng(node, 'coordlong', $event)" - >{{ node.coordlong }}</td> - <td>{{ calculateBatteryPercentage(node.sensorData.voltage, node.batteryMinimum, node.batteryMaximum) }}%</td> + @blur="validateAndUpdateLatLng(node, 'coord_lo', $event)" + >{{ node.coord_lo }}</td> + <td>{{ calculateBatteryPercentage(node.sensorData.voltage, node.battery_minimum, node.battery_maximum) }}%</td> <td>{{ node.sensorData.temperature }}°C</td> <td>{{ formatRuntime(node.sensorData.uptime) }}</td> </tr> - </tbody> + </tbody> </table> </div> </template> @@ -50,29 +50,32 @@ export default { this.fetchNodesAndData(); }, methods: { - async fetchNodesAndData() { - try { - const nodesResponse = await axios.get('http://localhost:8080/api/v1/nodes'); - const nodes = nodesResponse.data; + async fetchNodesAndData() { + try { + const nodeGroupsResponse = await axios.get('http://localhost:8080/api/v1/nodes'); + const nodeGroups = nodeGroupsResponse.data; - const sensorDataResponse = await axios.get('http://localhost:8080/api/v1/data'); - const sensorData = sensorDataResponse.data; + const nodes = nodeGroups.flatMap(group => group.node); - this.tableData = nodes.map((node) => { - const nodeSensorData = sensorData.find((data) => data.id === node.id); - return { - ...node, - sensorData: nodeSensorData || { - temperature: 'N/A', - voltage: 'N/A', - uptime: 'N/A', - }, - }; - }); - } catch (error) { - console.error('Error fetching node or sensor data:', error); - } - }, + const sensorDataResponse = await axios.get('http://localhost:8080/api/v1/data'); + const sensorDataArray = sensorDataResponse.data; + + this.tableData = nodes.map(node => { + const nodeSensorData = sensorDataArray.find(data => data.node.id === node.id); + + return { + ...node, + sensorData: nodeSensorData ? nodeSensorData.sensor_data : { + temperature: 'N/A', + voltage: 'N/A', + uptime: 'N/A', + }, + }; + }); + } catch (error) { + console.error('Error fetching node or sensor data:', error); + } + }, calculateBatteryPercentage(voltage, batteryMinimum, batteryMaximum) { if (voltage <= batteryMinimum) { return 0; @@ -92,22 +95,16 @@ export default { const originalValue = node[field]; let newValue = event.target.innerText; - // Normalize separated values newValue = newValue.replace(',', '.'); - - // Check if it's a valid float value const validNumberRegex = /^-?\d+(\.\d+)?$/; if (validNumberRegex.test(newValue)) { const parsedValue = parseFloat(newValue); - - // Update if valid node[field] = parsedValue; - console.log(`Updated ${field} of ${node.name}: ${parsedValue}`); + console.log(`Updated ${field} of ${node.id}: ${parsedValue}`); } else { - // Reset to original value if invalid event.target.innerText = originalValue; - console.log(`Failed to set ${field} of ${node.name}: Invalid input "${newValue}"`); + console.log(`Failed to set ${field} of ${node.id}: Invalid input "${newValue}"`); } }, }, @@ -115,7 +112,6 @@ export default { </script> <style scoped> -/* Styling remains the same */ .table-container { background-color: white; padding: 0.5rem 1rem; diff --git a/web/src/types.ts b/web/src/types.ts index 6f6063d..ca1ad3e 100644 --- a/web/src/types.ts +++ b/web/src/types.ts @@ -1,15 +1,17 @@ export interface Node { id: string; - coordla: number; - coordlong: number; - batteryMinimum: number; - batteryMaximum: number; + coord_la: number; + coord_lo: number; + battery_minimum: number; + battery_maximum: number; group: string; + sensorData: SensorData[]; } export interface NodeGroup { id: string; name: string; + node: Node[]; } export interface SensorData {