# InfluxDB 1.8 SQL Implementation - Dokumentation ## Übersicht Diese Datei (`databases/influx_sql.js`) implementiert die gleiche Funktionalität wie `databases/influx_flux.js`, aber für InfluxDB 1.8 mit InfluxQL anstatt Flux-Abfragen. ## Wichtige Unterschiede zu InfluxDB 2.0/Flux ### Datenschema-Unterschiede - **InfluxDB 1.8**: Speichert nur `LA_max`, `LA_min`, `LA_eq` (alle in dB) - **InfluxDB 2.0**: Speichert zusätzlich `E10tel_eq` als vorberechneten linearen Wert (`10^(LA_max/10)`) ### Datenkonvertierung Da InfluxDB 1.8 kein `E10tel_eq` Feld hat, wird es zur Laufzeit berechnet: ```javascript E10tel_eq = Math.pow(10, LA_max / 10) ``` ### Konfiguration - **InfluxDB 1.8**: Verwendet Username/Password-Authentifizierung - **InfluxDB 2.0**: Verwendet Token-basierte Authentifizierung - **Endpoint**: `/query` für Lesen, `/write` für Schreiben (statt `/api/v2/...`) ### Umgebungsvariablen ```bash # InfluxDB 1.8 Konfiguration INFLUXHOST=localhost INFLUXPORT=8086 INFLUXUSER=username # Neu für 1.8 INFLUXPASS=password # Neu für 1.8 INFLUXDB=sensor_data # Database statt Bucket ``` ## Logarithmische Mittelwertberechnung ### Problem LAmax-Werte sind logarithmische Werte (Dezibel). Ein einfacher arithmetischer Mittelwert ist mathematisch falsch. ### Datenschema-Unterschiede - **InfluxDB 1.8**: Nur `LA_max` (dB) verfügbar → `E10tel_eq` wird zur Laufzeit berechnet - **InfluxDB 2.0**: `E10tel_eq` bereits als `10^(LA_max/10)` gespeichert ### Implementierung in InfluxDB 1.8 ```javascript // 1. Konvertierung LA_max → E10tel_eq zur Laufzeit const e10tel = Math.pow(10, lamax / 10) // 2. Mittelwert der E10tel-Werte const e10telMean = e10telValues.reduce((sum, val) => sum + val, 0) / e10telValues.length // 3. Rückkonvertierung zu dB für n_AVG const n_AVG = 10.0 * Math.log10(e10telMean) ``` Dies entspricht exakt der Flux-Version: ```flux |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> map(fn: (r) => ({r with _value: (10.0 * math.log10(x: r._value))})) ``` ## Funktionen ### fetchActData(opts) **Zweck**: Abrufen aktueller/historischer Sensordaten **Parameter**: - `opts.sensorid`: Sensor-ID - `opts.start`: Startzeit (z.B. "now() - 1h") - `opts.stop`: Endzeit (z.B. "now()") - `opts.sort`: Sortierung (1 = aufsteigend, -1 = absteigend) **InfluxQL-Query**: ```sql SELECT * FROM "measurements" WHERE "sid" = 'sensor_id' AND time >= start_time AND time <= stop_time ORDER BY time ASC/DESC ``` ### fetchNoiseAVGData(opts) **Zweck**: Berechnung von Lärmstatistiken mit korrekter logarithmischer Mittelwertbildung **Parameter**: - `opts.sensorid`: Sensor-ID - `opts.start`: Startzeit - `opts.stop`: Endzeit - `opts.peak`: Schwellenwert für Peak-Zählung (dB) - `opts.long`: Vollständige Daten (true) oder nur Zusammenfassung (false) **Besonderheiten**: - Verwendet multiple InfluxQL-Queries (da InfluxQL keine komplexen Joins wie Flux unterstützt) - Kombiniert Ergebnisse in JavaScript - Korrekte logarithmische Mittelwertberechnung für LAmax-Werte ## Flux vs. InfluxQL Mapping | Flux-Operation | InfluxQL-Äquivalent | |----------------|---------------------| | `from(bucket)` | `FROM "measurement"` | | `range(start, stop)` | `WHERE time >= start AND time <= stop` | | `filter(fn: (r) => r.sid == "x")` | `WHERE "sid" = 'x'` | | `aggregateWindow(every: 1h, fn: mean)` | `GROUP BY time(1h)` mit `mean()` | | `pivot()` | Mehrere Spalten in SELECT | | `join()` | Multiple Queries + JavaScript-Kombination | ## Beispiel-Nutzung ```javascript import { fetchActData, fetchNoiseAVGData } from './databases/influx_sql.js' // Aktuelle Daten abrufen const actData = await fetchActData({ sensorid: 'noise_001', start: 'now() - 1h', stop: 'now()', sort: 1 }) // Lärmstatistiken mit Peak-Zählung const noiseStats = await fetchNoiseAVGData({ sensorid: 'noise_001', start: 'now() - 24h', stop: 'now()', peak: 70, long: false }) ``` ## Rückgabewerte Beide Funktionen geben ein Objekt zurück: ```javascript { err: null, // Fehler oder null values: [ // Array mit Ergebnissen { _time: "2025-10-10T10:00:00.000Z", // ... weitere Felder je nach Funktion } ] } ``` ## Migration von Flux zu InfluxQL 1. **Umgebungsvariablen anpassen** (siehe oben) 2. **Import ändern**: `from './databases/influx_flux.js'` → `from './databases/influx_sql.js'` 3. **Funktionsaufrufe bleiben identisch** - gleiche Parameter und Rückgabewerte 4. **InfluxDB-Server auf Version 1.8 umstellen** ## Vorteile der InfluxQL-Implementierung - **Kompatibilität**: Funktioniert mit älteren InfluxDB 1.8 Installationen - **Korrekte Mathematik**: Logarithmische Mittelwerte für Dezibel-Werte - **Identische API**: Drop-in-Replacement für Flux-Version - **Performance**: Optimierte Queries für InfluxDB 1.8