Files
sensorapi_influxtst/INFLUX_SQL_DOCUMENTATION.md

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