From c4394be145ca74075c452b05dbb76809cc1903b6 Mon Sep 17 00:00:00 2001 From: Mika Date: Sun, 3 May 2026 02:07:36 +0000 Subject: [PATCH] Add data_visualization/js/api.js --- data_visualization/js/api.js | 79 ++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 data_visualization/js/api.js diff --git a/data_visualization/js/api.js b/data_visualization/js/api.js new file mode 100644 index 0000000..085b11a --- /dev/null +++ b/data_visualization/js/api.js @@ -0,0 +1,79 @@ +/** + * Modul: Daten-Layer für akustische und Sensordaten der Donau + * Rolle: Laden und Aufbereiten der JSON-Datenquellen für Visualisierung + * © 2026 Donau2Space.de + */ + +/** + * @typedef {Object} VisualizationData + * @property {Array} waterLevels - Zeitverlauf der Wasserstandsdaten + * @property {Array} vibrationData - Schwingungsdaten der Umgebung + * @property {Array} frequencyAnalysis - Ergebnisse der Frequenzanalyse + * @property {Array} aiPatterns - KI-Musteranalysen mit Wahrscheinlichkeiten + */ + +/** + * Lädt Sensordaten aus einer lokalen JSON-Datei oder optional aus einem konfigurierten API-Endpunkt. + * @param {Object} [filters={}] - Optionaler Filterparameter (z. B. Datumsbereich, Messparameter) + * @returns {Promise} Aufbereitete Daten für Chart.js und andere Visualisierungen + */ +export async function fetchData(filters = {}) { + const localPath = './data/measurements.json'; + // Falls eine API vorhanden wäre, könnte hier dynamisch zwischen API und lokaler Quelle unterschieden werden. + + try { + const response = await fetch(localPath, { cache: 'no-cache' }); + if (!response.ok) { + throw new Error(`Fehler beim Laden der Daten: ${response.status}`); + } + + const rawData = await response.json(); + + // Daten vorsichtig prüfen und filtern + const { waterLevels = [], vibrationData = [], frequencyAnalysis = [], aiPatterns = [] } = rawData || {}; + + const filteredData = applyFilters({ waterLevels, vibrationData, frequencyAnalysis, aiPatterns }, filters); + + return filteredData; + } catch (error) { + console.error('fetchData Fehler:', error); + return { + waterLevels: [], + vibrationData: [], + frequencyAnalysis: [], + aiPatterns: [] + }; + } +} + +/** + * Filtert die Daten basierend auf angegebenen Parametern. + * @param {VisualizationData} data - Originale Daten aus JSON-Datei + * @param {Object} filters - Filterparameter (z. B. { dateFrom, dateTo }) + * @returns {VisualizationData} Gefilterte Daten + */ +function applyFilters(data, filters) { + const { dateFrom, dateTo, parameter } = filters; + + const withinRange = (entry) => { + if (!dateFrom && !dateTo) return true; + const t = new Date(entry.timestamp).getTime(); + const fromValid = dateFrom ? t >= new Date(dateFrom).getTime() : true; + const toValid = dateTo ? t <= new Date(dateTo).getTime() : true; + return fromValid && toValid; + }; + + const matchesParameter = (entry) => { + if (!parameter) return true; + return Object.keys(entry).some((key) => key.toLowerCase() === parameter.toLowerCase()); + }; + + const filterArray = (arr) => Array.isArray(arr) ? arr.filter((entry) => withinRange(entry) && matchesParameter(entry)) : []; + + return { + waterLevels: filterArray(data.waterLevels), + vibrationData: filterArray(data.vibrationData), + frequencyAnalysis: filterArray(data.frequencyAnalysis), + aiPatterns: filterArray(data.aiPatterns) + }; +}