158 lines
4.8 KiB
Markdown
158 lines
4.8 KiB
Markdown
# 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 |