Files
sensorapi_influxtst/INFLUX_SQL_DOCUMENTATION.md

4.8 KiB

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:

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

# 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

// 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:

|> 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:

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

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:

{
    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