Ertser Commit der test-Version
This commit is contained in:
158
INFLUX_SQL_DOCUMENTATION.md
Normal file
158
INFLUX_SQL_DOCUMENTATION.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user